diff options
author | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-11 21:24:58 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-11 21:24:58 -0500 |
commit | 13d7d84e078f49f08b657a3fba0d7a0b7b44ba65 (patch) | |
tree | ae4957d183e2f5fcae62b2c1411b4a32c2f71f21 /arch/powerpc/kernel/prom.c | |
parent | cbb8fc07974073543fdc61da23713ab49ddd3ced (diff) | |
parent | 73c9ceab40b1269d6195e556773167c078ac8311 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
* git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (36 commits)
[POWERPC] Generic BUG for powerpc
[PPC] Fix compile failure do to introduction of PHY_POLL
[POWERPC] Only export __mtdcr/__mfdcr if CONFIG_PPC_DCR is set
[POWERPC] Remove old dcr.S
[POWERPC] Fix SPU coredump code for max_fdset removal
[POWERPC] Fix irq routing on some 32-bit PowerMacs
[POWERPC] ps3: Add vuart support
[POWERPC] Support ibm,dynamic-reconfiguration-memory nodes
[POWERPC] dont allow pSeries_probe to succeed without initialising MMU
[POWERPC] micro optimise pSeries_probe
[POWERPC] Add SPURR SPR to sysfs
[POWERPC] Add DSCR SPR to sysfs
[POWERPC] Fix 440SPe CPU table entry
[POWERPC] Add support for FP emulation for the e300c2 core
[POWERPC] of_device_register: propagate device_create_file return code
[POWERPC] Fix mmap of PCI resource with hack for X
[POWERPC] iSeries: head_64.o needs to depend on lparmap.s
[POWERPC] cbe_thermal: Fix initialization of sysfs attribute_group
[POWERPC] Remove QE header files from lite5200.c
[POWERPC] of_platform_make_bus_id(): make `magic' int
...
Diffstat (limited to 'arch/powerpc/kernel/prom.c')
-rw-r--r-- | arch/powerpc/kernel/prom.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index c18dbe77fdc2..1fc732a552db 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -804,6 +804,56 @@ static unsigned long __init dt_mem_next_cell(int s, cell_t **cellp) | |||
804 | return of_read_ulong(p, s); | 804 | return of_read_ulong(p, s); |
805 | } | 805 | } |
806 | 806 | ||
807 | #ifdef CONFIG_PPC_PSERIES | ||
808 | /* | ||
809 | * Interpret the ibm,dynamic-memory property in the | ||
810 | * /ibm,dynamic-reconfiguration-memory node. | ||
811 | * This contains a list of memory blocks along with NUMA affinity | ||
812 | * information. | ||
813 | */ | ||
814 | static int __init early_init_dt_scan_drconf_memory(unsigned long node) | ||
815 | { | ||
816 | cell_t *dm, *ls; | ||
817 | unsigned long l, n; | ||
818 | unsigned long base, size, lmb_size, flags; | ||
819 | |||
820 | ls = (cell_t *)of_get_flat_dt_prop(node, "ibm,lmb-size", &l); | ||
821 | if (ls == NULL || l < dt_root_size_cells * sizeof(cell_t)) | ||
822 | return 0; | ||
823 | lmb_size = dt_mem_next_cell(dt_root_size_cells, &ls); | ||
824 | |||
825 | dm = (cell_t *)of_get_flat_dt_prop(node, "ibm,dynamic-memory", &l); | ||
826 | if (dm == NULL || l < sizeof(cell_t)) | ||
827 | return 0; | ||
828 | |||
829 | n = *dm++; /* number of entries */ | ||
830 | if (l < (n * (dt_root_addr_cells + 4) + 1) * sizeof(cell_t)) | ||
831 | return 0; | ||
832 | |||
833 | for (; n != 0; --n) { | ||
834 | base = dt_mem_next_cell(dt_root_addr_cells, &dm); | ||
835 | flags = dm[3]; | ||
836 | /* skip DRC index, pad, assoc. list index, flags */ | ||
837 | dm += 4; | ||
838 | /* skip this block if the reserved bit is set in flags (0x80) | ||
839 | or if the block is not assigned to this partition (0x8) */ | ||
840 | if ((flags & 0x80) || !(flags & 0x8)) | ||
841 | continue; | ||
842 | size = lmb_size; | ||
843 | if (iommu_is_off) { | ||
844 | if (base >= 0x80000000ul) | ||
845 | continue; | ||
846 | if ((base + size) > 0x80000000ul) | ||
847 | size = 0x80000000ul - base; | ||
848 | } | ||
849 | lmb_add(base, size); | ||
850 | } | ||
851 | lmb_dump_all(); | ||
852 | return 0; | ||
853 | } | ||
854 | #else | ||
855 | #define early_init_dt_scan_drconf_memory(node) 0 | ||
856 | #endif /* CONFIG_PPC_PSERIES */ | ||
807 | 857 | ||
808 | static int __init early_init_dt_scan_memory(unsigned long node, | 858 | static int __init early_init_dt_scan_memory(unsigned long node, |
809 | const char *uname, int depth, void *data) | 859 | const char *uname, int depth, void *data) |
@@ -812,6 +862,11 @@ static int __init early_init_dt_scan_memory(unsigned long node, | |||
812 | cell_t *reg, *endp; | 862 | cell_t *reg, *endp; |
813 | unsigned long l; | 863 | unsigned long l; |
814 | 864 | ||
865 | /* Look for the ibm,dynamic-reconfiguration-memory node */ | ||
866 | if (depth == 1 && | ||
867 | strcmp(uname, "ibm,dynamic-reconfiguration-memory") == 0) | ||
868 | return early_init_dt_scan_drconf_memory(node); | ||
869 | |||
815 | /* We are scanning "memory" nodes only */ | 870 | /* We are scanning "memory" nodes only */ |
816 | if (type == NULL) { | 871 | if (type == NULL) { |
817 | /* | 872 | /* |