[POWERPC] More offb/bootx fixes
There were still some issues with offb when BootX doesn't provide a proper display node, this fixes them. This also re-instates the palette hacks that were disabled a couple of kernel versions ago when I converted to the new OF parsing, and shuffles some functions around to avoid prototypes. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
committed by
Paul Mackerras
parent
45507ff3a2
commit
98c82472e9
@ -181,13 +181,18 @@ static void __init bootx_add_chosen_props(unsigned long base,
|
||||
}
|
||||
|
||||
static void __init bootx_add_display_props(unsigned long base,
|
||||
unsigned long *mem_end)
|
||||
unsigned long *mem_end,
|
||||
int has_real_node)
|
||||
{
|
||||
boot_infos_t *bi = bootx_info;
|
||||
u32 tmp;
|
||||
|
||||
bootx_dt_add_prop("linux,boot-display", NULL, 0, mem_end);
|
||||
bootx_dt_add_prop("linux,opened", NULL, 0, mem_end);
|
||||
if (has_real_node) {
|
||||
bootx_dt_add_prop("linux,boot-display", NULL, 0, mem_end);
|
||||
bootx_dt_add_prop("linux,opened", NULL, 0, mem_end);
|
||||
} else
|
||||
bootx_dt_add_prop("linux,bootx-noscreen", NULL, 0, mem_end);
|
||||
|
||||
tmp = bi->dispDeviceDepth;
|
||||
bootx_dt_add_prop("linux,bootx-depth", &tmp, 4, mem_end);
|
||||
tmp = bi->dispDeviceRect[2] - bi->dispDeviceRect[0];
|
||||
@ -241,11 +246,6 @@ static void __init bootx_scan_dt_build_strings(unsigned long base,
|
||||
DBG(" detected display ! adding properties names !\n");
|
||||
bootx_dt_add_string("linux,boot-display", mem_end);
|
||||
bootx_dt_add_string("linux,opened", mem_end);
|
||||
bootx_dt_add_string("linux,bootx-depth", mem_end);
|
||||
bootx_dt_add_string("linux,bootx-width", mem_end);
|
||||
bootx_dt_add_string("linux,bootx-height", mem_end);
|
||||
bootx_dt_add_string("linux,bootx-linebytes", mem_end);
|
||||
bootx_dt_add_string("linux,bootx-addr", mem_end);
|
||||
strncpy(bootx_disp_path, namep, 255);
|
||||
}
|
||||
|
||||
@ -329,10 +329,13 @@ static void __init bootx_scan_dt_build_struct(unsigned long base,
|
||||
ppp = &pp->next;
|
||||
}
|
||||
|
||||
if (node == bootx_node_chosen)
|
||||
if (node == bootx_node_chosen) {
|
||||
bootx_add_chosen_props(base, mem_end);
|
||||
if (node == bootx_info->dispDeviceRegEntryOffset)
|
||||
bootx_add_display_props(base, mem_end);
|
||||
if (bootx_info->dispDeviceRegEntryOffset == 0)
|
||||
bootx_add_display_props(base, mem_end, 0);
|
||||
}
|
||||
else if (node == bootx_info->dispDeviceRegEntryOffset)
|
||||
bootx_add_display_props(base, mem_end, 1);
|
||||
|
||||
/* do all our children */
|
||||
cpp = &np->child;
|
||||
@ -374,6 +377,14 @@ static unsigned long __init bootx_flatten_dt(unsigned long start)
|
||||
mem_end += 4;
|
||||
bootx_dt_strend = mem_end;
|
||||
bootx_scan_dt_build_strings(base, 4, &mem_end);
|
||||
/* Add some strings */
|
||||
bootx_dt_add_string("linux,bootx-noscreen", &mem_end);
|
||||
bootx_dt_add_string("linux,bootx-depth", &mem_end);
|
||||
bootx_dt_add_string("linux,bootx-width", &mem_end);
|
||||
bootx_dt_add_string("linux,bootx-height", &mem_end);
|
||||
bootx_dt_add_string("linux,bootx-linebytes", &mem_end);
|
||||
bootx_dt_add_string("linux,bootx-addr", &mem_end);
|
||||
/* Wrap up strings */
|
||||
hdr->off_dt_strings = bootx_dt_strbase - mem_start;
|
||||
hdr->dt_strings_size = bootx_dt_strend - bootx_dt_strbase;
|
||||
|
||||
@ -471,6 +482,7 @@ void __init bootx_init(unsigned long r3, unsigned long r4)
|
||||
if (bi->dispDeviceDepth == 16)
|
||||
bi->dispDeviceDepth = 15;
|
||||
|
||||
|
||||
#ifdef CONFIG_BOOTX_TEXT
|
||||
ptr = (unsigned long)bi->logicalDisplayBase;
|
||||
ptr += bi->dispDeviceRect[1] * bi->dispDeviceRowBytes;
|
||||
@ -508,6 +520,7 @@ void __init bootx_init(unsigned long r3, unsigned long r4)
|
||||
#ifdef CONFIG_BOOTX_TEXT
|
||||
btext_welcome(bi);
|
||||
#endif
|
||||
|
||||
/* New BootX enters kernel with MMU off, i/os are not allowed
|
||||
* here. This hack will have been done by the boostrap anyway.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user