1/* 2 * Copyright (C) 2009-2010 Advanced Micro Devices, Inc. 3 * Author: Joerg Roedel <jroedel@suse.de> 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 as published 7 * by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 */ 18 19#ifndef _ASM_X86_AMD_IOMMU_PROTO_H 20#define _ASM_X86_AMD_IOMMU_PROTO_H 21 22#include "amd_iommu_types.h" 23 24extern int amd_iommu_init_dma_ops(void); 25extern int amd_iommu_init_passthrough(void); 26extern irqreturn_t amd_iommu_int_thread(int irq, void *data); 27extern irqreturn_t amd_iommu_int_handler(int irq, void *data); 28extern void amd_iommu_apply_erratum_63(u16 devid); 29extern void amd_iommu_reset_cmd_buffer(struct amd_iommu *iommu); 30extern int amd_iommu_init_devices(void); 31extern void amd_iommu_uninit_devices(void); 32extern void amd_iommu_init_notifier(void); 33extern void amd_iommu_init_api(void); 34 35/* Needed for interrupt remapping */ 36extern int amd_iommu_prepare(void); 37extern int amd_iommu_enable(void); 38extern void amd_iommu_disable(void); 39extern int amd_iommu_reenable(int); 40extern int amd_iommu_enable_faulting(void); 41 42/* IOMMUv2 specific functions */ 43struct iommu_domain; 44 45extern bool amd_iommu_v2_supported(void); 46extern int amd_iommu_register_ppr_notifier(struct notifier_block *nb); 47extern int amd_iommu_unregister_ppr_notifier(struct notifier_block *nb); 48extern void amd_iommu_domain_direct_map(struct iommu_domain *dom); 49extern int amd_iommu_domain_enable_v2(struct iommu_domain *dom, int pasids); 50extern int amd_iommu_flush_page(struct iommu_domain *dom, int pasid, 51 u64 address); 52extern int amd_iommu_flush_tlb(struct iommu_domain *dom, int pasid); 53extern int amd_iommu_domain_set_gcr3(struct iommu_domain *dom, int pasid, 54 unsigned long cr3); 55extern int amd_iommu_domain_clear_gcr3(struct iommu_domain *dom, int pasid); 56extern struct iommu_domain *amd_iommu_get_v2_domain(struct pci_dev *pdev); 57 58/* IOMMU Performance Counter functions */ 59extern bool amd_iommu_pc_supported(void); 60extern u8 amd_iommu_pc_get_max_banks(u16 devid); 61extern u8 amd_iommu_pc_get_max_counters(u16 devid); 62extern int amd_iommu_pc_get_set_reg_val(u16 devid, u8 bank, u8 cntr, u8 fxn, 63 u64 *value, bool is_write); 64 65#define PPR_SUCCESS 0x0 66#define PPR_INVALID 0x1 67#define PPR_FAILURE 0xf 68 69extern int amd_iommu_complete_ppr(struct pci_dev *pdev, int pasid, 70 int status, int tag); 71 72#ifndef CONFIG_AMD_IOMMU_STATS 73 74static inline void amd_iommu_stats_init(void) { } 75 76#endif /* !CONFIG_AMD_IOMMU_STATS */ 77 78static inline bool is_rd890_iommu(struct pci_dev *pdev) 79{ 80 return (pdev->vendor == PCI_VENDOR_ID_ATI) && 81 (pdev->device == PCI_DEVICE_ID_RD890_IOMMU); 82} 83 84static inline bool iommu_feature(struct amd_iommu *iommu, u64 f) 85{ 86 if (!(iommu->cap & (1 << IOMMU_CAP_EFR))) 87 return false; 88 89 return !!(iommu->features & f); 90} 91 92#endif /* _ASM_X86_AMD_IOMMU_PROTO_H */ 93