root/drivers/gpu/drm/xe/xe_sriov_packet_types.h
/* SPDX-License-Identifier: MIT */
/*
 * Copyright © 2025 Intel Corporation
 */

#ifndef _XE_SRIOV_PACKET_TYPES_H_
#define _XE_SRIOV_PACKET_TYPES_H_

#include <linux/types.h>

/**
 * enum xe_sriov_packet_type - Xe SR-IOV VF migration data packet type
 * @XE_SRIOV_PACKET_TYPE_DESCRIPTOR: Descriptor with VF device metadata
 * @XE_SRIOV_PACKET_TYPE_TRAILER: Trailer indicating end-of-stream
 * @XE_SRIOV_PACKET_TYPE_GGTT: Global GTT migration data
 * @XE_SRIOV_PACKET_TYPE_MMIO: MMIO registers migration data
 * @XE_SRIOV_PACKET_TYPE_GUC: GuC firmware migration data
 * @XE_SRIOV_PACKET_TYPE_VRAM: VRAM migration data
 */
enum xe_sriov_packet_type {
        /* Skipping 0 to catch uninitialized data */
        XE_SRIOV_PACKET_TYPE_DESCRIPTOR = 1,
        XE_SRIOV_PACKET_TYPE_TRAILER,
        XE_SRIOV_PACKET_TYPE_GGTT,
        XE_SRIOV_PACKET_TYPE_MMIO,
        XE_SRIOV_PACKET_TYPE_GUC,
        XE_SRIOV_PACKET_TYPE_VRAM,
};

/**
 * struct xe_sriov_packet_hdr - Xe SR-IOV VF migration data packet header
 */
struct xe_sriov_packet_hdr {
        /** @version: migration data protocol version */
        u8 version;
        /** @type: migration data type */
        u8 type;
        /** @tile_id: migration data tile id */
        u8 tile_id;
        /** @gt_id: migration data gt id */
        u8 gt_id;
        /** @flags: migration data flags */
        u32 flags;
        /**
         * @offset: offset into the resource;
         * used when multiple packets of given type are used for migration
         */
        u64 offset;
        /** @size: migration data size  */
        u64 size;
} __packed;

/**
 * struct xe_sriov_packet - Xe SR-IOV VF migration data packet
 */
struct xe_sriov_packet {
        /** @xe: the PF &xe_device this data packet belongs to */
        struct xe_device *xe;
        /** @vaddr: CPU pointer to payload data */
        void *vaddr;
        /** @remaining: payload data remaining */
        size_t remaining;
        /** @hdr_remaining: header data remaining */
        size_t hdr_remaining;
        union {
                /** @bo: Buffer object with migration data */
                struct xe_bo *bo;
                /** @buff: Buffer with migration data */
                void *buff;
        };
        /** @hdr: data packet header */
        struct xe_sriov_packet_hdr hdr;
};

#endif