forked from Minki/linux
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: Ira Weiny <ira.weiny@intel.com> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Link: https://lore.kernel.org/r/20210617221620.1904031-2-ira.weiny@intel.com Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
5b68705d1e
commit
0b9159d0ff
@ -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__ */
|
||||
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user