Commit e77e9c10 authored by Dave Jiang's avatar Dave Jiang Committed by Jason Gunthorpe
Browse files

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: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: default avatarDan Williams <dan.j.williams@intel.com>
Reviewed-by: default avatarLi Ming <ming.li@zohomail.com>
Signed-off-by: default avatarDave Jiang <dave.jiang@intel.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent eb5dfcb9
Loading
Loading
Loading
Loading
+56 −0
Original line number Diff line number Diff line
@@ -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;
}