/*
 *  Cx5520.C - Cyrix Cx5520 PCI chipset routines.
 *
 *  Notes:
 *  Algorithms from Cyrix Cx5520 Data Sheet
 *
 */

#include "local.h"

/****************************************************************************
 *
 *  Cx5520SetIRQ - Set a Cx5520 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
Cx5520SetIRQ(UCHAR bIRQNumber, UCHAR bLink)
{
    UCHAR bOldValue, bNewValue, bOffset;
    
    //
    // Validate link number.
    //
    if (bLink > 4)
        return(PCIMP_INVALID_LINK);

    bOffset = (UCHAR)(((bLink - 1) / 2) + 0x5C);
    
    bOldValue = ReadConfigUchar(bBusPIC, bDevFuncPIC, bOffset);

    if (bLink & 1)
    {
        bNewValue = (UCHAR)((bOldValue & 0xF0) | (bIRQNumber & 0x0F));  
    }
    else
    {
        bNewValue = (UCHAR)((bOldValue & 0x0F) | (bIRQNumber << 4));        
    }
    
    WriteConfigUchar(bBusPIC, bDevFuncPIC, bOffset, bNewValue);
    
    return(PCIMP_SUCCESS);
}

/****************************************************************************
 *
 *  Cx5520GetIRQ - Get the IRQ of a Cx5520 PCI link
 *
 *  Exported.
 *
 *  ENTRY:  pbIRQNumber is the buffer to fill.
 *
 *      bLink is the Link to be read.
 *
 *  EXIT:   Standard PCIMP return value.
 *
 ***************************************************************************/
PCIMPRET CDECL
Cx5520GetIRQ(PUCHAR pbIRQNumber, UCHAR bLink)
{
    UCHAR bOldValue, bOffset;
    
    //
    // Validate link number.
    //
    if (bLink > 4)
        return(PCIMP_INVALID_LINK);
    
    bOffset = (UCHAR)(((bLink - 1) / 2) + 0x5C);
    
    bOldValue = ReadConfigUchar(bBusPIC, bDevFuncPIC, bOffset);

    if (!(bLink & 1))
    {
        bOldValue >>= 4;
    }
    
    *pbIRQNumber = (UCHAR)(bOldValue & 0x0F);

    return(PCIMP_SUCCESS);
}

/****************************************************************************
 *
 *  Cx5520ValidateTable - 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
Cx5520ValidateTable(PIRQINFOHEADER piihIRQInfoHeader, ULONG ulFlags);
#pragma alloc_text(PAGE, Cx5520ValidateTable)
#endif //ALLOC_PRAGMA

PCIMPRET CDECL
Cx5520ValidateTable(PIRQINFOHEADER piihIRQInfoHeader, ULONG ulFlags)
{
    PAGED_CODE();

    return ((GetMaxLink(piihIRQInfoHeader) > 4)? PCIMP_FAILURE : PCIMP_SUCCESS);
}