1 /* 2 * QEMU PowerPC sPAPR IRQ interface 3 * 4 * Copyright (c) 2018, IBM Corporation. 5 * 6 * This code is licensed under the GPL version 2 or later. See the 7 * COPYING file in the top-level directory. 8 */ 9 10 #include "qemu/osdep.h" 11 #include "qemu/log.h" 12 #include "qemu/error-report.h" 13 #include "qapi/error.h" 14 #include "hw/irq.h" 15 #include "hw/ppc/spapr.h" 16 #include "hw/ppc/spapr_cpu_core.h" 17 #include "hw/ppc/spapr_xive.h" 18 #include "hw/ppc/xics.h" 19 #include "hw/ppc/xics_spapr.h" 20 #include "hw/qdev-properties.h" 21 #include "cpu-models.h" 22 #include "sysemu/kvm.h" 23 24 #include "trace.h" 25 26 void spapr_irq_msi_init(SpaprMachineState *spapr, uint32_t nr_msis) 27 { 28 spapr->irq_map_nr = nr_msis; 29 spapr->irq_map = bitmap_new(spapr->irq_map_nr); 30 } 31 32 int spapr_irq_msi_alloc(SpaprMachineState *spapr, uint32_t num, bool align, 33 Error **errp) 34 { 35 int irq; 36 37 /* 38 * The 'align_mask' parameter of bitmap_find_next_zero_area() 39 * should be one less than a power of 2; 0 means no 40 * alignment. Adapt the 'align' value of the former allocator 41 * to fit the requirements of bitmap_find_next_zero_area() 42 */ 43 align -= 1; 44 45 irq = bitmap_find_next_zero_area(spapr->irq_map, spapr->irq_map_nr, 0, num, 46 align); 47 if (irq == spapr->irq_map_nr) { 48 error_setg(errp, "can't find a free %d-IRQ block", num); 49 return -1; 50 } 51 52 bitmap_set(spapr->irq_map, irq, num); 53 54 return irq + SPAPR_IRQ_MSI; 55 } 56 57 void spapr_irq_msi_free(SpaprMachineState *spapr, int irq, uint32_t num) 58 { 59 bitmap_clear(spapr->irq_map, irq - SPAPR_IRQ_MSI, num); 60 } 61 62 static void spapr_irq_init_kvm(SpaprMachineState *spapr, 63 SpaprIrq *irq, Error **errp) 64 { 65 MachineState *machine = MACHINE(spapr); 66 Error *local_err = NULL; 67 68 if (kvm_enabled() && machine_kernel_irqchip_allowed(machine)) { 69 irq->init_kvm(spapr, &local_err); 70 if (local_err && machine_kernel_irqchip_required(machine)) { 71 error_prepend(&local_err, 72 "kernel_irqchip requested but unavailable: "); 73 error_propagate(errp, local_err); 74 return; 75 } 76 77 if (!local_err) { 78 return; 79 } 80 81 /* 82 * We failed to initialize the KVM device, fallback to 83 * emulated mode 84 */ 85 error_prepend(&local_err, "kernel_irqchip allowed but unavailable: "); 86 error_append_hint(&local_err, "Falling back to kernel-irqchip=off\n"); 87 warn_report_err(local_err); 88 } 89 } 90 91 /* 92 * XICS IRQ backend. 93 */ 94 95 static void spapr_irq_init_xics(SpaprMachineState *spapr, Error **errp) 96 { 97 Object *obj; 98 Error *local_err = NULL; 99 100 obj = object_new(TYPE_ICS_SPAPR); 101 object_property_add_child(OBJECT(spapr), "ics", obj, &error_abort); 102 object_property_add_const_link(obj, ICS_PROP_XICS, OBJECT(spapr), 103 &error_fatal); 104 object_property_set_int(obj, spapr->irq->nr_xirqs, 105 "nr-irqs", &error_fatal); 106 object_property_set_bool(obj, true, "realized", &local_err); 107 if (local_err) { 108 error_propagate(errp, local_err); 109 return; 110 } 111 112 spapr->ics = ICS_SPAPR(obj); 113 } 114 115 static int spapr_irq_claim_xics(SpaprMachineState *spapr, int irq, bool lsi, 116 Error **errp) 117 { 118 ICSState *ics = spapr->ics; 119 120 assert(ics); 121 assert(ics_valid_irq(ics, irq)); 122 123 if (!ics_irq_free(ics, irq - ics->offset)) { 124 error_setg(errp, "IRQ %d is not free", irq); 125 return -1; 126 } 127 128 ics_set_irq_type(ics, irq - ics->offset, lsi); 129 return 0; 130 } 131 132 static void spapr_irq_free_xics(SpaprMachineState *spapr, int irq) 133 { 134 ICSState *ics = spapr->ics; 135 uint32_t srcno = irq - ics->offset; 136 137 assert(ics_valid_irq(ics, irq)); 138 139 memset(&ics->irqs[srcno], 0, sizeof(ICSIRQState)); 140 } 141 142 static void spapr_irq_print_info_xics(SpaprMachineState *spapr, Monitor *mon) 143 { 144 CPUState *cs; 145 146 CPU_FOREACH(cs) { 147 PowerPCCPU *cpu = POWERPC_CPU(cs); 148 149 icp_pic_print_info(spapr_cpu_state(cpu)->icp, mon); 150 } 151 152 ics_pic_print_info(spapr->ics, mon); 153 } 154 155 static void spapr_irq_cpu_intc_create_xics(SpaprMachineState *spapr, 156 PowerPCCPU *cpu, Error **errp) 157 { 158 Error *local_err = NULL; 159 Object *obj; 160 SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu); 161 162 obj = icp_create(OBJECT(cpu), TYPE_ICP, XICS_FABRIC(spapr), 163 &local_err); 164 if (local_err) { 165 error_propagate(errp, local_err); 166 return; 167 } 168 169 spapr_cpu->icp = ICP(obj); 170 } 171 172 static int spapr_irq_post_load_xics(SpaprMachineState *spapr, int version_id) 173 { 174 if (!kvm_irqchip_in_kernel()) { 175 CPUState *cs; 176 CPU_FOREACH(cs) { 177 PowerPCCPU *cpu = POWERPC_CPU(cs); 178 icp_resend(spapr_cpu_state(cpu)->icp); 179 } 180 } 181 return 0; 182 } 183 184 static void spapr_irq_set_irq_xics(void *opaque, int irq, int val) 185 { 186 SpaprMachineState *spapr = opaque; 187 uint32_t srcno = irq - spapr->ics->offset; 188 189 ics_set_irq(spapr->ics, srcno, val); 190 } 191 192 static void spapr_irq_reset_xics(SpaprMachineState *spapr, Error **errp) 193 { 194 Error *local_err = NULL; 195 196 spapr_irq_init_kvm(spapr, &spapr_irq_xics, &local_err); 197 if (local_err) { 198 error_propagate(errp, local_err); 199 return; 200 } 201 } 202 203 static void spapr_irq_init_kvm_xics(SpaprMachineState *spapr, Error **errp) 204 { 205 if (kvm_enabled()) { 206 xics_kvm_connect(spapr, errp); 207 } 208 } 209 210 SpaprIrq spapr_irq_xics = { 211 .nr_xirqs = SPAPR_NR_XIRQS, 212 .nr_msis = SPAPR_NR_MSIS, 213 .ov5 = SPAPR_OV5_XIVE_LEGACY, 214 215 .init = spapr_irq_init_xics, 216 .claim = spapr_irq_claim_xics, 217 .free = spapr_irq_free_xics, 218 .print_info = spapr_irq_print_info_xics, 219 .dt_populate = spapr_dt_xics, 220 .cpu_intc_create = spapr_irq_cpu_intc_create_xics, 221 .post_load = spapr_irq_post_load_xics, 222 .reset = spapr_irq_reset_xics, 223 .set_irq = spapr_irq_set_irq_xics, 224 .init_kvm = spapr_irq_init_kvm_xics, 225 }; 226 227 /* 228 * XIVE IRQ backend. 229 */ 230 static void spapr_irq_init_xive(SpaprMachineState *spapr, Error **errp) 231 { 232 uint32_t nr_servers = spapr_max_server_number(spapr); 233 DeviceState *dev; 234 int i; 235 236 dev = qdev_create(NULL, TYPE_SPAPR_XIVE); 237 qdev_prop_set_uint32(dev, "nr-irqs", 238 spapr->irq->nr_xirqs + SPAPR_XIRQ_BASE); 239 /* 240 * 8 XIVE END structures per CPU. One for each available priority 241 */ 242 qdev_prop_set_uint32(dev, "nr-ends", nr_servers << 3); 243 qdev_init_nofail(dev); 244 245 spapr->xive = SPAPR_XIVE(dev); 246 247 /* Enable the CPU IPIs */ 248 for (i = 0; i < nr_servers; ++i) { 249 spapr_xive_irq_claim(spapr->xive, SPAPR_IRQ_IPI + i, false); 250 } 251 252 spapr_xive_hcall_init(spapr); 253 } 254 255 static int spapr_irq_claim_xive(SpaprMachineState *spapr, int irq, bool lsi, 256 Error **errp) 257 { 258 if (!spapr_xive_irq_claim(spapr->xive, irq, lsi)) { 259 error_setg(errp, "IRQ %d is invalid", irq); 260 return -1; 261 } 262 return 0; 263 } 264 265 static void spapr_irq_free_xive(SpaprMachineState *spapr, int irq) 266 { 267 spapr_xive_irq_free(spapr->xive, irq); 268 } 269 270 static void spapr_irq_print_info_xive(SpaprMachineState *spapr, 271 Monitor *mon) 272 { 273 CPUState *cs; 274 275 CPU_FOREACH(cs) { 276 PowerPCCPU *cpu = POWERPC_CPU(cs); 277 278 xive_tctx_pic_print_info(spapr_cpu_state(cpu)->tctx, mon); 279 } 280 281 spapr_xive_pic_print_info(spapr->xive, mon); 282 } 283 284 static void spapr_irq_cpu_intc_create_xive(SpaprMachineState *spapr, 285 PowerPCCPU *cpu, Error **errp) 286 { 287 Error *local_err = NULL; 288 Object *obj; 289 SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu); 290 291 obj = xive_tctx_create(OBJECT(cpu), XIVE_ROUTER(spapr->xive), &local_err); 292 if (local_err) { 293 error_propagate(errp, local_err); 294 return; 295 } 296 297 spapr_cpu->tctx = XIVE_TCTX(obj); 298 299 /* 300 * (TCG) Early setting the OS CAM line for hotplugged CPUs as they 301 * don't beneficiate from the reset of the XIVE IRQ backend 302 */ 303 spapr_xive_set_tctx_os_cam(spapr_cpu->tctx); 304 } 305 306 static int spapr_irq_post_load_xive(SpaprMachineState *spapr, int version_id) 307 { 308 return spapr_xive_post_load(spapr->xive, version_id); 309 } 310 311 static void spapr_irq_reset_xive(SpaprMachineState *spapr, Error **errp) 312 { 313 CPUState *cs; 314 Error *local_err = NULL; 315 316 CPU_FOREACH(cs) { 317 PowerPCCPU *cpu = POWERPC_CPU(cs); 318 319 /* (TCG) Set the OS CAM line of the thread interrupt context. */ 320 spapr_xive_set_tctx_os_cam(spapr_cpu_state(cpu)->tctx); 321 } 322 323 spapr_irq_init_kvm(spapr, &spapr_irq_xive, &local_err); 324 if (local_err) { 325 error_propagate(errp, local_err); 326 return; 327 } 328 329 /* Activate the XIVE MMIOs */ 330 spapr_xive_mmio_set_enabled(spapr->xive, true); 331 } 332 333 static void spapr_irq_set_irq_xive(void *opaque, int irq, int val) 334 { 335 SpaprMachineState *spapr = opaque; 336 337 if (kvm_irqchip_in_kernel()) { 338 kvmppc_xive_source_set_irq(&spapr->xive->source, irq, val); 339 } else { 340 xive_source_set_irq(&spapr->xive->source, irq, val); 341 } 342 } 343 344 static void spapr_irq_init_kvm_xive(SpaprMachineState *spapr, Error **errp) 345 { 346 if (kvm_enabled()) { 347 kvmppc_xive_connect(spapr->xive, errp); 348 } 349 } 350 351 SpaprIrq spapr_irq_xive = { 352 .nr_xirqs = SPAPR_NR_XIRQS, 353 .nr_msis = SPAPR_NR_MSIS, 354 .ov5 = SPAPR_OV5_XIVE_EXPLOIT, 355 356 .init = spapr_irq_init_xive, 357 .claim = spapr_irq_claim_xive, 358 .free = spapr_irq_free_xive, 359 .print_info = spapr_irq_print_info_xive, 360 .dt_populate = spapr_dt_xive, 361 .cpu_intc_create = spapr_irq_cpu_intc_create_xive, 362 .post_load = spapr_irq_post_load_xive, 363 .reset = spapr_irq_reset_xive, 364 .set_irq = spapr_irq_set_irq_xive, 365 .init_kvm = spapr_irq_init_kvm_xive, 366 }; 367 368 /* 369 * Dual XIVE and XICS IRQ backend. 370 * 371 * Both interrupt mode, XIVE and XICS, objects are created but the 372 * machine starts in legacy interrupt mode (XICS). It can be changed 373 * by the CAS negotiation process and, in that case, the new mode is 374 * activated after an extra machine reset. 375 */ 376 377 /* 378 * Returns the sPAPR IRQ backend negotiated by CAS. XICS is the 379 * default. 380 */ 381 static SpaprIrq *spapr_irq_current(SpaprMachineState *spapr) 382 { 383 return spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT) ? 384 &spapr_irq_xive : &spapr_irq_xics; 385 } 386 387 static void spapr_irq_init_dual(SpaprMachineState *spapr, Error **errp) 388 { 389 Error *local_err = NULL; 390 391 spapr_irq_xics.init(spapr, &local_err); 392 if (local_err) { 393 error_propagate(errp, local_err); 394 return; 395 } 396 397 spapr_irq_xive.init(spapr, &local_err); 398 if (local_err) { 399 error_propagate(errp, local_err); 400 return; 401 } 402 } 403 404 static int spapr_irq_claim_dual(SpaprMachineState *spapr, int irq, bool lsi, 405 Error **errp) 406 { 407 Error *local_err = NULL; 408 int ret; 409 410 ret = spapr_irq_xics.claim(spapr, irq, lsi, &local_err); 411 if (local_err) { 412 error_propagate(errp, local_err); 413 return ret; 414 } 415 416 ret = spapr_irq_xive.claim(spapr, irq, lsi, &local_err); 417 if (local_err) { 418 error_propagate(errp, local_err); 419 return ret; 420 } 421 422 return ret; 423 } 424 425 static void spapr_irq_free_dual(SpaprMachineState *spapr, int irq) 426 { 427 spapr_irq_xics.free(spapr, irq); 428 spapr_irq_xive.free(spapr, irq); 429 } 430 431 static void spapr_irq_print_info_dual(SpaprMachineState *spapr, Monitor *mon) 432 { 433 spapr_irq_current(spapr)->print_info(spapr, mon); 434 } 435 436 static void spapr_irq_dt_populate_dual(SpaprMachineState *spapr, 437 uint32_t nr_servers, void *fdt, 438 uint32_t phandle) 439 { 440 spapr_irq_current(spapr)->dt_populate(spapr, nr_servers, fdt, phandle); 441 } 442 443 static void spapr_irq_cpu_intc_create_dual(SpaprMachineState *spapr, 444 PowerPCCPU *cpu, Error **errp) 445 { 446 Error *local_err = NULL; 447 448 spapr_irq_xive.cpu_intc_create(spapr, cpu, &local_err); 449 if (local_err) { 450 error_propagate(errp, local_err); 451 return; 452 } 453 454 spapr_irq_xics.cpu_intc_create(spapr, cpu, errp); 455 } 456 457 static int spapr_irq_post_load_dual(SpaprMachineState *spapr, int version_id) 458 { 459 /* 460 * Force a reset of the XIVE backend after migration. The machine 461 * defaults to XICS at startup. 462 */ 463 if (spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) { 464 if (kvm_irqchip_in_kernel()) { 465 xics_kvm_disconnect(spapr, &error_fatal); 466 } 467 spapr_irq_xive.reset(spapr, &error_fatal); 468 } 469 470 return spapr_irq_current(spapr)->post_load(spapr, version_id); 471 } 472 473 static void spapr_irq_reset_dual(SpaprMachineState *spapr, Error **errp) 474 { 475 Error *local_err = NULL; 476 477 /* 478 * Deactivate the XIVE MMIOs. The XIVE backend will reenable them 479 * if selected. 480 */ 481 spapr_xive_mmio_set_enabled(spapr->xive, false); 482 483 /* Destroy all KVM devices */ 484 if (kvm_irqchip_in_kernel()) { 485 xics_kvm_disconnect(spapr, &local_err); 486 if (local_err) { 487 error_propagate(errp, local_err); 488 error_prepend(errp, "KVM XICS disconnect failed: "); 489 return; 490 } 491 kvmppc_xive_disconnect(spapr->xive, &local_err); 492 if (local_err) { 493 error_propagate(errp, local_err); 494 error_prepend(errp, "KVM XIVE disconnect failed: "); 495 return; 496 } 497 } 498 499 spapr_irq_current(spapr)->reset(spapr, errp); 500 } 501 502 static void spapr_irq_set_irq_dual(void *opaque, int irq, int val) 503 { 504 SpaprMachineState *spapr = opaque; 505 506 spapr_irq_current(spapr)->set_irq(spapr, irq, val); 507 } 508 509 /* 510 * Define values in sync with the XIVE and XICS backend 511 */ 512 SpaprIrq spapr_irq_dual = { 513 .nr_xirqs = SPAPR_NR_XIRQS, 514 .nr_msis = SPAPR_NR_MSIS, 515 .ov5 = SPAPR_OV5_XIVE_BOTH, 516 517 .init = spapr_irq_init_dual, 518 .claim = spapr_irq_claim_dual, 519 .free = spapr_irq_free_dual, 520 .print_info = spapr_irq_print_info_dual, 521 .dt_populate = spapr_irq_dt_populate_dual, 522 .cpu_intc_create = spapr_irq_cpu_intc_create_dual, 523 .post_load = spapr_irq_post_load_dual, 524 .reset = spapr_irq_reset_dual, 525 .set_irq = spapr_irq_set_irq_dual, 526 .init_kvm = NULL, /* should not be used */ 527 }; 528 529 530 static void spapr_irq_check(SpaprMachineState *spapr, Error **errp) 531 { 532 MachineState *machine = MACHINE(spapr); 533 534 /* 535 * Sanity checks on non-P9 machines. On these, XIVE is not 536 * advertised, see spapr_dt_ov5_platform_support() 537 */ 538 if (!ppc_type_check_compat(machine->cpu_type, CPU_POWERPC_LOGICAL_3_00, 539 0, spapr->max_compat_pvr)) { 540 /* 541 * If the 'dual' interrupt mode is selected, force XICS as CAS 542 * negotiation is useless. 543 */ 544 if (spapr->irq == &spapr_irq_dual) { 545 spapr->irq = &spapr_irq_xics; 546 return; 547 } 548 549 /* 550 * Non-P9 machines using only XIVE is a bogus setup. We have two 551 * scenarios to take into account because of the compat mode: 552 * 553 * 1. POWER7/8 machines should fail to init later on when creating 554 * the XIVE interrupt presenters because a POWER9 exception 555 * model is required. 556 557 * 2. POWER9 machines using the POWER8 compat mode won't fail and 558 * will let the OS boot with a partial XIVE setup : DT 559 * properties but no hcalls. 560 * 561 * To cover both and not confuse the OS, add an early failure in 562 * QEMU. 563 */ 564 if (spapr->irq == &spapr_irq_xive) { 565 error_setg(errp, "XIVE-only machines require a POWER9 CPU"); 566 return; 567 } 568 } 569 570 /* 571 * On a POWER9 host, some older KVM XICS devices cannot be destroyed and 572 * re-created. Detect that early to avoid QEMU to exit later when the 573 * guest reboots. 574 */ 575 if (kvm_enabled() && 576 spapr->irq == &spapr_irq_dual && 577 machine_kernel_irqchip_required(machine) && 578 xics_kvm_has_broken_disconnect(spapr)) { 579 error_setg(errp, "KVM is too old to support ic-mode=dual,kernel-irqchip=on"); 580 return; 581 } 582 } 583 584 /* 585 * sPAPR IRQ frontend routines for devices 586 */ 587 void spapr_irq_init(SpaprMachineState *spapr, Error **errp) 588 { 589 MachineState *machine = MACHINE(spapr); 590 Error *local_err = NULL; 591 592 if (machine_kernel_irqchip_split(machine)) { 593 error_setg(errp, "kernel_irqchip split mode not supported on pseries"); 594 return; 595 } 596 597 if (!kvm_enabled() && machine_kernel_irqchip_required(machine)) { 598 error_setg(errp, 599 "kernel_irqchip requested but only available with KVM"); 600 return; 601 } 602 603 spapr_irq_check(spapr, &local_err); 604 if (local_err) { 605 error_propagate(errp, local_err); 606 return; 607 } 608 609 /* Initialize the MSI IRQ allocator. */ 610 if (!SPAPR_MACHINE_GET_CLASS(spapr)->legacy_irq_allocation) { 611 spapr_irq_msi_init(spapr, spapr->irq->nr_msis); 612 } 613 614 spapr->irq->init(spapr, errp); 615 616 spapr->qirqs = qemu_allocate_irqs(spapr->irq->set_irq, spapr, 617 spapr->irq->nr_xirqs + SPAPR_XIRQ_BASE); 618 } 619 620 int spapr_irq_claim(SpaprMachineState *spapr, int irq, bool lsi, Error **errp) 621 { 622 assert(irq >= SPAPR_XIRQ_BASE); 623 assert(irq < (spapr->irq->nr_xirqs + SPAPR_XIRQ_BASE)); 624 625 return spapr->irq->claim(spapr, irq, lsi, errp); 626 } 627 628 void spapr_irq_free(SpaprMachineState *spapr, int irq, int num) 629 { 630 int i; 631 632 assert(irq >= SPAPR_XIRQ_BASE); 633 assert((irq + num) <= (spapr->irq->nr_xirqs + SPAPR_XIRQ_BASE)); 634 635 for (i = irq; i < (irq + num); i++) { 636 spapr->irq->free(spapr, i); 637 } 638 } 639 640 qemu_irq spapr_qirq(SpaprMachineState *spapr, int irq) 641 { 642 /* 643 * This interface is basically for VIO and PHB devices to find the 644 * right qemu_irq to manipulate, so we only allow access to the 645 * external irqs for now. Currently anything which needs to 646 * access the IPIs most naturally gets there via the guest side 647 * interfaces, we can change this if we need to in future. 648 */ 649 assert(irq >= SPAPR_XIRQ_BASE); 650 assert(irq < (spapr->irq->nr_xirqs + SPAPR_XIRQ_BASE)); 651 652 if (spapr->ics) { 653 assert(ics_valid_irq(spapr->ics, irq)); 654 } 655 if (spapr->xive) { 656 assert(irq < spapr->xive->nr_irqs); 657 assert(xive_eas_is_valid(&spapr->xive->eat[irq])); 658 } 659 660 return spapr->qirqs[irq]; 661 } 662 663 int spapr_irq_post_load(SpaprMachineState *spapr, int version_id) 664 { 665 return spapr->irq->post_load(spapr, version_id); 666 } 667 668 void spapr_irq_reset(SpaprMachineState *spapr, Error **errp) 669 { 670 assert(!spapr->irq_map || bitmap_empty(spapr->irq_map, spapr->irq_map_nr)); 671 672 if (spapr->irq->reset) { 673 spapr->irq->reset(spapr, errp); 674 } 675 } 676 677 int spapr_irq_get_phandle(SpaprMachineState *spapr, void *fdt, Error **errp) 678 { 679 const char *nodename = "interrupt-controller"; 680 int offset, phandle; 681 682 offset = fdt_subnode_offset(fdt, 0, nodename); 683 if (offset < 0) { 684 error_setg(errp, "Can't find node \"%s\": %s", 685 nodename, fdt_strerror(offset)); 686 return -1; 687 } 688 689 phandle = fdt_get_phandle(fdt, offset); 690 if (!phandle) { 691 error_setg(errp, "Can't get phandle of node \"%s\"", nodename); 692 return -1; 693 } 694 695 return phandle; 696 } 697 698 /* 699 * XICS legacy routines - to deprecate one day 700 */ 701 702 static int ics_find_free_block(ICSState *ics, int num, int alignnum) 703 { 704 int first, i; 705 706 for (first = 0; first < ics->nr_irqs; first += alignnum) { 707 if (num > (ics->nr_irqs - first)) { 708 return -1; 709 } 710 for (i = first; i < first + num; ++i) { 711 if (!ics_irq_free(ics, i)) { 712 break; 713 } 714 } 715 if (i == (first + num)) { 716 return first; 717 } 718 } 719 720 return -1; 721 } 722 723 int spapr_irq_find(SpaprMachineState *spapr, int num, bool align, Error **errp) 724 { 725 ICSState *ics = spapr->ics; 726 int first = -1; 727 728 assert(ics); 729 730 /* 731 * MSIMesage::data is used for storing VIRQ so 732 * it has to be aligned to num to support multiple 733 * MSI vectors. MSI-X is not affected by this. 734 * The hint is used for the first IRQ, the rest should 735 * be allocated continuously. 736 */ 737 if (align) { 738 assert((num == 1) || (num == 2) || (num == 4) || 739 (num == 8) || (num == 16) || (num == 32)); 740 first = ics_find_free_block(ics, num, num); 741 } else { 742 first = ics_find_free_block(ics, num, 1); 743 } 744 745 if (first < 0) { 746 error_setg(errp, "can't find a free %d-IRQ block", num); 747 return -1; 748 } 749 750 return first + ics->offset; 751 } 752 753 #define SPAPR_IRQ_XICS_LEGACY_NR_XIRQS 0x400 754 755 SpaprIrq spapr_irq_xics_legacy = { 756 .nr_xirqs = SPAPR_IRQ_XICS_LEGACY_NR_XIRQS, 757 .nr_msis = SPAPR_IRQ_XICS_LEGACY_NR_XIRQS, 758 .ov5 = SPAPR_OV5_XIVE_LEGACY, 759 760 .init = spapr_irq_init_xics, 761 .claim = spapr_irq_claim_xics, 762 .free = spapr_irq_free_xics, 763 .print_info = spapr_irq_print_info_xics, 764 .dt_populate = spapr_dt_xics, 765 .cpu_intc_create = spapr_irq_cpu_intc_create_xics, 766 .post_load = spapr_irq_post_load_xics, 767 .reset = spapr_irq_reset_xics, 768 .set_irq = spapr_irq_set_irq_xics, 769 .init_kvm = spapr_irq_init_kvm_xics, 770 }; 771