18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  Copyright 2007 Sony Corporation
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#ifndef _ASM_POWERPC_EMULATED_OPS_H
78c2ecf20Sopenharmony_ci#define _ASM_POWERPC_EMULATED_OPS_H
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <linux/atomic.h>
108c2ecf20Sopenharmony_ci#include <linux/perf_event.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_EMULATED_STATS
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_cistruct ppc_emulated_entry {
168c2ecf20Sopenharmony_ci	const char *name;
178c2ecf20Sopenharmony_ci	atomic_t val;
188c2ecf20Sopenharmony_ci};
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ciextern struct ppc_emulated {
218c2ecf20Sopenharmony_ci#ifdef CONFIG_ALTIVEC
228c2ecf20Sopenharmony_ci	struct ppc_emulated_entry altivec;
238c2ecf20Sopenharmony_ci#endif
248c2ecf20Sopenharmony_ci	struct ppc_emulated_entry dcba;
258c2ecf20Sopenharmony_ci	struct ppc_emulated_entry dcbz;
268c2ecf20Sopenharmony_ci	struct ppc_emulated_entry fp_pair;
278c2ecf20Sopenharmony_ci	struct ppc_emulated_entry isel;
288c2ecf20Sopenharmony_ci	struct ppc_emulated_entry mcrxr;
298c2ecf20Sopenharmony_ci	struct ppc_emulated_entry mfpvr;
308c2ecf20Sopenharmony_ci	struct ppc_emulated_entry multiple;
318c2ecf20Sopenharmony_ci	struct ppc_emulated_entry popcntb;
328c2ecf20Sopenharmony_ci	struct ppc_emulated_entry spe;
338c2ecf20Sopenharmony_ci	struct ppc_emulated_entry string;
348c2ecf20Sopenharmony_ci	struct ppc_emulated_entry sync;
358c2ecf20Sopenharmony_ci	struct ppc_emulated_entry unaligned;
368c2ecf20Sopenharmony_ci#ifdef CONFIG_MATH_EMULATION
378c2ecf20Sopenharmony_ci	struct ppc_emulated_entry math;
388c2ecf20Sopenharmony_ci#endif
398c2ecf20Sopenharmony_ci#ifdef CONFIG_VSX
408c2ecf20Sopenharmony_ci	struct ppc_emulated_entry vsx;
418c2ecf20Sopenharmony_ci#endif
428c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC64
438c2ecf20Sopenharmony_ci	struct ppc_emulated_entry mfdscr;
448c2ecf20Sopenharmony_ci	struct ppc_emulated_entry mtdscr;
458c2ecf20Sopenharmony_ci	struct ppc_emulated_entry lq_stq;
468c2ecf20Sopenharmony_ci	struct ppc_emulated_entry lxvw4x;
478c2ecf20Sopenharmony_ci	struct ppc_emulated_entry lxvh8x;
488c2ecf20Sopenharmony_ci	struct ppc_emulated_entry lxvd2x;
498c2ecf20Sopenharmony_ci	struct ppc_emulated_entry lxvb16x;
508c2ecf20Sopenharmony_ci#endif
518c2ecf20Sopenharmony_ci} ppc_emulated;
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ciextern u32 ppc_warn_emulated;
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ciextern void ppc_warn_emulated_print(const char *type);
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#define __PPC_WARN_EMULATED(type)					 \
588c2ecf20Sopenharmony_ci	do {								 \
598c2ecf20Sopenharmony_ci		atomic_inc(&ppc_emulated.type.val);			 \
608c2ecf20Sopenharmony_ci		if (ppc_warn_emulated)					 \
618c2ecf20Sopenharmony_ci			ppc_warn_emulated_print(ppc_emulated.type.name); \
628c2ecf20Sopenharmony_ci	} while (0)
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci#else /* !CONFIG_PPC_EMULATED_STATS */
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci#define __PPC_WARN_EMULATED(type)	do { } while (0)
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci#endif /* !CONFIG_PPC_EMULATED_STATS */
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci#define PPC_WARN_EMULATED(type, regs)					\
718c2ecf20Sopenharmony_ci	do {								\
728c2ecf20Sopenharmony_ci		perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS,		\
738c2ecf20Sopenharmony_ci			1, regs, 0);					\
748c2ecf20Sopenharmony_ci		__PPC_WARN_EMULATED(type);				\
758c2ecf20Sopenharmony_ci	} while (0)
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci#define PPC_WARN_ALIGNMENT(type, regs)					\
788c2ecf20Sopenharmony_ci	do {								\
798c2ecf20Sopenharmony_ci		perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS,		\
808c2ecf20Sopenharmony_ci			1, regs, regs->dar);				\
818c2ecf20Sopenharmony_ci		__PPC_WARN_EMULATED(type);				\
828c2ecf20Sopenharmony_ci	} while (0)
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci#endif /* _ASM_POWERPC_EMULATED_OPS_H */
85