WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ppc-devel

[XenPPC] [PATCH] detect platform (and non-hypervisor mode)

To: xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Subject: [XenPPC] [PATCH] detect platform (and non-hypervisor mode)
From: Maria Butrico <butrico@xxxxxxxxxxxxxx>
Date: Thu, 25 May 2006 16:44:29 -0400
Delivery-date: Thu, 25 May 2006 13:45:16 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ppc-devel-request@lists.xensource.com?subject=help>
List-id: Xen PPC development <xen-ppc-devel.lists.xensource.com>
List-post: <mailto:xen-ppc-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-ppc-devel-bounces@xxxxxxxxxxxxxxxxxxx
Signed-off-by: Maria Butrico <butrico@xxxxxxxxxxxxxx>

summary:    detect platform (and non-hypervisor mode).

        Detects the platform from the value of the compatible
        property (from ofd tree).

        Do not close OF stdout and close stdin only on a mac.

diff -r 7516fd47bc59 xen/arch/ppc/Makefile
--- a/xen/arch/ppc/Makefile     Thu May 25 15:42:29 2006 -0400
+++ b/xen/arch/ppc/Makefile     Thu May 25 16:40:57 2006 -0400
@@ -29,6 +29,7 @@ obj-y += of-devtree.o
 obj-y += of-devtree.o
 obj-y += of-devwalk.o
 obj-y += ofd_fixup.o
+obj-y += platform.o
 obj-y += physdev.o
 obj-y += rtas.o
 obj-y += setup.o
diff -r 7516fd47bc59 xen/arch/ppc/boot_of.c
--- a/xen/arch/ppc/boot_of.c    Thu May 25 15:42:29 2006 -0400
+++ b/xen/arch/ppc/boot_of.c    Thu May 25 16:40:57 2006 -0400
@@ -30,6 +30,7 @@
 #include <asm/io.h>
 #include "uart.h"
 #include "exceptions.h"
+#include <asm/platform.h>
 
 static ulong of_vec;
 static ulong of_msr;
@@ -1245,6 +1246,24 @@ static int __init boot_of_rtas(void)
     return 1;
 }
 
+static void __init boot_of_platform(void)
+{
+    char compatible_string[256];
+    int compatible_length;
+    int of_root;
+
+    of_root = of_finddevice("/");
+    if (of_root == OF_FAILURE) of_panic("no root package\n");
+
+    compatible_length = of_getprop(of_root, "compatible", compatible_string,
+                                                   sizeof(compatible_string));
+    
+    if (compatible_length == OF_FAILURE)
+      return;
+
+    init_platform(compatible_string, compatible_length);
+}
+
 multiboot_info_t __init *boot_of_init(
         ulong r3, ulong r4, ulong vec, ulong r6, ulong r7, ulong orig_msr)
 {
@@ -1280,16 +1299,18 @@ multiboot_info_t __init *boot_of_init(
     boot_of_bootargs(&mbi);
     boot_of_module(r3, r4, &mbi);
     boot_of_cpus();
+
+    boot_of_platform();
+
     boot_of_rtas();
 
     /* end of OF */
-    of_printf("closing OF stdout...\n");
-    of_call("close", 1, 0, &of_out);
-
-    of_getprop(bof_chosen, "stdin", &of_in, sizeof (of_in));
-
-    if (of_in != of_out) {
-        of_call("close", 1, 0, &of_in);
+    if (is_platform_pmac()) {
+        of_getprop(bof_chosen, "stdin", &of_in, sizeof (of_in));
+
+        if (of_in != of_out) {
+            of_call("close", 1, 0, &of_in);
+        }
     }
 
     of_call("quiesce", 0, 0, NULL);
diff -r 7516fd47bc59 xen/arch/ppc/platform.c
--- /dev/null   Thu Jan  1 00:00:00 1970 +0000
+++ b/xen/arch/ppc/platform.c   Thu May 25 16:40:57 2006 -0400
@@ -0,0 +1,99 @@
+#include <xen/config.h>
+#include <xen/init.h>
+#include <xen/lib.h>
+#include <xen/compile.h>
+#include <public/of-devtree.h>
+#include "oftree.h"
+#include <asm/platform.h>
+
+#define DEBUG
+#ifdef DEBUG
+#define DBG(fmt...) printk(fmt)
+#else
+#define DBG(fmt...)
+#endif
+
+static void pmac_init(void);
+static void maple_init(void);
+
+enum platform_type { pmac = 1, maple = 2 };
+struct platform {
+    enum platform_type type;
+    char *compat_s;
+    void (*init_func)(void);
+};
+static struct platform platforms[] = {
+    { .type = pmac,  .compat_s = "Power Macintosh", .init_func = pmac_init },
+    { .type = maple, .compat_s = "Momentum,Maple",  .init_func = maple_init  },
+};
+                                                                               
 
+struct global_platform {
+    enum platform_type platform_type;
+    int hv_supported;
+};
+static struct global_platform my_platform;
+
+
+static void pmac_init(void)
+{
+    my_platform.hv_supported = 0;
+}
+
+static void maple_init(void)
+{
+    my_platform.hv_supported = 1;
+}
+
+int init_platform(char *compatible_string, int compatible_length)
+{
+    char *cmpstr;
+    int used_length;
+    
+    memset(&my_platform, 0, sizeof(my_platform));
+
+    // loop over each null terminated piece of the compatible property
+    for (cmpstr = compatible_string, used_length = 0;
+         used_length < compatible_length;
+         cmpstr = &compatible_string[used_length]) {
+        int i;
+        for (i = 0; i < ARRAY_SIZE(platforms); i++) {
+            if (strstr(cmpstr, platforms[i].compat_s)) {
+                DBG("Found platform %s.\n", platforms[i].compat_s);
+                my_platform.platform_type = platforms[i].type;
+                (void) platforms[i].init_func();
+                return 0;
+            }
+        }
+        used_length += strlen(cmpstr) + 1;
+    }
+
+    return -1;
+}
+
+#ifdef not_used
+void init_platform_2(void)
+{
+    void *oft_p;
+    char compatible_string[256];
+    int compatible_length;
+
+    oft_p = (void *)oftree;
+    compatible_length = ofd_getprop(oft_p, OFD_ROOT, "compatible",
+                                    compatible_string, 
sizeof(compatible_string));
+    if (compatible_length < 0) {
+        return;
+    }
+    
+    (void) init_platform(compatible_string, compatible_length);
+}
+#endif
+
+int hv_supported(void)
+{
+    return my_platform.hv_supported;
+}
+
+int is_platform_pmac(void)
+{
+    return (my_platform.platform_type == pmac);
+}
diff -r 7516fd47bc59 xen/include/asm-ppc/platform.h
--- /dev/null   Thu Jan  1 00:00:00 1970 +0000
+++ b/xen/include/asm-ppc/platform.h    Thu May 25 16:40:57 2006 -0400
@@ -0,0 +1,7 @@
+#ifndef _PLATFORM_H
+#define _PLATFORM_H
+
+int hv_supported(void);
+int is_platform_pmac(void);
+int init_platform(char *cs, int cl);
+#endif  /* #ifndef _PLATFORM_H */

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

<Prev in Thread] Current Thread [Next in Thread>
  • [XenPPC] [PATCH] detect platform (and non-hypervisor mode), Maria Butrico <=