\ ***************************************************************************** \ * 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 ;