tools/testing/cxl: Add partition support
authorDan Williams <dan.j.williams@intel.com>
Tue, 24 May 2022 06:26:11 +0000 (23:26 -0700)
committerDan Williams <dan.j.williams@intel.com>
Sun, 10 Jul 2022 17:29:26 +0000 (10:29 -0700)
In support of testing DPA allocation mechanisms in the CXL core, the
cxl_test environment needs to support establishing and retrieving the
'pmem partition boundary.

Replace the platform_device_add_resources() method for delineating DPA
within an endpoint with an emulated DEV_SIZE amount of partitionable
capacity. Set DEV_SIZE such that an endpoint has enough capacity to
simultaneously participate in 8 distinct regions.

Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://lore.kernel.org/r/165603887411.551046.13234212587991192347.stgit@dwillia2-xfh
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/cxl/core/mbox.c
drivers/cxl/cxlmem.h
tools/testing/cxl/test/cxl.c
tools/testing/cxl/test/mem.c

index 32a7509..16176b9 100644 (file)
@@ -718,12 +718,7 @@ EXPORT_SYMBOL_NS_GPL(cxl_enumerate_cmds, CXL);
  */
 static int cxl_mem_get_partition_info(struct cxl_dev_state *cxlds)
 {
-       struct cxl_mbox_get_partition_info {
-               __le64 active_volatile_cap;
-               __le64 active_persistent_cap;
-               __le64 next_volatile_cap;
-               __le64 next_persistent_cap;
-       } __packed pi;
+       struct cxl_mbox_get_partition_info pi;
        int rc;
 
        rc = cxl_mbox_send_cmd(cxlds, CXL_MBOX_OP_GET_PARTITION_INFO, NULL, 0,
index 4fa8f93..c6d6f57 100644 (file)
@@ -301,6 +301,13 @@ struct cxl_mbox_identify {
        u8 qos_telemetry_caps;
 } __packed;
 
+struct cxl_mbox_get_partition_info {
+       __le64 active_volatile_cap;
+       __le64 active_persistent_cap;
+       __le64 next_volatile_cap;
+       __le64 next_persistent_cap;
+} __packed;
+
 struct cxl_mbox_get_lsa {
        __le32 offset;
        __le32 length;
index b38a348..9144427 100644 (file)
@@ -569,44 +569,6 @@ static void mock_companion(struct acpi_device *adev, struct device *dev)
 #define SZ_512G (SZ_64G * 8)
 #endif
 
-static struct platform_device *alloc_memdev(int id)
-{
-       struct resource res[] = {
-               [0] = {
-                       .flags = IORESOURCE_MEM,
-               },
-               [1] = {
-                       .flags = IORESOURCE_MEM,
-                       .desc = IORES_DESC_PERSISTENT_MEMORY,
-               },
-       };
-       struct platform_device *pdev;
-       int i, rc;
-
-       for (i = 0; i < ARRAY_SIZE(res); i++) {
-               struct cxl_mock_res *r = alloc_mock_res(SZ_256M);
-
-               if (!r)
-                       return NULL;
-               res[i].start = r->range.start;
-               res[i].end = r->range.end;
-       }
-
-       pdev = platform_device_alloc("cxl_mem", id);
-       if (!pdev)
-               return NULL;
-
-       rc = platform_device_add_resources(pdev, res, ARRAY_SIZE(res));
-       if (rc)
-               goto err;
-
-       return pdev;
-
-err:
-       platform_device_put(pdev);
-       return NULL;
-}
-
 static __init int cxl_test_init(void)
 {
        int rc, i;
@@ -709,7 +671,7 @@ static __init int cxl_test_init(void)
                struct platform_device *dport = cxl_switch_dport[i];
                struct platform_device *pdev;
 
-               pdev = alloc_memdev(i);
+               pdev = platform_device_alloc("cxl_mem", i);
                if (!pdev)
                        goto err_mem;
                pdev->dev.parent = &dport->dev;
index b81c907..aa2df3a 100644 (file)
@@ -10,6 +10,7 @@
 #include <cxlmem.h>
 
 #define LSA_SIZE SZ_128K
+#define DEV_SIZE SZ_2G
 #define EFFECT(x) (1U << x)
 
 static struct cxl_cel_entry mock_cel[] = {
@@ -26,6 +27,10 @@ static struct cxl_cel_entry mock_cel[] = {
                .effect = cpu_to_le16(0),
        },
        {
+               .opcode = cpu_to_le16(CXL_MBOX_OP_GET_PARTITION_INFO),
+               .effect = cpu_to_le16(0),
+       },
+       {
                .opcode = cpu_to_le16(CXL_MBOX_OP_SET_LSA),
                .effect = cpu_to_le16(EFFECT(1) | EFFECT(2)),
        },
@@ -97,42 +102,37 @@ static int mock_get_log(struct cxl_dev_state *cxlds, struct cxl_mbox_cmd *cmd)
 
 static int mock_id(struct cxl_dev_state *cxlds, struct cxl_mbox_cmd *cmd)
 {
-       struct platform_device *pdev = to_platform_device(cxlds->dev);
        struct cxl_mbox_identify id = {
                .fw_revision = { "mock fw v1 " },
                .lsa_size = cpu_to_le32(LSA_SIZE),
-               /* FIXME: Add partition support */
-               .partition_align = cpu_to_le64(0),
+               .partition_align =
+                       cpu_to_le64(SZ_256M / CXL_CAPACITY_MULTIPLIER),
+               .total_capacity =
+                       cpu_to_le64(DEV_SIZE / CXL_CAPACITY_MULTIPLIER),
        };
-       u64 capacity = 0;
-       int i;
 
        if (cmd->size_out < sizeof(id))
                return -EINVAL;
 
-       for (i = 0; i < 2; i++) {
-               struct resource *res;
-
-               res = platform_get_resource(pdev, IORESOURCE_MEM, i);
-               if (!res)
-                       break;
-
-               capacity += resource_size(res) / CXL_CAPACITY_MULTIPLIER;
+       memcpy(cmd->payload_out, &id, sizeof(id));
 
-               if (le64_to_cpu(id.partition_align))
-                       continue;
+       return 0;
+}
 
-               if (res->desc == IORES_DESC_PERSISTENT_MEMORY)
-                       id.persistent_capacity = cpu_to_le64(
-                               resource_size(res) / CXL_CAPACITY_MULTIPLIER);
-               else
-                       id.volatile_capacity = cpu_to_le64(
-                               resource_size(res) / CXL_CAPACITY_MULTIPLIER);
-       }
+static int mock_partition_info(struct cxl_dev_state *cxlds,
+                              struct cxl_mbox_cmd *cmd)
+{
+       struct cxl_mbox_get_partition_info pi = {
+               .active_volatile_cap =
+                       cpu_to_le64(DEV_SIZE / 2 / CXL_CAPACITY_MULTIPLIER),
+               .active_persistent_cap =
+                       cpu_to_le64(DEV_SIZE / 2 / CXL_CAPACITY_MULTIPLIER),
+       };
 
-       id.total_capacity = cpu_to_le64(capacity);
+       if (cmd->size_out < sizeof(pi))
+               return -EINVAL;
 
-       memcpy(cmd->payload_out, &id, sizeof(id));
+       memcpy(cmd->payload_out, &pi, sizeof(pi));
 
        return 0;
 }
@@ -221,6 +221,9 @@ static int cxl_mock_mbox_send(struct cxl_dev_state *cxlds, struct cxl_mbox_cmd *
        case CXL_MBOX_OP_GET_LSA:
                rc = mock_get_lsa(cxlds, cmd);
                break;
+       case CXL_MBOX_OP_GET_PARTITION_INFO:
+               rc = mock_partition_info(cxlds, cmd);
+               break;
        case CXL_MBOX_OP_SET_LSA:
                rc = mock_set_lsa(cxlds, cmd);
                break;