@@ -486,7 +486,7 @@ struct json_object *util_cxl_memdev_to_json(struct cxl_memdev *memdev,
const char *devname = cxl_memdev_get_devname(memdev);
struct json_object *jdev, *jobj;
unsigned long long serial, size;
- int numa_node;
+ int numa_node, qtg_id;
jdev = json_object_new_object();
if (!jdev)
@@ -501,6 +501,11 @@ struct json_object *util_cxl_memdev_to_json(struct cxl_memdev *memdev,
jobj = util_json_object_size(size, flags);
if (jobj)
json_object_object_add(jdev, "pmem_size", jobj);
+
+ qtg_id = cxl_memdev_get_pmem_qtg_id(memdev);
+ jobj = json_object_new_int(qtg_id);
+ if (jobj)
+ json_object_object_add(jdev, "qtg_id", jobj);
}
size = cxl_memdev_get_ram_size(memdev);
@@ -508,6 +513,11 @@ struct json_object *util_cxl_memdev_to_json(struct cxl_memdev *memdev,
jobj = util_json_object_size(size, flags);
if (jobj)
json_object_object_add(jdev, "ram_size", jobj);
+
+ qtg_id = cxl_memdev_get_ram_qtg_id(memdev);
+ jobj = json_object_new_int(qtg_id);
+ if (jobj)
+ json_object_object_add(jdev, "qtg_id", jobj);
}
if (flags & UTIL_JSON_HEALTH) {
@@ -1210,6 +1210,16 @@ static void *add_cxl_memdev(void *parent, int id, const char *cxlmem_base)
goto err_read;
memdev->ram_size = strtoull(buf, NULL, 0);
+ sprintf(path, "%s/pmem/qtg_id", cxlmem_base);
+ if (sysfs_read_attr(ctx, path, buf) < 0)
+ goto err_read;
+ memdev->pmem_qtg_id = atoi(buf);
+
+ sprintf(path, "%s/ram/qtg_id", cxlmem_base);
+ if (sysfs_read_attr(ctx, path, buf) < 0)
+ goto err_read;
+ memdev->ram_qtg_id = atoi(buf);
+
sprintf(path, "%s/payload_max", cxlmem_base);
if (sysfs_read_attr(ctx, path, buf) < 0)
goto err_read;
@@ -1368,6 +1378,16 @@ CXL_EXPORT unsigned long long cxl_memdev_get_ram_size(struct cxl_memdev *memdev)
return memdev->ram_size;
}
+CXL_EXPORT int cxl_memdev_get_pmem_qtg_id(struct cxl_memdev *memdev)
+{
+ return memdev->pmem_qtg_id;
+}
+
+CXL_EXPORT int cxl_memdev_get_ram_qtg_id(struct cxl_memdev *memdev)
+{
+ return memdev->ram_qtg_id;
+}
+
CXL_EXPORT const char *cxl_memdev_get_firmware_verison(struct cxl_memdev *memdev)
{
return memdev->firmware_version;
@@ -249,4 +249,6 @@ global:
cxl_decoder_create_ram_region;
cxl_region_get_daxctl_region;
cxl_decoder_get_qtg_id;
+ cxl_memdev_get_pmem_qtg_id;
+ cxl_memdev_get_ram_qtg_id;
} LIBCXL_4;
@@ -32,6 +32,8 @@ struct cxl_memdev {
struct list_node list;
unsigned long long pmem_size;
unsigned long long ram_size;
+ int pmem_qtg_id;
+ int ram_qtg_id;
int payload_max;
size_t lsa_size;
struct kmod_module *module;
@@ -47,6 +47,8 @@ int cxl_memdev_get_minor(struct cxl_memdev *memdev);
struct cxl_ctx *cxl_memdev_get_ctx(struct cxl_memdev *memdev);
unsigned long long cxl_memdev_get_pmem_size(struct cxl_memdev *memdev);
unsigned long long cxl_memdev_get_ram_size(struct cxl_memdev *memdev);
+int cxl_memdev_get_pmem_qtg_id(struct cxl_memdev *memdev);
+int cxl_memdev_get_ram_qtg_id(struct cxl_memdev *memdev);
const char *cxl_memdev_get_firmware_verison(struct cxl_memdev *memdev);
/* ABI spelling mistakes are forever */
Add libcxl API to retrieve the QoS Throttling Group (QTG) ID for the memory devices. Two API calls are added. One for 'ram' or 'volatile' mode and another for 'pmem' or 'persistent' mode. Support also added for displaying the QTG ID through the 'cxl list' command. Signed-off-by: Dave Jiang <dave.jiang@intel.com> --- cxl/json.c | 12 +++++++++++- cxl/lib/libcxl.c | 20 ++++++++++++++++++++ cxl/lib/libcxl.sym | 2 ++ cxl/lib/private.h | 2 ++ cxl/libcxl.h | 2 ++ 5 files changed, 37 insertions(+), 1 deletion(-)