3 #include <linux/kernel.h>
4 #include <linux/string.h>
5 #include <linux/pci_regs.h>
6 #include <linux/module.h>
7 #include <linux/ioport.h>
9 #include <asm/pci-bridge.h>
12 #define DBG(fmt...) do { printk(fmt); } while(0)
14 #define DBG(fmt...) do { } while(0)
23 /* Max address size we deal with */
24 #define OF_MAX_ADDR_CELLS 4
25 #define OF_CHECK_COUNTS(na, ns) ((na) > 0 && (na) <= OF_MAX_ADDR_CELLS && \
30 static void of_dump_addr(const char *s, u32 *addr, int na)
34 printk(" %08x", *(addr++));
38 static void of_dump_addr(const char *s, u32 *addr, int na) { }
41 /* Read a big address */
42 static inline u64 of_read_addr(u32 *cell, int size)
46 r = (r << 32) | *(cell++);
50 /* Callbacks for bus specific translators */
53 const char *addresses;
54 int (*match)(struct device_node *parent);
55 void (*count_cells)(struct device_node *child,
56 int *addrc, int *sizec);
57 u64 (*map)(u32 *addr, u32 *range, int na, int ns, int pna);
58 int (*translate)(u32 *addr, u64 offset, int na);
59 unsigned int (*get_flags)(u32 *addr);
64 * Default translator (generic bus)
67 static void of_bus_default_count_cells(struct device_node *dev,
68 int *addrc, int *sizec)
71 *addrc = prom_n_addr_cells(dev);
73 *sizec = prom_n_size_cells(dev);
76 static u64 of_bus_default_map(u32 *addr, u32 *range, int na, int ns, int pna)
80 cp = of_read_addr(range, na);
81 s = of_read_addr(range + na + pna, ns);
82 da = of_read_addr(addr, na);
84 DBG("OF: default map, cp="PRu64", s="PRu64", da="PRu64"\n",
87 if (da < cp || da >= (cp + s))
92 static int of_bus_default_translate(u32 *addr, u64 offset, int na)
94 u64 a = of_read_addr(addr, na);
95 memset(addr, 0, na * 4);
98 addr[na - 2] = a >> 32;
99 addr[na - 1] = a & 0xffffffffu;
104 static unsigned int of_bus_default_get_flags(u32 *addr)
106 return IORESOURCE_MEM;
111 * PCI bus specific translator
114 static int of_bus_pci_match(struct device_node *np)
116 /* "vci" is for the /chaos bridge on 1st-gen PCI powermacs */
117 return !strcmp(np->type, "pci") || !strcmp(np->type, "vci");
120 static void of_bus_pci_count_cells(struct device_node *np,
121 int *addrc, int *sizec)
129 static u64 of_bus_pci_map(u32 *addr, u32 *range, int na, int ns, int pna)
133 /* Check address type match */
134 if ((addr[0] ^ range[0]) & 0x03000000)
137 /* Read address values, skipping high cell */
138 cp = of_read_addr(range + 1, na - 1);
139 s = of_read_addr(range + na + pna, ns);
140 da = of_read_addr(addr + 1, na - 1);
142 DBG("OF: PCI map, cp="PRu64", s="PRu64", da="PRu64"\n", cp, s, da);
144 if (da < cp || da >= (cp + s))
149 static int of_bus_pci_translate(u32 *addr, u64 offset, int na)
151 return of_bus_default_translate(addr + 1, offset, na - 1);
154 static unsigned int of_bus_pci_get_flags(u32 *addr)
156 unsigned int flags = 0;
159 switch((w >> 24) & 0x03) {
161 flags |= IORESOURCE_IO;
162 case 0x02: /* 32 bits */
163 case 0x03: /* 64 bits */
164 flags |= IORESOURCE_MEM;
167 flags |= IORESOURCE_PREFETCH;
172 * ISA bus specific translator
175 static int of_bus_isa_match(struct device_node *np)
177 return !strcmp(np->name, "isa");
180 static void of_bus_isa_count_cells(struct device_node *child,
181 int *addrc, int *sizec)
189 static u64 of_bus_isa_map(u32 *addr, u32 *range, int na, int ns, int pna)
193 /* Check address type match */
194 if ((addr[0] ^ range[0]) & 0x00000001)
197 /* Read address values, skipping high cell */
198 cp = of_read_addr(range + 1, na - 1);
199 s = of_read_addr(range + na + pna, ns);
200 da = of_read_addr(addr + 1, na - 1);
202 DBG("OF: ISA map, cp="PRu64", s="PRu64", da="PRu64"\n", cp, s, da);
204 if (da < cp || da >= (cp + s))
209 static int of_bus_isa_translate(u32 *addr, u64 offset, int na)
211 return of_bus_default_translate(addr + 1, offset, na - 1);
214 static unsigned int of_bus_isa_get_flags(u32 *addr)
216 unsigned int flags = 0;
220 flags |= IORESOURCE_IO;
222 flags |= IORESOURCE_MEM;
228 * Array of bus specific translators
231 static struct of_bus of_busses[] = {
235 .addresses = "assigned-addresses",
236 .match = of_bus_pci_match,
237 .count_cells = of_bus_pci_count_cells,
238 .map = of_bus_pci_map,
239 .translate = of_bus_pci_translate,
240 .get_flags = of_bus_pci_get_flags,
246 .match = of_bus_isa_match,
247 .count_cells = of_bus_isa_count_cells,
248 .map = of_bus_isa_map,
249 .translate = of_bus_isa_translate,
250 .get_flags = of_bus_isa_get_flags,
257 .count_cells = of_bus_default_count_cells,
258 .map = of_bus_default_map,
259 .translate = of_bus_default_translate,
260 .get_flags = of_bus_default_get_flags,
264 static struct of_bus *of_match_bus(struct device_node *np)
268 for (i = 0; i < ARRAY_SIZE(of_busses); i ++)
269 if (!of_busses[i].match || of_busses[i].match(np))
270 return &of_busses[i];
275 static int of_translate_one(struct device_node *parent, struct of_bus *bus,
276 struct of_bus *pbus, u32 *addr,
277 int na, int ns, int pna)
282 u64 offset = OF_BAD_ADDR;
284 /* Normally, an absence of a "ranges" property means we are
285 * crossing a non-translatable boundary, and thus the addresses
286 * below the current not cannot be converted to CPU physical ones.
287 * Unfortunately, while this is very clear in the spec, it's not
288 * what Apple understood, and they do have things like /uni-n or
289 * /ht nodes with no "ranges" property and a lot of perfectly
290 * useable mapped devices below them. Thus we treat the absence of
291 * "ranges" as equivalent to an empty "ranges" property which means
292 * a 1:1 translation at that level. It's up to the caller not to try
293 * to translate addresses that aren't supposed to be translated in
294 * the first place. --BenH.
296 ranges = (u32 *)get_property(parent, "ranges", &rlen);
297 if (ranges == NULL || rlen == 0) {
298 offset = of_read_addr(addr, na);
299 memset(addr, 0, pna * 4);
300 DBG("OF: no ranges, 1:1 translation\n");
304 DBG("OF: walking ranges...\n");
306 /* Now walk through the ranges */
308 rone = na + pna + ns;
309 for (; rlen >= rone; rlen -= rone, ranges += rone) {
310 offset = bus->map(addr, ranges, na, ns, pna);
311 if (offset != OF_BAD_ADDR)
314 if (offset == OF_BAD_ADDR) {
315 DBG("OF: not found !\n");
318 memcpy(addr, ranges + na, 4 * pna);
321 of_dump_addr("OF: parent translation for:", addr, pna);
322 DBG("OF: with offset: "PRu64"\n", offset);
324 /* Translate it into parent bus space */
325 return pbus->translate(addr, offset, pna);
330 * Translate an address from the device-tree into a CPU physical address,
331 * this walks up the tree and applies the various bus mappings on the
334 * Note: We consider that crossing any level with #size-cells == 0 to mean
335 * that translation is impossible (that is we are not dealing with a value
336 * that can be mapped to a cpu physical address). This is not really specified
337 * that way, but this is traditionally the way IBM at least do things
339 u64 of_translate_address(struct device_node *dev, u32 *in_addr)
341 struct device_node *parent = NULL;
342 struct of_bus *bus, *pbus;
343 u32 addr[OF_MAX_ADDR_CELLS];
344 int na, ns, pna, pns;
345 u64 result = OF_BAD_ADDR;
347 DBG("OF: ** translation for device %s **\n", dev->full_name);
349 /* Increase refcount at current level */
352 /* Get parent & match bus type */
353 parent = of_get_parent(dev);
356 bus = of_match_bus(parent);
358 /* Cound address cells & copy address locally */
359 bus->count_cells(dev, &na, &ns);
360 if (!OF_CHECK_COUNTS(na, ns)) {
361 printk(KERN_ERR "prom_parse: Bad cell count for %s\n",
365 memcpy(addr, in_addr, na * 4);
367 DBG("OF: bus is %s (na=%d, ns=%d) on %s\n",
368 bus->name, na, ns, parent->full_name);
369 of_dump_addr("OF: translating address:", addr, na);
373 /* Switch to parent bus */
376 parent = of_get_parent(dev);
378 /* If root, we have finished */
379 if (parent == NULL) {
380 DBG("OF: reached root node\n");
381 result = of_read_addr(addr, na);
385 /* Get new parent bus and counts */
386 pbus = of_match_bus(parent);
387 pbus->count_cells(dev, &pna, &pns);
388 if (!OF_CHECK_COUNTS(pna, pns)) {
389 printk(KERN_ERR "prom_parse: Bad cell count for %s\n",
394 DBG("OF: parent bus is %s (na=%d, ns=%d) on %s\n",
395 pbus->name, pna, pns, parent->full_name);
397 /* Apply bus translation */
398 if (of_translate_one(dev, bus, pbus, addr, na, ns, pna))
401 /* Complete the move up one level */
406 of_dump_addr("OF: one level translation:", addr, na);
414 EXPORT_SYMBOL(of_translate_address);
416 u32 *of_get_address(struct device_node *dev, int index, u64 *size,
421 struct device_node *parent;
423 int onesize, i, na, ns;
425 /* Get parent & match bus type */
426 parent = of_get_parent(dev);
429 bus = of_match_bus(parent);
430 bus->count_cells(dev, &na, &ns);
432 if (!OF_CHECK_COUNTS(na, ns))
435 /* Get "reg" or "assigned-addresses" property */
436 prop = (u32 *)get_property(dev, bus->addresses, &psize);
442 for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++)
445 *size = of_read_addr(prop + na, ns);
447 *flags = bus->get_flags(prop);
452 EXPORT_SYMBOL(of_get_address);
454 u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
459 struct device_node *parent;
461 int onesize, i, na, ns;
463 /* Get parent & match bus type */
464 parent = of_get_parent(dev);
467 bus = of_match_bus(parent);
468 if (strcmp(bus->name, "pci")) {
472 bus->count_cells(dev, &na, &ns);
474 if (!OF_CHECK_COUNTS(na, ns))
477 /* Get "reg" or "assigned-addresses" property */
478 prop = (u32 *)get_property(dev, bus->addresses, &psize);
484 for (i = 0; psize >= onesize; psize -= onesize, prop += onesize, i++)
485 if ((prop[0] & 0xff) == ((bar_no * 4) + PCI_BASE_ADDRESS_0)) {
487 *size = of_read_addr(prop + na, ns);
489 *flags = bus->get_flags(prop);
494 EXPORT_SYMBOL(of_get_pci_address);
496 static int __of_address_to_resource(struct device_node *dev, u32 *addrp,
497 u64 size, unsigned int flags,
502 if ((flags & (IORESOURCE_IO | IORESOURCE_MEM)) == 0)
504 taddr = of_translate_address(dev, addrp);
505 if (taddr == OF_BAD_ADDR)
507 memset(r, 0, sizeof(struct resource));
508 if (flags & IORESOURCE_IO) {
510 port = pci_address_to_pio(taddr);
511 if (port == (unsigned long)-1)
514 r->end = port + size - 1;
517 r->end = taddr + size - 1;
524 int of_address_to_resource(struct device_node *dev, int index,
531 addrp = of_get_address(dev, index, &size, &flags);
534 return __of_address_to_resource(dev, addrp, size, flags, r);
536 EXPORT_SYMBOL_GPL(of_address_to_resource);
538 int of_pci_address_to_resource(struct device_node *dev, int bar,
545 addrp = of_get_pci_address(dev, bar, &size, &flags);
548 return __of_address_to_resource(dev, addrp, size, flags, r);
550 EXPORT_SYMBOL_GPL(of_pci_address_to_resource);