KVM
Classes | Macros | Enumerations | Functions | Variables
arm_vgic.h File Reference
#include <linux/bits.h>
#include <linux/kvm.h>
#include <linux/irqreturn.h>
#include <linux/kref.h>
#include <linux/mutex.h>
#include <linux/spinlock.h>
#include <linux/static_key.h>
#include <linux/types.h>
#include <kvm/iodev.h>
#include <linux/list.h>
#include <linux/jump_label.h>
#include <linux/irqchip/arm-gic-v4.h>
Include dependency graph for arm_vgic.h:

Go to the source code of this file.

Classes

struct  vgic_global
 
struct  irq_ops
 
struct  vgic_irq
 
struct  vgic_io_device
 
struct  vgic_its
 
struct  vgic_redist_region
 
struct  vgic_dist
 
struct  vgic_v2_cpu_if
 
struct  vgic_v3_cpu_if
 
struct  vgic_cpu
 

Macros

#define VGIC_V3_MAX_CPUS   512
 
#define VGIC_V2_MAX_CPUS   8
 
#define VGIC_NR_IRQS_LEGACY   256
 
#define VGIC_NR_SGIS   16
 
#define VGIC_NR_PPIS   16
 
#define VGIC_NR_PRIVATE_IRQS   (VGIC_NR_SGIS + VGIC_NR_PPIS)
 
#define VGIC_MAX_PRIVATE   (VGIC_NR_PRIVATE_IRQS - 1)
 
#define VGIC_MAX_SPI   1019
 
#define VGIC_MAX_RESERVED   1023
 
#define VGIC_MIN_LPI   8192
 
#define KVM_IRQCHIP_NUM_PINS   (1020 - 32)
 
#define irq_is_ppi(irq)   ((irq) >= VGIC_NR_SGIS && (irq) < VGIC_NR_PRIVATE_IRQS)
 
#define irq_is_spi(irq)
 
#define VGIC_V2_MAX_LRS   (1 << 6)
 
#define VGIC_V3_MAX_LRS   16
 
#define VGIC_V3_LR_INDEX(lr)   (VGIC_V3_MAX_LRS - 1 - lr)
 
#define VGIC_IRQ_SW_RESAMPLE   BIT(0) /* Clear the active state for resampling */
 
#define KVM_VGIC_IMP_REV_2   2 /* GICv2 restorable groups */
 
#define KVM_VGIC_IMP_REV_3   3 /* GICv3 GICR_CTLR.{IW,CES,RWP} */
 
#define KVM_VGIC_IMP_REV_LATEST   KVM_VGIC_IMP_REV_3
 
#define irqchip_in_kernel(k)   (!!((k)->arch.vgic.in_kernel))
 
#define vgic_initialized(k)   ((k)->arch.vgic.initialized)
 
#define vgic_ready(k)   ((k)->arch.vgic.ready)
 
#define vgic_valid_spi(k, i)
 

Enumerations

enum  vgic_type { VGIC_V2 , VGIC_V3 }
 
enum  vgic_irq_config { VGIC_CONFIG_EDGE = 0 , VGIC_CONFIG_LEVEL }
 
enum  iodev_type { IODEV_CPUIF , IODEV_DIST , IODEV_REDIST , IODEV_ITS }
 

Functions

static bool vgic_irq_needs_resampling (struct vgic_irq *irq)
 
int kvm_set_legacy_vgic_v2_addr (struct kvm *kvm, struct kvm_arm_device_addr *dev_addr)
 
void kvm_vgic_early_init (struct kvm *kvm)
 
int kvm_vgic_vcpu_init (struct kvm_vcpu *vcpu)
 
int kvm_vgic_create (struct kvm *kvm, u32 type)
 
void kvm_vgic_destroy (struct kvm *kvm)
 
void kvm_vgic_vcpu_destroy (struct kvm_vcpu *vcpu)
 
int kvm_vgic_map_resources (struct kvm *kvm)
 
int kvm_vgic_hyp_init (void)
 
void kvm_vgic_init_cpu_hardware (void)
 
int kvm_vgic_inject_irq (struct kvm *kvm, struct kvm_vcpu *vcpu, unsigned int intid, bool level, void *owner)
 
int kvm_vgic_map_phys_irq (struct kvm_vcpu *vcpu, unsigned int host_irq, u32 vintid, struct irq_ops *ops)
 
int kvm_vgic_unmap_phys_irq (struct kvm_vcpu *vcpu, unsigned int vintid)
 
int kvm_vgic_get_map (struct kvm_vcpu *vcpu, unsigned int vintid)
 
bool kvm_vgic_map_is_active (struct kvm_vcpu *vcpu, unsigned int vintid)
 
