On Thu, Feb 22, 2024 at 03:16:34PM -0800, Elliot Berman wrote: > When booting a Gunyah virtual machine, the host VM may gain capabilities > to interact with resources for the guest virtual machine. Examples of > such resources are vCPUs or message queues. To use those resources, we > need to translate the RM response into a gunyah_resource structure which > are useful to Linux drivers. Presently, Linux drivers need only to know > the type of resource, the capability ID, and an interrupt. > > On ARM64 systems, the interrupt reported by Gunyah is the GIC interrupt > ID number and always a SPI or extended SPI. > > Signed-off-by: Elliot Berman <quic_eberman@xxxxxxxxxxx> > --- > arch/arm64/include/asm/gunyah.h | 36 ++++++++++++++++++++++ > drivers/virt/gunyah/rsc_mgr.c | 67 +++++++++++++++++++++++++++++++++++++++++ > drivers/virt/gunyah/rsc_mgr.h | 5 +++ > include/linux/gunyah.h | 2 ++ > 4 files changed, 110 insertions(+) > > diff --git a/arch/arm64/include/asm/gunyah.h b/arch/arm64/include/asm/gunyah.h > new file mode 100644 > index 0000000000000..0cd3debe22b64 > --- /dev/null > +++ b/arch/arm64/include/asm/gunyah.h > @@ -0,0 +1,36 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. > + */ > +#ifndef _ASM_GUNYAH_H > +#define _ASM_GUNYAH_H > + > +#include <linux/irq.h> > +#include <linux/irqdomain.h> > + > +static inline int arch_gunyah_fill_irq_fwspec_params(u32 virq, > + struct irq_fwspec *fwspec) > +{ > + /* Assume that Gunyah gave us an SPI or ESPI; defensively check it */ > + if (WARN(virq < 32, "Unexpected virq: %d\n", virq)) { > + return -EINVAL; > + } else if (virq <= 1019) { > + fwspec->param_count = 3; > + fwspec->param[0] = 0; /* GIC_SPI */ > + fwspec->param[1] = virq - 32; /* virq 32 -> SPI 0 */ > + fwspec->param[2] = IRQ_TYPE_EDGE_RISING; > + } else if (WARN(virq < 4096, "Unexpected virq: %d\n", virq)) { > + return -EINVAL; > + } else if (virq < 5120) { > + fwspec->param_count = 3; > + fwspec->param[0] = 2; /* GIC_ESPI */ > + fwspec->param[1] = virq - 4096; /* virq 4096 -> ESPI 0 */ > + fwspec->param[2] = IRQ_TYPE_EDGE_RISING; > + } else { > + WARN(1, "Unexpected virq: %d\n", virq); > + return -EINVAL; > + } > + return 0; > +} > + __get_intid_range() in gic-v3 driver looks more pleasing. Other than that the logic for the translation looks good to me. Thanks, Pavan