1 /* 2 * QEMU PowerPC pSeries Logical Partition (aka sPAPR) hardware System Emulator 3 * 4 * PAPR Virtualized Interrupt System, aka ICS/ICP aka xics, in-kernel emulation 5 * 6 * Copyright (c) 2013 David Gibson, IBM Corporation. 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining a copy 9 * of this software and associated documentation files (the "Software"), to deal 10 * in the Software without restriction, including without limitation the rights 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 * copies of the Software, and to permit persons to whom the Software is 13 * furnished to do so, subject to the following conditions: 14 * 15 * The above copyright notice and this permission notice shall be included in 16 * all copies or substantial portions of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 * THE SOFTWARE. 25 * 26 */ 27 28 #include "qemu/osdep.h" 29 #include "qapi/error.h" 30 #include "hw/hw.h" 31 #include "trace.h" 32 #include "hw/ppc/spapr.h" 33 #include "hw/ppc/xics.h" 34 #include "kvm_ppc.h" 35 #include "qemu/config-file.h" 36 #include "qemu/error-report.h" 37 38 #include <sys/ioctl.h> 39 40 typedef struct KVMXICSState { 41 XICSState parent_obj; 42 43 int kernel_xics_fd; 44 } KVMXICSState; 45 46 /* 47 * ICP-KVM 48 */ 49 static void icp_get_kvm_state(ICPState *ss) 50 { 51 uint64_t state; 52 struct kvm_one_reg reg = { 53 .id = KVM_REG_PPC_ICP_STATE, 54 .addr = (uintptr_t)&state, 55 }; 56 int ret; 57 58 /* ICP for this CPU thread is not in use, exiting */ 59 if (!ss->cs) { 60 return; 61 } 62 63 ret = kvm_vcpu_ioctl(ss->cs, KVM_GET_ONE_REG, ®); 64 if (ret != 0) { 65 error_report("Unable to retrieve KVM interrupt controller state" 66 " for CPU %ld: %s", kvm_arch_vcpu_id(ss->cs), strerror(errno)); 67 exit(1); 68 } 69 70 ss->xirr = state >> KVM_REG_PPC_ICP_XISR_SHIFT; 71 ss->mfrr = (state >> KVM_REG_PPC_ICP_MFRR_SHIFT) 72 & KVM_REG_PPC_ICP_MFRR_MASK; 73 ss->pending_priority = (state >> KVM_REG_PPC_ICP_PPRI_SHIFT) 74 & KVM_REG_PPC_ICP_PPRI_MASK; 75 } 76 77 static int icp_set_kvm_state(ICPState *ss, int version_id) 78 { 79 uint64_t state; 80 struct kvm_one_reg reg = { 81 .id = KVM_REG_PPC_ICP_STATE, 82 .addr = (uintptr_t)&state, 83 }; 84 int ret; 85 86 /* ICP for this CPU thread is not in use, exiting */ 87 if (!ss->cs) { 88 return 0; 89 } 90 91 state = ((uint64_t)ss->xirr << KVM_REG_PPC_ICP_XISR_SHIFT) 92 | ((uint64_t)ss->mfrr << KVM_REG_PPC_ICP_MFRR_SHIFT) 93 | ((uint64_t)ss->pending_priority << KVM_REG_PPC_ICP_PPRI_SHIFT); 94 95 ret = kvm_vcpu_ioctl(ss->cs, KVM_SET_ONE_REG, ®); 96 if (ret != 0) { 97 error_report("Unable to restore KVM interrupt controller state (0x%" 98 PRIx64 ") for CPU %ld: %s", state, kvm_arch_vcpu_id(ss->cs), 99 strerror(errno)); 100 return ret; 101 } 102 103 return 0; 104 } 105 106 static void icp_kvm_reset(DeviceState *dev) 107 { 108 ICPState *icp = ICP(dev); 109 110 icp->xirr = 0; 111 icp->pending_priority = 0xff; 112 icp->mfrr = 0xff; 113 114 /* Make all outputs are deasserted */ 115 qemu_set_irq(icp->output, 0); 116 117 icp_set_kvm_state(icp, 1); 118 } 119 120 static void icp_kvm_class_init(ObjectClass *klass, void *data) 121 { 122 DeviceClass *dc = DEVICE_CLASS(klass); 123 ICPStateClass *icpc = ICP_CLASS(klass); 124 125 dc->reset = icp_kvm_reset; 126 icpc->pre_save = icp_get_kvm_state; 127 icpc->post_load = icp_set_kvm_state; 128 } 129 130 static const TypeInfo icp_kvm_info = { 131 .name = TYPE_KVM_ICP, 132 .parent = TYPE_ICP, 133 .instance_size = sizeof(ICPState), 134 .class_init = icp_kvm_class_init, 135 .class_size = sizeof(ICPStateClass), 136 }; 137 138 /* 139 * ICS-KVM 140 */ 141 static void ics_get_kvm_state(ICSState *ics) 142 { 143 KVMXICSState *icpkvm = KVM_XICS(ics->icp); 144 uint64_t state; 145 struct kvm_device_attr attr = { 146 .flags = 0, 147 .group = KVM_DEV_XICS_GRP_SOURCES, 148 .addr = (uint64_t)(uintptr_t)&state, 149 }; 150 int i; 151 152 for (i = 0; i < ics->nr_irqs; i++) { 153 ICSIRQState *irq = &ics->irqs[i]; 154 int ret; 155 156 attr.attr = i + ics->offset; 157 158 ret = ioctl(icpkvm->kernel_xics_fd, KVM_GET_DEVICE_ATTR, &attr); 159 if (ret != 0) { 160 error_report("Unable to retrieve KVM interrupt controller state" 161 " for IRQ %d: %s", i + ics->offset, strerror(errno)); 162 exit(1); 163 } 164 165 irq->server = state & KVM_XICS_DESTINATION_MASK; 166 irq->saved_priority = (state >> KVM_XICS_PRIORITY_SHIFT) 167 & KVM_XICS_PRIORITY_MASK; 168 /* 169 * To be consistent with the software emulation in xics.c, we 170 * split out the masked state + priority that we get from the 171 * kernel into 'current priority' (0xff if masked) and 172 * 'saved priority' (if masked, this is the priority the 173 * interrupt had before it was masked). Masking and unmasking 174 * are done with the ibm,int-off and ibm,int-on RTAS calls. 175 */ 176 if (state & KVM_XICS_MASKED) { 177 irq->priority = 0xff; 178 } else { 179 irq->priority = irq->saved_priority; 180 } 181 182 if (state & KVM_XICS_PENDING) { 183 if (state & KVM_XICS_LEVEL_SENSITIVE) { 184 irq->status |= XICS_STATUS_ASSERTED; 185 } else { 186 /* 187 * A pending edge-triggered interrupt (or MSI) 188 * must have been rejected previously when we 189 * first detected it and tried to deliver it, 190 * so mark it as pending and previously rejected 191 * for consistency with how xics.c works. 192 */ 193 irq->status |= XICS_STATUS_MASKED_PENDING 194 | XICS_STATUS_REJECTED; 195 } 196 } 197 } 198 } 199 200 static int ics_set_kvm_state(ICSState *ics, int version_id) 201 { 202 KVMXICSState *icpkvm = KVM_XICS(ics->icp); 203 uint64_t state; 204 struct kvm_device_attr attr = { 205 .flags = 0, 206 .group = KVM_DEV_XICS_GRP_SOURCES, 207 .addr = (uint64_t)(uintptr_t)&state, 208 }; 209 int i; 210 211 for (i = 0; i < ics->nr_irqs; i++) { 212 ICSIRQState *irq = &ics->irqs[i]; 213 int ret; 214 215 attr.attr = i + ics->offset; 216 217 state = irq->server; 218 state |= (uint64_t)(irq->saved_priority & KVM_XICS_PRIORITY_MASK) 219 << KVM_XICS_PRIORITY_SHIFT; 220 if (irq->priority != irq->saved_priority) { 221 assert(irq->priority == 0xff); 222 state |= KVM_XICS_MASKED; 223 } 224 225 if (ics->irqs[i].flags & XICS_FLAGS_IRQ_LSI) { 226 state |= KVM_XICS_LEVEL_SENSITIVE; 227 if (irq->status & XICS_STATUS_ASSERTED) { 228 state |= KVM_XICS_PENDING; 229 } 230 } else { 231 if (irq->status & XICS_STATUS_MASKED_PENDING) { 232 state |= KVM_XICS_PENDING; 233 } 234 } 235 236 ret = ioctl(icpkvm->kernel_xics_fd, KVM_SET_DEVICE_ATTR, &attr); 237 if (ret != 0) { 238 error_report("Unable to restore KVM interrupt controller state" 239 " for IRQs %d: %s", i + ics->offset, strerror(errno)); 240 return ret; 241 } 242 } 243 244 return 0; 245 } 246 247 static void ics_kvm_set_irq(void *opaque, int srcno, int val) 248 { 249 ICSState *ics = opaque; 250 struct kvm_irq_level args; 251 int rc; 252 253 args.irq = srcno + ics->offset; 254 if (ics->irqs[srcno].flags & XICS_FLAGS_IRQ_MSI) { 255 if (!val) { 256 return; 257 } 258 args.level = KVM_INTERRUPT_SET; 259 } else { 260 args.level = val ? KVM_INTERRUPT_SET_LEVEL : KVM_INTERRUPT_UNSET; 261 } 262 rc = kvm_vm_ioctl(kvm_state, KVM_IRQ_LINE, &args); 263 if (rc < 0) { 264 perror("kvm_irq_line"); 265 } 266 } 267 268 static void ics_kvm_reset(DeviceState *dev) 269 { 270 ICSState *ics = ICS(dev); 271 int i; 272 uint8_t flags[ics->nr_irqs]; 273 274 for (i = 0; i < ics->nr_irqs; i++) { 275 flags[i] = ics->irqs[i].flags; 276 } 277 278 memset(ics->irqs, 0, sizeof(ICSIRQState) * ics->nr_irqs); 279 280 for (i = 0; i < ics->nr_irqs; i++) { 281 ics->irqs[i].priority = 0xff; 282 ics->irqs[i].saved_priority = 0xff; 283 ics->irqs[i].flags = flags[i]; 284 } 285 286 ics_set_kvm_state(ics, 1); 287 } 288 289 static void ics_kvm_realize(DeviceState *dev, Error **errp) 290 { 291 ICSState *ics = ICS(dev); 292 293 if (!ics->nr_irqs) { 294 error_setg(errp, "Number of interrupts needs to be greater 0"); 295 return; 296 } 297 ics->irqs = g_malloc0(ics->nr_irqs * sizeof(ICSIRQState)); 298 ics->qirqs = qemu_allocate_irqs(ics_kvm_set_irq, ics, ics->nr_irqs); 299 } 300 301 static void ics_kvm_class_init(ObjectClass *klass, void *data) 302 { 303 DeviceClass *dc = DEVICE_CLASS(klass); 304 ICSStateClass *icsc = ICS_CLASS(klass); 305 306 dc->realize = ics_kvm_realize; 307 dc->reset = ics_kvm_reset; 308 icsc->pre_save = ics_get_kvm_state; 309 icsc->post_load = ics_set_kvm_state; 310 } 311 312 static const TypeInfo ics_kvm_info = { 313 .name = TYPE_KVM_ICS, 314 .parent = TYPE_ICS, 315 .instance_size = sizeof(ICSState), 316 .class_init = ics_kvm_class_init, 317 }; 318 319 /* 320 * XICS-KVM 321 */ 322 static void xics_kvm_cpu_setup(XICSState *icp, PowerPCCPU *cpu) 323 { 324 CPUState *cs; 325 ICPState *ss; 326 KVMXICSState *icpkvm = KVM_XICS(icp); 327 328 cs = CPU(cpu); 329 ss = &icp->ss[cs->cpu_index]; 330 331 assert(cs->cpu_index < icp->nr_servers); 332 if (icpkvm->kernel_xics_fd == -1) { 333 abort(); 334 } 335 336 /* 337 * If we are reusing a parked vCPU fd corresponding to the CPU 338 * which was hot-removed earlier we don't have to renable 339 * KVM_CAP_IRQ_XICS capability again. 340 */ 341 if (ss->cap_irq_xics_enabled) { 342 return; 343 } 344 345 if (icpkvm->kernel_xics_fd != -1) { 346 int ret; 347 348 ss->cs = cs; 349 350 ret = kvm_vcpu_enable_cap(cs, KVM_CAP_IRQ_XICS, 0, 351 icpkvm->kernel_xics_fd, kvm_arch_vcpu_id(cs)); 352 if (ret < 0) { 353 error_report("Unable to connect CPU%ld to kernel XICS: %s", 354 kvm_arch_vcpu_id(cs), strerror(errno)); 355 exit(1); 356 } 357 ss->cap_irq_xics_enabled = true; 358 } 359 } 360 361 static void xics_kvm_set_nr_irqs(XICSState *icp, uint32_t nr_irqs, Error **errp) 362 { 363 icp->nr_irqs = icp->ics->nr_irqs = nr_irqs; 364 } 365 366 static void xics_kvm_set_nr_servers(XICSState *icp, uint32_t nr_servers, 367 Error **errp) 368 { 369 int i; 370 371 icp->nr_servers = nr_servers; 372 373 icp->ss = g_malloc0(icp->nr_servers*sizeof(ICPState)); 374 for (i = 0; i < icp->nr_servers; i++) { 375 char buffer[32]; 376 object_initialize(&icp->ss[i], sizeof(icp->ss[i]), TYPE_KVM_ICP); 377 snprintf(buffer, sizeof(buffer), "icp[%d]", i); 378 object_property_add_child(OBJECT(icp), buffer, OBJECT(&icp->ss[i]), 379 errp); 380 } 381 } 382 383 static void rtas_dummy(PowerPCCPU *cpu, sPAPRMachineState *spapr, 384 uint32_t token, 385 uint32_t nargs, target_ulong args, 386 uint32_t nret, target_ulong rets) 387 { 388 error_report("pseries: %s must never be called for in-kernel XICS", 389 __func__); 390 } 391 392 static void xics_kvm_realize(DeviceState *dev, Error **errp) 393 { 394 KVMXICSState *icpkvm = KVM_XICS(dev); 395 XICSState *icp = XICS_COMMON(dev); 396 int i, rc; 397 Error *error = NULL; 398 struct kvm_create_device xics_create_device = { 399 .type = KVM_DEV_TYPE_XICS, 400 .flags = 0, 401 }; 402 403 if (!kvm_enabled() || !kvm_check_extension(kvm_state, KVM_CAP_IRQ_XICS)) { 404 error_setg(errp, 405 "KVM and IRQ_XICS capability must be present for in-kernel XICS"); 406 goto fail; 407 } 408 409 spapr_rtas_register(RTAS_IBM_SET_XIVE, "ibm,set-xive", rtas_dummy); 410 spapr_rtas_register(RTAS_IBM_GET_XIVE, "ibm,get-xive", rtas_dummy); 411 spapr_rtas_register(RTAS_IBM_INT_OFF, "ibm,int-off", rtas_dummy); 412 spapr_rtas_register(RTAS_IBM_INT_ON, "ibm,int-on", rtas_dummy); 413 414 rc = kvmppc_define_rtas_kernel_token(RTAS_IBM_SET_XIVE, "ibm,set-xive"); 415 if (rc < 0) { 416 error_setg(errp, "kvmppc_define_rtas_kernel_token: ibm,set-xive"); 417 goto fail; 418 } 419 420 rc = kvmppc_define_rtas_kernel_token(RTAS_IBM_GET_XIVE, "ibm,get-xive"); 421 if (rc < 0) { 422 error_setg(errp, "kvmppc_define_rtas_kernel_token: ibm,get-xive"); 423 goto fail; 424 } 425 426 rc = kvmppc_define_rtas_kernel_token(RTAS_IBM_INT_ON, "ibm,int-on"); 427 if (rc < 0) { 428 error_setg(errp, "kvmppc_define_rtas_kernel_token: ibm,int-on"); 429 goto fail; 430 } 431 432 rc = kvmppc_define_rtas_kernel_token(RTAS_IBM_INT_OFF, "ibm,int-off"); 433 if (rc < 0) { 434 error_setg(errp, "kvmppc_define_rtas_kernel_token: ibm,int-off"); 435 goto fail; 436 } 437 438 /* Create the kernel ICP */ 439 rc = kvm_vm_ioctl(kvm_state, KVM_CREATE_DEVICE, &xics_create_device); 440 if (rc < 0) { 441 error_setg_errno(errp, -rc, "Error on KVM_CREATE_DEVICE for XICS"); 442 goto fail; 443 } 444 445 icpkvm->kernel_xics_fd = xics_create_device.fd; 446 447 object_property_set_bool(OBJECT(icp->ics), true, "realized", &error); 448 if (error) { 449 error_propagate(errp, error); 450 goto fail; 451 } 452 453 assert(icp->nr_servers); 454 for (i = 0; i < icp->nr_servers; i++) { 455 object_property_set_bool(OBJECT(&icp->ss[i]), true, "realized", &error); 456 if (error) { 457 error_propagate(errp, error); 458 goto fail; 459 } 460 } 461 462 kvm_kernel_irqchip = true; 463 kvm_msi_via_irqfd_allowed = true; 464 kvm_gsi_direct_mapping = true; 465 466 return; 467 468 fail: 469 kvmppc_define_rtas_kernel_token(0, "ibm,set-xive"); 470 kvmppc_define_rtas_kernel_token(0, "ibm,get-xive"); 471 kvmppc_define_rtas_kernel_token(0, "ibm,int-on"); 472 kvmppc_define_rtas_kernel_token(0, "ibm,int-off"); 473 } 474 475 static void xics_kvm_initfn(Object *obj) 476 { 477 XICSState *xics = XICS_COMMON(obj); 478 479 xics->ics = ICS(object_new(TYPE_KVM_ICS)); 480 object_property_add_child(obj, "ics", OBJECT(xics->ics), NULL); 481 xics->ics->icp = xics; 482 } 483 484 static void xics_kvm_class_init(ObjectClass *oc, void *data) 485 { 486 DeviceClass *dc = DEVICE_CLASS(oc); 487 XICSStateClass *xsc = XICS_COMMON_CLASS(oc); 488 489 dc->realize = xics_kvm_realize; 490 xsc->cpu_setup = xics_kvm_cpu_setup; 491 xsc->set_nr_irqs = xics_kvm_set_nr_irqs; 492 xsc->set_nr_servers = xics_kvm_set_nr_servers; 493 } 494 495 static const TypeInfo xics_kvm_info = { 496 .name = TYPE_KVM_XICS, 497 .parent = TYPE_XICS_COMMON, 498 .instance_size = sizeof(KVMXICSState), 499 .class_init = xics_kvm_class_init, 500 .instance_init = xics_kvm_initfn, 501 }; 502 503 static void xics_kvm_register_types(void) 504 { 505 type_register_static(&xics_kvm_info); 506 type_register_static(&ics_kvm_info); 507 type_register_static(&icp_kvm_info); 508 } 509 510 type_init(xics_kvm_register_types) 511