1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright IBM Corp. 2008
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Authors: Hollis Blanchard <hollisb@us.ibm.com>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #ifndef __KVM_BOOKE_H__
10*4882a593Smuzhiyun #define __KVM_BOOKE_H__
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #include <linux/types.h>
13*4882a593Smuzhiyun #include <linux/kvm_host.h>
14*4882a593Smuzhiyun #include <asm/kvm_ppc.h>
15*4882a593Smuzhiyun #include <asm/switch_to.h>
16*4882a593Smuzhiyun #include "timing.h"
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun /* interrupt priortity ordering */
19*4882a593Smuzhiyun #define BOOKE_IRQPRIO_DATA_STORAGE 0
20*4882a593Smuzhiyun #define BOOKE_IRQPRIO_INST_STORAGE 1
21*4882a593Smuzhiyun #define BOOKE_IRQPRIO_ALIGNMENT 2
22*4882a593Smuzhiyun #define BOOKE_IRQPRIO_PROGRAM 3
23*4882a593Smuzhiyun #define BOOKE_IRQPRIO_FP_UNAVAIL 4
24*4882a593Smuzhiyun #ifdef CONFIG_SPE_POSSIBLE
25*4882a593Smuzhiyun #define BOOKE_IRQPRIO_SPE_UNAVAIL 5
26*4882a593Smuzhiyun #define BOOKE_IRQPRIO_SPE_FP_DATA 6
27*4882a593Smuzhiyun #define BOOKE_IRQPRIO_SPE_FP_ROUND 7
28*4882a593Smuzhiyun #endif
29*4882a593Smuzhiyun #ifdef CONFIG_PPC_E500MC
30*4882a593Smuzhiyun #define BOOKE_IRQPRIO_ALTIVEC_UNAVAIL 5
31*4882a593Smuzhiyun #define BOOKE_IRQPRIO_ALTIVEC_ASSIST 6
32*4882a593Smuzhiyun #endif
33*4882a593Smuzhiyun #define BOOKE_IRQPRIO_SYSCALL 8
34*4882a593Smuzhiyun #define BOOKE_IRQPRIO_AP_UNAVAIL 9
35*4882a593Smuzhiyun #define BOOKE_IRQPRIO_DTLB_MISS 10
36*4882a593Smuzhiyun #define BOOKE_IRQPRIO_ITLB_MISS 11
37*4882a593Smuzhiyun #define BOOKE_IRQPRIO_MACHINE_CHECK 12
38*4882a593Smuzhiyun #define BOOKE_IRQPRIO_DEBUG 13
39*4882a593Smuzhiyun #define BOOKE_IRQPRIO_CRITICAL 14
40*4882a593Smuzhiyun #define BOOKE_IRQPRIO_WATCHDOG 15
41*4882a593Smuzhiyun #define BOOKE_IRQPRIO_EXTERNAL 16
42*4882a593Smuzhiyun #define BOOKE_IRQPRIO_FIT 17
43*4882a593Smuzhiyun #define BOOKE_IRQPRIO_DECREMENTER 18
44*4882a593Smuzhiyun #define BOOKE_IRQPRIO_PERFORMANCE_MONITOR 19
45*4882a593Smuzhiyun /* Internal pseudo-irqprio for level triggered externals */
46*4882a593Smuzhiyun #define BOOKE_IRQPRIO_EXTERNAL_LEVEL 20
47*4882a593Smuzhiyun #define BOOKE_IRQPRIO_DBELL 21
48*4882a593Smuzhiyun #define BOOKE_IRQPRIO_DBELL_CRIT 22
49*4882a593Smuzhiyun #define BOOKE_IRQPRIO_MAX 23
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun #define BOOKE_IRQMASK_EE ((1 << BOOKE_IRQPRIO_EXTERNAL_LEVEL) | \
52*4882a593Smuzhiyun (1 << BOOKE_IRQPRIO_PERFORMANCE_MONITOR) | \
53*4882a593Smuzhiyun (1 << BOOKE_IRQPRIO_DBELL) | \
54*4882a593Smuzhiyun (1 << BOOKE_IRQPRIO_DECREMENTER) | \
55*4882a593Smuzhiyun (1 << BOOKE_IRQPRIO_FIT) | \
56*4882a593Smuzhiyun (1 << BOOKE_IRQPRIO_EXTERNAL))
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun #define BOOKE_IRQMASK_CE ((1 << BOOKE_IRQPRIO_DBELL_CRIT) | \
59*4882a593Smuzhiyun (1 << BOOKE_IRQPRIO_WATCHDOG) | \
60*4882a593Smuzhiyun (1 << BOOKE_IRQPRIO_CRITICAL))
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun extern unsigned long kvmppc_booke_handlers;
63*4882a593Smuzhiyun extern unsigned long kvmppc_booke_handler_addr[];
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr);
66*4882a593Smuzhiyun void kvmppc_mmu_msr_notify(struct kvm_vcpu *vcpu, u32 old_msr);
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun void kvmppc_set_epcr(struct kvm_vcpu *vcpu, u32 new_epcr);
69*4882a593Smuzhiyun void kvmppc_set_tcr(struct kvm_vcpu *vcpu, u32 new_tcr);
70*4882a593Smuzhiyun void kvmppc_set_tsr_bits(struct kvm_vcpu *vcpu, u32 tsr_bits);
71*4882a593Smuzhiyun void kvmppc_clr_tsr_bits(struct kvm_vcpu *vcpu, u32 tsr_bits);
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun int kvmppc_booke_emulate_op(struct kvm_vcpu *vcpu,
74*4882a593Smuzhiyun unsigned int inst, int *advance);
75*4882a593Smuzhiyun int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val);
76*4882a593Smuzhiyun int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val);
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun /* low-level asm code to transfer guest state */
79*4882a593Smuzhiyun void kvmppc_load_guest_spe(struct kvm_vcpu *vcpu);
80*4882a593Smuzhiyun void kvmppc_save_guest_spe(struct kvm_vcpu *vcpu);
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun /* high-level function, manages flags, host state */
83*4882a593Smuzhiyun void kvmppc_vcpu_disable_spe(struct kvm_vcpu *vcpu);
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun void kvmppc_booke_vcpu_load(struct kvm_vcpu *vcpu, int cpu);
86*4882a593Smuzhiyun void kvmppc_booke_vcpu_put(struct kvm_vcpu *vcpu);
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun enum int_class {
89*4882a593Smuzhiyun INT_CLASS_NONCRIT,
90*4882a593Smuzhiyun INT_CLASS_CRIT,
91*4882a593Smuzhiyun INT_CLASS_MC,
92*4882a593Smuzhiyun INT_CLASS_DBG,
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun void kvmppc_set_pending_interrupt(struct kvm_vcpu *vcpu, enum int_class type);
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun extern int kvmppc_core_emulate_op_e500(struct kvm_vcpu *vcpu,
98*4882a593Smuzhiyun unsigned int inst, int *advance);
99*4882a593Smuzhiyun extern int kvmppc_core_emulate_mtspr_e500(struct kvm_vcpu *vcpu, int sprn,
100*4882a593Smuzhiyun ulong spr_val);
101*4882a593Smuzhiyun extern int kvmppc_core_emulate_mfspr_e500(struct kvm_vcpu *vcpu, int sprn,
102*4882a593Smuzhiyun ulong *spr_val);
103*4882a593Smuzhiyun extern int kvmppc_core_emulate_mtspr_e500(struct kvm_vcpu *vcpu, int sprn,
104*4882a593Smuzhiyun ulong spr_val);
105*4882a593Smuzhiyun extern int kvmppc_core_emulate_mfspr_e500(struct kvm_vcpu *vcpu, int sprn,
106*4882a593Smuzhiyun ulong *spr_val);
107*4882a593Smuzhiyun
kvmppc_clear_dbsr(void)108*4882a593Smuzhiyun static inline void kvmppc_clear_dbsr(void)
109*4882a593Smuzhiyun {
110*4882a593Smuzhiyun mtspr(SPRN_DBSR, mfspr(SPRN_DBSR));
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun #endif /* __KVM_BOOKE_H__ */
113