Question
How do I monitor cache performance on the ADSP-BF70x?
===========================================
Answer
The performance monitor can count events like cache misses non-intrusively. The following functions can be added to your program and used to start and stop monitoring events of interest.
#include <sys/platform.h>
typedef enum {
/* BF70x cache related events.
Refer to Programmers Reference for others.
*/
pf_icache_hit = 0x81,
pf_icache_miss = 0x82,
pf_dcache_fill_completed = 0x98,
pf_dcache_line_replaced = 0x99,
pf_dcache_hit = 0x9a,
pf_dcache_miss = 0x9b
} PFMonEvent;
void start_pfmon(PFMonEvent mon0, PFMonEvent mon1) {
uint32_t ctl = 0;
if (mon0)
ctl |= BITM_PFCTL_PWR|
(3<<BITP_PFCTL_ENA0)|
((mon0<<BITP_PFCTL_MON0)&BITM_PFCTL_MON0);
if (mon1)
ctl |= BITM_PFCTL_PWR|
(3<<BITP_PFCTL_ENA1)|
((mon1<<BITP_PFCTL_MON1)&BITM_PFCTL_MON1);
*pPFCTL = 0;
*pPFCNTR0 = 0;
*pPFCNTR1 = 0;
*pPFCTL = ctl;
}
void stop_pfmon(unsigned *count0, unsigned *count1) {
ssync(); /* flush system activity before stopping counting */
*pPFCTL = 0;
if (count0)
*count0 = *pPFCNTR0;
if (count1)
*count1 = *pPFCNTR1;
}
These functions can be used to monitor cache activity in your program as follows.
unsigned dcache_hits, dcache_misses;
start_pfmon(pf_dcache_hit, pf_dcache_miss);
...
/* code you want to monitor */
...
stop_pfmon(&dcache_hits, &dcache_misses);
printf("dcache hits = %u, dcache misses = %u", dcache_hits, dcache_misses);