1*e168b189SDavid Christensen /* SPDX-License-Identifier: BSD-3-Clause
2*e168b189SDavid Christensen * Copyright (C) IBM Corporation 2024
3*e168b189SDavid Christensen */
4*e168b189SDavid Christensen
5*e168b189SDavid Christensen #include <stdio.h>
6*e168b189SDavid Christensen #include <string.h>
7*e168b189SDavid Christensen
8*e168b189SDavid Christensen #include "eal_private.h"
9*e168b189SDavid Christensen
10*e168b189SDavid Christensen bool
eal_mmu_supported(void)11*e168b189SDavid Christensen eal_mmu_supported(void)
12*e168b189SDavid Christensen {
13*e168b189SDavid Christensen #ifdef RTE_EXEC_ENV_LINUX
14*e168b189SDavid Christensen static const char proc_cpuinfo[] = "/proc/cpuinfo";
15*e168b189SDavid Christensen static const char str_mmu[] = "MMU";
16*e168b189SDavid Christensen static const char str_radix[] = "Radix";
17*e168b189SDavid Christensen char buf[512];
18*e168b189SDavid Christensen char *ret = NULL;
19*e168b189SDavid Christensen FILE *f = fopen(proc_cpuinfo, "r");
20*e168b189SDavid Christensen
21*e168b189SDavid Christensen if (f == NULL) {
22*e168b189SDavid Christensen EAL_LOG(ERR, "Cannot open %s", proc_cpuinfo);
23*e168b189SDavid Christensen return false;
24*e168b189SDavid Christensen }
25*e168b189SDavid Christensen
26*e168b189SDavid Christensen /*
27*e168b189SDavid Christensen * Example "MMU" in /proc/cpuinfo:
28*e168b189SDavid Christensen * ...
29*e168b189SDavid Christensen * model : 8335-GTW
30*e168b189SDavid Christensen * machine : PowerNV 8335-GTW
31*e168b189SDavid Christensen * firmware : OPAL
32*e168b189SDavid Christensen * MMU : Radix
33*e168b189SDavid Christensen * ... or ...
34*e168b189SDavid Christensen * model : IBM,9009-22A
35*e168b189SDavid Christensen * machine : CHRP IBM,9009-22A
36*e168b189SDavid Christensen * MMU : Hash
37*e168b189SDavid Christensen */
38*e168b189SDavid Christensen while (fgets(buf, sizeof(buf), f) != NULL) {
39*e168b189SDavid Christensen ret = strstr(buf, str_mmu);
40*e168b189SDavid Christensen if (ret == NULL)
41*e168b189SDavid Christensen continue;
42*e168b189SDavid Christensen ret += sizeof(str_mmu) - 1;
43*e168b189SDavid Christensen ret = strchr(ret, ':');
44*e168b189SDavid Christensen if (ret == NULL)
45*e168b189SDavid Christensen continue;
46*e168b189SDavid Christensen ret = strstr(ret, str_radix);
47*e168b189SDavid Christensen break;
48*e168b189SDavid Christensen }
49*e168b189SDavid Christensen fclose(f);
50*e168b189SDavid Christensen
51*e168b189SDavid Christensen if (ret == NULL)
52*e168b189SDavid Christensen EAL_LOG(ERR, "DPDK on PPC64 requires radix-mmu");
53*e168b189SDavid Christensen
54*e168b189SDavid Christensen return (ret != NULL);
55*e168b189SDavid Christensen #elif RTE_EXEC_ENV_FREEBSD
56*e168b189SDavid Christensen /*
57*e168b189SDavid Christensen * Method to detect MMU type in FreeBSD not known at the moment.
58*e168b189SDavid Christensen * Return true for now to emulate previous behavior and
59*e168b189SDavid Christensen * avoid unnecessary failures.
60*e168b189SDavid Christensen */
61*e168b189SDavid Christensen return true;
62*e168b189SDavid Christensen #else
63*e168b189SDavid Christensen /* Force false for other execution environments. */
64*e168b189SDavid Christensen return false;
65*e168b189SDavid Christensen #endif
66*e168b189SDavid Christensen }
67