18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include <sys/types.h> 38c2ecf20Sopenharmony_ci#include <errno.h> 48c2ecf20Sopenharmony_ci#include <unistd.h> 58c2ecf20Sopenharmony_ci#include <stdio.h> 68c2ecf20Sopenharmony_ci#include <stdlib.h> 78c2ecf20Sopenharmony_ci#include <string.h> 88c2ecf20Sopenharmony_ci#include <linux/stringify.h> 98c2ecf20Sopenharmony_ci#include "header.h" 108c2ecf20Sopenharmony_ci#include "utils_header.h" 118c2ecf20Sopenharmony_ci#include "metricgroup.h" 128c2ecf20Sopenharmony_ci#include <api/fs/fs.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ciint 158c2ecf20Sopenharmony_ciget_cpuid(char *buffer, size_t sz) 168c2ecf20Sopenharmony_ci{ 178c2ecf20Sopenharmony_ci unsigned long pvr; 188c2ecf20Sopenharmony_ci int nb; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci pvr = mfspr(SPRN_PVR); 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci nb = scnprintf(buffer, sz, "%lu,%lu$", PVR_VER(pvr), PVR_REV(pvr)); 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci /* look for end marker to ensure the entire data fit */ 258c2ecf20Sopenharmony_ci if (strchr(buffer, '$')) { 268c2ecf20Sopenharmony_ci buffer[nb-1] = '\0'; 278c2ecf20Sopenharmony_ci return 0; 288c2ecf20Sopenharmony_ci } 298c2ecf20Sopenharmony_ci return ENOBUFS; 308c2ecf20Sopenharmony_ci} 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_cichar * 338c2ecf20Sopenharmony_ciget_cpuid_str(struct perf_pmu *pmu __maybe_unused) 348c2ecf20Sopenharmony_ci{ 358c2ecf20Sopenharmony_ci char *bufp; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci if (asprintf(&bufp, "%.8lx", mfspr(SPRN_PVR)) < 0) 388c2ecf20Sopenharmony_ci bufp = NULL; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci return bufp; 418c2ecf20Sopenharmony_ci} 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ciint arch_get_runtimeparam(struct pmu_event *pe) 448c2ecf20Sopenharmony_ci{ 458c2ecf20Sopenharmony_ci int count; 468c2ecf20Sopenharmony_ci char path[PATH_MAX] = "/devices/hv_24x7/interface/"; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci atoi(pe->aggr_mode) == PerChip ? strcat(path, "sockets") : strcat(path, "coresperchip"); 498c2ecf20Sopenharmony_ci return sysfs__read_int(path, &count) < 0 ? 1 : count; 508c2ecf20Sopenharmony_ci} 51