Merge branch 'pci/ioremap' into next
* pci/ioremap: PCI: versatile: Update PCI config space remap function PCI: keystone-dw: Update PCI config space remap function PCI: layerscape: Update PCI config space remap function PCI: hisi: Update PCI config space remap function PCI: tegra: Update PCI config space remap function PCI: xgene: Update PCI config space remap function PCI: armada8k: Update PCI config space remap function PCI: designware: Update PCI config space remap function PCI: iproc-platform: Update PCI config space remap function PCI: qcom: Update PCI config space remap function PCI: rockchip: Update PCI config space remap function PCI: spear13xx: Update PCI config space remap function PCI: xilinx-nwl: Update PCI config space remap function PCI: xilinx: Update PCI config space remap function PCI: ECAM: Map config region with pci_remap_cfgspace() PCI: Implement devm_pci_remap_cfgspace() devres: fix devm_ioremap_*() offset parameter kerneldoc description ARM: Implement pci_remap_cfgspace() interface ARM64: Implement pci_remap_cfgspace() interface linux/io.h: Add pci_remap_cfgspace() interface PCI: Remove __weak tag from pci_remap_iospace()
This commit is contained in:
Коммит
0b0ee66c4f
|
@ -342,8 +342,10 @@ PER-CPU MEM
|
||||||
devm_free_percpu()
|
devm_free_percpu()
|
||||||
|
|
||||||
PCI
|
PCI
|
||||||
pcim_enable_device() : after success, all PCI ops become managed
|
devm_pci_remap_cfgspace() : ioremap PCI configuration space
|
||||||
pcim_pin_device() : keep PCI device enabled after release
|
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
|
PHY
|
||||||
devm_usb_get_phy()
|
devm_usb_get_phy()
|
||||||
|
|
|
@ -186,6 +186,16 @@ static inline void pci_ioremap_set_mem_type(int mem_type) {}
|
||||||
|
|
||||||
extern int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr);
|
extern int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PCI configuration space mapping function.
|
||||||
|
*
|
||||||
|
* The PCI specification does not allow configuration write
|
||||||
|
* transactions to be posted. Add an arch specific
|
||||||
|
* pci_remap_cfgspace() definition that is implemented
|
||||||
|
* through strongly ordered memory mappings.
|
||||||
|
*/
|
||||||
|
#define pci_remap_cfgspace pci_remap_cfgspace
|
||||||
|
void __iomem *pci_remap_cfgspace(resource_size_t res_cookie, size_t size);
|
||||||
/*
|
/*
|
||||||
* Now, pick up the machine-defined IO definitions
|
* Now, pick up the machine-defined IO definitions
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -481,6 +481,13 @@ int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr)
|
||||||
__pgprot(get_mem_type(pci_ioremap_mem_type)->prot_pte));
|
__pgprot(get_mem_type(pci_ioremap_mem_type)->prot_pte));
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pci_ioremap_io);
|
EXPORT_SYMBOL_GPL(pci_ioremap_io);
|
||||||
|
|
||||||
|
void __iomem *pci_remap_cfgspace(resource_size_t res_cookie, size_t size)
|
||||||
|
{
|
||||||
|
return arch_ioremap_caller(res_cookie, size, MT_UNCACHED,
|
||||||
|
__builtin_return_address(0));
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pci_remap_cfgspace);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -433,6 +433,18 @@ void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ioremap_wc);
|
EXPORT_SYMBOL(ioremap_wc);
|
||||||
|
|
||||||
|
#ifdef CONFIG_PCI
|
||||||
|
|
||||||
|
#include <asm/mach/map.h>
|
||||||
|
|
||||||
|
void __iomem *pci_remap_cfgspace(resource_size_t res_cookie, size_t size)
|
||||||
|
{
|
||||||
|
return arch_ioremap_caller(res_cookie, size, MT_UNCACHED,
|
||||||
|
__builtin_return_address(0));
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pci_remap_cfgspace);
|
||||||
|
#endif
|
||||||
|
|
||||||
void *arch_memremap_wb(phys_addr_t phys_addr, size_t size)
|
void *arch_memremap_wb(phys_addr_t phys_addr, size_t size)
|
||||||
{
|
{
|
||||||
return (void *)phys_addr;
|
return (void *)phys_addr;
|
||||||
|
|
|
@ -172,6 +172,16 @@ extern void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size);
|
||||||
#define ioremap_wt(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
|
#define ioremap_wt(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
|
||||||
#define iounmap __iounmap
|
#define iounmap __iounmap
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PCI configuration space mapping function.
|
||||||
|
*
|
||||||
|
* The PCI specification disallows posted write configuration transactions.
|
||||||
|
* Add an arch specific pci_remap_cfgspace() definition that is implemented
|
||||||
|
* through nGnRnE device memory attribute as recommended by the ARM v8
|
||||||
|
* Architecture reference manual Issue A.k B2.8.2 "Device memory".
|
||||||
|
*/
|
||||||
|
#define pci_remap_cfgspace(addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRnE))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* io{read,write}{16,32,64}be() macros
|
* io{read,write}{16,32,64}be() macros
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -543,7 +543,7 @@ int __init ks_dw_pcie_host_init(struct keystone_pcie *ks_pcie,
|
||||||
|
|
||||||
/* Index 0 is the config reg. space address */
|
/* Index 0 is the config reg. space address */
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
pci->dbi_base = devm_ioremap_resource(dev, res);
|
pci->dbi_base = devm_pci_remap_cfg_resource(dev, res);
|
||||||
if (IS_ERR(pci->dbi_base))
|
if (IS_ERR(pci->dbi_base))
|
||||||
return PTR_ERR(pci->dbi_base);
|
return PTR_ERR(pci->dbi_base);
|
||||||
|
|
||||||
|
|
|
@ -283,7 +283,7 @@ static int __init ls_pcie_probe(struct platform_device *pdev)
|
||||||
pcie->pci = pci;
|
pcie->pci = pci;
|
||||||
|
|
||||||
dbi_base = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs");
|
dbi_base = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs");
|
||||||
pci->dbi_base = devm_ioremap_resource(dev, dbi_base);
|
pci->dbi_base = devm_pci_remap_cfg_resource(dev, dbi_base);
|
||||||
if (IS_ERR(pci->dbi_base))
|
if (IS_ERR(pci->dbi_base))
|
||||||
return PTR_ERR(pci->dbi_base);
|
return PTR_ERR(pci->dbi_base);
|
||||||
|
|
||||||
|
|
|
@ -230,7 +230,7 @@ static int armada8k_pcie_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
/* Get the dw-pcie unit configuration/control registers base. */
|
/* Get the dw-pcie unit configuration/control registers base. */
|
||||||
base = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ctrl");
|
base = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ctrl");
|
||||||
pci->dbi_base = devm_ioremap_resource(dev, base);
|
pci->dbi_base = devm_pci_remap_cfg_resource(dev, base);
|
||||||
if (IS_ERR(pci->dbi_base)) {
|
if (IS_ERR(pci->dbi_base)) {
|
||||||
dev_err(dev, "couldn't remap regs base %p\n", base);
|
dev_err(dev, "couldn't remap regs base %p\n", base);
|
||||||
ret = PTR_ERR(pci->dbi_base);
|
ret = PTR_ERR(pci->dbi_base);
|
||||||
|
|
|
@ -339,8 +339,9 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pci->dbi_base) {
|
if (!pci->dbi_base) {
|
||||||
pci->dbi_base = devm_ioremap(dev, pp->cfg->start,
|
pci->dbi_base = devm_pci_remap_cfgspace(dev,
|
||||||
resource_size(pp->cfg));
|
pp->cfg->start,
|
||||||
|
resource_size(pp->cfg));
|
||||||
if (!pci->dbi_base) {
|
if (!pci->dbi_base) {
|
||||||
dev_err(dev, "error with ioremap\n");
|
dev_err(dev, "error with ioremap\n");
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
@ -351,8 +352,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
||||||
pp->mem_base = pp->mem->start;
|
pp->mem_base = pp->mem->start;
|
||||||
|
|
||||||
if (!pp->va_cfg0_base) {
|
if (!pp->va_cfg0_base) {
|
||||||
pp->va_cfg0_base = devm_ioremap(dev, pp->cfg0_base,
|
pp->va_cfg0_base = devm_pci_remap_cfgspace(dev,
|
||||||
pp->cfg0_size);
|
pp->cfg0_base, pp->cfg0_size);
|
||||||
if (!pp->va_cfg0_base) {
|
if (!pp->va_cfg0_base) {
|
||||||
dev_err(dev, "error with ioremap in function\n");
|
dev_err(dev, "error with ioremap in function\n");
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
@ -361,7 +362,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pp->va_cfg1_base) {
|
if (!pp->va_cfg1_base) {
|
||||||
pp->va_cfg1_base = devm_ioremap(dev, pp->cfg1_base,
|
pp->va_cfg1_base = devm_pci_remap_cfgspace(dev,
|
||||||
|
pp->cfg1_base,
|
||||||
pp->cfg1_size);
|
pp->cfg1_size);
|
||||||
if (!pp->va_cfg1_base) {
|
if (!pp->va_cfg1_base) {
|
||||||
dev_err(dev, "error with ioremap\n");
|
dev_err(dev, "error with ioremap\n");
|
||||||
|
|
|
@ -99,7 +99,7 @@ static int hisi_pcie_init(struct pci_config_window *cfg)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
reg_base = devm_ioremap(dev, res->start, resource_size(res));
|
reg_base = devm_pci_remap_cfgspace(dev, res->start, resource_size(res));
|
||||||
if (!reg_base)
|
if (!reg_base)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
@ -296,10 +296,9 @@ static int hisi_pcie_probe(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
reg = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rc_dbi");
|
reg = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rc_dbi");
|
||||||
pci->dbi_base = devm_ioremap_resource(dev, reg);
|
pci->dbi_base = devm_pci_remap_cfg_resource(dev, reg);
|
||||||
if (IS_ERR(pci->dbi_base))
|
if (IS_ERR(pci->dbi_base))
|
||||||
return PTR_ERR(pci->dbi_base);
|
return PTR_ERR(pci->dbi_base);
|
||||||
|
|
||||||
platform_set_drvdata(pdev, hisi_pcie);
|
platform_set_drvdata(pdev, hisi_pcie);
|
||||||
|
|
||||||
ret = hisi_add_pcie_port(hisi_pcie, pdev);
|
ret = hisi_add_pcie_port(hisi_pcie, pdev);
|
||||||
|
@ -360,7 +359,7 @@ static int hisi_pcie_platform_init(struct pci_config_window *cfg)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
reg_base = devm_ioremap(dev, res->start, resource_size(res));
|
reg_base = devm_pci_remap_cfgspace(dev, res->start, resource_size(res));
|
||||||
if (!reg_base)
|
if (!reg_base)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
|
|
@ -700,7 +700,7 @@ static int qcom_pcie_probe(struct platform_device *pdev)
|
||||||
return PTR_ERR(pcie->parf);
|
return PTR_ERR(pcie->parf);
|
||||||
|
|
||||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi");
|
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi");
|
||||||
pci->dbi_base = devm_ioremap_resource(dev, res);
|
pci->dbi_base = devm_pci_remap_cfg_resource(dev, res);
|
||||||
if (IS_ERR(pci->dbi_base))
|
if (IS_ERR(pci->dbi_base))
|
||||||
return PTR_ERR(pci->dbi_base);
|
return PTR_ERR(pci->dbi_base);
|
||||||
|
|
||||||
|
|
|
@ -273,7 +273,7 @@ static int spear13xx_pcie_probe(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
dbi_base = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi");
|
dbi_base = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi");
|
||||||
pci->dbi_base = devm_ioremap_resource(dev, dbi_base);
|
pci->dbi_base = devm_pci_remap_cfg_resource(dev, dbi_base);
|
||||||
if (IS_ERR(pci->dbi_base)) {
|
if (IS_ERR(pci->dbi_base)) {
|
||||||
dev_err(dev, "couldn't remap dbi base %p\n", dbi_base);
|
dev_err(dev, "couldn't remap dbi base %p\n", dbi_base);
|
||||||
ret = PTR_ERR(pci->dbi_base);
|
ret = PTR_ERR(pci->dbi_base);
|
||||||
|
|
|
@ -84,12 +84,14 @@ struct pci_config_window *pci_ecam_create(struct device *dev,
|
||||||
if (!cfg->winp)
|
if (!cfg->winp)
|
||||||
goto err_exit_malloc;
|
goto err_exit_malloc;
|
||||||
for (i = 0; i < bus_range; i++) {
|
for (i = 0; i < bus_range; i++) {
|
||||||
cfg->winp[i] = ioremap(cfgres->start + i * bsz, bsz);
|
cfg->winp[i] =
|
||||||
|
pci_remap_cfgspace(cfgres->start + i * bsz,
|
||||||
|
bsz);
|
||||||
if (!cfg->winp[i])
|
if (!cfg->winp[i])
|
||||||
goto err_exit_iomap;
|
goto err_exit_iomap;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
cfg->win = ioremap(cfgres->start, bus_range * bsz);
|
cfg->win = pci_remap_cfgspace(cfgres->start, bus_range * bsz);
|
||||||
if (!cfg->win)
|
if (!cfg->win)
|
||||||
goto err_exit_iomap;
|
goto err_exit_iomap;
|
||||||
}
|
}
|
||||||
|
|
|
@ -380,7 +380,7 @@ static struct tegra_pcie_bus *tegra_pcie_bus_alloc(struct tegra_pcie *pcie,
|
||||||
unsigned int busnr)
|
unsigned int busnr)
|
||||||
{
|
{
|
||||||
struct device *dev = pcie->dev;
|
struct device *dev = pcie->dev;
|
||||||
pgprot_t prot = pgprot_device(PAGE_KERNEL);
|
pgprot_t prot = pgprot_noncached(PAGE_KERNEL);
|
||||||
phys_addr_t cs = pcie->cs->start;
|
phys_addr_t cs = pcie->cs->start;
|
||||||
struct tegra_pcie_bus *bus;
|
struct tegra_pcie_bus *bus;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@ -1962,7 +1962,7 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)
|
||||||
rp->pcie = pcie;
|
rp->pcie = pcie;
|
||||||
rp->np = port;
|
rp->np = port;
|
||||||
|
|
||||||
rp->base = devm_ioremap_resource(dev, &rp->regs);
|
rp->base = devm_pci_remap_cfg_resource(dev, &rp->regs);
|
||||||
if (IS_ERR(rp->base))
|
if (IS_ERR(rp->base))
|
||||||
return PTR_ERR(rp->base);
|
return PTR_ERR(rp->base);
|
||||||
|
|
||||||
|
|
|
@ -138,7 +138,8 @@ static int versatile_pci_probe(struct platform_device *pdev)
|
||||||
return PTR_ERR(versatile_cfg_base[0]);
|
return PTR_ERR(versatile_cfg_base[0]);
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
|
||||||
versatile_cfg_base[1] = devm_ioremap_resource(&pdev->dev, res);
|
versatile_cfg_base[1] = devm_pci_remap_cfg_resource(&pdev->dev,
|
||||||
|
res);
|
||||||
if (IS_ERR(versatile_cfg_base[1]))
|
if (IS_ERR(versatile_cfg_base[1]))
|
||||||
return PTR_ERR(versatile_cfg_base[1]);
|
return PTR_ERR(versatile_cfg_base[1]);
|
||||||
|
|
||||||
|
|
|
@ -248,7 +248,7 @@ static int xgene_pcie_ecam_init(struct pci_config_window *cfg, u32 ipversion)
|
||||||
dev_err(dev, "can't get CSR resource\n");
|
dev_err(dev, "can't get CSR resource\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
port->csr_base = devm_ioremap_resource(dev, &csr);
|
port->csr_base = devm_pci_remap_cfg_resource(dev, &csr);
|
||||||
if (IS_ERR(port->csr_base))
|
if (IS_ERR(port->csr_base))
|
||||||
return PTR_ERR(port->csr_base);
|
return PTR_ERR(port->csr_base);
|
||||||
|
|
||||||
|
@ -359,7 +359,7 @@ static int xgene_pcie_map_reg(struct xgene_pcie_port *port,
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
|
|
||||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "csr");
|
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "csr");
|
||||||
port->csr_base = devm_ioremap_resource(dev, res);
|
port->csr_base = devm_pci_remap_cfg_resource(dev, res);
|
||||||
if (IS_ERR(port->csr_base))
|
if (IS_ERR(port->csr_base))
|
||||||
return PTR_ERR(port->csr_base);
|
return PTR_ERR(port->csr_base);
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,8 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
pcie->base = devm_ioremap(dev, reg.start, resource_size(®));
|
pcie->base = devm_pci_remap_cfgspace(dev, reg.start,
|
||||||
|
resource_size(®));
|
||||||
if (!pcie->base) {
|
if (!pcie->base) {
|
||||||
dev_err(dev, "unable to map controller registers\n");
|
dev_err(dev, "unable to map controller registers\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
|
@ -832,7 +832,7 @@ static int rockchip_pcie_parse_dt(struct rockchip_pcie *rockchip)
|
||||||
regs = platform_get_resource_byname(pdev,
|
regs = platform_get_resource_byname(pdev,
|
||||||
IORESOURCE_MEM,
|
IORESOURCE_MEM,
|
||||||
"axi-base");
|
"axi-base");
|
||||||
rockchip->reg_base = devm_ioremap_resource(dev, regs);
|
rockchip->reg_base = devm_pci_remap_cfg_resource(dev, regs);
|
||||||
if (IS_ERR(rockchip->reg_base))
|
if (IS_ERR(rockchip->reg_base))
|
||||||
return PTR_ERR(rockchip->reg_base);
|
return PTR_ERR(rockchip->reg_base);
|
||||||
|
|
||||||
|
|
|
@ -761,7 +761,7 @@ static int nwl_pcie_parse_dt(struct nwl_pcie *pcie,
|
||||||
pcie->phys_pcie_reg_base = res->start;
|
pcie->phys_pcie_reg_base = res->start;
|
||||||
|
|
||||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cfg");
|
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cfg");
|
||||||
pcie->ecam_base = devm_ioremap_resource(dev, res);
|
pcie->ecam_base = devm_pci_remap_cfg_resource(dev, res);
|
||||||
if (IS_ERR(pcie->ecam_base))
|
if (IS_ERR(pcie->ecam_base))
|
||||||
return PTR_ERR(pcie->ecam_base);
|
return PTR_ERR(pcie->ecam_base);
|
||||||
pcie->phys_ecam_base = res->start;
|
pcie->phys_ecam_base = res->start;
|
||||||
|
|
|
@ -606,7 +606,7 @@ static int xilinx_pcie_parse_dt(struct xilinx_pcie_port *port)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
port->reg_base = devm_ioremap_resource(dev, ®s);
|
port->reg_base = devm_pci_remap_cfg_resource(dev, ®s);
|
||||||
if (IS_ERR(port->reg_base))
|
if (IS_ERR(port->reg_base))
|
||||||
return PTR_ERR(port->reg_base);
|
return PTR_ERR(port->reg_base);
|
||||||
|
|
||||||
|
|
|
@ -3363,7 +3363,7 @@ unsigned long __weak pci_address_to_pio(phys_addr_t address)
|
||||||
* Only architectures that have memory mapped IO functions defined
|
* Only architectures that have memory mapped IO functions defined
|
||||||
* (and the PCI_IOBASE value defined) should call this function.
|
* (and the PCI_IOBASE value defined) should call this function.
|
||||||
*/
|
*/
|
||||||
int __weak pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
|
int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)
|
||||||
{
|
{
|
||||||
#if defined(PCI_IOBASE) && defined(CONFIG_MMU)
|
#if defined(PCI_IOBASE) && defined(CONFIG_MMU)
|
||||||
unsigned long vaddr = (unsigned long)PCI_IOBASE + res->start;
|
unsigned long vaddr = (unsigned long)PCI_IOBASE + res->start;
|
||||||
|
@ -3403,6 +3403,88 @@ void pci_unmap_iospace(struct resource *res)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(pci_unmap_iospace);
|
EXPORT_SYMBOL(pci_unmap_iospace);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* devm_pci_remap_cfgspace - Managed pci_remap_cfgspace()
|
||||||
|
* @dev: Generic device to remap IO address for
|
||||||
|
* @offset: Resource address 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);
|
||||||
|
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)
|
static void __pci_set_master(struct pci_dev *dev, bool enable)
|
||||||
{
|
{
|
||||||
u16 old_cmd, cmd;
|
u16 old_cmd, cmd;
|
||||||
|
|
|
@ -90,6 +90,27 @@ void devm_memunmap(struct device *dev, void *addr);
|
||||||
|
|
||||||
void *__devm_memremap_pages(struct device *dev, struct resource *res);
|
void *__devm_memremap_pages(struct device *dev, struct resource *res);
|
||||||
|
|
||||||
|
#ifdef CONFIG_PCI
|
||||||
|
/*
|
||||||
|
* The PCI specifications (Rev 3.0, 3.2.5 "Transaction Ordering and
|
||||||
|
* Posting") mandate non-posted configuration transactions. There is
|
||||||
|
* no ioremap API in the kernel that can guarantee non-posted write
|
||||||
|
* semantics across arches so provide a default implementation for
|
||||||
|
* mapping PCI config space that defaults to ioremap_nocache(); arches
|
||||||
|
* should override it if they have memory mapping implementations that
|
||||||
|
* guarantee non-posted writes semantics to make the memory mapping
|
||||||
|
* compliant with the PCI specification.
|
||||||
|
*/
|
||||||
|
#ifndef pci_remap_cfgspace
|
||||||
|
#define pci_remap_cfgspace pci_remap_cfgspace
|
||||||
|
static inline void __iomem *pci_remap_cfgspace(phys_addr_t offset,
|
||||||
|
size_t size)
|
||||||
|
{
|
||||||
|
return ioremap_nocache(offset, size);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some systems do not have legacy ISA devices.
|
* Some systems do not have legacy ISA devices.
|
||||||
* /dev/port is not a valid interface on these systems.
|
* /dev/port is not a valid interface on these systems.
|
||||||
|
|
|
@ -1183,6 +1183,11 @@ unsigned long pci_address_to_pio(phys_addr_t addr);
|
||||||
phys_addr_t pci_pio_to_address(unsigned long pio);
|
phys_addr_t pci_pio_to_address(unsigned long pio);
|
||||||
int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr);
|
int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr);
|
||||||
void pci_unmap_iospace(struct resource *res);
|
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)
|
static inline pci_bus_addr_t pci_bus_address(struct pci_dev *pdev, int bar)
|
||||||
{
|
{
|
||||||
|
|
|
@ -17,7 +17,7 @@ static int devm_ioremap_match(struct device *dev, void *res, void *match_data)
|
||||||
/**
|
/**
|
||||||
* devm_ioremap - Managed ioremap()
|
* devm_ioremap - Managed ioremap()
|
||||||
* @dev: Generic device to remap IO address for
|
* @dev: Generic device to remap IO address for
|
||||||
* @offset: BUS offset to map
|
* @offset: Resource address to map
|
||||||
* @size: Size of map
|
* @size: Size of map
|
||||||
*
|
*
|
||||||
* Managed ioremap(). Map is automatically unmapped on driver detach.
|
* Managed ioremap(). Map is automatically unmapped on driver detach.
|
||||||
|
@ -45,7 +45,7 @@ EXPORT_SYMBOL(devm_ioremap);
|
||||||
/**
|
/**
|
||||||
* devm_ioremap_nocache - Managed ioremap_nocache()
|
* devm_ioremap_nocache - Managed ioremap_nocache()
|
||||||
* @dev: Generic device to remap IO address for
|
* @dev: Generic device to remap IO address for
|
||||||
* @offset: BUS offset to map
|
* @offset: Resource address to map
|
||||||
* @size: Size of map
|
* @size: Size of map
|
||||||
*
|
*
|
||||||
* Managed ioremap_nocache(). Map is automatically unmapped on driver
|
* Managed ioremap_nocache(). Map is automatically unmapped on driver
|
||||||
|
@ -74,7 +74,7 @@ EXPORT_SYMBOL(devm_ioremap_nocache);
|
||||||
/**
|
/**
|
||||||
* devm_ioremap_wc - Managed ioremap_wc()
|
* devm_ioremap_wc - Managed ioremap_wc()
|
||||||
* @dev: Generic device to remap IO address for
|
* @dev: Generic device to remap IO address for
|
||||||
* @offset: BUS offset to map
|
* @offset: Resource address to map
|
||||||
* @size: Size of map
|
* @size: Size of map
|
||||||
*
|
*
|
||||||
* Managed ioremap_wc(). Map is automatically unmapped on driver detach.
|
* Managed ioremap_wc(). Map is automatically unmapped on driver detach.
|
||||||
|
|
Загрузка…
Ссылка в новой задаче