diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2007-12-10 22:48:22 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-12-10 23:43:35 -0500 |
commit | 837c54db21fc7047af75f3fe4295e32106449e34 (patch) | |
tree | 911e841e38b9f9899f3a2278abdef41779d77a67 /arch/powerpc/kernel/prom_parse.c | |
parent | f276b5ba0d87eba4ce7aace9608d811776734cb5 (diff) |
[POWERPC] Add of_translate_dma_address
This adds a variant of of_translate_address that uses the dma-ranges
property instead of "ranges", it's to be used by PCI code in parsing
the dma-ranges property.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/kernel/prom_parse.c')
-rw-r--r-- | arch/powerpc/kernel/prom_parse.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/prom_parse.c b/arch/powerpc/kernel/prom_parse.c index 6bdfaf3f99ea..90eb3a3e383e 100644 --- a/arch/powerpc/kernel/prom_parse.c +++ b/arch/powerpc/kernel/prom_parse.c | |||
@@ -419,7 +419,7 @@ static struct of_bus *of_match_bus(struct device_node *np) | |||
419 | 419 | ||
420 | static int of_translate_one(struct device_node *parent, struct of_bus *bus, | 420 | static int of_translate_one(struct device_node *parent, struct of_bus *bus, |
421 | struct of_bus *pbus, u32 *addr, | 421 | struct of_bus *pbus, u32 *addr, |
422 | int na, int ns, int pna) | 422 | int na, int ns, int pna, const char *rprop) |
423 | { | 423 | { |
424 | const u32 *ranges; | 424 | const u32 *ranges; |
425 | unsigned int rlen; | 425 | unsigned int rlen; |
@@ -438,7 +438,7 @@ static int of_translate_one(struct device_node *parent, struct of_bus *bus, | |||
438 | * to translate addresses that aren't supposed to be translated in | 438 | * to translate addresses that aren't supposed to be translated in |
439 | * the first place. --BenH. | 439 | * the first place. --BenH. |
440 | */ | 440 | */ |
441 | ranges = of_get_property(parent, "ranges", &rlen); | 441 | ranges = of_get_property(parent, rprop, &rlen); |
442 | if (ranges == NULL || rlen == 0) { | 442 | if (ranges == NULL || rlen == 0) { |
443 | offset = of_read_number(addr, na); | 443 | offset = of_read_number(addr, na); |
444 | memset(addr, 0, pna * 4); | 444 | memset(addr, 0, pna * 4); |
@@ -481,7 +481,8 @@ static int of_translate_one(struct device_node *parent, struct of_bus *bus, | |||
481 | * that can be mapped to a cpu physical address). This is not really specified | 481 | * that can be mapped to a cpu physical address). This is not really specified |
482 | * that way, but this is traditionally the way IBM at least do things | 482 | * that way, but this is traditionally the way IBM at least do things |
483 | */ | 483 | */ |
484 | u64 of_translate_address(struct device_node *dev, const u32 *in_addr) | 484 | u64 __of_translate_address(struct device_node *dev, const u32 *in_addr, |
485 | const char *rprop) | ||
485 | { | 486 | { |
486 | struct device_node *parent = NULL; | 487 | struct device_node *parent = NULL; |
487 | struct of_bus *bus, *pbus; | 488 | struct of_bus *bus, *pbus; |
@@ -540,7 +541,7 @@ u64 of_translate_address(struct device_node *dev, const u32 *in_addr) | |||
540 | pbus->name, pna, pns, parent->full_name); | 541 | pbus->name, pna, pns, parent->full_name); |
541 | 542 | ||
542 | /* Apply bus translation */ | 543 | /* Apply bus translation */ |
543 | if (of_translate_one(dev, bus, pbus, addr, na, ns, pna)) | 544 | if (of_translate_one(dev, bus, pbus, addr, na, ns, pna, rprop)) |
544 | break; | 545 | break; |
545 | 546 | ||
546 | /* Complete the move up one level */ | 547 | /* Complete the move up one level */ |
@@ -556,8 +557,19 @@ u64 of_translate_address(struct device_node *dev, const u32 *in_addr) | |||
556 | 557 | ||
557 | return result; | 558 | return result; |
558 | } | 559 | } |
560 | |||
561 | u64 of_translate_address(struct device_node *dev, const u32 *in_addr) | ||
562 | { | ||
563 | return __of_translate_address(dev, in_addr, "ranges"); | ||
564 | } | ||
559 | EXPORT_SYMBOL(of_translate_address); | 565 | EXPORT_SYMBOL(of_translate_address); |
560 | 566 | ||
567 | u64 of_translate_dma_address(struct device_node *dev, const u32 *in_addr) | ||
568 | { | ||
569 | return __of_translate_address(dev, in_addr, "dma-ranges"); | ||
570 | } | ||
571 | EXPORT_SYMBOL(of_translate_dma_address); | ||
572 | |||
561 | const u32 *of_get_address(struct device_node *dev, int index, u64 *size, | 573 | const u32 *of_get_address(struct device_node *dev, int index, u64 *size, |
562 | unsigned int *flags) | 574 | unsigned int *flags) |
563 | { | 575 | { |