int kvm_vgic_vcpu_pending_irq (struct kvm_vcpu *vcpu)
 
void kvm_vgic_load (struct kvm_vcpu *vcpu)
 
void kvm_vgic_put (struct kvm_vcpu *vcpu)
 
void kvm_vgic_vmcr_sync (struct kvm_vcpu *vcpu)
 
bool kvm_vcpu_has_pending_irqs (struct kvm_vcpu *vcpu)
 
void kvm_vgic_sync_hwstate (struct kvm_vcpu *vcpu)
 
void kvm_vgic_flush_hwstate (struct kvm_vcpu *vcpu)
 
void kvm_vgic_reset_mapped_irq (struct kvm_vcpu *vcpu, u32 vintid)
 
void vgic_v3_dispatch_sgi (struct kvm_vcpu *vcpu, u64 reg, bool allow_group1)
 
static int kvm_vgic_get_max_vcpus (void)
 
int kvm_vgic_setup_default_irq_routing (struct kvm *kvm)
 
int kvm_vgic_set_owner (struct kvm_vcpu *vcpu, unsigned int intid, void *owner)
 
int kvm_vgic_v4_set_forwarding (struct kvm *kvm, int irq, struct kvm_kernel_irq_routing_entry *irq_entry)
 
int kvm_vgic_v4_unset_forwarding (struct kvm *kvm, int irq, struct kvm_kernel_irq_routing_entry *irq_entry)
 
int vgic_v4_load (struct kvm_vcpu *vcpu)
 
void vgic_v4_commit (struct kvm_vcpu *vcpu)
 
int vgic_v4_put (struct kvm_vcpu *vcpu)
 
void kvm_vgic_cpu_up (void)
 
void kvm_vgic_cpu_down (void)
 

Variables

struct vgic_global kvm_vgic_global_state
 
struct static_key_false vgic_v2_cpuif_trap
 
struct static_key_false vgic_v3_cpuif_trap
 

Macro Definition Documentation

◆ irq_is_ppi

#define irq_is_ppi (   irq)    ((irq) >= VGIC_NR_SGIS && (irq) < VGIC_NR_PRIVATE_IRQS)

Definition at line 34 of file arm_vgic.h.

◆ irq_is_spi

#define irq_is_spi (   irq)
Value:
((irq) >= VGIC_NR_PRIVATE_IRQS && \
(irq) <= VGIC_MAX_SPI)
#define VGIC_MAX_SPI
Definition: arm_vgic.h:29
#define VGIC_NR_PRIVATE_IRQS
Definition: arm_vgic.h:27

Definition at line 35 of file arm_vgic.h.

◆ irqchip_in_kernel

#define irqchip_in_kernel (   k)    (!!((k)->arch.vgic.in_kernel))

Definition at line 392 of file arm_vgic.h.

◆ KVM_IRQCHIP_NUM_PINS

#define KVM_IRQCHIP_NUM_PINS   (1020 - 32)

Definition at line 32 of file arm_vgic.h.

◆ KVM_VGIC_IMP_REV_2

#define KVM_VGIC_IMP_REV_2   2 /* GICv2 restorable groups */

Definition at line 234 of file arm_vgic.h.

◆ KVM_VGIC_IMP_REV_3

#define KVM_VGIC_IMP_REV_3   3 /* GICv3 GICR_CTLR.{IW,CES,RWP} */

Definition at line 235 of file arm_vgic.h.

◆ KVM_VGIC_IMP_REV_LATEST

#define KVM_VGIC_IMP_REV_LATEST   KVM_VGIC_IMP_REV_3

Definition at line 236 of file arm_vgic.h.

◆ vgic_initialized

#define vgic_initialized (   k)    ((k)->arch.vgic.initialized)

Definition at line 393 of file arm_vgic.h.

◆ VGIC_IRQ_SW_RESAMPLE

#define VGIC_IRQ_SW_RESAMPLE   BIT(0) /* Clear the active state for resampling */

Definition at line 107 of file arm_vgic.h.

◆ VGIC_MAX_PRIVATE

#define VGIC_MAX_PRIVATE   (VGIC_NR_PRIVATE_IRQS - 1)

Definition at line 28 of file arm_vgic.h.

◆ VGIC_MAX_RESERVED

#define VGIC_MAX_RESERVED   1023

Definition at line 30 of file arm_vgic.h.

◆ VGIC_MAX_SPI

#define VGIC_MAX_SPI   1019

Definition at line 29 of file arm_vgic.h.

◆ VGIC_MIN_LPI

#define VGIC_MIN_LPI   8192

Definition at line 31 of file arm_vgic.h.

◆ VGIC_NR_IRQS_LEGACY

#define VGIC_NR_IRQS_LEGACY   256

