#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/promif.h>
#include <sys/promimpl.h>
#include <sys/platform_module.h>
static void prom_setprop_null(void);
void (*prom_setprop_enter)(void) = prom_setprop_null;
void (*prom_setprop_exit)(void) = prom_setprop_null;
int
prom_asr_export_len()
{
cell_t ci[4];
ci[0] = p1275_ptr2cell("SUNW,asr-export-len");
ci[1] = (cell_t)0;
ci[2] = (cell_t)1;
ci[3] = (cell_t)-1;
promif_preprom();
(void) p1275_cif_handler(&ci);
promif_postprom();
return (p1275_cell2int(ci[3]));
}
int
prom_asr_list_keys_len()
{
cell_t ci[4];
ci[0] = p1275_ptr2cell("SUNW,asr-list-keys-len");
ci[1] = (cell_t)0;
ci[2] = (cell_t)1;
ci[3] = (cell_t)-1;
promif_preprom();
(void) p1275_cif_handler(&ci);
promif_postprom();
return (p1275_cell2int(ci[3]));
}
int
prom_asr_export(caddr_t value)
{
int rv;
cell_t ci[5];
ci[0] = p1275_ptr2cell("SUNW,asr-export");
ci[1] = (cell_t)1;
ci[2] = (cell_t)1;
ci[3] = p1275_ptr2cell(value);
ci[4] = -1;
promif_preprom();
rv = p1275_cif_handler(&ci);
promif_postprom();
if (rv != 0)
return (-1);
return (p1275_cell2int(ci[4]));
}
int
prom_asr_list_keys(caddr_t value)
{
int rv;
cell_t ci[5];
ci[0] = p1275_ptr2cell("SUNW,asr-list-keys");
ci[1] = (cell_t)1;
ci[2] = (cell_t)1;
ci[3] = p1275_ptr2cell(value);
ci[4] = -1;
promif_preprom();
rv = p1275_cif_handler(&ci);
promif_postprom();
if (rv != 0)
return (-1);
return (p1275_cell2int(ci[4]));
}
int
prom_asr_disable(char *keystr, int keystr_len,
char *reason, int reason_len)
{
int rv;
cell_t ci[5];
ci[0] = p1275_ptr2cell("SUNW,asr-disable");
ci[1] = (cell_t)4;
ci[2] = (cell_t)0;
ci[3] = p1275_ptr2cell(keystr);
ci[3] = p1275_int2cell(keystr_len);
ci[3] = p1275_ptr2cell(reason);
ci[3] = p1275_int2cell(reason_len);
promif_preprom();
rv = p1275_cif_handler(&ci);
promif_postprom();
return (rv);
}
int
prom_asr_enable(char *keystr, int keystr_len)
{
int rv;
cell_t ci[5];
ci[0] = p1275_ptr2cell("SUNW,asr-enable");
ci[1] = (cell_t)2;
ci[2] = (cell_t)0;
ci[3] = p1275_ptr2cell(keystr);
ci[3] = p1275_int2cell(keystr_len);
promif_preprom();
rv = p1275_cif_handler(&ci);
promif_postprom();
return (rv);
}
static void
prom_setprop_null(void)
{
}
int
prom_getproplen(pnode_t nodeid, caddr_t name)
{
cell_t ci[6];
ci[0] = p1275_ptr2cell("getproplen");
ci[1] = (cell_t)2;
ci[2] = (cell_t)1;
ci[3] = p1275_phandle2cell((phandle_t)nodeid);
ci[4] = p1275_ptr2cell(name);
ci[5] = (cell_t)-1;
promif_preprom();
(void) p1275_cif_handler(&ci);
promif_postprom();
return (p1275_cell2int(ci[5]));
}
int
prom_getprop(pnode_t nodeid, caddr_t name, caddr_t value)
{
int len, rv;
cell_t ci[8];
if ((len = prom_getproplen(nodeid, name)) <= 0)
return (len);
ci[0] = p1275_ptr2cell("getprop");
ci[1] = (cell_t)4;
ci[2] = (cell_t)0;
ci[3] = p1275_phandle2cell((phandle_t)nodeid);
ci[4] = p1275_ptr2cell(name);
ci[5] = p1275_ptr2cell(value);
ci[6] = len;
promif_preprom();
rv = p1275_cif_handler(&ci);
promif_postprom();
if (rv != 0)
return (-1);
return (len);
}
int
prom_bounded_getprop(pnode_t nodeid, caddr_t name, caddr_t value, int len)
{
cell_t ci[8];
ci[0] = p1275_ptr2cell("getprop");
ci[1] = (cell_t)4;
ci[2] = (cell_t)1;
ci[3] = p1275_phandle2cell((phandle_t)nodeid);
ci[4] = p1275_ptr2cell(name);
ci[5] = p1275_ptr2cell(value);
ci[6] = p1275_int2cell(len);
ci[7] = (cell_t)-1;
promif_preprom();
(void) p1275_cif_handler(&ci);
promif_postprom();
return (p1275_cell2int(ci[7]));
}
caddr_t
prom_nextprop(pnode_t nodeid, caddr_t previous, caddr_t next)
{
cell_t ci[7];
(void) prom_strcpy(next, "");
ci[0] = p1275_ptr2cell("nextprop");
ci[1] = (cell_t)3;
ci[2] = (cell_t)0;
ci[3] = p1275_phandle2cell((phandle_t)nodeid);
ci[4] = p1275_ptr2cell(previous);
ci[5] = p1275_ptr2cell(next);
promif_preprom();
(void) p1275_cif_handler(&ci);
promif_postprom();
return (next);
}
int
prom_setprop(pnode_t nodeid, caddr_t name, caddr_t value, int len)
{
cell_t ci[8];
#ifdef PROM_32BIT_ADDRS
caddr_t ovalue = NULL;
if ((uintptr_t)value > (uint32_t)-1) {
ovalue = value;
value = promplat_alloc(len);
if (value == NULL) {
return (-1);
}
promplat_bcopy(ovalue, value, len);
}
#endif
prom_setprop_enter();
promif_preprom();
ci[0] = p1275_ptr2cell("setprop");
ci[1] = (cell_t)4;
ci[2] = (cell_t)1;
ci[3] = p1275_phandle2cell((phandle_t)nodeid);
ci[4] = p1275_ptr2cell(name);
ci[5] = p1275_ptr2cell(value);
ci[6] = p1275_int2cell(len);
ci[7] = (cell_t)-1;
(void) p1275_cif_handler(&ci);
promif_postprom();
prom_setprop_exit();
#ifdef PROM_32BIT_ADDRS
if (ovalue != NULL)
promplat_free(value, len);
#endif
return (p1275_cell2int(ci[7]));
}
char *
prom_decode_composite_string(void *buf, size_t buflen, char *prev)
{
if ((buf == 0) || (buflen == 0) || ((int)buflen == -1))
return ((char *)0);
if (prev == 0)
return ((char *)buf);
prev += prom_strlen(prev) + 1;
if (prev >= ((char *)buf + buflen))
return ((char *)0);
return (prev);
}