|
|
//
// Copyright (R) 1999-2000 Microsoft Corporation. All rights reserved.
//
// PURPOSE:
// File contains declarations for the Non-Volatile RAM Driver
// for the Windows-based Server Appliance.
//
// This driver reads and writes to non-volatile RAM provided to
// the OS by the OEM hardware. It also provides for the OEM to
// indicate to the OS that power has cycled since the last boot
// attempt that succeeded, from the BIOS perspective.
//
// File Name: SaMSNVRamIoctl.h
// Originally: SaNVRamIoctl.h
//
#ifndef __SAMSNVRAM_IOCTL__
#define __SAMSNVRAM_IOCTL__
//
// Device Names
//
// System Registered device name
#define PDEVICENAME_SANVRAM (L"\\Device\\SANVRAM")
// Device Symbolic name
#define PDEVSYMBOLICNAME_SANVRAM (L"\\??\\SANVRAM1")
// Device symbolic name as used in CreateFile
#define PDEVFILENAME_SANVRAM (L"\\\\.\\SANVRAM1")
//
// IOCTL control codes
//
///////////////////////////////////////////////
// GET_VERSION
//
#define IOCTL_SANVRAM_GET_VERSION\
CTL_CODE( FILE_DEVICE_UNKNOWN, 0xD01,\ METHOD_BUFFERED, FILE_ANY_ACCESS )
//
// Structures used by the IOCTL codes
//
typedef struct _SANVRAM_GET_VER_OUT_BUFF { DWORD Version; } SANVRAM_GET_VER_OUT_BUFF, *PSANVRAM_GET_VER_OUT_BUFF;
//
// version bits
//
#ifndef VERSION_INFO
#define VERSION_INFO
#define VERSION1 0x1
#define VERSION2 0x2
#define VERSION3 0x4
#define VERSION4 0x8
#define VERSION5 0x10
#define VERSION6 0x20
#define VESRION7 0x40
#define VESRION8 0x80
#define THIS_VERSION VERSION2
#endif //#ifndef VERSION_INFO
///////////////////////////////////////////////
// GET_CAPABILTIES
// Returns a DWORD with bits indicating capabilities.
#define IOCTL_SANVRAM_GET_CAPABILITIES\
CTL_CODE( FILE_DEVICE_UNKNOWN, 0xD02,\ METHOD_BUFFERED, FILE_ANY_ACCESS ) //
// Structures used by the IOCTL codes
//
typedef struct _SANVRAM_GET_CAPS_OUT_BUFF { DWORD Version; DWORD Capability; } SANVRAM_GET_CAPS_OUT_BUFF, *PSANVRAM_GET_CAPS_OUT_BUFF;
/////////////////////////////////////////////////////////////////////////////
// Semantics of the fields of the SANVRAM_GET_CAPS_OUT_BUFF structure.
//
// Version: Must have exactly one bit set, and must be one of the bits
// set in the Version field on a prior return from the IOCTL
// IOCTL_SANVRAM_GET_VERSION. The driver is required to
// support the VERSION1 interface defined in this header.
// At this time no other version is defined.
//
// Capability bits: Indicates that this driver supports the non-volatile RAM
// interface and that this driver supports the knowledge of
// whether the power has cycled since the last boot up. See
// the semantics for the relevant bits in the IOCTL_SANVRAM
// call below.
//
#define NON_VOLATILE_RAM 0x01 // set if driver supports non-volatile RAM
#define POWER_CYCLE_INFO 0x02 // set if driver supports power cycle info
///////////////////////////////////////////////
// IOCTL_SANVRAM
// Returns the input structure with actions taken
// as described in the discussion below. The input
// and output are identical in size and structure.
//
#define IOCTL_SANVRAM\
CTL_CODE( FILE_DEVICE_UNKNOWN, 0xD03,\ METHOD_BUFFERED, FILE_ANY_ACCESS )
//
// Structures used by this IOCTL code,
//
typedef struct _SANVRAM__BUFF { IN DWORD Version; // version of interface used
IN DWORD FlagsControl; // bit field indicating desired actions
OUT DWORD FlagsInfo; // bit field indicating state
IN OUT DWORD FirstDWORD; // First uninterpreted DWORD: non-volatile RAM
IN OUT DWORD SecondDWORD; // Second uninterpreted DWORD: non-volatile RAM
} SANVRAM__BUFF, *PSANVRAM__BUFF;
/////////////////////////////////////////////////////////////////////////////
// Semantics of the fields of the SANVRAM_BUFF structure.
//
// Version: Must have exactly one bit set, and must be one of the bits
// set in the Version field on a prior return from the IOCTL
// IOCTL_SANVRAM_GET_VERSION. The driver is required to
// support the VERSION1 interface defined in this header.
// At this time no other version is defined.
// FlagsControl: Flags indicating the desired actions. The two DWORD values
// may be set, read, or both set and read. Setting the values
// in a single call must precede reading them. Requested
// reads and writes must take place directly to and from the
// non-volatile media. (Thus if a standard C optimizer is used
// with the compiler, and both a write and a read are requested,
// then optimizations should be turned off for these actions,
// perhaps by using the "volatile" key word.) The two DWORD
// values are independently controlled. There are two bits
// for the first DWORD and two for the second.
//
// NOTE:: Writing to the media
// dedicated to the two non-volatile DWORDS MUST occur WHEN
// and ONLY when commanded by these bits. This requirement
// must be globally honored in time and space, through
// failures, disk changes, etc.
//
#define FirstDWORD_WRITE (0x01) // set if first DWORD is to be written
#define SecondDWORD_WRITE (0x02) // set if second DWORD is to be written
#define FirstDWORD_READ (0x04) // set if first DWORD is to be read
#define SecondDWORD_READ (0x08) // set if second DWORD is to be read
#define REQUEST_ALTERNATE_OS (0x10) // set if alternate OS is to be requested
#define NOTIFY_SYSTEM_FAILURE (0x20) // set to notify that alternate OS failed
#define INDICATE_LAST_CALL (0x40) // set to notify that this is last call before shutdown or reboot
//
// FlagsInfo: Bit field for output flags: Flag indicates whether the power
// has cycled between the current boot of an operating system on
// this machine and the last. It indicates that this is the
// first boot of an operating system since power had been off.
// This bit has no significance if the capability to give this
// information has not been declared with the POWER_CYCLE_INFO
// bit. If the power cycle capability is provided, then this bit is
// set on ALL boot attempts subsequent to a power cycle until a
// boot succeedes sufficiently that the OS sets the BIOS boot
// counter to zero. Stated differently we have that, after a
// power cycle, the POWER_CYCLED bit will be set on all calls
// to this function, until a boot attempt is under way that is
// subsequent to a boot in which the OS made a call with the bit
// RESET_BIOS_BOOT_COUNT set.
//
// The behavior is given in the following matrix where pre-reset is
// prior to a call to the NVRAM driver indicating to reset the bit,
// and post-reset is after such a call.
// In the matrix a non-PCB is a boot that was not occasioned
// by the power coming up ( a non Power Cycle Boot). The running state
// of the system is characterized here by whether the immediately
// preceding boot was occasioned by a power up, and whether, according
// to the matrix, the power cycle bit was set prior to the boot. Note
// that semantically "power cycle boot" includes all boots (CPU resets)
// that are occasioned by direct user actions. On most server appliances
// this is covered by power cycles. However, if the user has some other
// means to request a reboot of the box, e.g., a reset switch, then that
// action is included in the status of a "power cycle boot." On such a
// hardware platform it is perhaps more accurate to call this a
// "user action" boot, and add that as a set it includes all power
// cycles.
//
// | Power Cycle Bit Set Before Boot | Power Cycle Bit Clear Before Boot |
// -----------------------------------------------------------------------
// | Power Cycle Boot | non-PCB | Power Cycle Boot | non-PCB |
// -----------------------------------------------------------------------
// pre-reset | Set | Set | Set | Clear |
// ---------------------------------------------------------------------------------
// post-reset| Clear | Clear | Clear | Clear |
// ---------------------------------------------------------------------------------
//
#define POWER_CYCLED 0x01 // set if power has cycled,
//
// FirstDWORD:
// SecondDWORD:
// These values are simply stored and retrieved, they are not interpreted
// at this level.
// They must be stored in
// non-volatile storage and will be written on boots, updates of the OS,
// and shutdowns. They will therefore be written sufficiently infrequently
// that slow non-volatile RAM technologies, such as Flash ROM, can be
// suitable from a performance perspective. The lifetime of a particular
// technology in write-cycles must be considered relative to the intended
// design life between service or perhaps the total design life of the
// particular server appliance.
//
//////////////////////////////////////////////////////////////////////////////
#endif // __SAMSNVRAM_IOCTL__
|