2 #include <linux/device.h>
5 #include <linux/module.h>
8 #include <linux/string.h>
11 #define OF_MAX_ADDR_CELLS 4
12 #define OF_CHECK_ADDR_COUNT(na) ((na) > 0 && (na) <= OF_MAX_ADDR_CELLS)
13 #define OF_CHECK_COUNTS(na, ns) (OF_CHECK_ADDR_COUNT(na) && (ns) > 0)
22 static void of_dump_addr(
const char *
s,
const __be32 *
addr,
int na)
30 static void of_dump_addr(
const char *s,
const __be32 *addr,
int na) { }
39 int *addrc,
int *sizec);
41 int na,
int ns,
int pna);
51 int *addrc,
int *sizec)
60 int na,
int ns,
int pna)
64 cp = of_read_number(range, na);
65 s = of_read_number(range + na + pna, ns);
66 da = of_read_number(addr, na);
68 pr_debug(
"OF: default map, cp=%llx, s=%llx, da=%llx\n",
69 (
unsigned long long)cp, (
unsigned long long)s,
70 (
unsigned long long)da);
77 if (na > 2 &&
memcmp(range, addr, na * 4) != 0)
80 if (da < cp || da >= (cp + s))
87 u64 a = of_read_number(addr, na);
107 static int of_bus_pci_match(
struct device_node *np)
113 static void of_bus_pci_count_cells(
struct device_node *np,
114 int *addrc,
int *sizec)
122 static unsigned int of_bus_pci_get_flags(
const __be32 *addr)
124 unsigned int flags = 0;
127 switch((w >> 24) & 0x03) {
141 static u64 of_bus_pci_map(
__be32 *addr,
const __be32 *range,
int na,
int ns,
147 af = of_bus_pci_get_flags(addr);
148 rf = of_bus_pci_get_flags(range);
155 cp = of_read_number(range + 1, na - 1);
156 s = of_read_number(range + na + pna, ns);
157 da = of_read_number(addr + 1, na - 1);
159 pr_debug(
"OF: PCI map, cp=%llx, s=%llx, da=%llx\n",
160 (
unsigned long long)cp, (
unsigned long long)s,
161 (
unsigned long long)da);
163 if (da < cp || da >= (cp + s))
168 static int of_bus_pci_translate(
__be32 *addr,
u64 offset,
int na)
170 return of_bus_default_translate(addr + 1, offset, na - 1);
180 int onesize,
i, na,
ns;
186 bus = of_match_bus(parent);
203 for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++) {
207 *size = of_read_number(prop + na, ns);
217 int of_pci_address_to_resource(
struct device_node *dev,
int bar,
224 addrp = of_get_pci_address(dev, bar, &size, &flags);
227 return __of_address_to_resource(dev, addrp, size, flags,
NULL, r);
236 static int of_bus_isa_match(
struct device_node *np)
242 int *addrc,
int *sizec)
250 static u64 of_bus_isa_map(
__be32 *addr,
const __be32 *range,
int na,
int ns,
260 cp = of_read_number(range + 1, na - 1);
261 s = of_read_number(range + na + pna, ns);
262 da = of_read_number(addr + 1, na - 1);
264 pr_debug(
"OF: ISA map, cp=%llx, s=%llx, da=%llx\n",
265 (
unsigned long long)cp, (
unsigned long long)s,
266 (
unsigned long long)da);
268 if (da < cp || da >= (cp + s))
273 static int of_bus_isa_translate(
__be32 *addr,
u64 offset,
int na)
275 return of_bus_default_translate(addr + 1, offset, na - 1);
278 static unsigned int of_bus_isa_get_flags(
const __be32 *addr)
280 unsigned int flags = 0;
294 static struct of_bus of_busses[] = {
299 .addresses =
"assigned-addresses",
300 .match = of_bus_pci_match,
301 .count_cells = of_bus_pci_count_cells,
302 .map = of_bus_pci_map,
303 .translate = of_bus_pci_translate,
304 .get_flags = of_bus_pci_get_flags,
311 .match = of_bus_isa_match,
312 .count_cells = of_bus_isa_count_cells,
313 .map = of_bus_isa_map,
314 .translate = of_bus_isa_translate,
315 .get_flags = of_bus_isa_get_flags,
324 .translate = of_bus_default_translate,
334 if (!of_busses[i].
match || of_busses[i].
match(np))
335 return &of_busses[i];
342 int na,
int ns,
int pna,
const char *rprop)
347 u64 offset = OF_BAD_ADDR;
365 #if !defined(CONFIG_PPC)
366 if (ranges ==
NULL) {
367 pr_err(
"OF: no ranges; cannot translate\n");
371 if (ranges ==
NULL || rlen == 0) {
372 offset = of_read_number(addr, na);
374 pr_debug(
"OF: empty ranges; 1:1 translation\n");
378 pr_debug(
"OF: walking ranges...\n");
382 rone = na + pna +
ns;
383 for (; rlen >= rone; rlen -= rone, ranges += rone) {
384 offset = bus->
map(addr, ranges, na, ns, pna);
385 if (offset != OF_BAD_ADDR)
388 if (offset == OF_BAD_ADDR) {
392 memcpy(addr, ranges + na, 4 * pna);
395 of_dump_addr(
"OF: parent translation for:", addr, pna);
396 pr_debug(
"OF: with offset: %llx\n", (
unsigned long long)offset);
399 return pbus->
translate(addr, offset, pna);
418 int na,
ns, pna, pns;
430 bus = of_match_bus(parent);
439 memcpy(addr, in_addr, na * 4);
441 pr_debug(
"OF: bus is %s (na=%d, ns=%d) on %s\n",
443 of_dump_addr(
"OF: translating address:", addr, na);
453 if (parent ==
NULL) {
454 pr_debug(
"OF: reached root node\n");
455 result = of_read_number(addr, na);
460 pbus = of_match_bus(parent);
468 pr_debug(
"OF: parent bus is %s (na=%d, ns=%d) on %s\n",
472 if (of_translate_one(dev, bus, pbus, addr, na, ns, pna, rprop))
480 of_dump_addr(
"OF: one level translation:", addr, na);
491 return __of_translate_address(dev, in_addr,
"ranges");
497 return __of_translate_address(dev, in_addr,
"dma-ranges");
511 bus = of_match_bus(parent);
527 int onesize,
i, na,
ns;
533 bus = of_match_bus(parent);
546 for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++)
549 *size = of_read_number(prop + na, ns);
558 static int __of_address_to_resource(
struct device_node *dev,
559 const __be32 *addrp,
u64 size,
unsigned int flags,
567 if (taddr == OF_BAD_ADDR)
573 if (port == (
unsigned long)-1)
576 r->
end = port + size - 1;
579 r->
end = taddr + size - 1;
601 const char *name =
NULL;
610 return __of_address_to_resource(dev, addrp, size, flags, name, r);
624 if (res.
start == base_address)