xref: /netbsd-src/sys/dev/mca/mca.c (revision c7fb772b85b2b5d4cfb282f868f454b4701534fd)
1*c7fb772bSthorpej /*	$NetBSD: mca.c,v 1.34 2021/08/07 16:19:13 thorpej Exp $	*/
22185bcc3Sjdolecek 
32185bcc3Sjdolecek /*-
4ba9261baSjdolecek  * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
52185bcc3Sjdolecek  * Copyright (c) 1996-1999 Scott D. Telford.
62185bcc3Sjdolecek  * All rights reserved.
72185bcc3Sjdolecek  *
82185bcc3Sjdolecek  * This code is derived from software contributed to The NetBSD Foundation
92185bcc3Sjdolecek  * by Scott Telford <s.telford@ed.ac.uk>.
102185bcc3Sjdolecek  *
112185bcc3Sjdolecek  * Redistribution and use in source and binary forms, with or without
122185bcc3Sjdolecek  * modification, are permitted provided that the following conditions
132185bcc3Sjdolecek  * are met:
142185bcc3Sjdolecek  * 1. Redistributions of source code must retain the above copyright
152185bcc3Sjdolecek  *    notice, this list of conditions and the following disclaimer.
162185bcc3Sjdolecek  * 2. Redistributions in binary form must reproduce the above copyright
172185bcc3Sjdolecek  *    notice, this list of conditions and the following disclaimer in the
182185bcc3Sjdolecek  *    documentation and/or other materials provided with the distribution.
192185bcc3Sjdolecek  *
202185bcc3Sjdolecek  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
212185bcc3Sjdolecek  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
222185bcc3Sjdolecek  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
232185bcc3Sjdolecek  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
242185bcc3Sjdolecek  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
252185bcc3Sjdolecek  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
262185bcc3Sjdolecek  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
272185bcc3Sjdolecek  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
282185bcc3Sjdolecek  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
292185bcc3Sjdolecek  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
302185bcc3Sjdolecek  * POSSIBILITY OF SUCH DAMAGE.
312185bcc3Sjdolecek  */
322185bcc3Sjdolecek 
332185bcc3Sjdolecek /*
342185bcc3Sjdolecek  * MCA Bus device
352185bcc3Sjdolecek  */
362185bcc3Sjdolecek 
378b7bb912Slukem #include <sys/cdefs.h>
38*c7fb772bSthorpej __KERNEL_RCSID(0, "$NetBSD: mca.c,v 1.34 2021/08/07 16:19:13 thorpej Exp $");
392185bcc3Sjdolecek 
402185bcc3Sjdolecek #include <sys/param.h>
412185bcc3Sjdolecek #include <sys/systm.h>
422185bcc3Sjdolecek #include <sys/device.h>
432185bcc3Sjdolecek 
44a2a38285Sad #include <sys/bus.h>
45d3f6afefSgarbled #include <machine/mca_machdep.h>
462185bcc3Sjdolecek 
472185bcc3Sjdolecek #include <dev/mca/mcareg.h>
482185bcc3Sjdolecek #include <dev/mca/mcavar.h>
497fe8df83Sjdolecek #include <dev/mca/mcadevs.h>
502185bcc3Sjdolecek 
519a623ba3Sdrochner #include "locators.h"
529a623ba3Sdrochner 
5399747a80Scegger int	mca_match(device_t, cfdata_t, void *);
5499747a80Scegger void	mca_attach(device_t, device_t, void *);
552185bcc3Sjdolecek 
56d5f8a855Smatt CFATTACH_DECL_NEW(mca, 0,
57c9b3657cSthorpej     mca_match, mca_attach, NULL, NULL);
582185bcc3Sjdolecek 
5918db93c7Sperry int	mca_print(void *, const char *);
602185bcc3Sjdolecek 
612185bcc3Sjdolecek int
mca_match(device_t parent,cfdata_t cf,void * aux)6299747a80Scegger mca_match(device_t parent, cfdata_t cf, void *aux)
632185bcc3Sjdolecek {
642185bcc3Sjdolecek 	struct mcabus_attach_args *mba = aux;
652185bcc3Sjdolecek 
662185bcc3Sjdolecek 	/* sanity (only mca0 supported currently) */
672185bcc3Sjdolecek 	if (mba->mba_bus < 0 || mba->mba_bus > 0)
682185bcc3Sjdolecek 		return (0);
692185bcc3Sjdolecek 
702185bcc3Sjdolecek 	/* XXX check other indicators? */
712185bcc3Sjdolecek 
722185bcc3Sjdolecek 	return (1);
732185bcc3Sjdolecek }
742185bcc3Sjdolecek 
752185bcc3Sjdolecek int
mca_print(void * aux,const char * pnp)76454af1c0Sdsl mca_print(void *aux, const char *pnp)
772185bcc3Sjdolecek {
782185bcc3Sjdolecek 	register struct mca_attach_args *ma = aux;
792185bcc3Sjdolecek 	char devinfo[256];
802185bcc3Sjdolecek 
812185bcc3Sjdolecek 	if (pnp) {
82aca4c091Sitojun 		mca_devinfo(ma->ma_id, devinfo, sizeof(devinfo));
8372a7af27Sthorpej 		aprint_normal("%s slot %d: %s", pnp, ma->ma_slot + 1, devinfo);
842185bcc3Sjdolecek 	}
852185bcc3Sjdolecek 
867fe8df83Sjdolecek 	/*
877fe8df83Sjdolecek 	 * Print "configured" for Memory Extension boards - there is no
887fe8df83Sjdolecek 	 * meaningfull driver for them, they "just work".
897fe8df83Sjdolecek 	 */
907fe8df83Sjdolecek 	switch(ma->ma_id) {
917fe8df83Sjdolecek 	case MCA_PRODUCT_HRAM: case MCA_PRODUCT_IQRAM: case MCA_PRODUCT_MICRAM:
927fe8df83Sjdolecek 	case MCA_PRODUCT_ASTRAM: case MCA_PRODUCT_KINGRAM:
937fe8df83Sjdolecek 	case MCA_PRODUCT_KINGRAM8: case MCA_PRODUCT_KINGRAM16:
947fe8df83Sjdolecek 	case MCA_PRODUCT_KINGRAM609: case MCA_PRODUCT_HYPRAM:
957fe8df83Sjdolecek 	case MCA_PRODUCT_QRAM1: case MCA_PRODUCT_QRAM2: case MCA_PRODUCT_EVERAM:
967fe8df83Sjdolecek 	case MCA_PRODUCT_BOCARAM: case MCA_PRODUCT_IBMRAM1:
977fe8df83Sjdolecek 	case MCA_PRODUCT_IBMRAM2: case MCA_PRODUCT_IBMRAM3:
987fe8df83Sjdolecek 	case MCA_PRODUCT_IBMRAM4: case MCA_PRODUCT_IBMRAM5:
997fe8df83Sjdolecek 	case MCA_PRODUCT_IBMRAM6: case MCA_PRODUCT_IBMRAM7:
10072a7af27Sthorpej 		aprint_normal(": memory configured\n");
1017fe8df83Sjdolecek 		return (QUIET);
1027fe8df83Sjdolecek 	default:
10360b3bb82Sjdolecek 		return (UNCONF);
1042185bcc3Sjdolecek 	}
1057fe8df83Sjdolecek }
1062185bcc3Sjdolecek 
1072185bcc3Sjdolecek void
mca_attach(device_t parent,device_t self,void * aux)10899747a80Scegger mca_attach(device_t parent, device_t self, void *aux)
1092185bcc3Sjdolecek {
1102185bcc3Sjdolecek 	struct mcabus_attach_args *mba = aux;
1112185bcc3Sjdolecek 	bus_space_tag_t iot, memt;
1122185bcc3Sjdolecek 	bus_dma_tag_t dmat;
1132185bcc3Sjdolecek 	mca_chipset_tag_t mc;
1142185bcc3Sjdolecek 	int slot;
1152185bcc3Sjdolecek 
1162185bcc3Sjdolecek 	mca_attach_hook(parent, self, mba);
1175457a8e2Smsaitoh 	aprint_naive("\n");
1185457a8e2Smsaitoh 	aprint_normal("\n");
1192185bcc3Sjdolecek 
1202185bcc3Sjdolecek 	iot = mba->mba_iot;
1212185bcc3Sjdolecek 	memt = mba->mba_memt;
1222185bcc3Sjdolecek 	mc = mba->mba_mc;
1232185bcc3Sjdolecek 	dmat = mba->mba_dmat;
1242185bcc3Sjdolecek 
1252185bcc3Sjdolecek 	/*
1262185bcc3Sjdolecek 	 * Search for and attach subdevices.
1272185bcc3Sjdolecek 	 *
1282185bcc3Sjdolecek 	 * NB: In the adapter setup register, slots are numbered from 0,
1292185bcc3Sjdolecek 	 * but officially they are numbered from 1.
1302185bcc3Sjdolecek 	 * We use the former convention internally and the latter for text
1312185bcc3Sjdolecek 	 * messages and in config files.
1322185bcc3Sjdolecek 	 */
1332185bcc3Sjdolecek 
1342185bcc3Sjdolecek 	for (slot = 0; slot < MCA_MAX_SLOTS; slot++) {
1352185bcc3Sjdolecek 		struct mca_attach_args ma;
1362185bcc3Sjdolecek 		int reg;
137fa3cb84dSdrochner 		int locs[MCACF_NLOCS];
1382185bcc3Sjdolecek 
1392185bcc3Sjdolecek 		ma.ma_iot = iot;
1402185bcc3Sjdolecek 		ma.ma_memt = memt;
1412185bcc3Sjdolecek 		ma.ma_dmat = dmat;
1422185bcc3Sjdolecek 		ma.ma_mc = mc;
1432185bcc3Sjdolecek 		ma.ma_slot = slot;
1442185bcc3Sjdolecek 
1452185bcc3Sjdolecek 		for(reg = 0; reg < 8; reg++)
1462185bcc3Sjdolecek 			ma.ma_pos[reg]=mca_conf_read(mc, slot, reg);
1472185bcc3Sjdolecek 
1482185bcc3Sjdolecek 		ma.ma_id = ma.ma_pos[0] + (ma.ma_pos[1] << 8);
1492185bcc3Sjdolecek 		if (ma.ma_id == 0xffff)	/* no adapter here */
1502185bcc3Sjdolecek 			continue;
1512185bcc3Sjdolecek 
152fa3cb84dSdrochner 		locs[MCACF_SLOT] = slot;
1539a623ba3Sdrochner 
154b28d00faSjdolecek 		if (ma.ma_pos[2] & MCA_POS2_ENABLE
155b28d00faSjdolecek 		    || mca_match_disabled(ma.ma_id))
1562685996bSthorpej 			config_found(self, &ma, mca_print,
157*c7fb772bSthorpej 				     CFARGS(.submatch = config_stdsubmatch,
158*c7fb772bSthorpej 					    .locators = locs));
1592185bcc3Sjdolecek 		else {
1601ef783cbScegger 			mca_print(&ma, device_xname(self));
1615457a8e2Smsaitoh 			aprint_normal(" disabled\n");
1622185bcc3Sjdolecek 		}
1632185bcc3Sjdolecek 	}
1642185bcc3Sjdolecek }
165