xref: /dpdk/lib/eal/ppc/rte_cycles.c (revision 0615dd2aa139312a93ae312233a80e164c8f1048)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright (C) IBM Corporation 2019.
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
5*0615dd2aSDuncan Bellamy #include <features.h>
6*0615dd2aSDuncan Bellamy #ifdef __GLIBC__
799a2dd95SBruce Richardson #include <sys/platform/ppc.h>
8*0615dd2aSDuncan Bellamy #elif RTE_EXEC_ENV_LINUX
9*0615dd2aSDuncan Bellamy #include <string.h>
10*0615dd2aSDuncan Bellamy #include <stdio.h>
11*0615dd2aSDuncan Bellamy #endif
1299a2dd95SBruce Richardson 
1399a2dd95SBruce Richardson #include "eal_private.h"
1499a2dd95SBruce Richardson 
1599a2dd95SBruce Richardson uint64_t
get_tsc_freq_arch(void)1699a2dd95SBruce Richardson get_tsc_freq_arch(void)
1799a2dd95SBruce Richardson {
18*0615dd2aSDuncan Bellamy #ifdef __GLIBC__
1999a2dd95SBruce Richardson 	return __ppc_get_timebase_freq();
20*0615dd2aSDuncan Bellamy #elif RTE_EXEC_ENV_LINUX
21*0615dd2aSDuncan Bellamy 	static unsigned long base;
22*0615dd2aSDuncan Bellamy 	char buf[512];
23*0615dd2aSDuncan Bellamy 	ssize_t nr;
24*0615dd2aSDuncan Bellamy 	FILE *f;
25*0615dd2aSDuncan Bellamy 
26*0615dd2aSDuncan Bellamy 	if (base != 0)
27*0615dd2aSDuncan Bellamy 		goto out;
28*0615dd2aSDuncan Bellamy 
29*0615dd2aSDuncan Bellamy 	f = fopen("/proc/cpuinfo", "rb");
30*0615dd2aSDuncan Bellamy 	if (f == NULL)
31*0615dd2aSDuncan Bellamy 		goto out;
32*0615dd2aSDuncan Bellamy 
33*0615dd2aSDuncan Bellamy 	while (fgets(buf, sizeof(buf), f) != NULL) {
34*0615dd2aSDuncan Bellamy 		char *ret = strstr(buf, "timebase");
35*0615dd2aSDuncan Bellamy 
36*0615dd2aSDuncan Bellamy 		if (ret == NULL)
37*0615dd2aSDuncan Bellamy 			continue;
38*0615dd2aSDuncan Bellamy 		ret += sizeof("timebase") - 1;
39*0615dd2aSDuncan Bellamy 		ret = strchr(ret, ':');
40*0615dd2aSDuncan Bellamy 		if (ret == NULL)
41*0615dd2aSDuncan Bellamy 			continue;
42*0615dd2aSDuncan Bellamy 		base = strtoul(ret + 1, NULL, 10);
43*0615dd2aSDuncan Bellamy 		break;
44*0615dd2aSDuncan Bellamy 	}
45*0615dd2aSDuncan Bellamy 	fclose(f);
46*0615dd2aSDuncan Bellamy out:
47*0615dd2aSDuncan Bellamy 	return (uint64_t) base;
48*0615dd2aSDuncan Bellamy #else
49*0615dd2aSDuncan Bellamy 	return 0;
50*0615dd2aSDuncan Bellamy #endif
51*0615dd2aSDuncan Bellamy 
5299a2dd95SBruce Richardson }
53