@@ -79,6 +79,10 @@ void devm_memunmap(struct device *dev, void *addr);
void *__devm_memremap_pages(struct device *dev, struct resource *res);
+void __iomem *devm_cmdmem_remap(struct device *dev, resource_size_t offset,
+ resource_size_t size);
+void devm_cmdmem_unmap(struct device *dev, void __iomem *addr);
+
#ifdef CONFIG_PCI
/*
* The PCI specifications (Rev 3.0, 3.2.5 "Transaction Ordering and
@@ -218,6 +218,42 @@ void __iomem *devm_of_iomap(struct device *dev, struct device_node *node, int in
}
EXPORT_SYMBOL(devm_of_iomap);
+/**
+ * devm_cmdmem_remap - Managed wrapper for cmdmem ioremap()
+ * @dev: Generic device to remap IO address for
+ * @offset: Resource address to map
+ * @size: Size of map
+ *
+ * Managed cmdmem ioremap() wrapper. Map is automatically unmapped on
+ * driver detach.
+ */
+void __iomem *devm_cmdmem_remap(struct device *dev, resource_size_t offset,
+ resource_size_t size)
+{
+ if (!device_supports_cmdmem(dev))
+ return NULL;
+
+ return devm_ioremap(dev, offset, size);
+}
+EXPORT_SYMBOL(devm_cmdmem_remap);
+
+/**
+ * devm_cmdmem_unmap - Managed wrapper for cmdmem iounmap()
+ * @dev: Generic device to unmap for
+ * @addr: Address to unmap
+ *
+ * Managed cmdmem iounmap(). @addr must have been mapped using
+ * devm_cmdmem_remap*().
+ */
+void devm_cmdmem_unmap(struct device *dev, void __iomem *addr)
+{
+ if (!device_supports_cmdmem(dev))
+ return;
+
+ devm_iounmap(dev, addr);
+}
+EXPORT_SYMBOL(devm_cmdmem_unmap);
+
#ifdef CONFIG_HAS_IOPORT_MAP
/*
* Generic iomap devres
With the introduction of ENQCMDS CPU instruction on Intel CPU, a number of accelerator devices that support accepting data via ENQCMDS will be arriving. Add devm_cmdmem_remap/unmap() wrappers to remap BAR memory to specifically denote that these regions are of cmdmem behavior type even thought they are iomem. Signed-off-by: Dave Jiang <dave.jiang@intel.com> --- include/linux/io.h | 4 ++++ lib/devres.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+)