Re: [PATCH v2 16/36] irqchip/gic-v4.1: Add mask/unmask doorbell callbacks

Marc Zyngier
2019-12-18T15:06:37Z

On 2019-11-01 11:23, Zenghui Yu wrote:
> Hi Marc,
>
> On 2019/10/27 22:42, Marc Zyngier wrote:
>> masking/unmasking doorbells on GICv4.1 relies on a new INVDB
>> command,
>> which broadcasts the invalidation to all RDs.
>> Implement the new command as well as the masking callbacks, and plug
>> the whole thing into the v4.1 VPE irqchip.
>> Signed-off-by: Marc Zyngier <maz@kernel.org>
>
> Reviewed-by: Zenghui Yu <yuzenghui@huawei.com>
>
>> ---
>> drivers/irqchip/irq-gic-v3-its.c | 60
>> ++++++++++++++++++++++++++++++
>> include/linux/irqchip/arm-gic-v3.h | 3 +-
>> 2 files changed, 62 insertions(+), 1 deletion(-)
>> diff --git a/drivers/irqchip/irq-gic-v3-its.c
>> b/drivers/irqchip/irq-gic-v3-its.c
>> index dcc7227af5f1..3c34bef70bdd 100644
>> --- a/drivers/irqchip/irq-gic-v3-its.c
>> +++ b/drivers/irqchip/irq-gic-v3-its.c
>> @@ -309,6 +309,10 @@ struct its_cmd_desc {
>> u16 seq_num;
>> u16 its_list;
>> } its_vmovp_cmd;
>> +
>> + struct {
>> + struct its_vpe *vpe;
>> + } its_invdb_cmd;
>> };
>> };
>> @@ -750,6 +754,21 @@ static struct its_vpe
>> *its_build_vmovp_cmd(struct its_node *its,
>> return valid_vpe(its, desc->its_vmovp_cmd.vpe);
>> }
>> +static struct its_vpe *its_build_invdb_cmd(struct its_node *its,
>> + struct its_cmd_block *cmd,
>> + struct its_cmd_desc *desc)
>> +{
>> + if (WARN_ON(!is_v4_1(its)))
>> + return NULL;
>> +
>> + its_encode_cmd(cmd, GITS_CMD_INVDB);
>> + its_encode_vpeid(cmd, desc->its_invdb_cmd.vpe->vpe_id);
>> +
>> + its_fixup_cmd(cmd);
>> +
>> + return valid_vpe(its, desc->its_invdb_cmd.vpe);
>> +}
>> +
>> static u64 its_cmd_ptr_to_offset(struct its_node *its,
>> struct its_cmd_block *ptr)
>> {
>> @@ -1117,6 +1136,14 @@ static void its_send_vinvall(struct its_node
>> *its, struct its_vpe *vpe)
>> its_send_single_vcommand(its, its_build_vinvall_cmd, &desc);
>> }
>> +static void its_send_invdb(struct its_node *its, struct its_vpe
>> *vpe)
>> +{
>> + struct its_cmd_desc desc;
>> +
>> + desc.its_invdb_cmd.vpe = vpe;
>> + its_send_single_vcommand(its, its_build_invdb_cmd, &desc);
>> +}
>> +
>> /*
>> * irqchip functions - assumes MSI, mostly.
>> */
>> @@ -3408,6 +3435,37 @@ static struct irq_chip its_vpe_irq_chip = {
>> .irq_set_vcpu_affinity = its_vpe_set_vcpu_affinity,
>> };
>> +static void its_vpe_4_1_send_inv(struct irq_data *d)
>> +{
>> + struct its_vpe *vpe = irq_data_get_irq_chip_data(d);
>> + struct its_node *its;
>> +
>> + /*
>> + * GICv4.1 wants doorbells to be invalidated using the
>> + * INVDB command in order to be broadcast to all RDs. Send
>> + * it to the first valid ITS, and let the HW do its magic.
>> + */
>> + list_for_each_entry(its, &its_nodes, entry) {
>> + if (!is_v4_1(its))
>> + continue;
>> +
>> + its_send_invdb(its, vpe);
>> + break;
>> + }
>
> Maybe use find_4_1_its() helper instead?

Yes, good point. I've moved it up in the series, and it is now added
to this patch.

Thanks,

M.
--
Jazz is not dead. It just smells funny...