📄 ixperfprofaccbuspmu.c
字号:
srVirtualAddress = (UINT32)IX_OSAL_MEM_MAP(PMU_SR,IX_OSAL_IXP400_PMU_MAP_SIZE); #endif if (IX_PERFPROF_ACC_BUS_PMU_MODE_HALT == mode ) { return (IX_PERFPROF_ACC_STATUS_BUS_PMU_MODE_ERROR); } status = ixPerfProfAccLock(); if (IX_PERFPROF_ACC_STATUS_SUCCESS != status) { return IX_PERFPROF_ACC_STATUS_ANOTHER_UTIL_IN_PROGRESS; } else { /* Store input parameters into a structure */ eventsPerCounter.counterMode = mode; eventsPerCounter.counterEvent1 = pecEvent1; eventsPerCounter.counterEvent2 = pecEvent2; eventsPerCounter.counterEvent3 = pecEvent3; eventsPerCounter.counterEvent4 = pecEvent4; eventsPerCounter.counterEvent5 = pecEvent5; eventsPerCounter.counterEvent6 = pecEvent6; eventsPerCounter.counterEvent7 = pecEvent7; /* Initialise 59 bit supporting counters */ for (PecCounter = 0; IX_PERFPROF_ACC_BUS_PMU_MAX_PECS > PecCounter; PecCounter++) { upper32BitCounter[PecCounter] = 0; } /* End of for loop */ /* Bind interrupt handler to increment counter when an overflow occurs */ if (IX_SUCCESS != ixOsalIrqBind ( IX_OSAL_IXP400_AHB_PMU_IRQ_LVL, (IxOsalVoidFnVoidPtr)ixPerfProfAccBusPmuPecOverflowHdlr, NULL)) { ixPerfProfAccUnlock(); return IX_PERFPROF_ACC_STATUS_FAIL; } else { /* Call setup function to setup Event Status Register */ status = ixPerfProfAccBusPmuSetup(eventsPerCounter); if (IX_SUCCESS != status) { /* Unbind the interrupt */ ixOsalIrqUnbind (IX_OSAL_IXP400_AHB_PMU_IRQ_LVL);#ifdef __vxworks IX_OSAL_MEM_UNMAP(esrVirtualAddress); IX_OSAL_MEM_UNMAP(srVirtualAddress);#endif ixPerfProfAccUnlock(); startFlag = FALSE; } else { startFlag = TRUE; } } /* End of if-else */ return status; } /* End of if-else */} /* End of function ixPerfProfAccBusPmuStart *//** * * Function to check the validity of choices for PEC1 to PEC7 for North Mode * Return errors if choice/s are not valid, otherwise set Event Select Register * and mode to North * **/IxPerfProfAccStatusixPerfProfAccBusPmuNorthCheckAndSelect (IxPerfProfAccBusPmuModeEvents modeEvents){ /* Variable for event select register. Set to 0 initially */ UINT32 esrValue = 0; /* Check if PEC1 selection is within range for North Mode */ if((modeEvents.counterEvent1 < IX_PERFPROF_ACC_BUS_PMU_PEC1_NORTH_NPEA_GRANT_SELECT)|| (modeEvents.counterEvent1 > IX_PERFPROF_ACC_BUS_PMU_PEC1_NORTH_NPEC_REQ_SELECT)) { return IX_PERFPROF_ACC_STATUS_BUS_PMU_PEC1_ERROR; } /* Event select for PEC1 */ SET_PMU_PEC(esrValue,PEC1,ixPerfProfAccBusPmuEventMap[modeEvents.counterEvent1]); /* Check if PEC2 selection is within range for North Mode */ if((modeEvents.counterEvent2 < IX_PERFPROF_ACC_BUS_PMU_PEC2_NORTH_NPEA_XFER_SELECT)|| (modeEvents.counterEvent2 > IX_PERFPROF_ACC_BUS_PMU_PEC2_NORTH_NPEC_OWN_SELECT)) { return IX_PERFPROF_ACC_STATUS_BUS_PMU_PEC2_ERROR; } /* Event select for PEC2 */ SET_PMU_PEC(esrValue,PEC2,ixPerfProfAccBusPmuEventMap[modeEvents.counterEvent2]); /* Check if PEC3 selection is within range for North Mode */ if((modeEvents.counterEvent3 < IX_PERFPROF_ACC_BUS_PMU_PEC3_NORTH_NPEA_RETRY_SELECT)|| (modeEvents.counterEvent3 > IX_PERFPROF_ACC_BUS_PMU_PEC3_NORTH_NPEC_WRITE_SELECT)) { return IX_PERFPROF_ACC_STATUS_BUS_PMU_PEC3_ERROR; } /* Event select for PEC3 */ SET_PMU_PEC(esrValue,PEC3,ixPerfProfAccBusPmuEventMap[modeEvents.counterEvent3]); /* Check if PEC4 selection is within range for North Mode */ if((modeEvents.counterEvent4 < IX_PERFPROF_ACC_BUS_PMU_PEC4_NORTH_ABB_SPLIT_SELECT)|| (modeEvents.counterEvent4 > IX_PERFPROF_ACC_BUS_PMU_PEC4_NORTH_NPEC_READ_SELECT)) { return IX_PERFPROF_ACC_STATUS_BUS_PMU_PEC4_ERROR; } /* Event select for PEC4 */ SET_PMU_PEC(esrValue,PEC4,ixPerfProfAccBusPmuEventMap[modeEvents.counterEvent4]); /* Check if PEC5 selection is within range for North Mode */ if((modeEvents.counterEvent5 < IX_PERFPROF_ACC_BUS_PMU_PEC5_NORTH_NPEB_GRANT_SELECT)|| (modeEvents.counterEvent5 > IX_PERFPROF_ACC_BUS_PMU_PEC5_NORTH_NPEB_READ_SELECT)) { return IX_PERFPROF_ACC_STATUS_BUS_PMU_PEC5_ERROR; } /* Event select for PEC5 */ SET_PMU_PEC(esrValue,PEC5,ixPerfProfAccBusPmuEventMap[modeEvents.counterEvent5]); /* Check if PEC6 selection is within range for North Mode */ if((modeEvents.counterEvent6 < IX_PERFPROF_ACC_BUS_PMU_PEC6_NORTH_NPEC_GRANT_SELECT)|| (modeEvents.counterEvent6 > IX_PERFPROF_ACC_BUS_PMU_PEC6_NORTH_NPEC_READ_SELECT)) { return IX_PERFPROF_ACC_STATUS_BUS_PMU_PEC6_ERROR; } /* Event select for PEC6 */ SET_PMU_PEC(esrValue,PEC6,ixPerfProfAccBusPmuEventMap[modeEvents.counterEvent6]); /* Check if PEC7 selection is within range for North Mode */ if(modeEvents.counterEvent7 != IX_PERFPROF_ACC_BUS_PMU_PEC7_CYCLE_COUNT_SELECT) { return IX_PERFPROF_ACC_STATUS_BUS_PMU_PEC7_ERROR; } /* Event select for PEC7 */ SET_PMU_PEC(esrValue,PEC7,ixPerfProfAccBusPmuEventMap[modeEvents.counterEvent7]); SET_PMU_MODE(esrValue, IX_PERFPROF_ACC_BUS_PMU_MODE_NORTH); SET_PMU_ESR(esrValue); return IX_PERFPROF_ACC_STATUS_SUCCESS;} /* end of ixPerfProfAccBusPmuNorthCheckAndSelect () *//** * * Function to check the validity of choices for PEC1 to PEC7 for South Mode * Return errors if choice/s are not valid, otherwise set Event Select Register * and mode to South * **/IxPerfProfAccStatusixPerfProfAccBusPmuSouthCheckAndSelect (IxPerfProfAccBusPmuModeEvents modeEvents){ /* Variable for event select register. Set to 0 initially */ UINT32 esrValue = 0; /* Check if PEC1 selection is within range for South Mode */ if((modeEvents.counterEvent1 < IX_PERFPROF_ACC_BUS_PMU_PEC1_SOUTH_GSKT_GRANT_SELECT)|| (modeEvents.counterEvent1 > IX_PERFPROF_ACC_BUS_PMU_PEC1_SOUTH_APB_REQ_SELECT)) { return IX_PERFPROF_ACC_STATUS_BUS_PMU_PEC1_ERROR; } /* Event select for PEC1 */ SET_PMU_PEC(esrValue,PEC1,ixPerfProfAccBusPmuEventMap[modeEvents.counterEvent1]); /* Check if PEC2 selection is within range for South Mode */ if((modeEvents.counterEvent2 < IX_PERFPROF_ACC_BUS_PMU_PEC2_SOUTH_GSKT_XFER_SELECT)|| (modeEvents.counterEvent2 > IX_PERFPROF_ACC_BUS_PMU_PEC2_SOUTH_APB_OWN_SELECT)) { return IX_PERFPROF_ACC_STATUS_BUS_PMU_PEC2_ERROR; } /* Event select for PEC2 */ SET_PMU_PEC(esrValue,PEC2,ixPerfProfAccBusPmuEventMap[modeEvents.counterEvent2]); /* Check if PEC3 selection is within range for South Mode */ if((modeEvents.counterEvent3 < IX_PERFPROF_ACC_BUS_PMU_PEC3_SOUTH_GSKT_RETRY_SELECT)|| (modeEvents.counterEvent3 > IX_PERFPROF_ACC_BUS_PMU_PEC3_SOUTH_APB_WRITE_SELECT)) { return IX_PERFPROF_ACC_STATUS_BUS_PMU_PEC3_ERROR; } /* Event select for PEC3 */ SET_PMU_PEC(esrValue,PEC3,ixPerfProfAccBusPmuEventMap[modeEvents.counterEvent3]); /* Check if PEC4 selection is within range for South Mode */ if((modeEvents.counterEvent4 < IX_PERFPROF_ACC_BUS_PMU_PEC4_SOUTH_PCI_SPLIT_SELECT)|| (modeEvents.counterEvent4 > IX_PERFPROF_ACC_BUS_PMU_PEC4_SOUTH_APB_READ_SELECT)) { return IX_PERFPROF_ACC_STATUS_BUS_PMU_PEC4_ERROR; } /* Event select for PEC4 */ SET_PMU_PEC(esrValue,PEC4,ixPerfProfAccBusPmuEventMap[modeEvents.counterEvent4]); /* Check if PEC5 selection is within range for South Mode */ if((modeEvents.counterEvent5 < IX_PERFPROF_ACC_BUS_PMU_PEC5_SOUTH_ABB_GRANT_SELECT)|| (modeEvents.counterEvent5 > IX_PERFPROF_ACC_BUS_PMU_PEC5_SOUTH_BUS_IDLE_SELECT)) { return IX_PERFPROF_ACC_STATUS_BUS_PMU_PEC5_ERROR; } /* Event select for PEC5 */ SET_PMU_PEC(esrValue,PEC5,ixPerfProfAccBusPmuEventMap[modeEvents.counterEvent5]); /* Check if PEC6 selection is within range for South Mode */ if((modeEvents.counterEvent6 < IX_PERFPROF_ACC_BUS_PMU_PEC6_SOUTH_PCI_GRANT_SELECT)|| (modeEvents.counterEvent6 > IX_PERFPROF_ACC_BUS_PMU_PEC6_SOUTH_BUS_WRITE_SELECT)) { return IX_PERFPROF_ACC_STATUS_BUS_PMU_PEC6_ERROR; } /* Event select for PEC6 */ SET_PMU_PEC(esrValue,PEC6,ixPerfProfAccBusPmuEventMap[modeEvents.counterEvent6]); /* Check if PEC7 selection is within range for South Mode */ if((modeEvents.counterEvent7 < IX_PERFPROF_ACC_BUS_PMU_PEC7_SOUTH_APB_RETRY_SELECT)|| (modeEvents.counterEvent7 > IX_PERFPROF_ACC_BUS_PMU_PEC7_CYCLE_COUNT_SELECT)) { return IX_PERFPROF_ACC_STATUS_BUS_PMU_PEC7_ERROR; } /* Event select for PEC7 */ SET_PMU_PEC(esrValue,PEC7,ixPerfProfAccBusPmuEventMap[modeEvents.counterEvent7]); SET_PMU_MODE(esrValue, IX_PERFPROF_ACC_BUS_PMU_MODE_SOUTH); SET_PMU_ESR(esrValue); return IX_PERFPROF_ACC_STATUS_SUCCESS;} /* end of ixPerfProfAccBusPmuSouthCheckAndSelect () *//** * * Function to check the validity of choices for PEC1 to PEC7 for Sdram Mode * Return errors if choice/s are not valid, otherwise set Event Select Register * and mode to Sdram * **/IxPerfProfAccStatusixPerfProfAccBusPmuSdramCheckAndSelect (IxPerfProfAccBusPmuModeEvents modeEvents){ /* Variable for event select register. Set to 0 initially */ UINT32 esrValue = 0; /* Check if PEC1 selection is within range for Sdram Mode */ if((modeEvents.counterEvent1 < IX_PERFPROF_ACC_BUS_PMU_PEC1_SDR_0_HIT_SELECT)||
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -