/*++ Copyright (c) 1997 Microsoft Corporation Module Name: ixhibrnt.c Abstract: This file provides the code that saves and restores state for traditional motherboard devices when the system goes into a sleep state that removes power. Author: Jake Oshins (jakeo) May 6, 1997 Revision History: --*/ #include "halp.h" extern PVOID HalpEisaControlBase; #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, HaliLocateHiberRanges) #pragma alloc_text(PAGELK, HalpSaveDmaControllerState) #pragma alloc_text(PAGELK, HalpSaveTimerState) #ifdef PIC_SUPPORTED #pragma alloc_text(PAGELK, HalpSavePicState) #pragma alloc_text(PAGELK, HalpRestorePicState) #endif #pragma alloc_text(PAGELK, HalpRestoreDmaControllerState) #pragma alloc_text(PAGELK, HalpRestoreTimerState) #endif #ifdef notyet #define EISA_CONTROL (PUCHAR)&((PEISA_CONTROL) HalpEisaControlBase) #endif // notyet #ifdef PIC_SUPPORTED VOID HalpSavePicState( VOID ) { #ifdef notyet // // Commented HalpMotherboardState and EISA_CONTROL******** // #ifdef notyet HalpMotherboardState.PicState.MasterMask = READ_PORT_UCHAR(EISA_CONTROL->Interrupt1ControlPort1); #endif // notyet #if defined(NEC_98) #else HalpMotherboardState.PicState.MasterEdgeLevelControl = READ_PORT_UCHAR(EISA_CONTROL->Interrupt1EdgeLevel); HalpMotherboardState.PicState.SlaveEdgeLevelControl = READ_PORT_UCHAR(EISA_CONTROL->Interrupt2EdgeLevel); #endif #endif // notyet } VOID HalpRestorePicState( VOID ) { #ifdef notyet ULONG flags; // _asm { // pushfd // pop flags // cli // } _disable(); #ifdef notyet HalpInitializePICs(FALSE); // // HalpMotherboardState,EISA_CONTROL and assembly instruction commented // WRITE_PORT_UCHAR( EISA_CONTROL->Interrupt1ControlPort1, HalpMotherboardState.PicState.MasterMask ); WRITE_PORT_UCHAR( EISA_CONTROL->Interrupt2ControlPort1, HalpMotherboardState.PicState.SlaveMask ); #endif // notyet #if defined(NEC_98) #else // // For halx86, the PCI interrupt vector programming // is static, so this code can just restore everything. // HalpRestorePicEdgeLevelRegister(); #endif // _asm { // push flags // popfd // } } #ifndef NEC_98 VOID HalpRestorePicEdgeLevelRegister( VOID ) { WRITE_PORT_UCHAR(EISA_CONTROL->Interrupt1EdgeLevel, HalpMotherboardState.PicState.MasterEdgeLevelControl); WRITE_PORT_UCHAR(EISA_CONTROL->Interrupt2EdgeLevel, HalpMotherboardState.PicState.SlaveEdgeLevelControl); } #endif #endif // notyet } #endif VOID HalpSaveDmaControllerState( VOID ) { #ifdef notyet #if defined(NEC_98) #else HalpMotherboardState.DmaState.Dma1ExtendedModePort = READ_PORT_UCHAR( EISA_CONTROL->Dma1ExtendedModePort ); HalpMotherboardState.DmaState.Dma2ExtendedModePort = READ_PORT_UCHAR( EISA_CONTROL->Dma2ExtendedModePort ); #endif // NEC_98 #ifdef notyet HalpMotherboardState.DmaState.Dma2ExtendedModePort = READ_PORT_UCHAR( EISA_CONTROL->Dma2ExtendedModePort ); HalpMotherboardState.DmaState.Dma1Control.Mode = READ_PORT_UCHAR( EISA_CONTROL->Dma1BasePort.Mode ); HalpMotherboardState.DmaState.Dma2Control.Mode = READ_PORT_UCHAR( EISA_CONTROL->Dma2BasePort.Mode ); HalpMotherboardState.DmaState.Dma1Control.SingleMask = READ_PORT_UCHAR( EISA_CONTROL->Dma1BasePort.SingleMask ); HalpMotherboardState.DmaState.Dma2Control.SingleMask = READ_PORT_UCHAR( EISA_CONTROL->Dma2BasePort.SingleMask ); #endif // notyet #endif // notyet } VOID HalpRestoreDmaControllerState( VOID ) { #ifdef notyet #if defined(NEC_98) #else UCHAR i; WRITE_PORT_UCHAR( EISA_CONTROL->Dma1ExtendedModePort, HalpMotherboardState.DmaState.Dma1ExtendedModePort ); WRITE_PORT_UCHAR( EISA_CONTROL->Dma2ExtendedModePort, HalpMotherboardState.DmaState.Dma2ExtendedModePort ); for (i = 0; i < (EISA_DMA_CHANNELS / 2); i++) { // // Check to see if the array has contains a value for this channel. // if ((HalpDmaChannelModes[i] & 0x3) == i) { WRITE_PORT_UCHAR( EISA_CONTROL->Dma1BasePort.Mode, HalpDmaChannelModes[i] ); WRITE_PORT_UCHAR( EISA_CONTROL->Dma1BasePort.SingleMask, HalpDmaChannelMasks[i] ); } if ((HalpDmaChannelModes[i + (EISA_DMA_CHANNELS / 2)] & 0x3) == i) { WRITE_PORT_UCHAR( EISA_CONTROL->Dma2BasePort.Mode, HalpDmaChannelModes[i + (EISA_DMA_CHANNELS / 2)] ); WRITE_PORT_UCHAR( EISA_CONTROL->Dma2BasePort.SingleMask, HalpDmaChannelMasks[i] ); } } #endif #endif // notyet } VOID HalpSaveTimerState( VOID ) { } VOID HalpRestoreTimerState( VOID ) { HalpInitializeClock(); } VOID HaliLocateHiberRanges ( IN PVOID MemoryMap ) { ; // // Mark the hal's data section as needed to be cloned // // // Commented PO_MEM_CLONE, PO_MEM_PAGE_ADDRESS and PO_MEM_DISCARD // #ifdef notyet // PoSetHiberRange ( // MemoryMap, // PO_MEM_CLONE, // (PVOID) &HalpFeatureBits, // 0, // 'dlah' // ); // // Mark DMA buffer has not needing saved // // if (HalpMapBufferSize) { // PoSetHiberRange ( // MemoryMap, // PO_MEM_DISCARD | PO_MEM_PAGE_ADDRESS, // (PVOID) (HalpMapBufferPhysicalAddress.LowPart >> PAGE_SHIFT), // HalpMapBufferSize >> PAGE_SHIFT, // 'mlah' // ); // } #endif // notyet }