/* * NS87560.C - NS NS87560 PCI chipset routines. * * Notes: * Algorithms from National Semiconductor NS87560 Data Sheet * */ #include "local.h" /**************************************************************************** * * NS87560SetIRQ - Set a NS87560 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 NS87560SetIRQ(UCHAR bIRQNumber, UCHAR bLink) { UCHAR bOffset, bOldValue; // // Validate link number. // if (bLink > 4) { return(PCIMP_INVALID_LINK); } // // Zero based. // bLink--; // // Set various values. // bOffset=(bLink/2)+0x6C; // // Read the old NS87560 IRQ register. // bOldValue=ReadConfigUchar(bBusPIC, bDevFuncPIC, bOffset); if (bLink&1) { bOldValue&=0x0f; bOldValue|=(bIRQNumber<<4); } else { bOldValue&=0xf0; bOldValue|=bIRQNumber; } // // Set the NS87560 IRQ register. // WriteConfigUchar(bBusPIC, bDevFuncPIC, bOffset, bOldValue); return(PCIMP_SUCCESS); } /**************************************************************************** * * NS87560GetIRQ - Get the IRQ of a NS87560 PCI link * * Exported. * * ENTRY: pbIRQNumber is the buffer to fill. * * bLink is the Link to be read. * * EXIT: Standard PCIMP return value. * ***************************************************************************/ PCIMPRET CDECL NS87560GetIRQ(PUCHAR pbIRQNumber, UCHAR bLink) { UCHAR bOffset, bOldValue; // // Validate link number. // if (bLink > 4) { return(PCIMP_INVALID_LINK); } // // Zero based. // bLink--; // // Set various values. // bOffset=(bLink/2)+0x6C; // // Read the old NS87560 IRQ register. // bOldValue=ReadConfigUchar(bBusPIC, bDevFuncPIC, bOffset); if (bLink&1) bOldValue>>=4; *pbIRQNumber=bOldValue&0x0f; return(PCIMP_SUCCESS); } /**************************************************************************** * * NS87560SetTrigger - Set the IRQ triggering values for the NS87560 * * Exported. * * ENTRY: ulTrigger has bits set for Level triggered IRQs. * * EXIT: Standard PCIMP return value. * ***************************************************************************/ PCIMPRET CDECL NS87560SetTrigger(ULONG ulTrigger) { WriteConfigUchar(bBusPIC, bDevFuncPIC, 0x67, (UCHAR)ulTrigger); WriteConfigUchar(bBusPIC, bDevFuncPIC, 0x68, (UCHAR)(ulTrigger >> 8)); return (PCIMP_SUCCESS); } /**************************************************************************** * * NS87560GetTrigger - Get the IRQ triggering values for the NS87560 * * Exported. * * ENTRY: pulTrigger will have bits set for Level triggered IRQs. * * EXIT: Standard PCIMP return value. * ***************************************************************************/ PCIMPRET CDECL NS87560GetTrigger(PULONG pulTrigger) { // // Assume all edge. // *pulTrigger = 0; *pulTrigger |= ReadConfigUchar(bBusPIC, bDevFuncPIC, 0x67); *pulTrigger |= (ReadConfigUchar(bBusPIC, bDevFuncPIC, 0x68) << 8); return (PCIMP_SUCCESS); } /**************************************************************************** * * NS87560ValidateTable - 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 NS87560ValidateTable(PIRQINFOHEADER piihIRQInfoHeader, ULONG ulFlags); #pragma alloc_text(PAGE, NS87560ValidateTable) #endif //ALLOC_PRAGMA PCIMPRET CDECL NS87560ValidateTable(PIRQINFOHEADER piihIRQInfoHeader, ULONG ulFlags) { PAGED_CODE(); // // If any link is above 4, it is an error. // if (GetMaxLink(piihIRQInfoHeader)>4) return(PCIMP_FAILURE); return(PCIMP_SUCCESS); }