156 lines
3.3 KiB
C
156 lines
3.3 KiB
C
|
/*
|
||
|
* CPQ1000.C - COMPAQ 1000 PCI chipset routines.
|
||
|
*
|
||
|
* Notes:
|
||
|
* Algorithms from COMPAQ 1000 Data Sheet
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include "local.h"
|
||
|
|
||
|
const UCHAR LinkToIndex[]={0, 1, 6, 7, 4, 5};
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* CPQ1000SetIRQ - Set a CPQ1000 PCI link to a specific IRQ
|
||
|
*
|
||
|
* Exported.
|
||
|
*
|
||
|
* ENTRY: bIRQNumber is the new IRQ to be used.
|
||
|
*
|
||
|
* bLink is the Link to be set.
|
||
|
*
|
||
|
* EXIT: Standard PCIMP return value.
|
||
|
*
|
||
|
***************************************************************************/
|
||
|
PCIMPRET CDECL
|
||
|
CPQ1000SetIRQ(UCHAR bIRQNumber, UCHAR bLink)
|
||
|
{
|
||
|
UCHAR bOldValue, bOldIndex, bIndex;
|
||
|
//
|
||
|
// Validate link number.
|
||
|
//
|
||
|
if (bLink > 6) {
|
||
|
|
||
|
return(PCIMP_INVALID_LINK);
|
||
|
}
|
||
|
//
|
||
|
// Get the index from the link.
|
||
|
//
|
||
|
bIndex=LinkToIndex[bLink-1];
|
||
|
|
||
|
//
|
||
|
// Save the old index value.
|
||
|
//
|
||
|
bOldIndex=READ_PORT_UCHAR((PUCHAR)0xC00);
|
||
|
|
||
|
//
|
||
|
// Setup to process the desired link.
|
||
|
//
|
||
|
WRITE_PORT_UCHAR((PUCHAR)0xC00, bIndex);
|
||
|
|
||
|
//
|
||
|
// Read the old IRQ value.
|
||
|
//
|
||
|
bOldValue=(UCHAR)(READ_PORT_UCHAR((PUCHAR)0xC01) & 0x0f);
|
||
|
|
||
|
bOldValue|=(bIRQNumber<<4);
|
||
|
|
||
|
//
|
||
|
// Set the VESUVIUS IRQ register.
|
||
|
//
|
||
|
WRITE_PORT_UCHAR((PUCHAR)0xC01, bOldValue);
|
||
|
|
||
|
//
|
||
|
// Restore the old index value.
|
||
|
//
|
||
|
WRITE_PORT_UCHAR((PUCHAR)0xC00, bOldIndex);
|
||
|
|
||
|
return(PCIMP_SUCCESS);
|
||
|
}
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* CPQ1000GetIRQ - Get the IRQ of a CPQ1000 PCI link
|
||
|
*
|
||
|
* Exported.
|
||
|
*
|
||
|
* ENTRY: pbIRQNumber is the buffer to fill.
|
||
|
*
|
||
|
* bLink is the Link to be read.
|
||
|
*
|
||
|
* EXIT: Standard PCIMP return value.
|
||
|
*
|
||
|
***************************************************************************/
|
||
|
PCIMPRET CDECL
|
||
|
CPQ1000GetIRQ(PUCHAR pbIRQNumber, UCHAR bLink)
|
||
|
{
|
||
|
UCHAR bOldValue, bOldIndex, bIndex;
|
||
|
//
|
||
|
// Validate link number.
|
||
|
//
|
||
|
if (bLink > 6) {
|
||
|
|
||
|
return(PCIMP_INVALID_LINK);
|
||
|
}
|
||
|
//
|
||
|
// Get the index from the link.
|
||
|
//
|
||
|
bIndex=LinkToIndex[bLink-1];
|
||
|
|
||
|
//
|
||
|
// Save the old index value.
|
||
|
//
|
||
|
bOldIndex=READ_PORT_UCHAR((PUCHAR)0xC00);
|
||
|
|
||
|
//
|
||
|
// Setup to read the correct link.
|
||
|
//
|
||
|
WRITE_PORT_UCHAR((PUCHAR)0xC00, bIndex);
|
||
|
|
||
|
bOldValue=READ_PORT_UCHAR((PUCHAR)0xC01);
|
||
|
|
||
|
*pbIRQNumber=(bOldValue>>4);
|
||
|
|
||
|
//
|
||
|
// Restore the old index value.
|
||
|
//
|
||
|
WRITE_PORT_UCHAR((PUCHAR)0xC00, bOldIndex);
|
||
|
|
||
|
return(PCIMP_SUCCESS);
|
||
|
}
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* CPQ1000ValidateTable - Validate an IRQ table
|
||
|
*
|
||
|
* Exported.
|
||
|
*
|
||
|
* ENTRY: piihIRQInfoHeader points to an IRQInfoHeader followed
|
||
|
* by an IRQ Routing Table.
|
||
|
*
|
||
|
* ulFlags are PCIMP_VALIDATE flags.
|
||
|
*
|
||
|
* EXIT: Standard PCIMP return value.
|
||
|
*
|
||
|
***************************************************************************/
|
||
|
#ifdef ALLOC_PRAGMA
|
||
|
PCIMPRET CDECL
|
||
|
CPQ1000ValidateTable(PIRQINFOHEADER piihIRQInfoHeader, ULONG ulFlags);
|
||
|
#pragma alloc_text(PAGE, CPQ1000ValidateTable)
|
||
|
#endif //ALLOC_PRAGMA
|
||
|
|
||
|
PCIMPRET CDECL
|
||
|
CPQ1000ValidateTable(PIRQINFOHEADER piihIRQInfoHeader, ULONG ulFlags)
|
||
|
{
|
||
|
PAGED_CODE();
|
||
|
|
||
|
//
|
||
|
// If any link is above 6, it is an error.
|
||
|
//
|
||
|
if (GetMaxLink(piihIRQInfoHeader)>6)
|
||
|
return(PCIMP_FAILURE);
|
||
|
|
||
|
return(PCIMP_SUCCESS);
|
||
|
}
|