8ffccdfae0
21164 + 21172 box, with Yet Another Way of doing interrupts. The interrupt mapping and handling code hasn't been written yet, and none of this code has been tested. (Checkpoint of work in progress.)
181 lines
4.1 KiB
C
181 lines
4.1 KiB
C
/* $NetBSD: cia.c,v 1.13 1996/11/11 21:08:12 cgd Exp $ */
|
|
|
|
/*
|
|
* Copyright (c) 1995, 1996 Carnegie-Mellon University.
|
|
* All rights reserved.
|
|
*
|
|
* Author: Chris G. Demetriou
|
|
*
|
|
* Permission to use, copy, modify and distribute this software and
|
|
* its documentation is hereby granted, provided that both the copyright
|
|
* notice and this permission notice appear in all copies of the
|
|
* software, derivative works or modified versions, and any portions
|
|
* thereof, and that both notices appear in supporting documentation.
|
|
*
|
|
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
|
|
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
|
|
* FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
|
|
*
|
|
* Carnegie Mellon requests users of this software to return to
|
|
*
|
|
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
|
|
* School of Computer Science
|
|
* Carnegie Mellon University
|
|
* Pittsburgh PA 15213-3890
|
|
*
|
|
* any improvements or extensions that they make and grant Carnegie the
|
|
* rights to redistribute these changes.
|
|
*/
|
|
|
|
#include <sys/param.h>
|
|
#include <sys/systm.h>
|
|
#include <sys/kernel.h>
|
|
#include <sys/malloc.h>
|
|
#include <sys/device.h>
|
|
#include <vm/vm.h>
|
|
|
|
#include <machine/autoconf.h>
|
|
#include <machine/rpb.h>
|
|
|
|
#include <dev/isa/isareg.h>
|
|
#include <dev/isa/isavar.h>
|
|
|
|
#include <dev/pci/pcireg.h>
|
|
#include <dev/pci/pcivar.h>
|
|
#include <alpha/pci/ciareg.h>
|
|
#include <alpha/pci/ciavar.h>
|
|
#if defined(DEC_KN20AA)
|
|
#include <alpha/pci/pci_kn20aa.h>
|
|
#endif
|
|
#if defined(DEC_EB164)
|
|
#include <alpha/pci/pci_eb164.h>
|
|
#endif
|
|
|
|
int ciamatch __P((struct device *, void *, void *));
|
|
void ciaattach __P((struct device *, struct device *, void *));
|
|
|
|
struct cfattach cia_ca = {
|
|
sizeof(struct cia_softc), ciamatch, ciaattach,
|
|
};
|
|
|
|
struct cfdriver cia_cd = {
|
|
NULL, "cia", DV_DULL,
|
|
};
|
|
|
|
static int ciaprint __P((void *, const char *pnp));
|
|
|
|
/* There can be only one. */
|
|
int ciafound;
|
|
struct cia_config cia_configuration;
|
|
|
|
int
|
|
ciamatch(parent, match, aux)
|
|
struct device *parent;
|
|
void *match, *aux;
|
|
{
|
|
struct confargs *ca = aux;
|
|
|
|
/* Make sure that we're looking for a CIA. */
|
|
if (strcmp(ca->ca_name, cia_cd.cd_name) != 0)
|
|
return (0);
|
|
|
|
if (ciafound)
|
|
return (0);
|
|
|
|
return (1);
|
|
}
|
|
|
|
/*
|
|
* Set up the chipset's function pointers.
|
|
*/
|
|
void
|
|
cia_init(ccp)
|
|
struct cia_config *ccp;
|
|
{
|
|
|
|
/*
|
|
* Can't set up SGMAP data here; can be called before malloc().
|
|
*/
|
|
|
|
ccp->cc_iot = cia_bus_io_init(ccp);
|
|
ccp->cc_memt = cia_bus_mem_init(ccp);
|
|
cia_pci_init(&ccp->cc_pc, ccp);
|
|
|
|
ccp->cc_hae_mem = REGVAL(CIA_CSR_HAE_MEM);
|
|
ccp->cc_hae_io = REGVAL(CIA_CSR_HAE_IO);
|
|
|
|
/* XXX XXX BEGIN XXX XXX */
|
|
{ /* XXX */
|
|
extern vm_offset_t alpha_XXX_dmamap_or; /* XXX */
|
|
alpha_XXX_dmamap_or = 0x40000000; /* XXX */
|
|
} /* XXX */
|
|
/* XXX XXX END XXX XXX */
|
|
}
|
|
|
|
void
|
|
ciaattach(parent, self, aux)
|
|
struct device *parent, *self;
|
|
void *aux;
|
|
{
|
|
struct cia_softc *sc = (struct cia_softc *)self;
|
|
struct cia_config *ccp;
|
|
struct pcibus_attach_args pba;
|
|
|
|
/* note that we've attached the chipset; can't have 2 CIAs. */
|
|
ciafound = 1;
|
|
|
|
/*
|
|
* set up the chipset's info; done once at console init time
|
|
* (maybe), but doesn't hurt to do twice.
|
|
*/
|
|
ccp = sc->sc_ccp = &cia_configuration;
|
|
cia_init(ccp);
|
|
|
|
/* XXX print chipset information */
|
|
printf("\n");
|
|
|
|
switch (hwrpb->rpb_type) {
|
|
#if defined(DEC_KN20AA)
|
|
case ST_DEC_KN20AA:
|
|
pci_kn20aa_pickintr(ccp);
|
|
#ifdef EVCNT_COUNTERS
|
|
evcnt_attach(self, "intr", &kn20aa_intr_evcnt);
|
|
#endif
|
|
break;
|
|
#endif
|
|
|
|
#if defined(DEC_EB164)
|
|
case ST_EB164:
|
|
pci_eb164_pickintr(ccp);
|
|
#ifdef EVCNT_COUNTERS
|
|
evcnt_attach(self, "intr", &eb164_intr_evcnt);
|
|
#endif
|
|
break;
|
|
#endif
|
|
|
|
default:
|
|
panic("ciaattach: shouldn't be here, really...");
|
|
}
|
|
|
|
pba.pba_busname = "pci";
|
|
pba.pba_iot = ccp->cc_iot;
|
|
pba.pba_memt = ccp->cc_memt;
|
|
pba.pba_pc = &ccp->cc_pc;
|
|
pba.pba_bus = 0;
|
|
config_found(self, &pba, ciaprint);
|
|
}
|
|
|
|
static int
|
|
ciaprint(aux, pnp)
|
|
void *aux;
|
|
const char *pnp;
|
|
{
|
|
register struct pcibus_attach_args *pba = aux;
|
|
|
|
/* only PCIs can attach to CIAs; easy. */
|
|
if (pnp)
|
|
printf("%s at %s", pba->pba_busname, pnp);
|
|
printf(" bus %d", pba->pba_bus);
|
|
return (UNCONF);
|
|
}
|