GNU Linux-libre 4.14.328-gnu1
[releases.git] / include / linux / irqchip / arm-gic-v4.h
1 /*
2  * Copyright (C) 2016,2017 ARM Limited, All Rights Reserved.
3  * Author: Marc Zyngier <marc.zyngier@arm.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #ifndef __LINUX_IRQCHIP_ARM_GIC_V4_H
19 #define __LINUX_IRQCHIP_ARM_GIC_V4_H
20
21 struct its_vpe;
22
23 /* Embedded in kvm.arch */
24 struct its_vm {
25         struct fwnode_handle    *fwnode;
26         struct irq_domain       *domain;
27         struct page             *vprop_page;
28         struct its_vpe          **vpes;
29         int                     nr_vpes;
30         irq_hw_number_t         db_lpi_base;
31         unsigned long           *db_bitmap;
32         int                     nr_db_lpis;
33 };
34
35 /* Embedded in kvm_vcpu.arch */
36 struct its_vpe {
37         struct page             *vpt_page;
38         struct its_vm           *its_vm;
39         /* Doorbell interrupt */
40         int                     irq;
41         irq_hw_number_t         vpe_db_lpi;
42         /* VPE proxy mapping */
43         int                     vpe_proxy_event;
44         /*
45          * This collection ID is used to indirect the target
46          * redistributor for this VPE. The ID itself isn't involved in
47          * programming of the ITS.
48          */
49         u16                     col_idx;
50         /* Unique (system-wide) VPE identifier */
51         u16                     vpe_id;
52         /* Implementation Defined Area Invalid */
53         bool                    idai;
54         /* Pending VLPIs on schedule out? */
55         bool                    pending_last;
56 };
57
58 /*
59  * struct its_vlpi_map: structure describing the mapping of a
60  * VLPI. Only to be interpreted in the context of a physical interrupt
61  * it complements.  To be used as the vcpu_info passed to
62  * irq_set_vcpu_affinity().
63  *
64  * @vm:         Pointer to the GICv4 notion of a VM
65  * @vpe:        Pointer to the GICv4 notion of a virtual CPU (VPE)
66  * @vintid:     Virtual LPI number
67  * @db_enabled: Is the VPE doorbell to be generated?
68  */
69 struct its_vlpi_map {
70         struct its_vm           *vm;
71         struct its_vpe          *vpe;
72         u32                     vintid;
73         bool                    db_enabled;
74 };
75
76 enum its_vcpu_info_cmd_type {
77         MAP_VLPI,
78         GET_VLPI,
79         PROP_UPDATE_VLPI,
80         PROP_UPDATE_AND_INV_VLPI,
81         SCHEDULE_VPE,
82         DESCHEDULE_VPE,
83         INVALL_VPE,
84 };
85
86 struct its_cmd_info {
87         enum its_vcpu_info_cmd_type     cmd_type;
88         union {
89                 struct its_vlpi_map     *map;
90                 u8                      config;
91         };
92 };
93
94 int its_alloc_vcpu_irqs(struct its_vm *vm);
95 void its_free_vcpu_irqs(struct its_vm *vm);
96 int its_schedule_vpe(struct its_vpe *vpe, bool on);
97 int its_invall_vpe(struct its_vpe *vpe);
98 int its_map_vlpi(int irq, struct its_vlpi_map *map);
99 int its_get_vlpi(int irq, struct its_vlpi_map *map);
100 int its_unmap_vlpi(int irq);
101 int its_prop_update_vlpi(int irq, u8 config, bool inv);
102
103 int its_init_v4(struct irq_domain *domain, const struct irq_domain_ops *ops);
104
105 #endif