Skip to content

Commit 088c840

Browse files
committed
PCI: hisi: Avoid invalid address space conversions
The sparse checker complains about converting pointers between address spaces. The pci_config_window.priv pointer is a generic void *, but hisi_pcie_map_bus() needs a void __iomem *. This isn't a problem in other drivers because they store the __iomem pointer in a driver struct. Add a trivial struct hisi_pcie to avoid the warning. The sparse warning looks like this: $ make C=2 drivers/pci/controller/ drivers/pci/controller/dwc/pcie-hisi.c:61:37: warning: incorrect type in initializer (different address spaces) drivers/pci/controller/dwc/pcie-hisi.c:61:37: expected void [noderef] __iomem *reg_base drivers/pci/controller/dwc/pcie-hisi.c:61:37: got void *priv Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Bjorn Helgaas <[email protected]> Cc: Zhou Wang <[email protected]>
1 parent dacee58 commit 088c840

File tree

1 file changed

+22
-10
lines changed

1 file changed

+22
-10
lines changed

drivers/pci/controller/dwc/pcie-hisi.c

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818

1919
#if defined(CONFIG_PCI_HISI) || (defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS))
2020

21+
struct hisi_pcie {
22+
void __iomem *reg_base;
23+
};
24+
2125
static int hisi_pcie_rd_conf(struct pci_bus *bus, u32 devfn, int where,
2226
int size, u32 *val)
2327
{
@@ -58,10 +62,10 @@ static void __iomem *hisi_pcie_map_bus(struct pci_bus *bus, unsigned int devfn,
5862
int where)
5963
{
6064
struct pci_config_window *cfg = bus->sysdata;
61-
void __iomem *reg_base = cfg->priv;
65+
struct hisi_pcie *pcie = cfg->priv;
6266

6367
if (bus->number == cfg->busr.start)
64-
return reg_base + where;
68+
return pcie->reg_base + where;
6569
else
6670
return pci_ecam_map_bus(bus, devfn, where);
6771
}
@@ -71,12 +75,16 @@ static void __iomem *hisi_pcie_map_bus(struct pci_bus *bus, unsigned int devfn,
7175
static int hisi_pcie_init(struct pci_config_window *cfg)
7276
{
7377
struct device *dev = cfg->parent;
78+
struct hisi_pcie *pcie;
7479
struct acpi_device *adev = to_acpi_device(dev);
7580
struct acpi_pci_root *root = acpi_driver_data(adev);
7681
struct resource *res;
77-
void __iomem *reg_base;
7882
int ret;
7983

84+
pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL);
85+
if (!pcie)
86+
return -ENOMEM;
87+
8088
/*
8189
* Retrieve RC base and size from a HISI0081 device with _UID
8290
* matching our segment.
@@ -91,11 +99,11 @@ static int hisi_pcie_init(struct pci_config_window *cfg)
9199
return -ENOMEM;
92100
}
93101

94-
reg_base = devm_pci_remap_cfgspace(dev, res->start, resource_size(res));
95-
if (!reg_base)
102+
pcie->reg_base = devm_pci_remap_cfgspace(dev, res->start, resource_size(res));
103+
if (!pcie->reg_base)
96104
return -ENOMEM;
97105

98-
cfg->priv = reg_base;
106+
cfg->priv = pcie;
99107
return 0;
100108
}
101109

@@ -115,21 +123,25 @@ const struct pci_ecam_ops hisi_pcie_ops = {
115123
static int hisi_pcie_platform_init(struct pci_config_window *cfg)
116124
{
117125
struct device *dev = cfg->parent;
126+
struct hisi_pcie *pcie;
118127
struct platform_device *pdev = to_platform_device(dev);
119128
struct resource *res;
120-
void __iomem *reg_base;
129+
130+
pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL);
131+
if (!pcie)
132+
return -ENOMEM;
121133

122134
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
123135
if (!res) {
124136
dev_err(dev, "missing \"reg[1]\"property\n");
125137
return -EINVAL;
126138
}
127139

128-
reg_base = devm_pci_remap_cfgspace(dev, res->start, resource_size(res));
129-
if (!reg_base)
140+
pcie->reg_base = devm_pci_remap_cfgspace(dev, res->start, resource_size(res));
141+
if (!pcie->reg_base)
130142
return -ENOMEM;
131143

132-
cfg->priv = reg_base;
144+
cfg->priv = pcie;
133145
return 0;
134146
}
135147

0 commit comments

Comments
 (0)