Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / board-js2x / slof / pci-interrupts.fs
diff --git a/qemu/roms/SLOF/board-js2x/slof/pci-interrupts.fs b/qemu/roms/SLOF/board-js2x/slof/pci-interrupts.fs
new file mode 100644 (file)
index 0000000..92851cd
--- /dev/null
@@ -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
+;