From: Rusty Russell 1) Define PROM_ERROR: checks for call_prom() < 0 are bogus (returns ulong) 2) All OF access functions should be marked __init. 3) prom_strtoul isn't used at all. --- 25-akpm/arch/ppc64/kernel/prom.c | 222 +++++++++++++++++---------------------- 25-akpm/include/asm-ppc64/prom.h | 1 2 files changed, 98 insertions(+), 125 deletions(-) diff -puN arch/ppc64/kernel/prom.c~ppc64-clean-up-prom-functions-in-promc arch/ppc64/kernel/prom.c --- 25/arch/ppc64/kernel/prom.c~ppc64-clean-up-prom-functions-in-promc Fri Apr 23 13:30:22 2004 +++ 25-akpm/arch/ppc64/kernel/prom.c Fri Apr 23 13:30:22 2004 @@ -182,8 +182,9 @@ char testString[] = "LINUX\n"; * mode when we do. We switch back to 64b mode upon return. */ -static unsigned long __init -call_prom(const char *service, int nargs, int nret, ...) +#define PROM_ERROR (0x00000000fffffffful) + +static unsigned long __init call_prom(const char *service, int nargs, int nret, ...) { int i; unsigned long offset = reloc_offset(); @@ -209,30 +210,7 @@ call_prom(const char *service, int nargs } -static void __init -prom_panic(const char *reason) -{ - unsigned long offset = reloc_offset(); - - prom_print(reason); - /* ToDo: should put up an SRC here */ - call_prom(RELOC("exit"), 0, 0); - - for (;;) /* should never get here */ - ; -} - -void __init -prom_enter(void) -{ - unsigned long offset = reloc_offset(); - - call_prom(RELOC("enter"), 0, 0); -} - - -void __init -prom_print(const char *msg) +static void __init prom_print(const char *msg) { const char *p, *q; unsigned long offset = reloc_offset(); @@ -255,8 +233,8 @@ prom_print(const char *msg) } } -void -prom_print_hex(unsigned long val) + +static void __init prom_print_hex(unsigned long val) { int i, nibbles = sizeof(val)*2; char buf[sizeof(val)*2+1]; @@ -271,15 +249,28 @@ prom_print_hex(unsigned long val) prom_print(buf); } -void -prom_print_nl(void) + +static void __init prom_print_nl(void) { unsigned long offset = reloc_offset(); prom_print(RELOC("\n")); } -static int __init -prom_next_node(phandle *nodep) + +static void __init prom_panic(const char *reason) +{ + unsigned long offset = reloc_offset(); + + prom_print(reason); + /* ToDo: should put up an SRC here */ + call_prom(RELOC("exit"), 0, 0); + + for (;;) /* should never get here */ + ; +} + + +static int __init prom_next_node(phandle *nodep) { phandle node; unsigned long offset = reloc_offset(); @@ -520,7 +511,7 @@ prom_initialize_naca(unsigned long mem) static int iommu_force_on; int ppc64_iommu_off; -static void early_cmdline_parse(void) +static void __init early_cmdline_parse(void) { unsigned long offset = reloc_offset(); char *opt; @@ -550,6 +541,57 @@ static void early_cmdline_parse(void) #endif } +#ifdef DEBUG_PROM +void prom_dump_lmb(void) +{ + unsigned long i; + unsigned long offset = reloc_offset(); + struct lmb *_lmb = PTRRELOC(&lmb); + + prom_print(RELOC("\nprom_dump_lmb:\n")); + prom_print(RELOC(" memory.cnt = 0x")); + prom_print_hex(_lmb->memory.cnt); + prom_print_nl(); + prom_print(RELOC(" memory.size = 0x")); + prom_print_hex(_lmb->memory.size); + prom_print_nl(); + for (i=0; i < _lmb->memory.cnt ;i++) { + prom_print(RELOC(" memory.region[0x")); + prom_print_hex(i); + prom_print(RELOC("].base = 0x")); + prom_print_hex(_lmb->memory.region[i].base); + prom_print_nl(); + prom_print(RELOC(" .physbase = 0x")); + prom_print_hex(_lmb->memory.region[i].physbase); + prom_print_nl(); + prom_print(RELOC(" .size = 0x")); + prom_print_hex(_lmb->memory.region[i].size); + prom_print_nl(); + } + + prom_print_nl(); + prom_print(RELOC(" reserved.cnt = 0x")); + prom_print_hex(_lmb->reserved.cnt); + prom_print_nl(); + prom_print(RELOC(" reserved.size = 0x")); + prom_print_hex(_lmb->reserved.size); + prom_print_nl(); + for (i=0; i < _lmb->reserved.cnt ;i++) { + prom_print(RELOC(" reserved.region[0x")); + prom_print_hex(i); + prom_print(RELOC("].base = 0x")); + prom_print_hex(_lmb->reserved.region[i].base); + prom_print_nl(); + prom_print(RELOC(" .physbase = 0x")); + prom_print_hex(_lmb->reserved.region[i].physbase); + prom_print_nl(); + prom_print(RELOC(" .size = 0x")); + prom_print_hex(_lmb->reserved.region[i].size); + prom_print_nl(); + } +} +#endif /* DEBUG_PROM */ + static unsigned long __init prom_initialize_lmb(unsigned long mem) { @@ -634,13 +676,15 @@ prom_instantiate_rtas(void) #endif prom_rtas = (ihandle)call_prom(RELOC("finddevice"), 1, 1, RELOC("/rtas")); if (prom_rtas != (ihandle) -1) { - int rc; - - if ((rc = call_prom(RELOC("getprop"), + unsigned long x; + x = call_prom(RELOC("getprop"), 4, 1, prom_rtas, RELOC("ibm,hypertas-functions"), hypertas_funcs, - sizeof(hypertas_funcs))) > 0) { + sizeof(hypertas_funcs)); + + if (x != PROM_ERROR) { + prom_print(RELOC("Hypertas detected, assuming LPAR !\n")); _systemcfg->platform = PLATFORM_PSERIES_LPAR; } @@ -662,6 +706,7 @@ prom_instantiate_rtas(void) struct lmb *_lmb = PTRRELOC(&lmb); rtas_region = min(_lmb->rmo_size, RTAS_INSTANTIATE_MAX); } + _rtas->base = lmb_alloc_base(_rtas->size, PAGE_SIZE, rtas_region); prom_print(RELOC(" at 0x")); @@ -671,10 +716,10 @@ prom_instantiate_rtas(void) 1, 1, RELOC("/rtas")); prom_print(RELOC("...")); - if ((long)call_prom(RELOC("call-method"), 3, 2, + if (call_prom(RELOC("call-method"), 3, 2, RELOC("instantiate-rtas"), prom_rtas, - _rtas->base) >= 0) { + _rtas->base) != PROM_ERROR) { _rtas->entry = (long)_prom->args.rets[1]; } RELOC(rtas_rmo_buf) @@ -705,74 +750,9 @@ prom_instantiate_rtas(void) #endif } -unsigned long prom_strtoul(const char *cp) -{ - unsigned long result = 0,value; - - while (*cp) { - value = *cp-'0'; - result = result*10 + value; - cp++; - } - - return result; -} - -#ifdef DEBUG_PROM -void -prom_dump_lmb(void) -{ - unsigned long i; - unsigned long offset = reloc_offset(); - struct lmb *_lmb = PTRRELOC(&lmb); - - prom_print(RELOC("\nprom_dump_lmb:\n")); - prom_print(RELOC(" memory.cnt = 0x")); - prom_print_hex(_lmb->memory.cnt); - prom_print_nl(); - prom_print(RELOC(" memory.size = 0x")); - prom_print_hex(_lmb->memory.size); - prom_print_nl(); - for (i=0; i < _lmb->memory.cnt ;i++) { - prom_print(RELOC(" memory.region[0x")); - prom_print_hex(i); - prom_print(RELOC("].base = 0x")); - prom_print_hex(_lmb->memory.region[i].base); - prom_print_nl(); - prom_print(RELOC(" .physbase = 0x")); - prom_print_hex(_lmb->memory.region[i].physbase); - prom_print_nl(); - prom_print(RELOC(" .size = 0x")); - prom_print_hex(_lmb->memory.region[i].size); - prom_print_nl(); - } - - prom_print_nl(); - prom_print(RELOC(" reserved.cnt = 0x")); - prom_print_hex(_lmb->reserved.cnt); - prom_print_nl(); - prom_print(RELOC(" reserved.size = 0x")); - prom_print_hex(_lmb->reserved.size); - prom_print_nl(); - for (i=0; i < _lmb->reserved.cnt ;i++) { - prom_print(RELOC(" reserved.region[0x")); - prom_print_hex(i); - prom_print(RELOC("].base = 0x")); - prom_print_hex(_lmb->reserved.region[i].base); - prom_print_nl(); - prom_print(RELOC(" .physbase = 0x")); - prom_print_hex(_lmb->reserved.region[i].physbase); - prom_print_nl(); - prom_print(RELOC(" .size = 0x")); - prom_print_hex(_lmb->reserved.region[i].size); - prom_print_nl(); - } -} -#endif /* DEBUG_PROM */ - #ifdef CONFIG_PMAC_DART -static void prom_initialize_dart_table(void) +static void __init prom_initialize_dart_table(void) { unsigned long offset = reloc_offset(); extern unsigned long dart_tablebase; @@ -798,7 +778,7 @@ static void prom_initialize_dart_table(v } #endif /* CONFIG_PMAC_DART */ -static void prom_initialize_tce_table(void) +static void __init prom_initialize_tce_table(void) { phandle node; ihandle phb_node; @@ -854,13 +834,13 @@ static void prom_initialize_tce_table(vo if (call_prom(RELOC("getprop"), 4, 1, node, RELOC("tce-table-minalign"), &minalign, - sizeof(minalign)) < 0) { + sizeof(minalign)) == PROM_ERROR) { minalign = 0; } if (call_prom(RELOC("getprop"), 4, 1, node, RELOC("tce-table-minsize"), &minsize, - sizeof(minsize)) < 0) { + sizeof(minsize)) == PROM_ERROR) { minsize = 4UL << 20; } @@ -929,7 +909,7 @@ static void prom_initialize_tce_table(vo memset(path, 0, sizeof(path)); /* Call OF to setup the TCE hardware */ if (call_prom(RELOC("package-to-path"), 3, 1, node, - path, sizeof(path)-1) <= 0) { + path, sizeof(path)-1) == PROM_ERROR) { prom_print(RELOC("package-to-path failed\n")); } else { prom_print(RELOC("opening PHB ")); @@ -982,8 +962,7 @@ static void prom_initialize_tce_table(vo * * -- Cort */ -static void -prom_hold_cpus(unsigned long mem) +static void __init prom_hold_cpus(unsigned long mem) { unsigned long i; unsigned int reg; @@ -1093,7 +1072,7 @@ prom_hold_cpus(unsigned long mem) path = (char *) mem; memset(path, 0, 256); if ((long) call_prom(RELOC("package-to-path"), 3, 1, - node, path, 255) < 0) + node, path, 255) == PROM_ERROR) continue; #ifdef DEBUG_PROM @@ -1239,8 +1218,7 @@ next: #endif } -static void -smt_setup(void) +static void __init smt_setup(void) { char *p, *q; char my_smt_enabled = SMT_DYNAMIC; @@ -1431,8 +1409,7 @@ static int __init prom_find_machine_type return PLATFORM_PSERIES; } -static int -prom_set_color(ihandle ih, int i, int r, int g, int b) +static int __init prom_set_color(ihandle ih, int i, int r, int g, int b) { unsigned long offset = reloc_offset(); @@ -1453,8 +1430,7 @@ prom_set_color(ihandle ih, int i, int r, * So we check whether we will need to open the display, * and if so, open it now. */ -static unsigned long __init -check_display(unsigned long mem) +static unsigned long __init check_display(unsigned long mem) { phandle node; ihandle ih; @@ -1569,8 +1545,8 @@ check_display(unsigned long mem) } /* Return (relocated) pointer to this much memory: skips initrd if any. */ -static void *__make_room(unsigned long *mem_start, unsigned long *mem_end, - unsigned long needed, unsigned long align) +static void __init *__make_room(unsigned long *mem_start, unsigned long *mem_end, + unsigned long needed, unsigned long align) { void *ret; unsigned long offset = reloc_offset(); @@ -1735,8 +1711,7 @@ copy_device_tree(unsigned long mem_start } /* Verify bi_recs are good */ -static struct bi_record * -prom_bi_rec_verify(struct bi_record *bi_recs) +static struct bi_record * __init prom_bi_rec_verify(struct bi_record *bi_recs) { struct bi_record *first, *last; @@ -1754,8 +1729,7 @@ prom_bi_rec_verify(struct bi_record *bi_ return bi_recs; } -static unsigned long -prom_bi_rec_reserve(unsigned long mem) +static unsigned long __init prom_bi_rec_reserve(unsigned long mem) { unsigned long offset = reloc_offset(); struct prom_t *_prom = PTRRELOC(&prom); diff -puN include/asm-ppc64/prom.h~ppc64-clean-up-prom-functions-in-promc include/asm-ppc64/prom.h --- 25/include/asm-ppc64/prom.h~ppc64-clean-up-prom-functions-in-promc Fri Apr 23 13:30:22 2004 +++ 25-akpm/include/asm-ppc64/prom.h Fri Apr 23 13:30:22 2004 @@ -260,7 +260,6 @@ extern int of_remove_node(struct device_ /* Other Prototypes */ extern unsigned long prom_init(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long); -extern void prom_print(const char *msg); extern void relocate_nodes(void); extern void finish_device_tree(void); extern int device_is_compatible(struct device_node *device, const char *); _