1e79f15a4SChen Yu /* SPDX-License-Identifier: GPL-2.0 */ 2e79f15a4SChen Yu #ifndef _RESCTRL_H 3e79f15a4SChen Yu #define _RESCTRL_H 4e79f15a4SChen Yu 563c8b123SJames Morse #include <linux/kernel.h> 663c8b123SJames Morse #include <linux/list.h> 7a21a4391SJames Morse #include <linux/pid.h> 8a21a4391SJames Morse 9e79f15a4SChen Yu #ifdef CONFIG_PROC_CPU_RESCTRL 10e79f15a4SChen Yu 11e79f15a4SChen Yu int proc_resctrl_show(struct seq_file *m, 12e79f15a4SChen Yu struct pid_namespace *ns, 13e79f15a4SChen Yu struct pid *pid, 14e79f15a4SChen Yu struct task_struct *tsk); 15e79f15a4SChen Yu 16e79f15a4SChen Yu #endif 17e79f15a4SChen Yu 18781096d9SJames Morse /* max value for struct rdt_domain's mbps_val */ 19781096d9SJames Morse #define MBA_MAX_MBPS U32_MAX 20781096d9SJames Morse 21792e0f6fSJames Morse /** 22208ab168SJames Morse * enum resctrl_conf_type - The type of configuration. 23208ab168SJames Morse * @CDP_NONE: No prioritisation, both code and data are controlled or monitored. 24208ab168SJames Morse * @CDP_CODE: Configuration applies to instruction fetches. 25208ab168SJames Morse * @CDP_DATA: Configuration applies to reads and writes. 26208ab168SJames Morse */ 27208ab168SJames Morse enum resctrl_conf_type { 28208ab168SJames Morse CDP_NONE, 29208ab168SJames Morse CDP_CODE, 30208ab168SJames Morse CDP_DATA, 31208ab168SJames Morse }; 32208ab168SJames Morse 3375408e43SJames Morse #define CDP_NUM_TYPES (CDP_DATA + 1) 3475408e43SJames Morse 35fea62d37SJames Morse /* 36fea62d37SJames Morse * Event IDs, the values match those used to program IA32_QM_EVTSEL before 37fea62d37SJames Morse * reading IA32_QM_CTR on RDT systems. 38fea62d37SJames Morse */ 39fea62d37SJames Morse enum resctrl_event_id { 40fea62d37SJames Morse QOS_L3_OCCUP_EVENT_ID = 0x01, 41fea62d37SJames Morse QOS_L3_MBM_TOTAL_EVENT_ID = 0x02, 42fea62d37SJames Morse QOS_L3_MBM_LOCAL_EVENT_ID = 0x03, 43fea62d37SJames Morse }; 44fea62d37SJames Morse 45208ab168SJames Morse /** 46e8f72825SJames Morse * struct resctrl_staged_config - parsed configuration to be applied 47e8f72825SJames Morse * @new_ctrl: new ctrl value to be loaded 48e8f72825SJames Morse * @have_new_ctrl: whether the user provided new_ctrl is valid 49e8f72825SJames Morse */ 50e8f72825SJames Morse struct resctrl_staged_config { 51e8f72825SJames Morse u32 new_ctrl; 52e8f72825SJames Morse bool have_new_ctrl; 53e8f72825SJames Morse }; 54e8f72825SJames Morse 55e8f72825SJames Morse /** 56792e0f6fSJames Morse * struct rdt_domain - group of CPUs sharing a resctrl resource 57792e0f6fSJames Morse * @list: all instances of this resource 58792e0f6fSJames Morse * @id: unique id for this instance 59792e0f6fSJames Morse * @cpu_mask: which CPUs share this resource 60792e0f6fSJames Morse * @rmid_busy_llc: bitmap of which limbo RMIDs are above threshold 61792e0f6fSJames Morse * @mbm_total: saved state for MBM total bandwidth 62792e0f6fSJames Morse * @mbm_local: saved state for MBM local bandwidth 63792e0f6fSJames Morse * @mbm_over: worker to periodically read MBM h/w counters 64792e0f6fSJames Morse * @cqm_limbo: worker to periodically read CQM h/w counters 65792e0f6fSJames Morse * @mbm_work_cpu: worker CPU for MBM h/w counters 66792e0f6fSJames Morse * @cqm_work_cpu: worker CPU for CQM h/w counters 67792e0f6fSJames Morse * @plr: pseudo-locked region (if any) associated with domain 68e8f72825SJames Morse * @staged_config: parsed configuration to be applied 69781096d9SJames Morse * @mbps_val: When mba_sc is enabled, this holds the array of user 70781096d9SJames Morse * specified control values for mba_sc in MBps, indexed 71781096d9SJames Morse * by closid 72792e0f6fSJames Morse */ 73792e0f6fSJames Morse struct rdt_domain { 74792e0f6fSJames Morse struct list_head list; 75792e0f6fSJames Morse int id; 76792e0f6fSJames Morse struct cpumask cpu_mask; 77792e0f6fSJames Morse unsigned long *rmid_busy_llc; 78792e0f6fSJames Morse struct mbm_state *mbm_total; 79792e0f6fSJames Morse struct mbm_state *mbm_local; 80792e0f6fSJames Morse struct delayed_work mbm_over; 81792e0f6fSJames Morse struct delayed_work cqm_limbo; 82792e0f6fSJames Morse int mbm_work_cpu; 83792e0f6fSJames Morse int cqm_work_cpu; 84792e0f6fSJames Morse struct pseudo_lock_region *plr; 8575408e43SJames Morse struct resctrl_staged_config staged_config[CDP_NUM_TYPES]; 86781096d9SJames Morse u32 *mbps_val; 87792e0f6fSJames Morse }; 8863c8b123SJames Morse 8963c8b123SJames Morse /** 9063c8b123SJames Morse * struct resctrl_cache - Cache allocation related data 9163c8b123SJames Morse * @cbm_len: Length of the cache bit mask 922d4daa54SBabu Moger * @min_cbm_bits: Minimum number of consecutive bits to be set. 932d4daa54SBabu Moger * The value 0 means the architecture can support 942d4daa54SBabu Moger * zero CBM. 9563c8b123SJames Morse * @shareable_bits: Bitmask of shareable resource with other 9663c8b123SJames Morse * executing entities 9763c8b123SJames Morse * @arch_has_sparse_bitmaps: True if a bitmap like f00f is valid. 9863c8b123SJames Morse * @arch_has_per_cpu_cfg: True if QOS_CFG register for this cache 9963c8b123SJames Morse * level has CPU scope. 10063c8b123SJames Morse */ 10163c8b123SJames Morse struct resctrl_cache { 10263c8b123SJames Morse unsigned int cbm_len; 10363c8b123SJames Morse unsigned int min_cbm_bits; 10463c8b123SJames Morse unsigned int shareable_bits; 10563c8b123SJames Morse bool arch_has_sparse_bitmaps; 10663c8b123SJames Morse bool arch_has_per_cpu_cfg; 10763c8b123SJames Morse }; 10863c8b123SJames Morse 10963c8b123SJames Morse /** 11063c8b123SJames Morse * enum membw_throttle_mode - System's memory bandwidth throttling mode 11163c8b123SJames Morse * @THREAD_THROTTLE_UNDEFINED: Not relevant to the system 11263c8b123SJames Morse * @THREAD_THROTTLE_MAX: Memory bandwidth is throttled at the core 11363c8b123SJames Morse * always using smallest bandwidth percentage 11463c8b123SJames Morse * assigned to threads, aka "max throttling" 11563c8b123SJames Morse * @THREAD_THROTTLE_PER_THREAD: Memory bandwidth is throttled at the thread 11663c8b123SJames Morse */ 11763c8b123SJames Morse enum membw_throttle_mode { 11863c8b123SJames Morse THREAD_THROTTLE_UNDEFINED = 0, 11963c8b123SJames Morse THREAD_THROTTLE_MAX, 12063c8b123SJames Morse THREAD_THROTTLE_PER_THREAD, 12163c8b123SJames Morse }; 12263c8b123SJames Morse 12363c8b123SJames Morse /** 12463c8b123SJames Morse * struct resctrl_membw - Memory bandwidth allocation related data 12563c8b123SJames Morse * @min_bw: Minimum memory bandwidth percentage user can request 12663c8b123SJames Morse * @bw_gran: Granularity at which the memory bandwidth is allocated 12763c8b123SJames Morse * @delay_linear: True if memory B/W delay is in linear scale 12863c8b123SJames Morse * @arch_needs_linear: True if we can't configure non-linear resources 12963c8b123SJames Morse * @throttle_mode: Bandwidth throttling mode when threads request 13063c8b123SJames Morse * different memory bandwidths 13163c8b123SJames Morse * @mba_sc: True if MBA software controller(mba_sc) is enabled 13263c8b123SJames Morse * @mb_map: Mapping of memory B/W percentage to memory B/W delay 13363c8b123SJames Morse */ 13463c8b123SJames Morse struct resctrl_membw { 13563c8b123SJames Morse u32 min_bw; 13663c8b123SJames Morse u32 bw_gran; 13763c8b123SJames Morse u32 delay_linear; 13863c8b123SJames Morse bool arch_needs_linear; 13963c8b123SJames Morse enum membw_throttle_mode throttle_mode; 14063c8b123SJames Morse bool mba_sc; 14163c8b123SJames Morse u32 *mb_map; 14263c8b123SJames Morse }; 14363c8b123SJames Morse 14463c8b123SJames Morse struct rdt_parse_data; 1451c290682SJames Morse struct resctrl_schema; 14663c8b123SJames Morse 14763c8b123SJames Morse /** 14863c8b123SJames Morse * struct rdt_resource - attributes of a resctrl resource 14963c8b123SJames Morse * @rid: The index of the resource 15063c8b123SJames Morse * @alloc_capable: Is allocation available on this machine 15163c8b123SJames Morse * @mon_capable: Is monitor feature available on this machine 15263c8b123SJames Morse * @num_rmid: Number of RMIDs available 15363c8b123SJames Morse * @cache_level: Which cache level defines scope of this resource 15463c8b123SJames Morse * @cache: Cache allocation related data 15563c8b123SJames Morse * @membw: If the component has bandwidth controls, their properties. 15663c8b123SJames Morse * @domains: All domains for this resource 15763c8b123SJames Morse * @name: Name to use in "schemata" file. 15863c8b123SJames Morse * @data_width: Character width of data when displaying 15963c8b123SJames Morse * @default_ctrl: Specifies default cache cbm or memory B/W percent. 16063c8b123SJames Morse * @format_str: Per resource format string to show domain value 16163c8b123SJames Morse * @parse_ctrlval: Per resource function pointer to parse control values 16263c8b123SJames Morse * @evt_list: List of monitoring events 16363c8b123SJames Morse * @fflags: flags to choose base and info files 164c091e907SJames Morse * @cdp_capable: Is the CDP feature available on this resource 16563c8b123SJames Morse */ 16663c8b123SJames Morse struct rdt_resource { 16763c8b123SJames Morse int rid; 16863c8b123SJames Morse bool alloc_capable; 16963c8b123SJames Morse bool mon_capable; 17063c8b123SJames Morse int num_rmid; 17163c8b123SJames Morse int cache_level; 17263c8b123SJames Morse struct resctrl_cache cache; 17363c8b123SJames Morse struct resctrl_membw membw; 17463c8b123SJames Morse struct list_head domains; 17563c8b123SJames Morse char *name; 17663c8b123SJames Morse int data_width; 17763c8b123SJames Morse u32 default_ctrl; 17863c8b123SJames Morse const char *format_str; 17963c8b123SJames Morse int (*parse_ctrlval)(struct rdt_parse_data *data, 1801c290682SJames Morse struct resctrl_schema *s, 18163c8b123SJames Morse struct rdt_domain *d); 18263c8b123SJames Morse struct list_head evt_list; 18363c8b123SJames Morse unsigned long fflags; 184c091e907SJames Morse bool cdp_capable; 18563c8b123SJames Morse }; 18663c8b123SJames Morse 187cdb9ebc9SJames Morse /** 188cdb9ebc9SJames Morse * struct resctrl_schema - configuration abilities of a resource presented to 189cdb9ebc9SJames Morse * user-space 190cdb9ebc9SJames Morse * @list: Member of resctrl_schema_all. 191e198fde3SJames Morse * @name: The name to use in the "schemata" file. 192208ab168SJames Morse * @conf_type: Whether this schema is specific to code/data. 193cdb9ebc9SJames Morse * @res: The resource structure exported by the architecture to describe 194cdb9ebc9SJames Morse * the hardware that is configured by this schema. 1953183e87cSJames Morse * @num_closid: The number of closid that can be used with this schema. When 1963183e87cSJames Morse * features like CDP are enabled, this will be lower than the 1973183e87cSJames Morse * hardware supports for the resource. 198cdb9ebc9SJames Morse */ 199cdb9ebc9SJames Morse struct resctrl_schema { 200cdb9ebc9SJames Morse struct list_head list; 201e198fde3SJames Morse char name[8]; 202208ab168SJames Morse enum resctrl_conf_type conf_type; 203cdb9ebc9SJames Morse struct rdt_resource *res; 204eb6f3187SJames Morse u32 num_closid; 205cdb9ebc9SJames Morse }; 206eb6f3187SJames Morse 207eb6f3187SJames Morse /* The number of closid supported by this resource regardless of CDP */ 208eb6f3187SJames Morse u32 resctrl_arch_get_num_closid(struct rdt_resource *r); 2092e667819SJames Morse int resctrl_arch_update_domains(struct rdt_resource *r, u32 closid); 210ff6357bbSJames Morse 211ff6357bbSJames Morse /* 212ff6357bbSJames Morse * Update the ctrl_val and apply this config right now. 213ff6357bbSJames Morse * Must be called on one of the domain's CPUs. 214ff6357bbSJames Morse */ 215ff6357bbSJames Morse int resctrl_arch_update_one(struct rdt_resource *r, struct rdt_domain *d, 216ff6357bbSJames Morse u32 closid, enum resctrl_conf_type t, u32 cfg_val); 217ff6357bbSJames Morse 218111136e6SJames Morse u32 resctrl_arch_get_config(struct rdt_resource *r, struct rdt_domain *d, 219111136e6SJames Morse u32 closid, enum resctrl_conf_type type); 2203a7232cdSJames Morse int resctrl_online_domain(struct rdt_resource *r, struct rdt_domain *d); 221798fd4b9SJames Morse void resctrl_offline_domain(struct rdt_resource *r, struct rdt_domain *d); 2228286618aSJames Morse 2238286618aSJames Morse /** 2248286618aSJames Morse * resctrl_arch_rmid_read() - Read the eventid counter corresponding to rmid 2258286618aSJames Morse * for this resource and domain. 2268286618aSJames Morse * @r: resource that the counter should be read from. 2278286618aSJames Morse * @d: domain that the counter should be read from. 2288286618aSJames Morse * @rmid: rmid of the counter to read. 2298286618aSJames Morse * @eventid: eventid to read, e.g. L3 occupancy. 230f7b1843eSJames Morse * @val: result of the counter read in bytes. 2318286618aSJames Morse * 2328286618aSJames Morse * Call from process context on a CPU that belongs to domain @d. 2338286618aSJames Morse * 2348286618aSJames Morse * Return: 2358286618aSJames Morse * 0 on success, or -EIO, -EINVAL etc on error. 2368286618aSJames Morse */ 2378286618aSJames Morse int resctrl_arch_rmid_read(struct rdt_resource *r, struct rdt_domain *d, 2388286618aSJames Morse u32 rmid, enum resctrl_event_id eventid, u64 *val); 239eb6f3187SJames Morse 240fea62d37SJames Morse /** 241fea62d37SJames Morse * resctrl_arch_reset_rmid() - Reset any private state associated with rmid 242fea62d37SJames Morse * and eventid. 243fea62d37SJames Morse * @r: The domain's resource. 244fea62d37SJames Morse * @d: The rmid's domain. 245fea62d37SJames Morse * @rmid: The rmid whose counter values should be reset. 246fea62d37SJames Morse * @eventid: The eventid whose counter values should be reset. 247fea62d37SJames Morse * 248fea62d37SJames Morse * This can be called from any CPU. 249fea62d37SJames Morse */ 250fea62d37SJames Morse void resctrl_arch_reset_rmid(struct rdt_resource *r, struct rdt_domain *d, 251fea62d37SJames Morse u32 rmid, enum resctrl_event_id eventid); 252fea62d37SJames Morse 253*92bd5a13SBabu Moger /** 254*92bd5a13SBabu Moger * resctrl_arch_reset_rmid_all() - Reset all private state associated with 255*92bd5a13SBabu Moger * all rmids and eventids. 256*92bd5a13SBabu Moger * @r: The resctrl resource. 257*92bd5a13SBabu Moger * @d: The domain for which all architectural counter state will 258*92bd5a13SBabu Moger * be cleared. 259*92bd5a13SBabu Moger * 260*92bd5a13SBabu Moger * This can be called from any CPU. 261*92bd5a13SBabu Moger */ 262*92bd5a13SBabu Moger void resctrl_arch_reset_rmid_all(struct rdt_resource *r, struct rdt_domain *d); 263*92bd5a13SBabu Moger 264ae2328b5SJames Morse extern unsigned int resctrl_rmid_realloc_threshold; 265d80975e2SJames Morse extern unsigned int resctrl_rmid_realloc_limit; 266ae2328b5SJames Morse 267e79f15a4SChen Yu #endif /* _RESCTRL_H */ 268