Definition at line 24 of file arm_vgic.h.

◆ VGIC_NR_PPIS

#define VGIC_NR_PPIS   16

Definition at line 26 of file arm_vgic.h.

◆ VGIC_NR_PRIVATE_IRQS

#define VGIC_NR_PRIVATE_IRQS   (VGIC_NR_SGIS + VGIC_NR_PPIS)

Definition at line 27 of file arm_vgic.h.

◆ VGIC_NR_SGIS

#define VGIC_NR_SGIS   16

Definition at line 25 of file arm_vgic.h.

◆ vgic_ready

#define vgic_ready (   k)    ((k)->arch.vgic.ready)

Definition at line 394 of file arm_vgic.h.

◆ VGIC_V2_MAX_CPUS

#define VGIC_V2_MAX_CPUS   8

Definition at line 23 of file arm_vgic.h.

◆ VGIC_V2_MAX_LRS

#define VGIC_V2_MAX_LRS   (1 << 6)

Definition at line 88 of file arm_vgic.h.

◆ VGIC_V3_LR_INDEX

#define VGIC_V3_LR_INDEX (   lr)    (VGIC_V3_MAX_LRS - 1 - lr)

Definition at line 90 of file arm_vgic.h.

◆ VGIC_V3_MAX_CPUS

#define VGIC_V3_MAX_CPUS   512

Definition at line 22 of file arm_vgic.h.

◆ VGIC_V3_MAX_LRS

#define VGIC_V3_MAX_LRS   16

Definition at line 89 of file arm_vgic.h.

◆ vgic_valid_spi

#define vgic_valid_spi (   k,
 
)
Value:
(((i) >= VGIC_NR_PRIVATE_IRQS) && \
((i) < (k)->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS))

Definition at line 395 of file arm_vgic.h.

Enumeration Type Documentation

◆ iodev_type

enum iodev_type
Enumerator
IODEV_CPUIF 
IODEV_DIST 
IODEV_REDIST 
IODEV_ITS 

Definition at line 168 of file arm_vgic.h.

168  {
169  IODEV_CPUIF,
170  IODEV_DIST,
171  IODEV_REDIST,
172  IODEV_ITS
173 };
@ IODEV_REDIST
Definition: arm_vgic.h:171
@ IODEV_ITS
Definition: arm_vgic.h:172
@ IODEV_CPUIF
Definition: arm_vgic.h:169
@ IODEV_DIST
Definition: arm_vgic.h:170

◆ vgic_irq_config

Enumerator
VGIC_CONFIG_EDGE 
VGIC_CONFIG_LEVEL 

Definition at line 92 of file arm_vgic.h.

92  {
93  VGIC_CONFIG_EDGE = 0,
95 };
@ VGIC_CONFIG_EDGE
Definition: arm_vgic.h:93
@ VGIC_CONFIG_LEVEL
Definition: arm_vgic.h:94

◆ vgic_type

enum vgic_type
Enumerator
VGIC_V2 
VGIC_V3 

Definition at line 38 of file arm_vgic.h.

38  {
39  VGIC_V2, /* Good ol' GICv2 */
40  VGIC_V3, /* New fancy GICv3 */
41 };
@ VGIC_V3
Definition: arm_vgic.h:40
@ VGIC_V2
Definition: arm_vgic.h:39

Function Documentation

◆ kvm_set_legacy_vgic_v2_addr()

int kvm_set_legacy_vgic_v2_addr ( struct kvm *  kvm,
struct kvm_arm_device_addr *  dev_addr 
)

◆ kvm_vcpu_has_pending_irqs()

bool kvm_vcpu_has_pending_irqs ( struct kvm_vcpu *  vcpu)

◆ kvm_vgic_cpu_down()

void kvm_vgic_cpu_down ( void  )

◆ kvm_vgic_cpu_up()

void kvm_vgic_cpu_up ( void  )

◆ kvm_vgic_create()

int kvm_vgic_create ( struct kvm *  kvm,
u32  type 
)

◆ kvm_vgic_destroy()

void kvm_vgic_destroy ( struct kvm *  kvm)

◆ kvm_vgic_early_init()

void kvm_vgic_early_init ( struct kvm *  kvm)

◆ kvm_vgic_flush_hwstate()

void kvm_vgic_flush_hwstate ( struct kvm_vcpu *  vcpu)

◆ kvm_vgic_get_map()

int kvm_vgic_get_map ( struct kvm_vcpu *  vcpu,
unsigned int  vintid 
)

◆ kvm_vgic_get_max_vcpus()

static int kvm_vgic_get_max_vcpus ( void  )
inlinestatic

kvm_vgic_get_max_vcpus - Get the maximum number of VCPUs allowed by HW

