void	*dec_kn20aa_intr_establish __P((void *, pci_intr_handle_t, int, int (*func)(void *), void *, char *)); void	dec_kn20aa_intr_disestablish(void *, void *);  #define	KN20AA_PCEB_IRQ	31 #define	KN20AA_MAX_IRQ	32 #define	PCI_STRAY_MAX	5  struct alpha_shared_intr *kn20aa_pci_intr; #ifdef EVCNT_COUNTERS struct evcnt kn20aa_intr_evcnt; #endif  void	kn20aa_iointr(void *framep, unsigned long vec); void	kn20aa_enable_intr(int irq); void	kn20aa_disable_intr(int irq);  void pci_kn20aa_pickintr(ccp) struct cia_config *ccp; { int i; bus_space_tag_t iot = &ccp->cc_iot; pci_chipset_tag_t pc = &ccp->cc_pc;  pc->pc_intr_v = ccp; pc->pc_intr_map = dec_kn20aa_intr_map; pc->pc_intr_string = dec_kn20aa_intr_string; pc->pc_intr_line = dec_kn20aa_intr_line; pc->pc_intr_establish = dec_kn20aa_intr_establish; pc->pc_intr_disestablish = dec_kn20aa_intr_disestablish;   pc->pc_pciide_compat_intr_establish = NULL; pc->pc_pciide_compat_intr_disestablish = NULL;  kn20aa_pci_intr = alpha_shared_intr_alloc(KN20AA_MAX_IRQ); for (i = 0; i < KN20AA_MAX_IRQ; i++) alpha_shared_intr_set_maxstrays(kn20aa_pci_intr, i, PCI_STRAY_MAX);  #if NSIO sio_intr_setup(pc, iot); kn20aa_enable_intr(KN20AA_PCEB_IRQ); #endif  set_iointr(kn20aa_iointr); }  int dec_kn20aa_intr_map(ccv, bustag, buspin, line, ihp) void *ccv; pcitag_t bustag; int buspin, line; pci_intr_handle_t *ihp; { struct cia_config *ccp = ccv; pci_chipset_tag_t pc = &ccp->cc_pc; int device; int kn20aa_irq;  if (buspin == 0) {  return 1; } if (buspin > 4) { printf("pci_map_int: bad interrupt pin %d\n", buspin); return 1; }   pci_decompose_tag(pc, bustag, NULL, &device, NULL); switch (device) { case 11: case 12: kn20aa_irq = ((device - 11) + 0) * 4; break;  case 7: kn20aa_irq = 8; break;  case 9: kn20aa_irq = 12; break;  case 6:					 kn20aa_irq = 13; break;  case 8: kn20aa_irq = 16; break;  default: printf("dec_kn20aa_intr_map: weird device number %d\n", device); return 1; }  kn20aa_irq += buspin - 1; if (kn20aa_irq > KN20AA_MAX_IRQ) panic("pci_kn20aa_map_int: kn20aa_irq too large (%d)", kn20aa_irq);  *ihp = kn20aa_irq; return (0); }  const char * dec_kn20aa_intr_string(ccv, ih) void *ccv; pci_intr_handle_t ih; { static char irqstr[15];            if (ih > KN20AA_MAX_IRQ) panic("dec_kn20aa_intr_string: bogus kn20aa IRQ 0x%x", ih);  sprintf(irqstr, "kn20aa irq %ld", ih); return (irqstr); }  int dec_kn20aa_intr_line(ccv, ih) void *ccv; pci_intr_handle_t ih; { return (ih); }  void *
void	*dec_kn20aa_intr_establish __P((void *, pci_intr_handle_t,	    int, int (*func)(void *), void *, char *));void	dec_kn20aa_intr_disestablish(void *, void *);#define	KN20AA_PCEB_IRQ	31#define	KN20AA_MAX_IRQ	32#define	PCI_STRAY_MAX	5struct alpha_shared_intr *kn20aa_pci_intr;#ifdef EVCNT_COUNTERSstruct evcnt kn20aa_intr_evcnt;#endifvoid	kn20aa_iointr(void *framep, unsigned long vec);void	kn20aa_enable_intr(int irq);void	kn20aa_disable_intr(int irq);voidpci_kn20aa_pickintr(ccp)	struct cia_config *ccp;{	int i;	bus_space_tag_t iot = &ccp->cc_iot;	pci_chipset_tag_t pc = &ccp->cc_pc;        pc->pc_intr_v = ccp;        pc->pc_intr_map = dec_kn20aa_intr_map;        pc->pc_intr_string = dec_kn20aa_intr_string;        pc->pc_intr_line = dec_kn20aa_intr_line;        pc->pc_intr_establish = dec_kn20aa_intr_establish;        pc->pc_intr_disestablish = dec_kn20aa_intr_disestablish;        /* Not supported on KN20AA. */        pc->pc_pciide_compat_intr_establish = NULL;        pc->pc_pciide_compat_intr_disestablish = NULL;	kn20aa_pci_intr = alpha_shared_intr_alloc(KN20AA_MAX_IRQ);	for (i = 0; i < KN20AA_MAX_IRQ; i++)		alpha_shared_intr_set_maxstrays(kn20aa_pci_intr, i,		    PCI_STRAY_MAX);#if NSIO	sio_intr_setup(pc, iot);	kn20aa_enable_intr(KN20AA_PCEB_IRQ);#endif	set_iointr(kn20aa_iointr);}int     dec_kn20aa_intr_map(ccv, bustag, buspin, line, ihp)        void *ccv;        pcitag_t bustag;         int buspin, line;        pci_intr_handle_t *ihp;{	struct cia_config *ccp = ccv;	pci_chipset_tag_t pc = &ccp->cc_pc;	int device;	int kn20aa_irq;        if (buspin == 0) {                /* No IRQ used. */                return 1;        }        if (buspin > 4) {                printf("pci_map_int: bad interrupt pin %d\n", buspin);                return 1;        }	/*	 * Slot->interrupt translation.  Appears to work, though it	 * may not hold up forever.	 *	 * The DEC engineers who did this hardware obviously engaged	 * in random drug testing.	 */	pci_decompose_tag(pc, bustag, NULL, &device, NULL);	switch (device) {	case 11:	case 12:		kn20aa_irq = ((device - 11) + 0) * 4;		break;	case 7:		kn20aa_irq = 8;		break;	case 9:		kn20aa_irq = 12;		break;	case 6:					/* 21040 on AlphaStation 500 */		kn20aa_irq = 13;		break;	case 8:		kn20aa_irq = 16;		break;	default:                printf("dec_kn20aa_intr_map: weird device number %d\n",		    device);                return 1;	}	kn20aa_irq += buspin - 1;	if (kn20aa_irq > KN20AA_MAX_IRQ)		panic("pci_kn20aa_map_int: kn20aa_irq too large (%d)",		    kn20aa_irq);	*ihp = kn20aa_irq;	return (0);}const char *dec_kn20aa_intr_string(ccv, ih)	void *ccv;	pci_intr_handle_t ih;{        static char irqstr[15];          /* 11 + 2 + NULL + sanity */        if (ih > KN20AA_MAX_IRQ)		panic("dec_kn20aa_intr_string: bogus kn20aa IRQ 0x%x", ih);        sprintf(irqstr, "kn20aa irq %ld", ih);        return (irqstr);}intdec_kn20aa_intr_line(ccv, ih)	void *ccv;	pci_intr_handle_t ih;{	return (ih);}void *dec_kn20aa_intr_establish(ccv, ih, level, func, arg, name)        void *ccv, *arg;        pci_intr_handle_t ih;        int level;        int (*func)(void *);	char *name;{           	void *cookie;        if (ih > KN20AA_MAX_IRQ)                panic("dec_kn20aa_intr_establish: bogus kn20aa IRQ 0x%x",		    ih);	cookie = alpha_shared_intr_establish(kn20aa_pci_intr, ih, IST_LEVEL,	    level, func, arg, name);	if (cookie != NULL &&	    alpha_shared_intr_isactive(kn20aa_pci_intr, ih))		kn20aa_enable_intr(ih);	return (cookie);}