1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (C) 2007-2010 Advanced Micro Devices, Inc.
4 * Author: Joerg Roedel <joerg.roedel@amd.com>
5 *         Leo Duran <leo.duran@amd.com>
6 */
7
8#ifndef _ASM_X86_AMD_IOMMU_H
9#define _ASM_X86_AMD_IOMMU_H
10
11#include <linux/types.h>
12
13struct amd_iommu;
14
15/*
16 * This is mainly used to communicate information back-and-forth
17 * between SVM and IOMMU for setting up and tearing down posted
18 * interrupt
19 */
20struct amd_iommu_pi_data {
21	u32 ga_tag;
22	u32 prev_ga_tag;
23	u64 base;
24	bool is_guest_mode;
25	struct vcpu_data *vcpu_data;
26	void *ir_data;
27};
28
29#ifdef CONFIG_AMD_IOMMU
30
31struct task_struct;
32struct pci_dev;
33
34extern int amd_iommu_detect(void);
35
36#else /* CONFIG_AMD_IOMMU */
37
38static inline int amd_iommu_detect(void) { return -ENODEV; }
39
40#endif /* CONFIG_AMD_IOMMU */
41
42#if defined(CONFIG_AMD_IOMMU) && defined(CONFIG_IRQ_REMAP)
43
44/* IOMMU AVIC Function */
45extern int amd_iommu_register_ga_log_notifier(int (*notifier)(u32));
46
47extern int
48amd_iommu_update_ga(int cpu, bool is_run, void *data);
49
50extern int amd_iommu_activate_guest_mode(void *data);
51extern int amd_iommu_deactivate_guest_mode(void *data);
52
53#else /* defined(CONFIG_AMD_IOMMU) && defined(CONFIG_IRQ_REMAP) */
54
55static inline int
56amd_iommu_register_ga_log_notifier(int (*notifier)(u32))
57{
58	return 0;
59}
60
61static inline int
62amd_iommu_update_ga(int cpu, bool is_run, void *data)
63{
64	return 0;
65}
66
67static inline int amd_iommu_activate_guest_mode(void *data)
68{
69	return 0;
70}
71
72static inline int amd_iommu_deactivate_guest_mode(void *data)
73{
74	return 0;
75}
76#endif /* defined(CONFIG_AMD_IOMMU) && defined(CONFIG_IRQ_REMAP) */
77
78int amd_iommu_get_num_iommus(void);
79bool amd_iommu_pc_supported(void);
80u8 amd_iommu_pc_get_max_banks(unsigned int idx);
81u8 amd_iommu_pc_get_max_counters(unsigned int idx);
82int amd_iommu_pc_set_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, u8 fxn,
83		u64 *value);
84int amd_iommu_pc_get_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, u8 fxn,
85		u64 *value);
86struct amd_iommu *get_amd_iommu(unsigned int idx);
87
88#ifdef CONFIG_KVM_AMD_SEV
89int amd_iommu_snp_disable(void);
90#else
91static inline int amd_iommu_snp_disable(void) { return 0; }
92#endif
93
94#endif /* _ASM_X86_AMD_IOMMU_H */
95