diff options
Diffstat (limited to 'sys/arch/amiga/isa/cross.c')
-rw-r--r-- | sys/arch/amiga/isa/cross.c | 507 |
1 files changed, 0 insertions, 507 deletions
diff --git a/sys/arch/amiga/isa/cross.c b/sys/arch/amiga/isa/cross.c deleted file mode 100644 index 6e1bb20bac4..00000000000 --- a/sys/arch/amiga/isa/cross.c +++ /dev/null @@ -1,507 +0,0 @@ -/* $OpenBSD: cross.c,v 1.22 2002/03/14 03:15:52 millert Exp $ */ - -/* - * Copyright (c) 1994, 1996 Niklas Hallqvist, Carsten Hammer - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Niklas Hallqvist. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/param.h> -#include <sys/device.h> -#include <sys/kernel.h> -#include <sys/malloc.h> -#include <sys/syslog.h> -#include <sys/systm.h> - -#include <uvm/uvm_extern.h> - -#include <machine/bus.h> -#include <machine/cpu.h> -#include <machine/intr.h> - -#include <dev/isa/isavar.h> - -#include <amiga/amiga/custom.h> -#include <amiga/amiga/device.h> -#include <amiga/amiga/isr.h> -#include <amiga/dev/zbusvar.h> -#include <amiga/isa/isa_machdep.h> -#include <amiga/isa/crossreg.h> -#include <amiga/isa/crossvar.h> - -#if 1 -void crossattach(struct device *, struct device *, void *); -int crossmatch(struct device *, void *, void *); - -struct cfattach cross_ca = { - sizeof(struct cross_softc), crossmatch, crossattach -}; - -struct cfdriver cross_cd = { - NULL, "cross", DV_DULL, 0 -}; - -void -crossattach(a, b, c) - struct device *a; - struct device *b; - void *c; -{ - panic("crossattach && UVM"); -} - -int -crossmatch(parent, match, aux) - struct device *parent; - void *match, *aux; -{ - struct zbus_args *zap = aux; - - /* - * Check manufacturer and product id. - */ - if (zap->manid == 2011 && zap->prodid == 3) - printf("cross not supported with uvm yet."); - return(0); -} - -#else - -int crossdebug = 0; - -void crossattach(struct device *, struct device *, void *); -int crossmatch(struct device *, void *, void *); -int crossprint(void *, const char *); - -int cross_io_map(bus_space_tag_t, bus_addr_t, bus_size_t, int, - bus_space_handle_t *); -int cross_mem_map(bus_space_tag_t, bus_addr_t, bus_size_t, int, - bus_space_handle_t *); -int cross_io_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t); -int cross_mem_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t); - -int crossintr(void *); - -void cross_attach_hook(struct device *, struct device *, - struct isabus_attach_args *); -void *cross_intr_establish(void *, int, int, int, int (*)(void *), - void *, char *); -void cross_intr_disestablish(void *, void *); -int cross_intr_check(void *, int, int); - -int cross_pager_get_pages(vm_pager_t, struct vm_page **, int, boolean_t); - -struct cfattach cross_ca = { - sizeof(struct cross_softc), crossmatch, crossattach -}; - -struct cfdriver cross_cd = { - NULL, "cross", DV_DULL, 0 -}; - -struct pagerops crosspagerops = { - NULL, - NULL, - NULL, - cross_pager_get_pages, - NULL, - NULL, - vm_pager_clusternull, - NULL, - NULL, - NULL -}; - -struct pager_struct cross_pager; - -int -crossmatch(parent, match, aux) - struct device *parent; - void *match, *aux; -{ - struct zbus_args *zap = aux; - - /* - * Check manufacturer and product id. - */ - if (zap->manid == 2011 && zap->prodid == 3) - return(1); - return(0); -} - -void -crossattach(parent, self, aux) - struct device *parent, *self; - void *aux; -{ - struct cross_softc *sc = (struct cross_softc *)self; - struct zbus_args *zap = aux; - struct isabus_attach_args iba; - int i; - - bcopy(zap, &sc->sc_zargs, sizeof(struct zbus_args)); - sc->sc_status = CROSS_STATUS_ADDR(zap->va); - sc->sc_imask = 1 << CROSS_MASTER; - - sc->sc_iot.bs_data = sc; - sc->sc_iot.bs_map = cross_io_map; - sc->sc_iot.bs_unmap = cross_io_unmap; - sc->sc_iot.bs_swapped = 1; - sc->sc_iot.bs_shift = 1; - - sc->sc_memt.bs_data = sc; - sc->sc_memt.bs_map = cross_mem_map; - sc->sc_memt.bs_unmap = cross_mem_unmap; - sc->sc_memt.bs_shift = 1; - - sc->sc_ic.ic_data = sc; - sc->sc_ic.ic_attach_hook = cross_attach_hook; - sc->sc_ic.ic_intr_establish = cross_intr_establish; - sc->sc_ic.ic_intr_disestablish = cross_intr_disestablish; - sc->sc_ic.ic_intr_check = cross_intr_check; - - sc->sc_pager.pg_ops = &crosspagerops; - sc->sc_pager.pg_type = PG_DFLT; - sc->sc_pager.pg_flags = 0; - sc->sc_pager.pg_data = sc; - - /* Allocate a bunch of pages used for the bank-switching logic. */ - for (i = 0; i < CROSS_BANK_SIZE / NBPG; i++) { - VM_PAGE_INIT(&sc->sc_page[i], NULL, 0); - sc->sc_page[i].phys_addr = (vm_offset_t)zap->pa + - CROSS_XL_MEM + i * NBPG; - sc->sc_page[i].flags |= PG_FICTITIOUS; - vm_page_free(&sc->sc_page[i]); - } - - /* Enable interrupts lazily in cross_intr_establish. */ - CROSS_ENABLE_INTS(zap->va, 0); - - /* Default 16 bit tranfer */ - *CROSS_HANDLE_TO_XLP_LATCH((bus_space_handle_t)zap->va) = CROSS_SBHE; - printf(": pa 0x%08x va 0x%08x size 0x%x\n", zap->pa, zap->va, - zap->size); - - iba.iba_busname = "isa"; - iba.iba_iot = &sc->sc_iot; - iba.iba_memt = &sc->sc_memt; - iba.iba_ic = &sc->sc_ic; - config_found(self, &iba, crossprint); -} - -int -crossprint(auxp, pnp) - void *auxp; - const char *pnp; -{ - if (pnp == NULL) - return (QUIET); - return (UNCONF); -} - - -int -cross_io_map(bst, addr, sz, cacheable, handle) - bus_space_tag_t bst; - bus_addr_t addr; - bus_size_t sz; - int cacheable; - bus_space_handle_t *handle; -{ - *handle = (bus_space_handle_t) - ((struct cross_softc *)bst->bs_data)->sc_zargs.va + 2 * addr; - return (0); -} - -int -cross_mem_map(bst, addr, sz, cacheable, handle) - bus_space_tag_t bst; - bus_addr_t addr; - bus_size_t sz; - int cacheable; - bus_space_handle_t *handle; -{ - struct cross_softc *sc = (struct cross_softc *)bst->bs_data; - bus_addr_t banked_start; - bus_size_t banked_size; - vm_object_t object; - vm_offset_t kva; - int error; - - /* - * XXX Do extent checking here. - */ - - /* - * Compute the bank range. Note that we need to shift bus-addresses - * and sizes left one bit. - */ - banked_start = (addr << 1) & ~(CROSS_BANK_SIZE - 1); - banked_size = ((sz << 1) + CROSS_BANK_SIZE - 1) & - ~(CROSS_BANK_SIZE - 1); - - /* Create the object that will take care of the bankswitching. */ - object = vm_object_allocate(banked_size); - if (object == NULL) - goto fail_obj; - vm_object_enter(object, &sc->sc_pager); - vm_object_setpager(object, &sc->sc_pager, banked_start, FALSE); - - /* - * When done like this double mappings will be possible, thus - * wasting a little mapping space. This happens when several - * bus_space_map maps stuff from the same bank. But I don't care. - */ - kva = kmem_alloc_pageable(kernel_map, banked_size); - if (kva == 0) - goto fail_alloc; - vm_map_lock(kernel_map); - error = vm_map_insert(kernel_map, object, 0, kva, kva + banked_size); - vm_map_unlock(kernel_map); - if (error) - goto fail_insert; - - /* Tell caller where to find his data. */ - *handle = (bus_space_handle_t)(kva + (addr << 1) - banked_start); - return (0); - -fail_insert: - kmem_free(kernel_map, kva, banked_size); -fail_alloc: - vm_object_deallocate(object); -fail_obj: - return (1); -} - -int -cross_io_unmap(bst, handle, sz) - bus_space_tag_t bst; - bus_space_handle_t handle; - bus_size_t sz; -{ - return (0); -} - -int -cross_mem_unmap(bst, handle, sz) - bus_space_tag_t bst; - bus_space_handle_t handle; - bus_size_t sz; -{ -#if 0 - struct cross_softc *sc = (struct cross_softc *)bst->bs_data; -#endif - - /* Remove the object handling this mapping. */ - return (0); -} - -static int cross_int_map[] = { - 0, 0, 0, 0, CROSS_IRQ3, CROSS_IRQ4, CROSS_IRQ5, CROSS_IRQ6, CROSS_IRQ7, 0, - CROSS_IRQ9, CROSS_IRQ10, CROSS_IRQ11, CROSS_IRQ12, 0, CROSS_IRQ14, - CROSS_IRQ15 -}; - -int -crossintr(v) - void *v; -{ - struct intrhand *ih = (struct intrhand *)v; - int handled; - - if (!(*ih->ih_status & ih->ih_mask)) - return (0); - for (handled = 0; ih; ih = ih->ih_next) - if ((*ih->ih_fun)(ih->ih_arg)) - handled = 1; - return (handled); -} - -void -cross_attach_hook(parent, self, iba) - struct device *parent, *self; - struct isabus_attach_args *iba; -{ -} - -void * -cross_intr_establish(ic, irq, type, level, ih_fun, ih_arg, ih_what) - void *ic; - int irq; - int type; - int level; - int (*ih_fun)(void *); - void *ih_arg; - char *ih_what; -{ - struct intrhand **p, *c, *ih; - struct cross_softc *sc = (struct cross_softc *)ic; - - /* no point in sleeping unless someone can free memory. */ - ih = malloc(sizeof *ih, M_DEVBUF, cold ? M_NOWAIT : M_WAITOK); - if (ih == NULL) { - printf("cross_intr_establish: can't malloc handler info"); - return (NULL); - } - - if (irq > ICU_LEN || type == IST_NONE) { - printf("cross_intr_establish: bogus irq or type"); - return (NULL); - } - - switch (sc->sc_intrsharetype[irq]) { - case IST_NONE: - sc->sc_intrsharetype[irq] = type; - break; - case IST_EDGE: - case IST_LEVEL: - if (type == sc->sc_intrsharetype[irq]) - break; - case IST_PULSE: - if (type != IST_NONE) - printf("cross_intr_establish: can't share %s with %s", - isa_intr_typename(sc->sc_intrsharetype[irq]), - isa_intr_typename(type)); - break; - } - - /* - * Figure out where to put the handler. - * This is O(N^2), but we want to preserve the order, and N is - * generally small. - */ - for (p = &sc->sc_ih[irq]; (c = *p) != NULL; p = &c->ih_next) - ; - - /* - * Poke the real handler in now. - */ - ih->ih_fun = ih_fun; - ih->ih_arg = ih_arg; - ih->ih_count = 0; - ih->ih_next = NULL; - ih->ih_irq = irq; - ih->ih_what = ih_what; - ih->ih_mask = 1 << cross_int_map[irq + 1]; - ih->ih_status = sc->sc_status; - - ih->ih_isr.isr_intr = crossintr; - ih->ih_isr.isr_arg = ih; - ih->ih_isr.isr_ipl = 6; - ih->ih_isr.isr_mapped_ipl = level; - - *p = ih; - add_isr(&ih->ih_isr); - - sc->sc_imask |= 1 << cross_int_map[irq + 1]; - CROSS_ENABLE_INTS(sc->sc_zargs.va, sc->sc_imask); - - return (ih); -} - -void -cross_intr_disestablish(ic, arg) - void *ic; - void *arg; -{ - struct intrhand *ih = arg; - struct cross_softc *sc = (struct cross_softc *)ic; - int irq = ih->ih_irq; - struct intrhand **p, *q; - - if (irq > ICU_LEN) - panic("cross_intr_establish: bogus irq"); - - sc->sc_imask &= ~ih->ih_mask; - CROSS_ENABLE_INTS (sc->sc_zargs.va, sc->sc_imask); - remove_isr(&ih->ih_isr); - - /* - * Remove the handler from the chain. - * This is O(n^2), too. - */ - for (p = &sc->sc_ih[irq]; (q = *p) != NULL && q != ih; p = &q->ih_next) - ; - if (q) - *p = q->ih_next; - else - panic("cross_intr_disestablish: handler not registered"); - free(ih, M_DEVBUF); - - if (sc->sc_intrsharetype[irq] == NULL) - sc->sc_intrsharetype[irq] = IST_NONE; -} - -int -cross_pager_get_pages(pager, mlist, npages, sync) - vm_pager_t pager; - struct vm_page **mlist; - int npages; - boolean_t sync; -{ - struct cross_softc *sc = (struct cross_softc *)pager->pg_data; - int i; - vm_object_t object, old_object; - vm_offset_t offset; - - while(npages--) { - i = ((*mlist)->offset & (CROSS_BANK_SIZE - 1)) / NBPG; - object = (*mlist)->object; - old_object = sc->sc_page[i].object; - offset = (*mlist)->offset; - vm_page_lock_queues(); - vm_object_lock(object); - if (old_object) - vm_object_lock(old_object); - vm_page_free(*mlist); - - /* generate A13-A19 for correct page */ - *CROSS_HANDLE_TO_XLP_LATCH( - (bus_space_handle_t)sc->sc_zargs.va) = - object->paging_offset >> 13 | CROSS_SBHE; - - vm_page_rename(&sc->sc_page[i], object, offset); - if (old_object) - vm_object_unlock(old_object); - vm_object_unlock(object); - vm_page_unlock_queues(); - mlist++; - } - return (VM_PAGER_OK); -} - -int -cross_intr_check(ic, irq, type) - void *ic; - int irq; - int type; -{ - struct cross_softc *sc = (struct cross_softc *)ic; - - return (__isa_intr_check(irq, type, sc->sc_intrsharetype)); -} -#endif /* UVM */ |