]> git.ozlabs.org Git - yaboot.git/blobdiff - second/prom.c
prom setprop primatives
[yaboot.git] / second / prom.c
index 82e615146ab39ad651953f96321d8bf8b218d23e..3407e5ace7d936425503ad149b69ce3b40e99103 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  prom.c - Routines for talking to the Open Firmware PROM
  *
- *  Copyright (C) 2001 Ethan Benson
+ *  Copyright (C) 2001, 2002 Ethan Benson
  *
  *  Copyright (C) 1999 Benjamin Herrenschmidt
  *
@@ -58,7 +58,7 @@ call_prom (const char *service, int nargs, int nret, ...)
      va_list list;
      int i;
      struct prom_args prom_args;
-  
+
      prom_args.service = service;
      prom_args.nargs = nargs;
      prom_args.nret = nret;
@@ -82,7 +82,7 @@ call_prom_return (const char *service, int nargs, int nret, ...)
      int i;
      void* result;
      struct prom_args prom_args;
-  
+
      prom_args.service = service;
      prom_args.nargs = nargs;
      prom_args.nret = nret;
@@ -111,7 +111,7 @@ call_method_1 (char *method, prom_handle h, int nargs, ...)
      va_list list;
      int i;
      struct prom_args prom_args;
-  
+
      prom_args.service = "call-method";
      prom_args.nargs = nargs+2;
      prom_args.nret = 2;
@@ -123,7 +123,7 @@ call_method_1 (char *method, prom_handle h, int nargs, ...)
      va_end(list);
      prom_args.args[2+nargs] = 0;
      prom_args.args[2+nargs+1] = 0;
-  
+
      prom (&prom_args);
 
      if (prom_args.args[2+nargs] != 0)
@@ -153,6 +153,18 @@ prom_getprop (prom_handle pack, char *name, void *mem, int len)
      return (int)call_prom ("getprop", 4, 1, pack, name, mem, len);
 }
 
+int
+prom_getproplen(prom_handle pack, const char *name)
+{
+     return (int)call_prom("getproplen", 2, 1, pack, name);
+}
+
+int
+prom_setprop (prom_handle pack, char *name, void *mem, int len)
+{
+     return (int)call_prom ("setprop", 4, 1, pack, name, mem, len);
+}
+
 int
 prom_get_chosen (char *name, void *mem, int len)
 {
@@ -167,6 +179,14 @@ prom_get_options (char *name, void *mem, int len)
      return prom_getprop (prom_options, name, mem, len);
 }
 
+int
+prom_set_options (char *name, void *mem, int len)
+{
+     if (prom_options == (void *)-1)
+         return -1;
+     return prom_setprop (prom_options, name, mem, len);
+}
+
 int
 prom_get_devtype (char *device)
 {
@@ -174,6 +194,9 @@ prom_get_devtype (char *device)
      int        result;
      char       tmp[64];
 
+     if (strstr(device, TOK_ISCSI))
+         device = strcpy(tmp, "/vdevice/gscsi/disk");
+
      /* Find OF device phandle */
      dev = prom_finddevice(device);
      if (dev == PROM_INVALID_HANDLE) {
@@ -221,11 +244,11 @@ prom_init (prom_entry pp)
      /* Add a few OF methods (thanks Darwin) */
 #if DEBUG
      prom_printf ("Adding OF methods...\n");
-#endif  
+#endif
 
      prom_interpret (
          /* All values in this forth code are in hex */
-         "hex "        
+         "hex "
          /* Those are a few utilities ripped from Apple */
          ": D2NIP decode-int nip nip ;\r"      // A useful function to save space
          ": GPP$ get-package-property 0= ;\r"  // Another useful function to save space
@@ -278,7 +301,7 @@ prom_read (prom_handle file, void *buf, int n)
 {
      int result = 0;
      int retries = 10;
-  
+
      if (n == 0)
          return 0;
      while(--retries) {
@@ -287,7 +310,7 @@ prom_read (prom_handle file, void *buf, int n)
               break;
          call_prom("interpret", 1, 1, " 10 ms");
      }
-  
+
      return result;
 }
 
@@ -330,7 +353,7 @@ prom_readblocks (prom_handle dev, int blockNum, int blockCount, void *buffer)
 #if READ_BLOCKS_USE_READ
      int status;
      unsigned int blksize;
-  
+
      blksize = prom_getblksize(dev);
      if (blksize <= 1)
          blksize = 512;
@@ -339,16 +362,16 @@ prom_readblocks (prom_handle dev, int blockNum, int blockCount, void *buffer)
          return 0;
          prom_printf("Can't seek to 0x%x\n", blockNum * blksize);
      }
-       
+
      status = prom_read(dev, buffer, blockCount * blksize);
 //  prom_printf("prom_readblocks, bl: %d, cnt: %d, status: %d\n",
 //     blockNum, blockCount, status);
 
      return status == (blockCount * blksize);
-#else 
+#else
      int result;
      int retries = 10;
-  
+
      if (blockCount == 0)
          return blockCount;
      while(--retries) {
@@ -357,9 +380,9 @@ prom_readblocks (prom_handle dev, int blockNum, int blockCount, void *buffer)
               break;
          call_prom("interpret", 1, 1, " 10 ms");
      }
-  
+
      return result;
-#endif  
+#endif
 }
 
 int
@@ -399,20 +422,20 @@ prom_puts (prom_handle file, char *s)
 {
      const char *p, *q;
 
-     for (p = s; *p != 0; p = q) 
+     for (p = s; *p != 0; p = q)
      {
          for (q = p; *q != 0 && *q != '\n'; ++q)
               ;
          if (q > p)
               call_prom ("write", 3, 1, file, p, q - p);
-         if (*q != 0) 
+         if (*q != 0)
          {
               ++q;
               call_prom ("write", 3, 1, file, "\r\n", 2);
          }
      }
 }
+
 void
 prom_vfprintf (prom_handle file, char *fmt, va_list ap)
 {
@@ -459,7 +482,7 @@ prom_perror (int error, char *filename)
      else if (error == FILE_IOERR)
          prom_printf("%s: Input/output error\n", filename);
      else if (error == FILE_BAD_PATH)
-         prom_printf("%s: Path too long\n", filename); 
+         prom_printf("%s: Path too long\n", filename);
      else if (error == FILE_ERR_BAD_TYPE)
          prom_printf("%s: Not a regular file\n", filename);
      else if (error == FILE_ERR_NOTDIR)
@@ -553,7 +576,9 @@ prom_claim (void *virt, unsigned int size, unsigned int align)
 void
 prom_release(void *virt, unsigned int size)
 {
-//  call_prom ("release", 2, 1, virt, size);
+     call_prom ("release", 2, 0, virt, size);
+#if 0 /* this is bullshit, newworld OF RELEASE method works fine. */
+
      /* release in not enough, it needs also an unmap call. This bit of forth
       * code inspired from Darwin's bootloader but could be replaced by direct
       * calls to the MMU package if needed
@@ -568,8 +593,9 @@ prom_release(void *virt, unsigned int size)
                "2dup \" unmap\" ^mmu "                 // Unmap the space first
                "2dup \" release\" ^mmu "               // Then free the virtual pages
                "\" release\" ^mem "                    // Then free the physical pages
-               ,size, virt 
+               ,size, virt
          );
+#endif /* bullshit */
 }
 
 void
@@ -628,7 +654,7 @@ prom_pause(void)
      call_prom("enter", 0, 0);
 }
 
-/* 
+/*
  * Local variables:
  * c-file-style: "k&r"
  * c-basic-offset: 5