Commit e7ad1bf6 authored by Dan Williams's avatar Dan Williams
Browse files

tools/testing/cxl: Add partition support



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: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://lore.kernel.org/r/165603887411.551046.13234212587991192347.stgit@dwillia2-xfh


Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 855c90d3
Loading
Loading
Loading
Loading
+1 −6
Original line number Diff line number Diff line
@@ -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,
+7 −0
Original line number Diff line number Diff line
@@ -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;
+1 −39
Original line number Diff line number Diff line
@@ -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;
+27 −24
Original line number Diff line number Diff line
@@ -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[] = {
@@ -25,6 +26,10 @@ static struct cxl_cel_entry mock_cel[] = {
		.opcode = cpu_to_le16(CXL_MBOX_OP_GET_LSA),
		.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;

		if (le64_to_cpu(id.partition_align))
			continue;
	memcpy(cmd->payload_out, &id, sizeof(id));

		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);
	return 0;
}

	id.total_capacity = cpu_to_le64(capacity);
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),
	};

	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;