aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2005-10-17 05:20:46 -0400
committerPaul Mackerras <paulus@samba.org>2005-10-17 05:20:46 -0400
commit30cd4a4e9c25e154ba087848a839bd0c6d024092 (patch)
tree8ba678b5e025b1d5e1f1b18e14662d2da720a0f7
parent7dffb72028bfd909ac51a1546d182de2df4d2426 (diff)
powerpc: Initialize btext subsystem later, after prom_init
We were initializing the btext stuff from prom_init(), thus breaking the rule that all communication between prom_init() and the rest of the kernel has to be via the flattened device tree. This removes the btext initialization calls from prom_init() and initializes it instead after the device tree is unflattened. It would be nice to do it earlier, but that needs some more infrastructure to find the properties we need in the flattened device tree. Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r--arch/powerpc/kernel/head_32.S28
-rw-r--r--arch/powerpc/kernel/prom_init.c59
-rw-r--r--arch/powerpc/kernel/setup_32.c16
-rw-r--r--arch/powerpc/mm/init_32.c7
4 files changed, 4 insertions, 106 deletions
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S
index d9b063f567e0..7ef9a3e3002b 100644
--- a/arch/powerpc/kernel/head_32.S
+++ b/arch/powerpc/kernel/head_32.S
@@ -153,9 +153,6 @@ __after_mmu_off:
153 bl flush_tlbs 153 bl flush_tlbs
154 154
155 bl initial_bats 155 bl initial_bats
156#if !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT)
157 bl setup_disp_bat
158#endif
159 156
160/* 157/*
161 * Call setup_cpu for CPU 0 and initialize 6xx Idle 158 * Call setup_cpu for CPU 0 and initialize 6xx Idle
@@ -1297,31 +1294,6 @@ initial_bats:
1297 isync 1294 isync
1298 blr 1295 blr
1299 1296
1300#if !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT)
1301setup_disp_bat:
1302 /*
1303 * setup the display bat prepared for us in prom.c
1304 */
1305 mflr r8
1306 bl reloc_offset
1307 mtlr r8
1308 addis r8,r3,disp_BAT@ha
1309 addi r8,r8,disp_BAT@l
1310 lwz r11,0(r8)
1311 lwz r8,4(r8)
1312 mfspr r9,SPRN_PVR
1313 rlwinm r9,r9,16,16,31 /* r9 = 1 for 601, 4 for 604 */
1314 cmpwi 0,r9,1
1315 beq 1f
1316 mtspr SPRN_DBAT3L,r8
1317 mtspr SPRN_DBAT3U,r11
1318 blr
13191: mtspr SPRN_IBAT3L,r8
1320 mtspr SPRN_IBAT3U,r11
1321 blr
1322
1323#endif /* !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT) */
1324
1325 1297
1326#ifdef CONFIG_8260 1298#ifdef CONFIG_8260
1327/* Jump into the system reset for the rom. 1299/* Jump into the system reset for the rom.
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index 911a803f27da..d9130c839039 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -1404,62 +1404,6 @@ static int __init prom_find_machine_type(void)
1404#endif 1404#endif
1405} 1405}
1406 1406
1407static int __init setup_disp(phandle dp)
1408{
1409#if defined(CONFIG_BOOTX_TEXT) && defined(CONFIG_PPC32)
1410 int width = 640, height = 480, depth = 8, pitch;
1411 unsigned address;
1412 u32 addrs[8][5];
1413 int i, naddrs;
1414 char name[32];
1415 char *getprop = "getprop";
1416
1417 prom_printf("Initializing screen: ");
1418
1419 memset(name, 0, sizeof(name));
1420 call_prom(getprop, 4, 1, dp, "name", name, sizeof(name));
1421 name[sizeof(name)-1] = 0;
1422 prom_print(name);
1423 prom_print("\n");
1424 call_prom(getprop, 4, 1, dp, "width", &width, sizeof(width));
1425 call_prom(getprop, 4, 1, dp, "height", &height, sizeof(height));
1426 call_prom(getprop, 4, 1, dp, "depth", &depth, sizeof(depth));
1427 pitch = width * ((depth + 7) / 8);
1428 call_prom(getprop, 4, 1, dp, "linebytes",
1429 &pitch, sizeof(pitch));
1430 if (pitch == 1)
1431 pitch = 0x1000; /* for strange IBM display */
1432 address = 0;
1433 call_prom(getprop, 4, 1, dp, "address", &address, sizeof(address));
1434 if (address == 0) {
1435 /* look for an assigned address with a size of >= 1MB */
1436 naddrs = call_prom(getprop, 4, 1, dp, "assigned-addresses",
1437 addrs, sizeof(addrs));
1438 naddrs /= 20;
1439 for (i = 0; i < naddrs; ++i) {
1440 if (addrs[i][4] >= (1 << 20)) {
1441 address = addrs[i][2];
1442 /* use the BE aperture if possible */
1443 if (addrs[i][4] >= (16 << 20))
1444 address += (8 << 20);
1445 break;
1446 }
1447 }
1448 if (address == 0) {
1449 prom_print("Failed to get address\n");
1450 return 0;
1451 }
1452 }
1453 /* kludge for valkyrie */
1454 if (strcmp(name, "valkyrie") == 0)
1455 address += 0x1000;
1456
1457 prom_printf("\n\n\n\naddress = %x\n", address);
1458 btext_setup_display(width, height, depth, pitch, address);
1459#endif /* CONFIG_BOOTX_TEXT && CONFIG_PPC32 */
1460 return 1;
1461}
1462
1463static int __init prom_set_color(ihandle ih, int i, int r, int g, int b) 1407static int __init prom_set_color(ihandle ih, int i, int r, int g, int b)
1464{ 1408{
1465 return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r); 1409 return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r);
@@ -1479,7 +1423,6 @@ static void __init prom_check_displays(void)
1479 phandle node; 1423 phandle node;
1480 ihandle ih; 1424 ihandle ih;
1481 int i; 1425 int i;
1482 int got_display = 0;
1483 1426
1484 static unsigned char default_colors[] = { 1427 static unsigned char default_colors[] = {
1485 0x00, 0x00, 0x00, 1428 0x00, 0x00, 0x00,
@@ -1546,8 +1489,6 @@ static void __init prom_check_displays(void)
1546 clut[2]) != 0) 1489 clut[2]) != 0)
1547 break; 1490 break;
1548#endif /* CONFIG_LOGO_LINUX_CLUT224 */ 1491#endif /* CONFIG_LOGO_LINUX_CLUT224 */
1549 if (!got_display)
1550 got_display = setup_disp(node);
1551 } 1492 }
1552} 1493}
1553 1494
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c
index bfa155c00ea5..e68f848f24bf 100644
--- a/arch/powerpc/kernel/setup_32.c
+++ b/arch/powerpc/kernel/setup_32.c
@@ -294,8 +294,6 @@ unsigned long __init early_init(unsigned long dt_ptr)
294{ 294{
295 unsigned long offset = reloc_offset(); 295 unsigned long offset = reloc_offset();
296 296
297 reloc_got2(offset);
298
299 /* 297 /*
300 * Identify the CPU type and fix up code sections 298 * Identify the CPU type and fix up code sections
301 * that depend on which cpu we have. 299 * that depend on which cpu we have.
@@ -303,12 +301,6 @@ unsigned long __init early_init(unsigned long dt_ptr)
303 identify_cpu(offset, 0); 301 identify_cpu(offset, 0);
304 do_cpu_ftr_fixups(offset); 302 do_cpu_ftr_fixups(offset);
305 303
306#ifdef CONFIG_BOOTX_TEXT
307 btext_prepare_BAT();
308#endif
309
310 reloc_got2(-offset);
311
312 return KERNELBASE + offset; 304 return KERNELBASE + offset;
313} 305}
314 306
@@ -578,13 +570,13 @@ void __init setup_arch(char **cmdline_p)
578 /* so udelay does something sensible, assume <= 1000 bogomips */ 570 /* so udelay does something sensible, assume <= 1000 bogomips */
579 loops_per_jiffy = 500000000 / HZ; 571 loops_per_jiffy = 500000000 / HZ;
580 572
581#ifdef CONFIG_BOOTX_TEXT
582 map_boot_text();
583#endif
584
585 unflatten_device_tree(); 573 unflatten_device_tree();
586 finish_device_tree(); 574 finish_device_tree();
587 575
576#ifdef CONFIG_BOOTX_TEXT
577 init_boot_display();
578#endif
579
588#ifdef CONFIG_PPC_MULTIPLATFORM 580#ifdef CONFIG_PPC_MULTIPLATFORM
589 /* This could be called "early setup arch", it must be done 581 /* This could be called "early setup arch", it must be done
590 * now because xmon need it 582 * now because xmon need it
diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c
index bf13c14e66b3..caeb02ee72c5 100644
--- a/arch/powerpc/mm/init_32.c
+++ b/arch/powerpc/mm/init_32.c
@@ -188,13 +188,6 @@ void __init MMU_init(void)
188 188
189 if (ppc_md.progress) 189 if (ppc_md.progress)
190 ppc_md.progress("MMU:exit", 0x211); 190 ppc_md.progress("MMU:exit", 0x211);
191
192#ifdef CONFIG_BOOTX_TEXT
193 /* By default, we are no longer mapped */
194 boot_text_mapped = 0;
195 /* Must be done last, or ppc_md.progress will die. */
196 map_boot_text();
197#endif
198} 191}
199 192
200/* This is only called until mem_init is done. */ 193/* This is only called until mem_init is done. */