162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
362306a36Sopenharmony_ci * License.  See the file "COPYING" in the main directory of this archive
462306a36Sopenharmony_ci * for more details.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 2009 Wind River Systems,
762306a36Sopenharmony_ci *   written by Ralf Baechle <ralf@linux-mips.org>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci#ifndef __ASM_COP2_H
1062306a36Sopenharmony_ci#define __ASM_COP2_H
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/notifier.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#if defined(CONFIG_CPU_CAVIUM_OCTEON)
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ciextern void octeon_cop2_save(struct octeon_cop2_state *);
1762306a36Sopenharmony_ciextern void octeon_cop2_restore(struct octeon_cop2_state *);
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define cop2_save(r)		octeon_cop2_save(&(r)->thread.cp2)
2062306a36Sopenharmony_ci#define cop2_restore(r)		octeon_cop2_restore(&(r)->thread.cp2)
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define cop2_present		1
2362306a36Sopenharmony_ci#define cop2_lazy_restore	1
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#elif defined(CONFIG_CPU_LOONGSON64)
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#define cop2_present		1
2862306a36Sopenharmony_ci#define cop2_lazy_restore	1
2962306a36Sopenharmony_ci#define cop2_save(r)		do { (void)(r); } while (0)
3062306a36Sopenharmony_ci#define cop2_restore(r)		do { (void)(r); } while (0)
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#else
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define cop2_present		0
3562306a36Sopenharmony_ci#define cop2_lazy_restore	0
3662306a36Sopenharmony_ci#define cop2_save(r)		do { (void)(r); } while (0)
3762306a36Sopenharmony_ci#define cop2_restore(r)		do { (void)(r); } while (0)
3862306a36Sopenharmony_ci#endif
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cienum cu2_ops {
4162306a36Sopenharmony_ci	CU2_EXCEPTION,
4262306a36Sopenharmony_ci	CU2_LWC2_OP,
4362306a36Sopenharmony_ci	CU2_LDC2_OP,
4462306a36Sopenharmony_ci	CU2_SWC2_OP,
4562306a36Sopenharmony_ci	CU2_SDC2_OP,
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ciextern int register_cu2_notifier(struct notifier_block *nb);
4962306a36Sopenharmony_ciextern int cu2_notifier_call_chain(unsigned long val, void *v);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#define cu2_notifier(fn, pri)						\
5262306a36Sopenharmony_ci({									\
5362306a36Sopenharmony_ci	static struct notifier_block fn##_nb = {			\
5462306a36Sopenharmony_ci		.notifier_call = fn,					\
5562306a36Sopenharmony_ci		.priority = pri						\
5662306a36Sopenharmony_ci	};								\
5762306a36Sopenharmony_ci									\
5862306a36Sopenharmony_ci	register_cu2_notifier(&fn##_nb);				\
5962306a36Sopenharmony_ci})
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#endif /* __ASM_COP2_H */
62