xref: /openbmc/qemu/include/system/iommufd.h (revision 65cb7129f4160c7e07a0da107f888ec73ae96776)
1*32cad1ffSPhilippe Mathieu-Daudé /*
2*32cad1ffSPhilippe Mathieu-Daudé  * iommufd container backend declaration
3*32cad1ffSPhilippe Mathieu-Daudé  *
4*32cad1ffSPhilippe Mathieu-Daudé  * Copyright (C) 2024 Intel Corporation.
5*32cad1ffSPhilippe Mathieu-Daudé  * Copyright Red Hat, Inc. 2024
6*32cad1ffSPhilippe Mathieu-Daudé  *
7*32cad1ffSPhilippe Mathieu-Daudé  * Authors: Yi Liu <yi.l.liu@intel.com>
8*32cad1ffSPhilippe Mathieu-Daudé  *          Eric Auger <eric.auger@redhat.com>
9*32cad1ffSPhilippe Mathieu-Daudé  *          Zhenzhong Duan <zhenzhong.duan@intel.com>
10*32cad1ffSPhilippe Mathieu-Daudé  *
11*32cad1ffSPhilippe Mathieu-Daudé  * SPDX-License-Identifier: GPL-2.0-or-later
12*32cad1ffSPhilippe Mathieu-Daudé  */
13*32cad1ffSPhilippe Mathieu-Daudé 
14*32cad1ffSPhilippe Mathieu-Daudé #ifndef SYSTEM_IOMMUFD_H
15*32cad1ffSPhilippe Mathieu-Daudé #define SYSTEM_IOMMUFD_H
16*32cad1ffSPhilippe Mathieu-Daudé 
17*32cad1ffSPhilippe Mathieu-Daudé #include "qom/object.h"
18*32cad1ffSPhilippe Mathieu-Daudé #include "exec/hwaddr.h"
19*32cad1ffSPhilippe Mathieu-Daudé #include "exec/cpu-common.h"
20*32cad1ffSPhilippe Mathieu-Daudé #include "system/host_iommu_device.h"
21*32cad1ffSPhilippe Mathieu-Daudé 
22*32cad1ffSPhilippe Mathieu-Daudé #define TYPE_IOMMUFD_BACKEND "iommufd"
23*32cad1ffSPhilippe Mathieu-Daudé OBJECT_DECLARE_TYPE(IOMMUFDBackend, IOMMUFDBackendClass, IOMMUFD_BACKEND)
24*32cad1ffSPhilippe Mathieu-Daudé 
25*32cad1ffSPhilippe Mathieu-Daudé struct IOMMUFDBackendClass {
26*32cad1ffSPhilippe Mathieu-Daudé     ObjectClass parent_class;
27*32cad1ffSPhilippe Mathieu-Daudé };
28*32cad1ffSPhilippe Mathieu-Daudé 
29*32cad1ffSPhilippe Mathieu-Daudé struct IOMMUFDBackend {
30*32cad1ffSPhilippe Mathieu-Daudé     Object parent;
31*32cad1ffSPhilippe Mathieu-Daudé 
32*32cad1ffSPhilippe Mathieu-Daudé     /*< protected >*/
33*32cad1ffSPhilippe Mathieu-Daudé     int fd;            /* /dev/iommu file descriptor */
34*32cad1ffSPhilippe Mathieu-Daudé     bool owned;        /* is the /dev/iommu opened internally */
35*32cad1ffSPhilippe Mathieu-Daudé     uint32_t users;
36*32cad1ffSPhilippe Mathieu-Daudé 
37*32cad1ffSPhilippe Mathieu-Daudé     /*< public >*/
38*32cad1ffSPhilippe Mathieu-Daudé };
39*32cad1ffSPhilippe Mathieu-Daudé 
40*32cad1ffSPhilippe Mathieu-Daudé bool iommufd_backend_connect(IOMMUFDBackend *be, Error **errp);
41*32cad1ffSPhilippe Mathieu-Daudé void iommufd_backend_disconnect(IOMMUFDBackend *be);
42*32cad1ffSPhilippe Mathieu-Daudé 
43*32cad1ffSPhilippe Mathieu-Daudé bool iommufd_backend_alloc_ioas(IOMMUFDBackend *be, uint32_t *ioas_id,
44*32cad1ffSPhilippe Mathieu-Daudé                                 Error **errp);
45*32cad1ffSPhilippe Mathieu-Daudé void iommufd_backend_free_id(IOMMUFDBackend *be, uint32_t id);
46*32cad1ffSPhilippe Mathieu-Daudé int iommufd_backend_map_dma(IOMMUFDBackend *be, uint32_t ioas_id, hwaddr iova,
47*32cad1ffSPhilippe Mathieu-Daudé                             ram_addr_t size, void *vaddr, bool readonly);
48*32cad1ffSPhilippe Mathieu-Daudé int iommufd_backend_unmap_dma(IOMMUFDBackend *be, uint32_t ioas_id,
49*32cad1ffSPhilippe Mathieu-Daudé                               hwaddr iova, ram_addr_t size);
50*32cad1ffSPhilippe Mathieu-Daudé bool iommufd_backend_get_device_info(IOMMUFDBackend *be, uint32_t devid,
51*32cad1ffSPhilippe Mathieu-Daudé                                      uint32_t *type, void *data, uint32_t len,
52*32cad1ffSPhilippe Mathieu-Daudé                                      uint64_t *caps, Error **errp);
53*32cad1ffSPhilippe Mathieu-Daudé bool iommufd_backend_alloc_hwpt(IOMMUFDBackend *be, uint32_t dev_id,
54*32cad1ffSPhilippe Mathieu-Daudé                                 uint32_t pt_id, uint32_t flags,
55*32cad1ffSPhilippe Mathieu-Daudé                                 uint32_t data_type, uint32_t data_len,
56*32cad1ffSPhilippe Mathieu-Daudé                                 void *data_ptr, uint32_t *out_hwpt,
57*32cad1ffSPhilippe Mathieu-Daudé                                 Error **errp);
58*32cad1ffSPhilippe Mathieu-Daudé bool iommufd_backend_set_dirty_tracking(IOMMUFDBackend *be, uint32_t hwpt_id,
59*32cad1ffSPhilippe Mathieu-Daudé                                         bool start, Error **errp);
60*32cad1ffSPhilippe Mathieu-Daudé bool iommufd_backend_get_dirty_bitmap(IOMMUFDBackend *be, uint32_t hwpt_id,
61*32cad1ffSPhilippe Mathieu-Daudé                                       uint64_t iova, ram_addr_t size,
62*32cad1ffSPhilippe Mathieu-Daudé                                       uint64_t page_size, uint64_t *data,
63*32cad1ffSPhilippe Mathieu-Daudé                                       Error **errp);
64*32cad1ffSPhilippe Mathieu-Daudé 
65*32cad1ffSPhilippe Mathieu-Daudé #define TYPE_HOST_IOMMU_DEVICE_IOMMUFD TYPE_HOST_IOMMU_DEVICE "-iommufd"
66*32cad1ffSPhilippe Mathieu-Daudé #endif
67