Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/vmm/io/iommu.h
Show All 25 Lines | |||||
* SUCH DAMAGE. | * SUCH DAMAGE. | ||||
* | * | ||||
* $FreeBSD$ | * $FreeBSD$ | ||||
*/ | */ | ||||
#ifndef _IO_IOMMU_H_ | #ifndef _IO_IOMMU_H_ | ||||
#define _IO_IOMMU_H_ | #define _IO_IOMMU_H_ | ||||
enum iommu_swcaps { | |||||
IOMMU_CAP_BULK, | |||||
}; | |||||
typedef int (*iommu_init_func_t)(void); | typedef int (*iommu_init_func_t)(void); | ||||
typedef void (*iommu_cleanup_func_t)(void); | typedef void (*iommu_cleanup_func_t)(void); | ||||
typedef void (*iommu_enable_func_t)(void); | typedef void (*iommu_enable_func_t)(void); | ||||
typedef void (*iommu_disable_func_t)(void); | typedef void (*iommu_disable_func_t)(void); | ||||
typedef void *(*iommu_create_domain_t)(vm_paddr_t maxaddr); | typedef void *(*iommu_create_domain_t)(vm_paddr_t maxaddr, bool host_domain); | ||||
typedef void (*iommu_destroy_domain_t)(void *domain); | typedef void (*iommu_destroy_domain_t)(void *domain); | ||||
typedef uint64_t (*iommu_create_mapping_t)(void *domain, vm_paddr_t gpa, | typedef int (*iommu_create_mapping_t)(void *domain, vm_paddr_t gpa, | ||||
vm_paddr_t hpa, uint64_t len); | vm_paddr_t hpa, uint64_t len, uint64_t *res_len); | ||||
typedef uint64_t (*iommu_remove_mapping_t)(void *domain, vm_paddr_t gpa, | typedef int (*iommu_create_mapping_bulk_t)(void *domain, vm_paddr_t gpa, | ||||
uint64_t len); | struct vm_page **ma, uint64_t len); | ||||
typedef void (*iommu_add_device_t)(void *domain, uint16_t rid); | typedef int (*iommu_remove_mapping_t)(void *domain, vm_paddr_t gpa, | ||||
typedef void (*iommu_remove_device_t)(void *dom, uint16_t rid); | uint64_t len, uint64_t *res_len); | ||||
typedef void (*iommu_invalidate_tlb_t)(void *dom); | typedef int (*iommu_add_device_t)(void *domain, device_t dev, uint16_t rid); | ||||
typedef int (*iommu_remove_device_t)(void *dom, device_t dev, uint16_t rid); | |||||
typedef int (*iommu_invalidate_tlb_t)(void *dom); | |||||
typedef bool (*iommu_get_swcaps_t)(enum iommu_swcaps); | |||||
struct iommu_ops { | struct iommu_ops { | ||||
iommu_init_func_t init; /* module wide */ | iommu_init_func_t init; /* module wide */ | ||||
iommu_cleanup_func_t cleanup; | iommu_cleanup_func_t cleanup; | ||||
iommu_enable_func_t enable; | iommu_enable_func_t enable; | ||||
iommu_disable_func_t disable; | iommu_disable_func_t disable; | ||||
iommu_create_domain_t create_domain; /* domain-specific */ | iommu_create_domain_t create_domain; /* domain-specific */ | ||||
iommu_destroy_domain_t destroy_domain; | iommu_destroy_domain_t destroy_domain; | ||||
iommu_create_mapping_t create_mapping; | iommu_create_mapping_t create_mapping; | ||||
iommu_create_mapping_bulk_t create_mapping_bulk; | |||||
iommu_remove_mapping_t remove_mapping; | iommu_remove_mapping_t remove_mapping; | ||||
iommu_add_device_t add_device; | iommu_add_device_t add_device; | ||||
iommu_remove_device_t remove_device; | iommu_remove_device_t remove_device; | ||||
iommu_invalidate_tlb_t invalidate_tlb; | iommu_invalidate_tlb_t invalidate_tlb; | ||||
iommu_get_swcaps_t get_swcaps; | |||||
}; | }; | ||||
extern const struct iommu_ops iommu_ops_intel; | |||||
extern const struct iommu_ops iommu_ops_amd; | extern const struct iommu_ops iommu_ops_amd; | ||||
extern const struct iommu_ops iommu_ops_dmar; | |||||
extern const struct iommu_ops iommu_ops_intel; | |||||
void iommu_cleanup(void); | void iommu_cleanup(void); | ||||
void *iommu_host_domain(void); | void *iommu_host_domain(void); | ||||
void *iommu_create_domain(vm_paddr_t maxaddr); | void *iommu_create_domain(vm_paddr_t maxaddr); | ||||
void iommu_destroy_domain(void *dom); | void iommu_destroy_domain(void *dom); | ||||
void iommu_create_mapping(void *dom, vm_paddr_t gpa, vm_paddr_t hpa, | int iommu_create_mapping(void *dom, vm_paddr_t gpa, vm_paddr_t hpa, | ||||
size_t len); | size_t len); | ||||
void iommu_remove_mapping(void *dom, vm_paddr_t gpa, size_t len); | int iommu_create_mapping_bulk(void *dom, vm_paddr_t gpa, | ||||
void iommu_add_device(void *dom, uint16_t rid); | struct vm_page **ma, size_t len); | ||||
void iommu_remove_device(void *dom, uint16_t rid); | int iommu_remove_mapping(void *dom, vm_paddr_t gpa, size_t len); | ||||
void iommu_invalidate_tlb(void *domain); | int iommu_add_device(void *dom, device_t dev, uint16_t rid); | ||||
int iommu_remove_device(void *dom, device_t dev, uint16_t rid); | |||||
int iommu_invalidate_tlb(void *domain); | |||||
bool iommu_get_swcaps(enum iommu_swcaps cap); | |||||
#endif | #endif |