提交 a795dc54 编写于 作者: A Anton Blanchard 提交者: Benjamin Herrenschmidt

powerpc: Make OF PCI device tree accesses endian safe

Signed-off-by: NAnton Blanchard <anton@samba.org>
Signed-off-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
上级 7560d327
...@@ -667,7 +667,7 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar, ...@@ -667,7 +667,7 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar,
void pci_process_bridge_OF_ranges(struct pci_controller *hose, void pci_process_bridge_OF_ranges(struct pci_controller *hose,
struct device_node *dev, int primary) struct device_node *dev, int primary)
{ {
const u32 *ranges; const __be32 *ranges;
int rlen; int rlen;
int pna = of_n_addr_cells(dev); int pna = of_n_addr_cells(dev);
int np = pna + 5; int np = pna + 5;
...@@ -687,7 +687,7 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose, ...@@ -687,7 +687,7 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
/* Parse it */ /* Parse it */
while ((rlen -= np * 4) >= 0) { while ((rlen -= np * 4) >= 0) {
/* Read next ranges element */ /* Read next ranges element */
pci_space = ranges[0]; pci_space = of_read_number(ranges, 1);
pci_addr = of_read_number(ranges + 1, 2); pci_addr = of_read_number(ranges + 1, 2);
cpu_addr = of_translate_address(dev, ranges + 3); cpu_addr = of_translate_address(dev, ranges + 3);
size = of_read_number(ranges + pna + 3, 2); size = of_read_number(ranges + pna + 3, 2);
...@@ -704,7 +704,7 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose, ...@@ -704,7 +704,7 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
/* Now consume following elements while they are contiguous */ /* Now consume following elements while they are contiguous */
for (; rlen >= np * sizeof(u32); for (; rlen >= np * sizeof(u32);
ranges += np, rlen -= np * 4) { ranges += np, rlen -= np * 4) {
if (ranges[0] != pci_space) if (of_read_number(ranges, 1) != pci_space)
break; break;
pci_next = of_read_number(ranges + 1, 2); pci_next = of_read_number(ranges + 1, 2);
cpu_next = of_translate_address(dev, ranges + 3); cpu_next = of_translate_address(dev, ranges + 3);
......
...@@ -24,12 +24,12 @@ ...@@ -24,12 +24,12 @@
*/ */
static u32 get_int_prop(struct device_node *np, const char *name, u32 def) static u32 get_int_prop(struct device_node *np, const char *name, u32 def)
{ {
const u32 *prop; const __be32 *prop;
int len; int len;
prop = of_get_property(np, name, &len); prop = of_get_property(np, name, &len);
if (prop && len >= 4) if (prop && len >= 4)
return *prop; return of_read_number(prop, 1);
return def; return def;
} }
...@@ -77,7 +77,7 @@ static void of_pci_parse_addrs(struct device_node *node, struct pci_dev *dev) ...@@ -77,7 +77,7 @@ static void of_pci_parse_addrs(struct device_node *node, struct pci_dev *dev)
unsigned int flags; unsigned int flags;
struct pci_bus_region region; struct pci_bus_region region;
struct resource *res; struct resource *res;
const u32 *addrs; const __be32 *addrs;
u32 i; u32 i;
int proplen; int proplen;
...@@ -86,14 +86,14 @@ static void of_pci_parse_addrs(struct device_node *node, struct pci_dev *dev) ...@@ -86,14 +86,14 @@ static void of_pci_parse_addrs(struct device_node *node, struct pci_dev *dev)
return; return;
pr_debug(" parse addresses (%d bytes) @ %p\n", proplen, addrs); pr_debug(" parse addresses (%d bytes) @ %p\n", proplen, addrs);
for (; proplen >= 20; proplen -= 20, addrs += 5) { for (; proplen >= 20; proplen -= 20, addrs += 5) {
flags = pci_parse_of_flags(addrs[0], 0); flags = pci_parse_of_flags(of_read_number(addrs, 1), 0);
if (!flags) if (!flags)
continue; continue;
base = of_read_number(&addrs[1], 2); base = of_read_number(&addrs[1], 2);
size = of_read_number(&addrs[3], 2); size = of_read_number(&addrs[3], 2);
if (!size) if (!size)
continue; continue;
i = addrs[0] & 0xff; i = of_read_number(addrs, 1) & 0xff;
pr_debug(" base: %llx, size: %llx, i: %x\n", pr_debug(" base: %llx, size: %llx, i: %x\n",
(unsigned long long)base, (unsigned long long)base,
(unsigned long long)size, i); (unsigned long long)size, i);
...@@ -207,7 +207,7 @@ void of_scan_pci_bridge(struct pci_dev *dev) ...@@ -207,7 +207,7 @@ void of_scan_pci_bridge(struct pci_dev *dev)
{ {
struct device_node *node = dev->dev.of_node; struct device_node *node = dev->dev.of_node;
struct pci_bus *bus; struct pci_bus *bus;
const u32 *busrange, *ranges; const __be32 *busrange, *ranges;
int len, i, mode; int len, i, mode;
struct pci_bus_region region; struct pci_bus_region region;
struct resource *res; struct resource *res;
...@@ -230,9 +230,11 @@ void of_scan_pci_bridge(struct pci_dev *dev) ...@@ -230,9 +230,11 @@ void of_scan_pci_bridge(struct pci_dev *dev)
return; return;
} }
bus = pci_find_bus(pci_domain_nr(dev->bus), busrange[0]); bus = pci_find_bus(pci_domain_nr(dev->bus),
of_read_number(busrange, 1));
if (!bus) { if (!bus) {
bus = pci_add_new_bus(dev->bus, dev, busrange[0]); bus = pci_add_new_bus(dev->bus, dev,
of_read_number(busrange, 1));
if (!bus) { if (!bus) {
printk(KERN_ERR "Failed to create pci bus for %s\n", printk(KERN_ERR "Failed to create pci bus for %s\n",
node->full_name); node->full_name);
...@@ -241,7 +243,8 @@ void of_scan_pci_bridge(struct pci_dev *dev) ...@@ -241,7 +243,8 @@ void of_scan_pci_bridge(struct pci_dev *dev)
} }
bus->primary = dev->bus->number; bus->primary = dev->bus->number;
pci_bus_insert_busn_res(bus, busrange[0], busrange[1]); pci_bus_insert_busn_res(bus, of_read_number(busrange, 1),
of_read_number(busrange+1, 1));
bus->bridge_ctl = 0; bus->bridge_ctl = 0;
/* parse ranges property */ /* parse ranges property */
...@@ -254,7 +257,7 @@ void of_scan_pci_bridge(struct pci_dev *dev) ...@@ -254,7 +257,7 @@ void of_scan_pci_bridge(struct pci_dev *dev)
} }
i = 1; i = 1;
for (; len >= 32; len -= 32, ranges += 8) { for (; len >= 32; len -= 32, ranges += 8) {
flags = pci_parse_of_flags(ranges[0], 1); flags = pci_parse_of_flags(of_read_number(ranges, 1), 1);
size = of_read_number(&ranges[6], 2); size = of_read_number(&ranges[6], 2);
if (flags == 0 || size == 0) if (flags == 0 || size == 0)
continue; continue;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册