summaryrefslogtreecommitdiffstats
path: root/src/roms/SLOF/board-js2x/slof/pci-interrupts.fs
diff options
context:
space:
mode:
Diffstat (limited to 'src/roms/SLOF/board-js2x/slof/pci-interrupts.fs')
-rw-r--r--src/roms/SLOF/board-js2x/slof/pci-interrupts.fs235
1 files changed, 235 insertions, 0 deletions
diff --git a/src/roms/SLOF/board-js2x/slof/pci-interrupts.fs b/src/roms/SLOF/board-js2x/slof/pci-interrupts.fs
new file mode 100644
index 0000000..92851cd
--- /dev/null
+++ b/src/roms/SLOF/board-js2x/slof/pci-interrupts.fs
@@ -0,0 +1,235 @@
+\ *****************************************************************************
+\ * Copyright (c) 2004, 2008 IBM Corporation
+\ * All rights reserved.
+\ * This program and the accompanying materials
+\ * are made available under the terms of the BSD License
+\ * which accompanies this distribution, and is available at
+\ * http://www.opensource.org/licenses/bsd-license.php
+\ *
+\ * Contributors:
+\ * IBM Corporation - initial implementation
+\ ****************************************************************************/
+
+\ define function pointer as forward declaration for get-interrupt-line
+\ this is board wireing and southbridge dependent
+\ returns the wired interrupt line for this config addr
+\ ( config-addr -- irq-line )
+DEFER pci-get-irq-line
+
+\ define function pointer as forward declaration for get-interrupt-sense-type
+\ this is board wireing and southbridge dependent
+\ returns the wired interrupt sense type for this config addr
+\ 0 - Edge rising
+\ 1 - Level low
+\ 2 - Level high
+\ 3 - Edge falling
+\ ( config-addr -- irq-sense )
+DEFER pci-get-irq-sense
+
+
+\ *****************************************************************************
+\ Generic IRQ routines
+\ *****************************************************************************
+
+
+
+: unknown-slot ( -- 0 )
+\ cr pci-vec ABORT" Unknown slot "
+ 0
+;
+\ 0c s" /ht/@1/@2" PCI-X INTA & INTC Pnpirq0 -> irq12
+\ 0e s" /ht/@1/@2" PCI-X INTB & INTD Pnpirq1 -> irq14
+\ 10 s" /ht/@8,1" ATA
+\ 0f s" /ht/@1/@1" Obsidian Pnpirq2 -> irq15
+\ 10 s" /ht/@7/@2" Video / Exar Serial PirqA
+\ 11 s" /ht/@2/@4" Ethernet PirqB
+\ 12 s" /ht/@2/@4,1" Ethernet PirqC
+\ 13 s" /ht/@7/@0" USB PirqD
+\ 13 s" /ht/@7/@0,1" USB PirqD
+\ 13 s" /ht/@7/@0,2" USB PirqD
+
+\ 14 s" /ht/@3/@0" PCIe gpio28
+\ 15 s" /ht/@4/@0" PCIe gpio29
+\ 16 s" /ht/@5/@0" PCIe gpio30
+\ 17 s" /ht/@6/@0" PCIe gpio31
+
+
+\ -----------------------------------------------------------------------------
+\ Get the interrupt pin for a device on ht u4
+: u4-get-irq-line ( config-addr -- irq-line )
+\ cr s" u4-get-irq-line " type
+ pci-device-vec c@ CASE
+ 1 OF pci-device-vec-len 1 >= IF
+ pci-device-vec 1+ c@ CASE
+ 1 OF f ENDOF
+ 2 OF dup pci-interrupt@ CASE
+ 1 OF c ENDOF
+ 3 OF e ENDOF
+ 2 OF c ENDOF
+ 4 OF e ENDOF
+ ENDCASE
+ ENDOF
+ dup OF unknown-slot ENDOF
+ ENDCASE
+ ELSE
+ unknown-slot
+ THEN
+ ENDOF
+ 2 OF pci-device-vec-len 1 >= IF
+ pci-device-vec 1+ c@ CASE
+ 4 OF dup pci-addr2fn 1 >= IF 12 ELSE 11 THEN ENDOF
+ dup OF unknown-slot ENDOF
+ ENDCASE
+ ELSE
+ unknown-slot
+ THEN
+ ENDOF
+ 3 OF 14 ENDOF
+ 4 OF 15 ENDOF
+ 5 OF 16 ENDOF
+ 6 OF 17 ENDOF
+ 7 OF pci-device-vec-len 1 >= IF
+ pci-device-vec 1+ c@ CASE
+ 0 OF 13 ENDOF
+ 2 OF 10 ENDOF
+ dup OF unknown-slot ENDOF
+ ENDCASE
+ ELSE
+ unknown-slot
+ THEN
+ ENDOF
+ 8 OF 10 ENDOF
+ dup OF unknown-slot ENDOF
+ ENDCASE
+ swap drop
+;
+
+\ -----------------------------------------------------------------------------
+\ Get the interrupt sense type for a device on ht u4
+: u4-get-irq-sense ( config-addr -- irq-sense )
+\ cr s" u4-get-irq-sense " type
+ u4-get-irq-line CASE
+ 0c OF 00 ENDOF
+ 0e OF 00 ENDOF
+ dup OF 01 ENDOF
+ ENDCASE
+;
+
+\ 10 s" /ht/@4,1" set-pci-interrupt \ ATA
+\ 13 s" /ht/@3/@0" set-pci-interrupt \ USB
+\ 13 s" /ht/@3/@0,1" set-pci-interrupt \ USB
+\ 13 s" /ht/@3/@0,2" set-pci-interrupt \ USB
+\ 1c s" /ht/@2/@1" set-pci-interrupt \ Ethernet
+\ 1d s" /ht/@2/@1,1" set-pci-interrupt \ Ethernet
+
+\ -----------------------------------------------------------------------------
+\ Get the interrupt pin for a device on ht u3
+: u3-get-irq-line ( config-addr -- irq-line )
+\ cr s" u3-get-irq-line " type
+ pci-device-vec c@ CASE
+ 2 OF pci-device-vec-len 1 >= IF
+ pci-device-vec 1+ c@ CASE
+ 1 OF dup pci-addr2fn 1 >= IF 1d ELSE 1c THEN ENDOF
+ dup OF unknown-slot ENDOF
+ ENDCASE
+ ELSE
+ unknown-slot
+ THEN
+ ENDOF
+ 3 OF 13 ENDOF
+ 4 OF 10 ENDOF
+ dup OF unknown-slot ENDOF
+ ENDCASE
+ swap drop
+;
+
+\ -----------------------------------------------------------------------------
+\ Get the interrupt sense type for a device on ht u3
+: u3-get-irq-sense ( config-addr -- irq-sense )
+\ cr s" u3-get-irq-sense " type
+ u3-get-irq-line CASE
+ dup OF 01 ENDOF
+ ENDCASE
+;
+
+
+
+\ -----------------------------------------------------------------------------
+\ Get the interrupt pin for a device on attu
+: pcie-get-irq-line ( config-addr -- irq-line )
+\ cr s" pcie-get-irq-line " type
+ drop
+ 3
+;
+
+
+\ -----------------------------------------------------------------------------
+\ Get the interrupt sense type for a device on attu
+: pcie-get-irq-sense ( config-addr -- irq-sense )
+\ cr s" pcie-get-irq-sense " type
+ drop
+ 01
+;
+
+\ -----------------------------------------------------------------------------
+\ Set up the special routines for HT irq handling
+: ht-irq-init ( -- )
+\ cr s" ht-irq-init " type
+ u4? IF
+ ['] u4-get-irq-line TO pci-get-irq-line
+ ['] u4-get-irq-sense TO pci-get-irq-sense
+ ELSE
+ ['] u3-get-irq-line TO pci-get-irq-line
+ ['] u3-get-irq-sense TO pci-get-irq-sense
+ THEN
+;
+
+\ -----------------------------------------------------------------------------
+\ Set up the special routines for PCI-e irq handling
+: pcie-irq-init ( -- )
+\ cr s" pcie-irq-init " type
+ ['] pcie-get-irq-sense TO pci-get-irq-sense
+ ['] pcie-get-irq-line TO pci-get-irq-line
+;
+
+\ -----------------------------------------------------------------------------
+\ Set up the special routines for irq handling
+0 VALUE mpic
+: pci-irq-init ( mpic puid -- mpic )
+ over TO mpic
+ 18 rshift FF and
+ CASE
+ F1 OF pcie-irq-init ENDOF
+ F2 OF ht-irq-init ENDOF
+ dup OF ABORT" Wrong PUID! in pci-irq-init" ENDOF
+ ENDCASE
+;
+
+\ -----------------------------------------------------------------------------
+\ Set the interrupt pin for a device
+: pci-set-irq-line ( config-addr -- )
+\ cr pci-vec
+ dup pci-get-irq-line
+\ ." ->" dup .
+ swap pci-irq-line!
+;
+
+\ -----------------------------------------------------------------------------
+\ Add an irq entry for the device at config-addr into the irq map
+\ each entry consists of 7 integer values
+\ Structure of an entry:
+\ +----------+---+---+------------+--------------+---------+---------------+
+\ Number# | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
+\ +----------+---+---+------------+--------------+---------+---------------+
+\ meaning | config | | | int# | phandle | intr nr | pos edge (0) |
+\ | addr | | | (1=a, 2=b, | intr contr | | act ll (1) |
+\ +----------+---+---+------------+--------------+---------+---------------+
+\ value | pci slot | 0 | 0 | 1 | mpic | 7 | 0|1 |
+\ +----------+---+---+------------+--------------+---------+---------------+
+: pci-gen-irq-entry ( prop-addr prop-len config-addr -- prop-addr prop-len )
+ dup >r encode-int+ 0 encode-64+ \ config addr
+ r@ pci-interrupt@ encode-int+ \ interrupt type
+ mpic encode-int+ \ phandle to MPIC
+ r@ pci-irq-line@ encode-int+ \ interrupt number
+ r> pci-get-irq-sense encode-int+ \ trigger type
+;
OpenPOWER on IntegriCloud