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@xxxxxxxxx> --- include/linux/io.h | 4 ++++ lib/devres.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/include/linux/io.h b/include/linux/io.h index b1c44bb4b2d7..2b3356244553 100644 --- a/include/linux/io.h +++ b/include/linux/io.h @@ -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 diff --git a/lib/devres.c b/lib/devres.c index 6ef51f159c54..a14a49087b37 100644 --- a/lib/devres.c +++ b/lib/devres.c @@ -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