338 lines
6 KiB
C
338 lines
6 KiB
C
|
/*++
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|