diff options
Diffstat (limited to 'sys/alpha/pci/cia.c')
| -rw-r--r-- | sys/alpha/pci/cia.c | 145 |
1 files changed, 39 insertions, 106 deletions
diff --git a/sys/alpha/pci/cia.c b/sys/alpha/pci/cia.c index c68ef57720ffc..065c42065954e 100644 --- a/sys/alpha/pci/cia.c +++ b/sys/alpha/pci/cia.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: cia.c,v 1.13 1998/12/02 09:33:27 dfr Exp $ + * $Id: cia.c,v 1.9 1998/09/16 08:24:30 dfr Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -96,18 +96,14 @@ #include <sys/kernel.h> #include <sys/module.h> #include <sys/bus.h> -#include <sys/rman.h> #include <alpha/pci/ciareg.h> #include <alpha/pci/ciavar.h> -#include <alpha/pci/pcibus.h> #include <machine/bwx.h> #include <machine/swiz.h> #include <machine/intr.h> -#include <machine/intrcnt.h> #include <machine/cpuconf.h> #include <machine/rpb.h> -#include <machine/resource.h> #define KV(pa) ALPHA_PHYS_TO_K0SEG(pa) @@ -142,8 +138,6 @@ static alpha_chipset_cfgwriteb_t cia_bwx_cfgwriteb, cia_swiz_cfgwriteb; static alpha_chipset_cfgwritew_t cia_bwx_cfgwritew, cia_swiz_cfgwritew; static alpha_chipset_cfgwritel_t cia_bwx_cfgwritel, cia_swiz_cfgwritel; static alpha_chipset_addrcvt_t cia_cvt_dense, cia_cvt_bwx; -static alpha_chipset_read_hae_t cia_read_hae; -static alpha_chipset_write_hae_t cia_write_hae; static alpha_chipset_t cia_bwx_chipset = { cia_bwx_inb, @@ -167,8 +161,6 @@ static alpha_chipset_t cia_bwx_chipset = { cia_bwx_cfgwritel, cia_cvt_dense, cia_cvt_bwx, - cia_read_hae, - cia_write_hae, }; static alpha_chipset_t cia_swiz_chipset = { cia_swiz_inb, @@ -192,8 +184,6 @@ static alpha_chipset_t cia_swiz_chipset = { cia_swiz_cfgwritel, cia_cvt_dense, NULL, - cia_read_hae, - cia_write_hae, }; static u_int8_t @@ -449,30 +439,28 @@ cia_swiz_outl(u_int32_t port, u_int32_t data) } static __inline void -cia_swiz_set_hae_mem(u_int32_t *pa) +cia_swiz_set_hae_mem(u_int32_t pa) { - /* Only bother with region 1 */ + /* Only bother with region 1 */ #define REG1 (7 << 29) - if ((cia_hae_mem & REG1) != (*pa & REG1)) { - /* - * Seems fairly paranoid but this is what Linux does... - */ - u_int32_t msb = *pa & REG1; - int s = splhigh(); - cia_hae_mem = (cia_hae_mem & ~REG1) | msb; - REGVAL(CIA_CSR_HAE_MEM) = cia_hae_mem; - alpha_mb(); - cia_hae_mem = REGVAL(CIA_CSR_HAE_MEM); - splx(s); - *pa -= msb; - } + if ((cia_hae_mem & REG1) != (pa & REG1)) { + /* + * Seems fairly paranoid but this is what Linux does... + */ + int s = splhigh(); + cia_hae_mem = (cia_hae_mem & ~REG1) | (pa & REG1); + REGVAL(CIA_CSR_HAE_MEM) = cia_hae_mem; + alpha_mb(); + cia_hae_mem = REGVAL(CIA_CSR_HAE_MEM); + splx(s); + } } static u_int8_t cia_swiz_readb(u_int32_t pa) { alpha_mb(); - cia_swiz_set_hae_mem(&pa); + cia_swiz_set_hae_mem(pa); return SPARSE_READ_BYTE(KV(CIA_PCI_SMEM1), pa); } @@ -480,7 +468,7 @@ static u_int16_t cia_swiz_readw(u_int32_t pa) { alpha_mb(); - cia_swiz_set_hae_mem(&pa); + cia_swiz_set_hae_mem(pa); return SPARSE_READ_WORD(KV(CIA_PCI_SMEM1), pa); } @@ -488,14 +476,14 @@ static u_int32_t cia_swiz_readl(u_int32_t pa) { alpha_mb(); - cia_swiz_set_hae_mem(&pa); + cia_swiz_set_hae_mem(pa); return SPARSE_READ_LONG(KV(CIA_PCI_SMEM1), pa); } static void cia_swiz_writeb(u_int32_t pa, u_int8_t data) { - cia_swiz_set_hae_mem(&pa); + cia_swiz_set_hae_mem(pa); SPARSE_WRITE_BYTE(KV(CIA_PCI_SMEM1), pa, data); alpha_wmb(); } @@ -503,7 +491,7 @@ cia_swiz_writeb(u_int32_t pa, u_int8_t data) static void cia_swiz_writew(u_int32_t pa, u_int16_t data) { - cia_swiz_set_hae_mem(&pa); + cia_swiz_set_hae_mem(pa); SPARSE_WRITE_WORD(KV(CIA_PCI_SMEM1), pa, data); alpha_wmb(); } @@ -511,7 +499,7 @@ cia_swiz_writew(u_int32_t pa, u_int16_t data) static void cia_swiz_writel(u_int32_t pa, u_int32_t data) { - cia_swiz_set_hae_mem(&pa); + cia_swiz_set_hae_mem(pa); SPARSE_WRITE_LONG(KV(CIA_PCI_SMEM1), pa, data); alpha_wmb(); } @@ -628,35 +616,12 @@ cia_cvt_bwx(vm_offset_t addr) return (addr |= CIA_EV56_BWMEM); } -static u_int64_t -cia_read_hae(void) -{ - return cia_hae_mem & REG1; -} -static void -cia_write_hae(u_int64_t hae) -{ - u_int32_t pa = hae; - cia_swiz_set_hae_mem(&pa); -} static int cia_probe(device_t dev); static int cia_attach(device_t dev); -static struct resource *cia_alloc_resource(device_t bus, device_t child, - int type, int *rid, - u_long start, u_long end, - u_long count, u_int flags); -static int cia_activate_resource(device_t bus, device_t child, - int type, int rid, struct resource *r); -static int cia_deactivate_resource(device_t bus, device_t child, - int type, int rid, struct resource *r); -static int cia_release_resource(device_t bus, device_t child, - int type, int rid, struct resource *r); -static int cia_setup_intr(device_t dev, device_t child, struct resource *irq, - driver_intr_t *intr, void *arg, void **cookiep); -static int cia_teardown_intr(device_t dev, device_t child, - struct resource *irq, void *cookie); +static void *cia_create_intr(device_t dev, device_t child, int irq, driver_intr_t *intr, void *arg); +static int cia_connect_intr(device_t dev, void* ih); static device_method_t cia_methods[] = { /* Device interface */ @@ -664,12 +629,8 @@ static device_method_t cia_methods[] = { DEVMETHOD(device_attach, cia_attach), /* Bus interface */ - DEVMETHOD(bus_alloc_resource, pci_alloc_resource), - DEVMETHOD(bus_release_resource, pci_release_resource), - DEVMETHOD(bus_activate_resource, pci_activate_resource), - DEVMETHOD(bus_deactivate_resource, pci_deactivate_resource), - DEVMETHOD(bus_setup_intr, cia_setup_intr), - DEVMETHOD(bus_teardown_intr, cia_teardown_intr), + DEVMETHOD(bus_create_intr, cia_create_intr), + DEVMETHOD(bus_connect_intr, cia_connect_intr), { 0, 0 } }; @@ -721,7 +682,6 @@ cia_init() #if 0 chipset = cia_swiz_chipset; /* XXX */ - cia_ispyxis = 0; #endif if (platform.pci_intr_init) @@ -736,8 +696,6 @@ cia_probe(device_t dev) cia0 = dev; device_set_desc(dev, "2117x PCI adapter"); /* XXX */ - pci_init_resources(); - device_add_child(dev, "isa", 0, 0); return 0; @@ -803,54 +761,29 @@ cia_attach(device_t dev) if (!platform.iointr) /* XXX */ set_iointr(alpha_dispatch_intr); - if (cia_ispyxis) { - snprintf(chipset_type, sizeof(chipset_type), "pyxis"); - chipset_bwx = 1; - chipset_ports = CIA_EV56_BWIO; - chipset_memory = CIA_EV56_BWMEM; - chipset_dense = CIA_PCI_DENSE; - } else { - snprintf(chipset_type, sizeof(chipset_type), "cia"); - chipset_bwx = 0; - chipset_ports = CIA_PCI_SIO1; - chipset_memory = CIA_PCI_SMEM1; - chipset_dense = CIA_PCI_DENSE; - chipset_hae_mask = 7L << 29; - } - bus_generic_attach(dev); return 0; } -static int -cia_setup_intr(device_t dev, device_t child, - struct resource *irq, - driver_intr_t *intr, void *arg, void **cookiep) +static void * +cia_create_intr(device_t dev, device_t child, + int irq, driver_intr_t *intr, void *arg) { - int error; - - error = rman_activate_resource(irq); - if (error) - return error; - - error = alpha_setup_intr(0x900 + (irq->r_start << 4), - intr, arg, cookiep, - &intrcnt[INTRCNT_EB164_IRQ + irq->r_start]); - if (error) - return error; - - /* Enable PCI interrupt */ - platform.pci_intr_enable(irq->r_start); - - return 0; + return alpha_create_intr(0x900 + (irq << 4), intr, arg); } static int -cia_teardown_intr(device_t dev, device_t child, - struct resource *irq, void *cookie) -{ - alpha_teardown_intr(cookie); - return rman_deactivate_resource(irq); +cia_connect_intr(device_t dev, void* ih) +{ + struct alpha_intr *i = ih; + int s = splhigh(); + int error = alpha_connect_intr(i); + if (!error) { + /* Enable PCI interrupt */ + platform.pci_intr_enable((i->vector - 0x900) >> 4); + } + splx(s); + return error; } DRIVER_MODULE(cia, root, cia_driver, cia_devclass, 0, 0); |
