mirror of https://github.com/tongzx/nt5src
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.
227 lines
5.7 KiB
227 lines
5.7 KiB
/*++
|
|
|
|
Copyright (c) 1993 ACER America Corporation
|
|
|
|
Module Name:
|
|
|
|
acer.c
|
|
|
|
Abstract:
|
|
|
|
ACER Write-back Secondary Cache Control c code.
|
|
|
|
This module implements the code which detects and enables the
|
|
secondary write-back cache on ACER products (ICL also).
|
|
|
|
Environment:
|
|
|
|
Kernel mode only.
|
|
|
|
--*/
|
|
|
|
#include "halp.h"
|
|
#include "spacer.h" // i/o addresses & bit definitions
|
|
|
|
|
|
ULONG HalpGetCmosData (
|
|
IN ULONG BusNumber,
|
|
IN ULONG SlotNumber,
|
|
IN PVOID Buffer,
|
|
IN ULONG Length
|
|
);
|
|
|
|
|
|
VOID HalpAcerInitializeCache ( VOID ); // externally used
|
|
BOOLEAN has_write_back_cache( VOID ); // local only
|
|
|
|
|
|
// ************************ routines ****************************
|
|
|
|
BOOLEAN has_write_back_cache( VOID )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine checks to see if this machine supports a secondary
|
|
write-back cache.
|
|
|
|
This routine checks if the machine is an ACER, ALTOS, or ICL product.
|
|
|
|
eisa id: acr32xx - acer product
|
|
eisa id: acs32xx - altos product
|
|
eisa id: icl00xx - icl product
|
|
|
|
The only thing that tells us whether or not the CPU has a secondary
|
|
write-back cache is the least significant byte of the EISA id.
|
|
|
|
xx = 61h for cpu0 indicates the presence of a write-back cache
|
|
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
TRUE machine supports a secondary write-back cache.
|
|
FALSE machine is not known to support a write-back cache.
|
|
|
|
--*/
|
|
|
|
{
|
|
UCHAR id0, id1, id2, id3;
|
|
|
|
// grab cpu0's eisa id information
|
|
id0 = READ_PORT_UCHAR( (PUCHAR) ACER_CPU0_EISA_ID0 );
|
|
id1 = READ_PORT_UCHAR( (PUCHAR) ACER_CPU0_EISA_ID1 );
|
|
id2 = READ_PORT_UCHAR( (PUCHAR) ACER_CPU0_EISA_ID2 );
|
|
|
|
|
|
// are we a acer or altos machine?
|
|
if ( (id0 == (UCHAR) ACER_ID0 &&
|
|
id1 == (UCHAR) ACER_ID1 &&
|
|
id2 == (UCHAR) ACER_ID2 ) ||
|
|
(id0 == (UCHAR) ALTOS_ID0 &&
|
|
id1 == (UCHAR) ALTOS_ID1 &&
|
|
id2 == (UCHAR) ALTOS_ID2 ) ) {
|
|
|
|
// check the lsw id cpu to see if it has a write back cache
|
|
// All acer/altos/icl machines can only have 1 cpu type, so if the
|
|
// first cpu supports a write-back cache then all of them do.
|
|
id3 = READ_PORT_UCHAR( (PUCHAR) ACER_CPU0_EISA_ID3 );
|
|
|
|
if ( id3 == (UCHAR) ACER_EISA_ID_WB_CPU0 )
|
|
return TRUE; // gotcha
|
|
|
|
}
|
|
|
|
|
|
// are we an icl mx machine?
|
|
if ( (id0 == (UCHAR) ICL_ID0 &&
|
|
id1 == (UCHAR) ICL_ID1 &&
|
|
id2 == (UCHAR) ICL_ID2 ) ) {
|
|
|
|
// check the lsw id cpu to see if it has a write back cache
|
|
// All acer/altos/icl machines can only have 1 cpu type, so if the
|
|
// first cpu supports a write-back cache then all of them do.
|
|
id3 = READ_PORT_UCHAR( (PUCHAR) ACER_CPU0_EISA_ID3 );
|
|
|
|
if ( id3 == (UCHAR) ICL_EISA_ID_WB_CPU0 )
|
|
return TRUE; // gotcha
|
|
|
|
}
|
|
|
|
return FALSE; // when in doubt be safe
|
|
}
|
|
|
|
|
|
VOID
|
|
HalpAcerInitializeCache (
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine enables the write-back cache available on certain
|
|
ACER product. If the write-back cache is supported then it enables
|
|
it.
|
|
|
|
NOTE: 1) This routine assumes that the caller has provided any required
|
|
synchronization to query the realtime clock information. Or that
|
|
the HAL code which is calling this routine has serialized access.
|
|
2) For CSR bit definitions see the acer.h file
|
|
|
|
|
|
You cannot call dbgprint to talk to the debugger since the port is not
|
|
initialized yet.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
SideEffects:
|
|
|
|
NMI mask is enabled.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
UCHAR shadow_ram_setup; // tmp var for current shadow stat
|
|
UCHAR high_ram_setup; // tmp var for current ram setup
|
|
|
|
|
|
// say hello to the outside world
|
|
//HalDisplayString(ACER_HAL_VERSION_NUMBER);
|
|
//HalDisplayString("Acer HAL: Searching for secondary write-back cache\n");
|
|
|
|
|
|
// check to see if this particular ACER model even has a
|
|
// write-back cache
|
|
if ( !has_write_back_cache() ) {
|
|
//HalDisplayString("Acer HAL: No write-back cache found\n");
|
|
return;
|
|
}
|
|
|
|
|
|
// retrieve BIOS setup shadow ram status
|
|
// read in byte, mask off bit 0 - 1-RAM BIOS 0-ROM BIOS
|
|
HalpGetCmosData((ULONG) 0, (ULONG) ACER_SHADOW_IDX,
|
|
(PVOID) &shadow_ram_setup, (ULONG) 1 );
|
|
|
|
|
|
// Set up shadow_ram_setup:
|
|
// bit 0 - 1-BIOS Shadow 0=No Shadowing
|
|
|
|
shadow_ram_setup &= RAM_ROM_MASK;
|
|
|
|
if ( shadow_ram_setup == 0 ) {
|
|
//HalDisplayString("Acer HAL: NO BIOS RAM Shadowing\n");
|
|
} else {
|
|
//HalDisplayString("Acer HAL: BIOS RAM Shadowing\n");
|
|
}
|
|
|
|
// retrieve BIOS setup 15MB-16MB ram status
|
|
// mask off bit 1 -
|
|
// 1-(15MB-16MB) RAM 0-(15MB-16MB) EISA
|
|
|
|
HalpGetCmosData((ULONG) 0, (ULONG) ACER_15M_16M_IDX,
|
|
(PVOID) &high_ram_setup, (ULONG) 1 );
|
|
|
|
|
|
// 15MB-16MB memory setup (high_ram_setup):
|
|
// bit 5 1=EISA 0=System RAM
|
|
// note: the polarity is opposite from what getcmosdata read
|
|
|
|
high_ram_setup &= DRAM_EISA_MASK; // just grab bit 1
|
|
high_ram_setup ^= DRAM_EISA_MASK; // invert polarity
|
|
high_ram_setup <<= 4; // place at bit<4>
|
|
|
|
if ( high_ram_setup == 0) {
|
|
//HalDisplayString("Acer HAL: 15Mb to 16Mb Allocated to System RAM\n");
|
|
} else {
|
|
//HalDisplayString("Acer HAL: 15Mb to 16Mb Allocated to I/O Space\n");
|
|
}
|
|
|
|
// Enable write-back secondary cache on cpus 0 & 1
|
|
// by setting bit<2>
|
|
WRITE_PORT_UCHAR( (PUCHAR) ACER_PORT_CPU01,
|
|
(UCHAR) (WRITE_BALLOC_ON | shadow_ram_setup | high_ram_setup));
|
|
|
|
|
|
// always set write-back secondary cache on cpus 2 & 3
|
|
// even if system does not have cpus 2 & 3
|
|
WRITE_PORT_UCHAR( (PUCHAR) ACER_PORT_CPU23,
|
|
(UCHAR) (WRITE_BALLOC_ON | shadow_ram_setup | high_ram_setup));
|
|
|
|
// flush the last pending i/o write by reading a safe io location
|
|
READ_PORT_UCHAR( (PUCHAR) EISA_FLUSH_ADDR );
|
|
|
|
// that's all folks
|
|
//HalDisplayString("Acer HAL: Write-back cache enabled!\n");
|
|
}
|