mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-13 16:40:22 +00:00
powerpc: Make OF PCI device tree accesses endian safe
Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
7560d32757
commit
a795dc548a
@ -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,
|
|||||||
/* 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,
|
|||||||
/* 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 @@
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user