|
|
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: \ U4 "Attu" PCIe root complex. ! 14: ! 15: \ See the PCI OF binding document. ! 16: ! 17: new-device ! 18: ! 19: s" pciex" device-name s" pci" device-type ! 20: s" U4-pcie" compatible ! 21: s" U4" encode-string s" model" property ! 22: ! 23: \ spare out 0xc0000000-0xefffffff for pcie ! 24: f8070200 rl@ fffffff0 and f8070200 rl! ! 25: \ enable io memory for pcie @ c0000000-efffffff ! 26: 70000003 f80903f0 rl!-le ! 27: ! 28: 3 encode-int s" #address-cells" property ! 29: 2 encode-int s" #size-cells" property ! 30: ! 31: s" /mpic" find-node encode-int s" interrupt-parent" property ! 32: \ XXX should have interrupt map, etc. this works for now though. ! 33: ! 34: : decode-unit 2 hex-decode-unit 3 #join 8 lshift 0 0 rot F00000 + ; ! 35: : encode-unit nip nip ff00 and 8 rshift 3 #split ! 36: over IF 2 ELSE nip 1 THEN hex-encode-unit ; ! 37: ! 38: f1000000 CONSTANT my-puid ! 39: \ Configuration space accesses. ! 40: : >config f1000000 + ; ! 41: : config-l! >config rl!-le ; ! 42: : config-l@ >config rl@-le ; ! 43: : config-w! >config rw!-le ; ! 44: : config-w@ >config rw@-le ; ! 45: : config-b! >config rb! ; ! 46: : config-b@ >config rb@ ; ! 47: ! 48: : config-dump ( addr size -- ) ['] config-l@ 4 (dump) ; ! 49: ! 50: \ 16MB of configuration space ! 51: f1000000 encode-64 1000000 encode-64+ s" reg" property ! 52: ! 53: \ 4MB of I/O space. ! 54: 01000000 encode-int 00000000 encode-int+ 00000000 encode-int+ ! 55: 00000000 encode-int+ f0000000 encode-int+ ! 56: 00000000 encode-int+ 00400000 encode-int+ ! 57: ! 58: \ 1.75GB of memory space @ c0000000. ! 59: 02000000 encode-int+ c0000000 encode-64+ ! 60: c0000000 encode-64+ 30000000 encode-64+ s" ranges" property ! 61: ! 62: \ Host bridge, so full bus range. ! 63: f0 encode-int ff encode-int+ s" bus-range" property ! 64: ! 65: : open true ; ! 66: : close ; ! 67: ! 68: \ : probe-pci-host-bridge ( bus-max bus-min mmio-max mmio-base mem-max mem-base io-max io-base my-puid -- ) ! 69: s" /mpic" find-node my-puid pci-irq-init drop ! 70: ! 71: 00fff1f0 18 config-l! ! 72: ! 73: ff F0 f0000000 e8000000 e8000000 c0000000 100000000 f000 ! 74: my-puid probe-pci-host-bridge ! 75: ! 76: \ \ PCIe debug / fixup ! 77: : find-pcie-cap ( devfn -- offset | 0 ) ! 78: >r 34 BEGIN r@ + config-b@ dup ff <> over and WHILE ! 79: dup r@ + config-b@ 10 = IF ! 80: r> drop EXIT ! 81: THEN 1+ ! 82: REPEAT r> 2drop 0 ! 83: ; ! 84: ! 85: : (set-ps) ( ps addr -- ) ! 86: 8 + >r 5 lshift r@ config-w@ ff1f and or r> config-w! ; ! 87: : set-ps ( ps -- ) ! 88: log2 7 - ! 89: 10000 0 DO i 8 lshift dup find-pcie-cap ?dup IF ! 90: + 2dup (set-ps) THEN drop LOOP drop ; ! 91: ! 92: : (set-rr) ( rr addr -- ) ! 93: 8 + >r c lshift r@ config-w@ 8fff and or r> config-w! ; ! 94: : set-rr ( rr -- ) ! 95: log2 7 - ! 96: 10000 0 DO i 8 lshift dup find-pcie-cap ?dup IF ! 97: + 2dup (set-rr) THEN drop LOOP drop ; ! 98: ! 99: 80 set-ps 80 set-rr ! 100: ! 101: finish-device
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.