215 lines
4.7 KiB
C
215 lines
4.7 KiB
C
/*
|
|
* TOSHIBA.C - Toshiba Tecra IRQ routing spec
|
|
*
|
|
* Notes:
|
|
* Algorithms from TECS-1010-1001
|
|
*
|
|
*/
|
|
|
|
#include "local.h"
|
|
|
|
GLOBAL_DATA ULONG SMIPort=0xB2;
|
|
|
|
/****************************************************************************
|
|
*
|
|
* CallSMI - Get into SMI
|
|
*
|
|
* Not exported.
|
|
*
|
|
* ENTRY: rAX is the value for AX as input.
|
|
*
|
|
* rBX is the value for BX as input.
|
|
*
|
|
* rCX is the value for CX as input.
|
|
*
|
|
* prCX is filled with the returned CX, if not NULL.
|
|
*
|
|
* EXIT: TRUE iff no error.
|
|
*
|
|
***************************************************************************/
|
|
BOOLEAN CDECL
|
|
CallSMI(ULONG rAX, ULONG rBX, ULONG rCX, PULONG prCX)
|
|
{
|
|
ULONG ulAX, ulCX;
|
|
|
|
_asm mov eax, rAX
|
|
_asm mov ebx, rBX
|
|
_asm mov ecx, rCX
|
|
_asm mov edx, SMIPort
|
|
_asm in al, dx
|
|
_asm movzx ecx, cx
|
|
_asm mov ulCX, ecx
|
|
_asm movzx eax, ah
|
|
_asm mov ulAX, eax
|
|
|
|
if (prCX)
|
|
*prCX=ulCX;
|
|
|
|
return(ulAX==0);
|
|
}
|
|
|
|
/****************************************************************************
|
|
*
|
|
* ToshibaSetIRQ - Set a Toshiba 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
|
|
ToshibaSetIRQ(UCHAR bIRQNumber, UCHAR bLink)
|
|
{
|
|
//
|
|
// Use 0xFF to disable.
|
|
//
|
|
if (!bIRQNumber)
|
|
bIRQNumber=0xFF;
|
|
|
|
//
|
|
// Ask SMI to set the link.
|
|
//
|
|
return(CallSMI( 0xFF44,
|
|
0x0701,
|
|
(bLink<<8)+bIRQNumber,
|
|
NULL) ?
|
|
PCIMP_SUCCESS :
|
|
PCIMP_FAILURE);
|
|
}
|
|
|
|
/****************************************************************************
|
|
*
|
|
* ToshibaGetIRQ - Get the IRQ of a Toshiba PCI link
|
|
*
|
|
* Exported.
|
|
*
|
|
* ENTRY: pbIRQNumber is the buffer to fill.
|
|
*
|
|
* bLink is the Link to be read.
|
|
*
|
|
* EXIT: Standard PCIMP return value.
|
|
*
|
|
***************************************************************************/
|
|
PCIMPRET CDECL
|
|
ToshibaGetIRQ(PUCHAR pbIRQNumber, UCHAR bLink)
|
|
{
|
|
ULONG ulCX;
|
|
|
|
//
|
|
// Ask SMI to get the link.
|
|
//
|
|
if (!CallSMI( 0xFE44,
|
|
0x0701,
|
|
bLink<<8,
|
|
&ulCX))
|
|
return(PCIMP_FAILURE);
|
|
|
|
//
|
|
// Get the byte only.
|
|
//
|
|
ulCX&=0xFF;
|
|
|
|
//
|
|
// Use 0xFF to disable.
|
|
//
|
|
if (ulCX==0xFF)
|
|
ulCX=0;
|
|
|
|
//
|
|
// Store the IRQ value.
|
|
//
|
|
*pbIRQNumber=(UCHAR)ulCX;
|
|
|
|
return(PCIMP_SUCCESS);
|
|
}
|
|
|
|
/****************************************************************************
|
|
*
|
|
* ToshibaSetTrigger - Set the IRQ triggering values for the Toshiba
|
|
*
|
|
* Exported.
|
|
*
|
|
* ENTRY: ulTrigger has bits set for Level triggered IRQs.
|
|
*
|
|
* EXIT: Standard PCIMP return value.
|
|
*
|
|
***************************************************************************/
|
|
PCIMPRET CDECL
|
|
ToshibaSetTrigger(ULONG ulTrigger)
|
|
{
|
|
//
|
|
// Ask SMI to set the triggering mechanism.
|
|
//
|
|
return(CallSMI( 0xFF44,
|
|
0x0702,
|
|
ulTrigger,
|
|
NULL) ?
|
|
PCIMP_SUCCESS :
|
|
PCIMP_FAILURE);
|
|
}
|
|
|
|
/****************************************************************************
|
|
*
|
|
* ToshibaGetTrigger - Get the IRQ triggering values for the Toshiba
|
|
*
|
|
* Exported.
|
|
*
|
|
* ENTRY: pulTrigger will have bits set for Level triggered IRQs.
|
|
*
|
|
* EXIT: Standard PCIMP return value.
|
|
*
|
|
***************************************************************************/
|
|
PCIMPRET CDECL
|
|
ToshibaGetTrigger(PULONG pulTrigger)
|
|
{
|
|
//
|
|
// Assume all edge.
|
|
//
|
|
*pulTrigger = 0;
|
|
|
|
//
|
|
// Ask SMI to get the triggering mechanism.
|
|
//
|
|
return(CallSMI( 0xFE44,
|
|
0x0702,
|
|
0,
|
|
pulTrigger) ?
|
|
PCIMP_SUCCESS :
|
|
PCIMP_FAILURE);
|
|
}
|
|
|
|
/****************************************************************************
|
|
*
|
|
* ToshibaValidateTable - 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
|
|
ToshibaValidateTable(PIRQINFOHEADER piihIRQInfoHeader, ULONG ulFlags);
|
|
#pragma alloc_text(PAGE, ToshibaValidateTable)
|
|
#endif //ALLOC_PRAGMA
|
|
|
|
PCIMPRET CDECL
|
|
ToshibaValidateTable(PIRQINFOHEADER piihIRQInfoHeader, ULONG ulFlags)
|
|
{
|
|
PAGED_CODE();
|
|
|
|
SMIPort=*(((PUSHORT)&(piihIRQInfoHeader->MiniportData))+1);
|
|
|
|
return(((ulFlags & PCIMP_VALIDATE_SOURCE_BITS)==PCIMP_VALIDATE_SOURCE_PCIBIOS) ?
|
|
PCIMP_FAILURE : PCIMP_SUCCESS);
|
|
}
|