summaryrefslogblamecommitdiffstats
path: root/private/ntos/nthals/halalpha/cmos8k.c
blob: 6de80feb1077539f1e22b32063c876bccbc9c862 (plain) (tree)





















































































































































































































































                                                                                
/*++

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);
}