diff options
Diffstat (limited to 'sys/arch/alpha/pci/cia_pci.c')
-rw-r--r-- | sys/arch/alpha/pci/cia_pci.c | 198 |
1 files changed, 83 insertions, 115 deletions
diff --git a/sys/arch/alpha/pci/cia_pci.c b/sys/arch/alpha/pci/cia_pci.c index ef918cd84d6..4d9b592502b 100644 --- a/sys/arch/alpha/pci/cia_pci.c +++ b/sys/arch/alpha/pci/cia_pci.c @@ -1,7 +1,7 @@ -/* $NetBSD: cia_pci.c,v 1.1 1995/11/23 02:37:29 cgd Exp $ */ +/* $NetBSD: cia_pci.c,v 1.2 1996/04/12 23:37:10 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -38,33 +38,83 @@ #include <alpha/pci/ciareg.h> #include <alpha/pci/ciavar.h> -pci_confreg_t cia_conf_read __P((void *, pci_conftag_t, pci_confoffset_t)); -void cia_conf_write __P((void *, pci_conftag_t, - pci_confoffset_t, pci_confreg_t)); -int cia_find_io __P((void *, pci_conftag_t, - pci_confoffset_t, pci_iooffset_t *, pci_iosize_t *)); -int cia_find_mem __P((void *, pci_conftag_t, - pci_confoffset_t, pci_moffset_t *, pci_msize_t *, int *)); - -__const struct pci_conf_fns cia_conf_fns = { - cia_conf_read, - cia_conf_write, - cia_find_io, - cia_find_mem, -}; - -pci_confreg_t +void cia_attach_hook __P((struct device *, struct device *, + struct pcibus_attach_args *)); +int cia_bus_maxdevs __P((void *, int)); +pcitag_t cia_make_tag __P((void *, int, int, int)); +void cia_decompose_tag __P((void *, pcitag_t, int *, int *, + int *)); +pcireg_t cia_conf_read __P((void *, pcitag_t, int)); +void cia_conf_write __P((void *, pcitag_t, int, pcireg_t)); + +void +cia_pci_init(pc, v) + pci_chipset_tag_t pc; + void *v; +{ + + pc->pc_conf_v = v; + pc->pc_attach_hook = cia_attach_hook; + pc->pc_bus_maxdevs = cia_bus_maxdevs; + pc->pc_make_tag = cia_make_tag; + pc->pc_decompose_tag = cia_decompose_tag; + pc->pc_conf_read = cia_conf_read; + pc->pc_conf_write = cia_conf_write; +} + +void +cia_attach_hook(parent, self, pba) + struct device *parent, *self; + struct pcibus_attach_args *pba; +{ +} + +int +cia_bus_maxdevs(cpv, busno) + void *cpv; + int busno; +{ + + return 32; +} + +pcitag_t +cia_make_tag(cpv, b, d, f) + void *cpv; + int b, d, f; +{ + + return (b << 16) | (d << 11) | (f << 8); +} + +void +cia_decompose_tag(cpv, tag, bp, dp, fp) + void *cpv; + pcitag_t tag; + int *bp, *dp, *fp; +{ + + if (bp != NULL) + *bp = (tag >> 16) & 0xff; + if (dp != NULL) + *dp = (tag >> 11) & 0x1f; + if (fp != NULL) + *fp = (tag >> 8) & 0x7; +} + +pcireg_t cia_conf_read(cpv, tag, offset) void *cpv; - pci_conftag_t tag; - pci_confoffset_t offset; + pcitag_t tag; + int offset; { - struct cia_config *acp = cpv; - pci_confreg_t *datap, data; + struct cia_config *ccp = cpv; + pcireg_t *datap, data; int s, secondary, ba; int32_t old_haxr2; /* XXX */ - secondary = PCI_TAG_BUS(tag) != 0; + /* secondary if bus # != 0 */ + pci_decompose_tag(&ccp->cc_pc, tag, &secondary, 0, 0); if (secondary) { s = splhigh(); old_haxr2 = REGVAL(CIA_CSRS + 0x480); /* XXX */ @@ -73,12 +123,12 @@ cia_conf_read(cpv, tag, offset) wbflush(); } - datap = (pci_confreg_t *)phystok0seg(CIA_PCI_CONF | + datap = (pcireg_t *)phystok0seg(CIA_PCI_CONF | tag << 5UL | /* XXX */ (offset & ~0x03) << 5 | /* XXX */ 0 << 5 | /* XXX */ 0x3 << 3); /* XXX */ - data = (pci_confreg_t)-1; + data = (pcireg_t)-1; if (!(ba = badaddr(datap, sizeof *datap))) data = *datap; @@ -100,16 +150,17 @@ cia_conf_read(cpv, tag, offset) void cia_conf_write(cpv, tag, offset, data) void *cpv; - pci_conftag_t tag; - pci_confoffset_t offset; - pci_confreg_t data; + pcitag_t tag; + int offset; + pcireg_t data; { - struct cia_config *acp = cpv; - pci_confreg_t *datap; + struct cia_config *ccp = cpv; + pcireg_t *datap; int s, secondary; int32_t old_haxr2; /* XXX */ - secondary = PCI_TAG_BUS(tag) != 0; + /* secondary if bus # != 0 */ + pci_decompose_tag(&ccp->cc_pc, tag, &secondary, 0, 0); if (secondary) { s = splhigh(); old_haxr2 = REGVAL(CIA_CSRS + 0x480); /* XXX */ @@ -118,7 +169,7 @@ cia_conf_write(cpv, tag, offset, data) wbflush(); } - datap = (pci_confreg_t *)phystok0seg(CIA_PCI_CONF | + datap = (pcireg_t *)phystok0seg(CIA_PCI_CONF | tag << 5UL | /* XXX */ (offset & ~0x03) << 5 | /* XXX */ 0 << 5 | /* XXX */ @@ -137,86 +188,3 @@ cia_conf_write(cpv, tag, offset, data) reg, data, datap); #endif } - -int -cia_find_io(cpv, tag, reg, iobasep, sizep) - void *cpv; - pci_conftag_t tag; - pci_confoffset_t reg; - pci_iooffset_t *iobasep; - pci_iosize_t *sizep; -{ - struct cia_config *acp = cpv; - pci_confreg_t addrdata, sizedata; - pci_iooffset_t pci_iobase; - - if (reg < PCI_MAPREG_START || reg >= PCI_MAPREG_END || (reg & 3)) - panic("cia_map_io: bad request"); - - addrdata = PCI_CONF_READ(acp->cc_conffns, acp->cc_confarg, tag, reg); - - PCI_CONF_WRITE(acp->cc_conffns, acp->cc_confarg, tag, reg, 0xffffffff); - sizedata = PCI_CONF_READ(acp->cc_conffns, acp->cc_confarg, tag, reg); - PCI_CONF_WRITE(acp->cc_conffns, acp->cc_confarg, tag, reg, addrdata); - - if (PCI_MAPREG_TYPE(addrdata) == PCI_MAPREG_TYPE_MEM) - panic("cia_map_io: attempt to I/O map an memory region"); - - if (iobasep != NULL) - *iobasep = PCI_MAPREG_IO_ADDRESS(addrdata); - if (sizep != NULL) - *sizep = ~PCI_MAPREG_IO_ADDRESS(sizedata) + 1; - - return (0); -} - -int -cia_find_mem(cpv, tag, reg, paddrp, sizep, cacheablep) - void *cpv; - pci_conftag_t tag; - pci_confoffset_t reg; - pci_moffset_t *paddrp; - pci_msize_t *sizep; - int *cacheablep; -{ - struct cia_config *acp = cpv; - pci_confreg_t addrdata, sizedata; - - if (reg < PCI_MAPREG_START || reg >= PCI_MAPREG_END || (reg & 3)) - panic("cia_map_mem: bad request"); - - /* - * The PROM has mapped the device for us. We take the address - * that's been assigned to the register, and figure out what - * physical and virtual addresses go with it... - */ - addrdata = PCI_CONF_READ(acp->cc_conffns, acp->cc_confarg, tag, reg); - - PCI_CONF_WRITE(acp->cc_conffns, acp->cc_confarg, tag, reg, 0xffffffff); - sizedata = PCI_CONF_READ(acp->cc_conffns, acp->cc_confarg, tag, reg); - PCI_CONF_WRITE(acp->cc_conffns, acp->cc_confarg, tag, reg, addrdata); - - if (PCI_MAPREG_TYPE(addrdata) == PCI_MAPREG_TYPE_IO) - panic("cia_map_mem: attempt to memory map an I/O region"); - - switch (PCI_MAPREG_MEM_TYPE(addrdata)) { - case PCI_MAPREG_MEM_TYPE_32BIT: - case PCI_MAPREG_MEM_TYPE_32BIT_1M: - break; - case PCI_MAPREG_MEM_TYPE_64BIT: -/* XXX */ printf("cia_map_mem: attempt to map 64-bit region\n"); -/* XXX */ break; - default: - printf("cia_map_mem: reserved mapping type\n"); - return EINVAL; - } - - if (paddrp != NULL) - *paddrp = PCI_MAPREG_MEM_ADDRESS(addrdata); /* PCI addr */ - if (sizep != NULL) - *sizep = ~PCI_MAPREG_MEM_ADDRESS(sizedata) + 1; - if (cacheablep != NULL) - *cacheablep = PCI_MAPREG_MEM_CACHEABLE(addrdata); - - return 0; -} |