[PATCH v2 5/9] cxl/pci: Make more use of cxl_register_map
Ben Widawsky
ben.widawsky at intel.com
Fri Sep 24 03:26:43 AEST 2021
The structure exists to pass around information about register mapping.
Using it more extensively cleans up many existing functions.
Signed-off-by: Ben Widawsky <ben.widawsky at intel.com>
---
drivers/cxl/cxl.h | 1 +
drivers/cxl/pci.c | 36 +++++++++++++++++-------------------
2 files changed, 18 insertions(+), 19 deletions(-)
diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
index 7d6b011dd963..3b128ce71564 100644
--- a/drivers/cxl/cxl.h
+++ b/drivers/cxl/cxl.h
@@ -140,6 +140,7 @@ struct cxl_device_reg_map {
};
struct cxl_register_map {
+ void __iomem *base;
u64 block_offset;
u8 reg_type;
u8 barno;
diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c
index bbbacbc94fbf..5eaf2736f779 100644
--- a/drivers/cxl/pci.c
+++ b/drivers/cxl/pci.c
@@ -306,35 +306,36 @@ static int cxl_pci_setup_mailbox(struct cxl_mem *cxlm)
return 0;
}
-static void __iomem *cxl_pci_map_regblock(struct cxl_mem *cxlm,
- u8 bar, u64 offset)
+static int cxl_pci_map_regblock(struct cxl_mem *cxlm, struct cxl_register_map *map)
{
- void __iomem *addr;
+ int bar = map->barno;
struct device *dev = cxlm->dev;
struct pci_dev *pdev = to_pci_dev(dev);
+ resource_size_t offset = map->block_offset;
/* Basic sanity check that BAR is big enough */
if (pci_resource_len(pdev, bar) < offset) {
dev_err(dev, "BAR%d: %pr: too small (offset: %#llx)\n", bar,
&pdev->resource[bar], (unsigned long long)offset);
- return IOMEM_ERR_PTR(-ENXIO);
+ return -ENXIO;
}
- addr = pci_iomap(pdev, bar, 0);
- if (!addr) {
+ map->base = pci_iomap(pdev, bar, 0);
+ if (!map->base) {
dev_err(dev, "failed to map registers\n");
- return addr;
+ return PTR_ERR(map->base);
}
dev_dbg(dev, "Mapped CXL Memory Device resource bar %u @ %#llx\n",
bar, offset);
- return addr;
+ return 0;
}
-static void cxl_pci_unmap_regblock(struct cxl_mem *cxlm, void __iomem *base)
+static void cxl_pci_unmap_regblock(struct cxl_mem *cxlm, struct cxl_register_map *map)
{
- pci_iounmap(to_pci_dev(cxlm->dev), base);
+ pci_iounmap(to_pci_dev(cxlm->dev), map->base);
+ map->base = 0;
}
static int cxl_pci_dvsec(struct pci_dev *pdev, int dvsec)
@@ -360,9 +361,9 @@ static int cxl_pci_dvsec(struct pci_dev *pdev, int dvsec)
return 0;
}
-static int cxl_probe_regs(struct cxl_mem *cxlm, void __iomem *base,
- struct cxl_register_map *map)
+static int cxl_probe_regs(struct cxl_mem *cxlm, struct cxl_register_map *map)
{
+ void __iomem *base = map->base + map->block_offset;
struct cxl_component_reg_map *comp_map;
struct cxl_device_reg_map *dev_map;
struct device *dev = cxlm->dev;
@@ -487,7 +488,6 @@ static int cxl_pci_setup_regs(struct cxl_mem *cxlm)
for (i = 0; i < ARRAY_SIZE(types); i++) {
struct cxl_register_map map;
- void __iomem *base;
rc = find_register_block(pdev, types[i], &map);
if (rc) {
@@ -498,14 +498,12 @@ static int cxl_pci_setup_regs(struct cxl_mem *cxlm)
break;
}
- base = cxl_pci_map_regblock(cxlm, map.barno, map.block_offset);
- if (!base) {
- rc = -ENOMEM;
+ rc = cxl_pci_map_regblock(cxlm, &map);
+ if (rc)
break;
- }
- rc = cxl_probe_regs(cxlm, base + map.block_offset, &map);
- cxl_pci_unmap_regblock(cxlm, base);
+ rc = cxl_probe_regs(cxlm, &map);
+ cxl_pci_unmap_regblock(cxlm, &map);
if (rc)
break;
--
2.33.0
More information about the Linuxppc-dev
mailing list