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