File: [local] / sys / arch / hppa64 / dev / apic.c (download)
Revision 1.1.1.1 (vendor branch), Tue Mar 4 16:05:59 2008 UTC (16 years, 3 months ago) by nbrk
Branch: OPENBSD_4_2_BASE, MAIN
CVS Tags: jornada-partial-support-wip, HEAD Changes since 1.1: +0 -0 lines
Import of OpenBSD 4.2 release kernel tree with initial code to support
Jornada 720/728, StrongARM 1110-based handheld PC.
At this point kernel roots on NFS and boots into vfs_mountroot() and traps.
What is supported:
- glass console, Jornada framebuffer (jfb) works in 16bpp direct color mode
(needs some palette tweaks for non black/white/blue colors, i think)
- saic, SA11x0 interrupt controller (needs cleanup)
- sacom, SA11x0 UART (supported only as boot console for now)
- SA11x0 GPIO controller fully supported (but can't handle multiple interrupt
handlers on one gpio pin)
- sassp, SSP port on SA11x0 that attaches spibus
- Jornada microcontroller (jmcu) to control kbd, battery, etc throught
the SPI bus (wskbd attaches on jmcu, but not tested)
- tod functions seem work
- initial code for SA-1111 (chip companion) : this is TODO
Next important steps, i think:
- gpio and intc on sa1111
- pcmcia support for sa11x0 (and sa1111 help logic)
- REAL root on nfs when we have PCMCIA support (we may use any of supported pccard NICs)
- root on wd0! (using already supported PCMCIA-ATA)
|
/* $OpenBSD: apic.c,v 1.2 2005/05/22 01:42:49 mickey Exp $ */
/*
* Copyright (c) 2005 Michael Shalayeff
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#define APIC_DEBUG
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/device.h>
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
#include <dev/pci/pcidevs.h>
#include <hppa64/dev/elroyreg.h>
#include <hppa64/dev/elroyvar.h>
void
apic_write(volatile struct elroy_regs *r, u_int32_t reg, u_int32_t val)
{
elroy_write32(&r->apic_addr, htole32(reg));
elroy_write32(&r->apic_data, htole32(val));
}
u_int32_t
apic_read(volatile struct elroy_regs *r, u_int32_t reg)
{
elroy_write32(&r->apic_addr, htole32(reg));
return letoh32(elroy_read32(&r->apic_data));
}
void
apic_attach(struct elroy_softc *sc)
{
volatile struct elroy_regs *r = sc->sc_regs;
u_int32_t data;
data = apic_read(r, APIC_VERSION);
sc->sc_nints = (data & APIC_VERSION_NENT) >> APIC_VERSION_NENT_SHIFT;
printf(" APIC ver %x, %d pins",
data & APIC_VERSION_MASK, sc->sc_nints);
}
int
apic_intr_map(struct pci_attach_args *pa, pci_intr_handle_t *ihp)
{
pci_chipset_tag_t pc = pa->pa_pc;
struct elroy_softc *sc = pc->_cookie;
pcitag_t tag = pa->pa_tag;
hppa_hpa_t hpa = cpu_gethpa(0);
pcireg_t reg;
reg = pci_conf_read(pc, tag, PCI_INTERRUPT_REG);
printf(" pin=%d line=%d ", PCI_INTERRUPT_PIN(reg), PCI_INTERRUPT_LINE(reg));
apic_write(sc->sc_regs, APIC_ENT0(PCI_INTERRUPT_PIN(reg)),
PCI_INTERRUPT_LINE(reg));
apic_write(sc->sc_regs, APIC_ENT1(PCI_INTERRUPT_PIN(reg)),
((hpa & 0x0ff00000) >> 4) | ((hpa & 0x000ff000) << 12));
*ihp = PCI_INTERRUPT_LINE(reg) + 1;
return (*ihp == 0);
}
const char *
apic_intr_string(void *v, pci_intr_handle_t ih)
{
static char buf[32];
snprintf(buf, 32, "irq %ld", ih);
return (buf);
}
void *
apic_intr_establish(void *v, pci_intr_handle_t ih,
int pri, int (*handler)(void *), void *arg, char *name)
{
/* struct elroy_softc *sc = v; */
/* volatile struct elroy_regs *r = sc->sc_regs; */
/* void *iv = NULL; */
/* no mapping or bogus */
if (ih <= 0 || ih > 63)
return (NULL);
#if 0
TODO
if ((iv = cpu_intr_map(sc->sc_ih, pri, ih - 1, handler, arg, name))) {
if (cold)
sc->sc_imr |= (1 << (ih - 1));
else
/* r->imr = sc->sc_imr |= (1 << (ih - 1)) */;
}
#endif
return (arg);
}
void
apic_intr_disestablish(void *v, void *cookie)
{
#if 0
struct elroy_softc *sc = v;
volatile struct elroy_regs *r = sc->sc_regs;
r->imr &= ~(1 << (ih - 1));
TODO cpu_intr_unmap(sc->sc_ih, cookie);
#endif
}
int
apic_intr(void *v)
{
return (0);
}