1*565153a0Svisa /* $OpenBSD: htb.c,v 1.3 2017/05/10 15:21:02 visa Exp $ */
27d353fccSvisa
37d353fccSvisa /*
47d353fccSvisa * Copyright (c) 2016 Visa Hankala
57d353fccSvisa *
67d353fccSvisa * Permission to use, copy, modify, and distribute this software for any
77d353fccSvisa * purpose with or without fee is hereby granted, provided that the above
87d353fccSvisa * copyright notice and this permission notice appear in all copies.
97d353fccSvisa *
107d353fccSvisa * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
117d353fccSvisa * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
127d353fccSvisa * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
137d353fccSvisa * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
147d353fccSvisa * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
157d353fccSvisa * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
167d353fccSvisa * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
177d353fccSvisa */
187d353fccSvisa
197d353fccSvisa /*
207d353fccSvisa * PCI host bridge driver for Loongson 3A.
217d353fccSvisa */
227d353fccSvisa
237d353fccSvisa #include <sys/param.h>
247d353fccSvisa #include <sys/systm.h>
257d353fccSvisa #include <sys/device.h>
267d353fccSvisa
277d353fccSvisa #include <machine/autoconf.h>
287d353fccSvisa #include <machine/loongson3.h>
297d353fccSvisa
307d353fccSvisa #include <dev/pci/pcidevs.h>
317d353fccSvisa #include <dev/pci/pcireg.h>
327d353fccSvisa #include <dev/pci/pcivar.h>
337d353fccSvisa #include <dev/pci/ppbreg.h>
347d353fccSvisa
357d353fccSvisa #include <loongson/dev/htbreg.h>
367d353fccSvisa #include <loongson/dev/htbvar.h>
377d353fccSvisa
387d353fccSvisa struct htb_softc {
397d353fccSvisa struct device sc_dev;
407d353fccSvisa struct mips_pci_chipset sc_pc;
41*565153a0Svisa const struct htb_config *sc_config;
427d353fccSvisa };
437d353fccSvisa
447d353fccSvisa int htb_match(struct device *, void *, void *);
457d353fccSvisa void htb_attach(struct device *, struct device *, void *);
467d353fccSvisa int htb_print(void *, const char *);
477d353fccSvisa
487d353fccSvisa void htb_attach_hook(struct device *, struct device *,
497d353fccSvisa struct pcibus_attach_args *pba);
507d353fccSvisa int htb_bus_maxdevs(void *, int);
517d353fccSvisa pcitag_t htb_make_tag(void *, int, int, int);
527d353fccSvisa void htb_decompose_tag(void *, pcitag_t, int *, int *, int *);
537d353fccSvisa int htb_conf_addr(const struct bonito_config *, pcitag_t, int,
547d353fccSvisa u_int32_t *, u_int32_t *);
557d353fccSvisa int htb_conf_size(void *, pcitag_t);
567d353fccSvisa pcireg_t htb_conf_read(void *, pcitag_t, int);
577d353fccSvisa void htb_conf_write(void *, pcitag_t, int, pcireg_t);
587d353fccSvisa int htb_pci_intr_map(struct pci_attach_args *, pci_intr_handle_t *);
597d353fccSvisa const char *
607d353fccSvisa htb_pci_intr_string(void *, pci_intr_handle_t);
617d353fccSvisa void *htb_pci_intr_establish(void *, pci_intr_handle_t, int,
627d353fccSvisa int (*)(void *), void *, char *);
637d353fccSvisa void htb_pci_intr_disestablish(void *, void *);
647d353fccSvisa
657d353fccSvisa bus_addr_t htb_pa_to_device(paddr_t);
667d353fccSvisa paddr_t htb_device_to_pa(bus_addr_t);
677d353fccSvisa
687d353fccSvisa int htb_io_map(bus_space_tag_t, bus_addr_t, bus_size_t, int,
697d353fccSvisa bus_space_handle_t *);
707d353fccSvisa int htb_mem_map(bus_space_tag_t, bus_addr_t, bus_size_t, int,
717d353fccSvisa bus_space_handle_t *);
727d353fccSvisa paddr_t htb_mem_mmap(bus_space_tag_t, bus_addr_t, off_t, int, int);
737d353fccSvisa
747d353fccSvisa paddr_t htb_cfg_space_addr(pcitag_t, int);
757d353fccSvisa
767d353fccSvisa pcireg_t htb_conf_read_early(pcitag_t, int);
777d353fccSvisa pcitag_t htb_make_tag_early(int, int, int);
787d353fccSvisa
797d353fccSvisa const struct cfattach htb_ca = {
807d353fccSvisa sizeof(struct htb_softc), htb_match, htb_attach
817d353fccSvisa };
827d353fccSvisa
837d353fccSvisa struct cfdriver htb_cd = {
847d353fccSvisa NULL, "htb", DV_DULL
857d353fccSvisa };
867d353fccSvisa
877d353fccSvisa struct machine_bus_dma_tag htb_bus_dma_tag = {
887d353fccSvisa ._dmamap_create = _dmamap_create,
897d353fccSvisa ._dmamap_destroy = _dmamap_destroy,
907d353fccSvisa ._dmamap_load = _dmamap_load,
917d353fccSvisa ._dmamap_load_mbuf = _dmamap_load_mbuf,
927d353fccSvisa ._dmamap_load_uio = _dmamap_load_uio,
937d353fccSvisa ._dmamap_load_raw = _dmamap_load_raw,
947d353fccSvisa ._dmamap_load_buffer = _dmamap_load_buffer,
957d353fccSvisa ._dmamap_unload = _dmamap_unload,
967d353fccSvisa ._dmamap_sync = _dmamap_sync,
977d353fccSvisa ._dmamem_alloc = _dmamem_alloc,
987d353fccSvisa ._dmamem_free = _dmamem_free,
997d353fccSvisa ._dmamem_map = _dmamem_map,
1007d353fccSvisa ._dmamem_unmap = _dmamem_unmap,
1017d353fccSvisa ._dmamem_mmap = _dmamem_mmap,
1027d353fccSvisa
1037d353fccSvisa ._pa_to_device = htb_pa_to_device,
1047d353fccSvisa ._device_to_pa = htb_device_to_pa
1057d353fccSvisa };
1067d353fccSvisa
1077d353fccSvisa struct mips_bus_space htb_pci_io_space_tag = {
1087d353fccSvisa .bus_base = PHYS_TO_XKPHYS(HTB_IO_BASE, CCA_NC),
1097d353fccSvisa ._space_read_1 = generic_space_read_1,
1107d353fccSvisa ._space_write_1 = generic_space_write_1,
1117d353fccSvisa ._space_read_2 = generic_space_read_2,
1127d353fccSvisa ._space_write_2 = generic_space_write_2,
1137d353fccSvisa ._space_read_4 = generic_space_read_4,
1147d353fccSvisa ._space_write_4 = generic_space_write_4,
1157d353fccSvisa ._space_read_8 = generic_space_read_8,
1167d353fccSvisa ._space_write_8 = generic_space_write_8,
1177d353fccSvisa ._space_read_raw_2 = generic_space_read_raw_2,
1187d353fccSvisa ._space_write_raw_2 = generic_space_write_raw_2,
1197d353fccSvisa ._space_read_raw_4 = generic_space_read_raw_4,
1207d353fccSvisa ._space_write_raw_4 = generic_space_write_raw_4,
1217d353fccSvisa ._space_read_raw_8 = generic_space_read_raw_8,
1227d353fccSvisa ._space_write_raw_8 = generic_space_write_raw_8,
1237d353fccSvisa ._space_map = htb_io_map,
1247d353fccSvisa ._space_unmap = generic_space_unmap,
1257d353fccSvisa ._space_subregion = generic_space_region,
1267d353fccSvisa ._space_vaddr = generic_space_vaddr,
1277d353fccSvisa ._space_mmap = generic_space_mmap
1287d353fccSvisa };
1297d353fccSvisa
1307d353fccSvisa struct mips_bus_space htb_pci_mem_space_tag = {
1317d353fccSvisa .bus_base = PHYS_TO_XKPHYS(0, CCA_NC),
1327d353fccSvisa ._space_read_1 = generic_space_read_1,
1337d353fccSvisa ._space_write_1 = generic_space_write_1,
1347d353fccSvisa ._space_read_2 = generic_space_read_2,
1357d353fccSvisa ._space_write_2 = generic_space_write_2,
1367d353fccSvisa ._space_read_4 = generic_space_read_4,
1377d353fccSvisa ._space_write_4 = generic_space_write_4,
1387d353fccSvisa ._space_read_8 = generic_space_read_8,
1397d353fccSvisa ._space_write_8 = generic_space_write_8,
1407d353fccSvisa ._space_read_raw_2 = generic_space_read_raw_2,
1417d353fccSvisa ._space_write_raw_2 = generic_space_write_raw_2,
1427d353fccSvisa ._space_read_raw_4 = generic_space_read_raw_4,
1437d353fccSvisa ._space_write_raw_4 = generic_space_write_raw_4,
1447d353fccSvisa ._space_read_raw_8 = generic_space_read_raw_8,
1457d353fccSvisa ._space_write_raw_8 = generic_space_write_raw_8,
1467d353fccSvisa ._space_map = htb_mem_map,
1477d353fccSvisa ._space_unmap = generic_space_unmap,
1487d353fccSvisa ._space_subregion = generic_space_region,
1497d353fccSvisa ._space_vaddr = generic_space_vaddr,
1507d353fccSvisa ._space_mmap = htb_mem_mmap
1517d353fccSvisa };
1527d353fccSvisa
1537d353fccSvisa int
htb_match(struct device * parent,void * match,void * aux)1547d353fccSvisa htb_match(struct device *parent, void *match, void *aux)
1557d353fccSvisa {
1567d353fccSvisa struct mainbus_attach_args *maa = aux;
1577d353fccSvisa
1587d353fccSvisa if (loongson_ver != 0x3a && loongson_ver != 0x3b)
1597d353fccSvisa return 0;
1607d353fccSvisa
1617d353fccSvisa if (strcmp(maa->maa_name, htb_cd.cd_name) != 0)
1627d353fccSvisa return 0;
1637d353fccSvisa
1647d353fccSvisa return 1;
1657d353fccSvisa }
1667d353fccSvisa
1677d353fccSvisa void
htb_attach(struct device * parent,struct device * self,void * aux)1687d353fccSvisa htb_attach(struct device *parent, struct device *self, void *aux)
1697d353fccSvisa {
1707d353fccSvisa struct pcibus_attach_args pba;
1717d353fccSvisa struct htb_softc *sc = (struct htb_softc *)self;
1727d353fccSvisa pci_chipset_tag_t pc = &sc->sc_pc;
1737d353fccSvisa
1747d353fccSvisa printf("\n");
1757d353fccSvisa
176*565153a0Svisa sc->sc_config = sys_platform->htb_config;
177*565153a0Svisa
1787d353fccSvisa pc->pc_conf_v = sc;
1797d353fccSvisa pc->pc_attach_hook = htb_attach_hook;
1807d353fccSvisa pc->pc_bus_maxdevs = htb_bus_maxdevs;
1817d353fccSvisa pc->pc_make_tag = htb_make_tag;
1827d353fccSvisa pc->pc_decompose_tag = htb_decompose_tag;
1837d353fccSvisa pc->pc_conf_size = htb_conf_size;
1847d353fccSvisa pc->pc_conf_read = htb_conf_read;
1857d353fccSvisa pc->pc_conf_write = htb_conf_write;
1867d353fccSvisa
1877d353fccSvisa pc->pc_intr_v = sc;
1887d353fccSvisa pc->pc_intr_map = htb_pci_intr_map;
1897d353fccSvisa pc->pc_intr_string = htb_pci_intr_string;
1907d353fccSvisa pc->pc_intr_establish = htb_pci_intr_establish;
1917d353fccSvisa pc->pc_intr_disestablish = htb_pci_intr_disestablish;
1927d353fccSvisa
1937d353fccSvisa memset(&pba, 0, sizeof(pba));
1947d353fccSvisa pba.pba_busname = "pci";
1957d353fccSvisa pba.pba_iot = &htb_pci_io_space_tag;
1967d353fccSvisa pba.pba_memt = &htb_pci_mem_space_tag;
1977d353fccSvisa pba.pba_dmat = &htb_bus_dma_tag;
1987d353fccSvisa pba.pba_pc = pc;
1997d353fccSvisa pba.pba_ioex = extent_create("htb_io", 0, 0xffffffff, M_DEVBUF,
2007d353fccSvisa NULL, 0, EX_NOWAIT | EX_FILLED);
2017d353fccSvisa if (pba.pba_ioex != NULL) {
2027d353fccSvisa extent_free(pba.pba_ioex, 0, HTB_IO_SIZE, EX_NOWAIT);
2037d353fccSvisa }
2047d353fccSvisa pba.pba_memex = extent_create("htb_mem", 0, 0xffffffff, M_DEVBUF,
2057d353fccSvisa NULL, 0, EX_NOWAIT | EX_FILLED);
2067d353fccSvisa if (pba.pba_memex != NULL) {
2077d353fccSvisa extent_free(pba.pba_memex, HTB_MEM_BASE, HTB_MEM_SIZE,
2087d353fccSvisa EX_NOWAIT);
2097d353fccSvisa }
2107d353fccSvisa pba.pba_domain = pci_ndomains++;
2117d353fccSvisa pba.pba_bus = 0;
2127d353fccSvisa config_found(&sc->sc_dev, &pba, htb_print);
2137d353fccSvisa }
2147d353fccSvisa
2157d353fccSvisa int
htb_print(void * aux,const char * pnp)2167d353fccSvisa htb_print(void *aux, const char *pnp)
2177d353fccSvisa {
2187d353fccSvisa struct pcibus_attach_args *pba = aux;
2197d353fccSvisa
2207d353fccSvisa if (pnp)
2217d353fccSvisa printf("%s at %s", pba->pba_busname, pnp);
2227d353fccSvisa printf(" bus %d", pba->pba_bus);
2237d353fccSvisa
2247d353fccSvisa return UNCONF;
2257d353fccSvisa }
2267d353fccSvisa
2277d353fccSvisa void
htb_attach_hook(struct device * parent,struct device * self,struct pcibus_attach_args * pba)2287d353fccSvisa htb_attach_hook(struct device *parent, struct device *self,
2297d353fccSvisa struct pcibus_attach_args *pba)
2307d353fccSvisa {
231*565153a0Svisa pci_chipset_tag_t pc = pba->pba_pc;
232*565153a0Svisa struct htb_softc *sc = pc->pc_conf_v;
233*565153a0Svisa const struct htb_config *hc = sc->sc_config;
234*565153a0Svisa
235*565153a0Svisa if (pba->pba_bus == 0)
236*565153a0Svisa hc->hc_attach_hook(pc);
2377d353fccSvisa }
2387d353fccSvisa
2397d353fccSvisa int
htb_bus_maxdevs(void * v,int busno)2407d353fccSvisa htb_bus_maxdevs(void *v, int busno)
2417d353fccSvisa {
2427d353fccSvisa return 32;
2437d353fccSvisa }
2447d353fccSvisa
2457d353fccSvisa pcitag_t
htb_make_tag(void * unused,int b,int d,int f)2467d353fccSvisa htb_make_tag(void *unused, int b, int d, int f)
2477d353fccSvisa {
2487d353fccSvisa return (b << 16) | (d << 11) | (f << 8);
2497d353fccSvisa }
2507d353fccSvisa
2517d353fccSvisa void
htb_decompose_tag(void * unused,pcitag_t tag,int * bp,int * dp,int * fp)2527d353fccSvisa htb_decompose_tag(void *unused, pcitag_t tag, int *bp, int *dp, int *fp)
2537d353fccSvisa {
2547d353fccSvisa if (bp != NULL)
2557d353fccSvisa *bp = (tag >> 16) & 0xff;
2567d353fccSvisa if (dp != NULL)
2577d353fccSvisa *dp = (tag >> 11) & 0x1f;
2587d353fccSvisa if (fp != NULL)
2597d353fccSvisa *fp = (tag >> 8) & 0x7;
2607d353fccSvisa }
2617d353fccSvisa
2627d353fccSvisa int
htb_conf_addr(const struct bonito_config * bc,pcitag_t tag,int offset,u_int32_t * cfgoff,u_int32_t * pcimap_cfg)2637d353fccSvisa htb_conf_addr(const struct bonito_config *bc, pcitag_t tag, int offset,
2647d353fccSvisa u_int32_t *cfgoff, u_int32_t *pcimap_cfg)
2657d353fccSvisa {
2667d353fccSvisa return -1;
2677d353fccSvisa }
2687d353fccSvisa
2697d353fccSvisa int
htb_conf_size(void * v,pcitag_t tag)2707d353fccSvisa htb_conf_size(void *v, pcitag_t tag)
2717d353fccSvisa {
2727d353fccSvisa return PCIE_CONFIG_SPACE_SIZE;
2737d353fccSvisa }
2747d353fccSvisa
2757d353fccSvisa pcireg_t
htb_conf_read(void * v,pcitag_t tag,int offset)2767d353fccSvisa htb_conf_read(void *v, pcitag_t tag, int offset)
2777d353fccSvisa {
2787d353fccSvisa return REGVAL(htb_cfg_space_addr(tag, offset));
2797d353fccSvisa }
2807d353fccSvisa
2817d353fccSvisa void
htb_conf_write(void * v,pcitag_t tag,int offset,pcireg_t data)2827d353fccSvisa htb_conf_write(void *v, pcitag_t tag, int offset, pcireg_t data)
2837d353fccSvisa {
2847d353fccSvisa REGVAL(htb_cfg_space_addr(tag, offset)) = data;
2857d353fccSvisa }
2867d353fccSvisa
2877d353fccSvisa paddr_t
htb_cfg_space_addr(pcitag_t tag,int offset)2887d353fccSvisa htb_cfg_space_addr(pcitag_t tag, int offset)
2897d353fccSvisa {
2907d353fccSvisa paddr_t pa;
2917d353fccSvisa int bus;
2927d353fccSvisa
2937d353fccSvisa htb_decompose_tag(NULL, tag, &bus, NULL, NULL);
2947d353fccSvisa if (bus == 0)
2957d353fccSvisa pa = HTB_CFG_TYPE0_BASE;
2967d353fccSvisa else
2977d353fccSvisa pa = HTB_CFG_TYPE1_BASE;
2987d353fccSvisa return pa + tag + (offset & 0xfffc);
2997d353fccSvisa }
3007d353fccSvisa
3017d353fccSvisa /*
3027d353fccSvisa * PCI interrupt handling
3037d353fccSvisa */
3047d353fccSvisa
3057d353fccSvisa int
htb_pci_intr_map(struct pci_attach_args * pa,pci_intr_handle_t * ihp)3067d353fccSvisa htb_pci_intr_map(struct pci_attach_args *pa, pci_intr_handle_t *ihp)
3077d353fccSvisa {
3087d353fccSvisa int dev, pin;
3097d353fccSvisa
3107d353fccSvisa *ihp = (pci_intr_handle_t)-1;
3117d353fccSvisa
3127d353fccSvisa if (pa->pa_intrpin == 0)
3137d353fccSvisa return 1;
3147d353fccSvisa
3157d353fccSvisa if (pa->pa_intrpin > PCI_INTERRUPT_PIN_MAX) {
3167d353fccSvisa printf(": bad interrupt pin %d\n", pa->pa_intrpin);
3177d353fccSvisa return 1;
3187d353fccSvisa }
3197d353fccSvisa
3207d353fccSvisa pci_decompose_tag(pa->pa_pc, pa->pa_tag, NULL, &dev, NULL);
3217d353fccSvisa if (pa->pa_bridgetag != NULL) {
3227d353fccSvisa pin = PPB_INTERRUPT_SWIZZLE(pa->pa_rawintrpin, dev);
3237d353fccSvisa if (pa->pa_bridgeih[pin - 1] != (pci_intr_handle_t)-1) {
3247d353fccSvisa *ihp = pa->pa_bridgeih[pin - 1];
3257d353fccSvisa return 0;
3267d353fccSvisa }
3277d353fccSvisa }
3287d353fccSvisa
3297d353fccSvisa if (pa->pa_intrline != 0) {
3307d353fccSvisa *ihp = pa->pa_intrline;
3317d353fccSvisa return 0;
3327d353fccSvisa }
3337d353fccSvisa
3347d353fccSvisa return 1;
3357d353fccSvisa }
3367d353fccSvisa
3377d353fccSvisa const char *
htb_pci_intr_string(void * cookie,pci_intr_handle_t ih)3387d353fccSvisa htb_pci_intr_string(void *cookie, pci_intr_handle_t ih)
3397d353fccSvisa {
3407d353fccSvisa static char irqstr[16];
3417d353fccSvisa
3427d353fccSvisa snprintf(irqstr, sizeof(irqstr), "irq %lu", ih);
3437d353fccSvisa return irqstr;
3447d353fccSvisa }
3457d353fccSvisa
3467d353fccSvisa void *
htb_pci_intr_establish(void * cookie,pci_intr_handle_t ih,int level,int (* cb)(void *),void * cbarg,char * name)3477d353fccSvisa htb_pci_intr_establish(void *cookie, pci_intr_handle_t ih, int level,
3487d353fccSvisa int (*cb)(void *), void *cbarg, char *name)
3497d353fccSvisa {
3507d353fccSvisa return loongson3_ht_intr_establish(ih, level, cb, cbarg, name);
3517d353fccSvisa }
3527d353fccSvisa
3537d353fccSvisa void
htb_pci_intr_disestablish(void * cookie,void * ihp)3547d353fccSvisa htb_pci_intr_disestablish(void *cookie, void *ihp)
3557d353fccSvisa {
3567d353fccSvisa loongson3_ht_intr_disestablish(ihp);
3577d353fccSvisa }
3587d353fccSvisa
3597d353fccSvisa bus_addr_t
htb_pa_to_device(paddr_t pa)3607d353fccSvisa htb_pa_to_device(paddr_t pa)
3617d353fccSvisa {
3627d353fccSvisa return pa ^ loongson_dma_base;
3637d353fccSvisa }
3647d353fccSvisa
3657d353fccSvisa paddr_t
htb_device_to_pa(bus_addr_t addr)3667d353fccSvisa htb_device_to_pa(bus_addr_t addr)
3677d353fccSvisa {
3687d353fccSvisa return addr ^ loongson_dma_base;
3697d353fccSvisa }
3707d353fccSvisa
3717d353fccSvisa /*
3727d353fccSvisa * bus_space(9) mapping routines
3737d353fccSvisa */
3747d353fccSvisa
3757d353fccSvisa int
htb_io_map(bus_space_tag_t t,bus_addr_t offs,bus_size_t size,int flags,bus_space_handle_t * bshp)3767d353fccSvisa htb_io_map(bus_space_tag_t t, bus_addr_t offs, bus_size_t size, int flags,
3777d353fccSvisa bus_space_handle_t *bshp)
3787d353fccSvisa {
3797d353fccSvisa const struct legacy_io_range *r;
3807d353fccSvisa bus_addr_t end;
3817d353fccSvisa
3827d353fccSvisa if (offs >= HTB_IO_SIZE)
3837d353fccSvisa return EINVAL;
3847d353fccSvisa
3857d353fccSvisa if (offs < HTB_IO_LEGACY) {
3867d353fccSvisa end = offs + size - 1;
3877d353fccSvisa if ((r = sys_platform->legacy_io_ranges) == NULL)
3887d353fccSvisa return ENXIO;
3897d353fccSvisa for ( ; r->start != 0; r++) {
3907d353fccSvisa if (offs >= r->start && end <= r->end)
3917d353fccSvisa break;
3927d353fccSvisa }
3937d353fccSvisa if (r->end == 0)
3947d353fccSvisa return ENXIO;
3957d353fccSvisa }
3967d353fccSvisa
3977d353fccSvisa *bshp = t->bus_base + offs;
3987d353fccSvisa return 0;
3997d353fccSvisa }
4007d353fccSvisa
4017d353fccSvisa int
htb_mem_map(bus_space_tag_t t,bus_addr_t offs,bus_size_t size,int flags,bus_space_handle_t * bshp)4027d353fccSvisa htb_mem_map(bus_space_tag_t t, bus_addr_t offs, bus_size_t size, int flags,
4037d353fccSvisa bus_space_handle_t *bshp)
4047d353fccSvisa {
40536293ad0Svisa if (offs < HTB_MEM_BASE || offs + size > HTB_MEM_BASE + HTB_MEM_SIZE)
4067d353fccSvisa return EINVAL;
4077d353fccSvisa
4087d353fccSvisa *bshp = t->bus_base + offs;
4097d353fccSvisa return 0;
4107d353fccSvisa }
4117d353fccSvisa
4127d353fccSvisa paddr_t
htb_mem_mmap(bus_space_tag_t t,bus_addr_t addr,off_t off,int prot,int flags)4137d353fccSvisa htb_mem_mmap(bus_space_tag_t t, bus_addr_t addr, off_t off, int prot,
4147d353fccSvisa int flags)
4157d353fccSvisa {
4167d353fccSvisa return addr + off;
4177d353fccSvisa }
4187d353fccSvisa
4197d353fccSvisa /*
4207d353fccSvisa * Functions for system setup
4217d353fccSvisa */
4227d353fccSvisa
4237d353fccSvisa void
htb_early_setup(void)4247d353fccSvisa htb_early_setup(void)
4257d353fccSvisa {
4267d353fccSvisa pci_make_tag_early = htb_make_tag_early;
4277d353fccSvisa pci_conf_read_early = htb_conf_read_early;
4287d353fccSvisa
4297d353fccSvisa early_mem_t = &htb_pci_mem_space_tag;
4307d353fccSvisa early_io_t = &htb_pci_io_space_tag;
4317d353fccSvisa }
4327d353fccSvisa
4337d353fccSvisa pcitag_t
htb_make_tag_early(int b,int d,int f)4347d353fccSvisa htb_make_tag_early(int b, int d, int f)
4357d353fccSvisa {
4367d353fccSvisa return htb_make_tag(NULL, b, d, f);
4377d353fccSvisa }
4387d353fccSvisa
4397d353fccSvisa pcireg_t
htb_conf_read_early(pcitag_t tag,int reg)4407d353fccSvisa htb_conf_read_early(pcitag_t tag, int reg)
4417d353fccSvisa {
4427d353fccSvisa return htb_conf_read(NULL, tag, reg);
4437d353fccSvisa }
444