/*++ Copyright (c) 1993 Digital Equipment Corporation Module Name: fwcallbk.h Abstract: This module defines the firmware vendor vector callbacks that will be implemented on all Alpha AXP platforms. Author: John DeRosa [DEC] 10-December-1993 Revision History: 14-July-1994 John DeRosa [DEC] Added definitions for GetBusDataByOffset and SetBusDataByOffset. --*/ #ifndef _FWCALLBK_ #define _FWCALLBK_ // // This module contains typedefs, which are not parsable by the assembler. // #ifndef _LANGUAGE_ASSEMBLY #include "arc.h" // // Define the structure used to pass information to the // ECU, and other ARC applications. // typedef struct _ARC_INFORMATION { // // The version number of this structure definition. // ULONG Version; // // A pointer to an argv-like array. Each entry is a search path // string. // // This is used to pass to the ECU a list of directories to search // through for configuration files. The definition passed back to // the ECU depends on both the platform it is running on and the // operating system selection in effect at the time that the call // to VenReturnArcInformation is made. // // Rules: // // 1. The end of the search list is marked with a NULL. // 2. Each entry must be a subset of a valid FAT filesystem. // 3. Each entry must start with "\\". // 4. Each entry must end with an ECU configuration file // prefix character. (Currently, we use ! and A.) // // It is possible that other configuration utilities might want to // use this search path someday. // PUCHAR * SearchPath; PUCHAR Reserved1; PUCHAR Reserved2; PUCHAR Reserved3; PUCHAR Reserved4; } ARC_INFORMATION, *PARC_INFORMATION; #define ARC_INFORMATION_VERSION 0 // // Structure used to return system and processor information. // typedef struct _EXTENDED_SYSTEM_INFORMATION { ULONG ProcessorId; ULONG ProcessorRevision; ULONG ProcessorPageSize; ULONG NumberOfPhysicalAddressBits; ULONG MaximumAddressSpaceNumber; ULONG ProcessorCycleCounterPeriod; ULONG SystemRevision; UCHAR SystemSerialNumber[16]; UCHAR FirmwareVersion[16]; UCHAR FirmwareBuildTimeStamp[12]; // yymmdd.hhmm (Available as of 5.10) } EXTENDED_SYSTEM_INFORMATION, *PEXTENDED_SYSTEM_INFORMATION; // // Define structure used to call BIOS emulator. This mimics the // VIDEO_X86_BIOS_ARGUMENTS typedef in \nt\private\ntos\inc\video.h. // typedef struct X86_BIOS_ARGUMENTS { ULONG Eax; ULONG Ebx; ULONG Ecx; ULONG Edx; ULONG Esi; ULONG Edi; ULONG Ebp; } X86_BIOS_ARGUMENTS, *PX86_BIOS_ARGUMENTS; // // Define the firmware vendor specific entry point numbers that are // common to all Alpha AXP platforms. // typedef enum _VENDOR_GENERIC_ENTRY { AllocatePoolRoutine, StallExecutionRoutine, PrintRoutine, ReturnExtendedSystemInformationRoutine, VideoDisplayInitializeRoutine, EISAReadRegisterBufferUCHARRoutine, EISAWriteRegisterBufferUCHARRoutine, EISAReadPortUCHARRoutine, EISAReadPortUSHORTRoutine, EISAReadPortULONGRoutine, EISAWritePortUCHARRoutine, EISAWritePortUSHORTRoutine, EISAWritePortULONGRoutine, FreePoolRoutine, CallBiosRoutine, TranslateBusAddressRoutine, ReadPortUCHARRoutine, ReadPortUSHORTRoutine, ReadPortULONGRoutine, WritePortUCHARRoutine, WritePortUSHORTRoutine, WritePortULONGRoutine, ReadRegisterUCHARRoutine, ReadRegisterUSHORTRoutine, ReadRegisterULONGRoutine, WriteRegisterUCHARRoutine, WriteRegisterUSHORTRoutine, WriteRegisterULONGRoutine, GetBusDataByOffsetRoutine, SetBusDataByOffsetRoutine, WidePrintRoutine, ReturnLanguageIdRoutine, GetAdapterRoutine, AllocateCommonBufferRoutine, FreeCommonBufferRoutine, ReturnArcInformationRoutine, IssueSrbDirectRoutine, ReservedRoutine0, ReadWriteErrorFrameRoutine, MaximumVendorRoutine } VENDOR_GENERIC_ENTRY; // // Define vendor specific routine types. // typedef PVOID (*PVEN_ALLOCATE_POOL_ROUTINE) ( IN ULONG NumberOfBytes ); typedef VOID (*PVEN_STALL_EXECUTION_ROUTINE) ( IN ULONG Microseconds ); typedef ULONG (*PVEN_PRINT_ROUTINE) ( IN PCHAR Format, ... ); typedef ULONG (*PVEN_WIDE_PRINT_ROUTINE) ( IN PWCHAR Format, ... ); typedef LONG (*PVEN_RETURN_LANGUAGE_ID_ROUTINE) ( IN VOID ); typedef VOID (*PVEN_RETURN_EXTENDED_SYSTEM_INFORMATION_ROUTINE) ( OUT PEXTENDED_SYSTEM_INFORMATION SystemInfo ); typedef ARC_STATUS (*PVEN_VIDEO_DISPLAY_INITIALIZE_ROUTINE) ( OUT PVOID UnusedParameter ); typedef ULONG (*PVEN_EISA_READ_REGISTER_BUFFER_UCHAR_ROUTINE) ( IN ULONG BusNumber, IN ULONG Offset, OUT PVOID Buffer, IN ULONG Length ); typedef ULONG (*PVEN_EISA_WRITE_REGISTER_BUFFER_UCHAR_ROUTINE) ( IN ULONG BusNumber, IN ULONG Offset, OUT PVOID Buffer, IN ULONG Length ); typedef UCHAR (*PVEN_EISA_READ_PORT_UCHAR_ROUTINE) ( IN ULONG BusNumber, IN ULONG Offset ); typedef USHORT (*PVEN_EISA_READ_PORT_USHORT_ROUTINE) ( IN ULONG BusNumber, IN ULONG Offset ); typedef ULONG (*PVEN_EISA_READ_PORT_ULONG_ROUTINE) ( IN ULONG BusNumber, IN ULONG Offset ); typedef VOID (*PVEN_EISA_WRITE_PORT_UCHAR_ROUTINE) ( IN ULONG BusNumber, IN ULONG Offset, IN UCHAR Datum ); typedef VOID (*PVEN_EISA_WRITE_PORT_USHORT_ROUTINE) ( IN ULONG BusNumber, IN ULONG Offset, IN USHORT Datum ); typedef VOID (*PVEN_EISA_WRITE_PORT_ULONG_ROUTINE) ( IN ULONG BusNumber, IN ULONG Offset, IN ULONG Datum ); typedef VOID (*PVEN_FREE_POOL_ROUTINE) ( IN PVOID MemoryPointer ); typedef VOID (*PVEN_CALL_BIOS_ROUTINE) ( IN ULONG InterruptNumber, IN OUT PX86_BIOS_ARGUMENTS BiosArguments ); typedef BOOLEAN (*PVEN_TRANSLATE_BUS_ADDRESS_ROUTINE) ( IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN PHYSICAL_ADDRESS BusAddress, IN OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress ); typedef UCHAR (*PVEN_READ_PORT_UCHAR_ROUTINE) ( PUCHAR Port ); typedef USHORT (*PVEN_READ_PORT_USHORT_ROUTINE) ( PUSHORT Port ); typedef ULONG (*PVEN_READ_PORT_ULONG_ROUTINE) ( PULONG Port ); typedef VOID (*PVEN_WRITE_PORT_UCHAR_ROUTINE) ( PUCHAR Port, UCHAR Value ); typedef VOID (*PVEN_WRITE_PORT_USHORT_ROUTINE) ( PUSHORT Port, USHORT Value ); typedef VOID (*PVEN_WRITE_PORT_ULONG_ROUTINE) ( PULONG Port, ULONG Value ); typedef UCHAR (*PVEN_READ_REGISTER_UCHAR_ROUTINE) ( PUCHAR Register ); typedef USHORT (*PVEN_READ_REGISTER_USHORT_ROUTINE) ( PUSHORT Register ); typedef ULONG (*PVEN_READ_REGISTER_ULONG_ROUTINE) ( PULONG Register ); typedef VOID (*PVEN_WRITE_REGISTER_UCHAR_ROUTINE) ( PUCHAR Register, UCHAR Value ); typedef VOID (*PVEN_WRITE_REGISTER_USHORT_ROUTINE) ( PUSHORT Register, USHORT Value ); typedef VOID (*PVEN_WRITE_REGISTER_ULONG_ROUTINE) ( PULONG Register, ULONG Value ); typedef ULONG (*PVEN_GET_BUS_DATA_BY_OFFSET_ROUTINE) ( IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length ); typedef ULONG (*PVEN_SET_BUS_DATA_BY_OFFSET_ROUTINE) ( IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length ); typedef PADAPTER_OBJECT (*PVEN_GET_ADAPTER_ROUTINE) ( IN PDEVICE_DESCRIPTION DeviceDescription, IN OUT PULONG NumberOfMapRegisters ); typedef PVOID (*PVEN_ALLOCATE_COMMON_BUFFER_ROUTINE) ( IN PADAPTER_OBJECT AdapterObject, IN ULONG Length, OUT PPHYSICAL_ADDRESS LogicalAddress, IN BOOLEAN CacheEnabled ); typedef VOID (*PVEN_FREE_COMMON_BUFFER_ROUTINE) ( IN PADAPTER_OBJECT AdapterObject, IN ULONG Length, IN PHYSICAL_ADDRESS LogicalAddress, IN PVOID VirtualAddress, IN BOOLEAN CacheEnabled ); typedef ARC_STATUS (*PVEN_RETURN_ARC_INFORMATION_ROUTINE) ( OUT PARC_INFORMATION ArcInformation ); typedef ARC_STATUS (*PVEN_ISSUE_SRB_DIRECT_ROUTINE) ( UCHAR ScsiAdapterId, UCHAR PathId, UCHAR TargetId, UCHAR LunId, PVOID Srb, PVOID BufferAddress, ULONG BufferLength, BOOLEAN WriteToDevice ); typedef ARC_STATUS (*PVEN_READ_WRITE_ERROR_FRAME_ROUTINE) ( ULONG ReadWrite, ULONG FrameType, PVOID FrameAddress, PLONG FrameSize, ULONG FrameNumber ); // // Define the stub function prototypes necessary to interface with the // 32-bit firmware on 64-bit systems. // // These routines are required for the 64-bit system until (if) 64-bit // firmware is ever supplied. // #if defined(_AXP64_) && defined(_NTHAL_) VOID HalpVenCallBios( IN ULONG InterruptNumber, IN OUT PX86_BIOS_ARGUMENTS BiosArguments ); ARC_STATUS HalpVenReadWriteErrorFrame( IN ULONG ReadWrite, IN ULONG FrameType, IN OUT PVOID FrameAddress, IN OUT PLONG FrameSize, IN ULONG FrameNumber ); VOID HalpVenVideoDisplayInitialize( OUT PVOID UnusedParameter ); #endif // // Define vendor specific macros for use by programs that run on // Alpha AXP NT firmware. // // These calls are guaranteed to return legitimate values. If a function // is not defined for a particular platform, it will return with an error // code or just return normally, as appropriate. // #define VenAllocatePool(NumberOfBytes) \ ((PVEN_ALLOCATE_POOL_ROUTINE)(SYSTEM_BLOCK->VendorVector[AllocatePoolRoutine])) \ ((NumberOfBytes)) #define VenStallExecution(Microseconds) \ ((PVEN_STALL_EXECUTION_ROUTINE)(SYSTEM_BLOCK->VendorVector[StallExecutionRoutine])) \ ((Microseconds)) #define VenReturnLanguageId \ ((PVEN_RETURN_LANGUAGE_ID_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReturnLanguageIdRoutine])) #define VenWPrint \ ((PVEN_WIDE_PRINT_ROUTINE)(SYSTEM_BLOCK->VendorVector[WidePrintRoutine])) #define VenPrint \ ((PVEN_PRINT_ROUTINE)(SYSTEM_BLOCK->VendorVector[PrintRoutine])) // // N.B. VenPrint1 and VenPrint2 are retained here for backwards compatibility. // #define VenPrint1 VenPrint #define VenPrint2 VenPrint #define VenReturnExtendedSystemInformation(x) \ ((PVEN_RETURN_EXTENDED_SYSTEM_INFORMATION_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReturnExtendedSystemInformationRoutine]))(x) #if defined(_AXP64_) && defined(_NTHAL_) __inline VOID VenVideoDisplayInitialize( OUT PVOID UnusedParameter ) { KIRQL OldIrql = FwAcquireFirmwareLock(); HalpVenVideoDisplayInitialize(UnusedParameter); FwReleaseFirmwareLock(OldIrql); return; } #else #define VenVideoDisplayInitialize(x) \ ((PVEN_VIDEO_DISPLAY_INITIALIZE_ROUTINE)(SYSTEM_BLOCK->VendorVector[VideoDisplayInitializeRoutine]))(x) #endif #define VenEISAReadRegisterBufferUCHAR(BusNumber, Offset, Buffer, Length) \ ((PVEN_EISA_READ_REGISTER_BUFFER_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAReadRegisterBufferUCHARRoutine])) \ ((BusNumber), (Offset), (Buffer), (Length)) #define VenEISAWriteRegisterBufferUCHAR(BusNumber, Offset, Buffer, Length) \ ((PVEN_EISA_WRITE_REGISTER_BUFFER_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAWriteRegisterBufferUCHARRoutine])) \ ((BusNumber), (Offset), (Buffer), (Length)) #define VenEISAReadPortUCHAR(BusNumber, Offset) \ ((PVEN_EISA_READ_PORT_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAReadPortUCHARRoutine])) \ ((BusNumber), (Offset)) #define VenEISAReadPortUSHORT(BusNumber, Offset) \ ((PVEN_EISA_READ_PORT_USHORT_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAReadPortUSHORTRoutine])) \ ((BusNumber), (Offset)) #define VenEISAReadPortULONG(BusNumber, Offset) \ ((PVEN_EISA_READ_PORT_ULONG_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAReadPortULONGRoutine])) \ ((BusNumber), (Offset)) #define VenEISAWritePortUCHAR(BusNumber, Offset, Datum) \ ((PVEN_EISA_WRITE_PORT_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAWritePortUCHARRoutine])) \ ((BusNumber), (Offset), (Datum)) #define VenEISAWritePortUSHORT(BusNumber, Offset, Datum) \ ((PVEN_EISA_WRITE_PORT_USHORT_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAWritePortUSHORTRoutine])) \ ((BusNumber), (Offset), (Datum)) #define VenEISAWritePortULONG(BusNumber, Offset, Datum) \ ((PVEN_EISA_WRITE_PORT_ULONG_ROUTINE)(SYSTEM_BLOCK->VendorVector[EISAWritePortULONGRoutine])) \ ((BusNumber), (Offset), (Datum)) #define VenFreePool(MemoryPointer) \ ((PVEN_FREE_POOL_ROUTINE)(SYSTEM_BLOCK->VendorVector[FreePoolRoutine])) \ ((MemoryPointer)) #if defined(_AXP64_) && defined(_NTHAL_) __inline VOID VenCallBios( IN ULONG InterruptNumber, IN OUT PX86_BIOS_ARGUMENTS BiosArguments ) { KIRQL OldIrql = FwAcquireFirmwareLock(); HalpVenCallBios(InterruptNumber, BiosArguments); FwReleaseFirmwareLock(OldIrql); return; } #else #define VenCallBios(InterruptNumber, BiosArguments) \ ((PVEN_CALL_BIOS_ROUTINE)(SYSTEM_BLOCK->VendorVector[CallBiosRoutine])) \ ((InterruptNumber), (BiosArguments)) #endif #define VenTranslateBusAddress(InterfaceType, BusNumber, BusAddress, AddressSpace, TranslatedAddress) \ ((PVEN_TRANSLATE_BUS_ADDRESS_ROUTINE)(SYSTEM_BLOCK->VendorVector[TranslateBusAddressRoutine])) \ ((InterfaceType), (BusNumber), (BusAddress), (AddressSpace), (TranslatedAddress)) #define VenReadPortUCHAR(Port) \ ((PVEN_READ_PORT_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReadPortUCHARRoutine])) \ ((Port)) #define VenReadPortUSHORT(Port) \ ((PVEN_READ_PORT_USHORT_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReadPortUSHORTRoutine])) \ ((Port)) #define VenReadPortULONG(Port) \ ((PVEN_READ_PORT_ULONG_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReadPortULONGRoutine])) \ ((Port)) #define VenWritePortUCHAR(Port, Value) \ ((PVEN_WRITE_PORT_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[WritePortUCHARRoutine])) \ ((Port), (Value)) #define VenWritePortUSHORT(Port, Value) \ ((PVEN_WRITE_PORT_USHORT_ROUTINE)(SYSTEM_BLOCK->VendorVector[WritePortUSHORTRoutine])) \ ((Port), (Value)) #define VenWritePortULONG(Port, Value) \ ((PVEN_WRITE_PORT_ULONG_ROUTINE)(SYSTEM_BLOCK->VendorVector[WritePortULONGRoutine])) \ ((Port), (Value)) #define VenReadRegisterUCHAR(Register) \ ((PVEN_READ_REGISTER_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReadRegisterUCHARRoutine])) \ ((Register)) #define VenReadRegisterUSHORT(Register) \ ((PVEN_READ_REGISTER_USHORT_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReadRegisterUSHORTRoutine])) \ ((Register)) #define VenReadRegisterULONG(Register) \ ((PVEN_READ_REGISTER_ULONG_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReadRegisterULONGRoutine])) \ ((Register)) #define VenWriteRegisterUCHAR(Register, Value) \ ((PVEN_WRITE_REGISTER_UCHAR_ROUTINE)(SYSTEM_BLOCK->VendorVector[WriteRegisterUCHARRoutine])) \ ((Register), (Value)) #define VenWriteRegisterUSHORT(Register, Value) \ ((PVEN_WRITE_REGISTER_USHORT_ROUTINE)(SYSTEM_BLOCK->VendorVector[WriteRegisterUSHORTRoutine])) \ ((Register), (Value)) #define VenWriteRegisterULONG(Register, Value) \ ((PVEN_WRITE_REGISTER_ULONG_ROUTINE)(SYSTEM_BLOCK->VendorVector[WriteRegisterULONGRoutine])) \ ((Register), (Value)) #define VenGetBusDataByOffset(BusDataType, BusNumber, SlotNumber, Buffer, Offset, Length) \ ((PVEN_GET_BUS_DATA_BY_OFFSET_ROUTINE)(SYSTEM_BLOCK->VendorVector[GetBusDataByOffsetRoutine])) \ ((BusDataType), (BusNumber), (SlotNumber), (Buffer), (Offset), (Length)) #define VenSetBusDataByOffset(BusDataType, BusNumber, SlotNumber, Buffer, Offset, Length) \ ((PVEN_SET_BUS_DATA_BY_OFFSET_ROUTINE)(SYSTEM_BLOCK->VendorVector[SetBusDataByOffsetRoutine])) \ ((BusDataType), (BusNumber), (SlotNumber), (Buffer), (Offset), (Length)) #define VenGetAdapter(DeviceDescription, NumberOfMapRegisters) \ ((PVEN_GET_ADAPTER_ROUTINE)(SYSTEM_BLOCK->VendorVector[GetAdapterRoutine])) \ ((DeviceDescription), (NumberOfMapRegisters)) #define VenAllocateCommonBuffer(AdapterObject, Length, LogicalAddress, CacheEnabled) \ ((PVEN_ALLOCATE_COMMON_BUFFER_ROUTINE)(SYSTEM_BLOCK->VendorVector[AllocateCommonBufferRoutine])) \ ((AdapterObject), (Length), (LogicalAddress), (CacheEnabled)) #define VenFreeCommonBuffer(AdapterObject, Length, LogicalAddress, VirtualAddress, CacheEnabled) \ ((PVEN_FREE_COMMON_BUFFER_ROUTINE)(SYSTEM_BLOCK->VendorVector[FreeCommonBufferRoutine])) \ ((AdapterObject), (Length), (LogicalAddress), (VirtualAddress), (CacheEnabled)) #define VenReturnArcInformation(ArcInfo) \ ((PVEN_RETURN_ARC_INFORMATION_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReturnArcInformationRoutine])) \ ((ArcInfo)) #define VenIssueSrbDirect(ScsiAdapterId, PathId, TargetId, LunId, Srb, BufferAddress, BufferLength, WriteToDevice) \ ((PVEN_ISSUE_SRB_DIRECT_ROUTINE)(SYSTEM_BLOCK->VendorVector[IssueSrbDirectRoutine])) \ ((ScsiAdapterId), (PathId), (TargetId), (LunId), (Srb), (BufferAddress), (BufferLength), (WriteToDevice)) // // As we are extending the vendor array here. Let's check the AlphaBIOS // has set the CDS tree up to support th extension. If not, don't do the call. // // // Define the params used for the Error Logging callbacks. // typedef enum _VENDOR_READWRITE_TYPE { ReadFrame = 1, WriteFrame } VENDOR_READWRITE_TYPE; typedef enum _VENDOR_READWRITE_FRAMETYPE { FatalErrorFrame = 1, DoubleErrorFrame, FRUErrorFrame } VENDOR_READWRITE_FRAMETYPE; #if defined(_AXP64_) && defined(_NTHAL_) __inline ARC_STATUS VenReadWriteErrorFrame( IN ULONG ReadWrite, IN ULONG FrameType, IN OUT PVOID FrameAddress, IN OUT PLONG FrameSize, IN ULONG FrameNumber ) { ARC_STATUS Status; KIRQL OldIrql = FwAcquireFirmwareLock(); Status = HalpVenReadWriteErrorFrame(ReadWrite, FrameType, FrameAddress, FrameSize, FrameNumber); FwReleaseFirmwareLock(OldIrql); return Status; } #else #define VenReadWriteErrorFrame(ReadWrite, Frametype, FrameAddress, FrameSizeAddress, FrameNumber) \ (SYSTEM_BLOCK->VendorVectorLength > (ReadWriteErrorFrameRoutine * sizeof(SYSTEM_BLOCK->VendorVector[0])) ? \ ((PVEN_READ_WRITE_ERROR_FRAME_ROUTINE)(SYSTEM_BLOCK->VendorVector[ReadWriteErrorFrameRoutine])) \ ((ReadWrite), (Frametype), (FrameAddress), (FrameSizeAddress), (FrameNumber)) : \ (EINVAL)) // Return bad status if vector not present. #endif #endif // _LANGUAGE_ASSEMBLY not defined #endif // _FWCALLBK_