Commit 0b9159d0 authored by Ira Weiny's avatar Ira Weiny Committed by Dan Williams
Browse files

cxl/pci: Store memory capacity values



The Identify Memory Device command returns information about the
volatile only and persistent only memory capacities.  Store those values
in the cxl_mem structure for later use.  While at it, reuse those
calculations to calculate the ram and pmem ranges.

Signed-off-by: default avatarIra Weiny <ira.weiny@intel.com>
Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://lore.kernel.org/r/20210617221620.1904031-2-ira.weiny@intel.com


Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 5b68705d
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -95,5 +95,9 @@ struct cxl_mem {

	struct range pmem_range;
	struct range ram_range;
	u64 total_bytes;
	u64 volatile_only_bytes;
	u64 persistent_only_bytes;
	u64 partition_align_bytes;
};
#endif /* __CXL_MEM_H__ */
+33 −3
Original line number Diff line number Diff line
@@ -64,6 +64,15 @@ enum opcode {
	CXL_MBOX_OP_MAX			= 0x10000
};

/*
 * CXL 2.0 - Memory capacity multiplier
 * See Section 8.2.9.5
 *
 * Volatile, Persistent, and Partition capacities are specified to be in
 * multiples of 256MB - define a multiplier to convert to/from bytes.
 */
#define CXL_CAPACITY_MULTIPLIER SZ_256M

/**
 * struct mbox_cmd - A command to be submitted to hardware.
 * @opcode: (input) The command set and command submitted to hardware.
@@ -1350,16 +1359,37 @@ static int cxl_mem_identify(struct cxl_mem *cxlm)
	if (rc < 0)
		return rc;

	cxlm->total_bytes = le64_to_cpu(id.total_capacity);
	cxlm->total_bytes *= CXL_CAPACITY_MULTIPLIER;

	cxlm->volatile_only_bytes = le64_to_cpu(id.volatile_capacity);
	cxlm->volatile_only_bytes *= CXL_CAPACITY_MULTIPLIER;

	cxlm->persistent_only_bytes = le64_to_cpu(id.persistent_capacity);
	cxlm->persistent_only_bytes *= CXL_CAPACITY_MULTIPLIER;

	cxlm->partition_align_bytes = le64_to_cpu(id.partition_align);
	cxlm->partition_align_bytes *= CXL_CAPACITY_MULTIPLIER;

	dev_dbg(&cxlm->pdev->dev, "Identify Memory Device\n"
		"     total_bytes = %#llx\n"
		"     volatile_only_bytes = %#llx\n"
		"     persistent_only_bytes = %#llx\n"
		"     partition_align_bytes = %#llx\n",
			cxlm->total_bytes,
			cxlm->volatile_only_bytes,
			cxlm->persistent_only_bytes,
			cxlm->partition_align_bytes);

	/*
	 * TODO: enumerate DPA map, as 'ram' and 'pmem' do not alias.
	 * For now, only the capacity is exported in sysfs
	 */
	cxlm->ram_range.start = 0;
	cxlm->ram_range.end = le64_to_cpu(id.volatile_capacity) * SZ_256M - 1;
	cxlm->ram_range.end = cxlm->volatile_only_bytes - 1;

	cxlm->pmem_range.start = 0;
	cxlm->pmem_range.end =
		le64_to_cpu(id.persistent_capacity) * SZ_256M - 1;
	cxlm->pmem_range.end = cxlm->persistent_only_bytes - 1;

	cxlm->lsa_size = le32_to_cpu(id.lsa_size);
	memcpy(cxlm->firmware_version, id.fw_revision, sizeof(id.fw_revision));