Skip to content

Commit 29c647f

Browse files
author
Marc Zyngier
committed
irqchip/gic-v4.1: Plumb skeletal VPE irqchip
Just like for GICv4.0, each VPE has its own doorbell interrupt, and thus an irqchip that manages them. Since the doorbell management is quite different on GICv4.1, let's introduce an almost empty irqchip the will get populated over the next new patches. Signed-off-by: Marc Zyngier <[email protected]> Reviewed-by: Zenghui Yu <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent dd3f050 commit 29c647f

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

drivers/irqchip/irq-gic-v3-its.c

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3553,6 +3553,32 @@ static struct irq_chip its_vpe_irq_chip = {
35533553
.irq_set_vcpu_affinity = its_vpe_set_vcpu_affinity,
35543554
};
35553555

3556+
static int its_vpe_4_1_set_vcpu_affinity(struct irq_data *d, void *vcpu_info)
3557+
{
3558+
struct its_cmd_info *info = vcpu_info;
3559+
3560+
switch (info->cmd_type) {
3561+
case SCHEDULE_VPE:
3562+
return 0;
3563+
3564+
case DESCHEDULE_VPE:
3565+
return 0;
3566+
3567+
case INVALL_VPE:
3568+
return 0;
3569+
3570+
default:
3571+
return -EINVAL;
3572+
}
3573+
}
3574+
3575+
static struct irq_chip its_vpe_4_1_irq_chip = {
3576+
.name = "GICv4.1-vpe",
3577+
.irq_eoi = irq_chip_eoi_parent,
3578+
.irq_set_affinity = its_vpe_set_affinity,
3579+
.irq_set_vcpu_affinity = its_vpe_4_1_set_vcpu_affinity,
3580+
};
3581+
35563582
static int its_vpe_id_alloc(void)
35573583
{
35583584
return ida_simple_get(&its_vpeid_ida, 0, ITS_MAX_VPEID, GFP_KERNEL);
@@ -3633,6 +3659,7 @@ static void its_vpe_irq_domain_free(struct irq_domain *domain,
36333659
static int its_vpe_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,
36343660
unsigned int nr_irqs, void *args)
36353661
{
3662+
struct irq_chip *irqchip = &its_vpe_irq_chip;
36363663
struct its_vm *vm = args;
36373664
unsigned long *bitmap;
36383665
struct page *vprop_page;
@@ -3660,6 +3687,9 @@ static int its_vpe_irq_domain_alloc(struct irq_domain *domain, unsigned int virq
36603687
vm->nr_db_lpis = nr_ids;
36613688
vm->vprop_page = vprop_page;
36623689

3690+
if (gic_rdists->has_rvpeid)
3691+
irqchip = &its_vpe_4_1_irq_chip;
3692+
36633693
for (i = 0; i < nr_irqs; i++) {
36643694
vm->vpes[i]->vpe_db_lpi = base + i;
36653695
err = its_vpe_init(vm->vpes[i]);
@@ -3670,7 +3700,7 @@ static int its_vpe_irq_domain_alloc(struct irq_domain *domain, unsigned int virq
36703700
if (err)
36713701
break;
36723702
irq_domain_set_hwirq_and_chip(domain, virq + i, i,
3673-
&its_vpe_irq_chip, vm->vpes[i]);
3703+
irqchip, vm->vpes[i]);
36743704
set_bit(i, bitmap);
36753705
}
36763706

0 commit comments

Comments
 (0)