Home | History | Annotate | Line # | Download | only in rmi
      1 /*	$NetBSD: rmixl_mainbus.c,v 1.8 2022/09/29 07:00:47 skrll Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1994,1995 Mark Brinicombe.
      5  * Copyright (c) 1994 Brini.
      6  * All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  * 2. Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in the
     15  *    documentation and/or other materials provided with the distribution.
     16  * 3. All advertising materials mentioning features or use of this software
     17  *    must display the following acknowledgement:
     18  *	This product includes software developed by Brini.
     19  * 4. The name of the company nor the name of the author may be used to
     20  *    endorse or promote products derived from this software without specific
     21  *    prior written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED
     24  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     25  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     26  * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     27  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     28  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     29  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     33  * SUCH DAMAGE.
     34  *
     35  * RiscBSD kernel project
     36  *
     37  * mainbus.c
     38  *
     39  * mainbus configuration
     40  *
     41  * Created      : 15/12/94
     42  */
     43 
     44 #include <sys/cdefs.h>
     45 __KERNEL_RCSID(0, "$NetBSD: rmixl_mainbus.c,v 1.8 2022/09/29 07:00:47 skrll Exp $");
     46 
     47 #include <sys/param.h>
     48 #include <sys/systm.h>
     49 #include <sys/kernel.h>
     50 #include <sys/conf.h>
     51 #include <sys/device.h>
     52 
     53 #include <evbmips/rmixl/autoconf.h>
     54 #include <sys/bus.h>
     55 #include "locators.h"
     56 
     57 static int  mainbusmatch(device_t,  cfdata_t, void *);
     58 static void mainbusattach(device_t,  device_t,  void *);
     59 static int  mainbus_node_alloc(struct mainbus_softc *, int);
     60 static int  mainbus_search(device_t, cfdata_t, const int *, void *);
     61 static int  mainbus_print(void *, const char *);
     62 
     63 CFATTACH_DECL_NEW(mainbus, sizeof(struct mainbus_softc),
     64 	mainbusmatch, mainbusattach, NULL, NULL);
     65 
     66 static int mainbus_found;
     67 
     68 static int
     69 mainbusmatch(device_t parent, cfdata_t cf, void *aux)
     70 {
     71 	if (mainbus_found)
     72 		return 0;
     73 	return 1;
     74 }
     75 
     76 static void
     77 mainbusattach(device_t parent, device_t self, void *aux)
     78 {
     79 	struct mainbus_softc *sc = device_private(self);
     80 
     81 	aprint_naive("\n");
     82 	aprint_normal("\n");
     83 
     84 	sc->sc_dev = self;
     85 	sc->sc_node_next = 0;
     86 	sc->sc_node_mask = 0;
     87 
     88 	mainbus_found = 1;
     89 
     90 	/*
     91 	 * attach mainbus devices
     92 	 */
     93 	config_search(self, NULL,
     94 	    CFARGS(.search = mainbus_search));
     95 }
     96 
     97 static int
     98 mainbus_print(void *aux, const char *pnp)
     99 {
    100 	struct mainbus_attach_args *ma = aux;
    101 
    102 	if (pnp != NULL)
    103 		aprint_normal("%s:", pnp);
    104 	aprint_normal(" node %d", ma->ma_node);
    105 
    106 	return (UNCONF);
    107 }
    108 
    109 static int
    110 mainbus_node_alloc(struct mainbus_softc *sc, int node)
    111 {
    112 	uint64_t bit;
    113 
    114 	if (node == MAINBUSCF_NODE_DEFAULT) {
    115 		for (node=sc->sc_node_next; node < 64; node++) {
    116 			bit = 1 << node;
    117 			if ((sc->sc_node_mask & bit) == 0) {
    118 				sc->sc_node_mask |= bit;
    119 				sc->sc_node_next = node + 1;
    120 				return node;
    121 			}
    122 		}
    123 		panic("%s: node mask underflow", __func__);
    124 	} else {
    125 		if (node >= 64)
    126 			panic("%s: node >= 64", __func__);
    127 		if (node < 0)
    128 			panic("%s: bad node %d", __func__, node);
    129 		bit = 1 << node;
    130 		if ((sc->sc_node_mask & bit) == 0) {
    131 			sc->sc_node_mask |= bit;
    132 			sc->sc_node_next = node + 1;
    133 			return node;
    134 		} else {
    135 			panic("%s: node %d already used\n",
    136 				__func__, node);
    137 		}
    138 	}
    139 
    140 	/*NOTREACHED*/
    141 	return -1;	/* as if */
    142 }
    143 
    144 static int
    145 mainbus_search(device_t parent, cfdata_t cf, const int *ldesc, void *aux)
    146 {
    147 	struct mainbus_softc *sc = device_private(parent);
    148 	struct mainbus_attach_args ma;
    149 
    150 	ma.ma_node = mainbus_node_alloc(sc, cf->cf_loc[MAINBUSCF_NODE]);
    151 
    152 	if (config_probe(parent, cf, &ma))
    153 		config_attach(parent, cf, &ma, mainbus_print, CFARGS_NONE);
    154 
    155 	return 0;
    156 }
    157 
    158