arm/cortex-[a|r]: add more functions of Performance Monitors Unit

Reference:
https://developer.arm.com/documentation/ddi0433/a/performance-monitoring-unit/performance-monitoring-register-descriptions

Signed-off-by: chao.an <anchao@xiaomi.com>
This commit is contained in:
chao.an 2022-05-13 17:27:01 +08:00 committed by Alan Carvalho de Assis
parent 920e826a80
commit 4da48c84ff
3 changed files with 871 additions and 15 deletions

View File

@ -283,6 +283,137 @@
/* TODO: To be provided */
/* CP15 c9 Registers ********************************************************/
/* 32-bit Performance Monitors Control Register (PMCR):
* CRn=c9, opc1=0, CRm=c12, opc2=0
*/
#define PMCR_E (1 << 0) /* Enable all counters */
#define PMCR_P (1 << 1) /* Reset all counter events (except PMCCNTR) */
#define PMCR_C (1 << 2) /* Reset cycle counter (PMCCNTR) to zero */
#define PMCR_D (1 << 3) /* Enable cycle counter clock (PMCCNTR) divider */
#define PMCR_X (1 << 4) /* Export of events is enabled */
#define PMCR_DP (1 << 5) /* Disable PMCCNTR if event counting is prohibited */
#define PMCR_N_SHIFT (11) /* Bits 11-15: Number of event counters */
#define PMCR_N_MASK (0x1f << PMCR_N_SHIFT)
#define PMCR_IDCODE_SHIFT (16) /* Bits 16-23: Identification code */
#define PMCR_IDCODE_MASK (0xff << PMCR_IDCODE_SHIFT)
#define PMCR_IMP_SHIFT (24) /* Bits 24-31: Implementer code */
#define PMCR_IMP_MASK (0xff << PMCR_IMP_SHIFT)
/* 32-bit Performance Monitors Count Enable Set register (PMCNTENSET):
* CRn=c9, opc1=0, CRm=c12, opc2=1
*/
#define PMCESR_CCES (1 << 31) /* Bits 31: Count Enable Set Register */
/* 32-bit Performance Monitors Count Enable Clear register (PMCNTENCLR):
* CRn=c9, opc1=0, CRm=c12, opc2=2
*/
#define PMCECR_CCEC (1 << 31) /* Bits 31: Count Enable Clear Register */
/* 32-bit Performance Monitors Overflow Flag Status Register (PMOVSR):
* CRn=c9, opc1=0, CRm=c12, opc2=3
*/
#define PMOFSR_COF0 (1 << 0) /* Bits 0: Counter 0 overflow flag */
#define PMOFSR_COF1 (1 << 1) /* Bits 1: Counter 1 overflow flag */
#define PMOFSR_COF2 (1 << 2) /* Bits 2: Counter 2 overflow flag */
#define PMOFSR_COF3 (1 << 3) /* Bits 3: Counter 3 overflow flag */
#define PMOFSR_COF4 (1 << 4) /* Bits 4: Counter 4 overflow flag */
#define PMOFSR_COF5 (1 << 5) /* Bits 5: Counter 5 overflow flag */
#define PMOFSR_CCOF (1 << 31) /* Bits 31: Cycle counter overflow flag */
/* 32-bit Performance Monitors Software Increment register (PMSWINC):
* CRn=c9, opc1=0, CRm=c12, opc2=4
* TODO: To be provided
*/
/* 32-bit Performance Monitors Event Counter Selection Register (PMSELR):
* CRn=c9, opc1=0, CRm=c12, opc2=5
*/
#define PMECSR_CS_MASK (0x1f) /* Bits 0-5: Counter select */
/* 32-bit Performance Monitors Common Event Identification (PMCEID0):
* CRn=c9, opc1=0, CRm=c12, opc2=6
* TODO: To be provided
*/
/* 32-bit Performance Monitors Common Event Identification (PMCEID1):
* CRn=c9, opc1=0, CRm=c12, opc2=7
* TODO: To be provided
*/
/* 32-bit Performance Monitors Cycle Count Register (PMCCNTR):
* CRn=c9, opc1=0, CRm=c13, opc2=0
* TODO: To be provided
*/
/* 32-bit Performance Monitors Event Type Select Register (PMETSR):
* CRn=c9, opc1=0, CRm=c13, opc2=1
*/
#define PMETSR_L1_IC_FILL (0x1) /* Level 1 instruction cache refill */
#define PMETSR_L1_ITLB_FILL (0x2) /* Level 1 instruction TLB refill */
#define PMETSR_L1_DC_FILL (0x3) /* Level 1 data cache refill */
#define PMETSR_L1_DC_ACC (0x4) /* Level 1 data cache access */
#define PMETSR_L1_DTLB_FILL (0x5) /* Level 1 data TLB refill */
#define PMETSR_LOAD (0x6) /* Data read architecturally executed */
#define PMETSR_STORE (0x7) /* Data write architecturally executed */
#define PMETSR_INSTARCHEXEC (0x8) /* Instruction architecturally executed */
#define PMETSR_EXCEPETIONTAKEN (0x9) /* Exception taken */
#define PMETSR_EXCEPETIONRET (0xa) /* Exception return */
#define PMETSR_WRCONTEXTIDR (0xb) /* Write to CONTEXTIDR */
#define PMETSR_SOFTPCCHANGE (0xc) /* Software change of the PC */
#define PMETSR_IMMBR (0xd) /* Immediate branch */
#define PMETSR_PROCRET (0xe) /* Procedure return */
#define PMETSR_UNALINGEDLDSTR (0xf) /* Unaligned load or store */
#define PMETSR_MISPREDICTEDBRANCHEXEC (0x10) /* Mispredicted or not predicted branch speculatively executed */
#define PMETSR_PREDICTEDBRANCHEXEC (0x12) /* Predictable branch speculatively executed */
#define PMETSR_DATAMEMACC (0x13) /* Data memory access. */
#define PMETSR_ICACC (0x14) /* Instruction Cache access. */
#define PMETSR_DCEVICTION (0x15) /* Data cache eviction. */
#define PMETSR_IRQEXCEPTION (0x86) /* IRQ exception taken. */
#define PMETSR_FIQEXCEPTION (0x87) /* FIQ exception taken. */
#define PMETSR_EXTMEMREQ (0xc0) /* External memory request. */
#define PMETSR_NCEXTMEMREQ (0xc1) /* Non-cacheable external memory request */
#define PMETSR_PREFETCHLINEFILL (0xc2) /* Linefill because of prefetch. */
#define PMETSR_PREFETCHLINEDROP (0xc3) /* Prefetch linefill dropped. */
#define PMETSR_ENTERINGRAMODE (0xc4) /* Entering read allocate mode. */
#define PMETSR_RAMODE (0xc5) /* Read allocate mode. */
#define PMETSR_RESERVED (0xc6) /* Reserved, do not use */
#define PMETSR_DWSTALLSBFFULL (0xc9) /* Data Write operation that stalls the pipeline because the store buffer is full. */
#define PMETSR_EVENT_MASK (0xff)
/* 32-bit Performance Monitors Event Count Register (PMXEVCNTR):
* CRn=c9, opc1=0, CRm=c13, opc2=2
* TODO: To be provided
*/
/* 32-bit Performance Monitors User Enable Register (PMUSERENR):
* CRn=c9, opc1=0, CRm=c14, opc2=0
*/
#define PMUER_UME_SHIFT (0) /* Bits 0: User mode enable */
#define PMUER_UME (1 << PMUER_UME_SHIFT)
/* 32-bit Performance Monitors Interrupt Enable Set register (PMINTENSET):
* CRn=c9, opc1=0, CRm=c14, opc2=1
*/
#define PMIESR_CCNTOIE_SHIFT (31) /* Bits 31: CCNT overflow interrupt enable. */
#define PMIESR_CCNTOIE (1 << PMIESR_CCNTOIE_SHIFT)
/* 32-bit Performance Monitors Interrupt Enable Clear register (PMINTENCLR):
* CRn=c9, opc1=0, CRm=c14, opc2=2
*/
#define PMIECR_CCNTOIE_SHIFT (31) /* Bits 31: CCNT overflow interrupt enable. */
#define PMIECR_CCNTOIE (1 << PMIECR_CCNTOIE_SHIFT)
/****************************************************************************
* Assembly Macros
****************************************************************************/
@ -414,6 +545,360 @@ static inline void cp15_wrvbar(unsigned int sctlr)
);
}
/****************************************************************************
* Name: cp15_pmu_rdpmcr/cp15_pmu_wrpmcr/cp15_pmu_pmcr
*
* Description:
* Read/Write the Performance Monitor Control Register (PMCR)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rdpmcr(void)
{
unsigned int pmcr;
__asm__ __volatile__
(
"\tmrc p15, 0, %0, c9, c12, 0\n"
: "=r" (pmcr)
:
: "memory"
);
return pmcr;
}
static inline void cp15_pmu_wrpmcr(unsigned int pmcr)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c12, 0\n"
:
: "r" (pmcr)
: "memory"
);
}
static inline void cp15_pmu_pmcr(unsigned int pmcr)
{
cp15_pmu_wrpmcr(pmcr | cp15_pmu_rdpmcr());
}
/****************************************************************************
* Name: cp15_pmu_rdcesr/cp15_pmu_wrcesr/cp15_pmu_cesr
*
* Description:
* Read/Write the Performance Monitors
* Count Enable Set register (PMCNTENSET)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rdcesr(void)
{
unsigned int cesr;
__asm__ __volatile__
(
"\tmrc p15, 0, %0, c9, c12, 1\n"
: "=r" (cesr)
:
: "memory"
);
return cesr;
}
static inline void cp15_pmu_wrcesr(unsigned int cesr)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c12, 1\n"
:
: "r" (cesr)
: "memory"
);
}
static inline void cp15_pmu_cesr(unsigned int cesr)
{
cp15_pmu_wrcesr(cesr | cp15_pmu_rdcesr());
}
/****************************************************************************
* Name: cp15_pmu_rdcecr/cp15_pmu_wrcecr/cp15_pmu_cecr
*
* Description:
* Read/Write the Performance Monitors
* Count Enable Clear register (PMCNTENCLR)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rdcecr(void)
{
unsigned int cecr;
__asm__ __volatile__
(
"\tmrc p15, 0, %0, c9, c12, 2\n"
: "=r" (cecr)
:
: "memory"
);
return cecr;
}
static inline void cp15_pmu_wrcecr(unsigned int cecr)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c12, 2\n"
:
: "r" (cecr)
: "memory"
);
}
static inline void cp15_pmu_cecr(unsigned int cecr)
{
cp15_pmu_wrcecr(cecr | cp15_pmu_rdcecr());
}
/****************************************************************************
* Name: cp15_pmu_rdcecr/cp15_pmu_wrcecr/cp15_pmu_cecr
*
* Description:
* Read/Write the Performance Monitors
* Overflow Flag Status Register (PMOVSR)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rdofsr(void)
{
unsigned int ofsr;
__asm__ __volatile__
(
"\tmrc p15, 0, %0, c9, c12, 3\n"
: "=r" (ofsr)
:
: "memory"
);
return ofsr;
}
static inline void cp15_pmu_wrofsr(unsigned int ofsr)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c12, 3\n"
:
: "r" (ofsr)
: "memory"
);
}
static inline void cp15_pmu_ofsr(unsigned int ofsr)
{
cp15_pmu_wrofsr(ofsr | cp15_pmu_rdofsr());
}
/****************************************************************************
* Name: cp15_pmu_rdsir/cp15_pmu_wrsir/cp15_pmu_sir
*
* Description:
* Read/Write the Performance Monitors
* Software Increment register (PMSWINC)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rdsir(void)
{
unsigned int sir;
__asm__ __volatile__
(
"\tmrc p15, 0, %0, c9, c12, 4\n"
: "=r" (sir)
:
: "memory"
);
return sir;
}
static inline void cp15_pmu_wrsir(unsigned int sir)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c12, 4\n"
:
: "r" (sir)
: "memory"
);
}
static inline void cp15_pmu_sir(unsigned int sir)
{
cp15_pmu_wrsir(sir | cp15_pmu_rdsir());
}
/****************************************************************************
* Name: cp15_pmu_wrecsr
*
* Description:
* Write the Performance Monitors Event Counter Selection Register (PMSELR)
*
****************************************************************************/
static inline void cp15_pmu_wrecsr(unsigned int ecsr)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c12, 5\n"
:
: "r" (ecsr)
: "memory"
);
}
/****************************************************************************
* Name: cp15_pmu_wretsr
*
* Description:
* Write the Performance Monitors Event Type Select Register (PMXEVTYPER)
*
****************************************************************************/
static inline void cp15_pmu_wretsr(unsigned int etsr)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c13, 1\n"
:
: "r" (etsr)
: "memory"
);
}
/****************************************************************************
* Name: cp15_pmu_wruer
*
* Description:
* Write the Performance Monitors User Enable Register (PMUSERENR)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rduer(void)
{
unsigned int uer;
__asm__ __volatile__
(
"\tmrc p15, 0, %0, c9, c14, 0\n"
: "=r" (uer)
:
: "memory"
);
return uer;
}
static inline void cp15_pmu_wruer(unsigned int uer)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c14, 0\n"
:
: "r" (uer)
: "memory"
);
}
static inline void cp15_pmu_uer(unsigned int uer)
{
cp15_pmu_wruer(uer | cp15_pmu_rduer());
}
/****************************************************************************
* Name: cp15_pmu_wriesr
*
* Description:
* Write the Performance Monitors
* Interrupt Enable Set register (PMINTENSET)
*
****************************************************************************/
static inline void cp15_pmu_wriesr(unsigned int iesr)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c14, 1\n"
:
: "r" (iesr)
: "memory"
);
}
/****************************************************************************
* Name: cp15_pmu_wriecr
*
* Description:
* Write the Performance Monitors
* Interrupt Enable Clear register (PMINTENCLR)
*
****************************************************************************/
static inline void cp15_pmu_wriecr(unsigned int iecr)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c14, 2\n"
:
: "r" (iecr)
: "memory"
);
}
/****************************************************************************
* Name: cp15_pmu_rdccr
*
* Description:
* Read the Performance Monitors Cycle Count Register (PMCCNTR)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rdccr(void)
{
unsigned int ccr;
__asm__ __volatile__
(
"\tmrc p15, 0, %0, c9, c13, 0\n"
: "=r" (ccr)
:
: "memory"
);
return ccr;
}
/****************************************************************************
* Name: cp15_pmu_rdecr
*
* Description:
* Read the Performance Monitors Event Count Register (PMXEVCNTR)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rdecr(void)
{
unsigned int ecr;
__asm__ __volatile__
(
"\tmrc p15, 0, %0, c9, c13, 2"
: "=r" (ecr)
:
: "memory"
);
return ecr;
}
#endif /* __ASSEMBLY__ */
/****************************************************************************

View File

@ -248,11 +248,10 @@
/* 32-bit Performance Monitors Control Register (PMCR):
* CRn=c9, opc1=0, CRm=c12, opc2=0
* TODO: To be provided
*/
#define PMCR_E (1 << 0) /* Enable all counters */
#define PMCR_P (1 << 1) /* Reset all counter eventts (except PMCCNTR) */
#define PMCR_P (1 << 1) /* Reset all counter events (except PMCCNTR) */
#define PMCR_C (1 << 2) /* Reset cycle counter (PMCCNTR) to zero */
#define PMCR_D (1 << 3) /* Enable cycle counter clock (PMCCNTR) divider */
#define PMCR_X (1 << 4) /* Export of events is enabled */
@ -266,19 +265,28 @@
/* 32-bit Performance Monitors Count Enable Set register (PMCNTENSET):
* CRn=c9, opc1=0, CRm=c12, opc2=1
* TODO: To be provided
*/
#define PMCESR_CCES (1 << 31) /* Bits 31: Count Enable Set Register */
/* 32-bit Performance Monitors Count Enable Clear register (PMCNTENCLR):
* CRn=c9, opc1=0, CRm=c12, opc2=2
* TODO: To be provided
*/
#define PMCECR_CCEC (1 << 31) /* Bits 31: Count Enable Clear Register */
/* 32-bit Performance Monitors Overflow Flag Status Register (PMOVSR):
* CRn=c9, opc1=0, CRm=c12, opc2=3
* TODO: To be provided
*/
#define PMOFSR_COF0 (1 << 0) /* Bits 0: Counter 0 overflow flag */
#define PMOFSR_COF1 (1 << 1) /* Bits 1: Counter 1 overflow flag */
#define PMOFSR_COF2 (1 << 2) /* Bits 2: Counter 2 overflow flag */
#define PMOFSR_COF3 (1 << 3) /* Bits 3: Counter 3 overflow flag */
#define PMOFSR_COF4 (1 << 4) /* Bits 4: Counter 4 overflow flag */
#define PMOFSR_COF5 (1 << 5) /* Bits 5: Counter 5 overflow flag */
#define PMOFSR_CCOF (1 << 31) /* Bits 31: Cycle counter overflow flag */
/* 32-bit Performance Monitors Software Increment register (PMSWINC):
* CRn=c9, opc1=0, CRm=c12, opc2=4
* TODO: To be provided
@ -286,9 +294,10 @@
/* 32-bit Performance Monitors Event Counter Selection Register (PMSELR):
* CRn=c9, opc1=0, CRm=c12, opc2=5
* TODO: To be provided
*/
#define PMECSR_CS_MASK (0x1f) /* Bits 0-5: Counter select */
/* 32-bit Performance Monitors Common Event Identification (PMCEID0):
* CRn=c9, opc1=0, CRm=c12, opc2=6
* TODO: To be provided
@ -304,11 +313,42 @@
* TODO: To be provided
*/
/* 32-bit Performance Monitors Event Type Select Register (PMXEVTYPER):
/* 32-bit Performance Monitors Event Type Select Register (PMETSR):
* CRn=c9, opc1=0, CRm=c13, opc2=1
* TODO: To be provided
*/
#define PMETSR_L1_IC_FILL (0x1) /* Level 1 instruction cache refill */
#define PMETSR_L1_ITLB_FILL (0x2) /* Level 1 instruction TLB refill */
#define PMETSR_L1_DC_FILL (0x3) /* Level 1 data cache refill */
#define PMETSR_L1_DC_ACC (0x4) /* Level 1 data cache access */
#define PMETSR_L1_DTLB_FILL (0x5) /* Level 1 data TLB refill */
#define PMETSR_LOAD (0x6) /* Data read architecturally executed */
#define PMETSR_STORE (0x7) /* Data write architecturally executed */
#define PMETSR_INSTARCHEXEC (0x8) /* Instruction architecturally executed */
#define PMETSR_EXCEPETIONTAKEN (0x9) /* Exception taken */
#define PMETSR_EXCEPETIONRET (0xa) /* Exception return */
#define PMETSR_WRCONTEXTIDR (0xb) /* Write to CONTEXTIDR */
#define PMETSR_SOFTPCCHANGE (0xc) /* Software change of the PC */
#define PMETSR_IMMBR (0xd) /* Immediate branch */
#define PMETSR_PROCRET (0xe) /* Procedure return */
#define PMETSR_UNALINGEDLDSTR (0xf) /* Unaligned load or store */
#define PMETSR_MISPREDICTEDBRANCHEXEC (0x10) /* Mispredicted or not predicted branch speculatively executed */
#define PMETSR_PREDICTEDBRANCHEXEC (0x12) /* Predictable branch speculatively executed */
#define PMETSR_DATAMEMACC (0x13) /* Data memory access. */
#define PMETSR_ICACC (0x14) /* Instruction Cache access. */
#define PMETSR_DCEVICTION (0x15) /* Data cache eviction. */
#define PMETSR_IRQEXCEPTION (0x86) /* IRQ exception taken. */
#define PMETSR_FIQEXCEPTION (0x87) /* FIQ exception taken. */
#define PMETSR_EXTMEMREQ (0xc0) /* External memory request. */
#define PMETSR_NCEXTMEMREQ (0xc1) /* Non-cacheable external memory request */
#define PMETSR_PREFETCHLINEFILL (0xc2) /* Linefill because of prefetch. */
#define PMETSR_PREFETCHLINEDROP (0xc3) /* Prefetch linefill dropped. */
#define PMETSR_ENTERINGRAMODE (0xc4) /* Entering read allocate mode. */
#define PMETSR_RAMODE (0xc5) /* Read allocate mode. */
#define PMETSR_RESERVED (0xc6) /* Reserved, do not use */
#define PMETSR_DWSTALLSBFFULL (0xc9) /* Data Write operation that stalls the pipeline because the store buffer is full. */
#define PMETSR_EVENT_MASK (0xff)
/* 32-bit Performance Monitors Event Count Register (PMXEVCNTR):
* CRn=c9, opc1=0, CRm=c13, opc2=2
* TODO: To be provided
@ -316,19 +356,25 @@
/* 32-bit Performance Monitors User Enable Register (PMUSERENR):
* CRn=c9, opc1=0, CRm=c14, opc2=0
* TODO: To be provided
*/
#define PMUER_UME_SHIFT (0) /* Bits 0: User mode enable */
#define PMUER_UME (1 << PMUER_UME_SHIFT)
/* 32-bit Performance Monitors Interrupt Enable Set register (PMINTENSET):
* CRn=c9, opc1=0, CRm=c14, opc2=1
* TODO: To be provided
*/
#define PMIESR_CCNTOIE_SHIFT (31) /* Bits 31: CCNT overflow interrupt enable. */
#define PMIESR_CCNTOIE (1 << PMIESR_CCNTOIE_SHIFT)
/* 32-bit Performance Monitors Interrupt Enable Clear register (PMINTENCLR):
* CRn=c9, opc1=0, CRm=c14, opc2=2
* TODO: To be provided
*/
#define PMIECR_CCNTOIE_SHIFT (31) /* Bits 31: CCNT overflow interrupt enable. */
#define PMIECR_CCNTOIE (1 << PMIECR_CCNTOIE_SHIFT)
/* CP15 c10 Registers *******************************************************/
/* Not used on ARMv7-R */
@ -524,7 +570,13 @@ static inline void cp15_wractlr(unsigned int actlr)
);
}
/* Read/write the Performance Monitor Control Register (PMCR) */
/****************************************************************************
* Name: cp15_pmu_rdpmcr/cp15_pmu_wrpmcr/cp15_pmu_pmcr
*
* Description:
* Read/Write the Performance Monitor Control Register (PMCR)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rdpmcr(void)
{
@ -551,6 +603,327 @@ static inline void cp15_pmu_wrpmcr(unsigned int pmcr)
);
}
static inline void cp15_pmu_pmcr(unsigned int pmcr)
{
cp15_pmu_wrpmcr(pmcr | cp15_pmu_rdpmcr());
}
/****************************************************************************
* Name: cp15_pmu_rdcesr/cp15_pmu_wrcesr/cp15_pmu_cesr
*
* Description:
* Read/Write the Performance Monitors
* Count Enable Set register (PMCNTENSET)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rdcesr(void)
{
unsigned int cesr;
__asm__ __volatile__
(
"\tmrc p15, 0, %0, c9, c12, 1\n"
: "=r" (cesr)
:
: "memory"
);
return cesr;
}
static inline void cp15_pmu_wrcesr(unsigned int cesr)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c12, 1\n"
:
: "r" (cesr)
: "memory"
);
}
static inline void cp15_pmu_cesr(unsigned int cesr)
{
cp15_pmu_wrcesr(cesr | cp15_pmu_rdcesr());
}
/****************************************************************************
* Name: cp15_pmu_rdcecr/cp15_pmu_wrcecr/cp15_pmu_cecr
*
* Description:
* Read/Write the Performance Monitors
* Count Enable Clear register (PMCNTENCLR)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rdcecr(void)
{
unsigned int cecr;
__asm__ __volatile__
(
"\tmrc p15, 0, %0, c9, c12, 2\n"
: "=r" (cecr)
:
: "memory"
);
return cecr;
}
static inline void cp15_pmu_wrcecr(unsigned int cecr)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c12, 2\n"
:
: "r" (cecr)
: "memory"
);
}
static inline void cp15_pmu_cecr(unsigned int cecr)
{
cp15_pmu_wrcecr(cecr | cp15_pmu_rdcecr());
}
/****************************************************************************
* Name: cp15_pmu_rdcecr/cp15_pmu_wrcecr/cp15_pmu_cecr
*
* Description:
* Read/Write the Performance Monitors
* Overflow Flag Status Register (PMOVSR)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rdofsr(void)
{
unsigned int ofsr;
__asm__ __volatile__
(
"\tmrc p15, 0, %0, c9, c12, 3\n"
: "=r" (ofsr)
:
: "memory"
);
return ofsr;
}
static inline void cp15_pmu_wrofsr(unsigned int ofsr)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c12, 3\n"
:
: "r" (ofsr)
: "memory"
);
}
static inline void cp15_pmu_ofsr(unsigned int ofsr)
{
cp15_pmu_wrofsr(ofsr | cp15_pmu_rdofsr());
}
/****************************************************************************
* Name: cp15_pmu_rdsir/cp15_pmu_wrsir/cp15_pmu_sir
*
* Description:
* Read/Write the Performance Monitors
* Software Increment register (PMSWINC)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rdsir(void)
{
unsigned int sir;
__asm__ __volatile__
(
"\tmrc p15, 0, %0, c9, c12, 4\n"
: "=r" (sir)
:
: "memory"
);
return sir;
}
static inline void cp15_pmu_wrsir(unsigned int sir)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c12, 4\n"
:
: "r" (sir)
: "memory"
);
}
static inline void cp15_pmu_sir(unsigned int sir)
{
cp15_pmu_wrsir(sir | cp15_pmu_rdsir());
}
/****************************************************************************
* Name: cp15_pmu_wrecsr
*
* Description:
* Write the Performance Monitors Event Counter Selection Register (PMSELR)
*
****************************************************************************/
static inline void cp15_pmu_wrecsr(unsigned int ecsr)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c12, 5\n"
:
: "r" (ecsr)
: "memory"
);
}
/****************************************************************************
* Name: cp15_pmu_wretsr
*
* Description:
* Write the Performance Monitors Event Type Select Register (PMETSR)
*
****************************************************************************/
static inline void cp15_pmu_wretsr(unsigned int etsr)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c13, 1\n"
:
: "r" (etsr)
: "memory"
);
}
/****************************************************************************
* Name: cp15_pmu_wruer
*
* Description:
* Write the Performance Monitors User Enable Register (PMUSERENR)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rduer(void)
{
unsigned int uer;
__asm__ __volatile__
(
"\tmrc p15, 0, %0, c9, c14, 0\n"
: "=r" (uer)
:
: "memory"
);
return uer;
}
static inline void cp15_pmu_wruer(unsigned int uer)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c14, 0\n"
:
: "r" (uer)
: "memory"
);
}
static inline void cp15_pmu_uer(unsigned int uer)
{
cp15_pmu_wruer(uer | cp15_pmu_rduer());
}
/****************************************************************************
* Name: cp15_pmu_wriesr
*
* Description:
* Write the Performance Monitors
* Interrupt Enable Set register (PMINTENSET)
*
****************************************************************************/
static inline void cp15_pmu_wriesr(unsigned int iesr)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c14, 1\n"
:
: "r" (iesr)
: "memory"
);
}
/****************************************************************************
* Name: cp15_pmu_wriecr
*
* Description:
* Write the Performance Monitors
* Interrupt Enable Clear register (PMINTENCLR)
*
****************************************************************************/
static inline void cp15_pmu_wriecr(unsigned int iecr)
{
__asm__ __volatile__
(
"\tmcr p15, 0, %0, c9, c14, 2\n"
:
: "r" (iecr)
: "memory"
);
}
/****************************************************************************
* Name: cp15_pmu_rdccr
*
* Description:
* Read the Performance Monitors Cycle Count Register (PMCCNTR)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rdccr(void)
{
unsigned int ccr;
__asm__ __volatile__
(
"\tmrc p15, 0, %0, c9, c13, 0\n"
: "=r" (ccr)
:
: "memory"
);
return ccr;
}
/****************************************************************************
* Name: cp15_pmu_rdecr
*
* Description:
* Read the Performance Monitors Event Count Register (PMXEVCNTR)
*
****************************************************************************/
static inline unsigned int cp15_pmu_rdecr(void)
{
unsigned int ecr;
__asm__ __volatile__
(
"\tmrc p15, 0, %0, c9, c13, 2"
: "=r" (ecr)
:
: "memory"
);
return ecr;
}
#endif /* __ASSEMBLY__ */
/****************************************************************************

View File

@ -104,9 +104,7 @@
static inline void tms570_event_export(void)
{
uint32_t pmcr = cp15_pmu_rdpmcr();
pmcr |= PMCR_X;
cp15_pmu_wrpmcr(pmcr);
cp15_pmu_pmcr(PMCR_X);
}
/****************************************************************************