Lines Matching +full:device +full:- +full:addr
1 // SPDX-License-Identifier: GPL-2.0-only
3 #include <linux/io-64-nonatomic-lo-hi.h>
4 #include <linux/device.h>
12 * CXL device capabilities are enumerated by PCI DVSEC (Designated
13 * Vendor-specific) and / or descriptors provided by platform firmware.
14 * They can be defined as a set like the device and component registers
15 * mandated by CXL Section 8.1.12.2 Memory Device PCIe Capabilities and
24 * cxl_probe_component_regs() - Detect CXL Component register blocks
25 * @dev: Host device of the @base mapping
30 * See CXL 2.0 8.2.5.5 CXL Device Register Interface
34 void cxl_probe_component_regs(struct device *dev, void __iomem *base, in cxl_probe_component_regs()
82 map->hdm_decoder.valid = true; in cxl_probe_component_regs()
83 map->hdm_decoder.offset = CXL_CM_OFFSET + offset; in cxl_probe_component_regs()
84 map->hdm_decoder.size = length; in cxl_probe_component_regs()
96 * cxl_probe_device_regs() - Detect CXL Device register blocks
97 * @dev: Host device of the @base mapping
98 * @base: Mapping of CXL 2.0 8.2.8 CXL Device Register Interface
101 * Probe for device register information and return it in map object.
103 void cxl_probe_device_regs(struct device *dev, void __iomem *base, in cxl_probe_device_regs()
131 map->status.valid = true; in cxl_probe_device_regs()
132 map->status.offset = offset; in cxl_probe_device_regs()
133 map->status.size = length; in cxl_probe_device_regs()
137 map->mbox.valid = true; in cxl_probe_device_regs()
138 map->mbox.offset = offset; in cxl_probe_device_regs()
139 map->mbox.size = length; in cxl_probe_device_regs()
145 dev_dbg(dev, "found Memory Device capability (0x%x)\n", offset); in cxl_probe_device_regs()
146 map->memdev.valid = true; in cxl_probe_device_regs()
147 map->memdev.offset = offset; in cxl_probe_device_regs()
148 map->memdev.size = length; in cxl_probe_device_regs()
161 static void __iomem *devm_cxl_iomap_block(struct device *dev, in devm_cxl_iomap_block()
162 resource_size_t addr, in devm_cxl_iomap_block() argument
168 res = devm_request_mem_region(dev, addr, length, dev_name(dev)); in devm_cxl_iomap_block()
170 resource_size_t end = addr + length - 1; in devm_cxl_iomap_block()
172 dev_err(dev, "Failed to request region %pa-%pa\n", &addr, &end); in devm_cxl_iomap_block()
176 ret_val = devm_ioremap(dev, addr, length); in devm_cxl_iomap_block()
187 struct device *dev = &pdev->dev; in cxl_map_component_regs()
191 phys_addr = pci_resource_start(pdev, map->barno); in cxl_map_component_regs()
192 phys_addr += map->block_offset; in cxl_map_component_regs()
194 phys_addr += map->component_map.hdm_decoder.offset; in cxl_map_component_regs()
195 length = map->component_map.hdm_decoder.size; in cxl_map_component_regs()
196 regs->hdm_decoder = devm_cxl_iomap_block(dev, phys_addr, length); in cxl_map_component_regs()
197 if (!regs->hdm_decoder) in cxl_map_component_regs()
198 return -ENOMEM; in cxl_map_component_regs()
208 struct device *dev = &pdev->dev; in cxl_map_device_regs()
211 phys_addr = pci_resource_start(pdev, map->barno); in cxl_map_device_regs()
212 phys_addr += map->block_offset; in cxl_map_device_regs()
214 if (map->device_map.status.valid) { in cxl_map_device_regs()
215 resource_size_t addr; in cxl_map_device_regs() local
218 addr = phys_addr + map->device_map.status.offset; in cxl_map_device_regs()
219 length = map->device_map.status.size; in cxl_map_device_regs()
220 regs->status = devm_cxl_iomap_block(dev, addr, length); in cxl_map_device_regs()
221 if (!regs->status) in cxl_map_device_regs()
222 return -ENOMEM; in cxl_map_device_regs()
225 if (map->device_map.mbox.valid) { in cxl_map_device_regs()
226 resource_size_t addr; in cxl_map_device_regs() local
229 addr = phys_addr + map->device_map.mbox.offset; in cxl_map_device_regs()
230 length = map->device_map.mbox.size; in cxl_map_device_regs()
231 regs->mbox = devm_cxl_iomap_block(dev, addr, length); in cxl_map_device_regs()
232 if (!regs->mbox) in cxl_map_device_regs()
233 return -ENOMEM; in cxl_map_device_regs()
236 if (map->device_map.memdev.valid) { in cxl_map_device_regs()
237 resource_size_t addr; in cxl_map_device_regs() local
240 addr = phys_addr + map->device_map.memdev.offset; in cxl_map_device_regs()
241 length = map->device_map.memdev.size; in cxl_map_device_regs()
242 regs->memdev = devm_cxl_iomap_block(dev, addr, length); in cxl_map_device_regs()
243 if (!regs->memdev) in cxl_map_device_regs()
244 return -ENOMEM; in cxl_map_device_regs()