X-Git-Url: http://git.ozlabs.org/?p=yaboot.git;a=blobdiff_plain;f=second%2Fprom.c;h=3407e5ace7d936425503ad149b69ce3b40e99103;hp=037c7380a3ecff5af548e55a21348fed7e3edf02;hb=aa67de3649c86c158622391aeec0016645b4f0d1;hpb=da7857367944c983abf98f956241dcc614b2f453 diff --git a/second/prom.c b/second/prom.c index 037c738..3407e5a 100644 --- a/second/prom.c +++ b/second/prom.c @@ -1,25 +1,27 @@ /* - Routines for talking to the Open Firmware PROM on - Power Macintosh computers. - - Copyright (C) 1999 Benjamin Herrenschmidt - Copyright (C) 1999 Marius Vollmer - Copyright (C) 1996 Paul Mackerras. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - + * prom.c - Routines for talking to the Open Firmware PROM + * + * Copyright (C) 2001, 2002 Ethan Benson + * + * Copyright (C) 1999 Benjamin Herrenschmidt + * + * Copyright (C) 1999 Marius Vollmer + * + * Copyright (C) 1996 Paul Mackerras. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "prom.h" @@ -56,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; @@ -80,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; @@ -109,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; @@ -121,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) @@ -151,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) { @@ -165,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) { @@ -172,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) { @@ -219,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 @@ -276,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) { @@ -285,7 +310,7 @@ prom_read (prom_handle file, void *buf, int n) break; call_prom("interpret", 1, 1, " 10 ms"); } - + return result; } @@ -328,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; @@ -337,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) { @@ -355,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 @@ -397,24 +422,24 @@ 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) { - static char printf_buf[1536]; + static char printf_buf[2048]; vsprintf (printf_buf, fmt, ap); prom_puts (file, printf_buf); } @@ -422,7 +447,7 @@ prom_vfprintf (prom_handle file, char *fmt, va_list ap) void prom_vprintf (char *fmt, va_list ap) { - static char printf_buf[1536]; + static char printf_buf[2048]; vsprintf (printf_buf, fmt, ap); prom_puts (prom_stdout, printf_buf); } @@ -457,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) @@ -551,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 @@ -566,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 @@ -626,7 +654,7 @@ prom_pause(void) call_prom("enter", 0, 0); } -/* +/* * Local variables: * c-file-style: "k&r" * c-basic-offset: 5