1 /* 2 * Copyright (c) 2006, Intel Corporation. 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms and conditions of the GNU General Public License, 6 * version 2, as published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope it will be useful, but WITHOUT 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * more details. 12 * 13 * You should have received a copy of the GNU General Public License along with 14 * this program; If not, see <http://www.gnu.org/licenses/>. 15 * 16 * Copyright (C) Allen Kay <allen.m.kay@intel.com> 17 * Copyright (C) Weidong Han <weidong.han@intel.com> 18 */ 19 20 #ifndef _VTD_EXTERN_H_ 21 #define _VTD_EXTERN_H_ 22 23 #include "dmar.h" 24 #include <xen/keyhandler.h> 25 26 #define VTDPREFIX "[VT-D]" 27 28 struct pci_ats_dev; 29 extern bool_t rwbf_quirk; 30 31 void print_iommu_regs(struct acpi_drhd_unit *drhd); 32 void print_vtd_entries(struct iommu *iommu, int bus, int devfn, u64 gmfn); 33 keyhandler_fn_t vtd_dump_iommu_info; 34 35 int enable_qinval(struct iommu *iommu); 36 void disable_qinval(struct iommu *iommu); 37 int enable_intremap(struct iommu *iommu, int eim); 38 void disable_intremap(struct iommu *iommu); 39 40 void iommu_flush_cache_entry(void *addr, unsigned int size); 41 void iommu_flush_cache_page(void *addr, unsigned long npages); 42 int iommu_alloc(struct acpi_drhd_unit *drhd); 43 void iommu_free(struct acpi_drhd_unit *drhd); 44 45 int iommu_flush_iec_global(struct iommu *iommu); 46 int iommu_flush_iec_index(struct iommu *iommu, u8 im, u16 iidx); 47 void clear_fault_bits(struct iommu *iommu); 48 49 struct iommu * ioapic_to_iommu(unsigned int apic_id); 50 struct iommu * hpet_to_iommu(unsigned int hpet_id); 51 struct acpi_drhd_unit * ioapic_to_drhd(unsigned int apic_id); 52 struct acpi_drhd_unit * hpet_to_drhd(unsigned int hpet_id); 53 struct acpi_drhd_unit * iommu_to_drhd(struct iommu *iommu); 54 struct acpi_rhsa_unit * drhd_to_rhsa(struct acpi_drhd_unit *drhd); 55 56 struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu); 57 58 int ats_device(const struct pci_dev *, const struct acpi_drhd_unit *); 59 60 int dev_invalidate_iotlb(struct iommu *iommu, u16 did, 61 u64 addr, unsigned int size_order, u64 type); 62 63 int __must_check qinval_device_iotlb_sync(struct iommu *iommu, 64 struct pci_dev *pdev, 65 u16 did, u16 size, u64 addr); 66 67 unsigned int get_cache_line_size(void); 68 void cacheline_flush(char *); 69 void flush_all_cache(void); 70 71 u64 alloc_pgtable_maddr(struct acpi_drhd_unit *drhd, unsigned long npages); 72 void free_pgtable_maddr(u64 maddr); 73 void *map_vtd_domain_page(u64 maddr); 74 void unmap_vtd_domain_page(void *va); 75 int domain_context_mapping_one(struct domain *domain, struct iommu *iommu, 76 u8 bus, u8 devfn, const struct pci_dev *); 77 int domain_context_unmap_one(struct domain *domain, struct iommu *iommu, 78 u8 bus, u8 devfn); 79 int intel_iommu_get_reserved_device_memory(iommu_grdm_t *func, void *ctxt); 80 81 unsigned int io_apic_read_remap_rte(unsigned int apic, unsigned int reg); 82 void io_apic_write_remap_rte(unsigned int apic, 83 unsigned int reg, unsigned int value); 84 85 struct msi_desc; 86 struct msi_msg; 87 void msi_msg_read_remap_rte(struct msi_desc *, struct msi_msg *); 88 int msi_msg_write_remap_rte(struct msi_desc *, struct msi_msg *); 89 90 int intel_setup_hpet_msi(struct msi_desc *); 91 92 int is_igd_vt_enabled_quirk(void); 93 void platform_quirks_init(void); 94 void vtd_ops_preamble_quirk(struct iommu* iommu); 95 void vtd_ops_postamble_quirk(struct iommu* iommu); 96 int __must_check me_wifi_quirk(struct domain *domain, 97 u8 bus, u8 devfn, int map); 98 void pci_vtd_quirk(const struct pci_dev *); 99 bool_t platform_supports_intremap(void); 100 bool_t platform_supports_x2apic(void); 101 102 void vtd_set_hwdom_mapping(struct domain *d); 103 104 #endif // _VTD_EXTERN_H_ 105