]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
x86/resctrl: Add data structures and definitions for ABMC assignment
authorBabu Moger <babu.moger@amd.com>
Fri, 5 Sep 2025 21:34:13 +0000 (16:34 -0500)
committerBorislav Petkov (AMD) <bp@alien8.de>
Mon, 15 Sep 2025 10:17:33 +0000 (12:17 +0200)
The ABMC feature allows users to assign a hardware counter to an RMID,
event pair and monitor bandwidth usage as long as it is assigned. The
hardware continues to track the assigned counter until it is explicitly
unassigned by the user.

The ABMC feature implements an MSR L3_QOS_ABMC_CFG (C000_03FDh).
ABMC counter assignment is done by setting the counter id, bandwidth
source (RMID) and bandwidth configuration.

Attempts to read or write the MSR when ABMC is not enabled will result
in a #GP(0) exception.

Introduce the data structures and definitions for MSR L3_QOS_ABMC_CFG
(0xC000_03FDh):
=========================================================================
Bits  Mnemonic Description Access Reset
Type   Value
=========================================================================
63  CfgEn  Configuration Enable  R/W  0

62  CtrEn  Enable/disable counting R/W  0

61:53  –  Reserved  MBZ  0

52:48  CtrID  Counter Identifier R/W 0

47  IsCOS BwSrc field is a CLOSID R/W 0
(not an RMID)

46:44  – Reserved MBZ 0

43:32 BwSrc Bandwidth Source R/W 0
(RMID or CLOSID)

31:0 BwType Bandwidth configuration R/W 0
tracked by the CtrID
==========================================================================

The ABMC feature details are documented in APM [1] available from [2].
[1] AMD64 Architecture Programmer's Manual Volume 2: System Programming
Publication # 24593 Revision 3.41 section 19.3.3.3 Assignable Bandwidth
Monitoring (ABMC).

  [ bp: Touchups. ]

Signed-off-by: Babu Moger <babu.moger@amd.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Link: https://lore.kernel.org/cover.1757108044.git.babu.moger@amd.com
Link: https://bugzilla.kernel.org/show_bug.cgi?id=206537
arch/x86/include/asm/msr-index.h
arch/x86/kernel/cpu/resctrl/internal.h

index e4945e5c92ef806a9738ffc29b425d8a6acfd22e..e3a445b43d7d6c3b764b80bf05ba641ab85f1772 100644 (file)
 /* - AMD: */
 #define MSR_IA32_MBA_BW_BASE           0xc0000200
 #define MSR_IA32_SMBA_BW_BASE          0xc0000280
+#define MSR_IA32_L3_QOS_ABMC_CFG       0xc00003fd
 #define MSR_IA32_L3_QOS_EXT_CFG                0xc00003ff
 #define MSR_IA32_EVT_CFG_BASE          0xc0000400
 
index a79a487e639c021e9d0a2ff2eebe28d934a82c32..0444fea49b11f8131a5160422742f328d447e3db 100644 (file)
@@ -164,6 +164,42 @@ union cpuid_0x10_x_edx {
        unsigned int full;
 };
 
+/*
+ * ABMC counters are configured by writing to MSR_IA32_L3_QOS_ABMC_CFG.
+ *
+ * @bw_type            : Event configuration that represents the memory
+ *                       transactions being tracked by the @cntr_id.
+ * @bw_src             : Bandwidth source (RMID or CLOSID).
+ * @reserved1          : Reserved.
+ * @is_clos            : @bw_src field is a CLOSID (not an RMID).
+ * @cntr_id            : Counter identifier.
+ * @reserved           : Reserved.
+ * @cntr_en            : Counting enable bit.
+ * @cfg_en             : Configuration enable bit.
+ *
+ * Configuration and counting:
+ * Counter can be configured across multiple writes to MSR. Configuration
+ * is applied only when @cfg_en = 1. Counter @cntr_id is reset when the
+ * configuration is applied.
+ * @cfg_en = 1, @cntr_en = 0 : Apply @cntr_id configuration but do not
+ *                             count events.
+ * @cfg_en = 1, @cntr_en = 1 : Apply @cntr_id configuration and start
+ *                             counting events.
+ */
+union l3_qos_abmc_cfg {
+       struct {
+               unsigned long bw_type  :32,
+                             bw_src   :12,
+                             reserved1: 3,
+                             is_clos  : 1,
+                             cntr_id  : 5,
+                             reserved : 9,
+                             cntr_en  : 1,
+                             cfg_en   : 1;
+       } split;
+       unsigned long full;
+};
+
 void rdt_ctrl_update(void *arg);
 
 int rdt_get_mon_l3_config(struct rdt_resource *r);