1 /* 2 * Copyright 2008 IBM Corporation. 3 * Authors: Hollis Blanchard <hollisb@us.ibm.com> 4 * 5 * This work is licensed under the GNU GPL license version 2 or later. 6 * 7 */ 8 9 #ifndef KVM_PPC_H 10 #define KVM_PPC_H 11 12 #define TYPE_HOST_POWERPC_CPU "host-" TYPE_POWERPC_CPU 13 14 #ifdef CONFIG_KVM 15 16 uint32_t kvmppc_get_tbfreq(void); 17 uint64_t kvmppc_get_clockfreq(void); 18 uint32_t kvmppc_get_vmx(void); 19 uint32_t kvmppc_get_dfp(void); 20 bool kvmppc_get_host_model(char **buf); 21 bool kvmppc_get_host_serial(char **buf); 22 int kvmppc_get_hasidle(CPUPPCState *env); 23 int kvmppc_get_hypercall(CPUPPCState *env, uint8_t *buf, int buf_len); 24 int kvmppc_set_interrupt(PowerPCCPU *cpu, int irq, int level); 25 void kvmppc_enable_logical_ci_hcalls(void); 26 void kvmppc_enable_set_mode_hcall(void); 27 void kvmppc_enable_clear_ref_mod_hcalls(void); 28 void kvmppc_set_papr(PowerPCCPU *cpu); 29 int kvmppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr); 30 void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy); 31 int kvmppc_smt_threads(void); 32 int kvmppc_clear_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits); 33 int kvmppc_or_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits); 34 int kvmppc_set_tcr(PowerPCCPU *cpu); 35 int kvmppc_booke_watchdog_enable(PowerPCCPU *cpu); 36 target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu, 37 bool radix, bool gtse, 38 uint64_t proc_tbl); 39 #ifndef CONFIG_USER_ONLY 40 off_t kvmppc_alloc_rma(void **rma); 41 bool kvmppc_spapr_use_multitce(void); 42 int kvmppc_spapr_enable_inkernel_multitce(void); 43 void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift, 44 uint64_t bus_offset, uint32_t nb_table, 45 int *pfd, bool need_vfio); 46 int kvmppc_remove_spapr_tce(void *table, int pfd, uint32_t window_size); 47 int kvmppc_reset_htab(int shift_hint); 48 uint64_t kvmppc_rma_size(uint64_t current_size, unsigned int hash_shift); 49 #endif /* !CONFIG_USER_ONLY */ 50 bool kvmppc_has_cap_epr(void); 51 int kvmppc_define_rtas_kernel_token(uint32_t token, const char *function); 52 bool kvmppc_has_cap_htab_fd(void); 53 int kvmppc_get_htab_fd(bool write); 54 int kvmppc_save_htab(QEMUFile *f, int fd, size_t bufsize, int64_t max_ns); 55 int kvmppc_load_htab_chunk(QEMUFile *f, int fd, uint32_t index, 56 uint16_t n_valid, uint16_t n_invalid); 57 void kvmppc_read_hptes(ppc_hash_pte64_t *hptes, hwaddr ptex, int n); 58 void kvmppc_write_hpte(hwaddr ptex, uint64_t pte0, uint64_t pte1); 59 bool kvmppc_has_cap_fixup_hcalls(void); 60 bool kvmppc_has_cap_htm(void); 61 bool kvmppc_has_cap_mmu_radix(void); 62 bool kvmppc_has_cap_mmu_hash_v3(void); 63 int kvmppc_enable_hwrng(void); 64 int kvmppc_put_books_sregs(PowerPCCPU *cpu); 65 PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void); 66 void kvmppc_check_papr_resize_hpt(Error **errp); 67 int kvmppc_resize_hpt_prepare(PowerPCCPU *cpu, target_ulong flags, int shift); 68 int kvmppc_resize_hpt_commit(PowerPCCPU *cpu, target_ulong flags, int shift); 69 void kvmppc_update_sdr1(target_ulong sdr1); 70 71 bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path); 72 73 #else 74 75 static inline uint32_t kvmppc_get_tbfreq(void) 76 { 77 return 0; 78 } 79 80 static inline bool kvmppc_get_host_model(char **buf) 81 { 82 return false; 83 } 84 85 static inline bool kvmppc_get_host_serial(char **buf) 86 { 87 return false; 88 } 89 90 static inline uint64_t kvmppc_get_clockfreq(void) 91 { 92 return 0; 93 } 94 95 static inline uint32_t kvmppc_get_vmx(void) 96 { 97 return 0; 98 } 99 100 static inline uint32_t kvmppc_get_dfp(void) 101 { 102 return 0; 103 } 104 105 static inline int kvmppc_get_hasidle(CPUPPCState *env) 106 { 107 return 0; 108 } 109 110 static inline int kvmppc_get_hypercall(CPUPPCState *env, uint8_t *buf, int buf_len) 111 { 112 return -1; 113 } 114 115 static inline int kvmppc_set_interrupt(PowerPCCPU *cpu, int irq, int level) 116 { 117 return -1; 118 } 119 120 static inline void kvmppc_enable_logical_ci_hcalls(void) 121 { 122 } 123 124 static inline void kvmppc_enable_set_mode_hcall(void) 125 { 126 } 127 128 static inline void kvmppc_enable_clear_ref_mod_hcalls(void) 129 { 130 } 131 132 static inline void kvmppc_set_papr(PowerPCCPU *cpu) 133 { 134 } 135 136 static inline int kvmppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr) 137 { 138 return 0; 139 } 140 141 static inline void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy) 142 { 143 } 144 145 static inline int kvmppc_smt_threads(void) 146 { 147 return 1; 148 } 149 150 static inline int kvmppc_or_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits) 151 { 152 return 0; 153 } 154 155 static inline int kvmppc_clear_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits) 156 { 157 return 0; 158 } 159 160 static inline int kvmppc_set_tcr(PowerPCCPU *cpu) 161 { 162 return 0; 163 } 164 165 static inline int kvmppc_booke_watchdog_enable(PowerPCCPU *cpu) 166 { 167 return -1; 168 } 169 170 static inline target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu, 171 bool radix, bool gtse, 172 uint64_t proc_tbl) 173 { 174 return 0; 175 } 176 177 #ifndef CONFIG_USER_ONLY 178 static inline off_t kvmppc_alloc_rma(void **rma) 179 { 180 return 0; 181 } 182 183 static inline bool kvmppc_spapr_use_multitce(void) 184 { 185 return false; 186 } 187 188 static inline int kvmppc_spapr_enable_inkernel_multitce(void) 189 { 190 return -1; 191 } 192 193 static inline void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift, 194 uint64_t bus_offset, 195 uint32_t nb_table, 196 int *pfd, bool need_vfio) 197 { 198 return NULL; 199 } 200 201 static inline int kvmppc_remove_spapr_tce(void *table, int pfd, 202 uint32_t nb_table) 203 { 204 return -1; 205 } 206 207 static inline int kvmppc_reset_htab(int shift_hint) 208 { 209 return 0; 210 } 211 212 static inline uint64_t kvmppc_rma_size(uint64_t current_size, 213 unsigned int hash_shift) 214 { 215 return ram_size; 216 } 217 218 static inline bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path) 219 { 220 return true; 221 } 222 223 #endif /* !CONFIG_USER_ONLY */ 224 225 static inline bool kvmppc_has_cap_epr(void) 226 { 227 return false; 228 } 229 230 static inline int kvmppc_define_rtas_kernel_token(uint32_t token, 231 const char *function) 232 { 233 return -1; 234 } 235 236 static inline bool kvmppc_has_cap_htab_fd(void) 237 { 238 return false; 239 } 240 241 static inline int kvmppc_get_htab_fd(bool write) 242 { 243 return -1; 244 } 245 246 static inline int kvmppc_save_htab(QEMUFile *f, int fd, size_t bufsize, 247 int64_t max_ns) 248 { 249 abort(); 250 } 251 252 static inline int kvmppc_load_htab_chunk(QEMUFile *f, int fd, uint32_t index, 253 uint16_t n_valid, uint16_t n_invalid) 254 { 255 abort(); 256 } 257 258 static inline void kvmppc_read_hptes(ppc_hash_pte64_t *hptes, 259 hwaddr ptex, int n) 260 { 261 abort(); 262 } 263 264 static inline void kvmppc_write_hpte(hwaddr ptex, uint64_t pte0, uint64_t pte1) 265 { 266 abort(); 267 } 268 269 static inline bool kvmppc_has_cap_fixup_hcalls(void) 270 { 271 abort(); 272 } 273 274 static inline bool kvmppc_has_cap_htm(void) 275 { 276 return false; 277 } 278 279 static inline bool kvmppc_has_cap_mmu_radix(void) 280 { 281 return false; 282 } 283 284 static inline bool kvmppc_has_cap_mmu_hash_v3(void) 285 { 286 return false; 287 } 288 289 static inline int kvmppc_enable_hwrng(void) 290 { 291 return -1; 292 } 293 294 static inline int kvmppc_put_books_sregs(PowerPCCPU *cpu) 295 { 296 abort(); 297 } 298 299 static inline PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void) 300 { 301 return NULL; 302 } 303 304 static inline void kvmppc_check_papr_resize_hpt(Error **errp) 305 { 306 return; 307 } 308 309 static inline int kvmppc_resize_hpt_prepare(PowerPCCPU *cpu, 310 target_ulong flags, int shift) 311 { 312 return -ENOSYS; 313 } 314 315 static inline int kvmppc_resize_hpt_commit(PowerPCCPU *cpu, 316 target_ulong flags, int shift) 317 { 318 return -ENOSYS; 319 } 320 321 static inline void kvmppc_update_sdr1(target_ulong sdr1) 322 { 323 abort(); 324 } 325 326 #endif 327 328 #ifndef CONFIG_KVM 329 330 #define kvmppc_eieio() do { } while (0) 331 332 static inline void kvmppc_dcbst_range(PowerPCCPU *cpu, uint8_t *addr, int len) 333 { 334 } 335 336 static inline void kvmppc_icbi_range(PowerPCCPU *cpu, uint8_t *addr, int len) 337 { 338 } 339 340 #else /* CONFIG_KVM */ 341 342 #define kvmppc_eieio() \ 343 do { \ 344 if (kvm_enabled()) { \ 345 asm volatile("eieio" : : : "memory"); \ 346 } \ 347 } while (0) 348 349 /* Store data cache blocks back to memory */ 350 static inline void kvmppc_dcbst_range(PowerPCCPU *cpu, uint8_t *addr, int len) 351 { 352 uint8_t *p; 353 354 for (p = addr; p < addr + len; p += cpu->env.dcache_line_size) { 355 asm volatile("dcbst 0,%0" : : "r"(p) : "memory"); 356 } 357 } 358 359 /* Invalidate instruction cache blocks */ 360 static inline void kvmppc_icbi_range(PowerPCCPU *cpu, uint8_t *addr, int len) 361 { 362 uint8_t *p; 363 364 for (p = addr; p < addr + len; p += cpu->env.icache_line_size) { 365 asm volatile("icbi 0,%0" : : "r"(p)); 366 } 367 } 368 369 #endif /* CONFIG_KVM */ 370 371 #endif /* KVM_PPC_H */ 372