[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", ®, 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", ®, 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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |