1
2#ifndef _ASM_X86_RESCTRL_INTERNAL_H
3#define _ASM_X86_RESCTRL_INTERNAL_H
4
5#include <linux/sched.h>
6#include <linux/kernfs.h>
7#include <linux/fs_context.h>
8#include <linux/jump_label.h>
9
10#define MSR_IA32_L3_QOS_CFG 0xc81
11#define MSR_IA32_L2_QOS_CFG 0xc82
12#define MSR_IA32_L3_CBM_BASE 0xc90
13#define MSR_IA32_L2_CBM_BASE 0xd10
14#define MSR_IA32_MBA_THRTL_BASE 0xd50
15#define MSR_IA32_MBA_BW_BASE 0xc0000200
16
17#define MSR_IA32_QM_CTR 0x0c8e
18#define MSR_IA32_QM_EVTSEL 0x0c8d
19
20#define L3_QOS_CDP_ENABLE 0x01ULL
21
22#define L2_QOS_CDP_ENABLE 0x01ULL
23
24
25
26
27
28#define QOS_L3_OCCUP_EVENT_ID 0x01
29#define QOS_L3_MBM_TOTAL_EVENT_ID 0x02
30#define QOS_L3_MBM_LOCAL_EVENT_ID 0x03
31
32#define CQM_LIMBOCHECK_INTERVAL 1000
33
34#define MBM_CNTR_WIDTH_BASE 24
35#define MBM_OVERFLOW_INTERVAL 1000
36#define MAX_MBA_BW 100u
37#define MBA_IS_LINEAR 0x4
38#define MBA_MAX_MBPS U32_MAX
39#define MAX_MBA_BW_AMD 0x800
40#define MBM_CNTR_WIDTH_OFFSET_AMD 20
41
42#define RMID_VAL_ERROR BIT_ULL(63)
43#define RMID_VAL_UNAVAIL BIT_ULL(62)
44
45
46
47
48
49#define MBM_CNTR_WIDTH_OFFSET_MAX (62 - MBM_CNTR_WIDTH_BASE)
50
51
52struct rdt_fs_context {
53 struct kernfs_fs_context kfc;
54 bool enable_cdpl2;
55 bool enable_cdpl3;
56 bool enable_mba_mbps;
57};
58
59static inline struct rdt_fs_context *rdt_fc2context(struct fs_context *fc)
60{
61 struct kernfs_fs_context *kfc = fc->fs_private;
62
63 return container_of(kfc, struct rdt_fs_context, kfc);
64}
65
66DECLARE_STATIC_KEY_FALSE(rdt_enable_key);
67DECLARE_STATIC_KEY_FALSE(rdt_mon_enable_key);
68
69
70
71
72
73
74struct mon_evt {
75 u32 evtid;
76 char *name;
77 struct list_head list;
78};
79
80
81
82
83
84
85
86union mon_data_bits {
87 void *priv;
88 struct {
89 unsigned int rid : 10;
90 unsigned int evtid : 8;
91 unsigned int domid : 14;
92 } u;
93};
94
95struct rmid_read {
96 struct rdtgroup *rgrp;
97 struct rdt_resource *r;
98 struct rdt_domain *d;
99 int evtid;
100 bool first;
101 u64 val;
102};
103
104extern unsigned int resctrl_cqm_threshold;
105extern bool rdt_alloc_capable;
106extern bool rdt_mon_capable;
107extern unsigned int rdt_mon_features;
108
109enum rdt_group_type {
110 RDTCTRL_GROUP = 0,
111 RDTMON_GROUP,
112 RDT_NUM_GROUP,
113};
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133enum rdtgrp_mode {
134 RDT_MODE_SHAREABLE = 0,
135 RDT_MODE_EXCLUSIVE,
136 RDT_MODE_PSEUDO_LOCKSETUP,
137 RDT_MODE_PSEUDO_LOCKED,
138
139
140 RDT_NUM_MODES,
141};
142
143
144
145
146
147
148
149
150struct mongroup {
151 struct kernfs_node *mon_data_kn;
152 struct rdtgroup *parent;
153 struct list_head crdtgrp_list;
154 u32 rmid;
155};
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179struct pseudo_lock_region {
180 struct rdt_resource *r;
181 struct rdt_domain *d;
182 u32 cbm;
183 wait_queue_head_t lock_thread_wq;
184 int thread_done;
185 int cpu;
186 unsigned int line_size;
187 unsigned int size;
188 void *kmem;
189 unsigned int minor;
190 struct dentry *debugfs_dir;
191 struct list_head pm_reqs;
192};
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209struct rdtgroup {
210 struct kernfs_node *kn;
211 struct list_head rdtgroup_list;
212 u32 closid;
213 struct cpumask cpu_mask;
214 int flags;
215 atomic_t waitcount;
216 enum rdt_group_type type;
217 struct mongroup mon;
218 enum rdtgrp_mode mode;
219 struct pseudo_lock_region *plr;
220};
221
222
223#define RDT_DELETED 1
224
225
226#define RFTYPE_FLAGS_CPUS_LIST 1
227
228
229
230
231#define RFTYPE_INFO BIT(0)
232#define RFTYPE_BASE BIT(1)
233#define RF_CTRLSHIFT 4
234#define RF_MONSHIFT 5
235#define RF_TOPSHIFT 6
236#define RFTYPE_CTRL BIT(RF_CTRLSHIFT)
237#define RFTYPE_MON BIT(RF_MONSHIFT)
238#define RFTYPE_TOP BIT(RF_TOPSHIFT)
239#define RFTYPE_RES_CACHE BIT(8)
240#define RFTYPE_RES_MB BIT(9)
241#define RF_CTRL_INFO (RFTYPE_INFO | RFTYPE_CTRL)
242#define RF_MON_INFO (RFTYPE_INFO | RFTYPE_MON)
243#define RF_TOP_INFO (RFTYPE_INFO | RFTYPE_TOP)
244#define RF_CTRL_BASE (RFTYPE_BASE | RFTYPE_CTRL)
245
246
247extern struct list_head rdt_all_groups;
248
249extern int max_name_width, max_data_width;
250
251int __init rdtgroup_init(void);
252void __exit rdtgroup_exit(void);
253
254
255
256
257
258
259
260
261
262
263
264struct rftype {
265 char *name;
266 umode_t mode;
267 struct kernfs_ops *kf_ops;
268 unsigned long flags;
269 unsigned long fflags;
270
271 int (*seq_show)(struct kernfs_open_file *of,
272 struct seq_file *sf, void *v);
273
274
275
276
277
278 ssize_t (*write)(struct kernfs_open_file *of,
279 char *buf, size_t nbytes, loff_t off);
280};
281
282
283
284
285
286
287
288
289
290
291
292struct mbm_state {
293 u64 chunks;
294 u64 prev_msr;
295 u64 chunks_bw;
296 u64 prev_bw_msr;
297 u32 prev_bw;
298 u32 delta_bw;
299 bool delta_comp;
300};
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323struct rdt_domain {
324 struct list_head list;
325 int id;
326 struct cpumask cpu_mask;
327 unsigned long *rmid_busy_llc;
328 struct mbm_state *mbm_total;
329 struct mbm_state *mbm_local;
330 struct delayed_work mbm_over;
331 struct delayed_work cqm_limbo;
332 int mbm_work_cpu;
333 int cqm_work_cpu;
334 u32 *ctrl_val;
335 u32 *mbps_val;
336 u32 new_ctrl;
337 bool have_new_ctrl;
338 struct pseudo_lock_region *plr;
339};
340
341
342
343
344
345
346
347struct msr_param {
348 struct rdt_resource *res;
349 int low;
350 int high;
351};
352
353
354
355
356
357
358
359
360
361
362
363
364struct rdt_cache {
365 unsigned int cbm_len;
366 unsigned int min_cbm_bits;
367 unsigned int cbm_idx_mult;
368 unsigned int cbm_idx_offset;
369 unsigned int shareable_bits;
370};
371
372
373
374
375
376
377
378
379
380
381
382struct rdt_membw {
383 u32 max_delay;
384 u32 min_bw;
385 u32 bw_gran;
386 u32 delay_linear;
387 bool mba_sc;
388 u32 *mb_map;
389};
390
391static inline bool is_llc_occupancy_enabled(void)
392{
393 return (rdt_mon_features & (1 << QOS_L3_OCCUP_EVENT_ID));
394}
395
396static inline bool is_mbm_total_enabled(void)
397{
398 return (rdt_mon_features & (1 << QOS_L3_MBM_TOTAL_EVENT_ID));
399}
400
401static inline bool is_mbm_local_enabled(void)
402{
403 return (rdt_mon_features & (1 << QOS_L3_MBM_LOCAL_EVENT_ID));
404}
405
406static inline bool is_mbm_enabled(void)
407{
408 return (is_mbm_total_enabled() || is_mbm_local_enabled());
409}
410
411static inline bool is_mbm_event(int e)
412{
413 return (e >= QOS_L3_MBM_TOTAL_EVENT_ID &&
414 e <= QOS_L3_MBM_LOCAL_EVENT_ID);
415}
416
417struct rdt_parse_data {
418 struct rdtgroup *rdtgrp;
419 char *buf;
420};
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446struct rdt_resource {
447 int rid;
448 bool alloc_enabled;
449 bool mon_enabled;
450 bool alloc_capable;
451 bool mon_capable;
452 char *name;
453 int num_closid;
454 int cache_level;
455 u32 default_ctrl;
456 unsigned int msr_base;
457 void (*msr_update) (struct rdt_domain *d, struct msr_param *m,
458 struct rdt_resource *r);
459 int data_width;
460 struct list_head domains;
461 struct rdt_cache cache;
462 struct rdt_membw membw;
463 const char *format_str;
464 int (*parse_ctrlval)(struct rdt_parse_data *data,
465 struct rdt_resource *r,
466 struct rdt_domain *d);
467 bool (*cbm_validate)(char *buf, u32 *data, struct rdt_resource *r);
468 struct list_head evt_list;
469 int num_rmid;
470 unsigned int mon_scale;
471 unsigned int mbm_width;
472 unsigned long fflags;
473};
474
475int parse_cbm(struct rdt_parse_data *data, struct rdt_resource *r,
476 struct rdt_domain *d);
477int parse_bw_intel(struct rdt_parse_data *data, struct rdt_resource *r,
478 struct rdt_domain *d);
479int parse_bw_amd(struct rdt_parse_data *data, struct rdt_resource *r,
480 struct rdt_domain *d);
481
482extern struct mutex rdtgroup_mutex;
483
484extern struct rdt_resource rdt_resources_all[];
485extern struct rdtgroup rdtgroup_default;
486DECLARE_STATIC_KEY_FALSE(rdt_alloc_enable_key);
487
488extern struct dentry *debugfs_resctrl;
489
490enum {
491 RDT_RESOURCE_L3,
492 RDT_RESOURCE_L3DATA,
493 RDT_RESOURCE_L3CODE,
494 RDT_RESOURCE_L2,
495 RDT_RESOURCE_L2DATA,
496 RDT_RESOURCE_L2CODE,
497 RDT_RESOURCE_MBA,
498
499
500 RDT_NUM_RESOURCES,
501};
502
503#define for_each_rdt_resource(r) \
504 for (r = rdt_resources_all; r < rdt_resources_all + RDT_NUM_RESOURCES;\
505 r++)
506
507#define for_each_capable_rdt_resource(r) \
508 for (r = rdt_resources_all; r < rdt_resources_all + RDT_NUM_RESOURCES;\
509 r++) \
510 if (r->alloc_capable || r->mon_capable)
511
512#define for_each_alloc_capable_rdt_resource(r) \
513 for (r = rdt_resources_all; r < rdt_resources_all + RDT_NUM_RESOURCES;\
514 r++) \
515 if (r->alloc_capable)
516
517#define for_each_mon_capable_rdt_resource(r) \
518 for (r = rdt_resources_all; r < rdt_resources_all + RDT_NUM_RESOURCES;\
519 r++) \
520 if (r->mon_capable)
521
522#define for_each_alloc_enabled_rdt_resource(r) \
523 for (r = rdt_resources_all; r < rdt_resources_all + RDT_NUM_RESOURCES;\
524 r++) \
525 if (r->alloc_enabled)
526
527#define for_each_mon_enabled_rdt_resource(r) \
528 for (r = rdt_resources_all; r < rdt_resources_all + RDT_NUM_RESOURCES;\
529 r++) \
530 if (r->mon_enabled)
531
532
533union cpuid_0x10_1_eax {
534 struct {
535 unsigned int cbm_len:5;
536 } split;
537 unsigned int full;
538};
539
540
541union cpuid_0x10_3_eax {
542 struct {
543 unsigned int max_delay:12;
544 } split;
545 unsigned int full;
546};
547
548
549union cpuid_0x10_x_edx {
550 struct {
551 unsigned int cos_max:16;
552 } split;
553 unsigned int full;
554};
555
556void rdt_last_cmd_clear(void);
557void rdt_last_cmd_puts(const char *s);
558void rdt_last_cmd_printf(const char *fmt, ...);
559
560void rdt_ctrl_update(void *arg);
561struct rdtgroup *rdtgroup_kn_lock_live(struct kernfs_node *kn);
562void rdtgroup_kn_unlock(struct kernfs_node *kn);
563int rdtgroup_kn_mode_restrict(struct rdtgroup *r, const char *name);
564int rdtgroup_kn_mode_restore(struct rdtgroup *r, const char *name,
565 umode_t mask);
566struct rdt_domain *rdt_find_domain(struct rdt_resource *r, int id,
567 struct list_head **pos);
568ssize_t rdtgroup_schemata_write(struct kernfs_open_file *of,
569 char *buf, size_t nbytes, loff_t off);
570int rdtgroup_schemata_show(struct kernfs_open_file *of,
571 struct seq_file *s, void *v);
572bool rdtgroup_cbm_overlaps(struct rdt_resource *r, struct rdt_domain *d,
573 unsigned long cbm, int closid, bool exclusive);
574unsigned int rdtgroup_cbm_to_size(struct rdt_resource *r, struct rdt_domain *d,
575 unsigned long cbm);
576enum rdtgrp_mode rdtgroup_mode_by_closid(int closid);
577int rdtgroup_tasks_assigned(struct rdtgroup *r);
578int rdtgroup_locksetup_enter(struct rdtgroup *rdtgrp);
579int rdtgroup_locksetup_exit(struct rdtgroup *rdtgrp);
580bool rdtgroup_cbm_overlaps_pseudo_locked(struct rdt_domain *d, unsigned long cbm);
581bool rdtgroup_pseudo_locked_in_hierarchy(struct rdt_domain *d);
582int rdt_pseudo_lock_init(void);
583void rdt_pseudo_lock_release(void);
584int rdtgroup_pseudo_lock_create(struct rdtgroup *rdtgrp);
585void rdtgroup_pseudo_lock_remove(struct rdtgroup *rdtgrp);
586struct rdt_domain *get_domain_from_cpu(int cpu, struct rdt_resource *r);
587int update_domains(struct rdt_resource *r, int closid);
588int closids_supported(void);
589void closid_free(int closid);
590int alloc_rmid(void);
591void free_rmid(u32 rmid);
592int rdt_get_mon_l3_config(struct rdt_resource *r);
593void mon_event_count(void *info);
594int rdtgroup_mondata_show(struct seq_file *m, void *arg);
595void rmdir_mondata_subdir_allrdtgrp(struct rdt_resource *r,
596 unsigned int dom_id);
597void mkdir_mondata_subdir_allrdtgrp(struct rdt_resource *r,
598 struct rdt_domain *d);
599void mon_event_read(struct rmid_read *rr, struct rdt_resource *r,
600 struct rdt_domain *d, struct rdtgroup *rdtgrp,
601 int evtid, int first);
602void mbm_setup_overflow_handler(struct rdt_domain *dom,
603 unsigned long delay_ms);
604void mbm_handle_overflow(struct work_struct *work);
605bool is_mba_sc(struct rdt_resource *r);
606void setup_default_ctrlval(struct rdt_resource *r, u32 *dc, u32 *dm);
607u32 delay_bw_map(unsigned long bw, struct rdt_resource *r);
608void cqm_setup_limbo_handler(struct rdt_domain *dom, unsigned long delay_ms);
609void cqm_handle_limbo(struct work_struct *work);
610bool has_busy_rmid(struct rdt_resource *r, struct rdt_domain *d);
611void __check_limbo(struct rdt_domain *d, bool force_free);
612bool cbm_validate_intel(char *buf, u32 *data, struct rdt_resource *r);
613bool cbm_validate_amd(char *buf, u32 *data, struct rdt_resource *r);
614void rdt_domain_reconfigure_cdp(struct rdt_resource *r);
615
616#endif
617