summaryrefslogtreecommitdiffstats
path: root/drivers/cxl/mem.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2021-05-13 22:22:05 -0700
committerDan Williams <dan.j.williams@intel.com>2021-05-14 16:13:19 -0700
commit399d34ebc2483c6091a587e5905c6ed34116fb05 (patch)
tree87bbd3d1a38c1d6bc3974c31f9609defea07e386 /drivers/cxl/mem.c
parent5f653f7590ab7db7379f668b2975744585206b0d (diff)
downloadlinux-399d34ebc2483c6091a587e5905c6ed34116fb05.tar.bz2
cxl/core: Refactor CXL register lookup for bridge reuse
While CXL Memory Device endpoints locate the CXL MMIO registers in a PCI BAR, CXL root bridges have their MMIO base address described by platform firmware. Refactor the existing register lookup into a generic facility for endpoints and bridges to share. Reviewed-by: Ben Widawsky <ben.widawsky@intel.com> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Link: https://lore.kernel.org/r/162096972534.1865304.3218686216153688039.stgit@dwillia2-desk3.amr.corp.intel.com Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/cxl/mem.c')
-rw-r--r--drivers/cxl/mem.c50
1 files changed, 6 insertions, 44 deletions
diff --git a/drivers/cxl/mem.c b/drivers/cxl/mem.c
index ddc94c7bd422..c5fdf2c57181 100644
--- a/drivers/cxl/mem.c
+++ b/drivers/cxl/mem.c
@@ -884,53 +884,15 @@ static int cxl_mem_mbox_send_cmd(struct cxl_mem *cxlm, u16 opcode,
static int cxl_mem_setup_regs(struct cxl_mem *cxlm)
{
struct device *dev = &cxlm->pdev->dev;
- int cap, cap_count;
- u64 cap_array;
+ struct cxl_regs *regs = &cxlm->regs;
- cap_array = readq(cxlm->base + CXLDEV_CAP_ARRAY_OFFSET);
- if (FIELD_GET(CXLDEV_CAP_ARRAY_ID_MASK, cap_array) !=
- CXLDEV_CAP_ARRAY_CAP_ID)
- return -ENODEV;
-
- cap_count = FIELD_GET(CXLDEV_CAP_ARRAY_COUNT_MASK, cap_array);
-
- for (cap = 1; cap <= cap_count; cap++) {
- void __iomem *register_block;
- u32 offset;
- u16 cap_id;
-
- cap_id = FIELD_GET(CXLDEV_CAP_HDR_CAP_ID_MASK,
- readl(cxlm->base + cap * 0x10));
- offset = readl(cxlm->base + cap * 0x10 + 0x4);
- register_block = cxlm->base + offset;
-
- switch (cap_id) {
- case CXLDEV_CAP_CAP_ID_DEVICE_STATUS:
- dev_dbg(dev, "found Status capability (0x%x)\n", offset);
- cxlm->regs.status = register_block;
- break;
- case CXLDEV_CAP_CAP_ID_PRIMARY_MAILBOX:
- dev_dbg(dev, "found Mailbox capability (0x%x)\n", offset);
- cxlm->regs.mbox = register_block;
- break;
- case CXLDEV_CAP_CAP_ID_SECONDARY_MAILBOX:
- dev_dbg(dev, "found Secondary Mailbox capability (0x%x)\n", offset);
- break;
- case CXLDEV_CAP_CAP_ID_MEMDEV:
- dev_dbg(dev, "found Memory Device capability (0x%x)\n", offset);
- cxlm->regs.memdev = register_block;
- break;
- default:
- dev_dbg(dev, "Unknown cap ID: %d (0x%x)\n", cap_id, offset);
- break;
- }
- }
+ cxl_setup_device_regs(dev, cxlm->base, &regs->device_regs);
- if (!cxlm->regs.status || !cxlm->regs.mbox || !cxlm->regs.memdev) {
+ if (!regs->status || !regs->mbox || !regs->memdev) {
dev_err(dev, "registers not found: %s%s%s\n",
- !cxlm->regs.status ? "status " : "",
- !cxlm->regs.mbox ? "mbox " : "",
- !cxlm->regs.memdev ? "memdev" : "");
+ !regs->status ? "status " : "",
+ !regs->mbox ? "mbox " : "",
+ !regs->memdev ? "memdev" : "");
return -ENXIO;
}