Hi Marc,
On 2019/9/24 2:25, Marc Zyngier wrote:
The GICv4.1 ITS has yet another new command (VSGI) which allows
a VPE-targeted SGI to be configured (or have its pending state
cleared). Add support for this command and plumb it into the
activate irqdomain callback so that it is ready to be used.
Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx>
---
 drivers/irqchip/irq-gic-v3-its.c | 88 ++++++++++++++++++++++++++++++
 include/linux/irqchip/arm-gic-v3.h | 3 +-
 2 files changed, 90 insertions(+), 1 deletion(-)
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index 69c26be709be..5234b9eef8ad 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
[...]
@@ -3574,6 +3628,38 @@ static struct irq_chip its_vpe_4_1_irq_chip = {
ÂÂÂÂÂ .irq_set_vcpu_affinityÂÂÂ = its_vpe_4_1_set_vcpu_affinity,
 };
+static struct its_node *find_4_1_its(void)
+{
+ÂÂÂ static struct its_node *its = NULL;
+
+ÂÂÂ if (!its) {
+ÂÂÂÂÂÂÂ list_for_each_entry(its, &its_nodes, entry) {
+ÂÂÂÂÂÂÂÂÂÂÂ if (is_v4_1(its))
+ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ return its;
+ÂÂÂÂÂÂÂ }
+
+ÂÂÂÂÂÂÂ /* Oops? */
+ÂÂÂÂÂÂÂ its = NULL;
+ÂÂÂ }
+
+ÂÂÂ return its;
+}
+
+static void its_configure_sgi(struct irq_data *d, bool clear)
+{
+ÂÂÂ struct its_vpe *vpe = irq_data_get_irq_chip_data(d);
+ÂÂÂ struct its_cmd_desc desc;
+
+ÂÂÂ desc.its_vsgi_cmd.vpe = vpe;
+ÂÂÂ desc.its_vsgi_cmd.sgi = d->hwirq;
+ÂÂÂ desc.its_vsgi_cmd.priority = vpe->sgi_config[d->hwirq].priority;
+ÂÂÂ desc.its_vsgi_cmd.enable = vpe->sgi_config[d->hwirq].enabled;
+ÂÂÂ desc.its_vsgi_cmd.group = vpe->sgi_config[d->hwirq].group;
+ÂÂÂ desc.its_vsgi_cmd.clear = clear;
+
+ÂÂÂ its_send_single_vcommand(find_4_1_its(), its_build_vsgi_cmd, &desc);
I can't follow the logic in find_4_1_its(). We simply use the first ITS
with GICv4.1 support, but what if the vPE is not mapped on this ITS?
We will fail the valid_vpe() check when building this command and will
have no effect on HW in the end?