/*==================================================================== * os_pi.h * * Copyright 1995, Silicon Graphics, Inc. * All Rights Reserved. * * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, * Inc.; the contents of this file may not be disclosed to third * parties, copied or duplicated in any form, in whole or in part, * without the prior written permission of Silicon Graphics, Inc. * * RESTRICTED RIGHTS LEGEND: * Use, duplication or disclosure by the Government is subject to * restrictions as set forth in subdivision (c)(1)(ii) of the Rights * in Technical Data and Computer Software clause at DFARS * 252.227-7013, and/or in similar or successor clauses in the FAR, * DOD or NASA FAR Supplement. Unpublished - rights reserved under the * Copyright Laws of the United States. *====================================================================*/ /*---------------------------------------------------------------------* Copyright (C) 1998 Nintendo. (Originated by SGI) $RCSfile: os_pi.h,v $ $Revision: 1.1 $ $Date: 1998/10/09 08:01:16 $ *---------------------------------------------------------------------*/ #ifndef _OS_PI_H_ #define _OS_PI_H_ #ifdef _LANGUAGE_C_PLUS_PLUS extern "C" { #endif #include #include "os_thread.h" #include "os_message.h" #if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) /************************************************************************** * * Type definitions * */ /* * Structure for Enhanced PI interface */ /* * OSTranxInfo is set up for Leo Disk DMA. This info will be maintained * by exception handler. This is how the PIMGR and the ISR communicate. */ typedef struct { u32 errStatus; /* error status */ void *dramAddr; /* RDRAM buffer address (DMA) */ void *C2Addr; /* C2 buffer address */ u32 sectorSize; /* size of transfering sector */ u32 C1ErrNum; /* total # of C1 errors */ u32 C1ErrSector[4]; /* error sectors */ } __OSBlockInfo; // size = 0x24 typedef struct { u32 cmdType; /* for disk only */ u16 transferMode; /* Block, Track, or sector? */ u16 blockNum; /* which block is transfering */ s32 sectorNum; /* which sector is transfering */ u32 devAddr; /* Device buffer address */ u32 bmCtlShadow; /* asic bm_ctl(510) register shadow ram */ u32 seqCtlShadow; /* asic seq_ctl(518) register shadow ram */ __OSBlockInfo block[2]; /* bolck transfer info */ } __OSTranxInfo; // size = 0x60 typedef struct OSPiHandle_s { struct OSPiHandle_s *next; /* point to next handle on the table */ u8 type; /* DEVICE_TYPE_BULK for disk */ u8 latency; /* domain latency */ u8 pageSize; /* domain page size */ u8 relDuration; /* domain release duration */ u8 pulse; /* domain pulse width */ u8 domain; /* which domain */ u32 baseAddress; /* Domain address */ u32 speed; /* for roms only */ /* The following are "private" elements" */ __OSTranxInfo transferInfo; /* for disk only */ } OSPiHandle; // size = 0x74 typedef struct { u8 type; u32 address; } OSPiInfo; /* * Structure for I/O message block */ typedef struct { u16 type; /* Message type */ u8 pri; /* Message priority (High or Normal) */ u8 status; /* Return status */ OSMesgQueue *retQueue; /* Return message queue to notify I/O * completion */ } OSIoMesgHdr; typedef struct { OSIoMesgHdr hdr; /* Message header */ void * dramAddr; /* RDRAM buffer address (DMA) */ u32 devAddr; /* Device buffer address (DMA) */ u32 size; /* DMA transfer size in bytes */ OSPiHandle *piHandle; /* PI device handle */ } OSIoMesg; /* * Structure for device manager block */ typedef struct { s32 active; /* Status flag */ OSThread *thread; /* Calling thread */ OSMesgQueue *cmdQueue; /* Command queue */ OSMesgQueue *evtQueue; /* Event queue */ OSMesgQueue *acsQueue; /* Access queue */ /* Raw DMA routine */ s32 (*dma)(s32, u32, void *, u32); s32 (*edma)(OSPiHandle *, s32, u32, void *, u32); } OSDevMgr; #endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ /************************************************************************** * * Global definitions * */ /* Flags to indicate direction of data transfer */ #define OS_READ 0 /* device -> RDRAM */ #define OS_WRITE 1 /* device <- RDRAM */ #define OS_OTHERS 2 /* for Leo disk only */ /* * I/O message types */ #define OS_MESG_TYPE_BASE (10) #define OS_MESG_TYPE_LOOPBACK (OS_MESG_TYPE_BASE+0) #define OS_MESG_TYPE_DMAREAD (OS_MESG_TYPE_BASE+1) #define OS_MESG_TYPE_DMAWRITE (OS_MESG_TYPE_BASE+2) #define OS_MESG_TYPE_VRETRACE (OS_MESG_TYPE_BASE+3) #define OS_MESG_TYPE_COUNTER (OS_MESG_TYPE_BASE+4) #define OS_MESG_TYPE_EDMAREAD (OS_MESG_TYPE_BASE+5) #define OS_MESG_TYPE_EDMAWRITE (OS_MESG_TYPE_BASE+6) /* * I/O message priority */ #define OS_MESG_PRI_NORMAL 0 #define OS_MESG_PRI_HIGH 1 /* * PI/EPI */ #define PI_DOMAIN1 0 #define PI_DOMAIN2 1 #if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) /************************************************************************** * * Macro definitions * */ /************************************************************************** * * Extern variables * */ extern OSPiHandle *__osPiTable; /* The head of OSPiHandle link list */ /************************************************************************** * * Function prototypes * */ /* Peripheral interface (Pi) */ extern u32 osPiGetStatus(void); extern s32 osPiGetDeviceType(void); extern s32 osPiWriteIo(u32, u32); extern s32 osPiReadIo(u32, u32 *); extern s32 osPiStartDma(OSIoMesg *, s32, s32, u32, void *, u32, OSMesgQueue *); extern void osCreatePiManager(OSPri, OSMesgQueue *, OSMesg *, s32); /* Enhanced PI interface */ extern OSPiHandle *osCartRomInit(void); extern OSPiHandle *osLeoDiskInit(void); extern OSPiHandle *osDriveRomInit(void); extern s32 osEPiDeviceType(OSPiHandle *, OSPiInfo *); extern s32 osEPiWriteIo(OSPiHandle *, u32 , u32 ); extern s32 osEPiReadIo(OSPiHandle *, u32 , u32 *); extern s32 osEPiStartDma(OSPiHandle *, OSIoMesg *, s32); extern s32 osEPiLinkHandle(OSPiHandle *); #endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ #ifdef _LANGUAGE_C_PLUS_PLUS } #endif #endif /* !_OS_PI_H_ */