162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  Copyright 2007 Sony Corporation
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef _ASM_POWERPC_EMULATED_OPS_H
762306a36Sopenharmony_ci#define _ASM_POWERPC_EMULATED_OPS_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/atomic.h>
1062306a36Sopenharmony_ci#include <linux/perf_event.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#ifdef CONFIG_PPC_EMULATED_STATS
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistruct ppc_emulated_entry {
1662306a36Sopenharmony_ci	const char *name;
1762306a36Sopenharmony_ci	atomic_t val;
1862306a36Sopenharmony_ci};
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciextern struct ppc_emulated {
2162306a36Sopenharmony_ci#ifdef CONFIG_ALTIVEC
2262306a36Sopenharmony_ci	struct ppc_emulated_entry altivec;
2362306a36Sopenharmony_ci#endif
2462306a36Sopenharmony_ci	struct ppc_emulated_entry dcba;
2562306a36Sopenharmony_ci	struct ppc_emulated_entry dcbz;
2662306a36Sopenharmony_ci	struct ppc_emulated_entry fp_pair;
2762306a36Sopenharmony_ci	struct ppc_emulated_entry isel;
2862306a36Sopenharmony_ci	struct ppc_emulated_entry mcrxr;
2962306a36Sopenharmony_ci	struct ppc_emulated_entry mfpvr;
3062306a36Sopenharmony_ci	struct ppc_emulated_entry multiple;
3162306a36Sopenharmony_ci	struct ppc_emulated_entry popcntb;
3262306a36Sopenharmony_ci	struct ppc_emulated_entry spe;
3362306a36Sopenharmony_ci	struct ppc_emulated_entry string;
3462306a36Sopenharmony_ci	struct ppc_emulated_entry sync;
3562306a36Sopenharmony_ci	struct ppc_emulated_entry unaligned;
3662306a36Sopenharmony_ci#ifdef CONFIG_MATH_EMULATION
3762306a36Sopenharmony_ci	struct ppc_emulated_entry math;
3862306a36Sopenharmony_ci#endif
3962306a36Sopenharmony_ci#ifdef CONFIG_VSX
4062306a36Sopenharmony_ci	struct ppc_emulated_entry vsx;
4162306a36Sopenharmony_ci#endif
4262306a36Sopenharmony_ci#ifdef CONFIG_PPC64
4362306a36Sopenharmony_ci	struct ppc_emulated_entry mfdscr;
4462306a36Sopenharmony_ci	struct ppc_emulated_entry mtdscr;
4562306a36Sopenharmony_ci	struct ppc_emulated_entry lq_stq;
4662306a36Sopenharmony_ci	struct ppc_emulated_entry lxvw4x;
4762306a36Sopenharmony_ci	struct ppc_emulated_entry lxvh8x;
4862306a36Sopenharmony_ci	struct ppc_emulated_entry lxvd2x;
4962306a36Sopenharmony_ci	struct ppc_emulated_entry lxvb16x;
5062306a36Sopenharmony_ci#endif
5162306a36Sopenharmony_ci} ppc_emulated;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ciextern u32 ppc_warn_emulated;
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ciextern void ppc_warn_emulated_print(const char *type);
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#define __PPC_WARN_EMULATED(type)					 \
5862306a36Sopenharmony_ci	do {								 \
5962306a36Sopenharmony_ci		atomic_inc(&ppc_emulated.type.val);			 \
6062306a36Sopenharmony_ci		if (ppc_warn_emulated)					 \
6162306a36Sopenharmony_ci			ppc_warn_emulated_print(ppc_emulated.type.name); \
6262306a36Sopenharmony_ci	} while (0)
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci#else /* !CONFIG_PPC_EMULATED_STATS */
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci#define __PPC_WARN_EMULATED(type)	do { } while (0)
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#endif /* !CONFIG_PPC_EMULATED_STATS */
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci#define PPC_WARN_EMULATED(type, regs)					\
7162306a36Sopenharmony_ci	do {								\
7262306a36Sopenharmony_ci		perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS,		\
7362306a36Sopenharmony_ci			1, regs, 0);					\
7462306a36Sopenharmony_ci		__PPC_WARN_EMULATED(type);				\
7562306a36Sopenharmony_ci	} while (0)
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#define PPC_WARN_ALIGNMENT(type, regs)					\
7862306a36Sopenharmony_ci	do {								\
7962306a36Sopenharmony_ci		perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS,		\
8062306a36Sopenharmony_ci			1, regs, regs->dar);				\
8162306a36Sopenharmony_ci		__PPC_WARN_EMULATED(type);				\
8262306a36Sopenharmony_ci	} while (0)
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci#endif /* _ASM_POWERPC_EMULATED_OPS_H */
85