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