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

[XenPPC] [pushed] [ppc] rename find_mpic.c to mpic_init.c



changeset:   10295:35f36c2942857b3d50456bab09fd38bff7d3d3b9
user:        jimix@xxxxxxxxxxxxxxxxxxxxx
date:        Thu May 18 14:21:33 2006 -0400
files:       xen/arch/ppc/Makefile xen/arch/ppc/find_mpic.c 
xen/arch/ppc/mpic_init.c
description:
[ppc] rename find_mpic.c to mpic_init.c


diff -r 15abac8416e7c3bbab6f24eb5288675bead70af0 -r 
35f36c2942857b3d50456bab09fd38bff7d3d3b9 xen/arch/ppc/Makefile
--- a/xen/arch/ppc/Makefile     Thu May 18 14:19:42 2006 -0400
+++ b/xen/arch/ppc/Makefile     Thu May 18 14:21:33 2006 -0400
@@ -26,6 +26,7 @@ obj-y += mambo.o
 obj-y += mambo.o
 obj-y += mm.o
 obj-y += mpic.o
+obj-y += mpic_init.o
 obj-y += of-devtree.o
 obj-y += of-devwalk.o
 obj-y += ofd_fixup.o
@@ -36,7 +37,6 @@ obj-y += smp.o
 obj-y += smp.o
 obj-y += time.o
 obj-y += usercopy.o
-obj-y += find_mpic.o
 
 obj-$(debug) += 0opt.o
 obj-$(crash_debug) += gdbstub.o
