Annotation of Gnu-Mach/chips/busses.c, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Mach Operating System
                      3:  * Copyright (c) 1993-1989 Carnegie Mellon University
                      4:  * All Rights Reserved.
                      5:  * 
                      6:  * Permission to use, copy, modify and distribute this software and its
                      7:  * documentation is hereby granted, provided that both the copyright
                      8:  * notice and this permission notice appear in all copies of the
                      9:  * software, derivative works or modified versions, and any portions
                     10:  * thereof, and that both notices appear in supporting documentation.
                     11:  * 
                     12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     15:  * 
                     16:  * Carnegie Mellon requests users of this software to return to
                     17:  * 
                     18:  *  Software Distribution Coordinator  or  [email protected]
                     19:  *  School of Computer Science
                     20:  *  Carnegie Mellon University
                     21:  *  Pittsburgh PA 15213-3890
                     22:  * 
                     23:  * any improvements or extensions that they make and grant Carnegie Mellon
                     24:  * the rights to redistribute these changes.
                     25:  */
                     26: /*
                     27:  *     File: busses.c
                     28:  *     Author: Alessandro Forin, Carnegie Mellon University
                     29:  *     Date:   4/90
                     30:  *
                     31:  *     Generic autoconfiguration functions,
                     32:  *     usable to probe and attach devices
                     33:  *     on any bus that suits the generic bus
                     34:  *     structure, such as VME, TURBOChannel,
                     35:  *     and all the VAX busses.
                     36:  *
                     37:  */
                     38: 
                     39: #include <mach/boolean.h>
                     40: #include <mach/std_types.h>
                     41: #include <chips/busses.h>
                     42: 
                     43: 
                     44: 
                     45: 
                     46: /*
                     47:  * configure_bus_master
                     48:  *
                     49:  *     Given the name of a bus_ctlr, look it up in the
                     50:  *     init table.  If found, probe it.  If there can be
                     51:  *     slaves attached, walk the device's init table
                     52:  *     for those that might be attached to this controller.
                     53:  *     Call the 'slave' function on each one to see if
                     54:  *     ok, then the 'attach' one.
                     55:  *
                     56:  * Returns 0 if the controller is not there.
                     57:  *
                     58:  */
                     59: boolean_t configure_bus_master(
                     60:        char            *name,
                     61:        vm_offset_t      virt,
                     62:        vm_offset_t      phys,
                     63:        int              adpt_no,
                     64:        char            *bus_name)
                     65: {
                     66:        register struct bus_device *device;
                     67:        register struct bus_ctlr *master;
                     68:        register struct bus_driver *driver;
                     69: 
                     70:        int             found = 0;
                     71: 
                     72:        /*
                     73:         * Match the name in the table, then pick the entry that has the
                     74:         * right adaptor number, or one that has it wildcarded.  Entries
                     75:         * already allocated are marked alive, skip them. 
                     76:         */
                     77:        for (master = bus_master_init; master->driver; master++) {
                     78:                if (master->alive)
                     79:                        continue;
                     80:                if (((master->adaptor == adpt_no) || (master->adaptor == '?')) &&
                     81:                    (strcmp(master->name, name) == 0)) {
                     82:                        found = 1;
                     83:                        break;
                     84:                }
                     85:        }
                     86: 
                     87:        if (!found)
                     88:                return FALSE;
                     89: 
                     90:        /*
                     91:         * Found a match, probe it 
                     92:         */
                     93:        driver = master->driver;
                     94:        if ((*driver->probe) (virt, master) == 0)
                     95:                return FALSE;
                     96: 
                     97:        master->alive = 1;
                     98:        master->adaptor = adpt_no;
                     99: 
                    100:        /*
                    101:         * Remember which controller this device is attached to 
                    102:         */
                    103:        driver->minfo[master->unit] = master;
                    104: 
                    105:        printf("%s%d: at %s%d\n", master->name, master->unit, bus_name, adpt_no);
                    106: 
                    107:        /*
                    108:         * Now walk all devices to check those that might be attached to this
                    109:         * controller.  We match the unallocated ones that have the right
                    110:         * controller number, or that have a widcarded controller number. 
                    111:         */
                    112:        for (device = bus_device_init; device->driver; device++) {
                    113:                int     ctlr;
                    114:                if (device->alive || device->driver != driver ||
                    115:                    (device->adaptor != '?' && device->adaptor != adpt_no))
                    116:                        continue;
                    117:                ctlr = device->ctlr;
                    118:                if (ctlr == '?') device->ctlr = master->unit;
                    119:                /*
                    120:                 * A matching entry. See if the slave-probing routine is
                    121:                 * happy. 
                    122:                 */
                    123:                if ((device->ctlr != master->unit) ||
                    124:                    ((*driver->slave) (device, virt) == 0)) {
                    125:                        device->ctlr = ctlr;
                    126:                        continue;
                    127:                }
                    128: 
                    129:                device->alive = 1;
                    130:                device->adaptor = adpt_no;
                    131:                device->ctlr = master->unit;
                    132: 
                    133:                /*
                    134:                 * Save a backpointer to the controller 
                    135:                 */
                    136:                device->mi = master;
                    137: 
                    138:                /*
                    139:                 * ..and to the device 
                    140:                 */
                    141:                driver->dinfo[device->unit] = device;
                    142: 
                    143:                if (device->slave >= 0)
                    144:                        printf(" %s%d: at %s%d slave %d",
                    145:                               device->name, device->unit,
                    146:                               driver->mname, master->unit, device->slave);
                    147:                else
                    148:                        printf(" %s%d: at %s%d",
                    149:                               device->name, device->unit,
                    150:                               driver->mname, master->unit);
                    151: 
                    152:                /*
                    153:                 * Now attach this slave 
                    154:                 */
                    155:                (*driver->attach) (device);
                    156:                printf("\n");
                    157:        }
                    158:        return TRUE;
                    159: }
                    160: 
                    161: /*
                    162:  * configure_bus_device
                    163:  *
                    164:  *     Given the name of a bus_device, look it up in the
                    165:  *     init table.  If found, probe it.  If it is present,
                    166:  *     call the driver's 'attach' function.
                    167:  *
                    168:  * Returns 0 if the device is not there.
                    169:  *
                    170:  */
                    171: boolean_t configure_bus_device( 
                    172:        char            *name,
                    173:        vm_offset_t      virt,
                    174:        vm_offset_t      phys,
                    175:        int              adpt_no,
                    176:        char            *bus_name)
                    177: {
                    178:        register struct bus_device *device;
                    179:        register struct bus_driver *driver;
                    180: 
                    181:        int             found = 0;
                    182: 
                    183:        /*
                    184:         * Walk all devices to find one with the right name
                    185:         * and adaptor number (or wildcard).  The entry should
                    186:         * be unallocated, and also the slave number should
                    187:         * be wildcarded.
                    188:         */
                    189:        for (device = bus_device_init; device->driver; device++) {
                    190:                if (device->alive)
                    191:                        continue;
                    192:                if (((device->adaptor == adpt_no) || (device->adaptor == '?')) &&
                    193:                    (device->slave == -1) &&
                    194:                    ((!device->phys_address) ||
                    195:                     ((device->phys_address == phys) && (device->address == virt))) &&
                    196:                    (strcmp(device->name, name) == 0)) {
                    197:                        found = 1;
                    198:                        break;
                    199:                }
                    200:        }
                    201: 
                    202:        if (!found)
                    203:                return FALSE;
                    204: 
                    205:        /*
                    206:         * Found an entry, probe the device
                    207:         */
                    208:        driver = device->driver;
                    209:        if ((*driver->probe) (virt, (struct bus_ctlr *)device) == 0)
                    210:                return FALSE;
                    211: 
                    212:        device->alive = 1;
                    213:        device->adaptor = adpt_no;
                    214: 
                    215:        printf("%s%d: at %s%d", device->name, device->unit, bus_name, adpt_no);
                    216: 
                    217:        /*
                    218:         * Remember which driver this device is attached to 
                    219:         */
                    220:        driver->dinfo[device->unit] = device;
                    221: 
                    222:        /*
                    223:         * Attach the device
                    224:         */
                    225:        (*driver->attach) (device);
                    226:        printf("\n");
                    227: 
                    228:        return TRUE;
                    229: }
                    230: 

unix.superglobalmegacorp.com

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