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.
346 lines
6.1 KiB
346 lines
6.1 KiB
//#pragma comment(exestr, "$Header: /usr4/winnt/SOURCES/halpcims/src/hal/halsnipm/mips/RCS/xxcache.c,v 1.4 1996/03/04 13:27:00 pierre Exp $")
|
|
/*++
|
|
|
|
Copyright (c) 1993-94 Siemens Nixdorf Informationssysteme AG
|
|
|
|
Module Name:
|
|
|
|
xxcache.c
|
|
|
|
Abstract:
|
|
|
|
|
|
This module implements the functions necessesary to call the correct Cache routines
|
|
depending on Uni- or MultiProcessor machine typ.
|
|
|
|
Environment:
|
|
|
|
Kernel mode only.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "halp.h"
|
|
#include "mpagent.h"
|
|
#include "xxcache.h"
|
|
|
|
HalpProcessorType HalpProcessorId = UNKNOWN;
|
|
|
|
|
|
|
|
// Desktop : processor may be R4600 or R4700 both of them with or without SC
|
|
// Minitower : processors may be R4700 with or without SC or R4400 + MPAgent (1 or 2)
|
|
|
|
VOID
|
|
HalpProcessorConfig()
|
|
{
|
|
ULONG Proc, reg;
|
|
|
|
Proc = HalpProcIdentify();
|
|
HalpMainBoard = (MotherBoardType) READ_REGISTER_UCHAR(0xbff0002a);
|
|
if (HalpMainBoard == M8150) HalpIsTowerPci = TRUE;
|
|
|
|
switch (Proc) {
|
|
|
|
case HalpR4600:
|
|
case HalpR4700:
|
|
if (PCR->SecondLevelDcacheFillSize) HalpProcessorId = ORIONSC; // ASIC driven SC
|
|
else HalpProcessorId = R4x00;
|
|
break;
|
|
|
|
default:
|
|
// RM200 and RM300 use the same bit but use the opposite value to determine the new ASIC revision...
|
|
// ASIC rev 1.0 => cache replace memory (special area reserved by the firmware).
|
|
// ASIC rev >= 1.1 => cache replace with the ASIC register value.
|
|
if (HalpMainBoard == DesktopPCI) {
|
|
UCHAR tmp;
|
|
tmp = READ_REGISTER_UCHAR(PCI_MSR_ADDR);
|
|
if (tmp & PCI_MSR_REV_ASIC) HalpMpaCacheReplace = RM300_RESERVED | KSEG0_BASE; // rev 1.0
|
|
else HalpMpaCacheReplace = MPAGENT_RESERVED | KSEG0_BASE; // rev 1.1
|
|
} else {
|
|
if (HalpMainBoard == MinitowerPCI) {
|
|
UCHAR tmp;
|
|
tmp = READ_REGISTER_UCHAR(PCI_MSR_ADDR);
|
|
if (tmp & PCI_MSR_REV_ASIC) HalpMpaCacheReplace = MPAGENT_RESERVED | KSEG0_BASE; // rev 1.1
|
|
else HalpMpaCacheReplace = RM300_RESERVED | KSEG0_BASE; // rev 1.0
|
|
} else HalpMpaCacheReplace = MPAGENT_RESERVED | KSEG0_BASE; // RM400 all ASIC
|
|
}
|
|
|
|
HalpProcessorId = MPAGENT; // R4x00 always with MPAgent on the PCI range.
|
|
|
|
if (HalpMpaCacheReplace == MPAGENT_RESERVED | KSEG0_BASE) {
|
|
reg = ((MPAGENT_RESERVED & // put the reserved physical address (4Mb long)
|
|
MPA_OP_ADDR_MASK) |
|
|
MPA_OP_ENABLE); // enable the operator
|
|
} else {
|
|
reg = 0;
|
|
}
|
|
|
|
WRITE_REGISTER_ULONG(&(mpagent->mem_operator), reg); // for all procs (done for proc 0 in xxcache)
|
|
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
HalFlushDcachePage(
|
|
IN PVOID Color,
|
|
IN ULONG PageFrame,
|
|
IN ULONG Length
|
|
)
|
|
{
|
|
|
|
switch (HalpProcessorId) {
|
|
|
|
case MPAGENT:
|
|
|
|
HalpFlushDcachePageMulti(
|
|
Color,
|
|
PageFrame,
|
|
Length
|
|
);
|
|
break;
|
|
|
|
case ORIONSC:
|
|
|
|
HalSweepDcacheRange(
|
|
Color,
|
|
Length
|
|
);
|
|
HalpFlushDcachePageOrion(
|
|
Color,
|
|
PageFrame,
|
|
Length
|
|
);
|
|
break;
|
|
|
|
case R4x00:
|
|
|
|
HalpFlushDcachePageUni(
|
|
Color,
|
|
PageFrame,
|
|
Length
|
|
);
|
|
break;
|
|
|
|
case UNKNOWN:
|
|
|
|
HalpProcessorConfig();
|
|
HalFlushDcachePage(Color, PageFrame, Length);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
VOID
|
|
HalPurgeDcachePage (
|
|
IN PVOID Color,
|
|
IN ULONG PageFrame,
|
|
IN ULONG Length
|
|
)
|
|
{
|
|
|
|
switch (HalpProcessorId) {
|
|
|
|
case MPAGENT:
|
|
|
|
HalpFlushDcachePageMulti(
|
|
Color,
|
|
PageFrame,
|
|
Length
|
|
);
|
|
break;
|
|
|
|
case ORIONSC:
|
|
|
|
HalSweepDcacheRange(
|
|
Color,
|
|
Length
|
|
);
|
|
HalpFlushDcachePageOrion(
|
|
Color,
|
|
PageFrame,
|
|
Length
|
|
);
|
|
break;
|
|
|
|
case R4x00:
|
|
|
|
HalpPurgeDcachePageUni(
|
|
Color,
|
|
PageFrame,
|
|
Length
|
|
);
|
|
break;
|
|
|
|
case UNKNOWN:
|
|
|
|
HalpProcessorConfig();
|
|
HalPurgeDcachePage(Color, PageFrame, Length);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
VOID
|
|
HalPurgeIcachePage(
|
|
IN PVOID Color,
|
|
IN ULONG PageFrame,
|
|
IN ULONG Length
|
|
)
|
|
{
|
|
|
|
switch (HalpProcessorId) {
|
|
|
|
case MPAGENT:
|
|
|
|
HalpPurgeIcachePageMulti(
|
|
Color,
|
|
PageFrame,
|
|
Length
|
|
);
|
|
break;
|
|
|
|
case ORIONSC:
|
|
|
|
HalSweepIcacheRange(
|
|
Color,
|
|
Length
|
|
);
|
|
HalpPurgeIcachePageOrion(
|
|
Color,
|
|
PageFrame,
|
|
Length
|
|
);
|
|
break;
|
|
|
|
case R4x00:
|
|
|
|
HalpPurgeIcachePageUni(
|
|
Color,
|
|
PageFrame,
|
|
Length
|
|
);
|
|
break;
|
|
|
|
case UNKNOWN:
|
|
|
|
HalpProcessorConfig();
|
|
HalPurgeIcachePage(Color, PageFrame, Length);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
VOID
|
|
HalSweepDcache(
|
|
VOID
|
|
)
|
|
{
|
|
|
|
switch (HalpProcessorId) {
|
|
|
|
case MPAGENT:
|
|
|
|
HalpSweepDcacheMulti();
|
|
break;
|
|
|
|
case ORIONSC:
|
|
|
|
HalpSweepDcacheOrion();
|
|
break;
|
|
|
|
case R4x00:
|
|
|
|
HalpSweepDcacheUni();
|
|
break;
|
|
|
|
case UNKNOWN:
|
|
|
|
HalpProcessorConfig();
|
|
HalSweepDcache();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
VOID
|
|
HalSweepIcache (
|
|
VOID
|
|
)
|
|
{
|
|
|
|
switch (HalpProcessorId) {
|
|
|
|
case MPAGENT:
|
|
|
|
HalpSweepIcacheMulti();
|
|
break;
|
|
|
|
case ORIONSC:
|
|
|
|
HalpSweepIcacheOrion();
|
|
break;
|
|
|
|
case R4x00:
|
|
|
|
HalpSweepIcacheUni();
|
|
break;
|
|
|
|
case UNKNOWN:
|
|
|
|
HalpProcessorConfig();
|
|
HalSweepIcache();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
VOID
|
|
HalZeroPage (
|
|
IN PVOID NewColor,
|
|
IN PVOID OldColor,
|
|
IN ULONG PageFrame
|
|
)
|
|
{
|
|
|
|
switch (HalpProcessorId) {
|
|
|
|
case MPAGENT:
|
|
|
|
HalpZeroPageMulti(
|
|
NewColor,
|
|
OldColor,
|
|
PageFrame
|
|
);
|
|
break;
|
|
|
|
case ORIONSC:
|
|
|
|
HalpZeroPageOrion(
|
|
NewColor,
|
|
OldColor,
|
|
PageFrame
|
|
);
|
|
break;
|
|
|
|
case R4x00:
|
|
|
|
HalpZeroPageUni(
|
|
NewColor,
|
|
OldColor,
|
|
PageFrame
|
|
);
|
|
break;
|
|
|
|
case UNKNOWN:
|
|
|
|
HalpProcessorConfig();
|
|
HalZeroPage(NewColor, OldColor, PageFrame);
|
|
|
|
}
|
|
|
|
}
|
|
|