* [PATCH v4 1/3] platform/x86/amd/hsmp: create plat specific struct
@ 2023-10-05 5:39 Suma Hegde
2023-10-05 5:39 ` [PATCH v4 2/3] platform/x86/amd/hsmp: add support for metrics tbl Suma Hegde
2023-10-05 5:39 ` [PATCH v4 3/3] platform/x86/amd/hsmp: improve the error log Suma Hegde
0 siblings, 2 replies; 7+ messages in thread
From: Suma Hegde @ 2023-10-05 5:39 UTC (permalink / raw)
To: platform-driver-x86
Cc: ilpo.jarvinen, hdegoede, Suma Hegde, Naveen Krishna Chatradhi
Having a separate platform device structure helps in future, to
contain platform specific variables and other data.
Also, define macros for dev nodes
Signed-off-by: Suma Hegde <suma.hegde@amd.com>
Reviewed-by: Naveen Krishna Chatradhi <nchatrad@amd.com>
---
Changes since v1:
1. defined HSMP_CDEV_NAME and HSMP_DEVNODE_NAME macros
Changes since v2:
1. moved num_sockets variable to plat_dev structure
Changes since v3:
1. updated commit message
drivers/platform/x86/amd/hsmp.c | 61 ++++++++++++++++++++-------------
1 file changed, 38 insertions(+), 23 deletions(-)
diff --git a/drivers/platform/x86/amd/hsmp.c b/drivers/platform/x86/amd/hsmp.c
index 31382ef52efb..99727cd705cf 100644
--- a/drivers/platform/x86/amd/hsmp.c
+++ b/drivers/platform/x86/amd/hsmp.c
@@ -47,9 +47,22 @@
#define HSMP_INDEX_REG 0xc4
#define HSMP_DATA_REG 0xc8
-static struct semaphore *hsmp_sem;
+#define HSMP_CDEV_NAME "hsmp_cdev"
+#define HSMP_DEVNODE_NAME "hsmp"
-static struct miscdevice hsmp_device;
+struct hsmp_socket {
+ struct semaphore hsmp_sem;
+ u16 sock_ind;
+};
+
+struct hsmp_plat_device {
+ struct miscdevice hsmp_device;
+ struct hsmp_socket *sock;
+ struct device *dev;
+ u16 num_sockets;
+};
+
+static struct hsmp_plat_device plat_dev;
static int amd_hsmp_rdwr(struct pci_dev *root, u32 address,
u32 *value, bool write)
@@ -188,6 +201,7 @@ static int validate_message(struct hsmp_message *msg)
int hsmp_send_message(struct hsmp_message *msg)
{
+ struct hsmp_socket *sock = &plat_dev.sock[msg->sock_ind];
struct amd_northbridge *nb;
int ret;
@@ -208,14 +222,13 @@ int hsmp_send_message(struct hsmp_message *msg)
* In SMP system timeout of 100 millisecs should
* be enough for the previous thread to finish the operation
*/
- ret = down_timeout(&hsmp_sem[msg->sock_ind],
- msecs_to_jiffies(HSMP_MSG_TIMEOUT));
+ ret = down_timeout(&sock->hsmp_sem, msecs_to_jiffies(HSMP_MSG_TIMEOUT));
if (ret < 0)
return ret;
ret = __hsmp_send_message(nb->root, msg);
- up(&hsmp_sem[msg->sock_ind]);
+ up(&sock->hsmp_sem);
return ret;
}
@@ -321,28 +334,31 @@ static int hsmp_pltdrv_probe(struct platform_device *pdev)
{
int i;
- hsmp_sem = devm_kzalloc(&pdev->dev,
- (amd_nb_num() * sizeof(struct semaphore)),
- GFP_KERNEL);
- if (!hsmp_sem)
+ plat_dev.sock = devm_kzalloc(&pdev->dev,
+ (plat_dev.num_sockets * sizeof(struct hsmp_socket)),
+ GFP_KERNEL);
+ if (!plat_dev.sock)
return -ENOMEM;
+ plat_dev.dev = &pdev->dev;
- for (i = 0; i < amd_nb_num(); i++)
- sema_init(&hsmp_sem[i], 1);
+ for (i = 0; i < plat_dev.num_sockets; i++) {
+ sema_init(&plat_dev.sock[i].hsmp_sem, 1);
+ plat_dev.sock[i].sock_ind = i;
+ }
- hsmp_device.name = "hsmp_cdev";
- hsmp_device.minor = MISC_DYNAMIC_MINOR;
- hsmp_device.fops = &hsmp_fops;
- hsmp_device.parent = &pdev->dev;
- hsmp_device.nodename = "hsmp";
- hsmp_device.mode = 0644;
+ plat_dev.hsmp_device.name = HSMP_CDEV_NAME;
+ plat_dev.hsmp_device.minor = MISC_DYNAMIC_MINOR;
+ plat_dev.hsmp_device.fops = &hsmp_fops;
+ plat_dev.hsmp_device.parent = &pdev->dev;
+ plat_dev.hsmp_device.nodename = HSMP_DEVNODE_NAME;
+ plat_dev.hsmp_device.mode = 0644;
- return misc_register(&hsmp_device);
+ return misc_register(&plat_dev.hsmp_device);
}
static void hsmp_pltdrv_remove(struct platform_device *pdev)
{
- misc_deregister(&hsmp_device);
+ misc_deregister(&plat_dev.hsmp_device);
}
static struct platform_driver amd_hsmp_driver = {
@@ -358,7 +374,6 @@ static struct platform_device *amd_hsmp_platdev;
static int __init hsmp_plt_init(void)
{
int ret = -ENODEV;
- u16 num_sockets;
int i;
if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD || boot_cpu_data.x86 < 0x19) {
@@ -371,12 +386,12 @@ static int __init hsmp_plt_init(void)
* amd_nb_num() returns number of SMN/DF interfaces present in the system
* if we have N SMN/DF interfaces that ideally means N sockets
*/
- num_sockets = amd_nb_num();
- if (num_sockets == 0)
+ plat_dev.num_sockets = amd_nb_num();
+ if (plat_dev.num_sockets == 0)
return ret;
/* Test the hsmp interface on each socket */
- for (i = 0; i < num_sockets; i++) {
+ for (i = 0; i < plat_dev.num_sockets; i++) {
ret = hsmp_test(i, 0xDEADBEEF);
if (ret) {
pr_err("HSMP is not supported on Fam:%x model:%x\n",
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v4 2/3] platform/x86/amd/hsmp: add support for metrics tbl
2023-10-05 5:39 [PATCH v4 1/3] platform/x86/amd/hsmp: create plat specific struct Suma Hegde
@ 2023-10-05 5:39 ` Suma Hegde
2023-10-06 13:21 ` Ilpo Järvinen
2023-10-05 5:39 ` [PATCH v4 3/3] platform/x86/amd/hsmp: improve the error log Suma Hegde
1 sibling, 1 reply; 7+ messages in thread
From: Suma Hegde @ 2023-10-05 5:39 UTC (permalink / raw)
To: platform-driver-x86
Cc: ilpo.jarvinen, hdegoede, Suma Hegde, Naveen Krishna Chatradhi
AMD MI300 MCM provides GET_METRICS_TABLE message to retrieve
all the system management information from SMU.
The metrics table is made available as hexadecimal sysfs binary file
under per socket sysfs directory created at
/sys/devices/platform/amd_hsmp/socket%d/metrics_bin
Metrics table definitions will be documented as part of Public PPR.
The same is defined in the amd_hsmp.h header.
Signed-off-by: Suma Hegde <suma.hegde@amd.com>
Reviewed-by: Naveen Krishna Chatradhi <nchatrad@amd.com>
---
Changes since v1:
1. Remove HSMP_DEVNODE_NAME and HSMP_CDEV_NAME macro definitions in
this patch
2. Remove extra space in comments for HSMP_GET_METRIC_TABLE_VER,
HSMP_GET_METRIC_TABLE and HSMP_GET_METRIC_TABLE_DRAM_ADDR enum
definition in amd_hsmp.h files
3. Change check, count == 0 to !count in hsmp_metric_tbl_read() function
4. Add hsmp_metric_table_visible() function
5. hsmp_create_metric_tbl_sysfs_file() is renamed as hsmp_init_metric_tbl_bin_attr()
and code is also modified slightly
6. Modify hsmp_create_sysfs_file() to use devm_device_add_groups()
7. Change from cleanup label to deregister label
8. Add dev_err print in hsmp_get_tbl_dram_base()
9. Reword "Unable to Failed" in hsmp_get_tbl_dram_base()
10. Add HSMP_GRP_NAME_SIZE and NUM_ATTRS macros
11. Remove sysfs cleanup code in hsmp_pltdrv_remove()
12. Correct ATRR typo error
13. Change sprintf to snprintf
14. Check metrics table support only against HSMP_PROTO_VER6
Changes since v2:
1. squash documentation patch into this patch
2. change from num_sockets to plat_dev.num_sockets
Changes since v3:
1. sysfs_attr_init() to sysfs_bin_attr_init(), errors reported by
allyesconfig build
2. "C++" style comments in amd_hsmp.h to C style comments, fix errors
reported by W=1
3. "i" data type to u8 in hsmp_create_sysfs_file(), fix errors reported
by W=1
4. remove devm_kzalloc for attr_grp->name in hsmp_create_sysfs_file()
5. rename HSMP_GRP_NAME_SIZE to HSMP_ATTR_GRP_NAME_SIZE and define value
to 10
6. move hsmp_get_tbl_dram_base() call to hsmp_init_metric_tbl_bin_attr()
7. hsmp_metric_table_visible to hsmp_is_sock_attr_visible
8. use condition check "if (count < bin_attr->size)"
in hsmp_metric_tbl_read
9. Reorder misc_register and hsmp_cache_proto_ver calls
10. remove devm_kzalloc in hsmp_init_metric_tbl_bin_attr()
11. Wordings in documentation and header and add some more comments in
the code
Documentation/arch/x86/amd_hsmp.rst | 18 +++
arch/x86/include/uapi/asm/amd_hsmp.h | 109 +++++++++++++++++
drivers/platform/x86/amd/hsmp.c | 170 ++++++++++++++++++++++++++-
3 files changed, 295 insertions(+), 2 deletions(-)
diff --git a/Documentation/arch/x86/amd_hsmp.rst b/Documentation/arch/x86/amd_hsmp.rst
index 440e4b645a1c..72083124b9ca 100644
--- a/Documentation/arch/x86/amd_hsmp.rst
+++ b/Documentation/arch/x86/amd_hsmp.rst
@@ -41,6 +41,24 @@ In-kernel integration:
* Locking across callers is taken care by the driver.
+HSMP sysfs interface
+====================
+
+1. Metrics table binary sysfs
+
+AMD MI300A MCM provides GET_METRICS_TABLE message to retrieve
+most of the system management information from SMU in one go.
+
+The metrics table is made available as hexadecimal sysfs binary file
+under per socket sysfs directory created at
+/sys/devices/platform/amd_hsmp/socket%d/metrics_bin
+
+Note: lseek is not supported as entire metrics table is read
+
+Metrics table definitions will be documented as part of Public PPR.
+The same is defined in the amd_hsmp.h header.
+
+
An example
==========
diff --git a/arch/x86/include/uapi/asm/amd_hsmp.h b/arch/x86/include/uapi/asm/amd_hsmp.h
index 769b939444ae..fce22686c834 100644
--- a/arch/x86/include/uapi/asm/amd_hsmp.h
+++ b/arch/x86/include/uapi/asm/amd_hsmp.h
@@ -47,6 +47,9 @@ enum hsmp_message_ids {
HSMP_SET_PCI_RATE, /* 20h Control link rate on PCIe devices */
HSMP_SET_POWER_MODE, /* 21h Select power efficiency profile policy */
HSMP_SET_PSTATE_MAX_MIN, /* 22h Set the max and min DF P-State */
+ HSMP_GET_METRIC_TABLE_VER, /* 23h Get metrics table version */
+ HSMP_GET_METRIC_TABLE, /* 24h Get metrics table */
+ HSMP_GET_METRIC_TABLE_DRAM_ADDR,/* 25h Get metrics table dram address */
HSMP_MSG_ID_MAX,
};
@@ -64,6 +67,14 @@ enum hsmp_msg_type {
HSMP_GET = 1,
};
+enum hsmp_proto_versions {
+ HSMP_PROTO_VER2 = 2,
+ HSMP_PROTO_VER3,
+ HSMP_PROTO_VER4,
+ HSMP_PROTO_VER5,
+ HSMP_PROTO_VER6
+};
+
struct hsmp_msg_desc {
int num_args;
int response_sz;
@@ -295,6 +306,104 @@ static const struct hsmp_msg_desc hsmp_msg_desc_table[] = {
* input: args[0] = min df pstate[15:8] + max df pstate[7:0]
*/
{1, 0, HSMP_SET},
+
+ /*
+ * HSMP_GET_METRIC_TABLE_VER, num_args = 0, response_sz = 1
+ * output: args[0] = metrics table version
+ */
+ {0, 1, HSMP_GET},
+
+ /*
+ * HSMP_GET_METRIC_TABLE, num_args = 0, response_sz = 0
+ */
+ {0, 0, HSMP_GET},
+
+ /*
+ * HSMP_GET_METRIC_TABLE_DRAM_ADDR, num_args = 0, response_sz = 2
+ * output: args[0] = lower 32 bits of the address
+ * output: args[1] = upper 32 bits of the address
+ */
+ {0, 2, HSMP_GET},
+};
+
+/* Metrics table (supported only with proto version 6) */
+struct hsmp_metric_table {
+ __u32 accumulation_counter;
+
+ /* TEMPERATURE */
+ __u32 max_socket_temperature;
+ __u32 max_vr_temperature;
+ __u32 max_hbm_temperature;
+ __u64 max_socket_temperature_acc;
+ __u64 max_vr_temperature_acc;
+ __u64 max_hbm_temperature_acc;
+
+ /* POWER */
+ __u32 socket_power_limit;
+ __u32 max_socket_power_limit;
+ __u32 socket_power;
+
+ /* ENERGY */
+ __u64 timestamp;
+ __u64 socket_energy_acc;
+ __u64 ccd_energy_acc;
+ __u64 xcd_energy_acc;
+ __u64 aid_energy_acc;
+ __u64 hbm_energy_acc;
+
+ /* FREQUENCY */
+ __u32 cclk_frequency_limit;
+ __u32 gfxclk_frequency_limit;
+ __u32 fclk_frequency;
+ __u32 uclk_frequency;
+ __u32 socclk_frequency[4];
+ __u32 vclk_frequency[4];
+ __u32 dclk_frequency[4];
+ __u32 lclk_frequency[4];
+ __u64 gfxclk_frequency_acc[8];
+ __u64 cclk_frequency_acc[96];
+
+ /* FREQUENCY RANGE */
+ __u32 max_cclk_frequency;
+ __u32 min_cclk_frequency;
+ __u32 max_gfxclk_frequency;
+ __u32 min_gfxclk_frequency;
+ __u32 fclk_frequency_table[4];
+ __u32 uclk_frequency_table[4];
+ __u32 socclk_frequency_table[4];
+ __u32 vclk_frequency_table[4];
+ __u32 dclk_frequency_table[4];
+ __u32 lclk_frequency_table[4];
+ __u32 max_lclk_dpm_range;
+ __u32 min_lclk_dpm_range;
+
+ /* XGMI */
+ __u32 xgmi_width;
+ __u32 xgmi_bitrate;
+ __u64 xgmi_read_bandwidth_acc[8];
+ __u64 xgmi_write_bandwidth_acc[8];
+
+ /* ACTIVITY */
+ __u32 socket_c0_residency;
+ __u32 socket_gfx_busy;
+ __u32 dram_bandwidth_utilization;
+ __u64 socket_c0_residency_acc;
+ __u64 socket_gfx_busy_acc;
+ __u64 dram_bandwidth_acc;
+ __u32 max_dram_bandwidth;
+ __u64 dram_bandwidth_utilization_acc;
+ __u64 pcie_bandwidth_acc[4];
+
+ /* THROTTLERS */
+ __u32 prochot_residency_acc;
+ __u32 ppt_residency_acc;
+ __u32 socket_thm_residency_acc;
+ __u32 vr_thm_residency_acc;
+ __u32 hbm_thm_residency_acc;
+ __u32 spare;
+
+ /* New items at the end to maintain driver compatibility */
+ __u32 gfxclk_frequency[8];
};
/* Reset to default packing */
diff --git a/drivers/platform/x86/amd/hsmp.c b/drivers/platform/x86/amd/hsmp.c
index 99727cd705cf..5d8efff201d3 100644
--- a/drivers/platform/x86/amd/hsmp.c
+++ b/drivers/platform/x86/amd/hsmp.c
@@ -20,7 +20,7 @@
#include <linux/semaphore.h>
#define DRIVER_NAME "amd_hsmp"
-#define DRIVER_VERSION "1.0"
+#define DRIVER_VERSION "2.0"
/* HSMP Status / Error codes */
#define HSMP_STATUS_NOT_READY 0x00
@@ -49,9 +49,15 @@
#define HSMP_CDEV_NAME "hsmp_cdev"
#define HSMP_DEVNODE_NAME "hsmp"
+#define HSMP_METRICS_TABLE_NAME "metrics_bin"
+
+#define HSMP_ATTR_GRP_NAME_SIZE 10
struct hsmp_socket {
+ struct bin_attribute hsmp_attr;
+ void __iomem *metric_tbl_addr;
struct semaphore hsmp_sem;
+ char name[HSMP_ATTR_GRP_NAME_SIZE];
u16 sock_ind;
};
@@ -59,6 +65,7 @@ struct hsmp_plat_device {
struct miscdevice hsmp_device;
struct hsmp_socket *sock;
struct device *dev;
+ u32 proto_ver;
u16 num_sockets;
};
@@ -330,9 +337,158 @@ static const struct file_operations hsmp_fops = {
.compat_ioctl = hsmp_ioctl,
};
+static ssize_t hsmp_metric_tbl_read(struct file *filp, struct kobject *kobj,
+ struct bin_attribute *bin_attr, char *buf,
+ loff_t off, size_t count)
+{
+ struct hsmp_socket *sock = bin_attr->private;
+ struct hsmp_message msg = { 0 };
+ int ret;
+
+ /* Do not support lseek, reads entire metric table */
+ if (count < bin_attr->size) {
+ dev_err(plat_dev.dev, "Wrong buffer size\n");
+ return -EINVAL;
+ }
+
+ if (!sock) {
+ dev_err(plat_dev.dev, "Failed to read attribute private data\n");
+ return -EINVAL;
+ }
+
+ msg.msg_id = HSMP_GET_METRIC_TABLE;
+ msg.sock_ind = sock->sock_ind;
+
+ ret = hsmp_send_message(&msg);
+ if (ret)
+ return ret;
+ memcpy(buf, sock->metric_tbl_addr, bin_attr->size);
+
+ return bin_attr->size;
+}
+
+static int hsmp_get_tbl_dram_base(u16 sock_ind)
+{
+ struct hsmp_socket *sock = &plat_dev.sock[sock_ind];
+ struct hsmp_message msg = { 0 };
+ phys_addr_t dram_addr;
+ int ret;
+
+ msg.sock_ind = sock_ind;
+ msg.response_sz = hsmp_msg_desc_table[HSMP_GET_METRIC_TABLE_DRAM_ADDR].response_sz;
+ msg.msg_id = HSMP_GET_METRIC_TABLE_DRAM_ADDR;
+
+ ret = hsmp_send_message(&msg);
+ if (ret)
+ return ret;
+
+ /*
+ * calculate the metric table DRAM address from lower and upper 32 bits
+ * sent from SMU and ioremap it to virtual address.
+ */
+ dram_addr = msg.args[0] | ((u64)(msg.args[1]) << 32);
+ if (!dram_addr) {
+ dev_err(plat_dev.dev, "Invalid dram address for metric table\n");
+ return -ENOMEM;
+ }
+ sock->metric_tbl_addr = devm_ioremap(plat_dev.dev, dram_addr,
+ sizeof(struct hsmp_metric_table));
+ if (!sock->metric_tbl_addr) {
+ dev_err(plat_dev.dev, "Failed to ioremap metric table addr\n");
+ return -ENOMEM;
+ }
+ return 0;
+}
+
+static umode_t hsmp_is_sock_attr_visible(struct kobject *kobj,
+ struct bin_attribute *battr, int id)
+{
+ if (plat_dev.proto_ver == HSMP_PROTO_VER6)
+ return battr->attr.mode;
+ else
+ return 0;
+}
+
+static int hsmp_init_metric_tbl_bin_attr(struct bin_attribute **hattrs, u16 sock_ind)
+{
+ struct bin_attribute *hattr = &plat_dev.sock[sock_ind].hsmp_attr;
+
+ sysfs_bin_attr_init(hattr);
+ hattr->attr.name = HSMP_METRICS_TABLE_NAME;
+ hattr->attr.mode = 0444;
+ hattr->read = hsmp_metric_tbl_read;
+ hattr->size = sizeof(struct hsmp_metric_table);
+ hattr->private = &plat_dev.sock[sock_ind];
+ hattrs[0] = hattr;
+
+ if (plat_dev.proto_ver == HSMP_PROTO_VER6)
+ return (hsmp_get_tbl_dram_base(sock_ind));
+ else
+ return 0;
+}
+
+/* One bin sysfs for metrics table*/
+#define NUM_HSMP_ATTRS 1
+
+static int hsmp_create_sysfs_interface(void)
+{
+ const struct attribute_group **hsmp_attr_grps;
+ struct bin_attribute **hsmp_bin_attrs;
+ struct attribute_group *attr_grp;
+ int ret;
+ u8 i;
+
+ hsmp_attr_grps = devm_kzalloc(plat_dev.dev, sizeof(struct attribute_group *) *
+ (plat_dev.num_sockets + 1), GFP_KERNEL);
+ if (!hsmp_attr_grps)
+ return -ENOMEM;
+
+ /* Create a sysfs directory for each socket */
+ for (i = 0; i < plat_dev.num_sockets; i++) {
+ attr_grp = devm_kzalloc(plat_dev.dev, sizeof(struct attribute_group), GFP_KERNEL);
+ if (!attr_grp)
+ return -ENOMEM;
+
+ snprintf(plat_dev.sock[i].name, HSMP_ATTR_GRP_NAME_SIZE, "socket%u", i);
+ attr_grp->name = plat_dev.sock[i].name;
+
+ /* Null terminated list of attributes */
+ hsmp_bin_attrs = devm_kzalloc(plat_dev.dev, sizeof(struct bin_attribute *) *
+ (NUM_HSMP_ATTRS + 1), GFP_KERNEL);
+ if (!hsmp_bin_attrs)
+ return -ENOMEM;
+
+ attr_grp->bin_attrs = hsmp_bin_attrs;
+ attr_grp->is_bin_visible = hsmp_is_sock_attr_visible;
+ hsmp_attr_grps[i] = attr_grp;
+
+ /* Now create the leaf nodes */
+ ret = hsmp_init_metric_tbl_bin_attr(hsmp_bin_attrs, i);
+ if (ret)
+ return ret;
+ }
+ return devm_device_add_groups(plat_dev.dev, hsmp_attr_grps);
+}
+
+static int hsmp_cache_proto_ver(void)
+{
+ struct hsmp_message msg = { 0 };
+ int ret;
+
+ msg.msg_id = HSMP_GET_PROTO_VER;
+ msg.sock_ind = 0;
+ msg.response_sz = hsmp_msg_desc_table[HSMP_GET_PROTO_VER].response_sz;
+
+ ret = hsmp_send_message(&msg);
+ if (!ret)
+ plat_dev.proto_ver = msg.args[0];
+
+ return ret;
+}
+
static int hsmp_pltdrv_probe(struct platform_device *pdev)
{
- int i;
+ int ret, i;
plat_dev.sock = devm_kzalloc(&pdev->dev,
(plat_dev.num_sockets * sizeof(struct hsmp_socket)),
@@ -353,6 +509,16 @@ static int hsmp_pltdrv_probe(struct platform_device *pdev)
plat_dev.hsmp_device.nodename = HSMP_DEVNODE_NAME;
plat_dev.hsmp_device.mode = 0644;
+ ret = hsmp_cache_proto_ver();
+ if (ret) {
+ dev_err(plat_dev.dev, "Failed to read HSMP protocol version\n");
+ return ret;
+ }
+
+ ret = hsmp_create_sysfs_interface();
+ if (ret)
+ dev_err(plat_dev.dev, "Failed to create HSMP sysfs interface\n");
+
return misc_register(&plat_dev.hsmp_device);
}
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v4 3/3] platform/x86/amd/hsmp: improve the error log
2023-10-05 5:39 [PATCH v4 1/3] platform/x86/amd/hsmp: create plat specific struct Suma Hegde
2023-10-05 5:39 ` [PATCH v4 2/3] platform/x86/amd/hsmp: add support for metrics tbl Suma Hegde
@ 2023-10-05 5:39 ` Suma Hegde
1 sibling, 0 replies; 7+ messages in thread
From: Suma Hegde @ 2023-10-05 5:39 UTC (permalink / raw)
To: platform-driver-x86
Cc: ilpo.jarvinen, hdegoede, Suma Hegde, Naveen Krishna Chatradhi
1. Change print message during platform init to a more meaningful
clear message.
2. Return the error code returned by hsmp_test() itself, rather then
returning a common EOPNOTSUPP error.
Signed-off-by: Suma Hegde <suma.hegde@amd.com>
Reviewed-by: Naveen Krishna Chatradhi <nchatrad@amd.com>
---
changes since v3:
none
drivers/platform/x86/amd/hsmp.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/platform/x86/amd/hsmp.c b/drivers/platform/x86/amd/hsmp.c
index 5d8efff201d3..9a887243e5a4 100644
--- a/drivers/platform/x86/amd/hsmp.c
+++ b/drivers/platform/x86/amd/hsmp.c
@@ -560,10 +560,10 @@ static int __init hsmp_plt_init(void)
for (i = 0; i < plat_dev.num_sockets; i++) {
ret = hsmp_test(i, 0xDEADBEEF);
if (ret) {
- pr_err("HSMP is not supported on Fam:%x model:%x\n",
+ pr_err("HSMP test message failed on Fam:%x model:%x\n",
boot_cpu_data.x86, boot_cpu_data.x86_model);
- pr_err("Or Is HSMP disabled in BIOS ?\n");
- return -EOPNOTSUPP;
+ pr_err("Is HSMP disabled in BIOS ?\n");
+ return ret;
}
}
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v4 2/3] platform/x86/amd/hsmp: add support for metrics tbl
2023-10-05 5:39 ` [PATCH v4 2/3] platform/x86/amd/hsmp: add support for metrics tbl Suma Hegde
@ 2023-10-06 13:21 ` Ilpo Järvinen
2023-10-09 5:46 ` Hegde, Suma
0 siblings, 1 reply; 7+ messages in thread
From: Ilpo Järvinen @ 2023-10-06 13:21 UTC (permalink / raw)
To: Suma Hegde; +Cc: platform-driver-x86, Hans de Goede, Naveen Krishna Chatradhi
On Thu, 5 Oct 2023, Suma Hegde wrote:
> AMD MI300 MCM provides GET_METRICS_TABLE message to retrieve
> all the system management information from SMU.
>
> The metrics table is made available as hexadecimal sysfs binary file
> under per socket sysfs directory created at
> /sys/devices/platform/amd_hsmp/socket%d/metrics_bin
>
> Metrics table definitions will be documented as part of Public PPR.
> The same is defined in the amd_hsmp.h header.
>
> Signed-off-by: Suma Hegde <suma.hegde@amd.com>
> Reviewed-by: Naveen Krishna Chatradhi <nchatrad@amd.com>
> +static int hsmp_create_sysfs_interface(void)
> +{
> + const struct attribute_group **hsmp_attr_grps;
> + struct bin_attribute **hsmp_bin_attrs;
> + struct attribute_group *attr_grp;
> + int ret;
> + u8 i;
> +
> + hsmp_attr_grps = devm_kzalloc(plat_dev.dev, sizeof(struct attribute_group *) *
> + (plat_dev.num_sockets + 1), GFP_KERNEL);
> + if (!hsmp_attr_grps)
> + return -ENOMEM;
> +
> + /* Create a sysfs directory for each socket */
> + for (i = 0; i < plat_dev.num_sockets; i++) {
The change for i to u8 seems not very wise given num_sockets still is u16
as it can turn this into an infinite loop.
--
i.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 2/3] platform/x86/amd/hsmp: add support for metrics tbl
2023-10-06 13:21 ` Ilpo Järvinen
@ 2023-10-09 5:46 ` Hegde, Suma
2023-10-09 11:23 ` Ilpo Järvinen
0 siblings, 1 reply; 7+ messages in thread
From: Hegde, Suma @ 2023-10-09 5:46 UTC (permalink / raw)
To: Ilpo Järvinen
Cc: platform-driver-x86, Hans de Goede, Naveen Krishna Chatradhi
On 10/6/2023 6:51 PM, Ilpo Järvinen wrote:
> Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding.
>
>
> On Thu, 5 Oct 2023, Suma Hegde wrote:
>
>> AMD MI300 MCM provides GET_METRICS_TABLE message to retrieve
>> all the system management information from SMU.
>>
>> The metrics table is made available as hexadecimal sysfs binary file
>> under per socket sysfs directory created at
>> /sys/devices/platform/amd_hsmp/socket%d/metrics_bin
>>
>> Metrics table definitions will be documented as part of Public PPR.
>> The same is defined in the amd_hsmp.h header.
>>
>> Signed-off-by: Suma Hegde <suma.hegde@amd.com>
>> Reviewed-by: Naveen Krishna Chatradhi <nchatrad@amd.com>
>
>> +static int hsmp_create_sysfs_interface(void)
>> +{
>> + const struct attribute_group **hsmp_attr_grps;
>> + struct bin_attribute **hsmp_bin_attrs;
>> + struct attribute_group *attr_grp;
>> + int ret;
>> + u8 i;
>> +
>> + hsmp_attr_grps = devm_kzalloc(plat_dev.dev, sizeof(struct attribute_group *) *
>> + (plat_dev.num_sockets + 1), GFP_KERNEL);
>> + if (!hsmp_attr_grps)
>> + return -ENOMEM;
>> +
>> + /* Create a sysfs directory for each socket */
>> + for (i = 0; i < plat_dev.num_sockets; i++) {
> The change for i to u8 seems not very wise given num_sockets still is u16
> as it can turn this into an infinite loop.
Hi Ilpo,
amd_nb_num() API which we use to identify the number of sockets on a
node returns u16. So, we used u16 for plat_dev.num_sockets.
u8 should be enough, as present AMD processors support upto 8 sockets on
a node.
Coming to the warning raised:
We have defined, HSMP_ATTR_GRP_NAME_SIZE as 10bytes, 6 chars for
'socket', 3 chars for 3digits (socket index) and a null terminator.
Socket index may not need more than 3 digits in the foreseeable future.
How about, we declare i as u16 and typecast it as (u8) in the snprintf.
int ret;
- u8 i;
+ u16 i;
hsmp_attr_grps = devm_kzalloc(plat_dev.dev, sizeof(struct
attribute_group *) *
(plat_dev.num_sockets + 1),
GFP_KERNEL); @@ -449,7 +449,7 @@ static int
hsmp_create_sysfs_interface(void)
if (!attr_grp)
return -ENOMEM;
- snprintf(plat_dev.sock[i].name, HSMP_ATTR_GRP_NAME_SIZE,
"socket%u", i);
+ snprintf(plat_dev.sock[i].name, HSMP_ATTR_GRP_NAME_SIZE,
+ "socket%u", (u8)i);
attr_grp->name = plat_dev.sock[i].name;
Thanks and Regards,
Suma
>
> --
> i.
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 2/3] platform/x86/amd/hsmp: add support for metrics tbl
2023-10-09 5:46 ` Hegde, Suma
@ 2023-10-09 11:23 ` Ilpo Järvinen
2023-10-09 15:10 ` Hegde, Suma
0 siblings, 1 reply; 7+ messages in thread
From: Ilpo Järvinen @ 2023-10-09 11:23 UTC (permalink / raw)
To: Hegde, Suma; +Cc: platform-driver-x86, Hans de Goede, Naveen Krishna Chatradhi
[-- Attachment #1: Type: text/plain, Size: 3306 bytes --]
On Mon, 9 Oct 2023, Hegde, Suma wrote:
> On 10/6/2023 6:51 PM, Ilpo Järvinen wrote:
> > On Thu, 5 Oct 2023, Suma Hegde wrote:
> >
> > > AMD MI300 MCM provides GET_METRICS_TABLE message to retrieve
> > > all the system management information from SMU.
> > >
> > > The metrics table is made available as hexadecimal sysfs binary file
> > > under per socket sysfs directory created at
> > > /sys/devices/platform/amd_hsmp/socket%d/metrics_bin
> > >
> > > Metrics table definitions will be documented as part of Public PPR.
> > > The same is defined in the amd_hsmp.h header.
> > >
> > > Signed-off-by: Suma Hegde <suma.hegde@amd.com>
> > > Reviewed-by: Naveen Krishna Chatradhi <nchatrad@amd.com>
> >
> > > +static int hsmp_create_sysfs_interface(void)
> > > +{
> > > + const struct attribute_group **hsmp_attr_grps;
> > > + struct bin_attribute **hsmp_bin_attrs;
> > > + struct attribute_group *attr_grp;
> > > + int ret;
> > > + u8 i;
> > > +
> > > + hsmp_attr_grps = devm_kzalloc(plat_dev.dev, sizeof(struct
> > > attribute_group *) *
> > > + (plat_dev.num_sockets + 1),
> > > GFP_KERNEL);
> > > + if (!hsmp_attr_grps)
> > > + return -ENOMEM;
> > > +
> > > + /* Create a sysfs directory for each socket */
> > > + for (i = 0; i < plat_dev.num_sockets; i++) {
> > The change for i to u8 seems not very wise given num_sockets still is u16
> > as it can turn this into an infinite loop.
>
> Hi Ilpo,
>
> amd_nb_num() API which we use to identify the number of sockets on a node
> returns u16. So, we used u16 for plat_dev.num_sockets.
> u8 should be enough, as present AMD processors support upto 8 sockets on a
> node.
I wasn't expecting it to fail at the moment, I just don't want to leave a
silent trap for the future.
> Coming to the warning raised:
> We have defined, HSMP_ATTR_GRP_NAME_SIZE as 10bytes, 6 chars for 'socket', 3
> chars for 3digits (socket index) and a null terminator.
> Socket index may not need more than 3 digits in the foreseeable future. How
> about, we declare i as u16 and typecast it as (u8) in the snprintf.
>
> int ret;
> - u8 i;
> + u16 i;
>
> hsmp_attr_grps = devm_kzalloc(plat_dev.dev, sizeof(struct
> attribute_group *) *
> (plat_dev.num_sockets + 1), GFP_KERNEL); @@
> -449,7 +449,7 @@ static int hsmp_create_sysfs_interface(void)
> if (!attr_grp)
> return -ENOMEM;
>
> - snprintf(plat_dev.sock[i].name, HSMP_ATTR_GRP_NAME_SIZE, "socket%u",
> i);
> + snprintf(plat_dev.sock[i].name, HSMP_ATTR_GRP_NAME_SIZE,
> + "socket%u", (u8)i);
> attr_grp->name = plat_dev.sock[i].name;
This is similarly trappy as it truncates i if num_sockets is > 255.
I suggest you just put this into start of the function:
/* String formatting is currently limited to u8 sockets */
if (WARN_ON(plat_dev.num_sockets > U8_MAX))
return -ERANGE;
to catch the too many sockets case if it is ever going to occur.
And explain in the changelog that u8 is enough for foreseeable future
and the string formatting triggers a warning if unnecessarily large type
is passed to snprintf().
--
i.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 2/3] platform/x86/amd/hsmp: add support for metrics tbl
2023-10-09 11:23 ` Ilpo Järvinen
@ 2023-10-09 15:10 ` Hegde, Suma
0 siblings, 0 replies; 7+ messages in thread
From: Hegde, Suma @ 2023-10-09 15:10 UTC (permalink / raw)
To: Ilpo Järvinen
Cc: platform-driver-x86, Hans de Goede, Naveen Krishna Chatradhi
On 10/9/2023 4:53 PM, Ilpo Järvinen wrote:
> Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding.
>
>
> On Mon, 9 Oct 2023, Hegde, Suma wrote:
>> On 10/6/2023 6:51 PM, Ilpo Järvinen wrote:
>>> On Thu, 5 Oct 2023, Suma Hegde wrote:
>>>
>>>> AMD MI300 MCM provides GET_METRICS_TABLE message to retrieve
>>>> all the system management information from SMU.
>>>>
>>>> The metrics table is made available as hexadecimal sysfs binary file
>>>> under per socket sysfs directory created at
>>>> /sys/devices/platform/amd_hsmp/socket%d/metrics_bin
>>>>
>>>> Metrics table definitions will be documented as part of Public PPR.
>>>> The same is defined in the amd_hsmp.h header.
>>>>
>>>> Signed-off-by: Suma Hegde <suma.hegde@amd.com>
>>>> Reviewed-by: Naveen Krishna Chatradhi <nchatrad@amd.com>
>>>> +static int hsmp_create_sysfs_interface(void)
>>>> +{
>>>> + const struct attribute_group **hsmp_attr_grps;
>>>> + struct bin_attribute **hsmp_bin_attrs;
>>>> + struct attribute_group *attr_grp;
>>>> + int ret;
>>>> + u8 i;
>>>> +
>>>> + hsmp_attr_grps = devm_kzalloc(plat_dev.dev, sizeof(struct
>>>> attribute_group *) *
>>>> + (plat_dev.num_sockets + 1),
>>>> GFP_KERNEL);
>>>> + if (!hsmp_attr_grps)
>>>> + return -ENOMEM;
>>>> +
>>>> + /* Create a sysfs directory for each socket */
>>>> + for (i = 0; i < plat_dev.num_sockets; i++) {
>>> The change for i to u8 seems not very wise given num_sockets still is u16
>>> as it can turn this into an infinite loop.
>> Hi Ilpo,
>>
>> amd_nb_num() API which we use to identify the number of sockets on a node
>> returns u16. So, we used u16 for plat_dev.num_sockets.
>> u8 should be enough, as present AMD processors support upto 8 sockets on a
>> node.
> I wasn't expecting it to fail at the moment, I just don't want to leave a
> silent trap for the future.
>
>> Coming to the warning raised:
>> We have defined, HSMP_ATTR_GRP_NAME_SIZE as 10bytes, 6 chars for 'socket', 3
>> chars for 3digits (socket index) and a null terminator.
>> Socket index may not need more than 3 digits in the foreseeable future. How
>> about, we declare i as u16 and typecast it as (u8) in the snprintf.
>>
>> int ret;
>> - u8 i;
>> + u16 i;
>>
>> hsmp_attr_grps = devm_kzalloc(plat_dev.dev, sizeof(struct
>> attribute_group *) *
>> (plat_dev.num_sockets + 1), GFP_KERNEL); @@
>> -449,7 +449,7 @@ static int hsmp_create_sysfs_interface(void)
>> if (!attr_grp)
>> return -ENOMEM;
>>
>> - snprintf(plat_dev.sock[i].name, HSMP_ATTR_GRP_NAME_SIZE, "socket%u",
>> i);
>> + snprintf(plat_dev.sock[i].name, HSMP_ATTR_GRP_NAME_SIZE,
>> + "socket%u", (u8)i);
>> attr_grp->name = plat_dev.sock[i].name;
> This is similarly trappy as it truncates i if num_sockets is > 255.
>
> I suggest you just put this into start of the function:
>
> /* String formatting is currently limited to u8 sockets */
> if (WARN_ON(plat_dev.num_sockets > U8_MAX))
> return -ERANGE;
>
> to catch the too many sockets case if it is ever going to occur.
> And explain in the changelog that u8 is enough for foreseeable future
> and the string formatting triggers a warning if unnecessarily large type
> is passed to snprintf().
Ok Ilpo, I will add this WARN_ON and send v5 patch set.
>
> --
> i.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2023-10-09 15:10 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-05 5:39 [PATCH v4 1/3] platform/x86/amd/hsmp: create plat specific struct Suma Hegde
2023-10-05 5:39 ` [PATCH v4 2/3] platform/x86/amd/hsmp: add support for metrics tbl Suma Hegde
2023-10-06 13:21 ` Ilpo Järvinen
2023-10-09 5:46 ` Hegde, Suma
2023-10-09 11:23 ` Ilpo Järvinen
2023-10-09 15:10 ` Hegde, Suma
2023-10-05 5:39 ` [PATCH v4 3/3] platform/x86/amd/hsmp: improve the error log Suma Hegde
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.