void prom_set_trap_table_sun4v(unsigned long tba, unsigned long mmfsa) { p1275_cmd("SUNW,set-trap-table", (P1275_ARG(0, P1275_ARG_IN_64B) | P1275_ARG(1, P1275_ARG_IN_64B) | P1275_INOUT(2, 0)), tba, mmfsa); }
void prom_unmap(unsigned long size, unsigned long vaddr) { p1275_cmd("call-method", (P1275_ARG(0, P1275_ARG_IN_STRING) | P1275_ARG(2, P1275_ARG_IN_64B) | P1275_ARG(3, P1275_ARG_IN_64B) | P1275_INOUT(4, 0)), "unmap", prom_get_mmu_ihandle(), size, vaddr); }
/* Get "Unumber" string for the SIMM at the given * memory address. Usually this will be of the form * "Uxxxx" where xxxx is a decimal number which is * etched into the motherboard next to the SIMM slot * in question. */ int prom_getunumber(int syndrome_code, unsigned long phys_addr, char *buf, int buflen) { return p1275_cmd(prom_callmethod_name, (P1275_ARG(0, P1275_ARG_IN_STRING) | P1275_ARG(3, P1275_ARG_OUT_BUF) | P1275_ARG(6, P1275_ARG_IN_64B) | P1275_INOUT(8, 2)), "SUNW,get-unumber", prom_get_memory_ihandle(), buflen, buf, P1275_SIZE(buflen), 0, phys_addr, syndrome_code); }
long prom_dtlb_load(unsigned long index, unsigned long tte_data, unsigned long vaddr) { return p1275_cmd(prom_callmethod_name, (P1275_ARG(0, P1275_ARG_IN_STRING) | P1275_ARG(2, P1275_ARG_IN_64B) | P1275_ARG(3, P1275_ARG_IN_64B) | P1275_INOUT(5, 1)), "SUNW,dtlb-load", prom_get_mmu_ihandle(), /* And then our actual args are pushed backwards. */ vaddr, tte_data, index); }
/* Forth evaluate the expression contained in 'fstring'. */ void prom_feval(const char *fstring) { if (!fstring || fstring[0] == 0) return; p1275_cmd("interpret", P1275_ARG(0, P1275_ARG_IN_STRING) | P1275_INOUT(1, 1), fstring); }
int prom_ihandle2path(int handle, char *buffer, int bufsize) { return p1275_cmd("instance-to-path", P1275_ARG(1,P1275_ARG_OUT_BUF)| P1275_INOUT(3, 1), handle, buffer, P1275_SIZE(bufsize)); }
/* Set prom sync handler to call function 'funcp'. */ void prom_setcallback(callback_func_t funcp) { if (!funcp) return; p1275_cmd("set-callback", P1275_ARG(0, P1275_ARG_IN_FUNCTION) | P1275_INOUT(1, 1), funcp); }
void prom_puts(char *s, int len) { p1275_cmd("write", P1275_ARG(1,P1275_ARG_IN_BUF)| P1275_INOUT(3,1), prom_stdout, s, P1275_SIZE(len)); }
/* Open the device described by the string 'dstr'. Returns the handle * to that device used for subsequent operations on that device. * Returns 0 on failure. */ int prom_devopen(const char *dstr) { return p1275_cmd ("open", P1275_ARG(0,P1275_ARG_IN_STRING)| P1275_INOUT(1,1), dstr); }
/* Acquire a property 'prop' at node 'node' and place it in * 'buffer' which has a size of 'bufsize'. If the acquisition * was successful the length will be returned, else -1 is returned. */ inline int prom_getproperty(int node, const char *prop, char *buffer, int bufsize) { int plen; plen = prom_getproplen(node, prop); if ((plen > bufsize) || (plen == 0) || (plen == -1)) { return -1; } else { /* Ok, things seem all right. */ return p1275_cmd(prom_getprop_name, P1275_ARG(1,P1275_ARG_IN_STRING)| P1275_ARG(2,P1275_ARG_OUT_BUF)| P1275_INOUT(4, 1), node, prop, buffer, P1275_SIZE(plen)); } }
/* Return the length in bytes of property 'prop' at node 'node'. * Return -1 on error. */ inline int prom_getproplen(int node, const char *prop) { if((!node) || (!prop)) return -1; return p1275_cmd ("getproplen", P1275_ARG(1,P1275_ARG_IN_STRING)| P1275_INOUT(2, 1), node, prop); }
/* Return the property type string after property type 'oprop' * at node 'node' . Returns NULL string if no more * property types for this node. */ inline char *prom_nextprop(int node, const char *oprop, char *buffer) { char buf[32]; if(node == -1) { *buffer = 0; return buffer; } if (oprop == buffer) { strcpy (buf, oprop); oprop = buf; } p1275_cmd ("nextprop", P1275_ARG(1,P1275_ARG_IN_STRING)| P1275_ARG(2,P1275_ARG_OUT_32B)| P1275_INOUT(3, 0), node, oprop, buffer); return buffer; }
/* Reset and reboot the machine with the command 'bcommand'. */ void prom_reboot(const char *bcommand) { #ifdef CONFIG_SUN_LDOMS if (ldom_domaining_enabled) ldom_reboot(bcommand); #endif p1275_cmd("boot", P1275_ARG(0, P1275_ARG_IN_STRING) | P1275_INOUT(1, 0), bcommand); }
int prom_service_exists(const char *service_name) { int err = p1275_cmd("test", P1275_ARG(0, P1275_ARG_IN_STRING) | P1275_INOUT(1, 1), service_name); if (err) return 0; return 1; }
/* Return the first property type for node 'node'. * buffer should be at least 32B in length */ inline char *prom_firstprop(int node, char *buffer) { *buffer = 0; if(node == -1) return buffer; p1275_cmd ("nextprop", P1275_ARG(2,P1275_ARG_OUT_32B)| P1275_INOUT(3, 0), node, (char *) 0x0, buffer); return buffer; }
int prom_finddevice(const char *name) { if (!name) return 0; return p1275_cmd(prom_finddev_name, P1275_ARG(0,P1275_ARG_IN_STRING)| P1275_INOUT(1, 1), name); }
/* Set property 'pname' at node 'node' to value 'value' which has a length * of 'size' bytes. Return the number of bytes the prom accepted. */ int prom_setprop(int node, const char *pname, char *value, int size) { if (size == 0) return 0; if ((pname == 0) || (value == 0)) return 0; #ifdef CONFIG_SUN_LDOMS if (ldom_domaining_enabled) { ldom_set_var(pname, value); return 0; } #endif return p1275_cmd ("setprop", P1275_ARG(1,P1275_ARG_IN_STRING)| P1275_ARG(2,P1275_ARG_IN_BUF)| P1275_INOUT(4, 1), node, pname, value, P1275_SIZE(size)); }
/* Non blocking get character from console input device, returns -1 * if no input was taken. This can be used for polling. */ __inline__ int prom_nbgetchar(void) { char inc; if (p1275_cmd("read", P1275_ARG(1,P1275_ARG_OUT_BUF)| P1275_INOUT(3,1), prom_stdin, &inc, P1275_SIZE(1)) == 1) return inc; else return -1; }
/* Set aside physical memory which is not touched or modified * across soft resets. */ unsigned long prom_retain(const char *name, unsigned long pa_low, unsigned long pa_high, long size, long align) { /* XXX I don't think we return multiple values correctly. * XXX OBP supposedly returns pa_low/pa_high here, how does * XXX it work? */ /* If align is zero, the pa_low/pa_high args are passed, * else they are not. */ if (align == 0) return p1275_cmd("SUNW,retain", (P1275_ARG(0, P1275_ARG_IN_BUF) | P1275_INOUT(5, 2)), name, pa_low, pa_high, size, align); else return p1275_cmd("SUNW,retain", (P1275_ARG(0, P1275_ARG_IN_BUF) | P1275_INOUT(3, 2)), name, size, align); }
int prom_map(int mode, unsigned long size, unsigned long vaddr, unsigned long paddr) { int ret = p1275_cmd(prom_callmethod_name, (P1275_ARG(0, P1275_ARG_IN_STRING) | P1275_ARG(3, P1275_ARG_IN_64B) | P1275_ARG(4, P1275_ARG_IN_64B) | P1275_ARG(6, P1275_ARG_IN_64B) | P1275_INOUT(7, 1)), prom_map_name, prom_get_mmu_ihandle(), mode, size, vaddr, 0, paddr); if (ret == 0) ret = -1; return ret; }
/* Non blocking put character to console device, returns -1 if * unsuccessful. */ __inline__ int prom_nbputchar(char c) { char outc; outc = c; if (p1275_cmd("write", P1275_ARG(1,P1275_ARG_IN_BUF)| P1275_INOUT(3,1), prom_stdout, &outc, P1275_SIZE(1)) == 1) return 0; else return -1; }
/* Install Linux trap table so PROM uses that instead of its own. */ void prom_set_trap_table(unsigned long tba) { p1275_cmd("SUNW,set-trap-table", (P1275_ARG(0, P1275_ARG_IN_64B) | P1275_INOUT(1, 0)), tba); }
/* Reset and reboot the machine with the command 'bcommand'. */ void prom_reboot(const char *bcommand) { p1275_cmd("boot", P1275_ARG(0, P1275_ARG_IN_STRING) | P1275_INOUT(1, 0), bcommand); }
void prom_unmap(unsigned long size, unsigned long vaddr) { p1275_cmd(prom_callmethod_name, (P1275_ARG(0, P1275_ARG_IN_STRING) | P1275_ARG(2, P1275_ARG_IN_64B) | P1275_ARG(3, P1275_ARG_IN_64B) | P1275_INOUT(4, 0)), prom_unmap_name, prom_get_mmu_ihandle(), size, vaddr); }