Annotation of qemu/roms/SLOF/board-js2x/llfw/startup.S, 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: # SLOF for JS20/JS21 -- ROM boot code.
        !            14: # Initial entry point, copy code from flash to cache, memory setup.
        !            15: # Also sets up serial console and optimizes some settings.
        !            16: 
        !            17: #include "termctrl.h"
        !            18: #include <product.h>
        !            19: #include <xvect.h>
        !            20: #include <cpu.h>
        !            21: #include <macros.h>
        !            22: #include <southbridge.h>
        !            23: 
        !            24:        .text
        !            25:        .globl __start
        !            26: __start:
        !            27:        /* put rombase in sprg1 ***********************/
        !            28: 
        !            29:        bl      postHeader
        !            30:        .long 0xDEADBEE0
        !            31:        .long 0x0       /* size */ 
        !            32:        .long 0x0       /* crc  */
        !            33:        .long relTag - __start
        !            34: postHeader:
        !            35:        mflr    r3
        !            36:        li      r4, 0x7fff
        !            37:        not     r4, r4
        !            38:        and     r3, r3, r4
        !            39:        mtsprg  1, r3      /* romfs base */
        !            40:        bl      _start
        !            41: 
        !            42:        .org 0x150 - 0x100
        !            43: __startSlave:
        !            44:        bl setup_cpu
        !            45:        bl set_ci_bit
        !            46: #      b slaveWithNumber
        !            47:        b slave
        !            48: 
        !            49:        .org 0x180 - 0x100
        !            50: __startMaster:
        !            51:        li 3,0
        !            52:        mtsprg  1, r3      /* romfs base */
        !            53:        bl setup_cpu
        !            54:        bl set_ci_bit
        !            55:        b master
        !            56: 
        !            57: 
        !            58:        /* FIXME: Also need 0280, 0380, 0f20, etc. */
        !            59: 
        !            60:        .irp i, 0x0100,0x0180,0x0200,0x0280,0x0300,0x0380,0x0400,0x0500,0x0600,0x0700, \
        !            61:                0x0800,0x0900,0x0a00,0x0b00,0x0c00,0x0d00,0x0e00,0x0f00, \
        !            62:                0x1000,0x1100,0x1200,0x1300,0x1400,0x1500,0x1600,0x1700, \
        !            63:                0x1800,0x1900,0x1a00,0x1b00,0x1c00,0x1d00,0x1e00,0x1f00, \
        !            64:                0x2000,0x2100,0x2200,0x2300,0x2400,0x2500,0x2600,0x2700, \
        !            65:                0x2800,0x2900,0x2a00,0x2b00,0x2c00,0x2d00,0x2e00
        !            66:        . = \i
        !            67: 
        !            68:        /* enable this if you get exceptions before the console works    */
        !            69:        /* this will allow using the hardware debugger to see where      */
        !            70:        /* it traps, and with what register values etc.                  */
        !            71:        // b    $
        !            72: 
        !            73:        mtsprg  0, r0
        !            74:        mfctr   r0
        !            75:        mtsprg  2,r0
        !            76:        mflr    r0
        !            77: // 10
        !            78:        mtsprg  3,r0
        !            79:        ld      r0, (\i + 0x160)(0)
        !            80:        mtctr   r0
        !            81:        li      r0, \i + 0x100
        !            82: // 20
        !            83:        bctr
        !            84: 
        !            85:        . = \i + 0x60
        !            86: 
        !            87:        .quad intHandler2C
        !            88: 
        !            89:        .endr
        !            90: 
        !            91: 
        !            92:        . = XVECT_M_HANDLER - 0x100
        !            93:        .quad 0x00
        !            94:        . = XVECT_S_HANDLER - 0x100
        !            95: 
        !            96:        .quad 0
        !            97: 
        !            98: 
        !            99: 
        !           100:        .org 0x4000 - 0x100
        !           101: _start:
        !           102:        # optimize HID register settings
        !           103:        bl setup_cpu
        !           104:        bl set_ci_bit
        !           105: 
        !           106:        # read semaphore, run as slave if not the first to do so
        !           107:        li 3,0 ; oris 3,3,0xf800 ; lwz 3,0x60(3) ; andi. 3,3,1 ; beq slave
        !           108: master:
        !           109:        # setup flash, serial
        !           110:        bl setup_sio
        !           111: 
        !           112:        # early greet
        !           113:        li      r3, 10
        !           114:        bl      putc
        !           115:        li 3,13 ; bl putc ; li 3,10 ; bl putc ; li 3,'S' ; bl putc
        !           116: 
        !           117: 
        !           118:        #do we run from ram ?
        !           119:        mfsprg  r3, 1   /* rombase */
        !           120:        cmpdi   r3,0    /* rombase is 0 when running from RAM */
        !           121: 
        !           122:        bne copy_to_cache
        !           123: 
        !           124:        # wait a bit, start scripts are slow...  need to get all cores running!
        !           125:        lis 3,0x4000 ; mtctr 3 ; bdnz $
        !           126: 
        !           127:        # copy 4MB from 0 to temp memory
        !           128:    lis 4,0x8 ; mtctr 4 ; lis 4,0x200  ; li 3,0 ; addi 4,4,-8 ; addi 3,3,-8
        !           129: 0:     ldu 5,8(3) ; stdu 5,8(4) ; bdnz 0b
        !           130: 
        !           131:        lis 4,0x200
        !           132:        mtsprg  1, r4
        !           133: 
        !           134:        lis 4,0x1
        !           135:        lis 3,0x20 ; addi 3,3,0x200-8 ;
        !           136:        FLUSH_CACHE(r3, r4)
        !           137: 
        !           138:        lis 4,0x200
        !           139:        addi 4,4,copy_to_cache@l
        !           140:        mtctr 4
        !           141:        bctr
        !           142: 
        !           143: # make all data accesses cache-inhibited
        !           144: set_ci_bit:
        !           145:        SETCI(r0)
        !           146:        blr
        !           147: 
        !           148: # make all data accesses cacheable
        !           149: clr_ci_bit:
        !           150:        CLRCI(r0)
        !           151:        blr
        !           152: 
        !           153: # write a character to the serial port
        !           154: putc:
        !           155: # always write to serial1
        !           156: 0:     lbz 0,5(13) ; andi. 0,0,0x20 ; beq 0b ; stb 3,0(13) ; eieio
        !           157: 
        !           158: # read ID register: only if it is a PC87427 (JS21) also use serial2
        !           159:        li 4,0 ; oris 4,4,0xf400
        !           160:        li 5,0x20 ; stb 5,0x2e(4) ; lbz 5,0x2f(4); cmpdi 5,0xf2 ; bne 1f
        !           161: 
        !           162:        addi 4,4,0x2f8
        !           163: 0:     lbz 0,5(4) ; andi. 0,0,0x20 ; beq 0b ; stb 3,0(4) ; eieio
        !           164: 
        !           165: 1:     blr
        !           166: 
        !           167: # transfer from running from flash to running from cache
        !           168: return_cacheable:
        !           169:        # find and set address to start running from cache, set msr value 
        !           170:        mflr 3 ; rldicl 3,3,0,44 
        !           171: jump_cacheable:
        !           172:        mtsrr0 3 ; 
        !           173:        mfmsr 3 ; ori 3,3,0x1000 ; mtsrr1 3 # enable MCE, as well
        !           174: 
        !           175:        # set cacheable insn fetches, jump to cache
        !           176:        mfspr 3,HID1 ; rldicl 3,3,32,0 ; oris 3,3,0x0020 ; rldicl 3,3,32,0
        !           177:        sync ; mtspr HID1,3 ; mtspr HID1,3 ; rfid ; b .
        !           178: 
        !           179: 
        !           180: 
        !           181: 
        !           182: copy_to_cache:
        !           183:        # zero the whole cache
        !           184:        # also, invalidate the insn cache, to clear parity errors
        !           185:        # 128kB @ 0MB (boot code and vectors from 0x0 up to 0x20000)
        !           186:        li 4,0x400 ; mtctr 4 ; li 5,0x0 ; bl clr_ci_bit
        !           187: 0:     dcbz 0,5 ; sync ; icbi 0,5 ; sync ; isync ; addi 5,5,0x80 ; bdnz 0b
        !           188: 
        !           189:        # 0x2000 to 0x100000/0x80000 (smaller on 970/970FX)
        !           190:        li 4,0x1C00 ; mfpvr 0 ; srdi 0,0,16 ; cmpdi 0,0x0044 ; bge 0f ; li 4,0xC00
        !           191: 0:
        !           192:        mtctr 4 ; li 5,0x2000
        !           193: 0:     dcbz 0,5 ; sync ; isync ; addi 5,5,0x80 ; bdnz 0b ; bl set_ci_bit
        !           194: 
        !           195:        # find base address
        !           196:        bcl 20,31,$+4 ; mflr 31 ; rldicr 31,31,0,43
        !           197: 
        !           198:        # copy 1kB from 0x4000
        !           199:        li 4,0x80 ; mtctr 4 ; 
        !           200:        li      5,0x3ff8
        !           201:        addi 3,31,0x3ff8
        !           202: 0:     ldu 4,8(3) ; bl clr_ci_bit ; stdu 4,8(5) ; bl set_ci_bit ; bdnz 0b
        !           203:        # now start executing from cache -- insn cache is huge speed boost
        !           204: 
        !           205:        bl return_cacheable
        !           206: 
        !           207:        li 3,'L' ; bl putc
        !           208: 
        !           209:        # copy 128kB of flash to cache
        !           210:        li 4,0x800 ; mtctr 4 ; li 5,0x200-64 ; addi 3,31,0x200-64 ; 
        !           211: 0:     ldu 16,64(3) ; ld 17,8(3) ; ld 18,16(3) ; ld 19,24(3)
        !           212:        ld 20,32(3) ; ld 21,40(3) ; ld 22,48(3) ; ld 23,56(3)
        !           213:        bl clr_ci_bit
        !           214:        stdu 16,64(5) ; std 17,8(5) ; std 18,16(5) ; std 19,24(5)
        !           215:        std 20,32(5) ; std 21,40(5) ; std 22,48(5) ; std 23,56(5)
        !           216:        icbi 0,5 ; bl set_ci_bit ; bdnz 0b ; isync
        !           217: 
        !           218: 
        !           219:        li 3,'O' ; bl putc
        !           220: 
        !           221:        lis 4,0x20
        !           222:        mfsprg  r3,1
        !           223:        cmpd r3,r4
        !           224:        beq 1f
        !           225: 
        !           226:        // at 0xf8000000 we decide if it is u3 or u4
        !           227:        li 4,0 ; oris 4,4,0xf800 ; lwz 3,0(4) ; srdi 3,3,4 ; cmpdi 3,3 ; bne 0f
        !           228:        bl setup_mem_u3
        !           229:        bl setup_mem_size
        !           230:        b 1f
        !           231: 0:
        !           232: 
        !           233: 1:
        !           234:        li 3,'F' ; bl putc
        !           235: 
        !           236:        # setup nvram logging only when not running from RAM
        !           237:        mfsprg  r3, 1   /* rombase */
        !           238:        cmpdi   r3, 0   /* rombase is 0 when running from RAM */
        !           239:        beq     0f
        !           240: 
        !           241:        // at 0xf8000000 we decide if it is u3 or u4
        !           242:        li      r4, 0
        !           243:        oris    r4, r4, 0xf800
        !           244:        lwz     r3, 0(r4)
        !           245:        srdi    r3, r3, 4
        !           246:        cmpdi   r3, 3   /* 3 means js20; no nvram logging on js20 */
        !           247:        beq     0f
        !           248: 
        !           249:        bl      io_log_init
        !           250: 0:
        !           251: 
        !           252:        #bl print_mem
        !           253: 
        !           254:        # data is cacheable by default from now on
        !           255:        bl clr_ci_bit
        !           256: 
        !           257: 
        !           258:        /* give live sign *****************************/
        !           259:        bl      0f
        !           260:        .ascii  TERM_CTRL_RESET
        !           261:        .ascii  TERM_CTRL_CRSOFF
        !           262:        .ascii  " **********************************************************************"
        !           263:        .ascii  "\r\n"
        !           264:        .ascii  TERM_CTRL_BRIGHT
        !           265:        .ascii  PRODUCT_NAME
        !           266:        .ascii  " Starting\r\n"
        !           267:        .ascii  TERM_CTRL_RESET
        !           268:        .ascii  " Build Date = ", __DATE__, " ", __TIME__
        !           269:        .ascii  "\r\n"
        !           270:        .ascii  " FW Version = " , RELEASE
        !           271:        .ascii  "\r\n\0"
        !           272:        .align  2
        !           273: 0:     mflr    r3
        !           274:        bl      io_print
        !           275: 
        !           276:        # go!
        !           277:        li      r3,__startC@l
        !           278:        mtctr   r3
        !           279:        mfsprg  r10, 1
        !           280:        bctrl
        !           281: 
        !           282: relTag:
        !           283:        .ascii  RELEASE
        !           284:        .ascii  "\0"
        !           285:        .align  2
        !           286: 
        !           287: slave:
        !           288: 
        !           289:        # get cpu number
        !           290:        li 3,0 ; oris 3,3,0xf800 ; lwz 28,0x50(3)
        !           291: 
        !           292: slaveWithNumber:
        !           293:        # create our slave loop address
        !           294:        sldi 3,28,24 ; oris 3,3,0x3000
        !           295: 
        !           296:        # invalidate the insn cache, to clear parity errors
        !           297:        # clear the L2 cache as well, to get ECC right
        !           298:        li 4,0x2000 ; mfpvr 0 ; srdi 0,0,16 ; cmpdi 0,0x0044 ; bge 0f ; li 4,0x1000
        !           299: 0:     mtctr 4 ; mr 5,3 ; bl clr_ci_bit
        !           300: 
        !           301: 0:     dcbz 0,5 ; sync ; icbi 0,5 ; sync ; isync ; addi 5,5,0x80 ; bdnz 0b
        !           302: 
        !           303: 
        !           304:        # write a "b $" insn in there
        !           305:        lis 4,0x4800 ; stw 4,0(3)
        !           306: /*
        !           307:        mr 5,3
        !           308: 
        !           309:        # jump there
        !           310:        bl set_ci_bit
        !           311:        li 13,0 ; oris 13,13,0xf400
        !           312:        # device address
        !           313:        addi 13,13,0x2f8
        !           314:        li 3,'O' ; add 3,3,28 ; bl putc
        !           315:        bl clr_ci_bit
        !           316:        mr 3,5
        !           317: */
        !           318:        b jump_cacheable
        !           319: 
        !           320: 
        !           321: 
        !           322: 
        !           323: # allow the flash chip to be accessed faster
        !           324: # initialize the 16550-compatible uart on serial port 1 of the sio
        !           325: setup_sio:
        !           326: 
        !           327:        # i/o base address
        !           328:        li 3,0 ; oris 3,3,0xf400
        !           329: 
        !           330:        # i/o base address
        !           331:        li 3,0 ; oris 3,3,0xf400
        !           332: 
        !           333:        # put x-bus in turbo mode
        !           334:        li 4,0xf1 ; stb 4,0x400(3) ; eieio
        !           335: 
        !           336: 
        !           337:        # select sio serial1
        !           338:        li 4,7 ; stb 4,0x2e(3) ; eieio ; li 4,3 ; stb 4,0x2f(3) ; eieio
        !           339: 
        !           340:        # set base address to 3f8
        !           341:        li 4,0x60 ; stb 4,0x2e(3) ; eieio ; li 4,3 ; stb 4,0x2f(3) ; eieio
        !           342: 
        !           343:        # enable device
        !           344:        li 4,0x30 ; stb 4,0x2e(3) ; eieio ; li 4,1 ; stb 4,0x2f(3) ; eieio
        !           345: 
        !           346:        # read ID register: only if it is a PC87427, enable serial2
        !           347:        li 4,0x20 ; stb 4,0x2e(3) ; eieio ; lbz 4,0x2f(3) ; cmpdi 4,0xf2 ; bne 0f
        !           348: 
        !           349:        # select sio serial2
        !           350:        li 4,7 ; stb 4,0x2e(3) ; eieio ; li 4,2 ; stb 4,0x2f(3) ; eieio
        !           351: 
        !           352:        # set base address to 2f8
        !           353:        li 4,0x60 ; stb 4,0x2e(3) ; eieio ; li 4,2 ; stb 4,0x2f(3) ; eieio
        !           354: 
        !           355:        # enable device
        !           356:        li 4,0x30 ; stb 4,0x2e(3) ; eieio ; li 4,1 ; stb 4,0x2f(3) ; eieio
        !           357: 
        !           358:        # uart @0x2f8
        !           359:        addi 3,3,0x2f8
        !           360: 
        !           361:        # disable interrupts, fifo off
        !           362:        li 4,0 ; stb 4,1(3) ; eieio ; stb 4,2(3) ; eieio
        !           363: 
        !           364:        # set serial speed
        !           365:        li 4,0x80 ; stb 4,3(3) ; eieio
        !           366:        li 4,115200/19200 ; stb 4,0(3) ; eieio ; li 4,0 ; stb 4,1(3) ; eieio
        !           367: 
        !           368:        # set 8-N-1, set RTS and DTR
        !           369:        li 4,3 ; stb 4,3(3) ; eieio ; stb 4,4(3) ; eieio
        !           370: 
        !           371:        eieio
        !           372: 
        !           373:        addi 3,3,-0x2f8
        !           374: 
        !           375:        # uart @0x3f8
        !           376: 0:     addi 3,3,0x3f8
        !           377: 
        !           378:        # disable interrupts, fifo off
        !           379:        li 4,0 ; stb 4,1(3) ; eieio ; stb 4,2(3) ; eieio
        !           380: 
        !           381:        # set serial speed
        !           382:        li 4,0x80 ; stb 4,3(3) ; eieio
        !           383:        li 4,115200/19200 ; stb 4,0(3) ; eieio ; li 4,0 ; stb 4,1(3) ; eieio
        !           384: 
        !           385:        # set 8-N-1, set RTS and DTR
        !           386:        li 4,3 ; stb 4,3(3) ; eieio ; stb 4,4(3) ; eieio
        !           387: 
        !           388:        eieio
        !           389: 
        !           390:        # save UART base for putc routine
        !           391: 0:     mr 13,3
        !           392: 
        !           393:        blr
        !           394: 
        !           395: 
        !           396: 
        !           397: 
        !           398: # set the HID registers of the 970 for optimally executing from flash
        !           399: setup_cpu:
        !           400: 
        !           401:        /* clear all the HV cruft */
        !           402:        li      r0, 0
        !           403:        sync
        !           404:        mtspr   HID4, r0
        !           405:        isync
        !           406: 
        !           407:        /* enable dpm, disable attn insn, enable external mce
        !           408:         * first, try external time base; if clock doesn't run, switch to
        !           409:         * internal */
        !           410:        li      r0, 1                   /* do the setup for external timebase */
        !           411:        rldicl  r0, r0, 44, 0           /* bit 19 has to be set */
        !           412:        oris    r0, r0, 0x8000          /* Enable external machine check */
        !           413:                                        /* interrupts (preferred state */
        !           414:                                        /* equals `1'). */
        !           415:        sync
        !           416:        mtspr   HID0, r0
        !           417:        isync
        !           418: 
        !           419:        mftb    r3                      /* read the timebase */
        !           420:        li      r1, 0x4000              /* wait long enough for the external */
        !           421:        mtctr   r1                      /* timebase (14MHz) to tick a bit */
        !           422:        bdnz    $                       /* 0x4000 seems to be enough (for now) */
        !           423:        mftb    r4                      /* read the timebase a second time */
        !           424:        cmpld   r3, r4                  /* see if it changed */
        !           425:        bne     0f
        !           426:        /* timebase did not change, do the setup for internal */
        !           427:        rldicl  r0, r0, 19, 1
        !           428:        rldicl  r0, r0, 45, 0
        !           429:        sync
        !           430:        mtspr   HID0, r0
        !           431:        isync
        !           432: 
        !           433: 0:
        !           434:        /* enable insn prefetch, speculative table walks */
        !           435:        mfspr   r0, HID1
        !           436:        rldicl  r0, r0, 20, 0
        !           437:        ori     r0, r0, 0x1002
        !           438:        mfsprg  r3, 1                   /* read rombase */
        !           439:        cmpdi   r3, 0                   /* check if running from ram */
        !           440:        bne     0f
        !           441:        /* running from ram */
        !           442:        /* Enable instruction fetch cacheability control */
        !           443:        ori     r0, r0, 0x200
        !           444: 0:
        !           445:        rldicl  r0, r0, 44, 0
        !           446:        sync
        !           447:        mtspr   HID1, r0
        !           448:        isync
        !           449: 
        !           450:        /* enable cache parity */
        !           451:        mfspr   r0, HID4
        !           452:        oris    r0, r0, 0xfff0
        !           453:        xoris   r0, r0, 0xfff0
        !           454:        sync
        !           455:        mtspr   HID4, r0
        !           456:        isync
        !           457: 
        !           458:        /* exception offset at 0 */
        !           459:        li      r3, 0
        !           460:        mtspr   HIOR, r3
        !           461: 
        !           462:        blr
        !           463: 
        !           464: C_ENTRY(proceedInterrupt)
        !           465: 
        !           466:        ld      r3,exception_stack_frame@got(r2)
        !           467:        ld      r1,0(r3)
        !           468: 
        !           469:        .irp i, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, \
        !           470:                17, 18, 19, 20, 21, 22, 23, 24, 25, 26, \
        !           471:                27, 28, 29, 30, 31
        !           472:        ld      r\i, 0x30+\i*8 (r1)
        !           473:        .endr
        !           474: 
        !           475:        ld      r14,0x138(r1);
        !           476:        mtsrr0  r14
        !           477: 
        !           478:        ld      r14,0x140(r1);
        !           479:        mtsrr1  r14
        !           480: 
        !           481:        ld      r14,0x148(r1);
        !           482:        mtcr    r14
        !           483: 
        !           484: 
        !           485:        ld 0,XVECT_M_HANDLER(0)
        !           486:        mtctr 0
        !           487: 
        !           488:        ld      r0,0x30(r1); # restore vector number
        !           489:        ld      r1,0x38(r1);
        !           490: 
        !           491:        bctr
        !           492: 
        !           493: intHandler2C:
        !           494:        mtctr   r1 # save old stack pointer
        !           495:        lis     r1,0x4
        !           496:        stdu    r1, -0x160(r1)
        !           497:        .irp i, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, \
        !           498:                17, 18, 19, 20, 21, 22, 23, 24, 25, 26, \
        !           499:                27, 28, 29, 30, 31
        !           500:        std     r\i, 0x30+\i*8 (r1)
        !           501:        .endr
        !           502: 
        !           503:        std     r0,0x30(r1);  # save vector number
        !           504: 
        !           505:        mfctr   r14
        !           506:        std     r14,0x38(r1); # save old r1
        !           507: 
        !           508:        mfsrr0  r14
        !           509:        std     r14,0x138(r1);
        !           510: 
        !           511:        mfsrr1  r14
        !           512:        std     r14,0x140(r1);
        !           513: 
        !           514:        mfcr    r14
        !           515:        std     r14,0x148(r1);
        !           516: 
        !           517:        mfxer   r14
        !           518:        std     r14,0x150(r1);
        !           519: 
        !           520:        bl toc_init
        !           521: 
        !           522:        ld      r3,exception_stack_frame@got(r2)
        !           523:        std     r1,0(r3)
        !           524: 
        !           525: 
        !           526:        mr      r3,r0
        !           527:        bl .c_interrupt
        !           528: 
        !           529:        ld      r14,0x138(r1);
        !           530:        mtsrr0  r14
        !           531: 
        !           532:        ld      r14,0x140(r1);
        !           533:        mtsrr1  r14
        !           534: 
        !           535:        ld      r14,0x148(r1);
        !           536:        mtcr    r14
        !           537: 
        !           538:        ld      r14,0x150(r1);
        !           539:        mtxer   r14
        !           540: 
        !           541: 
        !           542:        .irp i, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, \
        !           543:                17, 18, 19, 20, 21, 22, 23, 24, 25, 26, \
        !           544:                27, 28, 29, 30, 31
        !           545:        ld      r\i, 0x30+\i*8 (r1)
        !           546:        .endr
        !           547: 
        !           548:        ld      r1,0x38(r1);
        !           549: 
        !           550:        mfsprg  r0,2
        !           551:        mtctr   r0
        !           552:        mfsprg  r0,3
        !           553:        mtlr    r0
        !           554:        mfsprg  r0,0
        !           555:        rfid
        !           556: 
        !           557: /* Set exception handler for given exception vector.  
        !           558:        r3:     exception vector offset
        !           559:        r4:     exception handler
        !           560: */
        !           561:        .globl .set_exception
        !           562: .set_exception:
        !           563:        .globl set_exception
        !           564: set_exception:
        !           565:     ld r4,0x0(r4)
        !           566:        .globl .set_exception_asm
        !           567: .set_exception_asm:
        !           568:        .globl set_exception_asm
        !           569: set_exception_asm:
        !           570:        std     r4, 0x60(r3)    # fixme diff 1f - 0b
        !           571:        blr
        !           572: 
        !           573: 
        !           574: setup_mem_u3:
        !           575:        li 4,0x2000 ; oris 4,4,0xf800
        !           576: 
        !           577:        # MemTimingParam -- CAS lat 2.5 / 4 (read-to-read / read-to-write)
        !           578:        lis 3,0x49e1 ; ori 3,3,0xa000 ; stw 3,0x50(4)
        !           579: 
        !           580:        # MRSRegCntl -- CAS lat 2.5
        !           581:        li 3,0x6a ; stw 3,0xf0(4)
        !           582: 
        !           583:        # MemBusConfig -- 128 bit bus
        !           584:        lis 3,0x8500 ; stw 3,0x190(4)
        !           585: 
        !           586:        # CKDelAdj -- clock delay 75
        !           587:        lis 3,0x12c3 ; ori 3,3,0x30cc ; stw 3,0x520(4)
        !           588: 
        !           589:        # IOModeCntl -- no termination on differential and 3-state drivers
        !           590:        lis 3,0x0350 ; stw 3,0x530(4)
        !           591: 
        !           592:        li 3,18 ; mtctr 3 ; addi 5,4,0x5f0
        !           593: 0:     # DQSDelAdj -- read delay offset -10
        !           594:        lis 3,0x3d8f ; ori 3,3,0x6000 ; stwu 3,0x10(5)
        !           595: 
        !           596:        # DQSDataDelAdj -- write delay offset -32, write data delay offset +15
        !           597:        lis 3,0x380e ; ori 3,3,0x003c ; stwu 3,0x10(5)
        !           598:        bdnz 0b
        !           599: 
        !           600:        # MemProgCntl -- set all
        !           601:        lis 3,0xc000 ; stw 3,0xe0(4)
        !           602: 
        !           603:        eieio
        !           604: 
        !           605:        blr
        !           606: 
        !           607: 
        !           608: # read dimm SPDs, program memory size and type
        !           609: setup_mem_size:
        !           610:        mflr 14
        !           611: 
        !           612:        li 15,0 ; oris 15,15,0xf800 ; li 17,0
        !           613:        li 3,0xa0 ; li 4,3 ; li 5,3 ; bl i2c_read
        !           614:        mr 16,4 ; cmpdi 3,0 ; beq 0f ; li 16,0
        !           615: 0:     li 3,0xa2 ; li 4,3 ; li 5,3 ; bl i2c_read
        !           616:        cmpd 16,4 ; bne 0f ; cmpdi 3,0 ; beq 1f
        !           617: 0:     li 16,0x1e00
        !           618: 1:     #li 3,0xd ; bl print_byte ; li 3,0xa ; bl print_byte
        !           619:        #mr 3,16 ; bl print_hex
        !           620: 
        !           621:        #li 3,0x20 ; bl print_byte
        !           622:        sldi 3,16,7 ; add 3,3,16 ; rlwinm 3,3,10,0,6 ; subis 3,3,0x3c00
        !           623:        stw 3,0x21c0(15) ; andi. 0,16,2 ; beq 0f ; stw 3,0x21e0(15)
        !           624: 0:     #bl print_hex
        !           625:        sldi 3,16,8 ; add 3,3,16 ; rldicl 3,3,48,56 ; li 0,8 ; slw 3,0,3
        !           626:                # slw, not sld, so that empty/bad banks translate into size 0
        !           627:        stw 17,0x21d0(15) ; bl add17173 ; stw 17,0x21f0(15)
        !           628:        andi. 0,16,2 ; beq 0f ; bl add17173
        !           629: 0:     #bl print_hex
        !           630: 
        !           631:        li 3,0xa4 ; li 4,3 ; li 5,3 ; bl i2c_read
        !           632:        mr 16,4 ; cmpdi 3,0 ; beq 0f ; li 16,0
        !           633: 0:     li 3,0xa6 ; li 4,3 ; li 5,3 ; bl i2c_read
        !           634:        cmpd 16,4 ; bne 0f ; cmpdi 3,0 ; beq 1f
        !           635: 0:     li 16,0x1e00
        !           636: 1:     #li 3,0xd ; bl print_byte ; li 3,0xa ; bl print_byte
        !           637:        #mr 3,16 ; bl print_hex
        !           638: 
        !           639:        #li 3,0x20 ; bl print_byte
        !           640:        sldi 3,16,7 ; add 3,3,16 ; rlwinm 3,3,10,0,6 ; subis 3,3,0x3c00
        !           641:        stw 3,0x2200(15) ; andi. 0,16,2 ; beq 0f ; stw 3,0x2220(15)
        !           642: 0:     #bl print_hex
        !           643:        sldi 3,16,8 ; add 3,3,16 ; rldicl 3,3,48,56 ; li 0,8 ; slw 3,0,3
        !           644:        stw 17,0x2210(15) ; bl add17173 ; stw 17,0x2230(15)
        !           645:        andi. 0,16,2 ; beq 0f ; bl add17173
        !           646: 0:     #bl print_hex
        !           647:        #mr 3,17 ; bl print_hex
        !           648:        stw 17,0x2250(15) ; stw 17,0x2270(15)
        !           649:        stw 17,0x2290(15) ; stw 17,0x22b0(15)
        !           650: 
        !           651:        mtlr 14
        !           652:        blr
        !           653: 
        !           654: 
        !           655: 
        !           656: 
        !           657: # print GPR3 as 8-digit hex.  uses GPR18,19
        !           658: print_hex:
        !           659:        mflr 18 ; mr 19,3 ; li 3,8 ; mtctr 3
        !           660: 1:     rlwinm 3,19,4,28,31 ; sldi 19,19,4
        !           661:        cmpdi 3,0xa ; blt 0f ; addi 3,3,0x27
        !           662: 0:     addi 3,3,0x30 ; bl putc
        !           663:        bdnz 1b ; mtlr 18 ; blr
        !           664: 
        !           665: 
        !           666: # i2c stuff uses GPR20..GPR24
        !           667: 
        !           668: # terminate any i2c transaction, at any point during that transaction
        !           669: i2c_stop:
        !           670: 0:     lwz 3,0x30(20) ; stw 3,0x30(20) ; andi. 3,3,4 ; beq 0b
        !           671:        mr 3,21 ; mr 4,22 ; mtlr 24 ; eieio ; blr
        !           672: 
        !           673: # do a combined-mode read
        !           674: # in: GPR3 = addr, GPR4 = subaddr, GPR5 = len
        !           675: # out: GPR3 = error, GPR4 = result (right-aligned, msb)
        !           676: i2c_read:
        !           677:        mflr 24
        !           678:        li 20,0x1000 ; oris 20,20,0xf800        # uni-n i2c base
        !           679:        mr 21,3 ; mr 22,4 ; mr 23,5             # save params
        !           680:        li 4,0xc ; stw 4,0(20)                  # set mode (combined)
        !           681:        ori 4,21,1 ; stw 4,0x50(20)             # set addr, read
        !           682:        stw 22,0x60(20)                         # set subaddr
        !           683:        li 4,2 ; stw 4,0x10(20) ; eieio         # start address phase
        !           684:        li 21,1                                 # error
        !           685:        li 22,0                                 # result accumulator
        !           686: 0:     lwz 3,0x30(20) ; andi. 3,3,2 ; beq 0b   # wait until sent
        !           687:        lwz 3,0x20(20) ; andi. 3,3,2 ; beq i2c_stop # check result
        !           688:        li 4,1 ; cmpdi 23,1 ; bne 0f ; li 4,0
        !           689: 0:     stw 4,0x10(20)                          # AAK for next byte (or not)
        !           690:        li 4,2 ; stw 4,0x30(20) ; eieio         # ack address phase
        !           691: i2c_read_loop:
        !           692:        lwz 3,0x30(20) ; andi. 3,3,1 ; beq 1f   # if byte recv'd:
        !           693:        subi 23,23,1 ; sldi 22,22,8             # shift byte accum
        !           694:        lwz 3,0x70(20) ; rlwimi 22,3,0,24,31    # get byte
        !           695:        cmpdi 23,0 ; bne 0f ; li 21,0 ; b i2c_stop # all done
        !           696: 0:     li 4,1 ; cmpdi 23,1 ; bne 0f ; li 4,0
        !           697: 0:      stw 4,0x10(20)                         # AAK for next byte (or not)
        !           698:        li 4,1 ; stw 4,0x30(20) ; eieio         # ack data phase
        !           699: 1:     lwz 3,0x30(20) ; andi. 3,3,4 ; beq i2c_read_loop
        !           700:        li 4,0 ; stw 4,0x10(20) ; eieio ; b i2c_stop # stop bit received
        !           701: 
        !           702: add17173: # add GPR3 into GPR17; if passing 2GB (0x10000000), add another 2GB.
        !           703:        lis 0,0x1000 ; cmpld 17,0 ; add 17,17,3 ; bgtlr
        !           704:        cmpld 17,0 ; blelr ; add 17,17,0 ; blr
        !           705: 
        !           706: io_log_init:
        !           707:        LOAD64(r3, SB_NVRAM_adr)
        !           708:        b checkinitLog

unix.superglobalmegacorp.com

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