[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[XenPPC] [PATCH] changes for g5 hardware



Signed-off-by: Maria Butrico <butrico@xxxxxxxxxxxxxx>


diff -r 1bdd8ec03da5 xen/arch/ppc/boot_of.c
--- a/xen/arch/ppc/boot_of.c    Thu Mar 30 18:40:26 2006 -0500
+++ b/xen/arch/ppc/boot_of.c    Fri Mar 31 10:30:25 2006 -0500
@@ -155,7 +155,7 @@ static int __init of_getprop(int ph, con
         return OF_FAILURE;
     }
 
-    DBG("getprop 0x%x %s -> %s\n", ph, name, (char *)buf);
+    DBG("getprop 0x%x %s -> 0x%x (%s)\n", ph, name, rets[0], (char *)buf);
     return rets[0];
 }
 
@@ -176,6 +176,9 @@ static int __init of_setprop(int ph, con
 }
 #endif
 
+/*
+ * returns 0 if there are no children (of spec)
+ */
 static int __init of_getchild(int ph)
 {
     int rets[1] = { OF_FAILURE };
@@ -186,6 +189,9 @@ static int __init of_getchild(int ph)
     return rets[0];
 }
 
+/*
+ * returns 0 is there are no peers
+ */
 static int __init of_getpeer(int ph)
 {
     int rets[1] = { OF_FAILURE };
@@ -205,7 +211,7 @@ static int __init of_getproplen(int ph, 
         DBG("getproplen 0x%x %s -> FAILURE\n", ph, name);
         return OF_FAILURE;
     }
-    DBG("getproplen 0x%x %s -> 0x0x%x\n", ph, name, rets[0]);
+    DBG("getproplen 0x%x %s -> 0x%x\n", ph, name, rets[0]);
     return rets[0];
 }
 
@@ -214,9 +220,11 @@ static int __init of_package_to_path(int
     int rets[1] = { OF_FAILURE };
 
     of_call("package-to-path", 3, 1, rets, ph, buffer, buflen);
-    if (rets[0] == OF_FAILURE)
-        return OF_FAILURE;
-
+    if (rets[0] == OF_FAILURE) {
+        DBG("%s 0x%x -> FAILURE\n", __func__, ph);
+        return OF_FAILURE;
+    }
+    DBG("%s 0x%x %s -> 0x%x\n", __func__, ph, buffer, rets[0]);
     return rets[0];
 }
 
@@ -256,6 +264,30 @@ static int __init of_start_cpu(int cpu, 
     return rets[0];
 }
 
+static void __init of_test(char * of_method_name)
+{
+    int rets[1] = { OF_FAILURE };
+    
+    of_call("test", 1, 1, rets, of_method_name);
+    if (rets[0] == OF_FAILURE ) {
+        of_printf("Warning: possibly no OF method %s.\n"
+                  "(Ignore this warning on PIBS.)\n", of_method_name);
+    }
+}
+
+static int __init of_claim(void * virt, u32 size)
+{
+    int rets[1] = { OF_FAILURE };
+    
+    of_call("claim", 3, 1, rets, virt, size, 0/*align*/);
+    if (rets[0] == OF_FAILURE) {
+        DBG("%s 0x%p 0x%08x -> FAIL\n", __func__, virt, size);
+        return OF_FAILURE;
+    }
+
+    DBG("%s 0x%p 0x%08x -> 0x%x\n", __func__, virt, size, rets[0]);
+    return rets[0];
+}
 
 #if unused_but_will_be
 
