mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
246 lines
5.0 KiB
246 lines
5.0 KiB
/*++
|
|
|
|
Copyright (c) 1993 Digital Equipment Corporation
|
|
|
|
Module Name:
|
|
|
|
xxnvram.c
|
|
|
|
Abstract:
|
|
|
|
This module implements the device-specific routines necessary to
|
|
Read and Write the Non Volatile RAM containing the system environment
|
|
variables. The routines implemented here are:
|
|
|
|
HalpReadNVRamBuffer() - copy data from NVRAM into memory
|
|
HalpWriteNVRamBuffer() - write memory data to NVRAM
|
|
HalpCopyNVRamBuffer() - move data within the NVRAM
|
|
|
|
Author:
|
|
|
|
Steve Brooks 5-Oct 93
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
|
|
#include "halp.h"
|
|
#include "cmos8k.h"
|
|
|
|
#include "arccodes.h"
|
|
|
|
//
|
|
// Local function prototypes.
|
|
//
|
|
|
|
ARC_STATUS
|
|
HalpReadNVRamBuffer (
|
|
OUT PCHAR DataPtr,
|
|
IN PCHAR NvRamPtr,
|
|
IN ULONG Length
|
|
);
|
|
|
|
ARC_STATUS
|
|
HalpWriteNVRamBuffer (
|
|
IN PCHAR NvRamPtr,
|
|
IN PCHAR DataPtr,
|
|
IN ULONG Length
|
|
);
|
|
|
|
ARC_STATUS
|
|
HalpCopyNVRamBuffer (
|
|
IN PCHAR NvDestPtr,
|
|
IN PCHAR NvSrcPtr,
|
|
IN ULONG Length
|
|
);
|
|
|
|
#ifdef AXP_FIRMWARE
|
|
|
|
#pragma alloc_text(DISTEXT, HalpReadNVRamBuffer )
|
|
#pragma alloc_text(DISTEXT, HalpWriteNVRamBuffer )
|
|
#pragma alloc_text(DISTEXT, HalpCopyNVRamBuffer )
|
|
|
|
#endif
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
ARC_STATUS HalpReadNVRamBuffer (
|
|
OUT PCHAR DataPtr,
|
|
IN PCHAR NvRamPtr,
|
|
IN ULONG Length )
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine Reads data from the NVRam into main memory
|
|
|
|
Arguments:
|
|
|
|
DataPtr - Pointer to memory location to receive data
|
|
NvRamPtr - Pointer (qva) to NVRam location to read data from
|
|
Length - Number of bytes of data to transfer
|
|
|
|
Return Value:
|
|
|
|
ESUCCESS if the operation succeeds.
|
|
|
|
--*/
|
|
{
|
|
ULONG PageSelect, ByteSelect;
|
|
|
|
PageSelect = (NvRamPtr - (PUCHAR)HalpCMOSRamBase) >> CONFIG_RAM_PAGE_SHIFT;
|
|
ByteSelect = (NvRamPtr - (PUCHAR)HalpCMOSRamBase) & CONFIG_RAM_BYTE_MASK;
|
|
|
|
WRITE_CONFIG_RAM_PAGE_SELECT(PageSelect);
|
|
while ( Length -- )
|
|
{
|
|
*DataPtr++ = READ_CONFIG_RAM_DATA(NvRamPtr);
|
|
NvRamPtr ++;
|
|
|
|
ByteSelect = (ByteSelect + 1) & CONFIG_RAM_BYTE_MASK;
|
|
if (ByteSelect == 0)
|
|
{
|
|
PageSelect++;
|
|
WRITE_CONFIG_RAM_PAGE_SELECT(PageSelect);
|
|
}
|
|
}
|
|
|
|
return(ESUCCESS);
|
|
}
|
|
|
|
//
|
|
//
|
|
//
|
|
ARC_STATUS HalpWriteNVRamBuffer (
|
|
IN PCHAR NvRamPtr,
|
|
IN PCHAR DataPtr,
|
|
IN ULONG Length )
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine Writes data from memory into the NVRam
|
|
|
|
Arguments:
|
|
|
|
NvRamPtr - Pointer (qva) to NVRam location to write data into
|
|
DataPtr - Pointer to memory location of data to be written
|
|
Length - Number of bytes of data to transfer
|
|
|
|
Return Value:
|
|
|
|
ESUCCESS if the operation succeeds.
|
|
|
|
--*/
|
|
{
|
|
ULONG PageSelect, ByteSelect;
|
|
|
|
PageSelect = (NvRamPtr - (PUCHAR)HalpCMOSRamBase) >> CONFIG_RAM_PAGE_SHIFT;
|
|
ByteSelect = (NvRamPtr - (PUCHAR)HalpCMOSRamBase) & CONFIG_RAM_BYTE_MASK;
|
|
|
|
WRITE_CONFIG_RAM_PAGE_SELECT(PageSelect);
|
|
while ( Length -- )
|
|
{
|
|
WRITE_CONFIG_RAM_DATA(NvRamPtr, *DataPtr);
|
|
NvRamPtr ++;
|
|
DataPtr ++;
|
|
|
|
ByteSelect = (ByteSelect + 1) & CONFIG_RAM_BYTE_MASK;
|
|
if (ByteSelect == 0)
|
|
{
|
|
PageSelect++;
|
|
WRITE_CONFIG_RAM_PAGE_SELECT(PageSelect);
|
|
}
|
|
}
|
|
|
|
return(ESUCCESS);
|
|
}
|
|
|
|
//
|
|
//
|
|
//
|
|
ARC_STATUS HalpCopyNVRamBuffer (
|
|
IN PCHAR NvDestPtr,
|
|
IN PCHAR NvSrcPtr,
|
|
IN ULONG Length )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine copies data between two locations within the NVRam. It is
|
|
the callers responsibility to assure that the destination region does not
|
|
overlap the src region i.e. if the regions overlap, NvSrcPtr > NvDestPtr.
|
|
|
|
Arguments:
|
|
|
|
NvDestPtr - Pointer (qva) to NVRam location to write data into
|
|
NvSrcPtr - Pointer (qva) to NVRam location of data to copy
|
|
Length - Number of bytes of data to transfer
|
|
|
|
Return Value:
|
|
|
|
ESUCCESS if the operation succeeds.
|
|
|
|
--*/
|
|
|
|
{
|
|
ULONG PageSelect0, ByteSelect0; // Src Pointer Page & offset
|
|
ULONG PageSelect1, ByteSelect1; // Dest Pointer Page & offset
|
|
|
|
|
|
PageSelect0 = (NvSrcPtr - (PUCHAR)HalpCMOSRamBase) >> CONFIG_RAM_PAGE_SHIFT;
|
|
ByteSelect0 = (NvSrcPtr - (PUCHAR)HalpCMOSRamBase) & CONFIG_RAM_BYTE_MASK;
|
|
|
|
PageSelect1 = (NvDestPtr-(PUCHAR)HalpCMOSRamBase) >> CONFIG_RAM_PAGE_SHIFT;
|
|
ByteSelect1 = (NvDestPtr - (PUCHAR)HalpCMOSRamBase) & CONFIG_RAM_BYTE_MASK;
|
|
|
|
WRITE_CONFIG_RAM_PAGE_SELECT(PageSelect0);
|
|
while ( Length -- )
|
|
{
|
|
UCHAR AChar;
|
|
|
|
//
|
|
// Check the Page select for the src pointer, and write the
|
|
// select register if necessary:
|
|
//
|
|
if (ByteSelect0 == 0)
|
|
{
|
|
PageSelect0++;
|
|
}
|
|
if ( PageSelect0 != PageSelect1 )
|
|
{
|
|
WRITE_CONFIG_RAM_PAGE_SELECT(PageSelect0);
|
|
}
|
|
|
|
AChar = READ_CONFIG_RAM_DATA(NvSrcPtr);
|
|
ByteSelect0 = (ByteSelect0 + 1) & CONFIG_RAM_BYTE_MASK;
|
|
|
|
//
|
|
// Check the page select for the dest pointer, and write
|
|
// the select register if necessary:
|
|
//
|
|
if (ByteSelect1 == 0)
|
|
{
|
|
PageSelect1++;
|
|
}
|
|
if ( PageSelect1 != PageSelect0 )
|
|
{
|
|
WRITE_CONFIG_RAM_PAGE_SELECT(PageSelect1);
|
|
}
|
|
|
|
WRITE_CONFIG_RAM_DATA(NvDestPtr, AChar);
|
|
ByteSelect1 = (ByteSelect1 + 1) & CONFIG_RAM_BYTE_MASK;
|
|
|
|
NvSrcPtr ++;
|
|
NvDestPtr ++;
|
|
}
|
|
|
|
return(ESUCCESS);
|
|
}
|