kernel_samsung_a53x/drivers/bts/bts.h
2024-06-15 16:02:09 -03:00

244 lines
6.9 KiB
C
Executable file

/*
* Copyright (c) 2018 Samsung Electronics Co., Ltd.
* http://www.samsung.com
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License Version 2 as publised
* by the Free Software Foundation.
*
* Header for BTS Bus Traffic Shaper
*
* Includes Data structure for BTS device driver and pre-defined offsets
* For offset values used in register setting, please refer regs-bts.h
*
*/
#ifndef __BTS_H__
#define __BTS_H__
#include <linux/types.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <dt-bindings/soc/samsung/exynos-bts.h>
#include <soc/samsung/exynos-pd.h>
#include <soc/samsung/bts.h>
#define DEFAULT_QOS 0x4
#define MAX_QOS 0xF
#define SCIMAX_QOS 0x3
#define MAX_MO 0xFFFF
#define MAX_QUTH 0xFF
#define VC_TIMER_TH_NR 8
#define PF_TIMER_NR 8
struct bts_scen;
struct bts_stat;
struct bts_info;
struct bts_bw_params;
/**
* struct bts_bw_parmas - BTS parameters for bandwidth calculation
* @num_channel: The number of memory interface channel
* @mif_bus_width: Bus width of memory interface
* @bus_width: Bus width of internal bus
* @mif_util: Target utilization of memory interface
* @int_util: Target utilization of internal bus
*
*/
struct bts_bw_params {
int num_channel;
int mif_bus_width;
int bus_width;
int mif_util;
int int_util;
};
/**
* struct bts - Device BTS structure
* @lock: a spin-lock to protect accessing bts
* @mutex_lock: mutex-lock to protect accessing setting DVFS
*
* @num_bts: number of bts hardware
* @num_scen: number of scenario be used
* @top_scen: current top scenario
*
* @bts_list: struct bts_info * - contains start address pointer for BTS devices
* @scen_list: struct bts_scen * - contains start address pointer for BTS scenarios
* @scen_node: list node - contains structure about scenario
*
* @bts_bw: struct bts_bw * - struct for saving bandwidth information
* @peak_bw: currently max bandwidth
* @total_bw: current total bandwidth
*
* This structure stores basic BTS information for QoS control
*
* Note that it contains only basic information of BTS device driver
*
*/
struct bts_device {
struct device *dev;
spinlock_t lock;
struct mutex mutex_lock;
unsigned int num_bts;
unsigned int num_scen;
unsigned int top_scen;
struct bts_info *bts_list;
struct bts_scen *scen_list;
struct list_head scen_node;
struct bts_bw *bts_bw;
struct bts_bw_params bw_params;
unsigned int peak_bw;
unsigned int total_bw;
};
/**
* struct bts_ops - operation functions for BTS setting
* @init_bts: function for initialize.
* It will be run only on initial time and after system resume
* @set_bts: operation function to set bts.
* @get_bts: operation function to get bts.
* @set_qos: operation function to set axqos of bts.
* @get_qos: operation function to get axqos of bts.
* @set_mo: operation function to set xmo of bts.
* @get_mo: operation function to get xmo of bts.
* @set_urgent: operation function to set urgent timeout of bts.
* @get_urgent: operation function to get urgent timeout of bts.
* @set_blocking: operation function to set blocking threshold of bts.
* @get_blocking: operation function to get blocking threshold of bts.
*
*/
struct bts_ops {
void (*init_bts)(void __iomem *va);
int (*set_bts)(void __iomem *va, struct bts_stat *stat);
int (*get_bts)(void __iomem *va, struct bts_stat *stat);
int (*set_qos)(void __iomem *va, struct bts_stat *stat);
int (*get_qos)(void __iomem *va, struct bts_stat *stat);
int (*set_mo)(void __iomem *va, struct bts_stat *stat);
int (*get_mo)(void __iomem *va, struct bts_stat *stat);
int (*set_urgent)(void __iomem *va, struct bts_stat *stat);
int (*get_urgent)(void __iomem *va, struct bts_stat *stat);
int (*set_blocking)(void __iomem *va, struct bts_stat *stat);
int (*get_blocking)(void __iomem *va, struct bts_stat *stat);
};
/**
* struct bts_scen - BTS scenario
* @node
* @index: scenario index
* @status: scenario status (0 means scenario is off / 1 means on)
* @name: scenario name
*
* BTS scenario is defined in Device Tree and parsed in probe function
* index will be used as priority order of scenarios
*/
struct bts_scen {
struct list_head node;
unsigned int index;
bool status;
int usage_count;
const char *name;
};
/**
* struct bts_stat - BTS status
* @stat_on: shows current set of config can be used or not
* @bypass: when BTS must bypass master request, set as true
*
* @arqos: ArQoS value for master IP (0x0~0xF)
* @awqos: AwQoS value for master IP (0x0~0xF)
* @rmo: Multiple Outstanding value for Read
* @wmo: Multiple Outstanding value for Write
* @qurgent: Signal from Master which accelerates delayed requests
* @qurgent_th_r/w: Threshold for Qurgent. Read/Write is seperated
* @blocking: Signal from Slave which limits master requests
* @qmax_limit_r/w: Limitation criteria when QMAX is enabled
* @qfull_limit_r/w: Limitation criteria when QFULL is enabled
* @qbusy_limit_r/w: Limitation criteria when QBUSY is enabled
*
* This structure stores data to control BTS
*
*/
struct bts_stat {
bool stat_on;
bool bypass;
unsigned int arqos;
unsigned int awqos;
unsigned int rmo;
unsigned int wmo;
unsigned int qurgent_on;
unsigned int qurgent_th_r;
unsigned int qurgent_th_w;
bool blocking_on;
unsigned int qfull_limit_r;
unsigned int qfull_limit_w;
unsigned int qbusy_limit_r;
unsigned int qbusy_limit_w;
unsigned int qmax0_limit_r;
unsigned int qmax0_limit_w;
unsigned int qmax1_limit_r;
unsigned int qmax1_limit_w;
unsigned int vc_cfg;
void __iomem *qos_va_base;
bool drex_on;
struct drex_stat *drex;
bool drex_pf_on;
struct drex_pf_stat *drex_pf;
};
struct drex_stat {
unsigned int write_flush_config_0;
unsigned int write_flush_config_1;
unsigned int drex_timeout[MAX_QOS + 1];
unsigned int vc_timer_th[VC_TIMER_TH_NR];
unsigned int cutoff_con;
unsigned int brb_cutoff_con;
unsigned int wdbuf_cutoff_con;
};
struct drex_pf_stat {
unsigned int pf_token_control;
unsigned int pf_token_threshold0;
unsigned int pf_rreq_thrt_con;
unsigned int pf_rreq_thrt_mo_p2;
unsigned int pf_qos_timer[PF_TIMER_NR];
};
/**
* struct bts_info - BTS information
* @name: name of BTS
* @pa_base: Physical Address data of BTS
* @va_base: Virtual Address data of BTS
* @status: boolean value whether BTS is on/off
* @type: type of bts
* @pd_name: name of power domain
* @pd_on: whether related power domain is on/off
* @stat: list of array that contains BTS status data for QoS control
* @ops: operation function classified according to bts type
*
*/
struct bts_info {
const char *name;
unsigned int pa_base;
void __iomem *va_base;
bool status;
unsigned int type;
unsigned int pd_id;
bool pd_on;
struct bts_stat *stat;
struct bts_ops *ops;
};
extern int register_btsops(struct bts_info *info);
extern int exynos_bts_debugfs_init(void);
#endif