@@ -302,6 +334,8 @@ static void boot_of_probemem(multiboot_i
     /* code is writen to assume sizes of 1 */
     of_getprop(root, "#address-cells", &addr_cells, sizeof (addr_cells));
     of_getprop(root, "#size-cells", &size_cells, sizeof (size_cells));
+    DBG("%s: address_cells=%d  size_cells=%d\n",
+                    __func__, addr_cells, size_cells);
     
     do {
         const char memory[] = "memory";
@@ -311,41 +345,54 @@ static void boot_of_probemem(multiboot_i
 
         of_getprop(p, "device_type", type, sizeof (type));
         if (strncmp(type, memory, sizeof (memory)) == 0) {
-            u32 reg[16];
+            u32 reg[48];  
+            u32 al, ah, ll, lh;
             int r;
 
             rc = of_getprop(p, "reg", reg, sizeof (reg));
-            if (rc <= 0) {
-                of_printf("no reg property for memory node: 0x%x\n", p);
-                for (;;);
+            if (rc == OF_FAILURE) {
+                of_panic("no reg property for memory node: 0x%x.\n", p);
             }
-
-            mmap[mcount].size = 20; /* - size field */
-            mmap[mcount].type = 1; /* Regular ram */
-
+            int l = rc/sizeof(u32); /* number reg element */
+            DBG("%s: number of bytes in property 'reg' %d\n",
+                            __func__, rc);
+            
             r = 0;
-            if (addr_cells == 2) {
-                mmap[mcount].base_addr_high = reg[r++];
-                mmap[mcount].base_addr_low = reg[r++];
-            } else {
-                mmap[mcount].base_addr_high = 0;
-                mmap[mcount].base_addr_low = reg[r++];
-            }
-            if (size_cells == 2) {
-                mmap[mcount].length_high = reg[r++];
-                mmap[mcount].length_low = reg[r];
-            } else {
-                mmap[mcount].length_high = 0;
-                mmap[mcount].length_low = reg[r];
-            }
-
-            of_printf("%s: memory 0x%lx[0x%lx]\n",
+            while (r < l) {
+                al = ah = ll = lh = 0;
+                if (addr_cells == 2) {
+                    ah = reg[r++];
+                    if (r >= l) break;  // partial line.  Skip
+                    al = reg[r++];
+                    if (r >= l) break;  // partial line.  Skip
+                } else {
+                    al = reg[r++];
+                    if (r >= l) break;  // partial line.  Skip
+                }
+                if (size_cells == 2) {
+                    lh = reg[r++];
+                    if (r >= l) break;  // partial line.  Skip
+                    ll = reg[r++];
+                } else {
+                    ll = reg[r++];
+                }
+
+                if ((ll != 0) || (lh != 0)) {
+                    mmap[mcount].size = 20; /* - size field */
+                    mmap[mcount].type = 1; /* Regular ram */
+                    mmap[mcount].length_high = lh;
+                    mmap[mcount].length_low = ll;
+                    mmap[mcount].base_addr_high = ah;
+                    mmap[mcount].base_addr_low = al;
+                    of_printf("%s: memory 0x%016lx[0x%08lx]\n",
                       __func__,
                       (u64)(((u64)mmap[mcount].base_addr_high << 32)
                             | mmap[mcount].base_addr_low),
                       (u64)(((u64)mmap[mcount].length_high << 32)
                             | mmap[mcount].length_low));
-            ++mcount;
+                    ++mcount;
+                }
+            }
         }
         p = of_getpeer(p);
     } while (p != OF_FAILURE && p != 0);
@@ -365,7 +412,7 @@ static void boot_of_bootargs(multiboot_i
     const char sepr[] = " -- ";
 
     rc = of_getprop(bof_chosen, "bootargs", &bootargs, sizeof (bootargs));
-    if (rc <= 0) {
+    if (rc == OF_FAILURE) {
         strcpy(bootargs, "xen");
     }
 
@@ -404,7 +451,7 @@ static int save_props(void *m, ofdn_t n,
 
     while (result > 0) {
         int sz;
-        u64 obj[128];
+        u64 obj[1024];
 
         sz = of_getproplen(pkg, name);
         if (sz >= 0) {
@@ -432,6 +479,7 @@ static int save_props(void *m, ofdn_t n,
             if (strncmp(name, devtype_str, sizeof(devtype_str)) == 0) {
                 found_device_type = 1;
             }
+
             pos = ofd_prop_add(m, n, name, obj, actual);
             if (pos == 0) of_panic("prop_create");
         }
@@ -457,7 +505,7 @@ retry:
 
     if (pnext != 0) {
         sz = of_package_to_path(pnext, path, psz);
-        if (sz <= 0) of_panic("bad path\n");
+        if (sz == OF_FAILURE) of_panic("bad path\n");
 
         nnext = ofd_node_child_create(m, n, path, sz);
         if (nnext == 0) of_panic("out of mem\n");
@@ -472,7 +520,7 @@ retry:
         sz = of_package_to_path(pnext, path, psz);
 
         nnext = ofd_node_peer_create(m, n, path, sz);
-        if (nnext <= 0) of_panic("out of mem\n");
+        if (nnext <= 0) of_panic("out of space in OFD tree.\n");
 
         n = nnext;
         p = pnext;
@@ -491,7 +539,7 @@ static int pkg_save(void *mem)
 
     /* get root */
     root = of_getpeer(0);
-    if (root < 0) of_panic("no root package\n");
+    if (root == OF_FAILURE) of_panic("no root package\n");
 
     do_pkg(mem, OFD_ROOT, root, path, sizeof(path));
 
@@ -528,16 +576,29 @@ static int boot_of_fixup_refs(void *mem)
             if (path == NULL) of_panic("no path to found prop: %s\n", name);
 
             rp = of_finddevice(path);
-            if (rp <= 0) of_panic("no real device for: %s\n", path);
+            if (rp == OF_FAILURE)
+                of_panic("no real device for: name %s, path %s\n",
+                          name, path);
+            /* Note: In theory 0 is a valid node handle but it is highly
+             * unlikely.
+             */
+            if (rp == 0) {
+                of_panic("%s: of_finddevice returns 0 for path %s\n",
+                                    __func__, path);
+            } 
 
             rc = of_getprop(rp, name, &ref, sizeof(ref));
-            if (rc <= 0) of_panic("no prop: %s\n", name);
+            if ((rc == OF_FAILURE) || (rc == 0))
+                of_panic("no prop: name %s, path %s, device 0x%x\n",
+                         name, path, rp);
 
             rc = of_package_to_path(ref, ofpath, sizeof (ofpath));
-            if (rc <= 0) of_panic("no package: %s\n", name);
+            if (rc == OF_FAILURE)
+                of_panic("no package: name %s, path %s, device 0x%x,\n"
+                         "ref 0x%x\n", name, path, rp, ref);
 
             dp = ofd_node_find(mem, ofpath);
-            if (dp < 0) of_panic("no node for: %s\n", ofpath);
+            if (dp <= 0) of_panic("no node for: %s\n", ofpath);
 
             ref = dp;
 
@@ -565,16 +626,16 @@ static int boot_of_fixup_chosen(void *me
     char ofpath[256];
 
     ch = of_finddevice("/chosen");
-    if (ch <= 0) of_panic("/chosen not found\n");
+    if (ch == OF_FAILURE) of_panic("/chosen not found\n");
 
     rc = of_getprop(ch, "cpu", &val, sizeof (val));
 
-    if (rc > 0) {
+    if (rc != OF_FAILURE) {
         rc = of_instance_to_path(val, ofpath, sizeof (ofpath));
 
         if (rc > 0) {
             dn = ofd_node_find(mem, ofpath);
-            if (dn < 0) of_panic("no node for: %s\n", ofpath);
+            if (dn <= 0) of_panic("no node for: %s\n", ofpath);
 
             boot_cpu = dn;
             val = dn;
@@ -594,22 +655,48 @@ static int boot_of_fixup_chosen(void *me
     return rc;
 }
 
-static void boot_of_module(ulong r3, ulong r4, multiboot_info_t *mbi)
-{
-    static module_t mods[3];
+static ulong space_base;
+static ulong find_space(u32 size, ulong align, multiboot_info_t *mbi)
+{
     memory_map_t *map = (memory_map_t *)((ulong)mbi->mmap_addr);
     ulong eomem = ((u64)map->length_high << 32) | (u64)map->length_low;
+    ulong base;
+
+    of_printf("%s base=0x%016lx  eomem=0x%016lx  size=0x%08x  align=0x%lx\n",
+                    __func__, space_base, eomem, size, align);
+    base = ALIGN_UP(space_base, PAGE_SIZE);
+    if ((base + size) >= 0x4000000) return 0;
+    if (base + size > eomem) of_panic("not enough RAM\n");
+
+    if (size == 0) return base;
+    if (of_claim((void*)base, size) != OF_FAILURE) {
+        space_base = base + size;
+        return base;
+    } else {
+        for(base += 0x100000; (base+size) < 0x4000000; base += 0x100000) {
+            of_printf("Trying 0x%016lx\n", base);
+            if (of_claim((void*)base, size) != OF_FAILURE) {
+                space_base = base + size;
+                return base;
+            }
+        }
+        return 0;
+    }
+}
+
+static void boot_of_module(ulong r3, ulong r4, multiboot_info_t *mbi)
+{
+    static module_t mods[3];
     void *oftree;
     ulong oftree_sz = 48 * PAGE_SIZE;
-    ulong ofstart;
     char *mod0_start;
     ulong mod0_size;
-    ulong mod0 =  ALIGN_UP((ulong)_end, PAGE_SIZE);
+    ulong mod0;
     extern char dom0_start[] __attribute__ ((weak));
     extern char dom0_size[] __attribute__ ((weak));
     char *p;
 
-    if (r3 > 0 && r4 > 0) {
+    if ((r3 > 0) && (r4 > 0)) {
         /* was it handed to us in registers ? */
         mod0_start = (void *)r3;
         mod0_size = r4;
@@ -630,37 +717,54 @@ static void boot_of_module(ulong r3, ulo
                       mod0_start[2],
                       mod0_start[3]);
 
-        } else if ( (ulong)dom0_start != 0 && (ulong)dom0_size != 0 ) {
+        } else if ( ((ulong)dom0_start != 0) && ((ulong)dom0_size != 0) ) {
             /* was it linked in ? */
-            of_printf("%s: linked in module copied after _end\n", __func__);
         
             mod0_start = dom0_start;
             mod0_size = (ulong)dom0_size;
+            of_printf("%s: linked in module copied after _end "
+                      "(start 0x%p size 0x%lx)\n",
+                      __func__, mod0_start, mod0_size);
         } else {
             mod0_start = _end;
             mod0_size = 0;
         }
     }
 
-    memcpy((void *)mod0, mod0_start, mod0_size);
-    mods[0].mod_start = mod0;
-    mods[0].mod_end = mod0 + mod0_size;
+    space_base = (ulong)_end;
+    mod0 = find_space(mod0_size, PAGE_SIZE, mbi);
+
+    /* three cases
+     * 1) mod0_size is not 0 and the image can be copied
+     * 2) mod0_size is not 0 and the image cannot be copied
+     * 3) mod0_size is 0
+     */
+    if (mod0_size > 0) {
+        if (mod0 != 0) {
+            memcpy((void *)mod0, mod0_start, mod0_size);
+            mods[0].mod_start = mod0;
+            mods[0].mod_end = mod0 + mod0_size;
+        } else {
+            of_panic("No space to copy mod0\n");
+        }
+    } else {
+        mods[0].mod_start = mod0;
+        mods[0].mod_end = mod0;
+    }
+
     if (dom0args[0] != '\0') {
         mods[0].string = (ulong)dom0args;
     }
         
-    of_printf("%s: mod[0] @ 0x%x[0x%x]\n", __func__,
+    of_printf("%s: mod[0] @ 0x%016x[0x%x]\n", __func__,
               mods[0].mod_start, mods[0].mod_end);
 
-    ofstart = mods[0].mod_end;
-
     /* snapshot the tree */
-    oftree = (void *)ALIGN_UP(ofstart, PAGE_SIZE);
-
-    if ((ulong)oftree + oftree_sz >  eomem)
-        of_panic("not enough RAM for OF image\n");
+    oftree = (void*)find_space(oftree_sz, PAGE_SIZE, mbi);
+    if (oftree == 0) of_panic("Could not allocate OFD tree\n");
 
     of_printf("creating oftree\n");
+    of_test("package-to-path");
     ofd_create(oftree, oftree_sz);
     pkg_save(oftree);
 
@@ -671,10 +775,14 @@ static void boot_of_module(ulong r3, ulo
 
     mods[1].mod_start = (ulong)oftree;
     mods[1].mod_end = mods[1].mod_start + oftree_sz;
+    of_printf("%s: mod[1] @ 0x%016x[0x%x]\n", __func__,
+              mods[1].mod_start, mods[1].mod_end);
+
 
     mbi->flags |= MBI_MODULES;
     mbi->mods_count = 2;
     mbi->mods_addr = (u32)mods;
+
 }
 
 
@@ -698,8 +806,7 @@ int __init boot_of_cpus(void)
     result = of_getprop(cpu, "timebase-frequency", &timebase_freq,
             sizeof(timebase_freq));
     if (result == OF_FAILURE) {
-        of_printf("Couldn't get timebase frequency!\n");
-        for (;;);
+        of_panic("Couldn't get timebase frequency!\n");
     }
     of_printf("OF: timebase-frequency = 0x%x\n", timebase_freq);
 
@@ -736,15 +843,17 @@ multiboot_info_t __init *boot_of_init(
               XEN_COMPILE_BY, XEN_COMPILE_DOMAIN,
               XEN_COMPILER, XEN_COMPILE_DATE);
 
-    of_printf("boot args: 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx\n"
+    of_printf("%s args: 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx\n"
             "boot msr: 0x%lx\n",
+            __func__,
             r3, r4, vec, r6, r7, orig_msr);
 
-    if (vec >= (ulong)_start && vec <= (ulong)_end) {
+    if ((vec >= (ulong)_start) && (vec <= (ulong)_end)) {
         of_printf("Hmm.. OF[0x%lx] seems to have stepped on our image "
                 "that ranges: %p .. %p.\n HANG!\n",
                 vec, _start, _end);
     }
+    of_printf("%s: _start %p _end %p 0x%lx\n", __func__, _start, _end, r6);
 
     boot_of_probemem(&mbi);
     boot_of_bootargs(&mbi);

_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.