diff -r 15abac8416e7c3bbab6f24eb5288675bead70af0 -r 
35f36c2942857b3d50456bab09fd38bff7d3d3b9 xen/arch/ppc/mpic_init.c
--- /dev/null   Thu Jan  1 00:00:00 1970 +0000
+++ b/xen/arch/ppc/mpic_init.c  Thu May 18 14:21:33 2006 -0400
@@ -0,0 +1,317 @@
+
+#include <xen/config.h>
+#include <xen/init.h>
+#include <xen/lib.h>
+#include <xen/compile.h>
+#include <public/of-devtree.h>
+#include <asm/mpic.h>
+
+#undef DEBUG
+#undef NOSERIAL
+#ifdef DEBUG
+#ifdef NOSERIAL
+int of_printf(const char *fmt, ...)
+    __attribute__ ((format (printf, 1, 2)));
+#define DBG(fmt...) of_printf(fmt)
+#else
+#define DBG(fmt...) printk(fmt)
+#endif  /* #ifdef NOSERIAL */
+#else
+#define DBG(fmt...)
+#endif
+
+#define PANIC(fmt...) DBG(fmt)
+
+unsigned long opic_addr;
+unsigned int opic_flags;
+
+
+/*
+ * from OF_IEEE_1275
+ *
+ * pg 175, property "ranges"
+ *
+ * The number of integers in each size entry is determined by the
+ * value of the #size-cells property of this node (the node in which
+ * the ranges property appears) or 1 if the #size-cells property is
+ * absent.
+ *
+ *
+ * pg 177, property "reg"
+ *
+ * The number of integers in each size entry is determined by the
+ * value of the "#size-cells" property in the parent node.  If the
+ * parent node has no such property, the value is one.
+ */
+static unsigned long reg2(void *oft_p, ofdn_t c)
+{
+    int rc;
+    /* the struct isa_reg_property is for a value of 2 for
+     * #address-cells and a value of 1 for #size-cells (of the
+     * parent).
+     */
+    struct isa_reg_property {
+        u32 space;
+        u32 address;
+        u32 size;
+    } isa_reg;
+
+    rc = ofd_getprop(oft_p, c, "reg", &isa_reg, sizeof(isa_reg));
+
+    DBG("%s: reg property address=0x%08x  size=0x%08x\n", __func__,
+                    isa_reg.address, isa_reg.size);
+    return isa_reg.address;
+}
+
+static unsigned long reg1(void *oft_p, ofdn_t c)
+{
+    int rc;
+    /* the struct reg_property32 is for a value of 1 for
+     * #address-cells and a value of 1 for #size-cells.
+     */
+    struct reg_property32 {
+        u32 address;
+        u32 size;
+    } reg;
+
+    rc = ofd_getprop(oft_p, c, "reg", &reg, sizeof(reg));
+
+    DBG("%s: reg property address=0x%08x  size=0x%08x\n", __func__,
+                        reg.address, reg.size);
+    return reg.address;
+}
+
+static unsigned long find_reg_addr_from_node(void *oft_p, ofdn_t c)
+{
+    int p_len;
+    unsigned long reg_addr = 0;
+    u32 size_c = 1;
+    u32 addr_c = 2;
+    ofdn_t parent;
+
+    if (c == OFD_ROOT) {
+        parent = c;
+    } else {
+        parent = ofd_node_parent(oft_p, c);
+    }
+
+    p_len = ofd_getprop(oft_p, parent, "#size-cells", &size_c, sizeof(size_c));
+    DBG("%s size is %d\n", __func__, size_c);
+
+    p_len = ofd_getprop(oft_p, parent, "#address-cells", &addr_c,
+                        sizeof(addr_c));
+    DBG("%s address is %d\n", __func__, addr_c);
+
+    if ( 1 != size_c ) {
+        PANIC("Unsupported size for reg property\n");
+    }
+    
+    if ( 1 == addr_c) {
+        reg_addr = reg1(oft_p, c);
+    } else if ( 2 == addr_c ) {
+        reg_addr = reg2(oft_p, c);
+    } else {
+        PANIC("Unsupported address size for reg property\n");
+    }
+    DBG("%s: address 0x%lx\n", __func__, reg_addr);
+    return reg_addr;
+}
+
+/*
+ * from OF_IEEE_1275
+ *
+ * pg 175, property "ranges"
+ * 
+ * The ranges property value is a sequence of child-phys parent-phys
+ * size specifications. Child-phys is an address, encoded as with
+ * encode-phys, in the child address space. Parent-phys is an address
+ * (likewise encoded as with encode-phys) in the parent address
+ * space. Size is a list of integers, each encoded as with encode-int,
+ * denoting the length of the child's address range.
+ */
+static unsigned long find_ranges_addr_from_node(void *oft_p, ofdn_t c)
+{
+    unsigned long ranges_addr = 0;
+    int ranges_i;
+    ofdn_t parent;
+    u32 addr_c = 2;
+    u32 ranges[64];
+    int p_len;
+
+    parent = ofd_node_parent(oft_p, c);
+    parent = ofd_node_parent(oft_p, parent);
+
+    p_len = ofd_getprop(oft_p, parent, "ranges", &ranges, sizeof(ranges));
+    DBG("%s: ranges\n", __func__);
+    int i; for (i=0; i<p_len; i++) {DBG("%08x ", ranges[i]);}
+    DBG("\n");
+
+    p_len = ofd_getprop(oft_p, parent, "#address-cells",
+                        &addr_c, sizeof(addr_c));
+    DBG("%s address is %d\n", __func__, addr_c);
+    ranges_i = addr_c;  /* skip over the child address */
+    
+    DBG("%s address is %d\n", __func__, addr_c);
+    switch (addr_c) {
+    case 1: 
+        ranges_addr = ranges[ranges_i];
+        break;
+    case 2:
+        ranges_addr = (((u64)ranges[ranges_i]) << 32) |
+                      ranges[ranges_i + 1];
+        break;
+    case 3:  /* the G5 case, how to squeeze 96 bits into 64 */
+        ranges_addr = (((u64)ranges[ranges_i+1]) << 32) |
+                      ranges[ranges_i + 2];
+        break;
+    case 4:
+        ranges_addr = (((u64)ranges[ranges_i+2]) << 32) |
+                      ranges[ranges_i + 4];
+        break;
+    default:
+        PANIC("#address-cells out of range\n");
+        break;
+    }
+    
+    DBG("%s: address 0x%lx\n", __func__, ranges_addr);
+    return ranges_addr;
+}
+
+static unsigned long find_pic_address_from_node(void *oft_p, ofdn_t c)
+{
+    unsigned long reg_addr, range_addr, addr;
+
+    /*
+     * The address is the sum of the address in the reg property of this node
+     * and the ranges property of the granparent node.
+     */
+    reg_addr = find_reg_addr_from_node(oft_p, c);
+    range_addr = find_ranges_addr_from_node(oft_p, c);
+    addr = reg_addr + range_addr;
+    DBG("%s: address 0x%lx\n", __func__, addr);
+    return addr;
+}
+
+static unsigned int find_pic_flags_from_node(void *oft_p, ofdn_t c)
+{
+    int be_len;
+    unsigned int flags = 0;
+
+    /* does it have the property big endian? */
+    be_len = ofd_getprop(oft_p, c, "big_endian", NULL, 0);
+    if (be_len >= 0) {
+        DBG("%s: Big Endian found\n", __func__);
+        flags |= MPIC_BIG_ENDIAN;
+    }
+    DBG("%s: flags 0x%x\n", __func__, flags);
+    return flags;
+}
+
+static int find_mpic_simple_probe(void *oft_p )
+{
+    u32 addr_cells;
+    int rc;
+    u32 addr[2];
+
+    rc = ofd_getprop(oft_p, OFD_ROOT, "#address-cells",
+                     &addr_cells, sizeof(addr_cells));
+    if ( rc < 0 ) {
+        /* if the property does not exist use its default value, 2 */
+        addr_cells = 2;
+    }
+
+    rc = ofd_getprop(oft_p, OFD_ROOT, "platform-open-pic", addr, sizeof(addr));
+    if (rc < 0) {
+        return rc;
+    }
+
+    opic_addr = addr[0];
+    if (addr_cells == 2) {
+        opic_addr <<= 32;
+        opic_addr |= addr[1];
+    }
+    DBG("%s: found OpenPIC at: 0x%lx\n", __func__, opic_addr);
+    /* we did not really find the pic device, only its address. 
+     * We use big endian by default
+     */
+    opic_flags |= MPIC_BIG_ENDIAN | MPIC_BROKEN_U3;
+    return 0;
+}
+
+static int find_mpic_canonical_probe(void *oft_p)
+{
+    ofdn_t c;
+    const char mpic_type[] = "open-pic";
+    /* some paths are special and we cannot find the address
+     * by the usual method */
+    const char *excluded_paths[] = { "/interrupt-controller" };
+
+    /*
+     * Search through the OFD tree for all devices of type 'open_pic'.
+     * We select the one without an 'interrupt' property.
+     */
+    c = ofd_node_find_by_prop(oft_p, OFD_ROOT, "device_type", mpic_type,
+                                        sizeof(mpic_type));
+    while (c > 0) {
+        int int_len;
+        int good_mpic;
+        const char * path = ofd_node_path(oft_p, c);
+
+        good_mpic = 0;
+        int_len = ofd_getprop(oft_p, c, "interrupts", NULL, 0);
+        if (int_len < 0) {
+            int i;
+
+            /* there is no property interrupt.  This could be the pic */
+            DBG("%s: potential OpenPIC in: %s\n", __func__, path);
+            good_mpic = 1;
+
+            for (i = 0; i < ARRAY_SIZE(excluded_paths) && good_mpic; i++) {
+                const char *excluded_path = excluded_paths[i];
+                if (!strncmp(path, excluded_path, strlen(excluded_path)))
+                    good_mpic = 0;
+            }
+        }
+
+        if (good_mpic) {
+            DBG("%s: found OpenPIC in: %s\n", __func__, path);
+            opic_addr = find_pic_address_from_node(oft_p, c);
+            opic_flags = find_pic_flags_from_node(oft_p, c);
+            return 0;
+        }
+
+        c = ofd_node_find_next(oft_p, c);
+    }
+
+    DBG("%s: Could not find a pic\n", __func__);
+    return -1;
+}
+
+int find_mpic(unsigned long oftree)
+{
+    void *oft_p;
+    int rc;
+
+    opic_addr = (unsigned long) -1;
+    opic_flags = 0;
+
+    oft_p = (void *) oftree;
+    rc = find_mpic_simple_probe(oft_p);
+
+    if (rc < 0) {
+        DBG("%s: Searching for pic ...\n", __func__);
+        rc = find_mpic_canonical_probe(oft_p);
+    }
+
+    return rc;
+}
+
+unsigned long get_mpic_address()
+{
+    return opic_addr;
+}
+
+unsigned int get_mpic_flags()
+{
+    return opic_flags;
+}
diff -r 15abac8416e7c3bbab6f24eb5288675bead70af0 -r 
35f36c2942857b3d50456bab09fd38bff7d3d3b9 xen/arch/ppc/find_mpic.c
--- a/xen/arch/ppc/find_mpic.c  Thu May 18 14:19:42 2006 -0400
+++ /dev/null   Thu Jan  1 00:00:00 1970 +0000
@@ -1,317 +0,0 @@
-
-#include <xen/config.h>
-#include <xen/init.h>
-#include <xen/lib.h>
-#include <xen/compile.h>
-#include <public/of-devtree.h>
-#include <asm/mpic.h>
-
-#undef DEBUG
-#undef NOSERIAL
-#ifdef DEBUG
-#ifdef NOSERIAL
-int of_printf(const char *fmt, ...)
-    __attribute__ ((format (printf, 1, 2)));
-#define DBG(fmt...) of_printf(fmt)
-#else
-#define DBG(fmt...) printk(fmt)
-#endif  /* #ifdef NOSERIAL */
-#else
-#define DBG(fmt...)
-#endif
-
-#define PANIC(fmt...) DBG(fmt)
-
-unsigned long opic_addr;
-unsigned int opic_flags;
-
-
-/*
- * from OF_IEEE_1275
- *
- * pg 175, property "ranges"
- *
- * The number of integers in each size entry is determined by the
- * value of the #size-cells property of this node (the node in which
- * the ranges property appears) or 1 if the #size-cells property is
- * absent.
- *
- *
- * pg 177, property "reg"
- *
- * The number of integers in each size entry is determined by the
- * value of the "#size-cells" property in the parent node.  If the
- * parent node has no such property, the value is one.
- */
-static unsigned long reg2(void *oft_p, ofdn_t c)
-{
-    int rc;
-    /* the struct isa_reg_property is for a value of 2 for
-     * #address-cells and a value of 1 for #size-cells (of the
-     * parent).
-     */
-    struct isa_reg_property {
-        u32 space;
-        u32 address;
-        u32 size;
-    } isa_reg;
-
-    rc = ofd_getprop(oft_p, c, "reg", &isa_reg, sizeof(isa_reg));
-
-    DBG("%s: reg property address=0x%08x  size=0x%08x\n", __func__,
-                    isa_reg.address, isa_reg.size);
-    return isa_reg.address;
-}
-
-static unsigned long reg1(void *oft_p, ofdn_t c)
-{
-    int rc;
-    /* the struct reg_property32 is for a value of 1 for
-     * #address-cells and a value of 1 for #size-cells.
-     */
-    struct reg_property32 {
-        u32 address;
-        u32 size;
-    } reg;
-
-    rc = ofd_getprop(oft_p, c, "reg", &reg, sizeof(reg));
-
-    DBG("%s: reg property address=0x%08x  size=0x%08x\n", __func__,
-                        reg.address, reg.size);
-    return reg.address;
-}
-
-static unsigned long find_reg_addr_from_node(void *oft_p, ofdn_t c)
-{
-    int p_len;
-    unsigned long reg_addr = 0;
-    u32 size_c = 1;
-    u32 addr_c = 2;
-    ofdn_t parent;
-
-    if (c == OFD_ROOT) {
-        parent = c;
-    } else {
-        parent = ofd_node_parent(oft_p, c);
-    }
-
-    p_len = ofd_getprop(oft_p, parent, "#size-cells", &size_c, sizeof(size_c));
-    DBG("%s size is %d\n", __func__, size_c);
-
-    p_len = ofd_getprop(oft_p, parent, "#address-cells", &addr_c,
-                        sizeof(addr_c));
-    DBG("%s address is %d\n", __func__, addr_c);
-
-    if ( 1 != size_c ) {
-        PANIC("Unsupported size for reg property\n");
-    }
-    
-    if ( 1 == addr_c) {
-        reg_addr = reg1(oft_p, c);
-    } else if ( 2 == addr_c ) {
-        reg_addr = reg2(oft_p, c);
-    } else {
-        PANIC("Unsupported address size for reg property\n");
-    }
-    DBG("%s: address 0x%lx\n", __func__, reg_addr);
-    return reg_addr;
-}
-
-/*
- * from OF_IEEE_1275
- *
- * pg 175, property "ranges"
- * 
- * The ranges property value is a sequence of child-phys parent-phys
- * size specifications. Child-phys is an address, encoded as with
- * encode-phys, in the child address space. Parent-phys is an address
- * (likewise encoded as with encode-phys) in the parent address
- * space. Size is a list of integers, each encoded as with encode-int,
- * denoting the length of the child's address range.
- */
-static unsigned long find_ranges_addr_from_node(void *oft_p, ofdn_t c)
-{
-    unsigned long ranges_addr = 0;
-    int ranges_i;
-    ofdn_t parent;
-    u32 addr_c = 2;
-    u32 ranges[64];
-    int p_len;
-
-    parent = ofd_node_parent(oft_p, c);
-    parent = ofd_node_parent(oft_p, parent);
-
-    p_len = ofd_getprop(oft_p, parent, "ranges", &ranges, sizeof(ranges));
-    DBG("%s: ranges\n", __func__);
-    int i; for (i=0; i<p_len; i++) {DBG("%08x ", ranges[i]);}
-    DBG("\n");
-
-    p_len = ofd_getprop(oft_p, parent, "#address-cells",
-                        &addr_c, sizeof(addr_c));
-    DBG("%s address is %d\n", __func__, addr_c);
-    ranges_i = addr_c;  /* skip over the child address */
-    
-    DBG("%s address is %d\n", __func__, addr_c);
-    switch (addr_c) {
-    case 1: 
-        ranges_addr = ranges[ranges_i];
-        break;
-    case 2:
-        ranges_addr = (((u64)ranges[ranges_i]) << 32) |
-                      ranges[ranges_i + 1];
-        break;
-    case 3:  /* the G5 case, how to squeeze 96 bits into 64 */
-        ranges_addr = (((u64)ranges[ranges_i+1]) << 32) |
-                      ranges[ranges_i + 2];
-        break;
-    case 4:
-        ranges_addr = (((u64)ranges[ranges_i+2]) << 32) |
-                      ranges[ranges_i + 4];
-        break;
-    default:
-        PANIC("#address-cells out of range\n");
-        break;
-    }
-    
-    DBG("%s: address 0x%lx\n", __func__, ranges_addr);
-    return ranges_addr;
-}
-
-static unsigned long find_pic_address_from_node(void *oft_p, ofdn_t c)
-{
-    unsigned long reg_addr, range_addr, addr;
-
-    /*
-     * The address is the sum of the address in the reg property of this node
-     * and the ranges property of the granparent node.
-     */
-    reg_addr = find_reg_addr_from_node(oft_p, c);
-    range_addr = find_ranges_addr_from_node(oft_p, c);
-    addr = reg_addr + range_addr;
-    DBG("%s: address 0x%lx\n", __func__, addr);
-    return addr;
-}
-
-static unsigned int find_pic_flags_from_node(void *oft_p, ofdn_t c)
-{
-    int be_len;
-    unsigned int flags = 0;
-
-    /* does it have the property big endian? */
-    be_len = ofd_getprop(oft_p, c, "big_endian", NULL, 0);
-    if (be_len >= 0) {
-        DBG("%s: Big Endian found\n", __func__);
-        flags |= MPIC_BIG_ENDIAN;
-    }
-    DBG("%s: flags 0x%x\n", __func__, flags);
-    return flags;
-}
-
-static int find_mpic_simple_probe(void *oft_p )
-{
-    u32 addr_cells;
-    int rc;
-    u32 addr[2];
-
-    rc = ofd_getprop(oft_p, OFD_ROOT, "#address-cells",
-                     &addr_cells, sizeof(addr_cells));
-    if ( rc < 0 ) {
-        /* if the property does not exist use its default value, 2 */
-        addr_cells = 2;
-    }
-
-    rc = ofd_getprop(oft_p, OFD_ROOT, "platform-open-pic", addr, sizeof(addr));
-    if (rc < 0) {
-        return rc;
-    }
-
-    opic_addr = addr[0];
-    if (addr_cells == 2) {
-        opic_addr <<= 32;
-        opic_addr |= addr[1];
-    }
-    DBG("%s: found OpenPIC at: 0x%lx\n", __func__, opic_addr);
-    /* we did not really find the pic device, only its address. 
-     * We use big endian by default
-     */
-    opic_flags |= MPIC_BIG_ENDIAN | MPIC_BROKEN_U3;
-    return 0;
-}
-
-static int find_mpic_canonical_probe(void *oft_p)
-{
-    ofdn_t c;
-    const char mpic_type[] = "open-pic";
-    /* some paths are special and we cannot find the address
-     * by the usual method */
-    const char *excluded_paths[] = { "/interrupt-controller" };
-
-    /*
-     * Search through the OFD tree for all devices of type 'open_pic'.
-     * We select the one without an 'interrupt' property.
-     */
-    c = ofd_node_find_by_prop(oft_p, OFD_ROOT, "device_type", mpic_type,
-                                        sizeof(mpic_type));
-    while (c > 0) {
-        int int_len;
-        int good_mpic;
-        const char * path = ofd_node_path(oft_p, c);
-
-        good_mpic = 0;
-        int_len = ofd_getprop(oft_p, c, "interrupts", NULL, 0);
-        if (int_len < 0) {
-            int i;
-
-            /* there is no property interrupt.  This could be the pic */
-            DBG("%s: potential OpenPIC in: %s\n", __func__, path);
-            good_mpic = 1;
-
-            for (i = 0; i < ARRAY_SIZE(excluded_paths) && good_mpic; i++) {
-                const char *excluded_path = excluded_paths[i];
-                if (!strncmp(path, excluded_path, strlen(excluded_path)))
-                    good_mpic = 0;
-            }
-        }
-
-        if (good_mpic) {
-            DBG("%s: found OpenPIC in: %s\n", __func__, path);
-            opic_addr = find_pic_address_from_node(oft_p, c);
-            opic_flags = find_pic_flags_from_node(oft_p, c);
-            return 0;
-        }
-
-        c = ofd_node_find_next(oft_p, c);
-    }
-
-    DBG("%s: Could not find a pic\n", __func__);
-    return -1;
-}
-
-int find_mpic(unsigned long oftree)
-{
-    void *oft_p;
-    int rc;
-
-    opic_addr = (unsigned long) -1;
-    opic_flags = 0;
-
-    oft_p = (void *) oftree;
-    rc = find_mpic_simple_probe(oft_p);
-
-    if (rc < 0) {
-        DBG("%s: Searching for pic ...\n", __func__);
-        rc = find_mpic_canonical_probe(oft_p);
-    }
-
-    return rc;
-}
-
-unsigned long get_mpic_address()
-{
-    return opic_addr;
-}
-
-unsigned int get_mpic_flags()
-{
-    return opic_flags;
-}



_______________________________________________
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®.