xref: /dpdk/lib/eal/ppc/rte_mmu.c (revision e168b18986a7ce39da3ba986d91c43cd5bbd6c1b)
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