diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-06-26 17:26:34 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-07-07 01:09:23 -0400 |
commit | 5813bb96aec1c48636db621558534561fef67b68 (patch) | |
tree | f063e5d9e2dd69ad4c042d04c5da59c8efdaf632 | |
parent | 4ac0a1d60fccf4f9a782747ce61fd15825eddb5a (diff) |
Move MIPS specific CPU detection to its own file, pixman-mips.c
-rw-r--r-- | pixman/Makefile.sources | 1 | ||||
-rw-r--r-- | pixman/pixman-cpu.c | 77 | ||||
-rw-r--r-- | pixman/pixman-mips.c | 110 | ||||
-rw-r--r-- | pixman/pixman-private.h | 3 |
4 files changed, 115 insertions, 76 deletions
diff --git a/pixman/Makefile.sources b/pixman/Makefile.sources index 414ac029..73758ffb 100644 --- a/pixman/Makefile.sources +++ b/pixman/Makefile.sources @@ -8,6 +8,7 @@ libpixman_sources = \ pixman-conical-gradient.c \ pixman-cpu.c \ pixman-x86.c \ + pixman-mips.c \ pixman-arm.c \ pixman-ppc.c \ pixman-edge.c \ diff --git a/pixman/pixman-cpu.c b/pixman/pixman-cpu.c index 914f1165..5cef480e 100644 --- a/pixman/pixman-cpu.c +++ b/pixman/pixman-cpu.c @@ -22,76 +22,10 @@ #ifdef HAVE_CONFIG_H #include <config.h> #endif - -#include <string.h> #include <stdlib.h> #include "pixman-private.h" -#if defined(USE_MIPS_DSPR2) || defined(USE_LOONGSON_MMI) - -#if defined (__linux__) /* linux ELF */ - -static pixman_bool_t -pixman_have_mips_feature (const char *search_string) -{ - const char *file_name = "/proc/cpuinfo"; - /* Simple detection of MIPS features at runtime for Linux. - * It is based on /proc/cpuinfo, which reveals hardware configuration - * to user-space applications. According to MIPS (early 2010), no similar - * facility is universally available on the MIPS architectures, so it's up - * to individual OSes to provide such. - */ - - char cpuinfo_line[256]; - - FILE *f = NULL; - - if ((f = fopen (file_name, "r")) == NULL) - return FALSE; - - while (fgets (cpuinfo_line, sizeof (cpuinfo_line), f) != NULL) - { - if (strstr (cpuinfo_line, search_string) != NULL) - { - fclose (f); - return TRUE; - } - } - - fclose (f); - - /* Did not find string in the proc file. */ - return FALSE; -} - -#if defined(USE_MIPS_DSPR2) -pixman_bool_t -pixman_have_mips_dspr2 (void) -{ - /* Only currently available MIPS core that supports DSPr2 is 74K. */ - return pixman_have_mips_feature ("MIPS 74K"); -} -#endif - -#if defined(USE_LOONGSON_MMI) -pixman_bool_t -pixman_have_loongson_mmi (void) -{ - /* I really don't know if some Loongson CPUs don't have MMI. */ - return pixman_have_mips_feature ("Loongson"); -} -#endif - -#else /* linux ELF */ - -#define pixman_have_mips_dspr2() FALSE -#define pixman_have_loongson_mmi() FALSE - -#endif /* linux ELF */ - -#endif /* USE_MIPS_DSPR2 || USE_LOONGSON_MMI */ - pixman_bool_t _pixman_disabled (const char *name) { @@ -136,16 +70,7 @@ _pixman_choose_implementation (void) imp = _pixman_x86_get_implementations (imp); imp = _pixman_arm_get_implementations (imp); imp = _pixman_ppc_get_implementations (imp); - -#ifdef USE_LOONGSON_MMI - if (!_pixman_disabled ("loongson-mmi") && pixman_have_loongson_mmi ()) - imp = _pixman_implementation_create_mmx (imp); -#endif - -#ifdef USE_MIPS_DSPR2 - if (!_pixman_disabled ("mips-dspr2") && pixman_have_mips_dspr2 ()) - imp = _pixman_implementation_create_mips_dspr2 (imp); -#endif + imp = _pixman_mips_get_implementations (imp); imp = _pixman_implementation_create_noop (imp); diff --git a/pixman/pixman-mips.c b/pixman/pixman-mips.c new file mode 100644 index 00000000..9d3ee591 --- /dev/null +++ b/pixman/pixman-mips.c @@ -0,0 +1,110 @@ +/* + * Copyright © 2000 SuSE, Inc. + * Copyright © 2007 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of SuSE not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. SuSE makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "pixman-private.h" + +#if defined(USE_MIPS_DSPR2) || defined(USE_LOONGSON_MMI) + +#include <string.h> +#include <stdlib.h> + +#if defined (__linux__) /* linux ELF */ + +static pixman_bool_t +pixman_have_mips_feature (const char *search_string) +{ + const char *file_name = "/proc/cpuinfo"; + /* Simple detection of MIPS features at runtime for Linux. + * It is based on /proc/cpuinfo, which reveals hardware configuration + * to user-space applications. According to MIPS (early 2010), no similar + * facility is universally available on the MIPS architectures, so it's up + * to individual OSes to provide such. + */ + + char cpuinfo_line[256]; + + FILE *f = NULL; + + if ((f = fopen (file_name, "r")) == NULL) + return FALSE; + + while (fgets (cpuinfo_line, sizeof (cpuinfo_line), f) != NULL) + { + if (strstr (cpuinfo_line, search_string) != NULL) + { + fclose (f); + return TRUE; + } + } + + fclose (f); + + /* Did not find string in the proc file. */ + return FALSE; +} + +#if defined(USE_MIPS_DSPR2) +pixman_bool_t +pixman_have_mips_dspr2 (void) +{ + /* Only currently available MIPS core that supports DSPr2 is 74K. */ + return pixman_have_mips_feature ("MIPS 74K"); +} +#endif + +#if defined(USE_LOONGSON_MMI) +pixman_bool_t +pixman_have_loongson_mmi (void) +{ + /* I really don't know if some Loongson CPUs don't have MMI. */ + return pixman_have_mips_feature ("Loongson"); +} +#endif + +#else /* linux ELF */ + +#define pixman_have_mips_dspr2() FALSE +#define pixman_have_loongson_mmi() FALSE + +#endif /* linux ELF */ + +#endif /* USE_MIPS_DSPR2 || USE_LOONGSON_MMI */ + +pixman_implementation_t * +_pixman_mips_get_implementations (pixman_implementation_t *imp) +{ +#ifdef USE_LOONGSON_MMI + if (!_pixman_disabled ("loongson-mmi") && pixman_have_loongson_mmi ()) + imp = _pixman_implementation_create_mmx (imp); +#endif + +#ifdef USE_MIPS_DSPR2 + if (!_pixman_disabled ("mips-dspr2") && pixman_have_mips_dspr2 ()) + imp = _pixman_implementation_create_mips_dspr2 (imp); +#endif + + return imp; +} + diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h index 5e5b8835..4d8f64d3 100644 --- a/pixman/pixman-private.h +++ b/pixman/pixman-private.h @@ -598,6 +598,9 @@ pixman_implementation_t * _pixman_ppc_get_implementations (pixman_implementation_t *imp); pixman_implementation_t * +_pixman_mips_get_implementations (pixman_implementation_t *imp); + +pixman_implementation_t * _pixman_choose_implementation (void); pixman_bool_t |