On Fri, Apr 05, 2024 at 08:40:40AM +0530, Pavan Kondeti wrote: > 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. Agreed, updated for v18. 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 */ switch (virq) { case 32 ... 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; break; case 4096 ... 5119: 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; break; default: WARN(1, "Unexpected virq: %d\n", virq) return -EINVAL; } return 0; }