shithub: libvpx

ref: 7a5596fa78ad41c428c2e3a4196d3b391d4ac77c
dir: /vpx_ports/mips_cpudetect.c/

View raw version
/*
 *  Copyright (c) 2020 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */
#include <stdio.h>
#include <string.h>
#include "./vpx_config.h"
#include "vpx_ports/mips.h"

#if CONFIG_RUNTIME_CPU_DETECT
#if defined(__mips__) && defined(__linux__)
int mips_cpu_caps(void) {
  char cpuinfo_line[512];
  int flag = 0x0;
  FILE *f = fopen("/proc/cpuinfo", "r");
  if (!f) {
    // Assume nothing if /proc/cpuinfo is unavailable.
    // This will occur for Chrome sandbox for Pepper or Render process.
    return 0;
  }
  while (fgets(cpuinfo_line, sizeof(cpuinfo_line) - 1, f)) {
    if (memcmp(cpuinfo_line, "cpu model", 9) == 0) {
      // Workaround early kernel without mmi in ASEs line.
      if (strstr(cpuinfo_line, "Loongson-3")) {
        flag |= HAS_MMI;
      } else if (strstr(cpuinfo_line, "Loongson-2K")) {
        flag |= HAS_MMI | HAS_MSA;
      }
    }
    if (memcmp(cpuinfo_line, "ASEs implemented", 16) == 0) {
      if (strstr(cpuinfo_line, "loongson-mmi") &&
          strstr(cpuinfo_line, "loongson-ext")) {
        flag |= HAS_MMI;
      }
      if (strstr(cpuinfo_line, "msa")) {
        flag |= HAS_MSA;
      }
      // ASEs is the last line, so we can break here.
      break;
    }
  }
  fclose(f);
  return flag;
}
#else /* end __mips__ && __linux__ */
#error \
    "--enable-runtime-cpu-detect selected, but no CPU detection method " \
"available for your platform. Reconfigure with --disable-runtime-cpu-detect."
#endif
#else /* end CONFIG_RUNTIME_CPU_DETECT */
int mips_cpu_caps(void) { return 0; }
#endif