[POWERPC] Setup RTAS values earlier, to enable rtas_call() earlier
Althought RTAS is instantiated when we enter the kernel, we can't actually call into it until we know its entry point address. Currently we grab that in rtas_initialize(), however that's quite late in the boot sequence. To enable rtas_call() earlier, we can grab the RTAS entry etc. values while we're scanning the flattened device tree. There's existing code to retrieve the values from /chosen, however we don't store them there anymore, so remove that code. Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
ab3ab74d9b
commit
458148c00b
3 changed files with 30 additions and 18 deletions
|
@ -1125,24 +1125,6 @@ static int __init early_init_dt_scan_chosen(unsigned long node,
|
|||
tce_alloc_end = *lprop;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_RTAS
|
||||
/* To help early debugging via the front panel, we retrieve a minimal
|
||||
* set of RTAS infos now if available
|
||||
*/
|
||||
{
|
||||
u64 *basep, *entryp, *sizep;
|
||||
|
||||
basep = of_get_flat_dt_prop(node, "linux,rtas-base", NULL);
|
||||
entryp = of_get_flat_dt_prop(node, "linux,rtas-entry", NULL);
|
||||
sizep = of_get_flat_dt_prop(node, "linux,rtas-size", NULL);
|
||||
if (basep && entryp && sizep) {
|
||||
rtas.base = *basep;
|
||||
rtas.entry = *entryp;
|
||||
rtas.size = *sizep;
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_PPC_RTAS */
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
lprop = (u64*)of_get_flat_dt_prop(node, "linux,crashkernel-base", NULL);
|
||||
if (lprop)
|
||||
|
@ -1327,6 +1309,11 @@ void __init early_init_devtree(void *params)
|
|||
/* Setup flat device-tree pointer */
|
||||
initial_boot_params = params;
|
||||
|
||||
#ifdef CONFIG_PPC_RTAS
|
||||
/* Some machines might need RTAS info for debugging, grab it now. */
|
||||
of_scan_flat_dt(early_init_dt_scan_rtas, NULL);
|
||||
#endif
|
||||
|
||||
/* Retrieve various informations from the /chosen node of the
|
||||
* device-tree, including the platform type, initrd location and
|
||||
* size, TCE reserve, and more ...
|
||||
|
|
|
@ -801,3 +801,25 @@ void __init rtas_initialize(void)
|
|||
rtas_last_error_token = rtas_token("rtas-last-error");
|
||||
#endif
|
||||
}
|
||||
|
||||
int __init early_init_dt_scan_rtas(unsigned long node,
|
||||
const char *uname, int depth, void *data)
|
||||
{
|
||||
u32 *basep, *entryp, *sizep;
|
||||
|
||||
if (depth != 1 || strcmp(uname, "rtas") != 0)
|
||||
return 0;
|
||||
|
||||
basep = of_get_flat_dt_prop(node, "linux,rtas-base", NULL);
|
||||
entryp = of_get_flat_dt_prop(node, "linux,rtas-entry", NULL);
|
||||
sizep = of_get_flat_dt_prop(node, "rtas-size", NULL);
|
||||
|
||||
if (basep && entryp && sizep) {
|
||||
rtas.base = *basep;
|
||||
rtas.entry = *entryp;
|
||||
rtas.size = *sizep;
|
||||
}
|
||||
|
||||
/* break now */
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -181,6 +181,9 @@ extern int rtas_set_rtc_time(struct rtc_time *rtc_time);
|
|||
extern unsigned int rtas_busy_delay_time(int status);
|
||||
extern unsigned int rtas_busy_delay(int status);
|
||||
|
||||
extern int early_init_dt_scan_rtas(unsigned long node,
|
||||
const char *uname, int depth, void *data);
|
||||
|
||||
extern void pSeries_log_error(char *buf, unsigned int err_type, int fatal);
|
||||
|
||||
/* Error types logged. */
|
||||
|
|
Loading…
Reference in a new issue