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