/*
 * Host IOMMU device abstract declaration
 *
 * Copyright (C) 2024 Intel Corporation.
 *
 * Authors: Zhenzhong Duan <zhenzhong.duan@intel.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2.  See
 * the COPYING file in the top-level directory.
 */

#ifndef HOST_IOMMU_DEVICE_H
#define HOST_IOMMU_DEVICE_H

#include "qom/object.h"
#include "qapi/error.h"
#ifdef CONFIG_LINUX
#include "linux/iommufd.h"

typedef union VendorCaps {
    struct iommu_hw_info_vtd vtd;
    struct iommu_hw_info_arm_smmuv3 smmuv3;
} VendorCaps;

/**
 * struct HostIOMMUDeviceCaps - Define host IOMMU device capabilities.
 *
 * @type: host platform IOMMU type.
 *
 * @hw_caps: host platform IOMMU capabilities (e.g. on IOMMUFD this represents
 *           the @out_capabilities value returned from IOMMU_GET_HW_INFO ioctl)
 *
 * @vendor_caps: host platform IOMMU vendor specific capabilities (e.g. on
 *               IOMMUFD this represents a user-space buffer filled by kernel
 *               with host IOMMU @type specific hardware information data)
 */
typedef struct HostIOMMUDeviceCaps {
    uint32_t type;
    uint64_t hw_caps;
    VendorCaps vendor_caps;
} HostIOMMUDeviceCaps;
#endif

#define TYPE_HOST_IOMMU_DEVICE "host-iommu-device"
OBJECT_DECLARE_TYPE(HostIOMMUDevice, HostIOMMUDeviceClass, HOST_IOMMU_DEVICE)

struct HostIOMMUDevice {
    Object parent_obj;

    char *name;
    void *agent; /* pointer to agent device, ie. VFIO or VDPA device */
    PCIBus *aliased_bus;
    int aliased_devfn;
#ifdef CONFIG_LINUX
    HostIOMMUDeviceCaps caps;
#endif
};

/**
 * struct HostIOMMUDeviceClass - The base class for all host IOMMU devices.
 *
 * Different types of host devices (e.g., VFIO or VDPA device) or devices
 * with different backend (e.g., VFIO legacy container or IOMMUFD backend)
 * will have different implementations of the HostIOMMUDeviceClass.
 */
struct HostIOMMUDeviceClass {
    ObjectClass parent_class;

    /**
     * @realize: initialize host IOMMU device instance further.
     *
     * Mandatory callback.
     *
     * @hiod: pointer to a host IOMMU device instance.
     *
     * @opaque: pointer to agent device of this host IOMMU device,
     *          e.g., VFIO base device or VDPA device.
     *
     * @errp: pass an Error out when realize fails.
     *
     * Returns: true on success, false on failure.
     */
    bool (*realize)(HostIOMMUDevice *hiod, void *opaque, Error **errp);
    /**
     * @get_cap: check if a host IOMMU device capability is supported.
     *
     * Optional callback, if not implemented, hint not supporting query
     * of @cap.
     *
     * @hiod: pointer to a host IOMMU device instance.
     *
     * @cap: capability to check.
     *
     * @errp: pass an Error out when fails to query capability.
     *
     * Returns: <0 on failure, 0 if a @cap is unsupported, or else
     * 1 or some positive value for some special @cap,
     * i.e., HOST_IOMMU_DEVICE_CAP_AW_BITS.
     */
    int (*get_cap)(HostIOMMUDevice *hiod, int cap, Error **errp);
    /**
     * @get_iova_ranges: Return the list of usable iova_ranges along with
     * @hiod Host IOMMU device
     *
     * @hiod: handle to the host IOMMU device
     */
    GList* (*get_iova_ranges)(HostIOMMUDevice *hiod);
    /**
     *
     * @get_page_size_mask: Return the page size mask supported along this
     * @hiod Host IOMMU device
     *
     * @hiod: handle to the host IOMMU device
     */
    uint64_t (*get_page_size_mask)(HostIOMMUDevice *hiod);
};

/*
 * Host IOMMU device capability list.
 */
#define HOST_IOMMU_DEVICE_CAP_IOMMU_TYPE        0
#define HOST_IOMMU_DEVICE_CAP_AW_BITS           1

#define HOST_IOMMU_DEVICE_CAP_AW_BITS_MAX       64
#endif
