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 | |
13 | struct 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 | */ |
20 | struct 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 | |
31 | struct task_struct; |
32 | struct pci_dev; |
33 | |
34 | extern int amd_iommu_detect(void); |
35 | |
36 | #else /* CONFIG_AMD_IOMMU */ |
37 | |
38 | static 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 */ |
45 | extern int amd_iommu_register_ga_log_notifier(int (*notifier)(u32)); |
46 | |
47 | extern int |
48 | amd_iommu_update_ga(int cpu, bool is_run, void *data); |
49 | |
50 | extern int amd_iommu_activate_guest_mode(void *data); |
51 | extern int amd_iommu_deactivate_guest_mode(void *data); |
52 | |
53 | #else /* defined(CONFIG_AMD_IOMMU) && defined(CONFIG_IRQ_REMAP) */ |
54 | |
55 | static inline int |
56 | amd_iommu_register_ga_log_notifier(int (*notifier)(u32)) |
57 | { |
58 | return 0; |
59 | } |
60 | |
61 | static inline int |
62 | amd_iommu_update_ga(int cpu, bool is_run, void *data) |
63 | { |
64 | return 0; |
65 | } |
66 | |
67 | static inline int amd_iommu_activate_guest_mode(void *data) |
68 | { |
69 | return 0; |
70 | } |
71 | |
72 | static 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 | |
78 | int amd_iommu_get_num_iommus(void); |
79 | bool amd_iommu_pc_supported(void); |
80 | u8 amd_iommu_pc_get_max_banks(unsigned int idx); |
81 | u8 amd_iommu_pc_get_max_counters(unsigned int idx); |
82 | int amd_iommu_pc_set_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, u8 fxn, |
83 | u64 *value); |
84 | int amd_iommu_pc_get_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, u8 fxn, |
85 | u64 *value); |
86 | struct amd_iommu *get_amd_iommu(unsigned int idx); |
87 | |
88 | #ifdef CONFIG_KVM_AMD_SEV |
89 | int amd_iommu_snp_disable(void); |
90 | #else |
91 | static inline int amd_iommu_snp_disable(void) { return 0; } |
92 | #endif |
93 | |
94 | #endif /* _ASM_X86_AMD_IOMMU_H */ |
95 | |