18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * tree.c: Basic device tree traversal/scanning for the Linux 48c2ecf20Sopenharmony_ci * prom library. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 78c2ecf20Sopenharmony_ci * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/string.h> 118c2ecf20Sopenharmony_ci#include <linux/types.h> 128c2ecf20Sopenharmony_ci#include <linux/kernel.h> 138c2ecf20Sopenharmony_ci#include <linux/sched.h> 148c2ecf20Sopenharmony_ci#include <linux/module.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include <asm/openprom.h> 178c2ecf20Sopenharmony_ci#include <asm/oplib.h> 188c2ecf20Sopenharmony_ci#include <asm/ldc.h> 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cistatic phandle prom_node_to_node(const char *type, phandle node) 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci unsigned long args[5]; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci args[0] = (unsigned long) type; 258c2ecf20Sopenharmony_ci args[1] = 1; 268c2ecf20Sopenharmony_ci args[2] = 1; 278c2ecf20Sopenharmony_ci args[3] = (unsigned int) node; 288c2ecf20Sopenharmony_ci args[4] = (unsigned long) -1; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci p1275_cmd_direct(args); 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci return (phandle) args[4]; 338c2ecf20Sopenharmony_ci} 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci/* Return the child of node 'node' or zero if no this node has no 368c2ecf20Sopenharmony_ci * direct descendent. 378c2ecf20Sopenharmony_ci */ 388c2ecf20Sopenharmony_ciinline phandle __prom_getchild(phandle node) 398c2ecf20Sopenharmony_ci{ 408c2ecf20Sopenharmony_ci return prom_node_to_node("child", node); 418c2ecf20Sopenharmony_ci} 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ciphandle prom_getchild(phandle node) 448c2ecf20Sopenharmony_ci{ 458c2ecf20Sopenharmony_ci phandle cnode; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci if ((s32)node == -1) 488c2ecf20Sopenharmony_ci return 0; 498c2ecf20Sopenharmony_ci cnode = __prom_getchild(node); 508c2ecf20Sopenharmony_ci if ((s32)cnode == -1) 518c2ecf20Sopenharmony_ci return 0; 528c2ecf20Sopenharmony_ci return cnode; 538c2ecf20Sopenharmony_ci} 548c2ecf20Sopenharmony_ciEXPORT_SYMBOL(prom_getchild); 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ciinline phandle prom_getparent(phandle node) 578c2ecf20Sopenharmony_ci{ 588c2ecf20Sopenharmony_ci phandle cnode; 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci if ((s32)node == -1) 618c2ecf20Sopenharmony_ci return 0; 628c2ecf20Sopenharmony_ci cnode = prom_node_to_node("parent", node); 638c2ecf20Sopenharmony_ci if ((s32)cnode == -1) 648c2ecf20Sopenharmony_ci return 0; 658c2ecf20Sopenharmony_ci return cnode; 668c2ecf20Sopenharmony_ci} 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci/* Return the next sibling of node 'node' or zero if no more siblings 698c2ecf20Sopenharmony_ci * at this level of depth in the tree. 708c2ecf20Sopenharmony_ci */ 718c2ecf20Sopenharmony_ciinline phandle __prom_getsibling(phandle node) 728c2ecf20Sopenharmony_ci{ 738c2ecf20Sopenharmony_ci return prom_node_to_node(prom_peer_name, node); 748c2ecf20Sopenharmony_ci} 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ciphandle prom_getsibling(phandle node) 778c2ecf20Sopenharmony_ci{ 788c2ecf20Sopenharmony_ci phandle sibnode; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci if ((s32)node == -1) 818c2ecf20Sopenharmony_ci return 0; 828c2ecf20Sopenharmony_ci sibnode = __prom_getsibling(node); 838c2ecf20Sopenharmony_ci if ((s32)sibnode == -1) 848c2ecf20Sopenharmony_ci return 0; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci return sibnode; 878c2ecf20Sopenharmony_ci} 888c2ecf20Sopenharmony_ciEXPORT_SYMBOL(prom_getsibling); 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci/* Return the length in bytes of property 'prop' at node 'node'. 918c2ecf20Sopenharmony_ci * Return -1 on error. 928c2ecf20Sopenharmony_ci */ 938c2ecf20Sopenharmony_ciint prom_getproplen(phandle node, const char *prop) 948c2ecf20Sopenharmony_ci{ 958c2ecf20Sopenharmony_ci unsigned long args[6]; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci if (!node || !prop) 988c2ecf20Sopenharmony_ci return -1; 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci args[0] = (unsigned long) "getproplen"; 1018c2ecf20Sopenharmony_ci args[1] = 2; 1028c2ecf20Sopenharmony_ci args[2] = 1; 1038c2ecf20Sopenharmony_ci args[3] = (unsigned int) node; 1048c2ecf20Sopenharmony_ci args[4] = (unsigned long) prop; 1058c2ecf20Sopenharmony_ci args[5] = (unsigned long) -1; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci p1275_cmd_direct(args); 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci return (int) args[5]; 1108c2ecf20Sopenharmony_ci} 1118c2ecf20Sopenharmony_ciEXPORT_SYMBOL(prom_getproplen); 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci/* Acquire a property 'prop' at node 'node' and place it in 1148c2ecf20Sopenharmony_ci * 'buffer' which has a size of 'bufsize'. If the acquisition 1158c2ecf20Sopenharmony_ci * was successful the length will be returned, else -1 is returned. 1168c2ecf20Sopenharmony_ci */ 1178c2ecf20Sopenharmony_ciint prom_getproperty(phandle node, const char *prop, 1188c2ecf20Sopenharmony_ci char *buffer, int bufsize) 1198c2ecf20Sopenharmony_ci{ 1208c2ecf20Sopenharmony_ci unsigned long args[8]; 1218c2ecf20Sopenharmony_ci int plen; 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci plen = prom_getproplen(node, prop); 1248c2ecf20Sopenharmony_ci if ((plen > bufsize) || (plen == 0) || (plen == -1)) 1258c2ecf20Sopenharmony_ci return -1; 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci args[0] = (unsigned long) prom_getprop_name; 1288c2ecf20Sopenharmony_ci args[1] = 4; 1298c2ecf20Sopenharmony_ci args[2] = 1; 1308c2ecf20Sopenharmony_ci args[3] = (unsigned int) node; 1318c2ecf20Sopenharmony_ci args[4] = (unsigned long) prop; 1328c2ecf20Sopenharmony_ci args[5] = (unsigned long) buffer; 1338c2ecf20Sopenharmony_ci args[6] = bufsize; 1348c2ecf20Sopenharmony_ci args[7] = (unsigned long) -1; 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci p1275_cmd_direct(args); 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci return (int) args[7]; 1398c2ecf20Sopenharmony_ci} 1408c2ecf20Sopenharmony_ciEXPORT_SYMBOL(prom_getproperty); 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci/* Acquire an integer property and return its value. Returns -1 1438c2ecf20Sopenharmony_ci * on failure. 1448c2ecf20Sopenharmony_ci */ 1458c2ecf20Sopenharmony_ciint prom_getint(phandle node, const char *prop) 1468c2ecf20Sopenharmony_ci{ 1478c2ecf20Sopenharmony_ci int intprop; 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci if (prom_getproperty(node, prop, (char *) &intprop, sizeof(int)) != -1) 1508c2ecf20Sopenharmony_ci return intprop; 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci return -1; 1538c2ecf20Sopenharmony_ci} 1548c2ecf20Sopenharmony_ciEXPORT_SYMBOL(prom_getint); 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ci/* Acquire an integer property, upon error return the passed default 1578c2ecf20Sopenharmony_ci * integer. 1588c2ecf20Sopenharmony_ci */ 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ciint prom_getintdefault(phandle node, const char *property, int deflt) 1618c2ecf20Sopenharmony_ci{ 1628c2ecf20Sopenharmony_ci int retval; 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci retval = prom_getint(node, property); 1658c2ecf20Sopenharmony_ci if (retval == -1) 1668c2ecf20Sopenharmony_ci return deflt; 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_ci return retval; 1698c2ecf20Sopenharmony_ci} 1708c2ecf20Sopenharmony_ciEXPORT_SYMBOL(prom_getintdefault); 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci/* Acquire a boolean property, 1=TRUE 0=FALSE. */ 1738c2ecf20Sopenharmony_ciint prom_getbool(phandle node, const char *prop) 1748c2ecf20Sopenharmony_ci{ 1758c2ecf20Sopenharmony_ci int retval; 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci retval = prom_getproplen(node, prop); 1788c2ecf20Sopenharmony_ci if (retval == -1) 1798c2ecf20Sopenharmony_ci return 0; 1808c2ecf20Sopenharmony_ci return 1; 1818c2ecf20Sopenharmony_ci} 1828c2ecf20Sopenharmony_ciEXPORT_SYMBOL(prom_getbool); 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_ci/* Acquire a property whose value is a string, returns a null 1858c2ecf20Sopenharmony_ci * string on error. The char pointer is the user supplied string 1868c2ecf20Sopenharmony_ci * buffer. 1878c2ecf20Sopenharmony_ci */ 1888c2ecf20Sopenharmony_civoid prom_getstring(phandle node, const char *prop, char *user_buf, 1898c2ecf20Sopenharmony_ci int ubuf_size) 1908c2ecf20Sopenharmony_ci{ 1918c2ecf20Sopenharmony_ci int len; 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci len = prom_getproperty(node, prop, user_buf, ubuf_size); 1948c2ecf20Sopenharmony_ci if (len != -1) 1958c2ecf20Sopenharmony_ci return; 1968c2ecf20Sopenharmony_ci user_buf[0] = 0; 1978c2ecf20Sopenharmony_ci} 1988c2ecf20Sopenharmony_ciEXPORT_SYMBOL(prom_getstring); 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci/* Does the device at node 'node' have name 'name'? 2018c2ecf20Sopenharmony_ci * YES = 1 NO = 0 2028c2ecf20Sopenharmony_ci */ 2038c2ecf20Sopenharmony_ciint prom_nodematch(phandle node, const char *name) 2048c2ecf20Sopenharmony_ci{ 2058c2ecf20Sopenharmony_ci char namebuf[128]; 2068c2ecf20Sopenharmony_ci prom_getproperty(node, "name", namebuf, sizeof(namebuf)); 2078c2ecf20Sopenharmony_ci if (strcmp(namebuf, name) == 0) 2088c2ecf20Sopenharmony_ci return 1; 2098c2ecf20Sopenharmony_ci return 0; 2108c2ecf20Sopenharmony_ci} 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci/* Search siblings at 'node_start' for a node with name 2138c2ecf20Sopenharmony_ci * 'nodename'. Return node if successful, zero if not. 2148c2ecf20Sopenharmony_ci */ 2158c2ecf20Sopenharmony_ciphandle prom_searchsiblings(phandle node_start, const char *nodename) 2168c2ecf20Sopenharmony_ci{ 2178c2ecf20Sopenharmony_ci phandle thisnode; 2188c2ecf20Sopenharmony_ci int error; 2198c2ecf20Sopenharmony_ci char promlib_buf[128]; 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci for(thisnode = node_start; thisnode; 2228c2ecf20Sopenharmony_ci thisnode=prom_getsibling(thisnode)) { 2238c2ecf20Sopenharmony_ci error = prom_getproperty(thisnode, "name", promlib_buf, 2248c2ecf20Sopenharmony_ci sizeof(promlib_buf)); 2258c2ecf20Sopenharmony_ci /* Should this ever happen? */ 2268c2ecf20Sopenharmony_ci if(error == -1) continue; 2278c2ecf20Sopenharmony_ci if(strcmp(nodename, promlib_buf)==0) return thisnode; 2288c2ecf20Sopenharmony_ci } 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_ci return 0; 2318c2ecf20Sopenharmony_ci} 2328c2ecf20Sopenharmony_ciEXPORT_SYMBOL(prom_searchsiblings); 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_cistatic const char *prom_nextprop_name = "nextprop"; 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_ci/* Return the first property type for node 'node'. 2378c2ecf20Sopenharmony_ci * buffer should be at least 32B in length 2388c2ecf20Sopenharmony_ci */ 2398c2ecf20Sopenharmony_cichar *prom_firstprop(phandle node, char *buffer) 2408c2ecf20Sopenharmony_ci{ 2418c2ecf20Sopenharmony_ci unsigned long args[7]; 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_ci *buffer = 0; 2448c2ecf20Sopenharmony_ci if ((s32)node == -1) 2458c2ecf20Sopenharmony_ci return buffer; 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci args[0] = (unsigned long) prom_nextprop_name; 2488c2ecf20Sopenharmony_ci args[1] = 3; 2498c2ecf20Sopenharmony_ci args[2] = 1; 2508c2ecf20Sopenharmony_ci args[3] = (unsigned int) node; 2518c2ecf20Sopenharmony_ci args[4] = 0; 2528c2ecf20Sopenharmony_ci args[5] = (unsigned long) buffer; 2538c2ecf20Sopenharmony_ci args[6] = (unsigned long) -1; 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ci p1275_cmd_direct(args); 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci return buffer; 2588c2ecf20Sopenharmony_ci} 2598c2ecf20Sopenharmony_ciEXPORT_SYMBOL(prom_firstprop); 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci/* Return the property type string after property type 'oprop' 2628c2ecf20Sopenharmony_ci * at node 'node' . Returns NULL string if no more 2638c2ecf20Sopenharmony_ci * property types for this node. 2648c2ecf20Sopenharmony_ci */ 2658c2ecf20Sopenharmony_cichar *prom_nextprop(phandle node, const char *oprop, char *buffer) 2668c2ecf20Sopenharmony_ci{ 2678c2ecf20Sopenharmony_ci unsigned long args[7]; 2688c2ecf20Sopenharmony_ci char buf[32]; 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_ci if ((s32)node == -1) { 2718c2ecf20Sopenharmony_ci *buffer = 0; 2728c2ecf20Sopenharmony_ci return buffer; 2738c2ecf20Sopenharmony_ci } 2748c2ecf20Sopenharmony_ci if (oprop == buffer) { 2758c2ecf20Sopenharmony_ci strcpy (buf, oprop); 2768c2ecf20Sopenharmony_ci oprop = buf; 2778c2ecf20Sopenharmony_ci } 2788c2ecf20Sopenharmony_ci 2798c2ecf20Sopenharmony_ci args[0] = (unsigned long) prom_nextprop_name; 2808c2ecf20Sopenharmony_ci args[1] = 3; 2818c2ecf20Sopenharmony_ci args[2] = 1; 2828c2ecf20Sopenharmony_ci args[3] = (unsigned int) node; 2838c2ecf20Sopenharmony_ci args[4] = (unsigned long) oprop; 2848c2ecf20Sopenharmony_ci args[5] = (unsigned long) buffer; 2858c2ecf20Sopenharmony_ci args[6] = (unsigned long) -1; 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_ci p1275_cmd_direct(args); 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_ci return buffer; 2908c2ecf20Sopenharmony_ci} 2918c2ecf20Sopenharmony_ciEXPORT_SYMBOL(prom_nextprop); 2928c2ecf20Sopenharmony_ci 2938c2ecf20Sopenharmony_ciphandle prom_finddevice(const char *name) 2948c2ecf20Sopenharmony_ci{ 2958c2ecf20Sopenharmony_ci unsigned long args[5]; 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci if (!name) 2988c2ecf20Sopenharmony_ci return 0; 2998c2ecf20Sopenharmony_ci args[0] = (unsigned long) "finddevice"; 3008c2ecf20Sopenharmony_ci args[1] = 1; 3018c2ecf20Sopenharmony_ci args[2] = 1; 3028c2ecf20Sopenharmony_ci args[3] = (unsigned long) name; 3038c2ecf20Sopenharmony_ci args[4] = (unsigned long) -1; 3048c2ecf20Sopenharmony_ci 3058c2ecf20Sopenharmony_ci p1275_cmd_direct(args); 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci return (int) args[4]; 3088c2ecf20Sopenharmony_ci} 3098c2ecf20Sopenharmony_ciEXPORT_SYMBOL(prom_finddevice); 3108c2ecf20Sopenharmony_ci 3118c2ecf20Sopenharmony_ciint prom_node_has_property(phandle node, const char *prop) 3128c2ecf20Sopenharmony_ci{ 3138c2ecf20Sopenharmony_ci char buf [32]; 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci *buf = 0; 3168c2ecf20Sopenharmony_ci do { 3178c2ecf20Sopenharmony_ci prom_nextprop(node, buf, buf); 3188c2ecf20Sopenharmony_ci if (!strcmp(buf, prop)) 3198c2ecf20Sopenharmony_ci return 1; 3208c2ecf20Sopenharmony_ci } while (*buf); 3218c2ecf20Sopenharmony_ci return 0; 3228c2ecf20Sopenharmony_ci} 3238c2ecf20Sopenharmony_ciEXPORT_SYMBOL(prom_node_has_property); 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci/* Set property 'pname' at node 'node' to value 'value' which has a length 3268c2ecf20Sopenharmony_ci * of 'size' bytes. Return the number of bytes the prom accepted. 3278c2ecf20Sopenharmony_ci */ 3288c2ecf20Sopenharmony_ciint 3298c2ecf20Sopenharmony_ciprom_setprop(phandle node, const char *pname, char *value, int size) 3308c2ecf20Sopenharmony_ci{ 3318c2ecf20Sopenharmony_ci unsigned long args[8]; 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_ci if (size == 0) 3348c2ecf20Sopenharmony_ci return 0; 3358c2ecf20Sopenharmony_ci if ((pname == 0) || (value == 0)) 3368c2ecf20Sopenharmony_ci return 0; 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_ci#ifdef CONFIG_SUN_LDOMS 3398c2ecf20Sopenharmony_ci if (ldom_domaining_enabled) { 3408c2ecf20Sopenharmony_ci ldom_set_var(pname, value); 3418c2ecf20Sopenharmony_ci return 0; 3428c2ecf20Sopenharmony_ci } 3438c2ecf20Sopenharmony_ci#endif 3448c2ecf20Sopenharmony_ci args[0] = (unsigned long) "setprop"; 3458c2ecf20Sopenharmony_ci args[1] = 4; 3468c2ecf20Sopenharmony_ci args[2] = 1; 3478c2ecf20Sopenharmony_ci args[3] = (unsigned int) node; 3488c2ecf20Sopenharmony_ci args[4] = (unsigned long) pname; 3498c2ecf20Sopenharmony_ci args[5] = (unsigned long) value; 3508c2ecf20Sopenharmony_ci args[6] = size; 3518c2ecf20Sopenharmony_ci args[7] = (unsigned long) -1; 3528c2ecf20Sopenharmony_ci 3538c2ecf20Sopenharmony_ci p1275_cmd_direct(args); 3548c2ecf20Sopenharmony_ci 3558c2ecf20Sopenharmony_ci return (int) args[7]; 3568c2ecf20Sopenharmony_ci} 3578c2ecf20Sopenharmony_ciEXPORT_SYMBOL(prom_setprop); 3588c2ecf20Sopenharmony_ci 3598c2ecf20Sopenharmony_ciinline phandle prom_inst2pkg(int inst) 3608c2ecf20Sopenharmony_ci{ 3618c2ecf20Sopenharmony_ci unsigned long args[5]; 3628c2ecf20Sopenharmony_ci phandle node; 3638c2ecf20Sopenharmony_ci 3648c2ecf20Sopenharmony_ci args[0] = (unsigned long) "instance-to-package"; 3658c2ecf20Sopenharmony_ci args[1] = 1; 3668c2ecf20Sopenharmony_ci args[2] = 1; 3678c2ecf20Sopenharmony_ci args[3] = (unsigned int) inst; 3688c2ecf20Sopenharmony_ci args[4] = (unsigned long) -1; 3698c2ecf20Sopenharmony_ci 3708c2ecf20Sopenharmony_ci p1275_cmd_direct(args); 3718c2ecf20Sopenharmony_ci 3728c2ecf20Sopenharmony_ci node = (int) args[4]; 3738c2ecf20Sopenharmony_ci if ((s32)node == -1) 3748c2ecf20Sopenharmony_ci return 0; 3758c2ecf20Sopenharmony_ci return node; 3768c2ecf20Sopenharmony_ci} 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_ciint prom_ihandle2path(int handle, char *buffer, int bufsize) 3798c2ecf20Sopenharmony_ci{ 3808c2ecf20Sopenharmony_ci unsigned long args[7]; 3818c2ecf20Sopenharmony_ci 3828c2ecf20Sopenharmony_ci args[0] = (unsigned long) "instance-to-path"; 3838c2ecf20Sopenharmony_ci args[1] = 3; 3848c2ecf20Sopenharmony_ci args[2] = 1; 3858c2ecf20Sopenharmony_ci args[3] = (unsigned int) handle; 3868c2ecf20Sopenharmony_ci args[4] = (unsigned long) buffer; 3878c2ecf20Sopenharmony_ci args[5] = bufsize; 3888c2ecf20Sopenharmony_ci args[6] = (unsigned long) -1; 3898c2ecf20Sopenharmony_ci 3908c2ecf20Sopenharmony_ci p1275_cmd_direct(args); 3918c2ecf20Sopenharmony_ci 3928c2ecf20Sopenharmony_ci return (int) args[6]; 3938c2ecf20Sopenharmony_ci} 394