diff options
Diffstat (limited to 'sys/alpha/pci/lca.c')
-rw-r--r-- | sys/alpha/pci/lca.c | 252 |
1 files changed, 16 insertions, 236 deletions
diff --git a/sys/alpha/pci/lca.c b/sys/alpha/pci/lca.c index c1b8082..323c94c 100644 --- a/sys/alpha/pci/lca.c +++ b/sys/alpha/pci/lca.c @@ -59,97 +59,14 @@ struct lca_softc { #define LCA_SOFTC(dev) (struct lca_softc*) device_get_softc(dev) -static alpha_chipset_inb_t lca_inb; -static alpha_chipset_inw_t lca_inw; -static alpha_chipset_inl_t lca_inl; -static alpha_chipset_outb_t lca_outb; -static alpha_chipset_outw_t lca_outw; -static alpha_chipset_outl_t lca_outl; -static alpha_chipset_readb_t lca_readb; -static alpha_chipset_readw_t lca_readw; -static alpha_chipset_readl_t lca_readl; -static alpha_chipset_writeb_t lca_writeb; -static alpha_chipset_writew_t lca_writew; -static alpha_chipset_writel_t lca_writel; -static alpha_chipset_maxdevs_t lca_maxdevs; -static alpha_chipset_cfgreadb_t lca_cfgreadb; -static alpha_chipset_cfgreadw_t lca_cfgreadw; -static alpha_chipset_cfgreadl_t lca_cfgreadl; -static alpha_chipset_cfgwriteb_t lca_cfgwriteb; -static alpha_chipset_cfgwritew_t lca_cfgwritew; -static alpha_chipset_cfgwritel_t lca_cfgwritel; -static alpha_chipset_addrcvt_t lca_cvt_dense; static alpha_chipset_read_hae_t lca_read_hae; static alpha_chipset_write_hae_t lca_write_hae; static alpha_chipset_t lca_chipset = { - lca_inb, - lca_inw, - lca_inl, - lca_outb, - lca_outw, - lca_outl, - lca_readb, - lca_readw, - lca_readl, - lca_writeb, - lca_writew, - lca_writel, - lca_maxdevs, - lca_cfgreadb, - lca_cfgreadw, - lca_cfgreadl, - lca_cfgwriteb, - lca_cfgwritew, - lca_cfgwritel, - lca_cvt_dense, - NULL, lca_read_hae, lca_write_hae, }; -static u_int8_t -lca_inb(u_int32_t port) -{ - alpha_mb(); - return SPARSE_READ_BYTE(KV(LCA_PCI_SIO), port); -} - -static u_int16_t -lca_inw(u_int32_t port) -{ - alpha_mb(); - return SPARSE_READ_WORD(KV(LCA_PCI_SIO), port); -} - -static u_int32_t -lca_inl(u_int32_t port) -{ - alpha_mb(); - return SPARSE_READ_LONG(KV(LCA_PCI_SIO), port); -} - -static void -lca_outb(u_int32_t port, u_int8_t data) -{ - SPARSE_WRITE_BYTE(KV(LCA_PCI_SIO), port, data); - alpha_wmb(); -} - -static void -lca_outw(u_int32_t port, u_int16_t data) -{ - SPARSE_WRITE_WORD(KV(LCA_PCI_SIO), port, data); - alpha_wmb(); -} - -static void -lca_outl(u_int32_t port, u_int32_t data) -{ - SPARSE_WRITE_LONG(KV(LCA_PCI_SIO), port, data); - alpha_wmb(); -} - /* * The LCA HAE is write-only. According to NetBSD, this is where it starts. */ @@ -161,14 +78,14 @@ static u_int32_t lca_hae_mem = 0x80000000; */ #define REG1 (1UL << 24) -static __inline void -lca_set_hae_mem(u_int32_t *pa) +static u_int32_t +lca_set_hae_mem(void *arg, u_int32_t pa) { int s; u_int32_t msb; - if(*pa >= REG1){ - msb = *pa & 0xf8000000; - *pa -= msb; + if(pa >= REG1){ + msb = pa & 0xf8000000; + pa -= msb; s = splhigh(); if (msb != lca_hae_mem) { lca_hae_mem = msb; @@ -178,152 +95,7 @@ lca_set_hae_mem(u_int32_t *pa) } splx(s); } -} - -static u_int8_t -lca_readb(u_int32_t pa) -{ - alpha_mb(); - lca_set_hae_mem(&pa); - return SPARSE_READ_BYTE(KV(LCA_PCI_SPARSE), pa); -} - -static u_int16_t -lca_readw(u_int32_t pa) -{ - alpha_mb(); - lca_set_hae_mem(&pa); - return SPARSE_READ_WORD(KV(LCA_PCI_SPARSE), pa); -} - -static u_int32_t -lca_readl(u_int32_t pa) -{ - alpha_mb(); - lca_set_hae_mem(&pa); - return SPARSE_READ_LONG(KV(LCA_PCI_SPARSE), pa); -} - -static void -lca_writeb(u_int32_t pa, u_int8_t data) -{ - lca_set_hae_mem(&pa); - SPARSE_WRITE_BYTE(KV(LCA_PCI_SPARSE), pa, data); - alpha_wmb(); -} - -static void -lca_writew(u_int32_t pa, u_int16_t data) -{ - lca_set_hae_mem(&pa); - SPARSE_WRITE_WORD(KV(LCA_PCI_SPARSE), pa, data); - alpha_wmb(); -} - -static void -lca_writel(u_int32_t pa, u_int32_t data) -{ - lca_set_hae_mem(&pa); - SPARSE_WRITE_LONG(KV(LCA_PCI_SPARSE), pa, data); - alpha_wmb(); -} - -static int -lca_maxdevs(u_int b) -{ - return 12; /* XXX */ -} - -#define LCA_CFGOFF(b, s, f, r) \ - ((b) ? (((b) << 16) | ((s) << 11) | ((f) << 8) | (r)) \ - : ((1 << ((s) + 11)) | ((f) << 8) | (r))) - -#define LCA_TYPE1_SETUP(b,s) if ((b)) { \ - do { \ - (s) = splhigh(); \ - alpha_mb(); \ - REGVAL(LCA_IOC_CONF) = 1; \ - alpha_mb(); \ - } while(0); \ -} - -#define LCA_TYPE1_TEARDOWN(b,s) if ((b)) { \ - do { \ - alpha_mb(); \ - REGVAL(LCA_IOC_CONF) = 0; \ - alpha_mb(); \ - splx((s)); \ - } while(0); \ -} - -#define CFGREAD(b, s, f, r, width, type) \ - type val = ~0; \ - int ipl = 0; \ - vm_offset_t off = LCA_CFGOFF(b, s, f, r); \ - vm_offset_t kv = SPARSE_##width##_ADDRESS(KV(LCA_PCI_CONF), off); \ - alpha_mb(); \ - LCA_TYPE1_SETUP(b,ipl); \ - if (!badaddr((caddr_t)kv, sizeof(type))) { \ - val = SPARSE_##width##_EXTRACT(off, SPARSE_READ(kv)); \ - } \ - LCA_TYPE1_TEARDOWN(b,ipl); \ - return val - -#define CFGWRITE(b, s, f, r, data, width, type) \ - int ipl = 0; \ - vm_offset_t off = LCA_CFGOFF(b, s, f, r); \ - vm_offset_t kv = SPARSE_##width##_ADDRESS(KV(LCA_PCI_CONF), off); \ - alpha_mb(); \ - LCA_TYPE1_SETUP(b,ipl); \ - if (!badaddr((caddr_t)kv, sizeof(type))) { \ - SPARSE_WRITE(kv, SPARSE_##width##_INSERT(off, data)); \ - alpha_wmb(); \ - } \ - LCA_TYPE1_TEARDOWN(b,ipl); \ - return - -static u_int8_t -lca_cfgreadb(u_int h, u_int b, u_int s, u_int f, u_int r) -{ - CFGREAD(b, s, f, r, BYTE, u_int8_t); -} - -static u_int16_t -lca_cfgreadw(u_int h, u_int b, u_int s, u_int f, u_int r) -{ - CFGREAD(b, s, f, r, WORD, u_int16_t); -} - -static u_int32_t -lca_cfgreadl(u_int h, u_int b, u_int s, u_int f, u_int r) -{ - CFGREAD(b, s, f, r, LONG, u_int32_t); -} - -static void -lca_cfgwriteb(u_int h, u_int b, u_int s, u_int f, u_int r, u_int8_t data) -{ - CFGWRITE(b, s, f, r, data, BYTE, u_int8_t); -} - -static void -lca_cfgwritew(u_int h, u_int b, u_int s, u_int f, u_int r, u_int16_t data) -{ - CFGWRITE(b, s, f, r, data, WORD, u_int16_t); -} - -static void -lca_cfgwritel(u_int h, u_int b, u_int s, u_int f, u_int r, u_int32_t data) -{ - CFGWRITE(b, s, f, r, data, LONG, u_int16_t); -} - -static vm_offset_t -lca_cvt_dense(vm_offset_t addr) -{ - addr &= 0xffffffffUL; - return (addr | LCA_PCI_DENSE); - + return pa; } static u_int64_t @@ -336,7 +108,7 @@ static void lca_write_hae(u_int64_t hae) { u_int32_t pa = hae; - lca_set_hae_mem(&pa); + lca_set_hae_mem(0, pa); } static int lca_probe(device_t dev); @@ -382,7 +154,7 @@ lca_sgmap_invalidate(void) } static void -lca_sgmap_map(void *arg, vm_offset_t ba, vm_offset_t pa) +lca_sgmap_map(void *arg, bus_addr_t ba, vm_offset_t pa) { u_int64_t *sgtable = arg; int index = alpha_btop(ba - LCA_SGMAP_BASE); @@ -435,10 +207,18 @@ void lca_init() { static int initted = 0; + static struct swiz_space io_space, mem_space; if (initted) return; initted = 1; + swiz_init_space(&io_space, KV(LCA_PCI_SIO)); + swiz_init_space_hae(&mem_space, KV(LCA_PCI_SPARSE), + lca_set_hae_mem, 0); + + busspace_isa_io = (struct alpha_busspace *) &io_space; + busspace_isa_mem = (struct alpha_busspace *) &mem_space; + /* Type 0 PCI conf access. */ REGVAL64(LCA_IOC_CONF) = 0; |