Clean up the Rawhide interrupt code some more:

- Actually display the kn300 irq, not the MCPCIA irq, in the interrupt
  string.  Also, don't bother displaying device/pin on strays, since
  it doesn't play will with shared interrupts that would happen due to
  a PCI-PCI bridge.
- Shave a few more cycles out of the interrupt dispatch routine.
This commit is contained in:
thorpej 1999-04-16 21:29:47 +00:00
parent 48a53c250d
commit 3b29e1e158
1 changed files with 44 additions and 69 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: pci_kn300.c,v 1.11 1999/04/15 22:37:25 thorpej Exp $ */
/* $NetBSD: pci_kn300.c,v 1.12 1999/04/16 21:29:47 thorpej Exp $ */
/*
* Copyright (c) 1998 by Matthew Jacob
@ -32,7 +32,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
__KERNEL_RCSID(0, "$NetBSD: pci_kn300.c,v 1.11 1999/04/15 22:37:25 thorpej Exp $");
__KERNEL_RCSID(0, "$NetBSD: pci_kn300.c,v 1.12 1999/04/16 21:29:47 thorpej Exp $");
#include <sys/types.h>
#include <sys/param.h>
@ -61,26 +61,23 @@ __KERNEL_RCSID(0, "$NetBSD: pci_kn300.c,v 1.11 1999/04/15 22:37:25 thorpej Exp $
#endif
#include "sio.h"
#if NSIO
#if NSIO > 0
#include <alpha/pci/siovar.h>
#endif
int
dec_kn300_intr_map __P((void *, pcitag_t, int, int, pci_intr_handle_t *));
int dec_kn300_intr_map __P((void *, pcitag_t, int, int,
pci_intr_handle_t *));
const char *dec_kn300_intr_string __P((void *, pci_intr_handle_t));
void * dec_kn300_intr_establish __P((void *, pci_intr_handle_t,
void *dec_kn300_intr_establish __P((void *, pci_intr_handle_t,
int, int (*func)(void *), void *));
void dec_kn300_intr_disestablish __P((void *, void *));
#define KN300_PCEB_IRQ 16
#define NPIN 4
#define NVEC (MAX_MC_BUS * MCPCIA_PER_MCBUS * MCPCIA_MAXSLOT * NPIN)
static int savunit[NVEC];
static int savirqs[NVEC];
extern struct mcpcia_softc *mcpcias;
struct mcpcia_config *mcpcia_eisaccp = NULL;
#define NIRQ (MAX_MC_BUS * MCPCIA_PER_MCBUS * MCPCIA_MAXSLOT * NPIN)
static int savunit[NIRQ];
static int savirqs[NIRQ];
static struct alpha_shared_intr *kn300_pci_intr;
@ -88,7 +85,6 @@ static struct alpha_shared_intr *kn300_pci_intr;
struct evcnt kn300_intr_evcnt;
#endif
static char * kn300_spurious __P((int));
void kn300_iointr __P((void *, unsigned long));
void kn300_enable_intr __P((struct mcpcia_config *, int));
void kn300_disable_intr __P((struct mcpcia_config *, int));
@ -103,8 +99,8 @@ pci_kn300_pickintr(ccp, first)
if (first) {
int g;
kn300_pci_intr = alpha_shared_intr_alloc(NVEC);
for (g = 0; g < NVEC; g++) {
kn300_pci_intr = alpha_shared_intr_alloc(NIRQ);
for (g = 0; g < NIRQ; g++) {
alpha_shared_intr_set_maxstrays(kn300_pci_intr, g, 25);
savunit[g] = (char) -1;
savirqs[g] = (char) -1;
@ -139,7 +135,7 @@ dec_kn300_intr_map(ccv, bustag, buspin, line, ihp)
struct mcpcia_config *ccp = ccv;
pci_chipset_tag_t pc = &ccp->cc_pc;
int device;
int kn300_irq;
int mcpcia_irq;
if (buspin == 0) {
/* No IRQ used. */
@ -156,9 +152,9 @@ dec_kn300_intr_map(ccv, bustag, buspin, line, ihp)
* On MID 5 device 1 is the internal NCR 53c810.
*/
if (ccp->cc_mid == 5 && device == 1) {
kn300_irq = 16;
mcpcia_irq = 16;
} else if (device >= 2 && device <= 5) {
kn300_irq = (device - 2) * 4;
mcpcia_irq = (device - 2) * 4;
} else {
printf("dec_kn300_intr_map: weird device number %d\n", device);
return(1);
@ -167,18 +163,21 @@ dec_kn300_intr_map(ccv, bustag, buspin, line, ihp)
/*
* handle layout:
*
* Determine kn300 IRQ:
* bits 0..1 buspin-1
* bits 2..4 PCI Slot (0..7- yes, some don't exist)
* bits 5..7 MID-4
* bits 8..10 7-GID
* bits 11-15 IRQ
*
* Software only:
* bits 11-15 MCPCIA IRQ
*/
*ihp = (pci_intr_handle_t)
(buspin - 1 ) |
((device & 0x7) << 2) |
((ccp->cc_mid - 4) << 5) |
((7 - ccp->cc_gid) << 8) |
(kn300_irq << 11);
(mcpcia_irq << 11);
return (0);
}
@ -188,8 +187,8 @@ dec_kn300_intr_string(ccv, ih)
pci_intr_handle_t ih;
{
static char irqstr[64];
sprintf(irqstr, "kn300 irq %ld PCI Interrupt Pin %c",
(ih >> 11) & 0x1f, (int)(ih & 0x3) + 'A');
sprintf(irqstr, "kn300 irq %ld", ih & 0x3ff);
return (irqstr);
}
@ -202,16 +201,16 @@ dec_kn300_intr_establish(ccv, ih, level, func, arg)
void *arg;
{
void *cookie;
int v;
int irq;
v = ih & 0x3ff;
cookie = alpha_shared_intr_establish(kn300_pci_intr, v, IST_LEVEL,
level, func, arg, "kn300 vector");
irq = ih & 0x3ff;
cookie = alpha_shared_intr_establish(kn300_pci_intr, irq, IST_LEVEL,
level, func, arg, "kn300 irq");
if (cookie != NULL && alpha_shared_intr_isactive(kn300_pci_intr, v)) {
if (cookie != NULL && alpha_shared_intr_isactive(kn300_pci_intr, irq)) {
struct mcpcia_config *ccp = ccv;
savunit[v] = ccp->cc_sc->mcpcia_dev.dv_unit;
savirqs[v] = (ih >> 11) & 0x1f;
savunit[irq] = ccp->cc_sc->mcpcia_dev.dv_unit;
savirqs[irq] = (ih >> 11) & 0x1f;
kn300_enable_intr(ccv, (int)((ih >> 11) & 0x1f));
alpha_mb();
}
@ -225,29 +224,13 @@ dec_kn300_intr_disestablish(ccv, cookie)
panic("dec_kn300_intr_disestablish not implemented");
}
static char *
kn300_spurious(ih)
int ih;
{
static char str[48];
int pidx, slot, midx, gidx;
pidx = ih & 0x3;
slot = (ih >> 2) & 0x7;
midx = (ih >> 5) & 0x7;
gidx = (ih >> 8) & 0x7;
sprintf(str, "mcbus%d mid %d PCI Slot %d PCI Interrupt Pin %c irq",
gidx, midx + 4, slot, pidx + 'A');
return (str);
}
void
kn300_iointr(framep, vec)
void *framep;
unsigned long vec;
{
struct mcpcia_softc *mcp;
int v, gidx, midx;
u_long irq;
extern struct cfdriver mcpcia_cd;
if (vec >= MCPCIA_VEC_EISA && vec < MCPCIA_VEC_PCI) {
@ -261,27 +244,25 @@ kn300_iointr(framep, vec)
#endif
}
v = (int) vec - MCPCIA_VEC_PCI;
midx = v / 0x200;
gidx = midx / 4;
midx = midx % 4;
#ifdef EVCNT_COUNTERS
kn300_intr_evcnt.ev_count++;
#endif
irq = (vec - MCPCIA_VEC_PCI) >> 4;
/*
* Check for i2c bus interrupts XXXXXXXXX
* Check for I2C interrupts. These are technically within
* the PCI vector range, but no PCI device should ever map
* to them.
*/
if (gidx == 0 && midx == 0 && vec == MCPCIA_I2C_CVEC) {
if (vec == MCPCIA_I2C_CVEC) {
#ifndef EVCNT_COUNTERS
intrcnt[INTRCNT_KN300_I2C_CTRL]++;
#endif
printf("i2c: controller interrupt\n");
return;
}
if (gidx == 0 && midx == 0 && vec == MCPCIA_I2C_BVEC) {
if (vec == MCPCIA_I2C_BVEC) {
#ifndef EVCNT_COUNTERS
intrcnt[INTRCNT_KN300_I2C_BUS]++;
#endif
@ -289,31 +270,25 @@ kn300_iointr(framep, vec)
return;
}
/*
* Convert vector offset into a dense number.
*/
v /= 0x10;
#ifndef EVCNT_COUNTERS
if (savirqs[v] >= 0 && savirqs[v] <= INTRCNT_KN300_NCR810) {
intrcnt[INTRCNT_KN300_IRQ + savirqs[v]]++;
if (savirqs[irq] >= 0 && savirqs[irq] <= INTRCNT_KN300_NCR810) {
intrcnt[INTRCNT_KN300_IRQ + savirqs[irq]]++;
}
#endif
if (alpha_shared_intr_dispatch(kn300_pci_intr, v))
if (alpha_shared_intr_dispatch(kn300_pci_intr, irq))
return;
/*
* Stray interrupt; disable the IRQ on the appropriate MCPCIA
* if we've reached the limit.
*/
alpha_shared_intr_stray(kn300_pci_intr, savirqs[v], kn300_spurious(v));
if (ALPHA_SHARED_INTR_DISABLE(kn300_pci_intr, v) == 0)
alpha_shared_intr_stray(kn300_pci_intr, savirqs[irq], "kn300 irq");
if (ALPHA_SHARED_INTR_DISABLE(kn300_pci_intr, irq) == 0)
return;
mcp = mcpcia_cd.cd_devs[savunit[v]];
kn300_disable_intr(mcp->mcpcia_cc, savirqs[v]);
mcp = mcpcia_cd.cd_devs[savunit[irq]];
kn300_disable_intr(mcp->mcpcia_cc, savirqs[irq]);
}
void