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.
221 lines
4.5 KiB
221 lines
4.5 KiB
/*
|
|
*
|
|
* Copyright (c) 1995 FirePower Systems, Inc.
|
|
* Copyright (c) 1994 FirePower Systems Inc.
|
|
*
|
|
* $RCSfile: vrmisc.c $
|
|
* $Revision: 1.10 $
|
|
* $Date: 1996/06/17 02:55:38 $
|
|
* $Locker: $
|
|
*
|
|
*
|
|
* Module Name:
|
|
* vrmisc.c
|
|
*
|
|
* Author:
|
|
* Shin Iwamoto at FirePower Systems Inc.
|
|
*
|
|
* History:
|
|
* 07-Sep-94 Shin Iwamoto at FirePower System Inc.
|
|
* Modifying the existence of L2 cache.
|
|
* 16-Jun-94 Shin Iwamoto at FirePower System Inc.
|
|
* Changed the property getting code using get_str_prop()
|
|
* in VrGetTime().
|
|
* 14-Jun-94 Shin Iwamoto at FirePower System Inc.
|
|
* Added a pointer to VRTime because a type mismatch happened.
|
|
* 19-May-94 Shin Iwamoto at FirePower System Inc.
|
|
* Added some logic in VrGetTime().
|
|
* Added some comments.
|
|
* 05-May-94 Shin Iwamoto at FirePower System Inc.
|
|
* Created.
|
|
*
|
|
*/
|
|
|
|
|
|
#include "veneer.h"
|
|
|
|
//
|
|
// Static data.
|
|
//
|
|
STATIC TIME_FIELDS VrTime;
|
|
STATIC LONG StartTime; // XXXX structure
|
|
|
|
|
|
/*
|
|
* Name: VrGetTime
|
|
*
|
|
* Description:
|
|
* This function returns a pointer to a time structure.
|
|
*
|
|
* Arguments:
|
|
* None.
|
|
*
|
|
* Return Value:
|
|
* Returns a pointer to a time structure. If the time infomation is
|
|
* valid, valid data is returned, otherwise all fields are returned
|
|
* as zero.
|
|
*
|
|
*/
|
|
PTIME_FIELDS
|
|
VrGetTime(VOID)
|
|
{
|
|
PTIME_FIELDS PVrTime = &VrTime; // Satisfy the compiler.
|
|
phandle ph;
|
|
ihandle ih;
|
|
int res[7];
|
|
|
|
//
|
|
// "The experienced programmer puts a known elephant in
|
|
// Cairo so the search will always terminate."
|
|
//
|
|
VrTime.Year = 0;
|
|
VrTime.Month = 0;
|
|
VrTime.Day = 0;
|
|
VrTime.Hour = 0;
|
|
VrTime.Minute = 0;
|
|
VrTime.Second = 0;
|
|
VrTime.Milliseconds = 0;
|
|
VrTime.Weekday = 0;
|
|
|
|
ph = FindNodeByType("rtc");
|
|
if (ph == 0) {
|
|
warn("VrGetTime: Could not find the RTC node.\n");
|
|
goto out;
|
|
}
|
|
ih = OpenPackage(ph);
|
|
if (ih == 0) {
|
|
goto out;
|
|
}
|
|
OFCallMethod(7, 2, res, "get-time", ih);
|
|
OFClose(ih);
|
|
if (res[0] != 0) {
|
|
goto out;
|
|
}
|
|
|
|
VrTime.Year = res[6];
|
|
VrTime.Month = res[5];
|
|
VrTime.Day = res[4];
|
|
VrTime.Hour = res[3];
|
|
VrTime.Minute = res[2];
|
|
VrTime.Second = res[1];
|
|
|
|
out:
|
|
return (PVrTime);
|
|
}
|
|
|
|
|
|
/*
|
|
* Name: VrGetRelativeTime
|
|
*
|
|
* Description:
|
|
* This routine returns the time in seconds since Veneer starts.
|
|
*
|
|
* Arguments:
|
|
* None.
|
|
*
|
|
* Return Value:
|
|
* If the time information is valid, valid data is returned.
|
|
* Otherwise a zero is returned.
|
|
*
|
|
*/
|
|
ULONG
|
|
VrGetRelativeTime( VOID )
|
|
{
|
|
return OFMilliseconds()/1000;
|
|
}
|
|
|
|
|
|
/*
|
|
* Name: VrTimeInitialize
|
|
*
|
|
* Description:
|
|
* This function initializes the time routine addresses in the firmware
|
|
* transfer vector and the internal counter for the relative time.
|
|
*
|
|
* Arguments:
|
|
* None.
|
|
*
|
|
* Return Value:
|
|
* None.
|
|
*
|
|
*/
|
|
VOID
|
|
VrTimeInitialize(
|
|
VOID
|
|
)
|
|
{
|
|
debug(VRDBG_ENTRY, "VrTimeInitialize BEGIN....\n");
|
|
//
|
|
// Initialize the Time routine addresses in the firmware transfer vector.
|
|
//
|
|
(PARC_GET_TIME_ROUTINE)
|
|
SYSTEM_BLOCK->FirmwareVector[GetTimeRoutine] = VrGetTime;
|
|
|
|
(PARC_GET_RELATIVE_TIME_ROUTINE)
|
|
SYSTEM_BLOCK->FirmwareVector[GetRelativeTimeRoutine] =
|
|
VrGetRelativeTime;
|
|
(PARC_FLUSH_ALL_CACHES_ROUTINE)
|
|
SYSTEM_BLOCK->FirmwareVector[FlushAllCachesRoutine] =
|
|
VrFlushAllCaches;
|
|
debug(VRDBG_ENTRY, "VrTimeInitialize ....END\n");
|
|
|
|
}
|
|
|
|
VOID
|
|
VrFlushAllCaches(VOID)
|
|
{
|
|
ULONG start;
|
|
phandle ph;
|
|
char *regp;
|
|
reg *cur_reg;
|
|
int i, size_cells, addr_cells, proplen, regsize;
|
|
extern VOID HalpSweepPhysicalRangeInBothCaches(ULONG, ULONG, ULONG);
|
|
|
|
/*
|
|
* Flush each chunk of physical memory. Use the memory scanning
|
|
* code from vrmemory.c; see that file for comments.
|
|
*/
|
|
|
|
ph = OFFinddevice("/chosen");
|
|
if (ph == -1) {
|
|
fatal("Cannot access /chosen node.\n");
|
|
}
|
|
ph = OFInstanceToPackage(get_int_prop(ph, "memory"));
|
|
|
|
if (ph == -1) {
|
|
fatal("Cannot access /memory node.\n");
|
|
}
|
|
|
|
if ((proplen = OFGetproplen(ph, "reg")) <= 0) {
|
|
fatal("No memory reg structs. proplen = %d\n", proplen);
|
|
}
|
|
regp = malloc(proplen);
|
|
if (OFGetprop(ph, "reg", regp, proplen) != (long) proplen) {
|
|
fatal("Getprop(memory.reg) return != %d\n", proplen);
|
|
}
|
|
|
|
addr_cells = get_int_prop(OFParent(ph), "#address-cells");
|
|
if (addr_cells == -1) {
|
|
addr_cells = 2;
|
|
}
|
|
size_cells = get_int_prop(OFParent(ph), "#size-cells");
|
|
if (size_cells == -1) {
|
|
size_cells = 1;
|
|
}
|
|
regsize = (addr_cells + size_cells) * sizeof(int);
|
|
|
|
|
|
for (i = 0; i < proplen/regsize; i++) {
|
|
cur_reg = decode_reg( regp + (i * regsize),
|
|
regsize,
|
|
addr_cells,
|
|
size_cells
|
|
);
|
|
start = cur_reg->lo >> PAGE_SHIFT;
|
|
start += cur_reg->hi << (32-PAGE_SHIFT);
|
|
HalpSweepPhysicalRangeInBothCaches(start, 0, cur_reg->size);
|
|
}
|
|
|
|
free(regp);
|
|
|
|
}
|