Annotation of qemu/roms/openbios/arch/ppc/mol/prom.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *   Creation Date: <2002/10/03 20:55:02 samuel>
                      3:  *   Time-stamp: <2002/10/29 13:00:23 samuel>
                      4:  *
                      5:  *     <prom.c>
                      6:  *
                      7:  *     oftree interface
                      8:  *
                      9:  *   Copyright (C) 2002, 2003 Samuel Rydh ([email protected])
                     10:  *
                     11:  *   This program is free software; you can redistribute it and/or
                     12:  *   modify it under the terms of the GNU General Public License
                     13:  *   as published by the Free Software Foundation
                     14:  *
                     15:  */
                     16: 
                     17: #include "config.h"
                     18: #include "osi_calls.h"
                     19: #include "mol/prom.h"
                     20: 
                     21: /* OSI_PromClose (free linux side device tree) */
                     22: int
                     23: prom_close( void )
                     24: {
                     25:        return OSI_PromIface( kPromClose, 0 );
                     26: }
                     27: 
                     28: /* ret: 0 no more peers, -1 if error */
                     29: mol_phandle_t
                     30: prom_peer( mol_phandle_t phandle )
                     31: {
                     32:        return OSI_PromIface( kPromPeer, phandle );
                     33: }
                     34: 
                     35: /* ret: 0 no child, -1 if error */
                     36: mol_phandle_t
                     37: prom_child( mol_phandle_t phandle )
                     38: {
                     39:        return OSI_PromIface( kPromChild, phandle );
                     40: }
                     41: 
                     42: /* ret: 0 if root node, -1 if error */
                     43: mol_phandle_t
                     44: prom_parent( mol_phandle_t phandle )
                     45: {
                     46:        return OSI_PromIface( kPromParent, phandle );
                     47: }
                     48: 
                     49: /* ret: -1 error */
                     50: int
                     51: prom_package_to_path( mol_phandle_t phandle, char *buf, long buflen )
                     52: {
                     53:        return OSI_PromIface2( kPromPackageToPath, phandle, (int)buf, buflen );
                     54: }
                     55: 
                     56: /* ret: -1 error */
                     57: int
                     58: prom_get_prop_len( mol_phandle_t phandle, const char *name )
                     59: {
                     60:        return OSI_PromIface1( kPromGetPropLen, phandle, (int)name );
                     61: }
                     62: 
                     63: /* ret: prop len or -1 if error */
                     64: int
                     65: prom_get_prop( mol_phandle_t phandle, const char *name, char *buf, long buflen )
                     66: {
                     67:        return OSI_PromIface3( kPromGetProp, phandle, (int)name, (int)buf, buflen );
                     68: }
                     69: 
                     70: /* ret: prop len or -1 if error */
                     71: int
                     72: prom_get_prop_by_path( const char *path, const char *name, char *buf, long buflen )
                     73: {
                     74:        mol_phandle_t ph = prom_find_device(path);
                     75:        return (ph != -1)? prom_get_prop( ph, name, buf, buflen) : -1;
                     76: }
                     77: 
                     78: /* ret: -1 error, 0 last prop, 1 otherwise */
                     79: int
                     80: prom_next_prop( mol_phandle_t phandle, const char *prev, char *buf )
                     81: {
                     82:        return OSI_PromIface2( kPromNextProp, phandle, (int)prev, (int)buf );
                     83: }
                     84: 
                     85: /* ret: -1 if error */
                     86: int
                     87: prom_set_prop( mol_phandle_t phandle, const char *name, char *buf, long buflen )
                     88: {
                     89:        return OSI_PromIface3( kPromSetProp, phandle, (int)name, (int)buf, buflen );
                     90: }
                     91: 
                     92: /* ret: -1 if error */
                     93: mol_phandle_t
                     94: prom_create_node( const char *path )
                     95: {
                     96:        return OSI_PromPathIface( kPromCreateNode, path );
                     97: }
                     98: 
                     99: /* ret: -1 if not found */
                    100: mol_phandle_t
                    101: prom_find_device( const char *path )
                    102: {
                    103:        mol_phandle_t ph;
                    104:        char buf2[256], ch, *p;
                    105: 
                    106:        if( !path )
                    107:                return -1;
                    108: 
                    109:        if( (ph=OSI_PromPathIface( kPromFindDevice, path )) != -1 )
                    110:                return ph;
                    111:        else if( path[0] == '/' )
                    112:                return -1;
                    113: 
                    114:        /* might be an alias */
                    115:        if( !(p=strpbrk(path, "@:/")) )
                    116:                p = (char*)path + strlen(path);
                    117: 
                    118:        ch = *p;
                    119:        *p = 0;
                    120:        if( (ph=prom_get_prop(prom_find_device("/aliases"), path, buf2, sizeof(buf2))) == -1 )
                    121:                return -1;
                    122:        *p = ch;
                    123:        strncat( buf2, p, sizeof(buf2) );
                    124: 
                    125:        if( buf2[0] != '/' ) {
                    126:                printk("Error: aliases must be absolute!\n");
                    127:                return -1;
                    128:        }
                    129:        ph = OSI_PromPathIface( kPromFindDevice, buf2 );
                    130:        return ph;
                    131: }
                    132: 
                    133: 
                    134: 
                    135: /************************************************************************/
                    136: /*     search the tree for nodes with matching device_type             */
                    137: /************************************************************************/
                    138: 
                    139: static mol_phandle_t
                    140: prom_find_device_type_( mol_phandle_t ph, const char *type, int *icount, int index )
                    141: {
                    142:        char buf[64];
                    143:        int ph2;
                    144: 
                    145:        if( ph == -1 || !ph )
                    146:                return -1;
                    147:        if( prom_get_prop( ph, "device_type", buf, sizeof(buf)) > 0 )
                    148:                if( !strcmp(buf, type) )
                    149:                        if( (*icount)++ == index )
                    150:                                return ph;
                    151:        if( (ph2=prom_find_device_type_( prom_peer(ph), type, icount, index )) != -1 )
                    152:                return ph2;
                    153:        if( (ph2=prom_find_device_type_( prom_child(ph), type, icount, index )) != -1 )
                    154:                return ph2;
                    155:        return -1;
                    156: }
                    157: 
                    158: mol_phandle_t
                    159: prom_find_device_type( const char *type, int index )
                    160: {
                    161:        int count = 0;
                    162:        return prom_find_device_type_( prom_peer(0), type, &count, index );
                    163: }
                    164: 
                    165: 
                    166: /************************************************************************/
                    167: /*     device tree tweaking                                            */
                    168: /************************************************************************/
                    169: 
                    170: /* -1 if error */
                    171: int
                    172: prom_change_phandle( mol_phandle_t old_ph, mol_phandle_t new_ph )
                    173: {
                    174:        return OSI_PromIface1( kPromChangePHandle, old_ph, (int)new_ph );
                    175: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.