18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/* Copyright (C) 2020 ARM Limited */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci/*
58c2ecf20Sopenharmony_ci * Below definitions may be found in kernel headers, However, they are
68c2ecf20Sopenharmony_ci * redefined here to decouple the MTE selftests compilations from them.
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci#ifndef SEGV_MTEAERR
98c2ecf20Sopenharmony_ci#define	SEGV_MTEAERR	8
108c2ecf20Sopenharmony_ci#endif
118c2ecf20Sopenharmony_ci#ifndef SEGV_MTESERR
128c2ecf20Sopenharmony_ci#define	SEGV_MTESERR	9
138c2ecf20Sopenharmony_ci#endif
148c2ecf20Sopenharmony_ci#ifndef PROT_MTE
158c2ecf20Sopenharmony_ci#define PROT_MTE	 0x20
168c2ecf20Sopenharmony_ci#endif
178c2ecf20Sopenharmony_ci#ifndef HWCAP2_MTE
188c2ecf20Sopenharmony_ci#define HWCAP2_MTE	(1 << 18)
198c2ecf20Sopenharmony_ci#endif
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#ifndef PR_MTE_TCF_SHIFT
228c2ecf20Sopenharmony_ci#define PR_MTE_TCF_SHIFT	1
238c2ecf20Sopenharmony_ci#endif
248c2ecf20Sopenharmony_ci#ifndef PR_MTE_TCF_NONE
258c2ecf20Sopenharmony_ci#define PR_MTE_TCF_NONE		(0UL << PR_MTE_TCF_SHIFT)
268c2ecf20Sopenharmony_ci#endif
278c2ecf20Sopenharmony_ci#ifndef PR_MTE_TCF_SYNC
288c2ecf20Sopenharmony_ci#define	PR_MTE_TCF_SYNC		(1UL << PR_MTE_TCF_SHIFT)
298c2ecf20Sopenharmony_ci#endif
308c2ecf20Sopenharmony_ci#ifndef PR_MTE_TCF_ASYNC
318c2ecf20Sopenharmony_ci#define PR_MTE_TCF_ASYNC	(2UL << PR_MTE_TCF_SHIFT)
328c2ecf20Sopenharmony_ci#endif
338c2ecf20Sopenharmony_ci#ifndef PR_MTE_TAG_SHIFT
348c2ecf20Sopenharmony_ci#define	PR_MTE_TAG_SHIFT	3
358c2ecf20Sopenharmony_ci#endif
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci/* MTE Hardware feature definitions below. */
388c2ecf20Sopenharmony_ci#define MT_TAG_SHIFT		56
398c2ecf20Sopenharmony_ci#define MT_TAG_MASK		0xFUL
408c2ecf20Sopenharmony_ci#define MT_FREE_TAG		0x0UL
418c2ecf20Sopenharmony_ci#define MT_GRANULE_SIZE         16
428c2ecf20Sopenharmony_ci#define MT_TAG_COUNT		16
438c2ecf20Sopenharmony_ci#define MT_INCLUDE_TAG_MASK	0xFFFF
448c2ecf20Sopenharmony_ci#define MT_EXCLUDE_TAG_MASK	0x0
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci#define MT_ALIGN_GRANULE	(MT_GRANULE_SIZE - 1)
478c2ecf20Sopenharmony_ci#define MT_CLEAR_TAG(x)		((x) & ~(MT_TAG_MASK << MT_TAG_SHIFT))
488c2ecf20Sopenharmony_ci#define MT_SET_TAG(x, y)	((x) | (y << MT_TAG_SHIFT))
498c2ecf20Sopenharmony_ci#define MT_FETCH_TAG(x)		((x >> MT_TAG_SHIFT) & (MT_TAG_MASK))
508c2ecf20Sopenharmony_ci#define MT_ALIGN_UP(x)		((x + MT_ALIGN_GRANULE) & ~(MT_ALIGN_GRANULE))
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci#define MT_PSTATE_TCO_SHIFT	25
538c2ecf20Sopenharmony_ci#define MT_PSTATE_TCO_MASK	~(0x1 << MT_PSTATE_TCO_SHIFT)
548c2ecf20Sopenharmony_ci#define MT_PSTATE_TCO_EN	1
558c2ecf20Sopenharmony_ci#define MT_PSTATE_TCO_DIS	0
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#define MT_EXCLUDE_TAG(x)		(1 << (x))
588c2ecf20Sopenharmony_ci#define MT_INCLUDE_VALID_TAG(x)		(MT_INCLUDE_TAG_MASK ^ MT_EXCLUDE_TAG(x))
598c2ecf20Sopenharmony_ci#define MT_INCLUDE_VALID_TAGS(x)	(MT_INCLUDE_TAG_MASK ^ (x))
608c2ecf20Sopenharmony_ci#define MTE_ALLOW_NON_ZERO_TAG		MT_INCLUDE_VALID_TAG(0)
61