isa filed (mips32r2) is available from kernel version 3.9 ASEs implemented field (dsp, dsp2) is available from 3.7 In older kernel versions "dsp" represents both DSPr1 and DSPr2
if kernel version is 3.7 and above runtime detection tries to find 'dsp2' in /proc/cpuinfo. If it fails or if kernel version is < 3.7 it tries to find core strings in /proc/cpuinfo old runtime detection searches only for core strings --- pixman/pixman-mips.c | 87 ++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 67 insertions(+), 20 deletions(-) diff --git a/pixman/pixman-mips.c b/pixman/pixman-mips.c index 3048813..f347bb9 100644 --- a/pixman/pixman-mips.c +++ b/pixman/pixman-mips.c @@ -24,14 +24,27 @@ #endif #include "pixman-private.h" - -#if defined(USE_MIPS_DSPR2) || defined(USE_LOONGSON_MMI) - #include <string.h> #include <stdlib.h> +#ifdef USE_MIPS_DSPR2 +static const char *mips_dspr2_cores[] = +{ + "MIPS 74K", NULL +}; +#endif + +#ifdef USE_LOONGSON_MMI +static const char *mips_loongson_cores[] = +{ + "Loongson", NULL +}; +#endif + +#if defined(USE_MIPS_DSPR2) || defined(USE_LOONGSON_MMI) + static pixman_bool_t -have_feature (const char *search_string) +have_feature (const char **cores, const char *search_string) { #if defined (__linux__) /* linux ELF */ /* Simple detection of MIPS features at runtime for Linux. @@ -40,20 +53,52 @@ have_feature (const char *search_string) * facility is universally available on the MIPS architectures, so it's up * to individual OSes to provide such. */ - const char *file_name = "/proc/cpuinfo"; - char cpuinfo_line[256]; + const char *file_name = "/proc/version"; + char line[512]; + int v0 = 0, v1 = 0; FILE *f = NULL; + char **temp = (char **)cores; + + if ((f = fopen (file_name, "r")) != NULL) + { + if (fgets (line, sizeof (line), f) != NULL) + sscanf (line, "%*s%*s%d%*c%d", &v0, &v1); + fclose (f); + } + + file_name = "/proc/cpuinfo"; if ((f = fopen (file_name, "r")) == NULL) return FALSE; - while (fgets (cpuinfo_line, sizeof (cpuinfo_line), f) != NULL) + if (((v0 >= 3) && (v1 >= 7)) || (v0 >= 4)) { - if (strstr (cpuinfo_line, search_string) != NULL) + /* isa filed (mips32r2) is available from kernel version 3.9 + * ASEs implemented field (dsp, dsp2) is available from 3.7 + * In older kernel versions "dsp" represents both DSPr1 and DSPr2 + */ + while (fgets (line, sizeof (line), f) != NULL) { - fclose (f); - return TRUE; + if (strstr (line, search_string) != NULL) + { + fclose (f); + return TRUE; + } } + rewind(f); + } + + while (fgets (line, sizeof (line), f) != NULL) + { + while (*temp) + { + if (strstr (line, *temp++) != NULL) + { + fclose (f); + return TRUE; + } + } + temp = (char **)cores; } fclose (f); @@ -70,23 +115,25 @@ _pixman_mips_get_implementations (pixman_implementation_t *imp) { #ifdef USE_LOONGSON_MMI /* I really don't know if some Loongson CPUs don't have MMI. */ - if (!_pixman_disabled ("loongson-mmi") && have_feature ("Loongson")) - imp = _pixman_implementation_create_mmx (imp); + if (!_pixman_disabled ("loongson-mmi") && + have_feature (mips_loongson_cores, "Loongson")) + { + imp = _pixman_implementation_create_mmx (imp); + } #endif #ifdef USE_MIPS_DSPR2 if (!_pixman_disabled ("mips-dspr2")) { - int already_compiling_everything_for_dspr2 = 0; + int already_compiling_everything_for_dspr2 = 0; #if defined(__mips_dsp) && (__mips_dsp_rev >= 2) - already_compiling_everything_for_dspr2 = 1; + already_compiling_everything_for_dspr2 = 1; #endif - if (already_compiling_everything_for_dspr2 || - /* Only currently available MIPS core that supports DSPr2 is 74K. */ - have_feature ("MIPS 74K")) - { - imp = _pixman_implementation_create_mips_dspr2 (imp); - } + if (already_compiling_everything_for_dspr2 || + have_feature (mips_dspr2_cores, "dsp2")) + { + imp = _pixman_implementation_create_mips_dspr2 (imp); + } } #endif -- 1.7.3 _______________________________________________ Pixman mailing list Pixman@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/pixman