diff options
| -rw-r--r-- | drivers/misc/cxl/guest.c | 12 | ||||
| -rw-r--r-- | drivers/misc/cxl/native.c | 9 |
2 files changed, 21 insertions, 0 deletions
diff --git a/drivers/misc/cxl/guest.c b/drivers/misc/cxl/guest.c index a83acf9f8cd9..769971c065b4 100644 --- a/drivers/misc/cxl/guest.c +++ b/drivers/misc/cxl/guest.c | |||
| @@ -552,6 +552,17 @@ static int attach_afu_directed(struct cxl_context *ctx, u64 wed, u64 amr) | |||
| 552 | 552 | ||
| 553 | elem->common.sstp0 = cpu_to_be64(ctx->sstp0); | 553 | elem->common.sstp0 = cpu_to_be64(ctx->sstp0); |
| 554 | elem->common.sstp1 = cpu_to_be64(ctx->sstp1); | 554 | elem->common.sstp1 = cpu_to_be64(ctx->sstp1); |
| 555 | |||
| 556 | /* | ||
| 557 | * Ensure we have at least one interrupt allocated to take faults for | ||
| 558 | * kernel contexts that may not have allocated any AFU IRQs at all: | ||
| 559 | */ | ||
| 560 | if (ctx->irqs.range[0] == 0) { | ||
| 561 | rc = afu_register_irqs(ctx, 0); | ||
| 562 | if (rc) | ||
| 563 | goto out_free; | ||
| 564 | } | ||
| 565 | |||
| 555 | for (r = 0; r < CXL_IRQ_RANGES; r++) { | 566 | for (r = 0; r < CXL_IRQ_RANGES; r++) { |
| 556 | for (i = 0; i < ctx->irqs.range[r]; i++) { | 567 | for (i = 0; i < ctx->irqs.range[r]; i++) { |
| 557 | if (r == 0 && i == 0) { | 568 | if (r == 0 && i == 0) { |
| @@ -597,6 +608,7 @@ static int attach_afu_directed(struct cxl_context *ctx, u64 wed, u64 amr) | |||
| 597 | enable_afu_irqs(ctx); | 608 | enable_afu_irqs(ctx); |
| 598 | } | 609 | } |
| 599 | 610 | ||
| 611 | out_free: | ||
| 600 | free_page((u64)elem); | 612 | free_page((u64)elem); |
| 601 | return rc; | 613 | return rc; |
| 602 | } | 614 | } |
diff --git a/drivers/misc/cxl/native.c b/drivers/misc/cxl/native.c index b8b547a162eb..5d4fb9fd84bc 100644 --- a/drivers/misc/cxl/native.c +++ b/drivers/misc/cxl/native.c | |||
| @@ -534,6 +534,15 @@ static int attach_afu_directed(struct cxl_context *ctx, u64 wed, u64 amr) | |||
| 534 | ctx->elem->common.sstp0 = cpu_to_be64(ctx->sstp0); | 534 | ctx->elem->common.sstp0 = cpu_to_be64(ctx->sstp0); |
| 535 | ctx->elem->common.sstp1 = cpu_to_be64(ctx->sstp1); | 535 | ctx->elem->common.sstp1 = cpu_to_be64(ctx->sstp1); |
| 536 | 536 | ||
| 537 | /* | ||
| 538 | * Ensure we have the multiplexed PSL interrupt set up to take faults | ||
| 539 | * for kernel contexts that may not have allocated any AFU IRQs at all: | ||
| 540 | */ | ||
| 541 | if (ctx->irqs.range[0] == 0) { | ||
| 542 | ctx->irqs.offset[0] = ctx->afu->native->psl_hwirq; | ||
| 543 | ctx->irqs.range[0] = 1; | ||
| 544 | } | ||
| 545 | |||
| 537 | for (r = 0; r < CXL_IRQ_RANGES; r++) { | 546 | for (r = 0; r < CXL_IRQ_RANGES; r++) { |
| 538 | ctx->elem->ivte_offsets[r] = cpu_to_be16(ctx->irqs.offset[r]); | 547 | ctx->elem->ivte_offsets[r] = cpu_to_be16(ctx->irqs.offset[r]); |
| 539 | ctx->elem->ivte_ranges[r] = cpu_to_be16(ctx->irqs.range[r]); | 548 | ctx->elem->ivte_ranges[r] = cpu_to_be16(ctx->irqs.range[r]); |
