diff options
Diffstat (limited to 'arch/powerpc/kernel/prom.c')
| -rw-r--r-- | arch/powerpc/kernel/prom.c | 56 |
1 files changed, 39 insertions, 17 deletions
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index a2bc433f3610..4336390bcf34 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
| @@ -383,14 +383,14 @@ static int __devinit finish_node_interrupts(struct device_node *np, | |||
| 383 | /* Apple uses bits in there in a different way, let's | 383 | /* Apple uses bits in there in a different way, let's |
| 384 | * only keep the real sense bit on macs | 384 | * only keep the real sense bit on macs |
| 385 | */ | 385 | */ |
| 386 | if (_machine == PLATFORM_POWERMAC) | 386 | if (machine_is(powermac)) |
| 387 | sense &= 0x1; | 387 | sense &= 0x1; |
| 388 | np->intrs[intrcount].sense = map_mpic_senses[sense]; | 388 | np->intrs[intrcount].sense = map_mpic_senses[sense]; |
| 389 | } | 389 | } |
| 390 | 390 | ||
| 391 | #ifdef CONFIG_PPC64 | 391 | #ifdef CONFIG_PPC64 |
| 392 | /* We offset irq numbers for the u3 MPIC by 128 in PowerMac */ | 392 | /* We offset irq numbers for the u3 MPIC by 128 in PowerMac */ |
| 393 | if (_machine == PLATFORM_POWERMAC && ic && ic->parent) { | 393 | if (machine_is(powermac) && ic && ic->parent) { |
| 394 | char *name = get_property(ic->parent, "name", NULL); | 394 | char *name = get_property(ic->parent, "name", NULL); |
| 395 | if (name && !strcmp(name, "u3")) | 395 | if (name && !strcmp(name, "u3")) |
| 396 | np->intrs[intrcount].line += 128; | 396 | np->intrs[intrcount].line += 128; |
| @@ -570,6 +570,18 @@ int __init of_scan_flat_dt(int (*it)(unsigned long node, | |||
| 570 | return rc; | 570 | return rc; |
| 571 | } | 571 | } |
| 572 | 572 | ||
| 573 | unsigned long __init of_get_flat_dt_root(void) | ||
| 574 | { | ||
| 575 | unsigned long p = ((unsigned long)initial_boot_params) + | ||
| 576 | initial_boot_params->off_dt_struct; | ||
| 577 | |||
| 578 | while(*((u32 *)p) == OF_DT_NOP) | ||
| 579 | p += 4; | ||
| 580 | BUG_ON (*((u32 *)p) != OF_DT_BEGIN_NODE); | ||
| 581 | p += 4; | ||
| 582 | return _ALIGN(p + strlen((char *)p) + 1, 4); | ||
| 583 | } | ||
| 584 | |||
| 573 | /** | 585 | /** |
| 574 | * This function can be used within scan_flattened_dt callback to get | 586 | * This function can be used within scan_flattened_dt callback to get |
| 575 | * access to properties | 587 | * access to properties |
| @@ -612,6 +624,25 @@ void* __init of_get_flat_dt_prop(unsigned long node, const char *name, | |||
| 612 | } while(1); | 624 | } while(1); |
| 613 | } | 625 | } |
| 614 | 626 | ||
| 627 | int __init of_flat_dt_is_compatible(unsigned long node, const char *compat) | ||
| 628 | { | ||
| 629 | const char* cp; | ||
| 630 | unsigned long cplen, l; | ||
| 631 | |||
| 632 | cp = of_get_flat_dt_prop(node, "compatible", &cplen); | ||
| 633 | if (cp == NULL) | ||
| 634 | return 0; | ||
| 635 | while (cplen > 0) { | ||
| 636 | if (strncasecmp(cp, compat, strlen(compat)) == 0) | ||
| 637 | return 1; | ||
| 638 | l = strlen(cp) + 1; | ||
| 639 | cp += l; | ||
| 640 | cplen -= l; | ||
| 641 | } | ||
| 642 | |||
| 643 | return 0; | ||
| 644 | } | ||
| 645 | |||
| 615 | static void *__init unflatten_dt_alloc(unsigned long *mem, unsigned long size, | 646 | static void *__init unflatten_dt_alloc(unsigned long *mem, unsigned long size, |
| 616 | unsigned long align) | 647 | unsigned long align) |
| 617 | { | 648 | { |
| @@ -686,7 +717,7 @@ static unsigned long __init unflatten_dt_node(unsigned long mem, | |||
| 686 | #ifdef DEBUG | 717 | #ifdef DEBUG |
| 687 | if ((strlen(p) + l + 1) != allocl) { | 718 | if ((strlen(p) + l + 1) != allocl) { |
| 688 | DBG("%s: p: %d, l: %d, a: %d\n", | 719 | DBG("%s: p: %d, l: %d, a: %d\n", |
| 689 | pathp, strlen(p), l, allocl); | 720 | pathp, (int)strlen(p), l, allocl); |
| 690 | } | 721 | } |
| 691 | #endif | 722 | #endif |
| 692 | p += strlen(p); | 723 | p += strlen(p); |
| @@ -951,7 +982,6 @@ static int __init early_init_dt_scan_cpus(unsigned long node, | |||
| 951 | static int __init early_init_dt_scan_chosen(unsigned long node, | 982 | static int __init early_init_dt_scan_chosen(unsigned long node, |
| 952 | const char *uname, int depth, void *data) | 983 | const char *uname, int depth, void *data) |
| 953 | { | 984 | { |
| 954 | u32 *prop; | ||
| 955 | unsigned long *lprop; | 985 | unsigned long *lprop; |
| 956 | unsigned long l; | 986 | unsigned long l; |
| 957 | char *p; | 987 | char *p; |
| @@ -962,14 +992,6 @@ static int __init early_init_dt_scan_chosen(unsigned long node, | |||
| 962 | (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0)) | 992 | (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0)) |
| 963 | return 0; | 993 | return 0; |
| 964 | 994 | ||
| 965 | /* get platform type */ | ||
| 966 | prop = (u32 *)of_get_flat_dt_prop(node, "linux,platform", NULL); | ||
| 967 | if (prop == NULL) | ||
| 968 | return 0; | ||
| 969 | #ifdef CONFIG_PPC_MULTIPLATFORM | ||
| 970 | _machine = *prop; | ||
| 971 | #endif | ||
| 972 | |||
| 973 | #ifdef CONFIG_PPC64 | 995 | #ifdef CONFIG_PPC64 |
| 974 | /* check if iommu is forced on or off */ | 996 | /* check if iommu is forced on or off */ |
| 975 | if (of_get_flat_dt_prop(node, "linux,iommu-off", NULL) != NULL) | 997 | if (of_get_flat_dt_prop(node, "linux,iommu-off", NULL) != NULL) |
| @@ -996,15 +1018,15 @@ static int __init early_init_dt_scan_chosen(unsigned long node, | |||
| 996 | * set of RTAS infos now if available | 1018 | * set of RTAS infos now if available |
| 997 | */ | 1019 | */ |
| 998 | { | 1020 | { |
| 999 | u64 *basep, *entryp; | 1021 | u64 *basep, *entryp, *sizep; |
| 1000 | 1022 | ||
| 1001 | basep = of_get_flat_dt_prop(node, "linux,rtas-base", NULL); | 1023 | basep = of_get_flat_dt_prop(node, "linux,rtas-base", NULL); |
| 1002 | entryp = of_get_flat_dt_prop(node, "linux,rtas-entry", NULL); | 1024 | entryp = of_get_flat_dt_prop(node, "linux,rtas-entry", NULL); |
| 1003 | prop = of_get_flat_dt_prop(node, "linux,rtas-size", NULL); | 1025 | sizep = of_get_flat_dt_prop(node, "linux,rtas-size", NULL); |
| 1004 | if (basep && entryp && prop) { | 1026 | if (basep && entryp && sizep) { |
| 1005 | rtas.base = *basep; | 1027 | rtas.base = *basep; |
| 1006 | rtas.entry = *entryp; | 1028 | rtas.entry = *entryp; |
| 1007 | rtas.size = *prop; | 1029 | rtas.size = *sizep; |
| 1008 | } | 1030 | } |
| 1009 | } | 1031 | } |
| 1010 | #endif /* CONFIG_PPC_RTAS */ | 1032 | #endif /* CONFIG_PPC_RTAS */ |
| @@ -1775,7 +1797,7 @@ static int of_finish_dynamic_node(struct device_node *node) | |||
| 1775 | /* We don't support that function on PowerMac, at least | 1797 | /* We don't support that function on PowerMac, at least |
| 1776 | * not yet | 1798 | * not yet |
| 1777 | */ | 1799 | */ |
| 1778 | if (_machine == PLATFORM_POWERMAC) | 1800 | if (machine_is(powermac)) |
| 1779 | return -ENODEV; | 1801 | return -ENODEV; |
| 1780 | 1802 | ||
| 1781 | /* fix up new node's linux_phandle field */ | 1803 | /* fix up new node's linux_phandle field */ |
