11176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/*
21176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Copyright © 2000 SuSE, Inc.
31176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Copyright © 2007 Red Hat, Inc.
41176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *
51176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Permission to use, copy, modify, distribute, and sell this software and its
61176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * documentation for any purpose is hereby granted without fee, provided that
71176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * the above copyright notice appear in all copies and that both that
81176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * copyright notice and this permission notice appear in supporting
91176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * documentation, and that the name of SuSE not be used in advertising or
101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * publicity pertaining to distribution of the software without specific,
111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * written prior permission.  SuSE makes no representations about the
121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * suitability of this software for any purpose.  It is provided "as is"
131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * without express or implied warranty.
141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *
151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */
221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#ifdef HAVE_CONFIG_H
231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <config.h>
241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#endif
251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include "pixman-private.h"
271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#if defined(USE_MIPS_DSPR2) || defined(USE_LOONGSON_MMI)
291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <string.h>
311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <stdlib.h>
321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
331176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_bool_t
341176bdada62cabc6ec4b0308a930e83b679d5d36John Reckhave_feature (const char *search_string)
351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#if defined (__linux__) /* linux ELF */
371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    /* Simple detection of MIPS features at runtime for Linux.
381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     * It is based on /proc/cpuinfo, which reveals hardware configuration
391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     * to user-space applications.  According to MIPS (early 2010), no similar
401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     * facility is universally available on the MIPS architectures, so it's up
411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     * to individual OSes to provide such.
421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     */
431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    const char *file_name = "/proc/cpuinfo";
441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    char cpuinfo_line[256];
451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    FILE *f = NULL;
461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    if ((f = fopen (file_name, "r")) == NULL)
481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        return FALSE;
491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    while (fgets (cpuinfo_line, sizeof (cpuinfo_line), f) != NULL)
511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        if (strstr (cpuinfo_line, search_string) != NULL)
531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        {
541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            fclose (f);
551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            return TRUE;
561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        }
571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    fclose (f);
601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#endif
611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    /* Did not find string in the proc file, or not Linux ELF. */
631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    return FALSE;
641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#endif
671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
681176bdada62cabc6ec4b0308a930e83b679d5d36John Reckpixman_implementation_t *
691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck_pixman_mips_get_implementations (pixman_implementation_t *imp)
701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#ifdef USE_LOONGSON_MMI
721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    /* I really don't know if some Loongson CPUs don't have MMI. */
731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    if (!_pixman_disabled ("loongson-mmi") && have_feature ("Loongson"))
741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	imp = _pixman_implementation_create_mmx (imp);
751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#endif
761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#ifdef USE_MIPS_DSPR2
781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    if (!_pixman_disabled ("mips-dspr2"))
791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	int already_compiling_everything_for_dspr2 = 0;
811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#if defined(__mips_dsp) && (__mips_dsp_rev >= 2)
821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	already_compiling_everything_for_dspr2 = 1;
831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#endif
841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	if (already_compiling_everything_for_dspr2 ||
851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	    /* Only currently available MIPS core that supports DSPr2 is 74K. */
861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	    have_feature ("MIPS 74K"))
871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	{
881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	    imp = _pixman_implementation_create_mips_dspr2 (imp);
891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	}
901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#endif
921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    return imp;
941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
95