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