// This file determines MIPS features a processor supports.
//
// We return:
// - 0 if the machine matches the asked-for feature.
// - 1 if the machine does not.
// - 2 if the asked-for feature isn't recognised (this will be the case for
//     any feature if run on a non-MIPS machine).
// - 3 if there was a usage error (it also prints an error message).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define FEATURE_PRESENT       0
#define FEATURE_NOT_PRESENT   1
#define UNRECOGNISED_FEATURE  2
#define USAGE_ERROR           3

#if defined(VGA_mips32) || defined(VGA_mips64)
static int mipsCPUInfo(const char *search_string) {
   const char *file_name = "/proc/cpuinfo";
   /* Simple detection of MIPS DSP ASE at runtime for Linux.
   * It is based on /proc/cpuinfo, which reveals hardware configuration
   * to user-space applications. */

   char cpuinfo_line[256];

   FILE *f = NULL;
   if ((f = fopen (file_name, "r")) == NULL)
     return 0;

   while (fgets (cpuinfo_line, sizeof (cpuinfo_line), f) != NULL)
   {
     if (strstr (cpuinfo_line, search_string) != NULL)
     {
         fclose (f);
         return 1;
     }
   }

   fclose (f);

   /* Did not find string in the /proc/cpuinfo file. */
   return 0;
}

static int go(char *feature)
{
   int cpuinfo;
   if (strcmp(feature, "mips32-dsp") == 0) {
      const char *dsp = "dsp";
      cpuinfo = mipsCPUInfo(dsp);
      if (cpuinfo == 1) {
         return FEATURE_PRESENT;
      } else{
         return FEATURE_NOT_PRESENT;
      }
   } else if (strcmp(feature, "mips32-dspr2") == 0) {
      const char *dsp2 = "dsp2";
      cpuinfo = mipsCPUInfo(dsp2);
      if (cpuinfo == 1) {
         return FEATURE_PRESENT;
      } else{
         return FEATURE_NOT_PRESENT;
      }
   } else if (strcmp(feature, "cavium-octeon") == 0) {
      const char *cavium = "Cavium Octeon";
      cpuinfo = mipsCPUInfo(cavium);
      if (cpuinfo == 1) {
         return FEATURE_PRESENT;
      } else{
         return FEATURE_NOT_PRESENT;
      }
   } else if (strcmp(feature, "cavium-octeon2") == 0) {
      const char *cavium2 = "Cavium Octeon II";
      cpuinfo = mipsCPUInfo(cavium2);
      if (cpuinfo == 1) {
         return FEATURE_PRESENT;
      } else{
         return FEATURE_NOT_PRESENT;
      }
   } else if (strcmp(feature, "mips-be") == 0) {
#if defined (_MIPSEB)
     return FEATURE_PRESENT;
#else
     return FEATURE_NOT_PRESENT;
#endif
   } else {
      return UNRECOGNISED_FEATURE;
   }

}

#else

static int go(char *feature)
{
   /* Feature is not recognised. (non-MIPS machine!) */
   return UNRECOGNISED_FEATURE;
}

#endif


//---------------------------------------------------------------------------
// main
//---------------------------------------------------------------------------
int main(int argc, char **argv)
{
   if (argc != 2) {
      fprintf( stderr, "usage: mips_features <feature>\n" );
      exit(USAGE_ERROR);
   }
   return go(argv[1]);
}
