linux/include/linux/irqchip/arm-gic-v4.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (C) 2016,2017 ARM Limited, All Rights Reserved.
   4 * Author: Marc Zyngier <marc.zyngier@arm.com>
   5 */
   6
   7#ifndef __LINUX_IRQCHIP_ARM_GIC_V4_H
   8#define __LINUX_IRQCHIP_ARM_GIC_V4_H
   9
  10struct its_vpe;
  11
  12/*
  13 * Maximum number of ITTs when GITS_TYPER.VMOVP == 0, using the
  14 * ITSList mechanism to perform inter-ITS synchronization.
  15 */
  16#define GICv4_ITS_LIST_MAX              16
  17
  18/* Embedded in kvm.arch */
  19struct its_vm {
  20        struct fwnode_handle    *fwnode;
  21        struct irq_domain       *domain;
  22        struct page             *vprop_page;
  23        struct its_vpe          **vpes;
  24        int                     nr_vpes;
  25        irq_hw_number_t         db_lpi_base;
  26        unsigned long           *db_bitmap;
  27        int                     nr_db_lpis;
  28        u32                     vlpi_count[GICv4_ITS_LIST_MAX];
  29};
  30
  31/* Embedded in kvm_vcpu.arch */
  32struct its_vpe {
  33        struct page             *vpt_page;
  34        struct its_vm           *its_vm;
  35        /* per-vPE VLPI tracking */
  36        atomic_t                vlpi_count;
  37        /* Doorbell interrupt */
  38        int                     irq;
  39        irq_hw_number_t         vpe_db_lpi;
  40        /* VPE resident */
  41        bool                    resident;
  42        union {
  43                /* GICv4.0 implementations */
  44                struct {
  45                        /* VPE proxy mapping */
  46                        int     vpe_proxy_event;
  47                        /* Implementation Defined Area Invalid */
  48                        bool    idai;
  49                };
  50                /* GICv4.1 implementations */
  51                struct {
  52                        struct fwnode_handle    *fwnode;
  53                        struct irq_domain       *sgi_domain;
  54                        struct {
  55                                u8      priority;
  56                                bool    enabled;
  57                                bool    group;
  58                        }                       sgi_config[16];
  59                        atomic_t vmapp_count;
  60                };
  61        };
  62
  63        /*
  64         * Ensures mutual exclusion between affinity setting of the
  65         * vPE and vLPI operations using vpe->col_idx.
  66         */
  67        raw_spinlock_t          vpe_lock;
  68        /*
  69         * This collection ID is used to indirect the target
  70         * redistributor for this VPE. The ID itself isn't involved in
  71         * programming of the ITS.
  72         */
  73        u16                     col_idx;
  74        /* Unique (system-wide) VPE identifier */
  75        u16                     vpe_id;
  76        /* Pending VLPIs on schedule out? */
  77        bool                    pending_last;
  78};
  79
  80/*
  81 * struct its_vlpi_map: structure describing the mapping of a
  82 * VLPI. Only to be interpreted in the context of a physical interrupt
  83 * it complements.  To be used as the vcpu_info passed to
  84 * irq_set_vcpu_affinity().
  85 *
  86 * @vm:         Pointer to the GICv4 notion of a VM
  87 * @vpe:        Pointer to the GICv4 notion of a virtual CPU (VPE)
  88 * @vintid:     Virtual LPI number
  89 * @properties: Priority and enable bits (as written in the prop table)
  90 * @db_enabled: Is the VPE doorbell to be generated?
  91 */
  92struct its_vlpi_map {
  93        struct its_vm           *vm;
  94        struct its_vpe          *vpe;
  95        u32                     vintid;
  96        u8                      properties;
  97        bool                    db_enabled;
  98};
  99
 100enum its_vcpu_info_cmd_type {
 101        MAP_VLPI,
 102        GET_VLPI,
 103        PROP_UPDATE_VLPI,
 104        PROP_UPDATE_AND_INV_VLPI,
 105        SCHEDULE_VPE,
 106        DESCHEDULE_VPE,
 107        INVALL_VPE,
 108        PROP_UPDATE_VSGI,
 109};
 110
 111struct its_cmd_info {
 112        enum its_vcpu_info_cmd_type     cmd_type;
 113        union {
 114                struct its_vlpi_map     *map;
 115                u8                      config;
 116                bool                    req_db;
 117                struct {
 118                        bool            g0en;
 119                        bool            g1en;
 120                };
 121                struct {
 122                        u8              priority;
 123                        bool            group;
 124                };
 125        };
 126};
 127
 128int its_alloc_vcpu_irqs(struct its_vm *vm);
 129void its_free_vcpu_irqs(struct its_vm *vm);
 130int its_make_vpe_resident(struct its_vpe *vpe, bool g0en, bool g1en);
 131int its_make_vpe_non_resident(struct its_vpe *vpe, bool db);
 132int its_invall_vpe(struct its_vpe *vpe);
 133int its_map_vlpi(int irq, struct its_vlpi_map *map);
 134int its_get_vlpi(int irq, struct its_vlpi_map *map);
 135int its_unmap_vlpi(int irq);
 136int its_prop_update_vlpi(int irq, u8 config, bool inv);
 137int its_prop_update_vsgi(int irq, u8 priority, bool group);
 138
 139struct irq_domain_ops;
 140int its_init_v4(struct irq_domain *domain,
 141                const struct irq_domain_ops *vpe_ops,
 142                const struct irq_domain_ops *sgi_ops);
 143
 144#endif
 145