1 // This file determines MIPS features a processor supports.
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).
14 #define FEATURE_PRESENT 0
15 #define FEATURE_NOT_PRESENT 1
16 #define UNRECOGNISED_FEATURE 2
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. */
26 char cpuinfo_line
[256];
29 if ((f
= fopen (file_name
, "r")) == NULL
)
32 while (fgets (cpuinfo_line
, sizeof (cpuinfo_line
), f
) != NULL
)
34 if (strstr (cpuinfo_line
, search_string
) != NULL
)
43 /* Did not find string in the /proc/cpuinfo file. */
47 static int go(char *feature
)
50 if (strcmp(feature
, "fpu") == 0) {
51 #if defined(__mips_hard_float)
52 /* This is not a runtime detection.
53 If mips_features is built as hard-float, the assumption is that
54 the target MIPS platform has a floating-point unit. */
55 return FEATURE_PRESENT
;
57 return FEATURE_NOT_PRESENT
;
60 else if (strcmp(feature
, "mips32-dsp") == 0) {
61 const char *dsp
= "dsp";
62 cpuinfo
= mipsCPUInfo(dsp
);
64 return FEATURE_PRESENT
;
66 return FEATURE_NOT_PRESENT
;
68 } else if (strcmp(feature
, "mips32-dspr2") == 0) {
69 const char *dsp2
= "dsp2";
70 cpuinfo
= mipsCPUInfo(dsp2
);
72 return FEATURE_PRESENT
;
74 return FEATURE_NOT_PRESENT
;
76 } else if (strcmp(feature
, "cavium-octeon") == 0) {
77 const char *cavium
= "Cavium Octeon";
78 cpuinfo
= mipsCPUInfo(cavium
);
80 return FEATURE_PRESENT
;
82 return FEATURE_NOT_PRESENT
;
84 } else if (strcmp(feature
, "cavium-octeon2") == 0) {
85 const char *cavium2
= "Cavium Octeon II";
86 cpuinfo
= mipsCPUInfo(cavium2
);
88 return FEATURE_PRESENT
;
90 return FEATURE_NOT_PRESENT
;
92 } else if (strcmp(feature
, "mips-be") == 0) {
94 return FEATURE_PRESENT
;
96 return FEATURE_NOT_PRESENT
;
99 return UNRECOGNISED_FEATURE
;
106 static int go(char *feature
)
108 /* Feature is not recognised. (non-MIPS machine!) */
109 return UNRECOGNISED_FEATURE
;
115 //---------------------------------------------------------------------------
117 //---------------------------------------------------------------------------
118 int main(int argc
, char **argv
)
121 fprintf( stderr
, "usage: mips_features <feature>\n" );