]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
cxl/test: Add Get Feature support to cxl_test
authorDave Jiang <dave.jiang@intel.com>
Fri, 7 Mar 2025 20:55:36 +0000 (13:55 -0700)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 17 Mar 2025 17:41:37 +0000 (14:41 -0300)
Add emulation of Get Feature command to cxl_test. The feature for
device patrol scrub is returned by the emulation code. This is
the only feature currently supported by cxl_test. It returns
the information for the device patrol scrub feature.

Link: https://patch.msgid.link/r/20250307205648.1021626-7-dave.jiang@intel.com
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Reviewed-by: Li Ming <ming.li@zohomail.com>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
tools/testing/cxl/test/mem.c

index 848db399102c10223eecee8ac8cf901df2e5dd3b..af70932c9bb04a1e490f9848d379f249c6997648 100644 (file)
@@ -48,6 +48,10 @@ static struct cxl_cel_entry mock_cel[] = {
                .opcode = cpu_to_le16(CXL_MBOX_OP_GET_SUPPORTED_FEATURES),
                .effect = CXL_CMD_EFFECT_NONE,
        },
+       {
+               .opcode = cpu_to_le16(CXL_MBOX_OP_GET_FEATURE),
+               .effect = CXL_CMD_EFFECT_NONE,
+       },
        {
                .opcode = cpu_to_le16(CXL_MBOX_OP_IDENTIFY),
                .effect = CXL_CMD_EFFECT_NONE,
@@ -149,6 +153,10 @@ struct mock_event_store {
        u32 ev_status;
 };
 
+struct vendor_test_feat {
+       __le32 data;
+} __packed;
+
 struct cxl_mockmem_data {
        void *lsa;
        void *fw;
@@ -165,6 +173,7 @@ struct cxl_mockmem_data {
        u8 event_buf[SZ_4K];
        u64 timestamp;
        unsigned long sanitize_timeout;
+       struct vendor_test_feat test_feat;
 };
 
 static struct mock_event_log *event_find_log(struct device *dev, int log_type)
@@ -1379,6 +1388,44 @@ static void fill_feature_vendor_test(struct cxl_feat_entry *feat)
 
 #define MAX_CXL_TEST_FEATS     1
 
+static int mock_get_test_feature(struct cxl_mockmem_data *mdata,
+                                struct cxl_mbox_cmd *cmd)
+{
+       struct vendor_test_feat *output = cmd->payload_out;
+       struct cxl_mbox_get_feat_in *input = cmd->payload_in;
+       u16 offset = le16_to_cpu(input->offset);
+       u16 count = le16_to_cpu(input->count);
+       u8 *ptr;
+
+       if (offset > sizeof(*output)) {
+               cmd->return_code = CXL_MBOX_CMD_RC_INPUT;
+               return -EINVAL;
+       }
+
+       if (offset + count > sizeof(*output)) {
+               cmd->return_code = CXL_MBOX_CMD_RC_INPUT;
+               return -EINVAL;
+       }
+
+       ptr = (u8 *)&mdata->test_feat + offset;
+       memcpy((u8 *)output + offset, ptr, count);
+
+       return 0;
+}
+
+static int mock_get_feature(struct cxl_mockmem_data *mdata,
+                           struct cxl_mbox_cmd *cmd)
+{
+       struct cxl_mbox_get_feat_in *input = cmd->payload_in;
+
+       if (uuid_equal(&input->uuid, &CXL_VENDOR_FEATURE_TEST))
+               return mock_get_test_feature(mdata, cmd);
+
+       cmd->return_code = CXL_MBOX_CMD_RC_UNSUPPORTED;
+
+       return -EOPNOTSUPP;
+}
+
 static int mock_get_supported_features(struct cxl_mockmem_data *mdata,
                                       struct cxl_mbox_cmd *cmd)
 {
@@ -1509,6 +1556,9 @@ static int cxl_mock_mbox_send(struct cxl_mailbox *cxl_mbox,
        case CXL_MBOX_OP_GET_SUPPORTED_FEATURES:
                rc = mock_get_supported_features(mdata, cmd);
                break;
+       case CXL_MBOX_OP_GET_FEATURE:
+               rc = mock_get_feature(mdata, cmd);
+               break;
        default:
                break;
        }
@@ -1556,6 +1606,11 @@ static int cxl_mock_mailbox_create(struct cxl_dev_state *cxlds)
        return 0;
 }
 
+static void cxl_mock_test_feat_init(struct cxl_mockmem_data *mdata)
+{
+       mdata->test_feat.data = cpu_to_le32(0xdeadbeef);
+}
+
 static int cxl_mock_mem_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
@@ -1651,6 +1706,7 @@ static int cxl_mock_mem_probe(struct platform_device *pdev)
                dev_dbg(dev, "No CXL FWCTL setup\n");
 
        cxl_mem_get_event_records(mds, CXLDEV_EVENT_STATUS_ALL);
+       cxl_mock_test_feat_init(mdata);
 
        return 0;
 }