From: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
To: linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
Arnd Bergmann <arnd@arndb.de>
Cc: Wenrui Li <wenrui.li@rock-chips.com>,
Gabriele Paoloni <gabriele.paoloni@huawei.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Shawn Lin <shawn.lin@rock-chips.com>,
Will Deacon <will.deacon@arm.com>,
Michal Simek <michal.simek@xilinx.com>,
Thierry Reding <thierry.reding@gmail.com>,
Tanmay Inamdar <tinamdar@apm.com>,
linux-arch@vger.kernel.org, Joao Pinto <Joao.Pinto@synopsys.com>,
Jonathan Corbet <corbet@lwn.net>,
Pratyush Anand <pratyush.anand@gmail.com>,
Russell King <linux@armlinux.org.uk>,
Jon Mason <jonmason@broadcom.com>,
Murali Karicheri <m-karicheri2@ti.com>,
Bharat Kumar Gogada <bharat.kumar.gogada@xilinx.com>,
Ray Jui <rjui@broadcom.com>, John Garry <john.garry@huawei.com>,
Bjorn Helgaas <bhelgaas@google.com>,
Mingkai Hu <mingkai.hu@freescale.com>,
Thomas Petazzoni <thomas.petazzoni@free-electrons.com>,
Jingoo Han <jingoohan1@gmail.com>,
linux-kernel@vger.ke
Subject: Re: [PATCH 07/20] PCI: implement Devres interface to map PCI config space
Date: Tue, 28 Feb 2017 10:43:51 +0000 [thread overview]
Message-ID: <20170228104351.GC7439@red-moon> (raw)
In-Reply-To: <20170227151436.18698-8-lorenzo.pieralisi@arm.com>
Arnd, all,
On Mon, Feb 27, 2017 at 03:14:18PM +0000, Lorenzo Pieralisi wrote:
> The introduction of the pci_remap_cfgspace() interface allows
> PCI host controller drivers to map PCI config space through a
> dedicated kernel interface. Current PCI host controller drivers
> use the devm_ioremap_* Devres interfaces to map PCI configuration
> space regions so in order to update them to the new
> pci_remap_cfgspace() mapping interface a new set of Devres interfaces
> should be implemented so that PCI host controller drivers can make
> use of them.
>
> Introduce two new functions in the PCI kernel layer and Devres
> documentation:
>
> - devm_pci_remap_cfgspace()
> - devm_pci_remap_cfg_resource()
>
> so that PCI host controller drivers can make use of them to map
> PCI configuration space regions.
>
> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Jonathan Corbet <corbet@lwn.net>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> ---
> Documentation/driver-model/devres.txt | 6 ++-
> drivers/pci/pci.c | 82 +++++++++++++++++++++++++++++++++++
> include/linux/pci.h | 5 +++
> 3 files changed, 91 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt
> index bf34d5b..e72587f 100644
> --- a/Documentation/driver-model/devres.txt
> +++ b/Documentation/driver-model/devres.txt
> @@ -342,8 +342,10 @@ PER-CPU MEM
> devm_free_percpu()
>
> PCI
> - pcim_enable_device() : after success, all PCI ops become managed
> - pcim_pin_device() : keep PCI device enabled after release
> + devm_pci_remap_cfgspace() : ioremap PCI configuration space
> + devm_pci_remap_cfg_resource() : ioremap PCI configuration space resource
> + pcim_enable_device() : after success, all PCI ops become managed
> + pcim_pin_device() : keep PCI device enabled after release
>
> PHY
> devm_usb_get_phy()
> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> index bfb3c6e..1e435c2 100644
> --- a/drivers/pci/pci.c
> +++ b/drivers/pci/pci.c
> @@ -3401,6 +3401,88 @@ void pci_unmap_iospace(struct resource *res)
> #endif
> }
>
> +/**
> + * devm_pci_remap_cfgspace - Managed pci_remap_cfgspace()
> + * @dev: Generic device to remap IO address for
> + * @offset: BUS offset to map
> + * @size: Size of map
> + *
> + * Managed pci_remap_cfgspace(). Map is automatically unmapped on driver
> + * detach.
> + */
> +void __iomem *devm_pci_remap_cfgspace(struct device *dev,
> + resource_size_t offset,
> + resource_size_t size)
> +{
> + void __iomem **ptr, *addr;
> +
> + ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL);
> + if (!ptr)
> + return NULL;
> +
> + addr = pci_remap_cfgspace(offset, size);
Provided this series is acceptable as-is, I noticed that I have
to add a #define for pci_remap_cfgspace() on all arches that do
not include asm-generic/io.h in their asm/io.h, I missed that,
please shout if you see an easier way to implement a
pci_remap_cfgspace() fall-back to ioremap_nocache() on all arches
that do not override it.
Thanks !
Lorenzo
> + if (addr) {
> + *ptr = addr;
> + devres_add(dev, ptr);
> + } else
> + devres_free(ptr);
> +
> + return addr;
> +}
> +EXPORT_SYMBOL(devm_pci_remap_cfgspace);
> +
> +/**
> + * devm_pci_remap_cfg_resource - check, request region and ioremap cfg resource
> + * @dev: generic device to handle the resource for
> + * @res: configuration space resource to be handled
> + *
> + * Checks that a resource is a valid memory region, requests the memory
> + * region and ioremaps with pci_remap_cfgspace() API that ensures the
> + * proper PCI configuration space memory attributes are guaranteed.
> + *
> + * All operations are managed and will be undone on driver detach.
> + *
> + * Returns a pointer to the remapped memory or an ERR_PTR() encoded error code
> + * on failure. Usage example:
> + *
> + * res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + * base = devm_pci_remap_cfg_resource(&pdev->dev, res);
> + * if (IS_ERR(base))
> + * return PTR_ERR(base);
> + */
> +void __iomem *devm_pci_remap_cfg_resource(struct device *dev,
> + struct resource *res)
> +{
> + resource_size_t size;
> + const char *name;
> + void __iomem *dest_ptr;
> +
> + BUG_ON(!dev);
> +
> + if (!res || resource_type(res) != IORESOURCE_MEM) {
> + dev_err(dev, "invalid resource\n");
> + return IOMEM_ERR_PTR(-EINVAL);
> + }
> +
> + size = resource_size(res);
> + name = res->name ?: dev_name(dev);
> +
> + if (!devm_request_mem_region(dev, res->start, size, name)) {
> + dev_err(dev, "can't request region for resource %pR\n", res);
> + return IOMEM_ERR_PTR(-EBUSY);
> + }
> +
> + dest_ptr = devm_pci_remap_cfgspace(dev, res->start, size);
> + if (!dest_ptr) {
> + dev_err(dev, "ioremap failed for resource %pR\n", res);
> + devm_release_mem_region(dev, res->start, size);
> + dest_ptr = IOMEM_ERR_PTR(-ENOMEM);
> + }
> +
> + return dest_ptr;
> +}
> +EXPORT_SYMBOL(devm_pci_remap_cfg_resource);
> +
> static void __pci_set_master(struct pci_dev *dev, bool enable)
> {
> u16 old_cmd, cmd;
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 282ed32..5a3588b 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -1199,6 +1199,11 @@ unsigned long pci_address_to_pio(phys_addr_t addr);
> phys_addr_t pci_pio_to_address(unsigned long pio);
> int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr);
> void pci_unmap_iospace(struct resource *res);
> +void __iomem *devm_pci_remap_cfgspace(struct device *dev,
> + resource_size_t offset,
> + resource_size_t size);
> +void __iomem *devm_pci_remap_cfg_resource(struct device *dev,
> + struct resource *res);
>
> static inline pci_bus_addr_t pci_bus_address(struct pci_dev *pdev, int bar)
> {
> --
> 2.10.0
>
WARNING: multiple messages have this Message-ID (diff)
From: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
To: linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
Arnd Bergmann <arnd@arndb.de>
Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
Jonathan Corbet <corbet@lwn.net>,
Bjorn Helgaas <bhelgaas@google.com>,
Will Deacon <will.deacon@arm.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Russell King <linux@armlinux.org.uk>,
Pratyush Anand <pratyush.anand@gmail.com>,
Jingoo Han <jingoohan1@gmail.com>,
Mingkai Hu <mingkai.hu@freescale.com>,
John Garry <john.garry@huawei.com>,
Tanmay Inamdar <tinamdar@apm.com>,
Murali Karicheri <m-karicheri2@ti.com>,
Bharat Kumar Gogada <bharat.kumar.gogada@xilinx.com>,
Ray Jui <rjui@broadcom.com>, Wenrui Li <wenrui.li@rock-chips.com>,
Shawn Lin <shawn.lin@rock-chips.com>,
Minghuan Lian <minghuan.Lian@freescale.com>,
Jon Mason <jonmason@broadcom.com>,
Gabriele Paoloni <gabriele.paoloni@huawei.com>,
Thomas Petazzoni <thomas.petazzoni@free-electrons.com>,
Joao Pinto <Joao.Pinto@synopsys.com>,
Thierry Reding <thierry.reding@gmail.com>,
Michal Simek <michal.simek@xilinx.com>,
Stanimir Varbanov <svarbanov@mm-sol.com>,
Zhou Wang <wangzhou1@hisilicon.com>,
Roy Zang <tie-fei.zang@freescale.com>
Subject: Re: [PATCH 07/20] PCI: implement Devres interface to map PCI config space
Date: Tue, 28 Feb 2017 10:43:51 +0000 [thread overview]
Message-ID: <20170228104351.GC7439@red-moon> (raw)
Message-ID: <20170228104351.q1TFEfr81uyPjTI5p3HgHT0CxBkq4YkLEF1SFFx51qY@z> (raw)
In-Reply-To: <20170227151436.18698-8-lorenzo.pieralisi@arm.com>
Arnd, all,
On Mon, Feb 27, 2017 at 03:14:18PM +0000, Lorenzo Pieralisi wrote:
> The introduction of the pci_remap_cfgspace() interface allows
> PCI host controller drivers to map PCI config space through a
> dedicated kernel interface. Current PCI host controller drivers
> use the devm_ioremap_* Devres interfaces to map PCI configuration
> space regions so in order to update them to the new
> pci_remap_cfgspace() mapping interface a new set of Devres interfaces
> should be implemented so that PCI host controller drivers can make
> use of them.
>
> Introduce two new functions in the PCI kernel layer and Devres
> documentation:
>
> - devm_pci_remap_cfgspace()
> - devm_pci_remap_cfg_resource()
>
> so that PCI host controller drivers can make use of them to map
> PCI configuration space regions.
>
> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Jonathan Corbet <corbet@lwn.net>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> ---
> Documentation/driver-model/devres.txt | 6 ++-
> drivers/pci/pci.c | 82 +++++++++++++++++++++++++++++++++++
> include/linux/pci.h | 5 +++
> 3 files changed, 91 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt
> index bf34d5b..e72587f 100644
> --- a/Documentation/driver-model/devres.txt
> +++ b/Documentation/driver-model/devres.txt
> @@ -342,8 +342,10 @@ PER-CPU MEM
> devm_free_percpu()
>
> PCI
> - pcim_enable_device() : after success, all PCI ops become managed
> - pcim_pin_device() : keep PCI device enabled after release
> + devm_pci_remap_cfgspace() : ioremap PCI configuration space
> + devm_pci_remap_cfg_resource() : ioremap PCI configuration space resource
> + pcim_enable_device() : after success, all PCI ops become managed
> + pcim_pin_device() : keep PCI device enabled after release
>
> PHY
> devm_usb_get_phy()
> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> index bfb3c6e..1e435c2 100644
> --- a/drivers/pci/pci.c
> +++ b/drivers/pci/pci.c
> @@ -3401,6 +3401,88 @@ void pci_unmap_iospace(struct resource *res)
> #endif
> }
>
> +/**
> + * devm_pci_remap_cfgspace - Managed pci_remap_cfgspace()
> + * @dev: Generic device to remap IO address for
> + * @offset: BUS offset to map
> + * @size: Size of map
> + *
> + * Managed pci_remap_cfgspace(). Map is automatically unmapped on driver
> + * detach.
> + */
> +void __iomem *devm_pci_remap_cfgspace(struct device *dev,
> + resource_size_t offset,
> + resource_size_t size)
> +{
> + void __iomem **ptr, *addr;
> +
> + ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL);
> + if (!ptr)
> + return NULL;
> +
> + addr = pci_remap_cfgspace(offset, size);
Provided this series is acceptable as-is, I noticed that I have
to add a #define for pci_remap_cfgspace() on all arches that do
not include asm-generic/io.h in their asm/io.h, I missed that,
please shout if you see an easier way to implement a
pci_remap_cfgspace() fall-back to ioremap_nocache() on all arches
that do not override it.
Thanks !
Lorenzo
> + if (addr) {
> + *ptr = addr;
> + devres_add(dev, ptr);
> + } else
> + devres_free(ptr);
> +
> + return addr;
> +}
> +EXPORT_SYMBOL(devm_pci_remap_cfgspace);
> +
> +/**
> + * devm_pci_remap_cfg_resource - check, request region and ioremap cfg resource
> + * @dev: generic device to handle the resource for
> + * @res: configuration space resource to be handled
> + *
> + * Checks that a resource is a valid memory region, requests the memory
> + * region and ioremaps with pci_remap_cfgspace() API that ensures the
> + * proper PCI configuration space memory attributes are guaranteed.
> + *
> + * All operations are managed and will be undone on driver detach.
> + *
> + * Returns a pointer to the remapped memory or an ERR_PTR() encoded error code
> + * on failure. Usage example:
> + *
> + * res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + * base = devm_pci_remap_cfg_resource(&pdev->dev, res);
> + * if (IS_ERR(base))
> + * return PTR_ERR(base);
> + */
> +void __iomem *devm_pci_remap_cfg_resource(struct device *dev,
> + struct resource *res)
> +{
> + resource_size_t size;
> + const char *name;
> + void __iomem *dest_ptr;
> +
> + BUG_ON(!dev);
> +
> + if (!res || resource_type(res) != IORESOURCE_MEM) {
> + dev_err(dev, "invalid resource\n");
> + return IOMEM_ERR_PTR(-EINVAL);
> + }
> +
> + size = resource_size(res);
> + name = res->name ?: dev_name(dev);
> +
> + if (!devm_request_mem_region(dev, res->start, size, name)) {
> + dev_err(dev, "can't request region for resource %pR\n", res);
> + return IOMEM_ERR_PTR(-EBUSY);
> + }
> +
> + dest_ptr = devm_pci_remap_cfgspace(dev, res->start, size);
> + if (!dest_ptr) {
> + dev_err(dev, "ioremap failed for resource %pR\n", res);
> + devm_release_mem_region(dev, res->start, size);
> + dest_ptr = IOMEM_ERR_PTR(-ENOMEM);
> + }
> +
> + return dest_ptr;
> +}
> +EXPORT_SYMBOL(devm_pci_remap_cfg_resource);
> +
> static void __pci_set_master(struct pci_dev *dev, bool enable)
> {
> u16 old_cmd, cmd;
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 282ed32..5a3588b 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -1199,6 +1199,11 @@ unsigned long pci_address_to_pio(phys_addr_t addr);
> phys_addr_t pci_pio_to_address(unsigned long pio);
> int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr);
> void pci_unmap_iospace(struct resource *res);
> +void __iomem *devm_pci_remap_cfgspace(struct device *dev,
> + resource_size_t offset,
> + resource_size_t size);
> +void __iomem *devm_pci_remap_cfg_resource(struct device *dev,
> + struct resource *res);
>
> static inline pci_bus_addr_t pci_bus_address(struct pci_dev *pdev, int bar)
> {
> --
> 2.10.0
>
WARNING: multiple messages have this Message-ID (diff)
From: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
To: linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
Arnd Bergmann <arnd@arndb.de>
Cc: Wenrui Li <wenrui.li@rock-chips.com>,
Gabriele Paoloni <gabriele.paoloni@huawei.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Shawn Lin <shawn.lin@rock-chips.com>,
Will Deacon <will.deacon@arm.com>,
Michal Simek <michal.simek@xilinx.com>,
Thierry Reding <thierry.reding@gmail.com>,
Tanmay Inamdar <tinamdar@apm.com>,
linux-arch@vger.kernel.org, Joao Pinto <Joao.Pinto@synopsys.com>,
Jonathan Corbet <corbet@lwn.net>,
Pratyush Anand <pratyush.anand@gmail.com>,
Russell King <linux@armlinux.org.uk>,
Jon Mason <jonmason@broadcom.com>,
Murali Karicheri <m-karicheri2@ti.com>,
Bharat Kumar Gogada <bharat.kumar.gogada@xilinx.com>,
Ray Jui <rjui@broadcom.com>, John Garry <john.garry@huawei.com>,
Bjorn Helgaas <bhelgaas@google.com>,
Mingkai Hu <mingkai.hu@freescale.com>,
Thomas Petazzoni <thomas.petazzoni@free-electrons.com>,
Jingoo Han <jingoohan1@gmail.com>,
linux-kernel@vger.kernel.org,
Stanimir Varbanov <svarbanov@mm-sol.com>,
Minghuan Lian <minghuan.Lian@freescale.com>,
Zhou Wang <wangzhou1@hisilicon.com>,
Roy Zang <tie-fei.zang@freescale.com>
Subject: Re: [PATCH 07/20] PCI: implement Devres interface to map PCI config space
Date: Tue, 28 Feb 2017 10:43:51 +0000 [thread overview]
Message-ID: <20170228104351.GC7439@red-moon> (raw)
In-Reply-To: <20170227151436.18698-8-lorenzo.pieralisi@arm.com>
Arnd, all,
On Mon, Feb 27, 2017 at 03:14:18PM +0000, Lorenzo Pieralisi wrote:
> The introduction of the pci_remap_cfgspace() interface allows
> PCI host controller drivers to map PCI config space through a
> dedicated kernel interface. Current PCI host controller drivers
> use the devm_ioremap_* Devres interfaces to map PCI configuration
> space regions so in order to update them to the new
> pci_remap_cfgspace() mapping interface a new set of Devres interfaces
> should be implemented so that PCI host controller drivers can make
> use of them.
>
> Introduce two new functions in the PCI kernel layer and Devres
> documentation:
>
> - devm_pci_remap_cfgspace()
> - devm_pci_remap_cfg_resource()
>
> so that PCI host controller drivers can make use of them to map
> PCI configuration space regions.
>
> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Jonathan Corbet <corbet@lwn.net>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> ---
> Documentation/driver-model/devres.txt | 6 ++-
> drivers/pci/pci.c | 82 +++++++++++++++++++++++++++++++++++
> include/linux/pci.h | 5 +++
> 3 files changed, 91 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt
> index bf34d5b..e72587f 100644
> --- a/Documentation/driver-model/devres.txt
> +++ b/Documentation/driver-model/devres.txt
> @@ -342,8 +342,10 @@ PER-CPU MEM
> devm_free_percpu()
>
> PCI
> - pcim_enable_device() : after success, all PCI ops become managed
> - pcim_pin_device() : keep PCI device enabled after release
> + devm_pci_remap_cfgspace() : ioremap PCI configuration space
> + devm_pci_remap_cfg_resource() : ioremap PCI configuration space resource
> + pcim_enable_device() : after success, all PCI ops become managed
> + pcim_pin_device() : keep PCI device enabled after release
>
> PHY
> devm_usb_get_phy()
> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> index bfb3c6e..1e435c2 100644
> --- a/drivers/pci/pci.c
> +++ b/drivers/pci/pci.c
> @@ -3401,6 +3401,88 @@ void pci_unmap_iospace(struct resource *res)
> #endif
> }
>
> +/**
> + * devm_pci_remap_cfgspace - Managed pci_remap_cfgspace()
> + * @dev: Generic device to remap IO address for
> + * @offset: BUS offset to map
> + * @size: Size of map
> + *
> + * Managed pci_remap_cfgspace(). Map is automatically unmapped on driver
> + * detach.
> + */
> +void __iomem *devm_pci_remap_cfgspace(struct device *dev,
> + resource_size_t offset,
> + resource_size_t size)
> +{
> + void __iomem **ptr, *addr;
> +
> + ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL);
> + if (!ptr)
> + return NULL;
> +
> + addr = pci_remap_cfgspace(offset, size);
Provided this series is acceptable as-is, I noticed that I have
to add a #define for pci_remap_cfgspace() on all arches that do
not include asm-generic/io.h in their asm/io.h, I missed that,
please shout if you see an easier way to implement a
pci_remap_cfgspace() fall-back to ioremap_nocache() on all arches
that do not override it.
Thanks !
Lorenzo
> + if (addr) {
> + *ptr = addr;
> + devres_add(dev, ptr);
> + } else
> + devres_free(ptr);
> +
> + return addr;
> +}
> +EXPORT_SYMBOL(devm_pci_remap_cfgspace);
> +
> +/**
> + * devm_pci_remap_cfg_resource - check, request region and ioremap cfg resource
> + * @dev: generic device to handle the resource for
> + * @res: configuration space resource to be handled
> + *
> + * Checks that a resource is a valid memory region, requests the memory
> + * region and ioremaps with pci_remap_cfgspace() API that ensures the
> + * proper PCI configuration space memory attributes are guaranteed.
> + *
> + * All operations are managed and will be undone on driver detach.
> + *
> + * Returns a pointer to the remapped memory or an ERR_PTR() encoded error code
> + * on failure. Usage example:
> + *
> + * res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + * base = devm_pci_remap_cfg_resource(&pdev->dev, res);
> + * if (IS_ERR(base))
> + * return PTR_ERR(base);
> + */
> +void __iomem *devm_pci_remap_cfg_resource(struct device *dev,
> + struct resource *res)
> +{
> + resource_size_t size;
> + const char *name;
> + void __iomem *dest_ptr;
> +
> + BUG_ON(!dev);
> +
> + if (!res || resource_type(res) != IORESOURCE_MEM) {
> + dev_err(dev, "invalid resource\n");
> + return IOMEM_ERR_PTR(-EINVAL);
> + }
> +
> + size = resource_size(res);
> + name = res->name ?: dev_name(dev);
> +
> + if (!devm_request_mem_region(dev, res->start, size, name)) {
> + dev_err(dev, "can't request region for resource %pR\n", res);
> + return IOMEM_ERR_PTR(-EBUSY);
> + }
> +
> + dest_ptr = devm_pci_remap_cfgspace(dev, res->start, size);
> + if (!dest_ptr) {
> + dev_err(dev, "ioremap failed for resource %pR\n", res);
> + devm_release_mem_region(dev, res->start, size);
> + dest_ptr = IOMEM_ERR_PTR(-ENOMEM);
> + }
> +
> + return dest_ptr;
> +}
> +EXPORT_SYMBOL(devm_pci_remap_cfg_resource);
> +
> static void __pci_set_master(struct pci_dev *dev, bool enable)
> {
> u16 old_cmd, cmd;
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 282ed32..5a3588b 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -1199,6 +1199,11 @@ unsigned long pci_address_to_pio(phys_addr_t addr);
> phys_addr_t pci_pio_to_address(unsigned long pio);
> int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr);
> void pci_unmap_iospace(struct resource *res);
> +void __iomem *devm_pci_remap_cfgspace(struct device *dev,
> + resource_size_t offset,
> + resource_size_t size);
> +void __iomem *devm_pci_remap_cfg_resource(struct device *dev,
> + struct resource *res);
>
> static inline pci_bus_addr_t pci_bus_address(struct pci_dev *pdev, int bar)
> {
> --
> 2.10.0
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
WARNING: multiple messages have this Message-ID (diff)
From: lorenzo.pieralisi@arm.com (Lorenzo Pieralisi)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 07/20] PCI: implement Devres interface to map PCI config space
Date: Tue, 28 Feb 2017 10:43:51 +0000 [thread overview]
Message-ID: <20170228104351.GC7439@red-moon> (raw)
In-Reply-To: <20170227151436.18698-8-lorenzo.pieralisi@arm.com>
Arnd, all,
On Mon, Feb 27, 2017 at 03:14:18PM +0000, Lorenzo Pieralisi wrote:
> The introduction of the pci_remap_cfgspace() interface allows
> PCI host controller drivers to map PCI config space through a
> dedicated kernel interface. Current PCI host controller drivers
> use the devm_ioremap_* Devres interfaces to map PCI configuration
> space regions so in order to update them to the new
> pci_remap_cfgspace() mapping interface a new set of Devres interfaces
> should be implemented so that PCI host controller drivers can make
> use of them.
>
> Introduce two new functions in the PCI kernel layer and Devres
> documentation:
>
> - devm_pci_remap_cfgspace()
> - devm_pci_remap_cfg_resource()
>
> so that PCI host controller drivers can make use of them to map
> PCI configuration space regions.
>
> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
> Cc: Jonathan Corbet <corbet@lwn.net>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> ---
> Documentation/driver-model/devres.txt | 6 ++-
> drivers/pci/pci.c | 82 +++++++++++++++++++++++++++++++++++
> include/linux/pci.h | 5 +++
> 3 files changed, 91 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt
> index bf34d5b..e72587f 100644
> --- a/Documentation/driver-model/devres.txt
> +++ b/Documentation/driver-model/devres.txt
> @@ -342,8 +342,10 @@ PER-CPU MEM
> devm_free_percpu()
>
> PCI
> - pcim_enable_device() : after success, all PCI ops become managed
> - pcim_pin_device() : keep PCI device enabled after release
> + devm_pci_remap_cfgspace() : ioremap PCI configuration space
> + devm_pci_remap_cfg_resource() : ioremap PCI configuration space resource
> + pcim_enable_device() : after success, all PCI ops become managed
> + pcim_pin_device() : keep PCI device enabled after release
>
> PHY
> devm_usb_get_phy()
> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> index bfb3c6e..1e435c2 100644
> --- a/drivers/pci/pci.c
> +++ b/drivers/pci/pci.c
> @@ -3401,6 +3401,88 @@ void pci_unmap_iospace(struct resource *res)
> #endif
> }
>
> +/**
> + * devm_pci_remap_cfgspace - Managed pci_remap_cfgspace()
> + * @dev: Generic device to remap IO address for
> + * @offset: BUS offset to map
> + * @size: Size of map
> + *
> + * Managed pci_remap_cfgspace(). Map is automatically unmapped on driver
> + * detach.
> + */
> +void __iomem *devm_pci_remap_cfgspace(struct device *dev,
> + resource_size_t offset,
> + resource_size_t size)
> +{
> + void __iomem **ptr, *addr;
> +
> + ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL);
> + if (!ptr)
> + return NULL;
> +
> + addr = pci_remap_cfgspace(offset, size);
Provided this series is acceptable as-is, I noticed that I have
to add a #define for pci_remap_cfgspace() on all arches that do
not include asm-generic/io.h in their asm/io.h, I missed that,
please shout if you see an easier way to implement a
pci_remap_cfgspace() fall-back to ioremap_nocache() on all arches
that do not override it.
Thanks !
Lorenzo
> + if (addr) {
> + *ptr = addr;
> + devres_add(dev, ptr);
> + } else
> + devres_free(ptr);
> +
> + return addr;
> +}
> +EXPORT_SYMBOL(devm_pci_remap_cfgspace);
> +
> +/**
> + * devm_pci_remap_cfg_resource - check, request region and ioremap cfg resource
> + * @dev: generic device to handle the resource for
> + * @res: configuration space resource to be handled
> + *
> + * Checks that a resource is a valid memory region, requests the memory
> + * region and ioremaps with pci_remap_cfgspace() API that ensures the
> + * proper PCI configuration space memory attributes are guaranteed.
> + *
> + * All operations are managed and will be undone on driver detach.
> + *
> + * Returns a pointer to the remapped memory or an ERR_PTR() encoded error code
> + * on failure. Usage example:
> + *
> + * res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + * base = devm_pci_remap_cfg_resource(&pdev->dev, res);
> + * if (IS_ERR(base))
> + * return PTR_ERR(base);
> + */
> +void __iomem *devm_pci_remap_cfg_resource(struct device *dev,
> + struct resource *res)
> +{
> + resource_size_t size;
> + const char *name;
> + void __iomem *dest_ptr;
> +
> + BUG_ON(!dev);
> +
> + if (!res || resource_type(res) != IORESOURCE_MEM) {
> + dev_err(dev, "invalid resource\n");
> + return IOMEM_ERR_PTR(-EINVAL);
> + }
> +
> + size = resource_size(res);
> + name = res->name ?: dev_name(dev);
> +
> + if (!devm_request_mem_region(dev, res->start, size, name)) {
> + dev_err(dev, "can't request region for resource %pR\n", res);
> + return IOMEM_ERR_PTR(-EBUSY);
> + }
> +
> + dest_ptr = devm_pci_remap_cfgspace(dev, res->start, size);
> + if (!dest_ptr) {
> + dev_err(dev, "ioremap failed for resource %pR\n", res);
> + devm_release_mem_region(dev, res->start, size);
> + dest_ptr = IOMEM_ERR_PTR(-ENOMEM);
> + }
> +
> + return dest_ptr;
> +}
> +EXPORT_SYMBOL(devm_pci_remap_cfg_resource);
> +
> static void __pci_set_master(struct pci_dev *dev, bool enable)
> {
> u16 old_cmd, cmd;
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 282ed32..5a3588b 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -1199,6 +1199,11 @@ unsigned long pci_address_to_pio(phys_addr_t addr);
> phys_addr_t pci_pio_to_address(unsigned long pio);
> int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr);
> void pci_unmap_iospace(struct resource *res);
> +void __iomem *devm_pci_remap_cfgspace(struct device *dev,
> + resource_size_t offset,
> + resource_size_t size);
> +void __iomem *devm_pci_remap_cfg_resource(struct device *dev,
> + struct resource *res);
>
> static inline pci_bus_addr_t pci_bus_address(struct pci_dev *pdev, int bar)
> {
> --
> 2.10.0
>
next prev parent reply other threads:[~2017-02-28 10:43 UTC|newest]
Thread overview: 180+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-27 15:14 [PATCH 00/20] PCI: fix config and I/O Address space memory mappings Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` [PATCH 01/20] PCI: remove __weak tag from pci_remap_iospace() Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-03-01 16:15 ` Arnd Bergmann
2017-03-01 16:15 ` Arnd Bergmann
2017-03-01 16:15 ` Arnd Bergmann
2017-03-01 16:15 ` Arnd Bergmann
2017-02-27 15:14 ` [PATCH 02/20] PCI: fix pci_remap_iospace() remap attribute Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-03-16 21:48 ` Bjorn Helgaas
2017-03-16 21:48 ` Bjorn Helgaas
2017-03-16 21:48 ` Bjorn Helgaas
2017-03-16 21:48 ` Bjorn Helgaas
2017-03-17 0:33 ` Luis R. Rodriguez
2017-03-17 0:33 ` Luis R. Rodriguez
2017-03-17 0:33 ` Luis R. Rodriguez
2017-03-17 10:43 ` Liviu Dudau
2017-03-17 10:43 ` Liviu Dudau
2017-03-17 10:43 ` Liviu Dudau
2017-03-17 10:43 ` Liviu Dudau
2017-03-17 16:26 ` Luis R. Rodriguez
2017-03-17 16:26 ` Luis R. Rodriguez
2017-03-17 16:26 ` Luis R. Rodriguez
2017-03-20 16:19 ` Lorenzo Pieralisi
2017-03-20 16:19 ` Lorenzo Pieralisi
2017-03-20 16:19 ` Lorenzo Pieralisi
2017-03-20 16:06 ` Bjorn Helgaas
2017-03-20 16:06 ` Bjorn Helgaas
2017-03-20 16:06 ` Bjorn Helgaas
2017-03-20 16:06 ` Bjorn Helgaas
2017-03-20 16:26 ` Lorenzo Pieralisi
2017-03-20 16:26 ` Lorenzo Pieralisi
2017-03-20 16:26 ` Lorenzo Pieralisi
2017-03-20 16:38 ` Bjorn Helgaas
2017-03-20 16:38 ` Bjorn Helgaas
2017-03-20 16:38 ` Bjorn Helgaas
2017-03-20 16:38 ` Bjorn Helgaas
2017-02-27 15:14 ` [PATCH 03/20] asm-generic/io.h: add PCI config space remap interface Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-03-16 21:12 ` Bjorn Helgaas
2017-03-16 21:12 ` Bjorn Helgaas
2017-03-16 21:12 ` Bjorn Helgaas
2017-03-17 0:08 ` Luis R. Rodriguez
2017-03-17 0:08 ` Luis R. Rodriguez
2017-03-17 0:08 ` Luis R. Rodriguez
2017-03-20 10:22 ` John Garry
2017-03-20 10:22 ` John Garry
2017-03-20 10:22 ` John Garry
2017-03-20 10:22 ` John Garry
2017-03-20 16:27 ` Bjorn Helgaas
2017-03-20 16:27 ` Bjorn Helgaas
2017-03-20 16:27 ` Bjorn Helgaas
2017-03-20 16:27 ` Bjorn Helgaas
2017-03-20 18:45 ` Lorenzo Pieralisi
2017-03-20 18:45 ` Lorenzo Pieralisi
2017-03-20 18:45 ` Lorenzo Pieralisi
2017-03-22 15:04 ` Lorenzo Pieralisi
2017-03-22 15:04 ` Lorenzo Pieralisi
2017-03-22 15:04 ` Lorenzo Pieralisi
2017-03-22 15:15 ` Arnd Bergmann
2017-03-22 15:15 ` Arnd Bergmann
2017-03-22 15:15 ` Arnd Bergmann
2017-03-22 16:29 ` Bjorn Helgaas
2017-03-22 16:29 ` Bjorn Helgaas
2017-03-22 16:29 ` Bjorn Helgaas
2017-03-22 16:29 ` Bjorn Helgaas
2017-02-27 15:14 ` [PATCH 04/20] ARM64: implement pci_remap_cfgspace() interface Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` [PATCH 05/20] ARM: " Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-03-20 16:43 ` Russell King - ARM Linux
2017-03-20 16:43 ` Russell King - ARM Linux
2017-03-20 16:43 ` Russell King - ARM Linux
2017-03-20 16:43 ` Russell King - ARM Linux
2017-03-21 15:26 ` Lorenzo Pieralisi
2017-03-21 15:26 ` Lorenzo Pieralisi
2017-03-21 15:26 ` Lorenzo Pieralisi
2017-03-21 15:26 ` Lorenzo Pieralisi
2017-03-21 16:53 ` Russell King - ARM Linux
2017-03-21 16:53 ` Russell King - ARM Linux
2017-03-21 16:53 ` Russell King - ARM Linux
2017-03-21 16:53 ` Russell King - ARM Linux
2017-02-27 15:14 ` [PATCH 06/20] PCI: ECAM: use pci_remap_cfgspace() to map config region Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` [PATCH 07/20] PCI: implement Devres interface to map PCI config space Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-28 10:43 ` Lorenzo Pieralisi [this message]
2017-02-28 10:43 ` Lorenzo Pieralisi
2017-02-28 10:43 ` Lorenzo Pieralisi
2017-02-28 10:43 ` Lorenzo Pieralisi
2017-03-01 23:54 ` Andy Shevchenko
2017-03-01 23:54 ` Andy Shevchenko
2017-03-01 23:54 ` Andy Shevchenko
2017-03-01 23:54 ` Andy Shevchenko
2017-03-02 12:05 ` Lorenzo Pieralisi
2017-03-02 12:05 ` Lorenzo Pieralisi
2017-03-02 12:05 ` Lorenzo Pieralisi
2017-03-02 12:05 ` Lorenzo Pieralisi
2017-03-02 12:50 ` Andy Shevchenko
2017-03-02 12:50 ` Andy Shevchenko
2017-03-02 12:50 ` Andy Shevchenko
2017-03-02 12:50 ` Andy Shevchenko
2017-03-02 19:24 ` Tejun Heo
2017-03-02 19:24 ` Tejun Heo
2017-03-02 19:24 ` Tejun Heo
2017-03-02 19:24 ` Tejun Heo
2017-03-02 20:08 ` Thierry Reding
2017-03-02 20:08 ` Thierry Reding
2017-03-02 20:08 ` Thierry Reding
2017-03-02 20:08 ` Thierry Reding
2017-02-27 15:14 ` [PATCH 08/20] PCI: xilinx: update PCI config space remap function Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` [PATCH 09/20] PCI: xilinx-nwl: " Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` [PATCH 10/20] PCI: spear13xx: " Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` [PATCH 11/20] PCI: rockchip: " Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` [PATCH 12/20] PCI: qcom: " Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` [PATCH 13/20] PCI: iproc-platform: " Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 21:21 ` Ray Jui
2017-02-27 21:21 ` Ray Jui
2017-02-27 21:21 ` Ray Jui
2017-02-27 21:21 ` Ray Jui
2017-02-28 10:54 ` Lorenzo Pieralisi
2017-02-28 10:54 ` Lorenzo Pieralisi
2017-02-28 10:54 ` Lorenzo Pieralisi
2017-02-28 10:54 ` Lorenzo Pieralisi
2017-02-28 17:42 ` Ray Jui
2017-02-28 17:42 ` Ray Jui
2017-02-28 17:42 ` Ray Jui
2017-02-28 17:42 ` Ray Jui
2017-02-27 15:14 ` [PATCH 14/20] PCI: hisi: " Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-03-02 10:56 ` Gabriele Paoloni
2017-03-02 10:56 ` Gabriele Paoloni
2017-03-02 10:56 ` Gabriele Paoloni
2017-03-02 10:56 ` Gabriele Paoloni
2017-03-02 11:49 ` Lorenzo Pieralisi
2017-03-02 11:49 ` Lorenzo Pieralisi
2017-03-02 11:49 ` Lorenzo Pieralisi
2017-03-02 11:49 ` Lorenzo Pieralisi
2017-03-02 11:53 ` Gabriele Paoloni
2017-03-02 11:53 ` Gabriele Paoloni
2017-02-27 15:14 ` [PATCH 15/20] PCI: designware: " Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` [PATCH 16/20] PCI: armada8k: " Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` [PATCH 17/20] PCI: xgene: " Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` [PATCH 18/20] PCI: tegra: " Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` [PATCH 19/20] PCI: layerscape: " Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-02-27 15:14 ` [PATCH 20/20] PCI: keystone-dw: " Lorenzo Pieralisi
2017-02-27 15:14 ` Lorenzo Pieralisi
2017-03-01 16:18 ` [PATCH 00/20] PCI: fix config and I/O Address space memory mappings Arnd Bergmann
2017-03-01 16:18 ` Arnd Bergmann
2017-03-01 16:18 ` Arnd Bergmann
2017-03-01 16:18 ` Arnd Bergmann
2017-03-02 18:00 ` Lorenzo Pieralisi
2017-03-02 18:00 ` Lorenzo Pieralisi
2017-03-02 18:00 ` Lorenzo Pieralisi
2017-03-02 18:00 ` Lorenzo Pieralisi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170228104351.GC7439@red-moon \
--to=lorenzo.pieralisi@arm.com \
--cc=Joao.Pinto@synopsys.com \
--cc=arnd@arndb.de \
--cc=bharat.kumar.gogada@xilinx.com \
--cc=bhelgaas@google.com \
--cc=catalin.marinas@arm.com \
--cc=corbet@lwn.net \
--cc=gabriele.paoloni@huawei.com \
--cc=jingoohan1@gmail.com \
--cc=john.garry@huawei.com \
--cc=jonmason@broadcom.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.ke \
--cc=linux-pci@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=m-karicheri2@ti.com \
--cc=michal.simek@xilinx.com \
--cc=mingkai.hu@freescale.com \
--cc=pratyush.anand@gmail.com \
--cc=rjui@broadcom.com \
--cc=shawn.lin@rock-chips.com \
--cc=thierry.reding@gmail.com \
--cc=thomas.petazzoni@free-electrons.com \
--cc=tinamdar@apm.com \
--cc=wenrui.li@rock-chips.com \
--cc=will.deacon@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.