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 Richardsonget_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