frontend: pcnt: support arm11
[pcsx_rearmed.git] / frontend / pcnt.h
index 232ae07..9ddd500 100644 (file)
@@ -4,13 +4,21 @@ enum pcounters {
        PCNT_GPU,
        PCNT_SPU,
        PCNT_BLIT,
+       PCNT_GTE,
        PCNT_TEST,
        PCNT_CNT
 };
 
 #ifdef PCNT
 
-static const char *pcnt_names[PCNT_CNT] = { "", "gpu", "spu", "blit", "test" };
+#if defined(__ARM_ARCH_7A__) || defined(ARM1176)
+#define PCNT_DIV 1000
+#else
+#include <sys/time.h>
+#define PCNT_DIV 1
+#endif
+
+static const char *pcnt_names[PCNT_CNT] = { "", "gpu", "spu", "blit", "gte", "test" };
 
 #define PCNT_FRAMES 10
 
@@ -32,7 +40,7 @@ static inline void pcnt_print(float fps)
        int i;
 
        for (i = 0; i < PCNT_CNT; i++)
-               pcounters[i] /= 1000 * PCNT_FRAMES;
+               pcounters[i] /= PCNT_DIV * PCNT_FRAMES;
 
        rem = total = pcounters[PCNT_ALL];
        for (i = 1; i < PCNT_CNT; i++)
@@ -77,12 +85,43 @@ static inline unsigned int pcnt_get(void)
 #ifdef __ARM_ARCH_7A__
        __asm__ volatile("mrc p15, 0, %0, c9, c13, 0"
                         : "=r"(val));
+#elif defined(ARM1176)
+       __asm__ volatile("mrc p15, 0, %0, c15, c12, 1"
+                        : "=r"(val));
 #else
-       val = 0;
+       // all slow on ARM :(
+       //struct timespec tv;
+       //clock_gettime(CLOCK_MONOTONIC_RAW, &tv);
+       //val = tv.tv_sec * 1000000000 + tv.tv_nsec;
+       struct timeval tv;
+       gettimeofday(&tv, NULL);
+       val = tv.tv_sec * 1000000 + tv.tv_usec;
 #endif
        return val;
 }
 
+static inline void pcnt_init(void)
+{
+#ifdef __ARM_ARCH_7A__
+       int v;
+       asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r"(v));
+       v |= 5; // master enable, ccnt reset
+       v &= ~8; // ccnt divider 0
+       asm volatile("mcr p15, 0, %0, c9, c12, 0" :: "r"(v));
+       // enable cycle counter
+       asm volatile("mcr p15, 0, %0, c9, c12, 1" :: "r"(1<<31));
+#elif defined(ARM1176)
+       int v;
+       asm volatile("mrc p15, 0, %0, c15, c12, 0" : "=r"(v));
+       v |= 5; // master enable, ccnt reset
+       v &= ~8; // ccnt divider 0
+       asm volatile("mcr p15, 0, %0, c15, c12, 0" :: "r"(v));
+#endif
+}
+
+void pcnt_gte_start(int op);
+void pcnt_gte_end(int op);
+
 #else
 
 #define pcnt_start(id)