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