| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SYSROOT_ZIRCON_SYSCALLS_IOMMU_H_ |
| #define SYSROOT_ZIRCON_SYSCALLS_IOMMU_H_ |
| |
| #include <assert.h> |
| #include <stdbool.h> |
| #include <stdint.h> |
| #include <zircon/compiler.h> |
| |
| __BEGIN_CDECLS |
| |
| #define ZX_IOMMU_MAX_DESC_LEN 4096 |
| |
| // Values for the |type| argument of the zx_iommu_create() syscall. |
| #define ZX_IOMMU_TYPE_DUMMY 0 |
| #define ZX_IOMMU_TYPE_INTEL 1 |
| |
| // Data structures for creating a dummy IOMMU instance |
| typedef struct zx_iommu_desc_dummy { |
| uint8_t reserved; |
| } zx_iommu_desc_dummy_t; |
| |
| // Data structures for creating an Intel IOMMU instance |
| |
| // This scope represents a single PCI endpoint device |
| #define ZX_IOMMU_INTEL_SCOPE_ENDPOINT 0 |
| // This scope represents a PCI-PCI bridge. The bridge and all of its downstream |
| // devices will be included in this scope. |
| #define ZX_IOMMU_INTEL_SCOPE_BRIDGE 1 |
| |
| // TODO(teisenbe): Investigate FIDL for this. Multiple embedded lists seems |
| // right up its alley. |
| typedef struct zx_iommu_desc_intel_scope { |
| uint8_t type; |
| // The bus number of the first bus decoded by the host bridge this scope is attached to. |
| uint8_t start_bus; |
| // Number of bridges (including the host bridge) between host bridge and the |
| // device. |
| uint8_t num_hops; |
| // The device number and function numbers of the bridges along the way, |
| // ending with the device itself. |
| // |dev_func[0]| is the address on |start_bus| of the first bridge in the |
| // path (excluding the host bridge). |dev_func[num_hops-1]| is the address |
| // of the device itself. |
| uint8_t dev_func[5]; |
| } zx_iommu_desc_intel_scope_t; |
| |
| typedef struct zx_iommu_desc_intel_reserved_memory { |
| uint64_t base_addr; // Physical address of the base of reserved memory. |
| uint64_t len; // Number of bytes of reserved memory. |
| |
| // The number of bytes of zx_iommu_desc_intel_scope_t's that follow this descriptor. |
| uint8_t scope_bytes; |
| |
| uint8_t _reserved[7]; // Padding |
| |
| // This is a list of all devices that need access to this memory range. |
| // |
| // zx_iommu_desc_intel_scope_t scopes[num_scopes]; |
| } zx_iommu_desc_intel_reserved_memory_t; |
| |
| typedef struct zx_iommu_desc_intel { |
| uint64_t register_base; // Physical address of registers |
| uint16_t pci_segment; // The PCI segment associated with this IOMMU |
| |
| // If true, this IOMMU has all PCI devices in its segment under its scope. |
| // In this case, the list of scopes acts as a blacklist. |
| bool whole_segment; |
| |
| // The number of bytes of zx_iommu_desc_intel_scope_t's that follow this descriptor. |
| uint8_t scope_bytes; |
| |
| // The number of bytes of zx_iommu_desc_intel_reserved_memory_t's that follow the scope |
| // list. |
| uint16_t reserved_memory_bytes; |
| |
| uint8_t _reserved[2]; // Padding |
| |
| // If |whole_segment| is false, this is a list of all devices managed by |
| // this IOMMU. If |whole_segment| is true, this is a list of all devices on |
| // this segment *not* managed by this IOMMU. It has a total length in bytes of |
| // |scope_bytes|. |
| // |
| // zx_iommu_desc_intel_scope_t scopes[]; |
| |
| // A list of all BIOS-reserved memory regions this IOMMU needs to translate. |
| // It has a total length in bytes of |reserved_memory_bytes|. |
| // |
| // zx_iommu_desc_intel_reserved_memory_t reserved_mem[]; |
| } zx_iommu_desc_intel_t; |
| |
| __END_CDECLS |
| |
| #endif // SYSROOT_ZIRCON_SYSCALLS_IOMMU_H_ |