Annotation of qemu/roms/SLOF/board-js2x/slof/ht.fs, revision 1.1

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: \ Hypertransport.
        !            14: 
        !            15: \ See the PCI OF binding document.
        !            16: 
        !            17: new-device
        !            18: 
        !            19: s" ht" 2dup device-name device-type
        !            20: s" u3-ht" compatible
        !            21: s" U3" encode-string s" model" property
        !            22: 
        !            23: 3 encode-int s" #address-cells" property
        !            24: 2 encode-int s" #size-cells" property
        !            25: 
        !            26: s" /mpic" find-node encode-int s" interrupt-parent" property
        !            27: 
        !            28: 4000 encode-int 0 encode-int+ 0 encode-int+
        !            29: 1 encode-int+ s" /mpic" find-node encode-int+ 
        !            30: 10 encode-int+ 0 encode-int+
        !            31: s" interrupt-map" property
        !            32: 
        !            33: f800 encode-int 0 encode-int+ 0 encode-int+
        !            34: 7 encode-int+ s" interrupt-map-mask" property
        !            35: 
        !            36: : decode-unit  2 hex-decode-unit 3 lshift or
        !            37:                8 lshift 0 0 rot ;
        !            38: : encode-unit  nip nip ff00 and 8 rshift dup 7 and swap 3 rshift
        !            39:                over IF 2 ELSE nip 1 THEN hex-encode-unit ;
        !            40: 
        !            41: f2000000 CONSTANT my-puid
        !            42: \ Configuration space accesses.
        !            43: : >config  dup ffff > IF 1000000 + THEN f2000000 + ;
        !            44: 
        !            45: \ : config-l!  >config cr ." config-l! " 2dup . space . rl!-le ;
        !            46: \ : config-l@  >config cr ." config-l@ " dup . rl@-le space dup . ;
        !            47: \ : config-w!  >config cr ." config-w! " 2dup . space . rw!-le ;
        !            48: \ : config-w@  >config cr ." config-w@ " dup . rw@-le space dup . ;
        !            49: \ : config-b!  >config cr ." config-b! " 2dup . space . rb! ;
        !            50: \ : config-b@  >config cr ." config-b@ " dup . rb@ space dup . ;
        !            51: 
        !            52: : config-l!  >config rl!-le ;
        !            53: : config-l@  >config rl@-le ;
        !            54: : config-w!  >config rw!-le ;
        !            55: : config-w@  >config rw@-le ;
        !            56: : config-b!  >config rb! ;
        !            57: : config-b@  >config rb@ ;
        !            58: 
        !            59: : config-dump ( addr size -- )  ['] config-l@ 4 (dump) ;
        !            60: 
        !            61: 
        !            62: \ 16MB of configuration space, seperate for type 0 and type 1.
        !            63: 00000000 encode-int  f2000000 encode-int+
        !            64: 00000000 encode-int+ 02000000 encode-int+ s" reg" property
        !            65: 
        !            66: \ 4MB of I/O space.
        !            67: 01000000 encode-int  00000000 encode-int+ 00000000 encode-int+ 
        !            68: 00000000 encode-int+ f4000000 encode-int+ 
        !            69: 00000000 encode-int+ 00400000 encode-int+
        !            70: 
        !            71: \ 1 GB of memory space @ 80000000
        !            72: 02000000 encode-int+ 00000000 encode-int+ 80000000 encode-int+ 
        !            73: 00000000 encode-int+ 80000000 encode-int+ 
        !            74: 00000000 encode-int+ 40000000 encode-int+ s" ranges" property
        !            75: 
        !            76: \ Host bridge, so full bus range.
        !            77: 0 encode-int ff encode-int+ s" bus-range" property
        !            78: 
        !            79: : enable-ht-apic-space 3c0300fe f8070200 rl! ;
        !            80: enable-ht-apic-space
        !            81: 
        !            82: \ spare out 0xc0000000-0xefffffff for pcie
        !            83: f8070200 rl@ fffffff0 and f8070200 rl!
        !            84: \ enable io memory for pcie @ c0000000-efffffff
        !            85: 70000003 f80903f0 rl!-le
        !            86: 
        !            87: 
        !            88: \ Workaround for "takeover" boot on JS20: the top 8131 is programmed to be
        !            89: \ device #1f, while it should be #01.
        !            90: u3? IF f800 config-l@ 74501022 = IF 41 f8c2 config-w! THEN THEN
        !            91: 
        !            92: \ Assign BUIDs.
        !            93: 
        !            94: : find-ht-primary
        !            95:   34 BEGIN config-b@ dup 0= ABORT" No HT capability block found!"
        !            96:   dup config-l@ e00000ff and 8 = IF 2 + EXIT THEN 1 + AGAIN ;
        !            97: 
        !            98: : assign-buid ( this -- next )
        !            99:   find-ht-primary dup >r config-w@ 5 rshift 1f and over r> config-b! + ;
        !           100: 
        !           101: : assign-buids ( -- )
        !           102:   1 BEGIN 0 config-l@ ffffffff <> WHILE assign-buid REPEAT drop ;
        !           103: 
        !           104: assign-buids 
        !           105: 
        !           106: : ldtstop  f8000840 rl@ 40000 or f8000840 rl! ;
        !           107: : delay 100000 0 DO LOOP ;
        !           108: : wait-for-done  BEGIN f8070110  rl@ 30 and UNTIL
        !           109:                  BEGIN 8b4 config-l@ 30 and UNTIL ;
        !           110: : ldtstop1  f8000840 rl@ dup 20000 or f8000840 rl! delay
        !           111:             f8000840 rl! wait-for-done ;
        !           112: : warm  400000 f8070300 rl! 0 f8070300 rl! ;
        !           113: 
        !           114: : dumpht  cr f8070110 rl@ 8 0.r space 8b4 config-l@ 8 0.r
        !           115:        space f8070122 rb@ 2 0.r space 8bd config-b@ 2 0.r ; 
        !           116: 
        !           117: : clearht  f8070110 dup rl@ swap rl!
        !           118:            f8070120 dup rl@ swap rl!
        !           119:            08b4 dup config-l@ swap config-l!
        !           120:            08bc dup config-l@ swap config-l! ;
        !           121: 
        !           122: : setwidth  dup f8070110 rb! 8b7 config-b! ;
        !           123: : set8   00 setwidth ;
        !           124: : set16  11 setwidth ;
        !           125: 
        !           126: : setfreq  dup f8070122 rb! 8bd config-b! ;
        !           127: : set200   0 setfreq ;
        !           128: : set300   1 setfreq ;
        !           129: : set400   2 setfreq ;
        !           130: : set500   3 setfreq ;
        !           131: : set600   4 setfreq ;
        !           132: : set800   5 setfreq ;
        !           133: : set1000  6 setfreq ;
        !           134: : set1200  7 setfreq ;
        !           135: : set1400  8 setfreq ;
        !           136: : set1600  9 setfreq ;
        !           137: 
        !           138: : ht>freq  2 + dup 6 > IF 2* 6 - THEN d# 100 * ;
        !           139: \ XXX: looks only at the U3/U4 side for max. link speed and width.
        !           140: clearht f8070111 rb@ setwidth
        !           141: f8070120 rw@ 2log dup .(  Switching top HT bus to ) ht>freq 0 d# .r .( MHz...) cr
        !           142: setfreq u3? IF ldtstop THEN u4? IF ldtstop1 THEN
        !           143: 
        !           144: : open  true ;
        !           145: : close ;
        !           146: 
        !           147: \ : probe-pci-host-bridge ( bus-max bus-min mmio-max mmio-base mem-max mem-base io-max io-base my-puid -- )
        !           148: s" /mpic" find-node my-puid pci-irq-init drop
        !           149: 1f 0 c0000000 b8000000 b8000000 80000000 100000000 10000
        !           150: my-puid probe-pci-host-bridge
        !           151: 
        !           152: : msi
        !           153:   f80040f0 010854 config-l!   0 010858 config-l!
        !           154:       ffff 01085c config-w!  81 010852 config-b!
        !           155: ;
        !           156: 
        !           157: \ This works.  Needs cleaning up though; and we need to communicate the
        !           158: \ MSI address range to the client program.  (We keep the default range
        !           159: \ at fee00000 for now).
        !           160: : msi-on  7 1 DO 10000 i 800 * a0 + config-l! LOOP ;
        !           161: msi-on
        !           162: 
        !           163: \ PCIe debug / fixup
        !           164: : find-pcie-cap  ( devfn -- offset | 0 )
        !           165:    >r 34  BEGIN  r@ + config-b@ dup ff <> over and  WHILE
        !           166:       dup r@ + config-b@ 10 = IF
        !           167:          r> drop EXIT 
        !           168:       THEN 1+
        !           169:    REPEAT r> 2drop 0
        !           170: ;
        !           171: 
        !           172: : (set-ps) ( ps addr -- )
        !           173:   8 + >r 5 lshift r@ config-w@ ff1f and or r> config-w! ;
        !           174: : set-ps ( ps -- )
        !           175:   log2 7 -
        !           176:   10000 0 DO i 8 lshift dup find-pcie-cap ?dup IF
        !           177:   + 2dup (set-ps) THEN drop LOOP drop ;
        !           178: 
        !           179: : (set-rr) ( rr addr -- )
        !           180:   8 + >r c lshift r@ config-w@ 8fff and or r> config-w! ;
        !           181: : set-rr ( rr -- )
        !           182:   log2 7 -
        !           183:   10000 0 DO i 8 lshift dup find-pcie-cap ?dup IF
        !           184:   + 2dup (set-rr) THEN drop LOOP drop ;
        !           185: 
        !           186: 100 set-ps  200 set-rr  
        !           187: 100 set-ps  200 set-rr  
        !           188: 
        !           189: finish-device

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.