Commit a96f1b9c authored by David E. Box's avatar David E. Box Committed by Hans de Goede

platform/x86/intel/sdsi: Add meter certificate support

Add support for reading the meter certificate from Intel On Demand
hardware.  The meter certificate [1] is used to access the utilization
metrics of enabled features in support of the Intel On Demand consumption
model. Similar to the state certificate, the meter certificate is read by
mailbox command.

While making similar changes also use the BIN_ATTR_ADMIN_RO helper to
create the 'registers' sysfs file.

Link: https://github.com/intel-sandbox/debox1.intel_sdsi/blob/gnr-review/meter-certificate.rst [1]
Signed-off-by: default avatarDavid E. Box <david.e.box@linux.intel.com>
Link: https://lore.kernel.org/r/20221119002343.1281885-5-david.e.box@linux.intel.comReviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 25612c0f
...@@ -69,6 +69,16 @@ Description: ...@@ -69,6 +69,16 @@ Description:
the CPU configuration is updated. A cold reboot is required to the CPU configuration is updated. A cold reboot is required to
fully activate the feature. Mailbox command. fully activate the feature. Mailbox command.
What: /sys/bus/auxiliary/devices/intel_vsec.sdsi.X/meter_certificate
Date: Nov 2022
KernelVersion: 6.2
Contact: "David E. Box" <david.e.box@linux.intel.com>
Description:
(RO) Used to read back the current meter certificate for the CPU
from Intel On Demand hardware. The meter certificate contains
utilization metrics of On Demand enabled features. Mailbox
command.
What: /sys/bus/auxiliary/devices/intel_vsec.sdsi.X/state_certificate What: /sys/bus/auxiliary/devices/intel_vsec.sdsi.X/state_certificate
Date: Feb 2022 Date: Feb 2022
KernelVersion: 5.18 KernelVersion: 5.18
......
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#define SDSI_ENABLED_FEATURES_OFFSET 16 #define SDSI_ENABLED_FEATURES_OFFSET 16
#define SDSI_FEATURE_SDSI BIT(3) #define SDSI_FEATURE_SDSI BIT(3)
#define SDSI_FEATURE_METERING BIT(26)
#define SDSI_SOCKET_ID_OFFSET 64 #define SDSI_SOCKET_ID_OFFSET 64
#define SDSI_SOCKET_ID GENMASK(3, 0) #define SDSI_SOCKET_ID GENMASK(3, 0)
...@@ -83,9 +84,10 @@ ...@@ -83,9 +84,10 @@
#define GUID_V2_REGS_SIZE 80 #define GUID_V2_REGS_SIZE 80
enum sdsi_command { enum sdsi_command {
SDSI_CMD_PROVISION_AKC = 0x04, SDSI_CMD_PROVISION_AKC = 0x0004,
SDSI_CMD_PROVISION_CAP = 0x08, SDSI_CMD_PROVISION_CAP = 0x0008,
SDSI_CMD_READ_STATE = 0x10, SDSI_CMD_READ_STATE = 0x0010,
SDSI_CMD_READ_METER = 0x0014,
}; };
struct sdsi_mbox_info { struct sdsi_mbox_info {
...@@ -401,13 +403,10 @@ static ssize_t provision_cap_write(struct file *filp, struct kobject *kobj, ...@@ -401,13 +403,10 @@ static ssize_t provision_cap_write(struct file *filp, struct kobject *kobj,
} }
static BIN_ATTR_WO(provision_cap, SDSI_SIZE_WRITE_MSG); static BIN_ATTR_WO(provision_cap, SDSI_SIZE_WRITE_MSG);
static long state_certificate_read(struct file *filp, struct kobject *kobj, static ssize_t
struct bin_attribute *attr, char *buf, loff_t off, certificate_read(u64 command, struct sdsi_priv *priv, char *buf, loff_t off,
size_t count) size_t count)
{ {
struct device *dev = kobj_to_dev(kobj);
struct sdsi_priv *priv = dev_get_drvdata(dev);
u64 command = SDSI_CMD_READ_STATE;
struct sdsi_mbox_info info; struct sdsi_mbox_info info;
size_t size; size_t size;
int ret; int ret;
...@@ -444,7 +443,30 @@ static long state_certificate_read(struct file *filp, struct kobject *kobj, ...@@ -444,7 +443,30 @@ static long state_certificate_read(struct file *filp, struct kobject *kobj,
return size; return size;
} }
static BIN_ATTR(state_certificate, 0400, state_certificate_read, NULL, SDSI_SIZE_READ_MSG);
static ssize_t
state_certificate_read(struct file *filp, struct kobject *kobj,
struct bin_attribute *attr, char *buf, loff_t off,
size_t count)
{
struct device *dev = kobj_to_dev(kobj);
struct sdsi_priv *priv = dev_get_drvdata(dev);
return certificate_read(SDSI_CMD_READ_STATE, priv, buf, off, count);
}
static BIN_ATTR_ADMIN_RO(state_certificate, SDSI_SIZE_READ_MSG);
static ssize_t
meter_certificate_read(struct file *filp, struct kobject *kobj,
struct bin_attribute *attr, char *buf, loff_t off,
size_t count)
{
struct device *dev = kobj_to_dev(kobj);
struct sdsi_priv *priv = dev_get_drvdata(dev);
return certificate_read(SDSI_CMD_READ_METER, priv, buf, off, count);
}
static BIN_ATTR_ADMIN_RO(meter_certificate, SDSI_SIZE_READ_MSG);
static ssize_t registers_read(struct file *filp, struct kobject *kobj, static ssize_t registers_read(struct file *filp, struct kobject *kobj,
struct bin_attribute *attr, char *buf, loff_t off, struct bin_attribute *attr, char *buf, loff_t off,
...@@ -470,11 +492,12 @@ static ssize_t registers_read(struct file *filp, struct kobject *kobj, ...@@ -470,11 +492,12 @@ static ssize_t registers_read(struct file *filp, struct kobject *kobj,
return count; return count;
} }
static BIN_ATTR(registers, 0400, registers_read, NULL, SDSI_SIZE_REGS); static BIN_ATTR_ADMIN_RO(registers, SDSI_SIZE_REGS);
static struct bin_attribute *sdsi_bin_attrs[] = { static struct bin_attribute *sdsi_bin_attrs[] = {
&bin_attr_registers, &bin_attr_registers,
&bin_attr_state_certificate, &bin_attr_state_certificate,
&bin_attr_meter_certificate,
&bin_attr_provision_akc, &bin_attr_provision_akc,
&bin_attr_provision_cap, &bin_attr_provision_cap,
NULL NULL
...@@ -494,6 +517,10 @@ sdsi_battr_is_visible(struct kobject *kobj, struct bin_attribute *attr, int n) ...@@ -494,6 +517,10 @@ sdsi_battr_is_visible(struct kobject *kobj, struct bin_attribute *attr, int n)
if (!(priv->features & SDSI_FEATURE_SDSI)) if (!(priv->features & SDSI_FEATURE_SDSI))
return 0; return 0;
if (attr == &bin_attr_meter_certificate)
return (priv->features & SDSI_FEATURE_METERING) ?
attr->attr.mode : 0;
return attr->attr.mode; return attr->attr.mode;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment