|
|
/*++
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"
#ifndef _PPC_
#include "jazzdma.h"
#else
#include "ppcdef.h"
#endif
#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.
//
#ifndef _PPC_
#define FW_POOL_BASE 0xa07ed000
#define FW_POOL_SIZE 0xf000
#else
#define FW_POOL_BASE 0xe80000
#define FW_POOL_SIZE 0x3000
#endif
//
// 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 );
ULONG 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_
|