File Index
Files and directories
Sign in
FILE

arm-gic-v4.h

File preview with syntax highlighting.

linux-6.19.14/include/linux/irqchip/arm-gic-v4.h C
  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	/*
 29	 * Ensures mutual exclusion between updates to vlpi_count[]
 30	 * and map/unmap when using the ITSList mechanism.
 31	 *
 32	 * The lock order for any sequence involving the ITSList is
 33	 * vmapp_lock -> vpe_lock ->vmovp_lock.
 34	 */
 35	raw_spinlock_t		vmapp_lock;
 36	u32			vlpi_count[GICv4_ITS_LIST_MAX];
 37};
 38
 39/* Embedded in kvm_vcpu.arch */
 40struct its_vpe {
 41	struct page 		*vpt_page;
 42	struct its_vm		*its_vm;
 43	/* per-vPE VLPI tracking */
 44	atomic_t		vlpi_count;
 45	/* Doorbell interrupt */
 46	int			irq;
 47	irq_hw_number_t		vpe_db_lpi;
 48	/* VPE resident */
 49	bool			resident;
 50	/* VPT parse complete */
 51	bool			ready;
 52	union {
 53		/* GICv4.0 implementations */
 54		struct {
 55			/* VPE proxy mapping */
 56			int	vpe_proxy_event;
 57			/* Implementation Defined Area Invalid */
 58			bool	idai;
 59		};
 60		/* GICv4.1 implementations */
 61		struct {
 62			struct fwnode_handle	*fwnode;
 63			struct irq_domain	*sgi_domain;
 64			struct {
 65				u8	priority;
 66				bool	enabled;
 67				bool	group;
 68			}			sgi_config[16];
 69		};
 70	};
 71
 72	/* Track the VPE being mapped */
 73	atomic_t vmapp_count;
 74
 75	/*
 76	 * Ensures mutual exclusion between affinity setting of the
 77	 * vPE and vLPI operations using vpe->col_idx.
 78	 */
 79	raw_spinlock_t		vpe_lock;
 80	/*
 81	 * This collection ID is used to indirect the target
 82	 * redistributor for this VPE. The ID itself isn't involved in
 83	 * programming of the ITS.
 84	 */
 85	u16			col_idx;
 86	/* Unique (system-wide) VPE identifier */
 87	u16			vpe_id;
 88	/* Pending VLPIs on schedule out? */
 89	bool			pending_last;
 90};
 91
 92/*
 93 * struct its_vlpi_map: structure describing the mapping of a
 94 * VLPI. Only to be interpreted in the context of a physical interrupt
 95 * it complements.  To be used as the vcpu_info passed to
 96 * irq_set_vcpu_affinity().
 97 *
 98 * @vm:		Pointer to the GICv4 notion of a VM
 99 * @vpe:	Pointer to the GICv4 notion of a virtual CPU (VPE)
100 * @vintid:	Virtual LPI number
101 * @properties:	Priority and enable bits (as written in the prop table)
102 * @db_enabled:	Is the VPE doorbell to be generated?
103 */
104struct its_vlpi_map {
105	struct its_vm		*vm;
106	struct its_vpe		*vpe;
107	u32			vintid;
108	u8			properties;
109	bool			db_enabled;
110};
111
112enum its_vcpu_info_cmd_type {
113	MAP_VLPI,
114	GET_VLPI,
115	PROP_UPDATE_VLPI,
116	PROP_UPDATE_AND_INV_VLPI,
117	SCHEDULE_VPE,
118	DESCHEDULE_VPE,
119	COMMIT_VPE,
120	INVALL_VPE,
121	PROP_UPDATE_VSGI,
122};
123
124struct its_cmd_info {
125	enum its_vcpu_info_cmd_type	cmd_type;
126	union {
127		struct its_vlpi_map	*map;
128		u8			config;
129		bool			req_db;
130		struct {
131			bool		g0en;
132			bool		g1en;
133		};
134		struct {
135			u8		priority;
136			bool		group;
137		};
138	};
139};
140
141int its_alloc_vcpu_irqs(struct its_vm *vm);
142void its_free_vcpu_irqs(struct its_vm *vm);
143int its_make_vpe_resident(struct its_vpe *vpe, bool g0en, bool g1en);
144int its_make_vpe_non_resident(struct its_vpe *vpe, bool db);
145int its_commit_vpe(struct its_vpe *vpe);
146int its_invall_vpe(struct its_vpe *vpe);
147int its_map_vlpi(int irq, struct its_vlpi_map *map);
148int its_get_vlpi(int irq, struct its_vlpi_map *map);
149void its_unmap_vlpi(int irq);
150int its_prop_update_vlpi(int irq, u8 config, bool inv);
151int its_prop_update_vsgi(int irq, u8 priority, bool group);
152
153struct irq_domain_ops;
154int its_init_v4(struct irq_domain *domain,
155		const struct irq_domain_ops *vpe_ops,
156		const struct irq_domain_ops *sgi_ops);
157
158bool gic_cpuif_has_vsgi(void);
159
160#endif
~/ Read-only file preview.