]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/powerpc/boot/oflib.c
Merge tag 'fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm...
[karo-tx-linux.git] / arch / powerpc / boot / oflib.c
index b0ec9cf3eaaf6e6bf44f9a77aeb079761a2d628c..46c98a47d9493a7ae54940070cb7ceb0cc716a59 100644 (file)
 
 #include "of.h"
 
+typedef u32 prom_arg_t;
+
+/* The following structure is used to communicate with open firmware.
+ * All arguments in and out are in big endian format. */
+struct prom_args {
+       __be32 service; /* Address of service name string. */
+       __be32 nargs;   /* Number of input arguments. */
+       __be32 nret;    /* Number of output arguments. */
+       __be32 args[10];        /* Input/output arguments. */
+};
+
+#ifdef __powerpc64__
+extern int prom(void *);
+#else
 static int (*prom) (void *);
+#endif
 
 void of_init(void *promptr)
 {
+#ifndef __powerpc64__
        prom = (int (*)(void *))promptr;
+#endif
 }
 
+#define ADDR(x)                (u32)(unsigned long)(x)
+
 int of_call_prom(const char *service, int nargs, int nret, ...)
 {
        int i;
-       struct prom_args {
-               const char *service;
-               int nargs;
-               int nret;
-               unsigned int args[12];
-       } args;
+       struct prom_args args;
        va_list list;
 
-       args.service = service;
-       args.nargs = nargs;
-       args.nret = nret;
+       args.service = cpu_to_be32(ADDR(service));
+       args.nargs = cpu_to_be32(nargs);
+       args.nret = cpu_to_be32(nret);
 
        va_start(list, nret);
        for (i = 0; i < nargs; i++)
-               args.args[i] = va_arg(list, unsigned int);
+               args.args[i] = cpu_to_be32(va_arg(list, prom_arg_t));
        va_end(list);
 
        for (i = 0; i < nret; i++)
                args.args[nargs+i] = 0;
 
        if (prom(&args) < 0)
-               return -1;
+               return PROM_ERROR;
 
-       return (nret > 0)? args.args[nargs]: 0;
+       return (nret > 0) ? be32_to_cpu(args.args[nargs]) : 0;
 }
 
 static int of_call_prom_ret(const char *service, int nargs, int nret,
-                           unsigned int *rets, ...)
+                           prom_arg_t *rets, ...)
 {
        int i;
-       struct prom_args {
-               const char *service;
-               int nargs;
-               int nret;
-               unsigned int args[12];
-       } args;
+       struct prom_args args;
        va_list list;
 
-       args.service = service;
-       args.nargs = nargs;
-       args.nret = nret;
+       args.service = cpu_to_be32(ADDR(service));
+       args.nargs = cpu_to_be32(nargs);
+       args.nret = cpu_to_be32(nret);
 
        va_start(list, rets);
        for (i = 0; i < nargs; i++)
-               args.args[i] = va_arg(list, unsigned int);
+               args.args[i] = cpu_to_be32(va_arg(list, prom_arg_t));
        va_end(list);
 
        for (i = 0; i < nret; i++)
                args.args[nargs+i] = 0;
 
        if (prom(&args) < 0)
-               return -1;
+               return PROM_ERROR;
 
-       if (rets != (void *) 0)
+       if (rets != NULL)
                for (i = 1; i < nret; ++i)
-                       rets[i-1] = args.args[nargs+i];
+                       rets[i-1] = be32_to_cpu(args.args[nargs+i]);
 
-       return (nret > 0)? args.args[nargs]: 0;
+       return (nret > 0) ? be32_to_cpu(args.args[nargs]) : 0;
 }
 
 /* returns true if s2 is a prefix of s1 */
@@ -103,7 +112,7 @@ static int string_match(const char *s1, const char *s2)
  */
 static int need_map = -1;
 static ihandle chosen_mmu;
-static phandle memory;
+static ihandle memory;
 
 static int check_of_version(void)
 {
@@ -132,10 +141,10 @@ static int check_of_version(void)
                printf("no mmu\n");
                return 0;
        }
-       memory = (ihandle) of_call_prom("open", 1, 1, "/memory");
-       if (memory == (ihandle) -1) {
-               memory = (ihandle) of_call_prom("open", 1, 1, "/memory@0");
-               if (memory == (ihandle) -1) {
+       memory = of_call_prom("open", 1, 1, "/memory");
+       if (memory == PROM_ERROR) {
+               memory = of_call_prom("open", 1, 1, "/memory@0");
+               if (memory == PROM_ERROR) {
                        printf("no memory node\n");
                        return 0;
                }
@@ -144,40 +153,41 @@ static int check_of_version(void)
        return 1;
 }
 
-void *of_claim(unsigned long virt, unsigned long size, unsigned long align)
+unsigned int of_claim(unsigned long virt, unsigned long size,
+                     unsigned long align)
 {
        int ret;
-       unsigned int result;
+       prom_arg_t result;
 
        if (need_map < 0)
                need_map = check_of_version();
        if (align || !need_map)
-               return (void *) of_call_prom("claim", 3, 1, virt, size, align);
+               return of_call_prom("claim", 3, 1, virt, size, align);
 
        ret = of_call_prom_ret("call-method", 5, 2, &result, "claim", memory,
                               align, size, virt);
        if (ret != 0 || result == -1)
-               return (void *) -1;
+               return  -1;
        ret = of_call_prom_ret("call-method", 5, 2, &result, "claim", chosen_mmu,
                               align, size, virt);
        /* 0x12 == coherent + read/write */
        ret = of_call_prom("call-method", 6, 1, "map", chosen_mmu,
                           0x12, size, virt, virt);
-       return (void *) virt;
+       return virt;
 }
 
 void *of_vmlinux_alloc(unsigned long size)
 {
        unsigned long start = (unsigned long)_start, end = (unsigned long)_end;
-       void *addr;
+       unsigned long addr;
        void *p;
 
        /* With some older POWER4 firmware we need to claim the area the kernel
         * will reside in.  Newer firmwares don't need this so we just ignore
         * the return value.
         */
-       addr = of_claim(start, end - start, 0);
-       printf("Trying to claim from 0x%lx to 0x%lx (0x%lx) got %p\r\n",
+       addr = (unsigned long) of_claim(start, end - start, 0);
+       printf("Trying to claim from 0x%lx to 0x%lx (0x%lx) got %lx\r\n",
               start, end, end - start, addr);
 
        p = malloc(size);
@@ -197,7 +207,7 @@ void of_exit(void)
  */
 void *of_finddevice(const char *name)
 {
-       return (phandle) of_call_prom("finddevice", 1, 1, name);
+       return (void *) (unsigned long) of_call_prom("finddevice", 1, 1, name);
 }
 
 int of_getprop(const void *phandle, const char *name, void *buf,