/*++ Copyright (c) 1991 Microsoft Corporation Module Name: fwp.h Abstract: This module contains extensions to the firmware.h header file. Author: David M. Robinson (davidro) 29-Aug-1991 Revision History: --*/ #ifndef _FWP_ #define _FWP_ #include "bldr.h" #include "firmware.h" #include "kbdmouse.h" #ifndef DUO #include "jazzdef.h" #include "jazzprom.h" #include "jazzdma.h" #else #include "duodef.h" #include "duoprom.h" #include "duodma.h" #endif // // TEMPTEMP Temporary defines. // #define SECONDARY_CACHE_SIZE (1 << 20) #define SECONDARY_CACHE_INVALID 0x0 #define SECONDARY_CACHE_DIRTY_EXCLUSIVE 0x5 #define TAGLO_SSTATE 0xA // // Current version and revision numbers. // #define ARC_VERSION 1 #define ARC_REVISION 2 // // Define the firmware vendor specific entry point numbers. // typedef enum _VENDOR_ENTRY { AllocatePoolRoutine, StallExecutionRoutine, PrintRoutine, SetDisplayAttributesRoutine, OutputCharacterRoutine, ScrollVideoRoutine, BootRestartRoutine, MaximumVendorRoutine } VENDOR_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 VOID (*PVEN_SET_DISPLAY_ATTRIBUTES_ROUTINE) ( IN ULONG ForegroundColor, IN ULONG BackgroundColor, IN BOOLEAN HighIntensity, IN BOOLEAN Underscored, IN BOOLEAN ReverseVideo, IN ULONG CharacterWidth, IN ULONG CharacterHeight ); typedef VOID (*PVEN_OUTPUT_CHARACTER_ROUTINE) ( IN PVOID Character, IN ULONG Row, IN ULONG Column ); typedef VOID (*PVEN_SCROLL_VIDEO_ROUTINE) ( VOID ); typedef VOID (*PVEN_BOOT_RESTART_ROUTINE) ( IN PRESTART_BLOCK RestartBlock ); // // Define vendor specific prototypes. // PVOID FwAllocatePool ( IN ULONG NumberOfBytes ); VOID FwStallExecution ( IN ULONG Microseconds ); ULONG FwPrint ( IN PCHAR Format, ... ); VOID FwSetDisplayAttributes ( IN ULONG ForegroundColor, IN ULONG BackgroundColor, IN BOOLEAN HighIntensity, IN BOOLEAN Underscored, IN BOOLEAN ReverseVideo, IN ULONG CharacterWidth, IN ULONG CharacterHeight ); VOID FwOutputCharacter ( IN PVOID Character, IN ULONG Row, IN ULONG Column ); VOID FwScrollVideo ( VOID ); // // Define vendor specific functions. // #define VenRestartBlock(RestartBlock) \ ((PVEN_BOOT_RESTART_ROUTINE)(SYSTEM_BLOCK->VendorVector[BootRestartRoutine])) \ ((RestartBlock)) #define VenAllocatePool(NumberOfBytes) \ ((PVEN_ALLOCATE_MEMORY_ROUTINE)(SYSTEM_BLOCK->VendorVector[AllocatePoolRoutine])) \ ((NumberOfBytes)) #define VenStallExecution(Microseconds) \ ((PVEN_STALL_EXECUTION_ROUTINE)(SYSTEM_BLOCK->VendorVector[StallExecutionRoutine])) \ ((Microseconds)) #define VenPrint(x) \ ((PVEN_PRINT_ROUTINE)(SYSTEM_BLOCK->VendorVector[PrintRoutine])) \ ((x)) #define VenPrint1(x,y) \ ((PVEN_PRINT_ROUTINE)(SYSTEM_BLOCK->VendorVector[PrintRoutine])) \ ((x), (y)) #define VenPrint2(x,y,z) \ ((PVEN_PRINT_ROUTINE)(SYSTEM_BLOCK->VendorVector[PrintRoutine])) \ ((x), (y), (z)) #define VenSetDisplayAttributes(ForegroundColor, BackgroundColor, HighIntensity, Underscored, ReverseVideo, CharacterWidth, CharacterHeight) \ ((PVEN_SET_DISPLAY_ATTRIBUTES_ROUTINE)(SYSTEM_BLOCK->VendorVector[SetDisplayAttributesRoutine])) \ ((ForegroundColor), (BackgroundColor), (HighIntensity), \ (Underscored), (ReverseVideo), (CharacterWidth), (CharacterHeight)) #define VenOutputCharacter(Character, Row, Column) \ ((PVEN_OUTPUT_CHARACTER_ROUTINE)(SYSTEM_BLOCK->VendorVector[OutputCharacterRoutine])) \ ((Character), (Row), (Column)) #define VenScrollVideo() \ ((PVEN_SCROLL_VIDEO_ROUTINE)(SYSTEM_BLOCK->VendorVector[ScrollVideoRoutine])) () // // Define the Lookup table. At initialization, the driver must fill this table // with the device pathnames it can handle. // typedef struct _DRIVER_LOOKUP_ENTRY { PCHAR DevicePath; PBL_DEVICE_ENTRY_TABLE DispatchTable; } DRIVER_LOOKUP_ENTRY, *PDRIVER_LOOKUP_ENTRY; #define SIZE_OF_LOOKUP_TABLE BL_FILE_TABLE_SIZE extern DRIVER_LOOKUP_ENTRY DeviceLookupTable[SIZE_OF_LOOKUP_TABLE]; // // Define the Device Pathname. This table is indexed with the FileId. // FwOpen tries to match the OpenPath with the entries in this table, and // if it finds a match it increments the reference counter. If it doesn't // find a match it tries to match an entry in the DRIVER_LOOKUP_TABLE // and then calls the Open routine of that driver. // #define SIZE_OF_ARC_DEVICENAME 64 typedef struct _OPENED_PATHNAME_ENTRY { ULONG ReferenceCounter; CHAR DeviceName[SIZE_OF_ARC_DEVICENAME]; } OPENED_PATHNAME_ENTRY, *POPENED_PATHNAME_ENTRY; #define SIZE_OF_OPENED_PATHNAME_TABLE BL_FILE_TABLE_SIZE extern OPENED_PATHNAME_ENTRY OpenedPathTable[SIZE_OF_OPENED_PATHNAME_TABLE]; // // Driver initialization routines. // VOID FwInitializeMemory( IN VOID ); VOID FwResetMemory( IN VOID ); VOID DisplayInitialize( IN OUT PDRIVER_LOOKUP_ENTRY LookupTableEntry, IN ULONG Entries ); VOID KeyboardInitialize( IN OUT PDRIVER_LOOKUP_ENTRY LookupTableEntry, IN ULONG Entries ); VOID SerialInitialize( IN OUT PDRIVER_LOOKUP_ENTRY LookupTableEntry, IN ULONG Entries ); VOID HardDiskInitialize( IN OUT PDRIVER_LOOKUP_ENTRY LookupTable, IN ULONG Entries ); VOID FloppyInitialize( IN OUT PDRIVER_LOOKUP_ENTRY LookupTableEntry, IN ULONG Entries ); // // Define the private configuration packet structure, which contains a // configuration component as well as pointers to the component's parent, // peer, child, and configuration data. // typedef struct _CONFIGURATION_PACKET { CONFIGURATION_COMPONENT Component; struct _CONFIGURATION_PACKET *Parent; struct _CONFIGURATION_PACKET *Peer; struct _CONFIGURATION_PACKET *Child; PVOID ConfigurationData; } CONFIGURATION_PACKET, *PCONFIGURATION_PACKET; // // The compressed configuration packet structure used to store configuration // data in NVRAM. // typedef struct _COMPRESSED_CONFIGURATION_PACKET { UCHAR Parent; UCHAR Class; UCHAR Type; UCHAR Flags; ULONG Key; UCHAR Version; UCHAR Revision; USHORT ConfigurationDataLength; USHORT Identifier; USHORT ConfigurationData; } COMPRESSED_CONFIGURATION_PACKET, *PCOMPRESSED_CONFIGURATION_PACKET; // // Defines for Identifier index. // #define NO_CONFIGURATION_IDENTIFIER 0xFFFF // // Defines for the volatile and non-volatile configuration tables. // #define NUMBER_OF_ENTRIES 40 #define LENGTH_OF_IDENTIFIER (1024 - (40*16) - 8) #define LENGTH_OF_DATA 2048 #define LENGTH_OF_ENVIRONMENT 1024 #define LENGTH_OF_EISA_DATA 2044 #define MAXIMUM_ENVIRONMENT_VALUE 256 // // The volatile configuration table structure. // typedef struct _CONFIGURATION { CONFIGURATION_PACKET Packet[NUMBER_OF_ENTRIES]; UCHAR Identifier[LENGTH_OF_IDENTIFIER]; UCHAR Data[LENGTH_OF_DATA]; UCHAR EisaData[LENGTH_OF_EISA_DATA]; } CONFIGURATION, *PCONFIGURATION; // // The non-volatile configuration table structure. // typedef struct _NV_CONFIGURATION { // // First Page // COMPRESSED_CONFIGURATION_PACKET Packet[NUMBER_OF_ENTRIES]; UCHAR Identifier[LENGTH_OF_IDENTIFIER]; UCHAR Data[LENGTH_OF_DATA]; UCHAR Checksum1[4]; UCHAR Environment[LENGTH_OF_ENVIRONMENT]; UCHAR Checksum2[4]; // // Second Page // UCHAR EisaData[LENGTH_OF_EISA_DATA]; UCHAR Checksum3[4]; } NV_CONFIGURATION, *PNV_CONFIGURATION; // // Define identifier index, data index, pointer to configuration table. // extern ULONG IdentifierIndex; extern ULONG DataIndex; extern ULONG EisaDataIndex; extern PCONFIGURATION Configuration; // // Non-volatile ram layout. // #define NVRAM_CONFIGURATION NVRAM_VIRTUAL_BASE #define NVRAM_SYSTEM_ID (NVRAM_VIRTUAL_BASE + 0x00002000) // // Memory size. The MctadrRev2 is used to interpret the memory size value // in the configuration register. // extern ULONG MemorySize; #define MEMORY_SIZE (MemorySize << 20) extern BOOLEAN MctadrRev2; // // Memory layout. // #define FW_POOL_BASE 0x807ed000 #define FW_POOL_SIZE 0xf000 // // Define special character values. TEMPTEMP These should go somewhere else. // #define ASCII_NUL 0x00 #define ASCII_BEL 0x07 #define ASCII_BS 0x08 #define ASCII_HT 0x09 #define ASCII_LF 0x0A #define ASCII_VT 0x0B #define ASCII_FF 0x0C #define ASCII_CR 0x0D #define ASCII_CSI 0x9B #define ASCII_ESC 0x1B #define ASCII_SYSRQ 0x80 // // Define screen colors. // typedef enum _ARC_SCREEN_COLOR { ArcColorBlack, ArcColorRed, ArcColorGreen, ArcColorYellow, ArcColorBlue, ArcColorMagenta, ArcColorCyan, ArcColorWhite, MaximumArcColor } ARC_SCREEN_COLOR; // // Define video board types for Jazz. // typedef enum _JAZZ_VIDEO_TYPE { JazzVideoG300, JazzVideoG364, JazzVideoVxl, Reserved3, Reserved4, Reserved5, Reserved6, Reserved7, Reserved8, Reserved9, ReservedA, ReservedB, ReservedC, ReservedD, ReservedE, ReservedF, MipsVideoG364, MaximumJazzVideo } JAZZ_VIDEO_TYPE, *PJAZZ_VIDEO_TYPE; // // Define firmware routine prototypes. // VOID FwIoInitialize1 ( VOID ); VOID FwIoInitialize2 ( VOID ); BOOLEAN FwGetPathMnemonicKey( IN PCHAR OpenPath, IN PCHAR Mnemonic, OUT PULONG Key ); PCHAR FwEnvironmentLoad( VOID ); VOID FwPrintVersion ( VOID ); ARC_STATUS DisplayBootInitialize( VOID ); ARC_STATUS FwGetVideoData ( OUT PMONITOR_CONFIGURATION_DATA MonitorData ); VOID FwSetVideoData ( IN PMONITOR_CONFIGURATION_DATA MonitorData ); VOID FwTerminationInitialize( IN VOID ); VOID FwHalt( IN VOID ); VOID FwMonitor( IN ULONG ); VOID FwExceptionInitialize( IN VOID ); VOID ResetSystem ( IN VOID ); VOID FwpFreeStub( IN PVOID Buffer ); typedef enum _GETSTRING_ACTION { GetStringSuccess, GetStringEscape, GetStringUpArrow, GetStringDownArrow, GetStringMaximum } GETSTRING_ACTION, *PGETSTRING_ACTION; GETSTRING_ACTION FwGetString( OUT PCHAR String, IN ULONG StringLength, IN PCHAR InitialString OPTIONAL, IN ULONG CurrentRow, IN ULONG CurrentColumn ); ARC_STATUS FwConfigurationCheckChecksum ( VOID ); ARC_STATUS FwEnvironmentCheckChecksum ( VOID ); VOID FwpReservedRoutine( VOID ); VOID FwWaitForKeypress( VOID ); VOID JzShowTime ( BOOLEAN First ); VOID JxBmp ( VOID ); LONG JxDisplayMenu ( IN PCHAR Choices[], IN ULONG NumberOfChoices, IN LONG DefaultChoice, IN ULONG CurrentLine ); BOOLEAN FwGetVariableSegment ( IN ULONG SegmentNumber, IN OUT PCHAR Segment ); ARC_STATUS FwSetVariableSegment ( IN ULONG SegmentNumber, IN PCHAR VariableName, IN OUT PCHAR Segment ); ARC_STATUS JzAddProcessor ( IN ULONG ProcessorNumber ); // // Print macros. // extern BOOLEAN DisplayOutput; extern BOOLEAN SerialOutput; extern BOOLEAN FwConsoleInitialized; extern BOOLEAN SetupIsRunning; ULONG FwPrint ( PCHAR Format, ... ); #define FwClearScreen() \ FwPrint("%c2J", ASCII_CSI) #define FwSetScreenColor(FgColor, BgColor) \ FwPrint("%c3%dm", ASCII_CSI, (UCHAR)FgColor); \ FwPrint("%c4%dm", ASCII_CSI, (UCHAR)BgColor) #define FwSetScreenAttributes( HighIntensity, Underscored, ReverseVideo ) \ FwPrint("%c0m", ASCII_CSI); \ if (HighIntensity) { \ FwPrint("%c1m", ASCII_CSI); \ } \ if (Underscored) { \ FwPrint("%c4m", ASCII_CSI); \ } \ if (ReverseVideo) { \ FwPrint("%c7m", ASCII_CSI); \ } #define FwSetPosition( Row, Column ) \ FwPrint("%c%d;%dH", ASCII_CSI, (Row + 1), (Column + 1)) #define FwMoveCursorLeft(Spaces) \ FwPrint ("%c%dD", ASCII_CSI, Spaces) #define FwMoveCursorToColumn(Spaces) \ FwPrint( "\r" ); \ if ( Spaces > 1 ) \ FwPrint( "%c%dC", ASCII_CSI, Spaces - 1) #endif // _FWP_