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)); }
/* 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); }
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_halt_power_off(void) { p1275_cmd("SUNW,power-off", P1275_INOUT(0, 0)); /* if nothing else helps, we just halt */ prom_halt(); }
/* Drop into the prom, with the chance to continue with the 'go' * prom command. */ void prom_cmdline(void) { unsigned long flags; __save_and_cli(flags); #ifdef CONFIG_SUN_CONSOLE if(!serial_console && prom_palette) prom_palette (1); #endif #ifdef CONFIG_SMP smp_capture(); #endif p1275_cmd ("enter", P1275_INOUT(0,0)); #ifdef CONFIG_SMP smp_release(); spin_unlock_wait(&__br_write_locks[BR_GLOBALIRQ_LOCK].lock); #endif #ifdef CONFIG_SUN_CONSOLE if(!serial_console && prom_palette) prom_palette (0); #endif __restore_flags(flags); }
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); }
/* 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); }
void prom_sun4v_guest_soft_state(void) { const char *svc = "SUNW,soft-state-supported"; if (!prom_service_exists(svc)) return; p1275_cmd(svc, P1275_INOUT(0, 0)); }
/* 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); }
inline int prom_inst2pkg(int inst) { int node; node = p1275_cmd ("instance-to-package", P1275_INOUT(1, 1), inst); if (node == -1) return 0; return node; }
inline int prom_getparent(int node) { int cnode; if(node == -1) return 0; cnode = p1275_cmd ("parent", P1275_INOUT(1, 1), node); if(cnode == -1) return 0; return (int)cnode; }
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; }
/* 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); }
/* 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; }
/* Drop into the prom, but completely terminate the program. * No chance of continuing. */ void prom_halt(void) { #ifdef CONFIG_SUN_LDOMS if (ldom_domaining_enabled) ldom_power_off(); #endif again: p1275_cmd("exit", P1275_INOUT(0, 0)); goto again; /* PROM is out to get me -DaveM */ }
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); }
void prom_halt_power_off(void) { #ifdef CONFIG_SUN_LDOMS if (ldom_domaining_enabled) ldom_power_off(); #endif p1275_cmd("SUNW,power-off", P1275_INOUT(0, 0)); /* if nothing else helps, we just halt */ prom_halt(); }
/* Drop into the prom, but completely terminate the program. * No chance of continuing. */ void prom_halt(void) { #ifdef CONFIG_SMP smp_promstop_others(); udelay(8000); #endif again: p1275_cmd ("exit", P1275_INOUT(0,0)); goto again; /* PROM is out to get me -DaveM */ }
void prom_halt_power_off(void) { #ifdef CONFIG_SMP smp_promstop_others(); udelay(8000); #endif p1275_cmd ("SUNW,power-off", P1275_INOUT(0,0)); /* if nothing else helps, we just halt */ prom_halt (); }
/* 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); }
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); }
/* 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; }
/* 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); }
/* 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; }
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); }
/* 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)); } }
/* Drop into the prom, with the chance to continue with the 'go' * prom command. */ void prom_cmdline(void) { unsigned long flags; local_irq_save(flags); #ifdef CONFIG_SMP smp_capture(); #endif p1275_cmd("enter", P1275_INOUT(0, 0)); #ifdef CONFIG_SMP smp_release(); #endif local_irq_restore(flags); }
/* 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; }
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); }