META-DATA is used in GFX cmd submit, we have two
types of META-DATA now, one is legacy and the other
is for chained-ib-preemption, which is used in vulkan
UMD.

Change-Id: I17324905b4822a93fd3ffb3e8f86e544871b89ab
Signed-off-by: Monk Liu <monk....@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h |   1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c    |   8 +++
 drivers/gpu/drm/amd/amdgpu/vi.h          | 112 +++++++++++++++++++++++++++++++
 3 files changed, 121 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
index fa1d569..cf1c94b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
@@ -34,6 +34,7 @@ struct amdgpu_virt {
        uint32_t caps;
        struct amdgpu_bo *csa_obj;
        uint64_t csa_vmid0_addr;
+       bool chained_ib_support;
 };
 
 #define AMDGPU_CSA_SIZE    (8 * 1024)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index a9087f0..375784d 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -941,6 +941,14 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device 
*adev)
                goto out;
        cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data;
        adev->gfx.me_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);
+
+       /* chain ib ucode isn't formal released, use fake number 999 should be 
enough
+        * we need to change 999 to a correct value after chain ib preemption 
landed in
+        * formal ucode release
+        */
+       if (adev->gfx.me_fw_version > 999) {
+               adev->virt.chained_ib_support = true;
+       }
        adev->gfx.me_feature_version = 
le32_to_cpu(cp_hdr->ucode_feature_version);
 
        snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name);
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.h b/drivers/gpu/drm/amd/amdgpu/vi.h
index 575d7ae..719587b 100644
--- a/drivers/gpu/drm/amd/amdgpu/vi.h
+++ b/drivers/gpu/drm/amd/amdgpu/vi.h
@@ -28,4 +28,116 @@ void vi_srbm_select(struct amdgpu_device *adev,
                    u32 me, u32 pipe, u32 queue, u32 vmid);
 int vi_set_ip_blocks(struct amdgpu_device *adev);
 
+struct amdgpu_ce_ib_state
+{
+       uint32_t    ce_ib_completion_status;
+       uint32_t    ce_constegnine_count;
+       uint32_t    ce_ibOffset_ib1;
+       uint32_t    ce_ibOffset_ib2;
+}; /* Total of 4 DWORD */
+
+struct amdgpu_de_ib_state
+{
+       uint32_t    ib_completion_status;
+       uint32_t    de_constEngine_count;
+       uint32_t    ib_offset_ib1;
+       uint32_t    ib_offset_ib2;
+       uint32_t    preamble_begin_ib1;
+       uint32_t    preamble_begin_ib2;
+       uint32_t    preamble_end_ib1;
+       uint32_t    preamble_end_ib2;
+       uint32_t    draw_indirect_baseLo;
+       uint32_t    draw_indirect_baseHi;
+       uint32_t    disp_indirect_baseLo;
+       uint32_t    disp_indirect_baseHi;
+       uint32_t    gds_backup_addrlo;
+       uint32_t    gds_backup_addrhi;
+       uint32_t    index_base_addrlo;
+       uint32_t    index_base_addrhi;
+       uint32_t    sample_cntl;
+}; /* Total of 17 DWORD */
+
+struct amdgpu_ce_ib_state_chained_ib
+{
+       /* section of non chained ib part */
+       uint32_t    ce_ib_completion_status;
+       uint32_t    ce_constegnine_count;
+       uint32_t    ce_ibOffset_ib1;
+       uint32_t    ce_ibOffset_ib2;
+
+       /* section of chained ib */
+       uint32_t    ce_chainib_addrlo_ib1;
+       uint32_t    ce_chainib_addrlo_ib2;
+       uint32_t    ce_chainib_addrhi_ib1;
+       uint32_t    ce_chainib_addrhi_ib2;
+       uint32_t    ce_chainib_size_ib1;
+       uint32_t    ce_chainib_size_ib2;
+}; /* total 10 DWORD */
+
+struct amdgpu_de_ib_state_chained_ib
+{
+       /* section of non chained ib part */
+       uint32_t    ib_completion_status;
+       uint32_t    de_constEngine_count;
+       uint32_t    ib_offset_ib1;
+       uint32_t    ib_offset_ib2;
+
+       /* section of chained ib */
+       uint32_t    chain_ib_addrlo_ib1;
+       uint32_t    chain_ib_addrlo_ib2;
+       uint32_t    chain_ib_addrhi_ib1;
+       uint32_t    chain_ib_addrhi_ib2;
+       uint32_t    chain_ib_size_ib1;
+       uint32_t    chain_ib_size_ib2;
+
+       /* section of non chained ib part */
+       uint32_t    preamble_begin_ib1;
+       uint32_t    preamble_begin_ib2;
+       uint32_t    preamble_end_ib1;
+       uint32_t    preamble_end_ib2;
+
+       /* section of chained ib */
+       uint32_t    chain_ib_pream_addrlo_ib1;
+       uint32_t    chain_ib_pream_addrlo_ib2;
+       uint32_t    chain_ib_pream_addrhi_ib1;
+       uint32_t    chain_ib_pream_addrhi_ib2;
+
+       /* section of non chained ib part */
+       uint32_t    draw_indirect_baseLo;
+       uint32_t    draw_indirect_baseHi;
+       uint32_t    disp_indirect_baseLo;
+       uint32_t    disp_indirect_baseHi;
+       uint32_t    gds_backup_addrlo;
+       uint32_t    gds_backup_addrhi;
+       uint32_t    index_base_addrlo;
+       uint32_t    index_base_addrhi;
+       uint32_t    sample_cntl;
+}; /* Total of 27 DWORD */
+
+struct amdgpu_gfx_meta_data
+{
+       /* 4 DWORD, address must be 4KB aligned */
+       struct amdgpu_ce_ib_state    ce_payload;
+       uint32_t                     reserved1[60];
+       /* 17 DWORD, address must be 64B aligned */
+       struct amdgpu_de_ib_state    de_payload;
+       /* PFP IB base address which get pre-empted */
+       uint32_t                     DeIbBaseAddrLo;
+       uint32_t                     DeIbBaseAddrHi;
+       uint32_t                     reserved2[941];
+}; /* Total of 4K Bytes */
+
+struct amdgpu_gfx_meta_data_chained_ib
+{
+       /* 10 DWORD, address must be 4KB aligned */
+       struct amdgpu_ce_ib_state_chained_ib   ce_payload;
+       uint32_t                               reserved1[54];
+       /* 27 DWORD, address must be 64B aligned */
+       struct amdgpu_de_ib_state_chained_ib   de_payload;
+       /* PFP IB base address which get pre-empted */
+       uint32_t                               DeIbBaseAddrLo;
+       uint32_t                               DeIbBaseAddrHi;
+       uint32_t                               reserved2[931];
+}; /* Total of 4K Bytes */
+
 #endif
-- 
2.7.4

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to