247 lines
5.0 KiB
C
247 lines
5.0 KiB
C
/*++
|
||
|
||
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);
|
||
}
|