^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * linux/arch/alpha/kernel/sys_sable.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 1995 David A Rusling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 1996 Jay A Estabrook
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 1998, 1999 Richard Henderson
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Code supporting the Sable, Sable-Gamma, and Lynx systems.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/pci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <asm/ptrace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <asm/dma.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <asm/irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <asm/mmu_context.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <asm/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <asm/core_t2.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <asm/tlbflush.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include "proto.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include "irq_impl.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include "pci_impl.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include "machvec_impl.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) DEFINE_SPINLOCK(sable_lynx_irq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) typedef struct irq_swizzle_struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) char irq_to_mask[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) char mask_to_irq[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /* Note mask bit is true for DISABLED irqs. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) unsigned long shadow_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) void (*update_irq_hw)(unsigned long bit, unsigned long mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) void (*ack_irq_hw)(unsigned long bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) } irq_swizzle_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) static irq_swizzle_t *sable_lynx_irq_swizzle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) static void sable_lynx_init_irq(int nr_of_irqs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_SABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /***********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * For SABLE, which is really baroque, we manage 40 IRQ's, but the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * hardware really only supports 24, not via normal ISA PIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * but cascaded custom 8259's, etc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * 0-7 (char at 536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * 8-15 (char at 53a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) * 16-23 (char at 53c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) * Summary Registers (536/53a/53c):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * Bit Meaning Kernel IRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) *------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * 0 PCI slot 0 34
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * 1 NCR810 (builtin) 33
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * 2 TULIP (builtin) 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * 3 mouse 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * 4 PCI slot 1 35
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * 5 PCI slot 2 36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) * 6 keyboard 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * 7 floppy 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * 8 COM2 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * 9 parallel port 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) *10 EISA irq 3 -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) *11 EISA irq 4 -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) *12 EISA irq 5 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) *13 EISA irq 6 -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) *14 EISA irq 7 -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) *15 COM1 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) *16 EISA irq 9 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) *17 EISA irq 10 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) *18 EISA irq 11 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) *19 EISA irq 12 -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) *20 EISA irq 13 -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) *21 EISA irq 14 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) *22 NC 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) *23 IIC -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) sable_update_irq_hw(unsigned long bit, unsigned long mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) int port = 0x537;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) if (bit >= 16) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) port = 0x53d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) mask >>= 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) } else if (bit >= 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) port = 0x53b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) mask >>= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) outb(mask, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) sable_ack_irq_hw(unsigned long bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) int port, val1, val2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) if (bit >= 16) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) port = 0x53c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) val1 = 0xE0 | (bit - 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) val2 = 0xE0 | 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) } else if (bit >= 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) port = 0x53a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) val1 = 0xE0 | (bit - 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) val2 = 0xE0 | 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) port = 0x536;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) val1 = 0xE0 | (bit - 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) val2 = 0xE0 | 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) outb(val1, port); /* ack the slave */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) outb(val2, 0x534); /* ack the master */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) static irq_swizzle_t sable_irq_swizzle = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) -1, 6, -1, 8, 15, 12, 7, 9, /* pseudo PIC 0-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) -1, 16, 17, 18, 3, -1, 21, 22, /* pseudo PIC 8-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) -1, -1, -1, -1, -1, -1, -1, -1, /* pseudo EISA 0-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) -1, -1, -1, -1, -1, -1, -1, -1, /* pseudo EISA 8-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 2, 1, 0, 4, 5, -1, -1, -1, /* pseudo PCI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) -1, -1, -1, -1, -1, -1, -1, -1, /* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) -1, -1, -1, -1, -1, -1, -1, -1, /* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) -1, -1, -1, -1, -1, -1, -1, -1 /* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 34, 33, 32, 12, 35, 36, 1, 6, /* mask 0-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 3, 7, -1, -1, 5, -1, -1, 4, /* mask 8-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 9, 10, 11, -1, -1, 14, 15, -1, /* mask 16-23 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) -1, -1, -1, -1, -1, -1, -1, -1, /* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) -1, -1, -1, -1, -1, -1, -1, -1, /* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) -1, -1, -1, -1, -1, -1, -1, -1, /* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) -1, -1, -1, -1, -1, -1, -1, -1, /* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) -1, -1, -1, -1, -1, -1, -1, -1 /* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) sable_update_irq_hw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) sable_ack_irq_hw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) static void __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) sable_init_irq(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) outb(-1, 0x537); /* slave 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) outb(-1, 0x53b); /* slave 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) outb(-1, 0x53d); /* slave 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) outb(0x44, 0x535); /* enable cascades in master */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) sable_lynx_irq_swizzle = &sable_irq_swizzle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) sable_lynx_init_irq(40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) * PCI Fixup configuration for ALPHA SABLE (2100).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) * The device to slot mapping looks like:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) * Slot Device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) * 0 TULIP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) * 1 SCSI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) * 2 PCI-EISA bridge
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) * 3 none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) * 4 none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) * 5 none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) * 6 PCI on board slot 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) * 7 PCI on board slot 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) * 8 PCI on board slot 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) * This two layered interrupt approach means that we allocate IRQ 16 and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) * above for PCI interrupts. The IRQ relates to which bit the interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) * comes in on. This makes interrupt processing much easier.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) * NOTE: the IRQ assignments below are arbitrary, but need to be consistent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) * with the values in the irq swizzling tables above.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) sable_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) static char irq_tab[9][5] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) /*INT INTA INTB INTC INTD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) { 32+0, 32+0, 32+0, 32+0, 32+0}, /* IdSel 0, TULIP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) { 32+1, 32+1, 32+1, 32+1, 32+1}, /* IdSel 1, SCSI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) { -1, -1, -1, -1, -1}, /* IdSel 2, SIO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) { -1, -1, -1, -1, -1}, /* IdSel 3, none */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) { -1, -1, -1, -1, -1}, /* IdSel 4, none */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) { -1, -1, -1, -1, -1}, /* IdSel 5, none */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) { 32+2, 32+2, 32+2, 32+2, 32+2}, /* IdSel 6, slot 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) { 32+3, 32+3, 32+3, 32+3, 32+3}, /* IdSel 7, slot 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) { 32+4, 32+4, 32+4, 32+4, 32+4} /* IdSel 8, slot 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) long min_idsel = 0, max_idsel = 8, irqs_per_slot = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) return COMMON_TABLE_LOOKUP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) #endif /* defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_SABLE) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_LYNX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) /***********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) /* LYNX hardware specifics
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) * For LYNX, which is also baroque, we manage 64 IRQs, via a custom IC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) * Bit Meaning Kernel IRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) *------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) * 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) * 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) * 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) * 3 mouse 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) * 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) * 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) * 6 keyboard 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) * 7 floppy 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) * 8 COM2 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) * 9 parallel port 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) *10 EISA irq 3 -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) *11 EISA irq 4 -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) *12 EISA irq 5 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) *13 EISA irq 6 -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) *14 EISA irq 7 -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) *15 COM1 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) *16 EISA irq 9 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) *17 EISA irq 10 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) *18 EISA irq 11 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) *19 EISA irq 12 -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) *20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) *21 EISA irq 14 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) *22 EISA irq 15 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) *23 IIC -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) *24 VGA (builtin) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) *25
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) *26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) *27
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) *28 NCR810 (builtin) 28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) *29
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) *30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) *31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) *32 PCI 0 slot 4 A primary bus 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) *33 PCI 0 slot 4 B primary bus 33
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) *34 PCI 0 slot 4 C primary bus 34
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) *35 PCI 0 slot 4 D primary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) *36 PCI 0 slot 5 A primary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) *37 PCI 0 slot 5 B primary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) *38 PCI 0 slot 5 C primary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) *39 PCI 0 slot 5 D primary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) *40 PCI 0 slot 6 A primary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) *41 PCI 0 slot 6 B primary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) *42 PCI 0 slot 6 C primary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) *43 PCI 0 slot 6 D primary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) *44 PCI 0 slot 7 A primary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) *45 PCI 0 slot 7 B primary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) *46 PCI 0 slot 7 C primary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) *47 PCI 0 slot 7 D primary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) *48 PCI 0 slot 0 A secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) *49 PCI 0 slot 0 B secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) *50 PCI 0 slot 0 C secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) *51 PCI 0 slot 0 D secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) *52 PCI 0 slot 1 A secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) *53 PCI 0 slot 1 B secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) *54 PCI 0 slot 1 C secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) *55 PCI 0 slot 1 D secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) *56 PCI 0 slot 2 A secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) *57 PCI 0 slot 2 B secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) *58 PCI 0 slot 2 C secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) *59 PCI 0 slot 2 D secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) *60 PCI 0 slot 3 A secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) *61 PCI 0 slot 3 B secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) *62 PCI 0 slot 3 C secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) *63 PCI 0 slot 3 D secondary bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) lynx_update_irq_hw(unsigned long bit, unsigned long mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) * Write the AIR register on the T3/T4 with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) * address of the IC mask register (offset 0x40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) *(vulp)T2_AIR = 0x40;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) mb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) *(vulp)T2_AIR; /* re-read to force write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) mb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) *(vulp)T2_DIR = mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) mb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) mb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) lynx_ack_irq_hw(unsigned long bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) *(vulp)T2_VAR = (u_long) bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) mb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) mb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) static irq_swizzle_t lynx_irq_swizzle = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) { /* irq_to_mask */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) -1, 6, -1, 8, 15, 12, 7, 9, /* pseudo PIC 0-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) -1, 16, 17, 18, 3, -1, 21, 22, /* pseudo PIC 8-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) -1, -1, -1, -1, -1, -1, -1, -1, /* pseudo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) -1, -1, -1, -1, 28, -1, -1, -1, /* pseudo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 32, 33, 34, 35, 36, 37, 38, 39, /* mask 32-39 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 40, 41, 42, 43, 44, 45, 46, 47, /* mask 40-47 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 48, 49, 50, 51, 52, 53, 54, 55, /* mask 48-55 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 56, 57, 58, 59, 60, 61, 62, 63 /* mask 56-63 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) { /* mask_to_irq */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) -1, -1, -1, 12, -1, -1, 1, 6, /* mask 0-7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 3, 7, -1, -1, 5, -1, -1, 4, /* mask 8-15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 9, 10, 11, -1, -1, 14, 15, -1, /* mask 16-23 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) -1, -1, -1, -1, 28, -1, -1, -1, /* mask 24-31 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 32, 33, 34, 35, 36, 37, 38, 39, /* mask 32-39 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 40, 41, 42, 43, 44, 45, 46, 47, /* mask 40-47 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 48, 49, 50, 51, 52, 53, 54, 55, /* mask 48-55 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 56, 57, 58, 59, 60, 61, 62, 63 /* mask 56-63 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) lynx_update_irq_hw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) lynx_ack_irq_hw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) static void __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) lynx_init_irq(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) sable_lynx_irq_swizzle = &lynx_irq_swizzle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) sable_lynx_init_irq(64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) * PCI Fixup configuration for ALPHA LYNX (2100A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) * The device to slot mapping looks like:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) * Slot Device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) * 0 none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) * 1 none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) * 2 PCI-EISA bridge
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) * 3 PCI-PCI bridge
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) * 4 NCR 810 (Demi-Lynx only)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) * 5 none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) * 6 PCI on board slot 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) * 7 PCI on board slot 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) * 8 PCI on board slot 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) * 9 PCI on board slot 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) * And behind the PPB we have:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) * 11 PCI on board slot 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) * 12 PCI on board slot 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) * 13 PCI on board slot 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) * 14 PCI on board slot 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) * NOTE: the IRQ assignments below are arbitrary, but need to be consistent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) * with the values in the irq swizzling tables above.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) lynx_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) static char irq_tab[19][5] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) /*INT INTA INTB INTC INTD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) { -1, -1, -1, -1, -1}, /* IdSel 13, PCEB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) { -1, -1, -1, -1, -1}, /* IdSel 14, PPB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) { 28, 28, 28, 28, 28}, /* IdSel 15, NCR demi */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) { -1, -1, -1, -1, -1}, /* IdSel 16, none */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) { 32, 32, 33, 34, 35}, /* IdSel 17, slot 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) { 36, 36, 37, 38, 39}, /* IdSel 18, slot 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) { 40, 40, 41, 42, 43}, /* IdSel 19, slot 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) { 44, 44, 45, 46, 47}, /* IdSel 20, slot 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) { -1, -1, -1, -1, -1}, /* IdSel 22, none */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) /* The following are actually behind the PPB. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) { -1, -1, -1, -1, -1}, /* IdSel 16 none */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) { 28, 28, 28, 28, 28}, /* IdSel 17 NCR lynx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) { -1, -1, -1, -1, -1}, /* IdSel 18 none */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) { -1, -1, -1, -1, -1}, /* IdSel 19 none */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) { -1, -1, -1, -1, -1}, /* IdSel 20 none */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) { -1, -1, -1, -1, -1}, /* IdSel 21 none */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) { 48, 48, 49, 50, 51}, /* IdSel 22 slot 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) { 52, 52, 53, 54, 55}, /* IdSel 23 slot 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) { 56, 56, 57, 58, 59}, /* IdSel 24 slot 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) { 60, 60, 61, 62, 63} /* IdSel 25 slot 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) const long min_idsel = 2, max_idsel = 20, irqs_per_slot = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) return COMMON_TABLE_LOOKUP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) static u8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) lynx_swizzle(struct pci_dev *dev, u8 *pinp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) int slot, pin = *pinp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) if (dev->bus->number == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) slot = PCI_SLOT(dev->devfn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) /* Check for the built-in bridge */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) else if (PCI_SLOT(dev->bus->self->devfn) == 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) slot = PCI_SLOT(dev->devfn) + 11;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) /* Must be a card-based bridge. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) if (PCI_SLOT(dev->bus->self->devfn) == 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) slot = PCI_SLOT(dev->devfn) + 11;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) pin = pci_swizzle_interrupt_pin(dev, pin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) /* Move up the chain of bridges. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) dev = dev->bus->self;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) /* Slot of the next bridge. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) slot = PCI_SLOT(dev->devfn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) } while (dev->bus->self);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) *pinp = pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) return slot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) #endif /* defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_LYNX) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) /***********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) /* GENERIC irq routines */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) sable_lynx_enable_irq(struct irq_data *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) unsigned long bit, mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) bit = sable_lynx_irq_swizzle->irq_to_mask[d->irq];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) spin_lock(&sable_lynx_irq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) mask = sable_lynx_irq_swizzle->shadow_mask &= ~(1UL << bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) sable_lynx_irq_swizzle->update_irq_hw(bit, mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) spin_unlock(&sable_lynx_irq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) printk("%s: mask 0x%lx bit 0x%lx irq 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) __func__, mask, bit, irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) sable_lynx_disable_irq(struct irq_data *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) unsigned long bit, mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) bit = sable_lynx_irq_swizzle->irq_to_mask[d->irq];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) spin_lock(&sable_lynx_irq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) mask = sable_lynx_irq_swizzle->shadow_mask |= 1UL << bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) sable_lynx_irq_swizzle->update_irq_hw(bit, mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) spin_unlock(&sable_lynx_irq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) printk("%s: mask 0x%lx bit 0x%lx irq 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) __func__, mask, bit, irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) sable_lynx_mask_and_ack_irq(struct irq_data *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) unsigned long bit, mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) bit = sable_lynx_irq_swizzle->irq_to_mask[d->irq];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) spin_lock(&sable_lynx_irq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) mask = sable_lynx_irq_swizzle->shadow_mask |= 1UL << bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) sable_lynx_irq_swizzle->update_irq_hw(bit, mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) sable_lynx_irq_swizzle->ack_irq_hw(bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) spin_unlock(&sable_lynx_irq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) static struct irq_chip sable_lynx_irq_type = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) .name = "SABLE/LYNX",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) .irq_unmask = sable_lynx_enable_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) .irq_mask = sable_lynx_disable_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) .irq_mask_ack = sable_lynx_mask_and_ack_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) sable_lynx_srm_device_interrupt(unsigned long vector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) /* Note that the vector reported by the SRM PALcode corresponds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) to the interrupt mask bits, but we have to manage via the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) so-called legacy IRQs for many common devices. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) int bit, irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) bit = (vector - 0x800) >> 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) irq = sable_lynx_irq_swizzle->mask_to_irq[bit];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) printk("%s: vector 0x%lx bit 0x%x irq 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) __func__, vector, bit, irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) handle_irq(irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) static void __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) sable_lynx_init_irq(int nr_of_irqs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) long i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) for (i = 0; i < nr_of_irqs; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) irq_set_chip_and_handler(i, &sable_lynx_irq_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) handle_level_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) irq_set_status_flags(i, IRQ_LEVEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) common_init_isa_dma();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) static void __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) sable_lynx_init_pci(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) common_init_pci();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) /*****************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) * The System Vectors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) * In order that T2_HAE_ADDRESS should be a constant, we play
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) * these games with GAMMA_BIAS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) #if defined(CONFIG_ALPHA_GENERIC) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) (defined(CONFIG_ALPHA_SABLE) && !defined(CONFIG_ALPHA_GAMMA))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) #undef GAMMA_BIAS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) #define GAMMA_BIAS 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) struct alpha_machine_vector sable_mv __initmv = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) .vector_name = "Sable",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) DO_EV4_MMU,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) DO_DEFAULT_RTC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) DO_T2_IO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) .machine_check = t2_machine_check,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) .max_isa_dma_address = ALPHA_SABLE_MAX_ISA_DMA_ADDRESS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) .min_io_address = EISA_DEFAULT_IO_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) .min_mem_address = T2_DEFAULT_MEM_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) .nr_irqs = 40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) .device_interrupt = sable_lynx_srm_device_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) .init_arch = t2_init_arch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) .init_irq = sable_init_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) .init_rtc = common_init_rtc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) .init_pci = sable_lynx_init_pci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) .kill_arch = t2_kill_arch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) .pci_map_irq = sable_map_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) .pci_swizzle = common_swizzle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) .sys = { .t2 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) .gamma_bias = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) } }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) ALIAS_MV(sable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) #endif /* GENERIC || (SABLE && !GAMMA) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) #if defined(CONFIG_ALPHA_GENERIC) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) (defined(CONFIG_ALPHA_SABLE) && defined(CONFIG_ALPHA_GAMMA))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) #undef GAMMA_BIAS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) #define GAMMA_BIAS _GAMMA_BIAS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) struct alpha_machine_vector sable_gamma_mv __initmv = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) .vector_name = "Sable-Gamma",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) DO_EV5_MMU,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) DO_DEFAULT_RTC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) DO_T2_IO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) .machine_check = t2_machine_check,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) .max_isa_dma_address = ALPHA_SABLE_MAX_ISA_DMA_ADDRESS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) .min_io_address = EISA_DEFAULT_IO_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) .min_mem_address = T2_DEFAULT_MEM_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) .nr_irqs = 40,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) .device_interrupt = sable_lynx_srm_device_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) .init_arch = t2_init_arch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) .init_irq = sable_init_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) .init_rtc = common_init_rtc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) .init_pci = sable_lynx_init_pci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) .kill_arch = t2_kill_arch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) .pci_map_irq = sable_map_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) .pci_swizzle = common_swizzle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) .sys = { .t2 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) .gamma_bias = _GAMMA_BIAS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) } }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) ALIAS_MV(sable_gamma)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) #endif /* GENERIC || (SABLE && GAMMA) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_LYNX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) #undef GAMMA_BIAS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) #define GAMMA_BIAS _GAMMA_BIAS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) struct alpha_machine_vector lynx_mv __initmv = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) .vector_name = "Lynx",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) DO_EV4_MMU,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) DO_DEFAULT_RTC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) DO_T2_IO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) .machine_check = t2_machine_check,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) .max_isa_dma_address = ALPHA_SABLE_MAX_ISA_DMA_ADDRESS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) .min_io_address = EISA_DEFAULT_IO_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) .min_mem_address = T2_DEFAULT_MEM_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) .nr_irqs = 64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) .device_interrupt = sable_lynx_srm_device_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) .init_arch = t2_init_arch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) .init_irq = lynx_init_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) .init_rtc = common_init_rtc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) .init_pci = sable_lynx_init_pci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) .kill_arch = t2_kill_arch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) .pci_map_irq = lynx_map_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) .pci_swizzle = lynx_swizzle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) .sys = { .t2 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) .gamma_bias = _GAMMA_BIAS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) } }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) ALIAS_MV(lynx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) #endif /* GENERIC || LYNX */