vserver 1.9.5.x5
[linux-2.6.git] / arch / ppc / syslib / prom_init.c
index c9701d5..83686bc 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/ioport.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
+#include <linux/bitops.h>
 
 #include <asm/sections.h>
 #include <asm/prom.h>
@@ -26,7 +27,6 @@
 #include <asm/system.h>
 #include <asm/mmu.h>
 #include <asm/pgtable.h>
-#include <asm/bitops.h>
 #include <asm/bootinfo.h>
 #include <asm/btext.h>
 #include <asm/pci-bridge.h>
@@ -115,11 +115,11 @@ prom_entry prom __initdata;
 ihandle prom_chosen __initdata;
 ihandle prom_stdout __initdata;
 
-char *prom_display_paths[FB_MAX] __initdata;
-phandle prom_display_nodes[FB_MAX] __initdata;
-unsigned int prom_num_displays __initdata;
-char *of_stdout_device __initdata;
+static char *prom_display_paths[FB_MAX] __initdata;
+static phandle prom_display_nodes[FB_MAX] __initdata;
+static unsigned int prom_num_displays __initdata;
 static ihandle prom_disp_node __initdata;
+char *of_stdout_device __initdata;
 
 unsigned int rtas_data;   /* physical pointer */
 unsigned int rtas_entry;  /* physical pointer */
@@ -403,6 +403,7 @@ check_display(unsigned long mem)
 
        for (j=0; j<prom_num_displays; j++) {
                path = prom_display_paths[j];
+               node = prom_display_nodes[j];
                prom_print("opening display ");
                prom_print(path);
                ih = call_prom("open", 1, 1, path);
@@ -420,6 +421,8 @@ check_display(unsigned long mem)
                        continue;
                } else {
                        prom_print("... ok\n");
+                       call_prom("setprop", 4, 1, node, "linux,opened", 0, NULL);
+
                        /*
                         * Setup a usable color table when the appropriate
                         * method is available.
@@ -441,6 +444,19 @@ check_display(unsigned long mem)
 #endif /* CONFIG_LOGO_LINUX_CLUT224 */
                }
        }
+       
+       if (prom_stdout) {
+               phandle p;
+               p = call_prom("instance-to-package", 1, 1, prom_stdout);
+               if (p && (int)p != -1) {
+                       type[0] = 0;
+                       call_prom("getprop", 4, 1, p, "device_type",
+                                 type, sizeof(type));
+                       if (strcmp(type, "display") == 0)
+                               call_prom("setprop", 4, 1, p, "linux,boot-display",
+                                         0, NULL);
+               }
+       }
 
        return ALIGNUL(mem);
 }
@@ -794,6 +810,9 @@ prom_init(int r3, int r4, prom_entry pp)
        char *p, *d;
        unsigned long phys;
        void *result[3];
+       char model[32];
+       phandle node;
+       int rc;
 
        /* Default */
        phys = (unsigned long) &_stext;
@@ -850,11 +869,20 @@ prom_init(int r3, int r4, prom_entry pp)
 
        klimit = (char *) (mem - offset);
 
-       /* If we are already running at 0xc0000000, we assume we were
-        * loaded by an OF bootloader which did set a BAT for us.
-        * This breaks OF translate so we force phys to be 0.
-        */
-       if (offset == 0) {
+       node = call_prom("finddevice", 1, 1, "/");
+       rc = call_prom("getprop", 4, 1, node, "model", model, sizeof(model));
+       if (rc > 0 && !strncmp (model, "Pegasos", 7)
+               && strncmp (model, "Pegasos2", 8)) {
+               /* Pegasos 1 has a broken translate method in the OF,
+                * and furthermore the BATs are mapped 1:1 so the phys
+                * address calculated above is correct, so let's use
+                * it directly.
+                */
+       } else if (offset == 0) {
+               /* If we are already running at 0xc0000000, we assume we were
+                * loaded by an OF bootloader which did set a BAT for us.
+                * This breaks OF translate so we force phys to be 0.
+                */
                prom_print("(already at 0xc0000000) phys=0\n");
                phys = 0;
        } else if ((int) call_prom("getprop", 4, 1, prom_chosen, "mmu",