The host's GIC naturally limits the maximum amount of VCPUs a guest can use.

Definition at line 411 of file arm_vgic.h.

412 {
414 }
struct vgic_global kvm_vgic_global_state
int max_gic_vcpus
Definition: arm_vgic.h:68

◆ kvm_vgic_hyp_init()

int kvm_vgic_hyp_init ( void  )

◆ kvm_vgic_init_cpu_hardware()

void kvm_vgic_init_cpu_hardware ( void  )

◆ kvm_vgic_inject_irq()

int kvm_vgic_inject_irq ( struct kvm *  kvm,
struct kvm_vcpu *  vcpu,
unsigned int  intid,
bool  level,
void *  owner 
)

◆ kvm_vgic_load()

void kvm_vgic_load ( struct kvm_vcpu *  vcpu)

◆ kvm_vgic_map_is_active()

bool kvm_vgic_map_is_active ( struct kvm_vcpu *  vcpu,
unsigned int  vintid 
)

◆ kvm_vgic_map_phys_irq()

int kvm_vgic_map_phys_irq ( struct kvm_vcpu *  vcpu,
unsigned int  host_irq,
u32  vintid,
struct irq_ops ops 
)

◆ kvm_vgic_map_resources()

int kvm_vgic_map_resources ( struct kvm *  kvm)

◆ kvm_vgic_put()

void kvm_vgic_put ( struct kvm_vcpu *  vcpu)

◆ kvm_vgic_reset_mapped_irq()

void kvm_vgic_reset_mapped_irq ( struct kvm_vcpu *  vcpu,
u32  vintid 
)

◆ kvm_vgic_set_owner()

int kvm_vgic_set_owner ( struct kvm_vcpu *  vcpu,
unsigned int  intid,
void *  owner 
)

◆ kvm_vgic_setup_default_irq_routing()

int kvm_vgic_setup_default_irq_routing ( struct kvm *  kvm)

kvm_vgic_setup_default_irq_routing: Setup a default flat gsi routing table mapping all SPIs

◆ kvm_vgic_sync_hwstate()

void kvm_vgic_sync_hwstate ( struct kvm_vcpu *  vcpu)

◆ kvm_vgic_unmap_phys_irq()

int kvm_vgic_unmap_phys_irq ( struct kvm_vcpu *  vcpu,
unsigned int  vintid 
)

◆ kvm_vgic_v4_set_forwarding()

int kvm_vgic_v4_set_forwarding ( struct kvm *  kvm,
int  irq,
struct kvm_kernel_irq_routing_entry *  irq_entry 
)

◆ kvm_vgic_v4_unset_forwarding()

int kvm_vgic_v4_unset_forwarding ( struct kvm *  kvm,
int  irq,
struct kvm_kernel_irq_routing_entry *  irq_entry 
)

◆ kvm_vgic_vcpu_destroy()

void kvm_vgic_vcpu_destroy ( struct kvm_vcpu *  vcpu)

◆ kvm_vgic_vcpu_init()

int kvm_vgic_vcpu_init ( struct kvm_vcpu *  vcpu)

◆ kvm_vgic_vcpu_pending_irq()

int kvm_vgic_vcpu_pending_irq ( struct kvm_vcpu *  vcpu)

◆ kvm_vgic_vmcr_sync()

void kvm_vgic_vmcr_sync ( struct kvm_vcpu *  vcpu)

◆ vgic_irq_needs_resampling()

static bool vgic_irq_needs_resampling ( struct vgic_irq irq)
inlinestatic

Definition at line 160 of file arm_vgic.h.

161 {
162  return irq->ops && (irq->ops->flags & VGIC_IRQ_SW_RESAMPLE);
163 }
#define VGIC_IRQ_SW_RESAMPLE
Definition: arm_vgic.h:107
unsigned long flags
Definition: arm_vgic.h:105
struct irq_ops * ops
Definition: arm_vgic.h:154

◆ vgic_v3_dispatch_sgi()

void vgic_v3_dispatch_sgi ( struct kvm_vcpu *  vcpu,
u64  reg,
bool  allow_group1 
)

◆ vgic_v4_commit()

void vgic_v4_commit ( struct kvm_vcpu *  vcpu)

◆ vgic_v4_load()

int vgic_v4_load ( struct kvm_vcpu *  vcpu)

◆ vgic_v4_put()

int vgic_v4_put ( struct kvm_vcpu *  vcpu)

Variable Documentation

◆ kvm_vgic_global_state

struct vgic_global kvm_vgic_global_state
extern

◆ vgic_v2_cpuif_trap

struct static_key_false vgic_v2_cpuif_trap
extern

◆ vgic_v3_cpuif_trap

struct static_key_false vgic_v3_cpuif_trap
extern