rsp.c 2.74 KB
#include <ultra64.h>
#include <assert.h>
#include <PR/ramrom.h>
#include "gng.h"

#ifdef __sgi__
#include <bstring.h>
#endif
#include <sptask.h>
#include <os_internal.h>
#include "rcp.h"

extern int     __osSpDeviceBusy(void);
extern s32     __osSpRawWriteIo(u32 devAddr, u32 data);
extern s32     __osSpRawReadIo(u32 devAddr, u32 *data);
extern char    *rspcodeSegment;
extern OSIoMesg	dmaIOMessageBuf;
extern char    _rspcodeSegmentRomStart[];
extern OSMesgQueue  dmaMessageQ;
extern OSMesg  dummyMessage;

int rsp(void)
{
    u32 data;
    u32 status=0;
    int errCount = 0;
    int noErrCount = 0;
    int i, j;
    int offset = 0;
    u32 rom_addr;
    char message[256];
    char trapbit=0;
    
    if (ZaruReadReg2(REG_TRAPRSP) !=0) trapbit=1;
    
    rom_addr = (u32) _rspcodeSegmentRomStart;
    for (j=0; j<391; j++) {
	
	/*
	 * Start rom->rdram dma of RSP data (DMem) and
	 * wait for it to finish.  First 64 bit word is
	 * length in bytes of data.
	 */
	osPiStartDma(&dmaIOMessageBuf, OS_MESG_PRI_NORMAL, OS_READ,
		     rom_addr, rspcodeSegment, 0x1008, &dmaMessageQ);
	(void)osRecvMesg(&dmaMessageQ, &dummyMessage, OS_MESG_BLOCK);
	osWritebackDCacheAll();
	offset = *((u64 *) rspcodeSegment);
	rom_addr += offset + sizeof(u64);
	
	/* Load DMem */
	while(__osSpRawStartDma((u32) OS_WRITE,
				(u32) SP_DMEM_START,
				(u64 *) rspcodeSegment + 1,
				(u32) offset) == -1)
	    ;
	while(__osSpDeviceBusy())
	    ;

	/*
	 * Start rom->rdram dma of RSP code (IMem) and
	 * wait for it to finish.
	 */
	osPiStartDma(&dmaIOMessageBuf, OS_MESG_PRI_NORMAL, OS_READ,
		     rom_addr, rspcodeSegment, 0x1008, &dmaMessageQ);
	(void)osRecvMesg(&dmaMessageQ, &dummyMessage, OS_MESG_BLOCK);
	osWritebackDCacheAll();
	offset = *((u64 *) rspcodeSegment);
	rom_addr += offset + sizeof(u64);
	
	/* Load IMem */
	while(__osSpRawStartDma((u32) OS_WRITE,
				(u32) SP_IMEM_START,
				(u64 *) rspcodeSegment + 1, 
				(u32) SP_UCODE_SIZE) == -1)
	    ;
	while(__osSpDeviceBusy())
	    ;
	
	/*
	 * Set PC and run
	 */
	__osSpRawWriteIo(0x04080000, 0x00000000);   /* Initialize PC         */
	__osSpRawWriteIo(0x04040010, 0x00000005);   /* Clear break and halt  */
	do { 
	    __osSpRawReadIo(0x04040010, &status);   /* Check break status    */
	} while (!(status & 0x2));
	
	/* Check results in DMem */
	osWritebackDCacheAll();
	__osSpRawReadIo((0x04000f84), &data);
	
	if ((j==5) && (trapbit==1)) data=0; /* sasano trap */
	
	if (data!=0x0000feed && data!=0xfeed0000) {
	    errCount++;
	    sprintf(message, "RSP diagnostic\nsub-test %d failed\n", j);
	    gng_report(message, 1, GNG_PASS_FAIL_BIT, 0);
	} else {
	    noErrCount++;
	}
    }
    PRINTF("%d RSP tests out of 392 pass.\n", noErrCount+1);
    
    /*	if (ZaruReadReg2(REG_TRAPRSP) !=0) errCount++;*/
    return(errCount);
}