1 // This file determines MIPS features a processor supports. 2 // 3 // We return: 4 // - 0 if the machine matches the asked-for feature. 5 // - 1 if the machine does not. 6 // - 2 if the asked-for feature isn't recognised (this will be the case for 7 // any feature if run on a non-MIPS machine). 8 // - 3 if there was a usage error (it also prints an error message). 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <string.h> 12 #include <assert.h> 13 14 #define FEATURE_PRESENT 0 15 #define FEATURE_NOT_PRESENT 1 16 #define UNRECOGNISED_FEATURE 2 17 #define USAGE_ERROR 3 18 19 #if defined(VGA_mips32) || defined(VGA_mips64) 20 static int mipsCPUInfo(const char *search_string) { 21 const char *file_name = "/proc/cpuinfo"; 22 /* Simple detection of MIPS DSP ASE at runtime for Linux. 23 * It is based on /proc/cpuinfo, which reveals hardware configuration 24 * to user-space applications. */ 25 26 char cpuinfo_line[256]; 27 28 FILE *f = NULL; 29 if ((f = fopen (file_name, "r")) == NULL) 30 return 0; 31 32 while (fgets (cpuinfo_line, sizeof (cpuinfo_line), f) != NULL) 33 { 34 if (strstr (cpuinfo_line, search_string) != NULL) 35 { 36 fclose (f); 37 return 1; 38 } 39 } 40 41 fclose (f); 42 43 /* Did not find string in the /proc/cpuinfo file. */ 44 return 0; 45 } 46 47 static int go(char *feature) 48 { 49 int cpuinfo; 50 if (strcmp(feature, "mips32-dsp") == 0) { 51 const char *dsp = "dsp"; 52 cpuinfo = mipsCPUInfo(dsp); 53 if (cpuinfo == 1) { 54 return FEATURE_PRESENT; 55 } else{ 56 return FEATURE_NOT_PRESENT; 57 } 58 } else if (strcmp(feature, "mips32-dspr2") == 0) { 59 const char *dsp2 = "dsp2"; 60 cpuinfo = mipsCPUInfo(dsp2); 61 if (cpuinfo == 1) { 62 return FEATURE_PRESENT; 63 } else{ 64 return FEATURE_NOT_PRESENT; 65 } 66 } else if (strcmp(feature, "cavium-octeon") == 0) { 67 const char *cavium = "Cavium Octeon"; 68 cpuinfo = mipsCPUInfo(cavium); 69 if (cpuinfo == 1) { 70 return FEATURE_PRESENT; 71 } else{ 72 return FEATURE_NOT_PRESENT; 73 } 74 } else if (strcmp(feature, "cavium-octeon2") == 0) { 75 const char *cavium2 = "Cavium Octeon II"; 76 cpuinfo = mipsCPUInfo(cavium2); 77 if (cpuinfo == 1) { 78 return FEATURE_PRESENT; 79 } else{ 80 return FEATURE_NOT_PRESENT; 81 } 82 } else if (strcmp(feature, "mips-be") == 0) { 83 #if defined (_MIPSEB) 84 return FEATURE_PRESENT; 85 #else 86 return FEATURE_NOT_PRESENT; 87 #endif 88 } else { 89 return UNRECOGNISED_FEATURE; 90 } 91 92 } 93 94 #else 95 96 static int go(char *feature) 97 { 98 /* Feature is not recognised. (non-MIPS machine!) */ 99 return UNRECOGNISED_FEATURE; 100 } 101 102 #endif 103 104 105 //--------------------------------------------------------------------------- 106 // main 107 //--------------------------------------------------------------------------- 108 int main(int argc, char **argv) 109 { 110 if (argc != 2) { 111 fprintf( stderr, "usage: mips_features <feature>\n" ); 112 exit(USAGE_ERROR); 113 } 114 return go(argv[1]); 115 } 116