]> Git Repo - linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
Merge tag 'renesas-dt-fixes-for-v4.15' of https://git.kernel.org/pub/scm/linux/kernel...
[linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_virt.h
index afcfb8bcfb65edda5e37def8ace207e0ded84ae1..b89d37fc406f4cea88ada380c84158ac6d4cef98 100644 (file)
@@ -36,6 +36,18 @@ struct amdgpu_mm_table {
        uint64_t                gpu_addr;
 };
 
+#define AMDGPU_VF_ERROR_ENTRY_SIZE    16
+
+/* struct error_entry - amdgpu VF error information. */
+struct amdgpu_vf_error_buffer {
+       struct mutex lock;
+       int read_count;
+       int write_count;
+       uint16_t code[AMDGPU_VF_ERROR_ENTRY_SIZE];
+       uint16_t flags[AMDGPU_VF_ERROR_ENTRY_SIZE];
+       uint64_t data[AMDGPU_VF_ERROR_ENTRY_SIZE];
+};
+
 /**
  * struct amdgpu_virt_ops - amdgpu device virt operations
  */
@@ -46,6 +58,179 @@ struct amdgpu_virt_ops {
        void (*trans_msg)(struct amdgpu_device *adev, u32 req, u32 data1, u32 data2, u32 data3);
 };
 
+/*
+ * Firmware Reserve Frame buffer
+ */
+struct amdgpu_virt_fw_reserve {
+       struct amdgim_pf2vf_info_header *p_pf2vf;
+       struct amdgim_vf2pf_info_header *p_vf2pf;
+       unsigned int checksum_key;
+};
+/*
+ * Defination between PF and VF
+ * Structures forcibly aligned to 4 to keep the same style as PF.
+ */
+#define AMDGIM_DATAEXCHANGE_OFFSET             (64 * 1024)
+
+#define AMDGIM_GET_STRUCTURE_RESERVED_SIZE(total, u8, u16, u32, u64) \
+               (total - (((u8)+3) / 4 + ((u16)+1) / 2 + (u32) + (u64)*2))
+
+enum AMDGIM_FEATURE_FLAG {
+       /* GIM supports feature of Error log collecting */
+       AMDGIM_FEATURE_ERROR_LOG_COLLECT = 0x1,
+       /* GIM supports feature of loading uCodes */
+       AMDGIM_FEATURE_GIM_LOAD_UCODES   = 0x2,
+};
+
+struct amdgim_pf2vf_info_header {
+       /* the total structure size in byte. */
+       uint32_t size;
+       /* version of this structure, written by the GIM */
+       uint32_t version;
+} __aligned(4);
+struct  amdgim_pf2vf_info_v1 {
+       /* header contains size and version */
+       struct amdgim_pf2vf_info_header header;
+       /* max_width * max_height */
+       unsigned int uvd_enc_max_pixels_count;
+       /* 16x16 pixels/sec, codec independent */
+       unsigned int uvd_enc_max_bandwidth;
+       /* max_width * max_height */
+       unsigned int vce_enc_max_pixels_count;
+       /* 16x16 pixels/sec, codec independent */
+       unsigned int vce_enc_max_bandwidth;
+       /* MEC FW position in kb from the start of visible frame buffer */
+       unsigned int mecfw_kboffset;
+       /* The features flags of the GIM driver supports. */
+       unsigned int feature_flags;
+       /* use private key from mailbox 2 to create chueksum */
+       unsigned int checksum;
+} __aligned(4);
+
+struct  amdgim_pf2vf_info_v2 {
+       /* header contains size and version */
+       struct amdgim_pf2vf_info_header header;
+       /* use private key from mailbox 2 to create chueksum */
+       uint32_t checksum;
+       /* The features flags of the GIM driver supports. */
+       uint32_t feature_flags;
+       /* max_width * max_height */
+       uint32_t uvd_enc_max_pixels_count;
+       /* 16x16 pixels/sec, codec independent */
+       uint32_t uvd_enc_max_bandwidth;
+       /* max_width * max_height */
+       uint32_t vce_enc_max_pixels_count;
+       /* 16x16 pixels/sec, codec independent */
+       uint32_t vce_enc_max_bandwidth;
+       /* MEC FW position in kb from the start of VF visible frame buffer */
+       uint64_t mecfw_kboffset;
+       /* MEC FW size in KB */
+       uint32_t mecfw_ksize;
+       /* UVD FW position in kb from the start of VF visible frame buffer */
+       uint64_t uvdfw_kboffset;
+       /* UVD FW size in KB */
+       uint32_t uvdfw_ksize;
+       /* VCE FW position in kb from the start of VF visible frame buffer */
+       uint64_t vcefw_kboffset;
+       /* VCE FW size in KB */
+       uint32_t vcefw_ksize;
+       uint32_t reserved[AMDGIM_GET_STRUCTURE_RESERVED_SIZE(256, 0, 0, (9 + sizeof(struct amdgim_pf2vf_info_header)/sizeof(uint32_t)), 3)];
+} __aligned(4);
+
+
+struct amdgim_vf2pf_info_header {
+       /* the total structure size in byte. */
+       uint32_t size;
+       /*version of this structure, written by the guest */
+       uint32_t version;
+} __aligned(4);
+
+struct amdgim_vf2pf_info_v1 {
+       /* header contains size and version */
+       struct amdgim_vf2pf_info_header header;
+       /* driver version */
+       char driver_version[64];
+       /* driver certification, 1=WHQL, 0=None */
+       unsigned int driver_cert;
+       /* guest OS type and version: need a define */
+       unsigned int os_info;
+       /* in the unit of 1M */
+       unsigned int fb_usage;
+       /* guest gfx engine usage percentage */
+       unsigned int gfx_usage;
+       /* guest gfx engine health percentage */
+       unsigned int gfx_health;
+       /* guest compute engine usage percentage */
+       unsigned int compute_usage;
+       /* guest compute engine health percentage */
+       unsigned int compute_health;
+       /* guest vce engine usage percentage. 0xffff means N/A. */
+       unsigned int vce_enc_usage;
+       /* guest vce engine health percentage. 0xffff means N/A. */
+       unsigned int vce_enc_health;
+       /* guest uvd engine usage percentage. 0xffff means N/A. */
+       unsigned int uvd_enc_usage;
+       /* guest uvd engine usage percentage. 0xffff means N/A. */
+       unsigned int uvd_enc_health;
+       unsigned int checksum;
+} __aligned(4);
+
+struct amdgim_vf2pf_info_v2 {
+       /* header contains size and version */
+       struct amdgim_vf2pf_info_header header;
+       uint32_t checksum;
+       /* driver version */
+       uint8_t driver_version[64];
+       /* driver certification, 1=WHQL, 0=None */
+       uint32_t driver_cert;
+       /* guest OS type and version: need a define */
+       uint32_t os_info;
+       /* in the unit of 1M */
+       uint32_t fb_usage;
+       /* guest gfx engine usage percentage */
+       uint32_t gfx_usage;
+       /* guest gfx engine health percentage */
+       uint32_t gfx_health;
+       /* guest compute engine usage percentage */
+       uint32_t compute_usage;
+       /* guest compute engine health percentage */
+       uint32_t compute_health;
+       /* guest vce engine usage percentage. 0xffff means N/A. */
+       uint32_t vce_enc_usage;
+       /* guest vce engine health percentage. 0xffff means N/A. */
+       uint32_t vce_enc_health;
+       /* guest uvd engine usage percentage. 0xffff means N/A. */
+       uint32_t uvd_enc_usage;
+       /* guest uvd engine usage percentage. 0xffff means N/A. */
+       uint32_t uvd_enc_health;
+       uint32_t reserved[AMDGIM_GET_STRUCTURE_RESERVED_SIZE(256, 64, 0, (12 + sizeof(struct amdgim_vf2pf_info_header)/sizeof(uint32_t)), 0)];
+} __aligned(4);
+
+#define AMDGPU_FW_VRAM_VF2PF_VER 2
+typedef struct amdgim_vf2pf_info_v2 amdgim_vf2pf_info ;
+
+#define AMDGPU_FW_VRAM_VF2PF_WRITE(adev, field, val) \
+       do { \
+               ((amdgim_vf2pf_info *)adev->virt.fw_reserve.p_vf2pf)->field = (val); \
+       } while (0)
+
+#define AMDGPU_FW_VRAM_VF2PF_READ(adev, field, val) \
+       do { \
+               (*val) = ((amdgim_vf2pf_info *)adev->virt.fw_reserve.p_vf2pf)->field; \
+       } while (0)
+
+#define AMDGPU_FW_VRAM_PF2VF_READ(adev, field, val) \
+       do { \
+               if (!adev->virt.fw_reserve.p_pf2vf) \
+                       *(val) = 0; \
+               else { \
+                       if (adev->virt.fw_reserve.p_pf2vf->version == 1) \
+                               *(val) = ((struct amdgim_pf2vf_info_v1 *)adev->virt.fw_reserve.p_pf2vf)->field; \
+                       if (adev->virt.fw_reserve.p_pf2vf->version == 2) \
+                               *(val) = ((struct amdgim_pf2vf_info_v2 *)adev->virt.fw_reserve.p_pf2vf)->field; \
+               } \
+       } while (0)
+
 /* GPU virtualization */
 struct amdgpu_virt {
        uint32_t                        caps;
@@ -59,6 +244,8 @@ struct amdgpu_virt {
        struct work_struct              flr_work;
        struct amdgpu_mm_table          mm_table;
        const struct amdgpu_virt_ops    *ops;
+       struct amdgpu_vf_error_buffer   vf_errors;
+       struct amdgpu_virt_fw_reserve   fw_reserve;
 };
 
 #define AMDGPU_CSA_SIZE    (8 * 1024)
@@ -101,5 +288,9 @@ int amdgpu_virt_reset_gpu(struct amdgpu_device *adev);
 int amdgpu_sriov_gpu_reset(struct amdgpu_device *adev, struct amdgpu_job *job);
 int amdgpu_virt_alloc_mm_table(struct amdgpu_device *adev);
 void amdgpu_virt_free_mm_table(struct amdgpu_device *adev);
+int amdgpu_virt_fw_reserve_get_checksum(void *obj, unsigned long obj_size,
+                                       unsigned int key,
+                                       unsigned int chksum);
+void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev);
 
 #endif
This page took 0.037475 seconds and 4 git commands to generate.