diff options
Diffstat (limited to 'qemu/roms/SLOF/board-js2x/slof/pci-interrupts.fs')
-rw-r--r-- | qemu/roms/SLOF/board-js2x/slof/pci-interrupts.fs | 235 |
1 files changed, 235 insertions, 0 deletions
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 index 000000000..92851cd58 --- /dev/null +++ b/qemu/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 +; |