cxl/pci: Cleanup cxl_map_device_regs()
authorDan Williams <dan.j.williams@intel.com>
Tue, 29 Nov 2022 17:48:18 +0000 (10:48 -0700)
committerDan Williams <dan.j.williams@intel.com>
Sat, 3 Dec 2022 21:40:16 +0000 (13:40 -0800)
Use a loop to reduce the duplicated code in cxl_map_device_regs(). This
is in preparation for deleting cxl_map_regs().

Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/166974409867.1608150.14886452053935226038.stgit@djiang5-desk3.ch.intel.com
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/cxl/core/regs.c

index bd6ae14b679e8d73ed5052fc53611456600c4386..f03ede86412d0fd6031a628def2fdb6d1c7fa3ee 100644 (file)
@@ -211,42 +211,31 @@ int cxl_map_device_regs(struct pci_dev *pdev,
                        struct cxl_device_regs *regs,
                        struct cxl_register_map *map)
 {
+       resource_size_t phys_addr =
+               pci_resource_start(pdev, map->barno) + map->block_offset;
        struct device *dev = &pdev->dev;
-       resource_size_t phys_addr;
-
-       phys_addr = pci_resource_start(pdev, map->barno);
-       phys_addr += map->block_offset;
-
-       if (map->device_map.status.valid) {
-               resource_size_t addr;
+       struct mapinfo {
+               struct cxl_reg_map *rmap;
+               void __iomem **addr;
+       } mapinfo[] = {
+               { &map->device_map.status, &regs->status, },
+               { &map->device_map.mbox, &regs->mbox, },
+               { &map->device_map.memdev, &regs->memdev, },
+       };
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(mapinfo); i++) {
+               struct mapinfo *mi = &mapinfo[i];
                resource_size_t length;
-
-               addr = phys_addr + map->device_map.status.offset;
-               length = map->device_map.status.size;
-               regs->status = devm_cxl_iomap_block(dev, addr, length);
-               if (!regs->status)
-                       return -ENOMEM;
-       }
-
-       if (map->device_map.mbox.valid) {
                resource_size_t addr;
-               resource_size_t length;
 
-               addr = phys_addr + map->device_map.mbox.offset;
-               length = map->device_map.mbox.size;
-               regs->mbox = devm_cxl_iomap_block(dev, addr, length);
-               if (!regs->mbox)
-                       return -ENOMEM;
-       }
-
-       if (map->device_map.memdev.valid) {
-               resource_size_t addr;
-               resource_size_t length;
+               if (!mi->rmap->valid)
+                       continue;
 
-               addr = phys_addr + map->device_map.memdev.offset;
-               length = map->device_map.memdev.size;
-               regs->memdev = devm_cxl_iomap_block(dev, addr, length);
-               if (!regs->memdev)
+               addr = phys_addr + mi->rmap->offset;
+               length = mi->rmap->size;
+               *(mi->addr) = devm_cxl_iomap_block(dev, addr, length);
+               if (!*(mi->addr))
                        return -ENOMEM;
        }