548 lines
12 KiB
C
548 lines
12 KiB
C
// -----------------------------------------------------------------------------
|
||
//
|
||
// Copyright (c) 1992 Olivetti
|
||
//
|
||
// File: arceisa.h
|
||
//
|
||
// Description: ARC-EISA Addendum Structures and Defines.
|
||
//
|
||
// -----------------------------------------------------------------------------
|
||
|
||
|
||
//
|
||
// Define the EISA firmware entry points
|
||
//
|
||
|
||
typedef enum _EISA_FIRMWARE_ENTRY
|
||
{
|
||
ProcessEOIRoutine,
|
||
TestIntRoutine,
|
||
RequestDMARoutine,
|
||
AbortDMARoutine,
|
||
GetDMAStatusRoutine,
|
||
DoLockRoutine,
|
||
RequestBusMasterRoutine,
|
||
ReleaseBusMasterRoutine,
|
||
RequestCpuAccessToBusRoutine,
|
||
ReleaseCpuAccessToBusRoutine,
|
||
FlushCacheRoutine,
|
||
InvalidateCacheRoutine,
|
||
ReservedRoutine,
|
||
BeginCriticalSectionRoutine,
|
||
EndCriticalSectionRoutine,
|
||
GenerateToneRoutine,
|
||
FlushWriteBuffersRoutine,
|
||
YieldRoutine,
|
||
StallProcessorRoutine,
|
||
MaximumEisaRoutine
|
||
} EISA_FIRMWARE_ENTRY;
|
||
|
||
|
||
//
|
||
// Define EISA interrupt functions
|
||
//
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PEISA_PROCESS_EOI_RTN)
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN USHORT IRQ
|
||
);
|
||
|
||
typedef
|
||
BOOLEAN_ULONG
|
||
(*PEISA_TEST_INT_RTN)
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN USHORT IRQ
|
||
);
|
||
|
||
//
|
||
// Define EISA DMA functions
|
||
//
|
||
|
||
typedef enum _DMA_TRANSFER_TYPE
|
||
{
|
||
DmaVerify,
|
||
DmaWrite,
|
||
DmaRead,
|
||
DmaMaxType
|
||
} DMA_TRANSFER_TYPE, *PDMA_TRANSFER_TYPE;
|
||
|
||
typedef enum _DMA_TRANSFER_MODE
|
||
{
|
||
DmaDemand,
|
||
DmaSingle,
|
||
DmaBlock,
|
||
DmaCascade,
|
||
DmaMaxMode
|
||
} DMA_TRANSFER_MODE, *PDMA_TRANSFER_MODE;
|
||
|
||
typedef enum _DMA_TIMING_MODE
|
||
{
|
||
DmaIsaCompatible,
|
||
DmaTypeA,
|
||
DmaTypeB,
|
||
DmaBurst,
|
||
DmaMaxTiming
|
||
} DMA_TIMING_MODE, *PDMA_TIMING_MODE;
|
||
|
||
typedef enum _DMA_ADDRESSING_MODE
|
||
{
|
||
Dma8Bit,
|
||
Dma16sBit,
|
||
Dma32Bit,
|
||
Dma16Bit,
|
||
DmaMaxAddressing
|
||
} DMA_ADDRESSING_MODE, *PDMA_ADDRESSING_MODE;
|
||
|
||
typedef struct _DMA_TRANSFER
|
||
{
|
||
DMA_TRANSFER_MODE TransferMode;
|
||
ULONG ChannelNumber;
|
||
DMA_TRANSFER_TYPE TransferType;
|
||
ULONG Size;
|
||
PVOID Buffer;
|
||
} DMA_TRANSFER, *PDMA_TRANSFER;
|
||
|
||
typedef struct _DMA_STATUS
|
||
{
|
||
BOOLEAN_ULONG CompleteTransfer;
|
||
ULONG ByteTransferred;
|
||
} DMA_STATUS, *PDMA_STATUS;
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PEISA_REQ_DMA_XFER_RTN)
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN PDMA_TRANSFER pDmaTransfer
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PEISA_ABORT_DMA_RTN)
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN PDMA_TRANSFER pDmaTransfer
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PEISA_DMA_XFER_STATUS_RTN)
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN PDMA_TRANSFER pDmaTransfer,
|
||
OUT PDMA_STATUS pDmaStatus
|
||
);
|
||
|
||
//
|
||
// Define EISA lock function
|
||
//
|
||
|
||
typedef enum _EISA_LOCK_OPERATION
|
||
{
|
||
Exchange,
|
||
LockMaxOperation
|
||
} EISA_LOCK_OPERATION;
|
||
|
||
|
||
typedef enum _SEMAPHORE_SIZE
|
||
{
|
||
ByteSemaphore,
|
||
HalfWordSemaphore,
|
||
WordSemaphore,
|
||
MaxSemaphore
|
||
} SEMAPHORE_SIZE;
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PEISA_LOCK_RTN)
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN EISA_LOCK_OPERATION Operation,
|
||
IN PVOID Semaphore,
|
||
IN SEMAPHORE_SIZE SemaphoreSize,
|
||
IN PVOID OperationArgument,
|
||
OUT PVOID OperationResult
|
||
);
|
||
|
||
//
|
||
// Define EISA bus master functions.
|
||
//
|
||
|
||
typedef enum _BUS_MASTER_TRANSFER_TYPE
|
||
{
|
||
BusMasterWrite,
|
||
BusMasterRead,
|
||
BusMasterMaxType
|
||
} BUS_MASTER_TRANSFER_TYPE, *PBUS_MASTER_TRANSFER_TYPE;
|
||
|
||
typedef enum _ADDRESS_RESTRICTION
|
||
{
|
||
LimitNone,
|
||
Limit16Mb,
|
||
Limit4Gb,
|
||
LimitMax
|
||
} ADDRESS_RESTRICTION, *PADDRESS_RESTRICTION;
|
||
|
||
typedef struct _BUS_MASTER_TRANSFER
|
||
{
|
||
ADDRESS_RESTRICTION Limit;
|
||
ULONG SlotNumber;
|
||
BUS_MASTER_TRANSFER_TYPE TransferType;
|
||
ULONG Size;
|
||
PVOID Buffer;
|
||
} BUS_MASTER_TRANSFER, *PBUS_MASTER_TRANSFER;
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PEISA_REQUEST_BUS_MASTER_RTN)
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN PBUS_MASTER_TRANSFER pBusMasterTransfer,
|
||
OUT ULONG *TranslateBufferAddress
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PEISA_RELEASE_BUS_MASTER_RTN)
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN PBUS_MASTER_TRANSFER pBusMasterTransfer,
|
||
IN ULONG TranslateBufferAddress
|
||
);
|
||
|
||
//
|
||
// Define EISA slave functions
|
||
//
|
||
|
||
typedef struct _SLAVE_TRANSFER
|
||
{
|
||
ULONG SlotNumber;
|
||
ULONG Size;
|
||
ULONG Buffer;
|
||
} SLAVE_TRANSFER, *PSLAVE_TRANSFER;
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PEISA_REQUEST_CPU_TO_BUS_ACCESS_RTN)
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN PSLAVE_TRANSFER pSlaveTransfer,
|
||
OUT PVOID *TranslatedBufferAddress
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PEISA_RELEASE_CPU_TO_BUS_ACCESS_RTN)
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN PSLAVE_TRANSFER pSlaveTransfer,
|
||
IN PVOID TranslateBufferAddress
|
||
);
|
||
|
||
typedef
|
||
VOID
|
||
(*PEISA_FLUSH_CACHE_RTN)
|
||
(
|
||
IN PVOID Address,
|
||
IN ULONG Length
|
||
);
|
||
|
||
typedef
|
||
VOID
|
||
(*PEISA_INVALIDATE_CACHE_RTN)
|
||
(
|
||
IN PVOID Address,
|
||
IN ULONG Length
|
||
);
|
||
|
||
typedef
|
||
VOID
|
||
(*PEISA_RESERVED_RTN)
|
||
(
|
||
VOID
|
||
);
|
||
|
||
typedef
|
||
VOID
|
||
(*PEISA_BEGIN_CRITICAL_SECTION_RTN)
|
||
(
|
||
VOID
|
||
);
|
||
|
||
typedef
|
||
VOID
|
||
(*PEISA_END_CRITICAL_SECTION_RTN)
|
||
(
|
||
VOID
|
||
);
|
||
|
||
typedef
|
||
ARC_STATUS
|
||
(*PEISA_GENERATE_TONE_RTN)
|
||
(
|
||
IN ULONG Frequency,
|
||
IN ULONG Duration
|
||
);
|
||
|
||
typedef
|
||
VOID
|
||
(*PEISA_FLUSH_WRITE_BUFFER_RTN)
|
||
(
|
||
VOID
|
||
);
|
||
|
||
typedef
|
||
BOOLEAN_ULONG
|
||
(*PEISA_YIELD_RTN)
|
||
(
|
||
VOID
|
||
);
|
||
|
||
typedef
|
||
VOID
|
||
(*PEISA_STALL_PROCESSOR_RTN)
|
||
(
|
||
IN ULONG Duration
|
||
);
|
||
|
||
|
||
//
|
||
// Define EISA callback vectors prototypes.
|
||
//
|
||
|
||
ARC_STATUS
|
||
EisaProcessEndOfInterrupt
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN USHORT Irq
|
||
);
|
||
|
||
BOOLEAN_ULONG
|
||
EisaTestEisaInterrupt
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN USHORT Irq
|
||
);
|
||
|
||
ARC_STATUS
|
||
EisaRequestEisaDmaTransfer
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN PDMA_TRANSFER pDmaTransfer
|
||
);
|
||
|
||
ARC_STATUS
|
||
EisaAbortEisaDmaTransfer
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN PDMA_TRANSFER pDmaTransfer
|
||
);
|
||
|
||
ARC_STATUS
|
||
EisaGetEisaDmaTransferStatus
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN PDMA_TRANSFER pDmaTransfer,
|
||
OUT PDMA_STATUS pDmaStatus
|
||
);
|
||
|
||
ARC_STATUS
|
||
EisaDoLockedOperation
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN EISA_LOCK_OPERATION Operation,
|
||
IN PVOID Semaphore,
|
||
IN SEMAPHORE_SIZE SemaphoreSize,
|
||
IN PVOID OperationArgument,
|
||
OUT PVOID OperationResult
|
||
);
|
||
|
||
ARC_STATUS
|
||
EisaRequestEisaBusMasterTransfer
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN PBUS_MASTER_TRANSFER pBusMasterTransfer,
|
||
OUT ULONG *TranslatedBufferAddress
|
||
);
|
||
|
||
ARC_STATUS
|
||
EisaReleaseEisaBusMasterTransfer
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN PBUS_MASTER_TRANSFER pBusMasterTransfer,
|
||
IN ULONG TranslatedBufferAddress
|
||
);
|
||
|
||
ARC_STATUS
|
||
EisaRequestCpuAccessToEisaBus
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN PSLAVE_TRANSFER pSlaveTransfer,
|
||
OUT PVOID *TranslatedAddress
|
||
);
|
||
|
||
ARC_STATUS
|
||
EisaReleaseCpuAccessToEisaBus
|
||
(
|
||
IN ULONG BusNumber,
|
||
IN PSLAVE_TRANSFER pSlaveTransfer,
|
||
IN PVOID TranslatedAddress
|
||
);
|
||
|
||
VOID
|
||
EisaFlushCache
|
||
(
|
||
IN PVOID Address,
|
||
IN ULONG Length
|
||
);
|
||
|
||
VOID
|
||
EisaInvalidateCache
|
||
(
|
||
IN PVOID Address,
|
||
IN ULONG Length
|
||
);
|
||
|
||
VOID
|
||
EisaBeginCriticalSection
|
||
(
|
||
IN VOID
|
||
);
|
||
|
||
VOID
|
||
EisaEndCriticalSection
|
||
(
|
||
IN VOID
|
||
);
|
||
|
||
VOID
|
||
EisaFlushWriteBuffers
|
||
(
|
||
VOID
|
||
);
|
||
|
||
ARC_STATUS
|
||
EisaGenerateTone
|
||
(
|
||
IN ULONG Frequency,
|
||
IN ULONG Duration
|
||
);
|
||
|
||
BOOLEAN_ULONG
|
||
EisaYield
|
||
(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
EisaStallProcessor
|
||
(
|
||
IN ULONG Duration
|
||
);
|
||
|
||
|
||
//
|
||
// Define macros that call the EISA firmware routines indirectly through the
|
||
// EISA firmware vector and provide type checking of argument values.
|
||
//
|
||
|
||
#define ArcEisaProcessEndOfInterrupt(BusNumber, IRQ) \
|
||
((PEISA_PROCESS_EOI_RTN)(SYSTEM_BLOCK->Adapter0Vector[ProcessEOIRoutine])) \
|
||
((BusNumber), (IRQ))
|
||
|
||
#define ArcEisaTestEisaInterupt(BusNumber, IRQ) \
|
||
((PEISA_TEST_INT_RTN)(SYSTEM_BLOCK->Adapter0Vector[TestIntRoutine])) \
|
||
((BusNumber), (IRQ))
|
||
|
||
#define ArcEisaRequestEisaDmaTransfer(BusNumber, pDmaTransfer) \
|
||
((PEISA_REQ_DMA_XFER_RTN)(SYSTEM_BLOCK->Adapter0Vector[RequestDMARoutine])) \
|
||
((BusNumber), (pDmaTransfer))
|
||
|
||
#define ArcEisaAbortEisaDmaTransfer(BusNumber, pDmaTransfer) \
|
||
((PEISA_ABORT_DMA_RTN)(SYSTEM_BLOCK->Adapter0Vector[AbortDMARoutine])) \
|
||
((BusNumber), (pDmaTransfer))
|
||
|
||
#define ArcEisaGetEisaDmaTransferStatus(BusNumber, pDmaTransfer, pDmaStatus) \
|
||
((PEISA_DMA_XFER_STATUS_RTN)(SYSTEM_BLOCK->Adapter0Vector[GetDMAStatusRoutine])) \
|
||
((BusNumber), (pDmaTransfer), (pDmaStatus))
|
||
|
||
#define ArcEisaDoLockedOperation(BusNumber, Operation, Semaphore, SemaphoreSize, OperationArgument, OperationResult) \
|
||
((PEISA_LOCK_RTN)(SYSTEM_BLOCK->Adapter0Vector[DoLockRoutine])) \
|
||
((BusNumber), (Operation), (Semaphore), (SemaphoreSize), (OperationArgument), (OperationResult))
|
||
|
||
#define ArcEisaRequestEisaBusMasterTransferCPUAddressToBusAddress(BusNumber, pBusMasterTransfer, TranslateBufferAddress) \
|
||
((PEISA_REQUEST_BUS_MASTER_RTN)(SYSTEM_BLOCK->Adapter0Vector[RequestBusMasterRoutine])) \
|
||
((BusNumber), (pBusMasterTransfer), (TranslateBufferAddress))
|
||
|
||
#define ArcEisaReleaseEisaBusMasterTransfer(BusNumber, pBusMasterTransfer, TranslateBufferAddress) \
|
||
((PEISA_RELEASE_BUS_MASTER_RTN)(SYSTEM_BLOCK->Adapter0Vector[ReleaseBusMasterRoutine])) \
|
||
((BusNumber), (pBusMasterTransfer), (TranslateBufferAddress))
|
||
|
||
#define ArcEisaRequestCpuAccessToEisaBus(BusNumber, pSlaveTransfer, TranslatedBufferAddress) \
|
||
((PEISA_REQUEST_CPU_TO_BUS_ACCESS_RTN)(SYSTEM_BLOCK->Adapter0Vector[RequestCpuAccessToBusRoutine])) \
|
||
((BusNumber), (pSlaveTransfer), (TranslatedBufferAddress))
|
||
|
||
#define ArcEisaReleaseCpuAccessToEisaBus(BusNumber, pSlaveTransfer, TranslatedBufferAddress) \
|
||
((PEISA_RELEASE_CPU_TO_BUS_ACCESS_RTN)(SYSTEM_BLOCK->Adapter0Vector[ReleaseCpuAccessToBusRoutine])) \
|
||
((BusNumber), (pSlaveTransfer), (TranslatedBufferAddress))
|
||
|
||
#define ArcEisaFlushCache(Address, Length) \
|
||
((PEISA_FLUSH_CACHE_RTN)(SYSTEM_BLOCK->Adapter0Vector[FlushCacheRoutine])) \
|
||
((Address), (Length))
|
||
|
||
#define ArcEisaInvalidateCache(Address, Length) \
|
||
((PEISA_INVALIDATE_CACHE_RTN)(SYSTEM_BLOCK->Adapter0Vector[InvalidateCacheRoutine])) \
|
||
((Address), (Length))
|
||
|
||
#define ArcEisaBeginCriticalSection() \
|
||
((PEISA_BEGIN_CRITICAL_SECTION_RTN)(SYSTEM_BLOCK->Adapter0Vector[BeginCriticalSectionRoutine]))()
|
||
|
||
#define ArcEisaEndCriticalSection() \
|
||
((PEISA_END_CRITICAL_SECTION_RTN)(SYSTEM_BLOCK->Adapter0Vector[EndCriticalSectionRoutine]))()
|
||
|
||
#define ArcEisaGenerateTone() \
|
||
((PEISA_GENERATE_TONE_RTN)(SYSTEM_BLOCK->Adapter0Vector[GenerateToneRoutine])) \
|
||
((Freqency), (Duration))
|
||
|
||
#define ArcEisaFlushWriteBuffers() \
|
||
((PEISA_FLUSH_WRITE_BUFFER_RTN)(SYSTEM_BLOCK->Adapter0Vector[FlushWriteBuffersRoutine]))()
|
||
|
||
#define ArcEisaYield() \
|
||
((PEISA_YIELD_RTN)(SYSTEM_BLOCK->Adapter0Vector[YieldRoutine]))()
|
||
|
||
#define ArcEisaStallProcessor(Duration) \
|
||
((PEISA_STALL_PROCESSOR_RTN)(SYSTEM_BLOCK->Adapter0Vector[StallProcessorRoutine])) \
|
||
(Duration)
|
||
|
||
|
||
//
|
||
// General OMF defines
|
||
//
|
||
|
||
#define OMF_BLOCK_SIZE 512 // OMF block size in bytes
|
||
#define OMF_MAX_SIZE (32*1024*1024) // max OMF size in bytes
|
||
#define OMF_MAX_FILE_LEN ((16*1024*1024)/(1<<WORD_2P2)) // (16 Mbytes max)/4
|
||
#define OMF_MAX_FILE_LINK ((16*1024*1024)/(1<<WORD_2P2)) // (16 Mbytes max)/4
|
||
#define OMF_ID_1ST 0x55 // 1st OMF ID
|
||
#define OMF_ID_2ND 0x00 // 2nd OMF ID
|
||
#define OMF_ID_3RD 0xAA // 3rd OMF ID
|
||
#define OMF_ID_4TH 0xFF // 4th OMF ID
|
||
#define OMF_FILE_NAME_LEN 12 // 12 chars
|
||
|
||
//
|
||
// Define OMF FAT file name structure
|
||
//
|
||
typedef struct _OMF_FAT_FILE_NAME
|
||
{
|
||
CHAR ProductId[7];
|
||
CHAR Version;
|
||
CHAR Dot;
|
||
CHAR Extension[2];
|
||
CHAR Revision;
|
||
} OMF_FAT_FILE_NAME, *POMF_FAT_FILE_NAME;
|
||
|