📄 plxchipfn.c
字号:
/*******************************************************************************
* Copyright (c) 2007 PLX Technology, Inc.
*
* PLX Technology Inc. licenses this software under specific terms and
* conditions. Use of any of the software or derviatives thereof in any
* product without a PLX Technology chip is strictly prohibited.
*
* PLX Technology, Inc. provides this software AS IS, WITHOUT ANY WARRANTY,
* EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. PLX makes no guarantee
* or representations regarding the use of, or the results of the use of,
* the software and documentation in terms of correctness, accuracy,
* reliability, currentness, or otherwise; and you rely on the software,
* documentation and results solely at your own risk.
*
* IN NO EVENT SHALL PLX BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS,
* LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES
* OF ANY KIND. IN NO EVENT SHALL PLX'S TOTAL LIABILITY EXCEED THE SUM
* PAID TO PLX FOR THE PRODUCT LICENSED HEREUNDER.
*
******************************************************************************/
/******************************************************************************
*
* File Name:
*
* PlxChipFn.c
*
* Description:
*
* Contains PLX chip-specific support functions
*
* Revision History:
*
* 02-01-07 : PLX SDK v5.00
*
******************************************************************************/
#include "DriverDefs.h"
#include "PlxInterrupt.h"
#include "SupportFunc.h"
/******************************************************************************
*
* Function : PlxChipInterruptsEnable
*
* Description: Globally enables PLX chip interrupts
*
*****************************************************************************/
BOOLEAN
PlxChipInterruptsEnable(
DEVICE_EXTENSION *pdx
)
{
U32 RegInterrupt;
// Enable PCI interrupt
RegInterrupt =
PLX_9000_REG_READ(
pdx,
PCI9080_INT_CTRL_STAT
);
PLX_9000_REG_WRITE(
pdx,
PCI9080_INT_CTRL_STAT,
RegInterrupt | (1 << 8)
);
return TRUE;
}
/******************************************************************************
*
* Function : PlxChipInterruptsDisable
*
* Description: Globally disables PLX chip interrupts
*
*****************************************************************************/
BOOLEAN
PlxChipInterruptsDisable(
DEVICE_EXTENSION *pdx
)
{
U32 RegInterrupt;
// Disable PCI interrupt
RegInterrupt =
PLX_9000_REG_READ(
pdx,
PCI9080_INT_CTRL_STAT
);
PLX_9000_REG_WRITE(
pdx,
PCI9080_INT_CTRL_STAT,
RegInterrupt & ~(1 << 8)
);
return TRUE;
}
/******************************************************************************
*
* Function : PlxChipSetInterruptNotifyFlags
*
* Description: Sets the interrupt notification flags of a wait object
*
******************************************************************************/
VOID
PlxChipSetInterruptNotifyFlags(
PLX_INTERRUPT *pPlxIntr,
PLX_WAIT_OBJECT *pWaitObject
)
{
// Clear notify events
pWaitObject->Notify_Flags = INTR_TYPE_NONE;
if (pPlxIntr->PciAbort)
pWaitObject->Notify_Flags |= INTR_TYPE_PCI_ABORT;
if (pPlxIntr->LocalToPci_1)
pWaitObject->Notify_Flags |= INTR_TYPE_LOCAL_1;
if (pPlxIntr->DmaChannel_0)
pWaitObject->Notify_Flags |= INTR_TYPE_DMA_0;
if (pPlxIntr->DmaChannel_1)
pWaitObject->Notify_Flags |= INTR_TYPE_DMA_1;
if (pPlxIntr->MuOutboundPost)
pWaitObject->Notify_Flags |= INTR_TYPE_OUTBOUND_POST;
pWaitObject->Notify_Doorbell = pPlxIntr->Doorbell;
}
/******************************************************************************
*
* Function : PlxChipSetInterruptStatusFlags
*
* Description: Sets the interrupts that triggered notification
*
******************************************************************************/
VOID
PlxChipSetInterruptStatusFlags(
PLX_INTERRUPT_DATA *pIntData,
PLX_INTERRUPT *pPlxIntr
)
{
// Clear all interrupt flags
RtlZeroMemory(
pPlxIntr,
sizeof(PLX_INTERRUPT)
);
if (pIntData->Source_Ints & INTR_TYPE_PCI_ABORT)
pPlxIntr->PciAbort = 1;
if (pIntData->Source_Ints & INTR_TYPE_LOCAL_1)
pPlxIntr->LocalToPci_1 = 1;
if (pIntData->Source_Ints & INTR_TYPE_DMA_0)
pPlxIntr->DmaChannel_0 = 1;
if (pIntData->Source_Ints & INTR_TYPE_DMA_1)
pPlxIntr->DmaChannel_1 = 1;
if (pIntData->Source_Ints & INTR_TYPE_OUTBOUND_POST)
pPlxIntr->MuOutboundPost = 1;
pPlxIntr->Doorbell = pIntData->Source_Doorbell;
}
/******************************************************************************
*
* Function : PlxChipGetRemapOffset
*
* Description: Returns the remap register offset for a PCI BAR space
*
******************************************************************************/
VOID
PlxChipGetRemapOffset(
DEVICE_EXTENSION *pdx,
U8 BarIndex,
U16 *pOffset_RegRemap
)
{
U32 RegValue;
BOOLEAN bBarsShifted;
// Check if BAR2/BAR3 are shifted to BAR0/BAR1
RegValue =
PLX_9000_REG_READ(
pdx,
PCI9080_ENDIAN_DESC
);
if ((RegValue & 0x300) == 0x200)
{
bBarsShifted = TRUE;
}
else
{
bBarsShifted = FALSE;
}
switch (BarIndex)
{
case 0:
/**************************************************
* Space 1 is a special case. If the I2O Decode
* enable bit is set, BAR3 is moved to BAR0
*************************************************/
// Check if I2O decode is enabled
RegValue =
PLX_9000_REG_READ(
pdx,
PCI9080_FIFO_CTRL_STAT
);
if (RegValue & (1 << 0))
{
// I2O Decode is enbled, use BAR0 for Space 1
*pOffset_RegRemap = PCI9080_SPACE1_REMAP;
return;
}
break;
case 1:
// BAR 1 could be Space 0 if shifted
if (bBarsShifted)
{
*pOffset_RegRemap = PCI9080_SPACE0_REMAP;
return;
}
break;
case 2:
// BAR 2 could be Space 0 or Space 1 if shifted
if (bBarsShifted)
*pOffset_RegRemap = PCI9080_SPACE1_REMAP;
else
*pOffset_RegRemap = PCI9080_SPACE0_REMAP;
return;
case 3:
// BAR 3 can only be Space 1
*pOffset_RegRemap = PCI9080_SPACE1_REMAP;
return;
}
DebugPrintf(("ERROR - Invalid Space\n"));
// BAR not supported
*pOffset_RegRemap = (U16)-1;
}
/******************************************************************************
*
* Function : PlxChipPostCommonBufferProperties
*
* Description: Post the common buffer properties to the device
*
******************************************************************************/
VOID
PlxChipPostCommonBufferProperties(
DEVICE_EXTENSION *pdx,
U32 PhysicalAddress,
U32 Size
)
{
// Write the Physical Address
PLX_9000_REG_WRITE(
pdx,
PCI9080_MAILBOX3,
PhysicalAddress
);
// Write the Size
PLX_9000_REG_WRITE(
pdx,
PCI9080_MAILBOX4,
Size
);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -