}
#endif /* defined (__arm__) && defined (__linux__) */
-pa_bool_t pa_cpu_init_arm(pa_cpu_arm_flag_t *flags) {
-#if defined (__arm__)
-#if defined (__linux__)
+void pa_cpu_get_arm_flags(pa_cpu_arm_flag_t *flags) {
+#if defined (__arm__) && defined (__linux__)
char *cpuinfo, *line;
- int arch;
+ int arch, part;
/* We need to read the CPU flags from /proc/cpuinfo because there is no user
* space support to get the CPU features. This only works on linux AFAIK. */
if (!(cpuinfo = get_cpuinfo())) {
pa_log("Can't read cpuinfo");
- return FALSE;
+ return;
}
*flags = 0;
pa_xfree(line);
}
+
/* get the CPU features */
if ((line = get_cpuinfo_line(cpuinfo, "Features"))) {
const char *state = NULL;
pa_xfree(current);
}
}
+
+ /* get the CPU part number */
+ if ((line = get_cpuinfo_line(cpuinfo, "CPU part"))) {
+ part = strtoul(line, NULL, 0);
+ if (part == 0xc08)
+ *flags |= PA_CPU_ARM_CORTEX_A8;
+ pa_xfree(line);
+ }
pa_xfree(cpuinfo);
- pa_log_info("CPU flags: %s%s%s%s%s%s",
+ pa_log_info("CPU flags: %s%s%s%s%s%s%s",
(*flags & PA_CPU_ARM_V6) ? "V6 " : "",
(*flags & PA_CPU_ARM_V7) ? "V7 " : "",
(*flags & PA_CPU_ARM_VFP) ? "VFP " : "",
(*flags & PA_CPU_ARM_EDSP) ? "EDSP " : "",
(*flags & PA_CPU_ARM_NEON) ? "NEON " : "",
- (*flags & PA_CPU_ARM_VFPV3) ? "VFPV3 " : "");
+ (*flags & PA_CPU_ARM_VFPV3) ? "VFPV3 " : "",
+ (*flags & PA_CPU_ARM_CORTEX_A8) ? "Cortex-A8 " : "");
+#endif
+}
+
+bool pa_cpu_init_arm(pa_cpu_arm_flag_t *flags) {
+#if defined (__arm__)
+#if defined (__linux__)
+ pa_cpu_get_arm_flags(flags);
if (*flags & PA_CPU_ARM_V6)
pa_volume_func_init_arm(*flags);
- return TRUE;
+#ifdef HAVE_NEON
+ if (*flags & PA_CPU_ARM_NEON) {
+ pa_convert_func_init_neon(*flags);
+ pa_mix_func_init_neon(*flags);
+ pa_remap_func_init_neon(*flags);
+ }
+#endif
+
+ return true;
#else /* defined (__linux__) */
pa_log("Reading ARM CPU features not yet supported on this OS");
#endif /* defined (__linux__) */
#else /* defined (__arm__) */
- return FALSE;
+ return false;
#endif /* defined (__arm__) */
}