|
|
1.1 ! root 1: \ ***************************************************************************** ! 2: \ * Copyright (c) 2004, 2008 IBM Corporation ! 3: \ * All rights reserved. ! 4: \ * This program and the accompanying materials ! 5: \ * are made available under the terms of the BSD License ! 6: \ * which accompanies this distribution, and is available at ! 7: \ * http://www.opensource.org/licenses/bsd-license.php ! 8: \ * ! 9: \ * Contributors: ! 10: \ * IBM Corporation - initial implementation ! 11: \ ****************************************************************************/ ! 12: ! 13: \ define function pointer as forward declaration for get-interrupt-line ! 14: \ this is board wireing and southbridge dependent ! 15: \ returns the wired interrupt line for this config addr ! 16: \ ( config-addr -- irq-line ) ! 17: DEFER pci-get-irq-line ! 18: ! 19: \ define function pointer as forward declaration for get-interrupt-sense-type ! 20: \ this is board wireing and southbridge dependent ! 21: \ returns the wired interrupt sense type for this config addr ! 22: \ 0 - Edge rising ! 23: \ 1 - Level low ! 24: \ 2 - Level high ! 25: \ 3 - Edge falling ! 26: \ ( config-addr -- irq-sense ) ! 27: DEFER pci-get-irq-sense ! 28: ! 29: ! 30: \ ***************************************************************************** ! 31: \ Generic IRQ routines ! 32: \ ***************************************************************************** ! 33: ! 34: ! 35: ! 36: : unknown-slot ( -- 0 ) ! 37: \ cr pci-vec ABORT" Unknown slot " ! 38: 0 ! 39: ; ! 40: \ 0c s" /ht/@1/@2" PCI-X INTA & INTC Pnpirq0 -> irq12 ! 41: \ 0e s" /ht/@1/@2" PCI-X INTB & INTD Pnpirq1 -> irq14 ! 42: \ 10 s" /ht/@8,1" ATA ! 43: \ 0f s" /ht/@1/@1" Obsidian Pnpirq2 -> irq15 ! 44: \ 10 s" /ht/@7/@2" Video / Exar Serial PirqA ! 45: \ 11 s" /ht/@2/@4" Ethernet PirqB ! 46: \ 12 s" /ht/@2/@4,1" Ethernet PirqC ! 47: \ 13 s" /ht/@7/@0" USB PirqD ! 48: \ 13 s" /ht/@7/@0,1" USB PirqD ! 49: \ 13 s" /ht/@7/@0,2" USB PirqD ! 50: ! 51: \ 14 s" /ht/@3/@0" PCIe gpio28 ! 52: \ 15 s" /ht/@4/@0" PCIe gpio29 ! 53: \ 16 s" /ht/@5/@0" PCIe gpio30 ! 54: \ 17 s" /ht/@6/@0" PCIe gpio31 ! 55: ! 56: ! 57: \ ----------------------------------------------------------------------------- ! 58: \ Get the interrupt pin for a device on ht u4 ! 59: : u4-get-irq-line ( config-addr -- irq-line ) ! 60: \ cr s" u4-get-irq-line " type ! 61: pci-device-vec c@ CASE ! 62: 1 OF pci-device-vec-len 1 >= IF ! 63: pci-device-vec 1+ c@ CASE ! 64: 1 OF f ENDOF ! 65: 2 OF dup pci-interrupt@ CASE ! 66: 1 OF c ENDOF ! 67: 3 OF e ENDOF ! 68: 2 OF c ENDOF ! 69: 4 OF e ENDOF ! 70: ENDCASE ! 71: ENDOF ! 72: dup OF unknown-slot ENDOF ! 73: ENDCASE ! 74: ELSE ! 75: unknown-slot ! 76: THEN ! 77: ENDOF ! 78: 2 OF pci-device-vec-len 1 >= IF ! 79: pci-device-vec 1+ c@ CASE ! 80: 4 OF dup pci-addr2fn 1 >= IF 12 ELSE 11 THEN ENDOF ! 81: dup OF unknown-slot ENDOF ! 82: ENDCASE ! 83: ELSE ! 84: unknown-slot ! 85: THEN ! 86: ENDOF ! 87: 3 OF 14 ENDOF ! 88: 4 OF 15 ENDOF ! 89: 5 OF 16 ENDOF ! 90: 6 OF 17 ENDOF ! 91: 7 OF pci-device-vec-len 1 >= IF ! 92: pci-device-vec 1+ c@ CASE ! 93: 0 OF 13 ENDOF ! 94: 2 OF 10 ENDOF ! 95: dup OF unknown-slot ENDOF ! 96: ENDCASE ! 97: ELSE ! 98: unknown-slot ! 99: THEN ! 100: ENDOF ! 101: 8 OF 10 ENDOF ! 102: dup OF unknown-slot ENDOF ! 103: ENDCASE ! 104: swap drop ! 105: ; ! 106: ! 107: \ ----------------------------------------------------------------------------- ! 108: \ Get the interrupt sense type for a device on ht u4 ! 109: : u4-get-irq-sense ( config-addr -- irq-sense ) ! 110: \ cr s" u4-get-irq-sense " type ! 111: u4-get-irq-line CASE ! 112: 0c OF 00 ENDOF ! 113: 0e OF 00 ENDOF ! 114: dup OF 01 ENDOF ! 115: ENDCASE ! 116: ; ! 117: ! 118: \ 10 s" /ht/@4,1" set-pci-interrupt \ ATA ! 119: \ 13 s" /ht/@3/@0" set-pci-interrupt \ USB ! 120: \ 13 s" /ht/@3/@0,1" set-pci-interrupt \ USB ! 121: \ 13 s" /ht/@3/@0,2" set-pci-interrupt \ USB ! 122: \ 1c s" /ht/@2/@1" set-pci-interrupt \ Ethernet ! 123: \ 1d s" /ht/@2/@1,1" set-pci-interrupt \ Ethernet ! 124: ! 125: \ ----------------------------------------------------------------------------- ! 126: \ Get the interrupt pin for a device on ht u3 ! 127: : u3-get-irq-line ( config-addr -- irq-line ) ! 128: \ cr s" u3-get-irq-line " type ! 129: pci-device-vec c@ CASE ! 130: 2 OF pci-device-vec-len 1 >= IF ! 131: pci-device-vec 1+ c@ CASE ! 132: 1 OF dup pci-addr2fn 1 >= IF 1d ELSE 1c THEN ENDOF ! 133: dup OF unknown-slot ENDOF ! 134: ENDCASE ! 135: ELSE ! 136: unknown-slot ! 137: THEN ! 138: ENDOF ! 139: 3 OF 13 ENDOF ! 140: 4 OF 10 ENDOF ! 141: dup OF unknown-slot ENDOF ! 142: ENDCASE ! 143: swap drop ! 144: ; ! 145: ! 146: \ ----------------------------------------------------------------------------- ! 147: \ Get the interrupt sense type for a device on ht u3 ! 148: : u3-get-irq-sense ( config-addr -- irq-sense ) ! 149: \ cr s" u3-get-irq-sense " type ! 150: u3-get-irq-line CASE ! 151: dup OF 01 ENDOF ! 152: ENDCASE ! 153: ; ! 154: ! 155: ! 156: ! 157: \ ----------------------------------------------------------------------------- ! 158: \ Get the interrupt pin for a device on attu ! 159: : pcie-get-irq-line ( config-addr -- irq-line ) ! 160: \ cr s" pcie-get-irq-line " type ! 161: drop ! 162: 3 ! 163: ; ! 164: ! 165: ! 166: \ ----------------------------------------------------------------------------- ! 167: \ Get the interrupt sense type for a device on attu ! 168: : pcie-get-irq-sense ( config-addr -- irq-sense ) ! 169: \ cr s" pcie-get-irq-sense " type ! 170: drop ! 171: 01 ! 172: ; ! 173: ! 174: \ ----------------------------------------------------------------------------- ! 175: \ Set up the special routines for HT irq handling ! 176: : ht-irq-init ( -- ) ! 177: \ cr s" ht-irq-init " type ! 178: u4? IF ! 179: ['] u4-get-irq-line TO pci-get-irq-line ! 180: ['] u4-get-irq-sense TO pci-get-irq-sense ! 181: ELSE ! 182: ['] u3-get-irq-line TO pci-get-irq-line ! 183: ['] u3-get-irq-sense TO pci-get-irq-sense ! 184: THEN ! 185: ; ! 186: ! 187: \ ----------------------------------------------------------------------------- ! 188: \ Set up the special routines for PCI-e irq handling ! 189: : pcie-irq-init ( -- ) ! 190: \ cr s" pcie-irq-init " type ! 191: ['] pcie-get-irq-sense TO pci-get-irq-sense ! 192: ['] pcie-get-irq-line TO pci-get-irq-line ! 193: ; ! 194: ! 195: \ ----------------------------------------------------------------------------- ! 196: \ Set up the special routines for irq handling ! 197: 0 VALUE mpic ! 198: : pci-irq-init ( mpic puid -- mpic ) ! 199: over TO mpic ! 200: 18 rshift FF and ! 201: CASE ! 202: F1 OF pcie-irq-init ENDOF ! 203: F2 OF ht-irq-init ENDOF ! 204: dup OF ABORT" Wrong PUID! in pci-irq-init" ENDOF ! 205: ENDCASE ! 206: ; ! 207: ! 208: \ ----------------------------------------------------------------------------- ! 209: \ Set the interrupt pin for a device ! 210: : pci-set-irq-line ( config-addr -- ) ! 211: \ cr pci-vec ! 212: dup pci-get-irq-line ! 213: \ ." ->" dup . ! 214: swap pci-irq-line! ! 215: ; ! 216: ! 217: \ ----------------------------------------------------------------------------- ! 218: \ Add an irq entry for the device at config-addr into the irq map ! 219: \ each entry consists of 7 integer values ! 220: \ Structure of an entry: ! 221: \ +----------+---+---+------------+--------------+---------+---------------+ ! 222: \ Number# | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ! 223: \ +----------+---+---+------------+--------------+---------+---------------+ ! 224: \ meaning | config | | | int# | phandle | intr nr | pos edge (0) | ! 225: \ | addr | | | (1=a, 2=b, | intr contr | | act ll (1) | ! 226: \ +----------+---+---+------------+--------------+---------+---------------+ ! 227: \ value | pci slot | 0 | 0 | 1 | mpic | 7 | 0|1 | ! 228: \ +----------+---+---+------------+--------------+---------+---------------+ ! 229: : pci-gen-irq-entry ( prop-addr prop-len config-addr -- prop-addr prop-len ) ! 230: dup >r encode-int+ 0 encode-64+ \ config addr ! 231: r@ pci-interrupt@ encode-int+ \ interrupt type ! 232: mpic encode-int+ \ phandle to MPIC ! 233: r@ pci-irq-line@ encode-int+ \ interrupt number ! 234: r> pci-get-irq-sense encode-int+ \ trigger type ! 235: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.