Retrieve PASID width from iommufd_backend_get_device_info() and store it in HostIOMMUDeviceCaps for later use. Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> Reviewed-by: Eric Auger <eric.auger@redhat.com> Tested-by: Zhangfei Gao <zhangfei.gao@linaro.org> Reviewed-by: Nicolin Chen <nicolinc@nvidia.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Tested-by: Eric Auger <eric.auger@redhat.com> Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com> Reviewed-by: Yi Liu <yi.l.liu@intel.com> Message-id: 20260126104342.253965-33-skolothumtho@nvidia.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
155 lines
5.7 KiB
C
155 lines
5.7 KiB
C
/*
|
|
* iommufd container backend declaration
|
|
*
|
|
* Copyright (C) 2024 Intel Corporation.
|
|
* Copyright Red Hat, Inc. 2024
|
|
*
|
|
* Authors: Yi Liu <yi.l.liu@intel.com>
|
|
* Eric Auger <eric.auger@redhat.com>
|
|
* Zhenzhong Duan <zhenzhong.duan@intel.com>
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
#ifndef SYSTEM_IOMMUFD_H
|
|
#define SYSTEM_IOMMUFD_H
|
|
|
|
#include "qom/object.h"
|
|
#include "exec/hwaddr.h"
|
|
#include "system/ram_addr.h"
|
|
#include "system/host_iommu_device.h"
|
|
|
|
#define TYPE_IOMMUFD_BACKEND "iommufd"
|
|
OBJECT_DECLARE_TYPE(IOMMUFDBackend, IOMMUFDBackendClass, IOMMUFD_BACKEND)
|
|
|
|
struct IOMMUFDBackendClass {
|
|
ObjectClass parent_class;
|
|
};
|
|
|
|
struct IOMMUFDBackend {
|
|
Object parent;
|
|
|
|
/*< protected >*/
|
|
int fd; /* /dev/iommu file descriptor */
|
|
bool owned; /* is the /dev/iommu opened internally */
|
|
Error *cpr_blocker;/* set if be does not support CPR */
|
|
uint32_t users;
|
|
|
|
/*< public >*/
|
|
};
|
|
|
|
/*
|
|
* Virtual IOMMU object that represents physical IOMMU's virtualization
|
|
* support
|
|
*/
|
|
typedef struct IOMMUFDViommu {
|
|
IOMMUFDBackend *iommufd;
|
|
uint32_t s2_hwpt_id; /* ID of stage 2 HWPT */
|
|
uint32_t viommu_id; /* virtual IOMMU ID of allocated object */
|
|
} IOMMUFDViommu;
|
|
|
|
/*
|
|
* Virtual device object for a physical device bind to a vIOMMU.
|
|
*/
|
|
typedef struct IOMMUFDVdev {
|
|
uint32_t vdevice_id; /* object handle for vDevice */
|
|
uint32_t virt_id; /* virtual device ID */
|
|
} IOMMUFDVdev;
|
|
|
|
bool iommufd_backend_connect(IOMMUFDBackend *be, Error **errp);
|
|
void iommufd_backend_disconnect(IOMMUFDBackend *be);
|
|
|
|
bool iommufd_backend_alloc_ioas(IOMMUFDBackend *be, uint32_t *ioas_id,
|
|
Error **errp);
|
|
void iommufd_backend_free_id(IOMMUFDBackend *be, uint32_t id);
|
|
int iommufd_backend_map_file_dma(IOMMUFDBackend *be, uint32_t ioas_id,
|
|
hwaddr iova, uint64_t size, int fd,
|
|
unsigned long start, bool readonly);
|
|
int iommufd_backend_map_dma(IOMMUFDBackend *be, uint32_t ioas_id, hwaddr iova,
|
|
uint64_t size, void *vaddr, bool readonly);
|
|
int iommufd_backend_unmap_dma(IOMMUFDBackend *be, uint32_t ioas_id,
|
|
hwaddr iova, uint64_t size);
|
|
bool iommufd_backend_get_device_info(IOMMUFDBackend *be, uint32_t devid,
|
|
uint32_t *type, void *data, uint32_t len,
|
|
uint64_t *caps, uint8_t *max_pasid_log2,
|
|
Error **errp);
|
|
bool iommufd_backend_alloc_hwpt(IOMMUFDBackend *be, uint32_t dev_id,
|
|
uint32_t pt_id, uint32_t flags,
|
|
uint32_t data_type, uint32_t data_len,
|
|
void *data_ptr, uint32_t *out_hwpt,
|
|
Error **errp);
|
|
bool iommufd_backend_alloc_viommu(IOMMUFDBackend *be, uint32_t dev_id,
|
|
uint32_t viommu_type, uint32_t hwpt_id,
|
|
uint32_t *out_hwpt, Error **errp);
|
|
|
|
bool iommufd_backend_alloc_vdev(IOMMUFDBackend *be, uint32_t dev_id,
|
|
uint32_t viommu_id, uint64_t virt_id,
|
|
uint32_t *out_vdev_id, Error **errp);
|
|
|
|
bool iommufd_backend_set_dirty_tracking(IOMMUFDBackend *be, uint32_t hwpt_id,
|
|
bool start, Error **errp);
|
|
bool iommufd_backend_get_dirty_bitmap(IOMMUFDBackend *be, uint32_t hwpt_id,
|
|
uint64_t iova, ram_addr_t size,
|
|
uint64_t page_size, uint64_t *data,
|
|
uint64_t flags, Error **errp);
|
|
bool iommufd_backend_invalidate_cache(IOMMUFDBackend *be, uint32_t id,
|
|
uint32_t data_type, uint32_t entry_len,
|
|
uint32_t *entry_num, void *data,
|
|
Error **errp);
|
|
|
|
bool iommufd_change_process_capable(IOMMUFDBackend *be);
|
|
bool iommufd_change_process(IOMMUFDBackend *be, Error **errp);
|
|
|
|
#define TYPE_HOST_IOMMU_DEVICE_IOMMUFD TYPE_HOST_IOMMU_DEVICE "-iommufd"
|
|
OBJECT_DECLARE_TYPE(HostIOMMUDeviceIOMMUFD, HostIOMMUDeviceIOMMUFDClass,
|
|
HOST_IOMMU_DEVICE_IOMMUFD)
|
|
|
|
/* Overload of the host IOMMU device for the iommufd backend */
|
|
struct HostIOMMUDeviceIOMMUFD {
|
|
HostIOMMUDevice parent_obj;
|
|
|
|
IOMMUFDBackend *iommufd;
|
|
uint32_t devid;
|
|
uint32_t hwpt_id;
|
|
};
|
|
|
|
struct HostIOMMUDeviceIOMMUFDClass {
|
|
HostIOMMUDeviceClass parent_class;
|
|
|
|
/**
|
|
* @attach_hwpt: attach host IOMMU device to IOMMUFD hardware page table.
|
|
* VFIO and VDPA device can have different implementation.
|
|
*
|
|
* Mandatory callback.
|
|
*
|
|
* @idev: host IOMMU device backed by IOMMUFD backend.
|
|
*
|
|
* @hwpt_id: ID of IOMMUFD hardware page table.
|
|
*
|
|
* @errp: pass an Error out when attachment fails.
|
|
*
|
|
* Returns: true on success, false on failure.
|
|
*/
|
|
bool (*attach_hwpt)(HostIOMMUDeviceIOMMUFD *idev, uint32_t hwpt_id,
|
|
Error **errp);
|
|
/**
|
|
* @detach_hwpt: detach host IOMMU device from IOMMUFD hardware page table.
|
|
* VFIO and VDPA device can have different implementation.
|
|
*
|
|
* Mandatory callback.
|
|
*
|
|
* @idev: host IOMMU device backed by IOMMUFD backend.
|
|
*
|
|
* @errp: pass an Error out when attachment fails.
|
|
*
|
|
* Returns: true on success, false on failure.
|
|
*/
|
|
bool (*detach_hwpt)(HostIOMMUDeviceIOMMUFD *idev, Error **errp);
|
|
};
|
|
|
|
bool host_iommu_device_iommufd_attach_hwpt(HostIOMMUDeviceIOMMUFD *idev,
|
|
uint32_t hwpt_id, Error **errp);
|
|
bool host_iommu_device_iommufd_detach_hwpt(HostIOMMUDeviceIOMMUFD *idev,
|
|
Error **errp);
|
|
#endif
|