mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-16 15:39:42 -04:00
cxl/test: Add Get Feature support to cxl_test
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>
This commit is contained in:
committed by
Jason Gunthorpe
parent
eb5dfcb9e3
commit
e77e9c1079
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user