mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-18 06:15:12 +00:00
cxl/mem: Convert partition-info to resources
To date the per-device-partition DPA range information has only been used for enumeration purposes. In preparation for allocating regions from available DPA capacity, convert those ranges into DPA-type resource trees. With resources and the new add_dpa_res() helper some open coded end address calculations and debug prints can be cleaned. The 'cxlds->pmem_res' and 'cxlds->ram_res' resources are child resources of the total-device DPA space and they in turn will host DPA allocations from cxl_endpoint_decoder instances (tracked by cxled->dpa_res). Cc: Ira Weiny <ira.weiny@intel.com> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Link: https://lore.kernel.org/r/165603878921.551046.8127845916514734142.stgit@dwillia2-xfh Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
419af595b1
commit
d3b75029f3
@ -773,15 +773,6 @@ int cxl_dev_state_identify(struct cxl_dev_state *cxlds)
|
||||
cxlds->partition_align_bytes =
|
||||
le64_to_cpu(id.partition_align) * CXL_CAPACITY_MULTIPLIER;
|
||||
|
||||
dev_dbg(cxlds->dev,
|
||||
"Identify Memory Device\n"
|
||||
" total_bytes = %#llx\n"
|
||||
" volatile_only_bytes = %#llx\n"
|
||||
" persistent_only_bytes = %#llx\n"
|
||||
" partition_align_bytes = %#llx\n",
|
||||
cxlds->total_bytes, cxlds->volatile_only_bytes,
|
||||
cxlds->persistent_only_bytes, cxlds->partition_align_bytes);
|
||||
|
||||
cxlds->lsa_size = le32_to_cpu(id.lsa_size);
|
||||
memcpy(cxlds->firmware_version, id.fw_revision, sizeof(id.fw_revision));
|
||||
|
||||
@ -789,42 +780,63 @@ int cxl_dev_state_identify(struct cxl_dev_state *cxlds)
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(cxl_dev_state_identify, CXL);
|
||||
|
||||
int cxl_mem_create_range_info(struct cxl_dev_state *cxlds)
|
||||
static int add_dpa_res(struct device *dev, struct resource *parent,
|
||||
struct resource *res, resource_size_t start,
|
||||
resource_size_t size, const char *type)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (cxlds->partition_align_bytes == 0) {
|
||||
cxlds->ram_range.start = 0;
|
||||
cxlds->ram_range.end = cxlds->volatile_only_bytes - 1;
|
||||
cxlds->pmem_range.start = cxlds->volatile_only_bytes;
|
||||
cxlds->pmem_range.end = cxlds->volatile_only_bytes +
|
||||
cxlds->persistent_only_bytes - 1;
|
||||
res->name = type;
|
||||
res->start = start;
|
||||
res->end = start + size - 1;
|
||||
res->flags = IORESOURCE_MEM;
|
||||
if (resource_size(res) == 0) {
|
||||
dev_dbg(dev, "DPA(%s): no capacity\n", res->name);
|
||||
return 0;
|
||||
}
|
||||
rc = request_resource(parent, res);
|
||||
if (rc) {
|
||||
dev_err(dev, "DPA(%s): failed to track %pr (%d)\n", res->name,
|
||||
res, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
dev_dbg(dev, "DPA(%s): %pr\n", res->name, res);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cxl_mem_create_range_info(struct cxl_dev_state *cxlds)
|
||||
{
|
||||
struct device *dev = cxlds->dev;
|
||||
int rc;
|
||||
|
||||
cxlds->dpa_res =
|
||||
(struct resource)DEFINE_RES_MEM(0, cxlds->total_bytes);
|
||||
|
||||
if (cxlds->partition_align_bytes == 0) {
|
||||
rc = add_dpa_res(dev, &cxlds->dpa_res, &cxlds->ram_res, 0,
|
||||
cxlds->volatile_only_bytes, "ram");
|
||||
if (rc)
|
||||
return rc;
|
||||
return add_dpa_res(dev, &cxlds->dpa_res, &cxlds->pmem_res,
|
||||
cxlds->volatile_only_bytes,
|
||||
cxlds->persistent_only_bytes, "pmem");
|
||||
}
|
||||
|
||||
rc = cxl_mem_get_partition_info(cxlds);
|
||||
if (rc) {
|
||||
dev_err(cxlds->dev, "Failed to query partition information\n");
|
||||
dev_err(dev, "Failed to query partition information\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
dev_dbg(cxlds->dev,
|
||||
"Get Partition Info\n"
|
||||
" active_volatile_bytes = %#llx\n"
|
||||
" active_persistent_bytes = %#llx\n"
|
||||
" next_volatile_bytes = %#llx\n"
|
||||
" next_persistent_bytes = %#llx\n",
|
||||
cxlds->active_volatile_bytes, cxlds->active_persistent_bytes,
|
||||
cxlds->next_volatile_bytes, cxlds->next_persistent_bytes);
|
||||
|
||||
cxlds->ram_range.start = 0;
|
||||
cxlds->ram_range.end = cxlds->active_volatile_bytes - 1;
|
||||
|
||||
cxlds->pmem_range.start = cxlds->active_volatile_bytes;
|
||||
cxlds->pmem_range.end =
|
||||
cxlds->active_volatile_bytes + cxlds->active_persistent_bytes - 1;
|
||||
|
||||
return 0;
|
||||
rc = add_dpa_res(dev, &cxlds->dpa_res, &cxlds->ram_res, 0,
|
||||
cxlds->active_volatile_bytes, "ram");
|
||||
if (rc)
|
||||
return rc;
|
||||
return add_dpa_res(dev, &cxlds->dpa_res, &cxlds->pmem_res,
|
||||
cxlds->active_volatile_bytes,
|
||||
cxlds->active_persistent_bytes, "pmem");
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(cxl_mem_create_range_info, CXL);
|
||||
|
||||
|
@ -68,7 +68,7 @@ static ssize_t ram_size_show(struct device *dev, struct device_attribute *attr,
|
||||
{
|
||||
struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
|
||||
struct cxl_dev_state *cxlds = cxlmd->cxlds;
|
||||
unsigned long long len = range_len(&cxlds->ram_range);
|
||||
unsigned long long len = resource_size(&cxlds->ram_res);
|
||||
|
||||
return sysfs_emit(buf, "%#llx\n", len);
|
||||
}
|
||||
@ -81,7 +81,7 @@ static ssize_t pmem_size_show(struct device *dev, struct device_attribute *attr,
|
||||
{
|
||||
struct cxl_memdev *cxlmd = to_cxl_memdev(dev);
|
||||
struct cxl_dev_state *cxlds = cxlmd->cxlds;
|
||||
unsigned long long len = range_len(&cxlds->pmem_range);
|
||||
unsigned long long len = resource_size(&cxlds->pmem_res);
|
||||
|
||||
return sysfs_emit(buf, "%#llx\n", len);
|
||||
}
|
||||
|
@ -178,8 +178,9 @@ struct cxl_endpoint_dvsec_info {
|
||||
* @firmware_version: Firmware version for the memory device.
|
||||
* @enabled_cmds: Hardware commands found enabled in CEL.
|
||||
* @exclusive_cmds: Commands that are kernel-internal only
|
||||
* @pmem_range: Active Persistent memory capacity configuration
|
||||
* @ram_range: Active Volatile memory capacity configuration
|
||||
* @dpa_res: Overall DPA resource tree for the device
|
||||
* @pmem_res: Active Persistent memory capacity configuration
|
||||
* @ram_res: Active Volatile memory capacity configuration
|
||||
* @total_bytes: sum of all possible capacities
|
||||
* @volatile_only_bytes: hard volatile capacity
|
||||
* @persistent_only_bytes: hard persistent capacity
|
||||
@ -209,8 +210,9 @@ struct cxl_dev_state {
|
||||
DECLARE_BITMAP(enabled_cmds, CXL_MEM_COMMAND_ID_MAX);
|
||||
DECLARE_BITMAP(exclusive_cmds, CXL_MEM_COMMAND_ID_MAX);
|
||||
|
||||
struct range pmem_range;
|
||||
struct range ram_range;
|
||||
struct resource dpa_res;
|
||||
struct resource pmem_res;
|
||||
struct resource ram_res;
|
||||
u64 total_bytes;
|
||||
u64 volatile_only_bytes;
|
||||
u64 persistent_only_bytes;
|
||||
|
@ -454,7 +454,7 @@ static int cxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
if (IS_ERR(cxlmd))
|
||||
return PTR_ERR(cxlmd);
|
||||
|
||||
if (range_len(&cxlds->pmem_range) && IS_ENABLED(CONFIG_CXL_PMEM))
|
||||
if (resource_size(&cxlds->pmem_res) && IS_ENABLED(CONFIG_CXL_PMEM))
|
||||
rc = devm_cxl_add_nvdimm(&pdev->dev, cxlmd);
|
||||
|
||||
return rc;
|
||||
|
@ -282,7 +282,7 @@ static int cxl_mock_mem_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(cxlmd))
|
||||
return PTR_ERR(cxlmd);
|
||||
|
||||
if (range_len(&cxlds->pmem_range) && IS_ENABLED(CONFIG_CXL_PMEM))
|
||||
if (resource_size(&cxlds->pmem_res) && IS_ENABLED(CONFIG_CXL_PMEM))
|
||||
rc = devm_cxl_add_nvdimm(dev, cxlmd);
|
||||
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user