Skip to content

Commit

Permalink
cxl/pci: Store memory capacity values
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ira Weiny authored and Dan Williams committed Aug 7, 2021
1 parent 5b68705 commit 0b9159d
Showing 2 changed files with 37 additions and 3 deletions.
4 changes: 4 additions & 0 deletions drivers/cxl/cxlmem.h
Original file line number Diff line number Diff line change
@@ -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__ */
36 changes: 33 additions & 3 deletions drivers/cxl/pci.c
Original file line number Diff line number Diff line change
@@ -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));

0 comments on commit 0b9159d

Please sign in to comment.