| /* |
| * Copyright 2014 Advanced Micro Devices, Inc. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included in |
| * all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| * OTHER DEALINGS IN THE SOFTWARE. |
| * |
| */ |
| |
| #include <linux/firmware.h> |
| #include <linux/module.h> |
| |
| #include "amdgpu.h" |
| #include "amdgpu_ih.h" |
| #include "amdgpu_gfx.h" |
| #include "cikd.h" |
| #include "cik.h" |
| #include "cik_structs.h" |
| #include "atom.h" |
| #include "amdgpu_ucode.h" |
| #include "clearstate_ci.h" |
| |
| #include "dce/dce_8_0_d.h" |
| #include "dce/dce_8_0_sh_mask.h" |
| |
| #include "bif/bif_4_1_d.h" |
| #include "bif/bif_4_1_sh_mask.h" |
| |
| #include "gca/gfx_7_0_d.h" |
| #include "gca/gfx_7_2_enum.h" |
| #include "gca/gfx_7_2_sh_mask.h" |
| |
| #include "gmc/gmc_7_0_d.h" |
| #include "gmc/gmc_7_0_sh_mask.h" |
| |
| #include "oss/oss_2_0_d.h" |
| #include "oss/oss_2_0_sh_mask.h" |
| |
| #define NUM_SIMD_PER_CU 0x4 /* missing from the gfx_7 IP headers */ |
| |
| #define GFX7_NUM_GFX_RINGS 1 |
| #define GFX7_MEC_HPD_SIZE 2048 |
| |
| static void gfx_v7_0_set_ring_funcs(struct amdgpu_device *adev); |
| static void gfx_v7_0_set_irq_funcs(struct amdgpu_device *adev); |
| static void gfx_v7_0_set_gds_init(struct amdgpu_device *adev); |
| |
| MODULE_FIRMWARE("amdgpu/bonaire_pfp.bin"); |
| MODULE_FIRMWARE("amdgpu/bonaire_me.bin"); |
| MODULE_FIRMWARE("amdgpu/bonaire_ce.bin"); |
| MODULE_FIRMWARE("amdgpu/bonaire_rlc.bin"); |
| MODULE_FIRMWARE("amdgpu/bonaire_mec.bin"); |
| |
| MODULE_FIRMWARE("amdgpu/hawaii_pfp.bin"); |
| MODULE_FIRMWARE("amdgpu/hawaii_me.bin"); |
| MODULE_FIRMWARE("amdgpu/hawaii_ce.bin"); |
| MODULE_FIRMWARE("amdgpu/hawaii_rlc.bin"); |
| MODULE_FIRMWARE("amdgpu/hawaii_mec.bin"); |
| |
| MODULE_FIRMWARE("amdgpu/kaveri_pfp.bin"); |
| MODULE_FIRMWARE("amdgpu/kaveri_me.bin"); |
| MODULE_FIRMWARE("amdgpu/kaveri_ce.bin"); |
| MODULE_FIRMWARE("amdgpu/kaveri_rlc.bin"); |
| MODULE_FIRMWARE("amdgpu/kaveri_mec.bin"); |
| MODULE_FIRMWARE("amdgpu/kaveri_mec2.bin"); |
| |
| MODULE_FIRMWARE("amdgpu/kabini_pfp.bin"); |
| MODULE_FIRMWARE("amdgpu/kabini_me.bin"); |
| MODULE_FIRMWARE("amdgpu/kabini_ce.bin"); |
| MODULE_FIRMWARE("amdgpu/kabini_rlc.bin"); |
| MODULE_FIRMWARE("amdgpu/kabini_mec.bin"); |
| |
| MODULE_FIRMWARE("amdgpu/mullins_pfp.bin"); |
| MODULE_FIRMWARE("amdgpu/mullins_me.bin"); |
| MODULE_FIRMWARE("amdgpu/mullins_ce.bin"); |
| MODULE_FIRMWARE("amdgpu/mullins_rlc.bin"); |
| MODULE_FIRMWARE("amdgpu/mullins_mec.bin"); |
| |
| static const struct amdgpu_gds_reg_offset amdgpu_gds_reg_offset[] = |
| { |
| {mmGDS_VMID0_BASE, mmGDS_VMID0_SIZE, mmGDS_GWS_VMID0, mmGDS_OA_VMID0}, |
| {mmGDS_VMID1_BASE, mmGDS_VMID1_SIZE, mmGDS_GWS_VMID1, mmGDS_OA_VMID1}, |
| {mmGDS_VMID2_BASE, mmGDS_VMID2_SIZE, mmGDS_GWS_VMID2, mmGDS_OA_VMID2}, |
| {mmGDS_VMID3_BASE, mmGDS_VMID3_SIZE, mmGDS_GWS_VMID3, mmGDS_OA_VMID3}, |
| {mmGDS_VMID4_BASE, mmGDS_VMID4_SIZE, mmGDS_GWS_VMID4, mmGDS_OA_VMID4}, |
| {mmGDS_VMID5_BASE, mmGDS_VMID5_SIZE, mmGDS_GWS_VMID5, mmGDS_OA_VMID5}, |
| {mmGDS_VMID6_BASE, mmGDS_VMID6_SIZE, mmGDS_GWS_VMID6, mmGDS_OA_VMID6}, |
| {mmGDS_VMID7_BASE, mmGDS_VMID7_SIZE, mmGDS_GWS_VMID7, mmGDS_OA_VMID7}, |
| {mmGDS_VMID8_BASE, mmGDS_VMID8_SIZE, mmGDS_GWS_VMID8, mmGDS_OA_VMID8}, |
| {mmGDS_VMID9_BASE, mmGDS_VMID9_SIZE, mmGDS_GWS_VMID9, mmGDS_OA_VMID9}, |
| {mmGDS_VMID10_BASE, mmGDS_VMID10_SIZE, mmGDS_GWS_VMID10, mmGDS_OA_VMID10}, |
| {mmGDS_VMID11_BASE, mmGDS_VMID11_SIZE, mmGDS_GWS_VMID11, mmGDS_OA_VMID11}, |
| {mmGDS_VMID12_BASE, mmGDS_VMID12_SIZE, mmGDS_GWS_VMID12, mmGDS_OA_VMID12}, |
| {mmGDS_VMID13_BASE, mmGDS_VMID13_SIZE, mmGDS_GWS_VMID13, mmGDS_OA_VMID13}, |
| {mmGDS_VMID14_BASE, mmGDS_VMID14_SIZE, mmGDS_GWS_VMID14, mmGDS_OA_VMID14}, |
| {mmGDS_VMID15_BASE, mmGDS_VMID15_SIZE, mmGDS_GWS_VMID15, mmGDS_OA_VMID15} |
| }; |
| |
| static const u32 spectre_rlc_save_restore_register_list[] = |
| { |
| (0x0e00 << 16) | (0xc12c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc140 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc150 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc15c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc168 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc170 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc178 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc204 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2b4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2b8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2bc >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2c0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8228 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x829c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x869c >> 2), |
| 0x00000000, |
| (0x0600 << 16) | (0x98f4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x98f8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x9900 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc260 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x90e8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3c000 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3c00c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8c1c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x9700 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xcd20 >> 2), |
| 0x00000000, |
| (0x4e00 << 16) | (0xcd20 >> 2), |
| 0x00000000, |
| (0x5e00 << 16) | (0xcd20 >> 2), |
| 0x00000000, |
| (0x6e00 << 16) | (0xcd20 >> 2), |
| 0x00000000, |
| (0x7e00 << 16) | (0xcd20 >> 2), |
| 0x00000000, |
| (0x8e00 << 16) | (0xcd20 >> 2), |
| 0x00000000, |
| (0x9e00 << 16) | (0xcd20 >> 2), |
| 0x00000000, |
| (0xae00 << 16) | (0xcd20 >> 2), |
| 0x00000000, |
| (0xbe00 << 16) | (0xcd20 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x89bc >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8900 >> 2), |
| 0x00000000, |
| 0x3, |
| (0x0e00 << 16) | (0xc130 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc134 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc1fc >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc208 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc264 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc268 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc26c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc270 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc274 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc278 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc27c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc280 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc284 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc288 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc28c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc290 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc294 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc298 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc29c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2a0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2a4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2a8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2ac >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2b0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x301d0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30238 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30250 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30254 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30258 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3025c >> 2), |
| 0x00000000, |
| (0x4e00 << 16) | (0xc900 >> 2), |
| 0x00000000, |
| (0x5e00 << 16) | (0xc900 >> 2), |
| 0x00000000, |
| (0x6e00 << 16) | (0xc900 >> 2), |
| 0x00000000, |
| (0x7e00 << 16) | (0xc900 >> 2), |
| 0x00000000, |
| (0x8e00 << 16) | (0xc900 >> 2), |
| 0x00000000, |
| (0x9e00 << 16) | (0xc900 >> 2), |
| 0x00000000, |
| (0xae00 << 16) | (0xc900 >> 2), |
| 0x00000000, |
| (0xbe00 << 16) | (0xc900 >> 2), |
| 0x00000000, |
| (0x4e00 << 16) | (0xc904 >> 2), |
| 0x00000000, |
| (0x5e00 << 16) | (0xc904 >> 2), |
| 0x00000000, |
| (0x6e00 << 16) | (0xc904 >> 2), |
| 0x00000000, |
| (0x7e00 << 16) | (0xc904 >> 2), |
| 0x00000000, |
| (0x8e00 << 16) | (0xc904 >> 2), |
| 0x00000000, |
| (0x9e00 << 16) | (0xc904 >> 2), |
| 0x00000000, |
| (0xae00 << 16) | (0xc904 >> 2), |
| 0x00000000, |
| (0xbe00 << 16) | (0xc904 >> 2), |
| 0x00000000, |
| (0x4e00 << 16) | (0xc908 >> 2), |
| 0x00000000, |
| (0x5e00 << 16) | (0xc908 >> 2), |
| 0x00000000, |
| (0x6e00 << 16) | (0xc908 >> 2), |
| 0x00000000, |
| (0x7e00 << 16) | (0xc908 >> 2), |
| 0x00000000, |
| (0x8e00 << 16) | (0xc908 >> 2), |
| 0x00000000, |
| (0x9e00 << 16) | (0xc908 >> 2), |
| 0x00000000, |
| (0xae00 << 16) | (0xc908 >> 2), |
| 0x00000000, |
| (0xbe00 << 16) | (0xc908 >> 2), |
| 0x00000000, |
| (0x4e00 << 16) | (0xc90c >> 2), |
| 0x00000000, |
| (0x5e00 << 16) | (0xc90c >> 2), |
| 0x00000000, |
| (0x6e00 << 16) | (0xc90c >> 2), |
| 0x00000000, |
| (0x7e00 << 16) | (0xc90c >> 2), |
| 0x00000000, |
| (0x8e00 << 16) | (0xc90c >> 2), |
| 0x00000000, |
| (0x9e00 << 16) | (0xc90c >> 2), |
| 0x00000000, |
| (0xae00 << 16) | (0xc90c >> 2), |
| 0x00000000, |
| (0xbe00 << 16) | (0xc90c >> 2), |
| 0x00000000, |
| (0x4e00 << 16) | (0xc910 >> 2), |
| 0x00000000, |
| (0x5e00 << 16) | (0xc910 >> 2), |
| 0x00000000, |
| (0x6e00 << 16) | (0xc910 >> 2), |
| 0x00000000, |
| (0x7e00 << 16) | (0xc910 >> 2), |
| 0x00000000, |
| (0x8e00 << 16) | (0xc910 >> 2), |
| 0x00000000, |
| (0x9e00 << 16) | (0xc910 >> 2), |
| 0x00000000, |
| (0xae00 << 16) | (0xc910 >> 2), |
| 0x00000000, |
| (0xbe00 << 16) | (0xc910 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc99c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x9834 >> 2), |
| 0x00000000, |
| (0x0000 << 16) | (0x30f00 >> 2), |
| 0x00000000, |
| (0x0001 << 16) | (0x30f00 >> 2), |
| 0x00000000, |
| (0x0000 << 16) | (0x30f04 >> 2), |
| 0x00000000, |
| (0x0001 << 16) | (0x30f04 >> 2), |
| 0x00000000, |
| (0x0000 << 16) | (0x30f08 >> 2), |
| 0x00000000, |
| (0x0001 << 16) | (0x30f08 >> 2), |
| 0x00000000, |
| (0x0000 << 16) | (0x30f0c >> 2), |
| 0x00000000, |
| (0x0001 << 16) | (0x30f0c >> 2), |
| 0x00000000, |
| (0x0600 << 16) | (0x9b7c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8a14 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8a18 >> 2), |
| 0x00000000, |
| (0x0600 << 16) | (0x30a00 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8bf0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8bcc >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8b24 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30a04 >> 2), |
| 0x00000000, |
| (0x0600 << 16) | (0x30a10 >> 2), |
| 0x00000000, |
| (0x0600 << 16) | (0x30a14 >> 2), |
| 0x00000000, |
| (0x0600 << 16) | (0x30a18 >> 2), |
| 0x00000000, |
| (0x0600 << 16) | (0x30a2c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc700 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc704 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc708 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc768 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc770 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc774 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc778 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc77c >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc780 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc784 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc788 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc78c >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc798 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc79c >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc7a0 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc7a4 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc7a8 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc7ac >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc7b0 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc7b4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x9100 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3c010 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x92a8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x92ac >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x92b4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x92b8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x92bc >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x92c0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x92c4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x92c8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x92cc >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x92d0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8c00 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8c04 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8c20 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8c38 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8c3c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xae00 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x9604 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac08 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac0c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac10 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac14 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac58 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac68 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac6c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac70 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac74 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac78 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac7c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac80 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac84 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac88 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac8c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x970c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x9714 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x9718 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x971c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x31068 >> 2), |
| 0x00000000, |
| (0x4e00 << 16) | (0x31068 >> 2), |
| 0x00000000, |
| (0x5e00 << 16) | (0x31068 >> 2), |
| 0x00000000, |
| (0x6e00 << 16) | (0x31068 >> 2), |
| 0x00000000, |
| (0x7e00 << 16) | (0x31068 >> 2), |
| 0x00000000, |
| (0x8e00 << 16) | (0x31068 >> 2), |
| 0x00000000, |
| (0x9e00 << 16) | (0x31068 >> 2), |
| 0x00000000, |
| (0xae00 << 16) | (0x31068 >> 2), |
| 0x00000000, |
| (0xbe00 << 16) | (0x31068 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xcd10 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xcd14 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88b0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88b4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88b8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88bc >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0x89c0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88c4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88c8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88d0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88d4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88d8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8980 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30938 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3093c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30940 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x89a0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30900 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30904 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x89b4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3c210 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3c214 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3c218 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8904 >> 2), |
| 0x00000000, |
| 0x5, |
| (0x0e00 << 16) | (0x8c28 >> 2), |
| (0x0e00 << 16) | (0x8c2c >> 2), |
| (0x0e00 << 16) | (0x8c30 >> 2), |
| (0x0e00 << 16) | (0x8c34 >> 2), |
| (0x0e00 << 16) | (0x9600 >> 2), |
| }; |
| |
| static const u32 kalindi_rlc_save_restore_register_list[] = |
| { |
| (0x0e00 << 16) | (0xc12c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc140 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc150 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc15c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc168 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc170 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc204 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2b4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2b8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2bc >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2c0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8228 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x829c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x869c >> 2), |
| 0x00000000, |
| (0x0600 << 16) | (0x98f4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x98f8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x9900 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc260 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x90e8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3c000 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3c00c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8c1c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x9700 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xcd20 >> 2), |
| 0x00000000, |
| (0x4e00 << 16) | (0xcd20 >> 2), |
| 0x00000000, |
| (0x5e00 << 16) | (0xcd20 >> 2), |
| 0x00000000, |
| (0x6e00 << 16) | (0xcd20 >> 2), |
| 0x00000000, |
| (0x7e00 << 16) | (0xcd20 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x89bc >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8900 >> 2), |
| 0x00000000, |
| 0x3, |
| (0x0e00 << 16) | (0xc130 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc134 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc1fc >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc208 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc264 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc268 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc26c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc270 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc274 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc28c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc290 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc294 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc298 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2a0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2a4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2a8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc2ac >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x301d0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30238 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30250 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30254 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30258 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3025c >> 2), |
| 0x00000000, |
| (0x4e00 << 16) | (0xc900 >> 2), |
| 0x00000000, |
| (0x5e00 << 16) | (0xc900 >> 2), |
| 0x00000000, |
| (0x6e00 << 16) | (0xc900 >> 2), |
| 0x00000000, |
| (0x7e00 << 16) | (0xc900 >> 2), |
| 0x00000000, |
| (0x4e00 << 16) | (0xc904 >> 2), |
| 0x00000000, |
| (0x5e00 << 16) | (0xc904 >> 2), |
| 0x00000000, |
| (0x6e00 << 16) | (0xc904 >> 2), |
| 0x00000000, |
| (0x7e00 << 16) | (0xc904 >> 2), |
| 0x00000000, |
| (0x4e00 << 16) | (0xc908 >> 2), |
| 0x00000000, |
| (0x5e00 << 16) | (0xc908 >> 2), |
| 0x00000000, |
| (0x6e00 << 16) | (0xc908 >> 2), |
| 0x00000000, |
| (0x7e00 << 16) | (0xc908 >> 2), |
| 0x00000000, |
| (0x4e00 << 16) | (0xc90c >> 2), |
| 0x00000000, |
| (0x5e00 << 16) | (0xc90c >> 2), |
| 0x00000000, |
| (0x6e00 << 16) | (0xc90c >> 2), |
| 0x00000000, |
| (0x7e00 << 16) | (0xc90c >> 2), |
| 0x00000000, |
| (0x4e00 << 16) | (0xc910 >> 2), |
| 0x00000000, |
| (0x5e00 << 16) | (0xc910 >> 2), |
| 0x00000000, |
| (0x6e00 << 16) | (0xc910 >> 2), |
| 0x00000000, |
| (0x7e00 << 16) | (0xc910 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc99c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x9834 >> 2), |
| 0x00000000, |
| (0x0000 << 16) | (0x30f00 >> 2), |
| 0x00000000, |
| (0x0000 << 16) | (0x30f04 >> 2), |
| 0x00000000, |
| (0x0000 << 16) | (0x30f08 >> 2), |
| 0x00000000, |
| (0x0000 << 16) | (0x30f0c >> 2), |
| 0x00000000, |
| (0x0600 << 16) | (0x9b7c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8a14 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8a18 >> 2), |
| 0x00000000, |
| (0x0600 << 16) | (0x30a00 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8bf0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8bcc >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8b24 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30a04 >> 2), |
| 0x00000000, |
| (0x0600 << 16) | (0x30a10 >> 2), |
| 0x00000000, |
| (0x0600 << 16) | (0x30a14 >> 2), |
| 0x00000000, |
| (0x0600 << 16) | (0x30a18 >> 2), |
| 0x00000000, |
| (0x0600 << 16) | (0x30a2c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc700 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc704 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc708 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xc768 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc770 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc774 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc798 >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0xc79c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x9100 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3c010 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8c00 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8c04 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8c20 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8c38 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8c3c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xae00 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x9604 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac08 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac0c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac10 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac14 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac58 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac68 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac6c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac70 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac74 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac78 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac7c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac80 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac84 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac88 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xac8c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x970c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x9714 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x9718 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x971c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x31068 >> 2), |
| 0x00000000, |
| (0x4e00 << 16) | (0x31068 >> 2), |
| 0x00000000, |
| (0x5e00 << 16) | (0x31068 >> 2), |
| 0x00000000, |
| (0x6e00 << 16) | (0x31068 >> 2), |
| 0x00000000, |
| (0x7e00 << 16) | (0x31068 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xcd10 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0xcd14 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88b0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88b4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88b8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88bc >> 2), |
| 0x00000000, |
| (0x0400 << 16) | (0x89c0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88c4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88c8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88d0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88d4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x88d8 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8980 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30938 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3093c >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30940 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x89a0 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30900 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x30904 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x89b4 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3e1fc >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3c210 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3c214 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x3c218 >> 2), |
| 0x00000000, |
| (0x0e00 << 16) | (0x8904 >> 2), |
| 0x00000000, |
| 0x5, |
| (0x0e00 << 16) | (0x8c28 >> 2), |
| (0x0e00 << 16) | (0x8c2c >> 2), |
| (0x0e00 << 16) | (0x8c30 >> 2), |
| (0x0e00 << 16) | (0x8c34 >> 2), |
| (0x0e00 << 16) | (0x9600 >> 2), |
| }; |
| |
| static u32 gfx_v7_0_get_csb_size(struct amdgpu_device *adev); |
| static void gfx_v7_0_get_csb_buffer(struct amdgpu_device *adev, volatile u32 *buffer); |
| static void gfx_v7_0_init_pg(struct amdgpu_device *adev); |
| static void gfx_v7_0_get_cu_info(struct amdgpu_device *adev); |
| |
| /* |
| * Core functions |
| */ |
| /** |
| * gfx_v7_0_init_microcode - load ucode images from disk |
| * |
| * @adev: amdgpu_device pointer |
| * |
| * Use the firmware interface to load the ucode images into |
| * the driver (not loaded into hw). |
| * Returns 0 on success, error on failure. |
| */ |
| static int gfx_v7_0_init_microcode(struct amdgpu_device *adev) |
| { |
| const char *chip_name; |
| char fw_name[30]; |
| int err; |
| |
| DRM_DEBUG("\n"); |
| |
| switch (adev->asic_type) { |
| case CHIP_BONAIRE: |
| chip_name = "bonaire"; |
| break; |
| case CHIP_HAWAII: |
| chip_name = "hawaii"; |
| break; |
| case CHIP_KAVERI: |
| chip_name = "kaveri"; |
| break; |
| case CHIP_KABINI: |
| chip_name = "kabini"; |
| break; |
| case CHIP_MULLINS: |
| chip_name = "mullins"; |
| break; |
| default: BUG(); |
| } |
| |
| snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_pfp.bin", chip_name); |
| err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev); |
| if (err) |
| goto out; |
| err = amdgpu_ucode_validate(adev->gfx.pfp_fw); |
| if (err) |
| goto out; |
| |
| snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name); |
| err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev); |
| if (err) |
| goto out; |
| err = amdgpu_ucode_validate(adev->gfx.me_fw); |
| if (err) |
| goto out; |
| |
| snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name); |
| err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev); |
| if (err) |
| goto out; |
| err = amdgpu_ucode_validate(adev->gfx.ce_fw); |
| if (err) |
| goto out; |
| |
| snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name); |
| err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev); |
| if (err) |
| goto out; |
| err = amdgpu_ucode_validate(adev->gfx.mec_fw); |
| if (err) |
| goto out; |
| |
| if (adev->asic_type == CHIP_KAVERI) { |
| snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name); |
| err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev); |
| if (err) |
| goto out; |
| err = amdgpu_ucode_validate(adev->gfx.mec2_fw); |
| if (err) |
| goto out; |
| } |
| |
| snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); |
| err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); |
| if (err) |
| goto out; |
| err = amdgpu_ucode_validate(adev->gfx.rlc_fw); |
| |
| out: |
| if (err) { |
| pr_err("gfx7: Failed to load firmware \"%s\"\n", fw_name); |
| release_firmware(adev->gfx.pfp_fw); |
| adev->gfx.pfp_fw = NULL; |
| release_firmware(adev->gfx.me_fw); |
| adev->gfx.me_fw = NULL; |
| release_firmware(adev->gfx.ce_fw); |
| adev->gfx.ce_fw = NULL; |
| release_firmware(adev->gfx.mec_fw); |
| adev->gfx.mec_fw = NULL; |
| release_firmware(adev->gfx.mec2_fw); |
| adev->gfx.mec2_fw = NULL; |
| release_firmware(adev->gfx.rlc_fw); |
| adev->gfx.rlc_fw = NULL; |
| } |
| return err; |
| } |
| |
| static void gfx_v7_0_free_microcode(struct amdgpu_device *adev) |
| { |
| release_firmware(adev->gfx.pfp_fw); |
| adev->gfx.pfp_fw = NULL; |
| release_firmware(adev->gfx.me_fw); |
| adev->gfx.me_fw = NULL; |
| release_firmware(adev->gfx.ce_fw); |
| adev->gfx.ce_fw = NULL; |
| release_firmware(adev->gfx.mec_fw); |
| adev->gfx.mec_fw = NULL; |
| release_firmware(adev->gfx.mec2_fw); |
| adev->gfx.mec2_fw = NULL; |
| release_firmware(adev->gfx.rlc_fw); |
| adev->gfx.rlc_fw = NULL; |
| } |
| |
| /** |
| * gfx_v7_0_tiling_mode_table_init - init the hw tiling table |
| * |
| * @adev: amdgpu_device pointer |
| * |
| * Starting with SI, the tiling setup is done globally in a |
| * set of 32 tiling modes. Rather than selecting each set of |
| * parameters per surface as on older asics, we just select |
| * which index in the tiling table we want to use, and the |
| * surface uses those parameters (CIK). |
| */ |
| static void gfx_v7_0_tiling_mode_table_init(struct amdgpu_device *adev) |
| { |
| const u32 num_tile_mode_states = |
| ARRAY_SIZE(adev->gfx.config.tile_mode_array); |
| const u32 num_secondary_tile_mode_states = |
| ARRAY_SIZE(adev->gfx.config.macrotile_mode_array); |
| u32 reg_offset, split_equal_to_row_size; |
| uint32_t *tile, *macrotile; |
| |
| tile = adev->gfx.config.tile_mode_array; |
| macrotile = adev->gfx.config.macrotile_mode_array; |
| |
| switch (adev->gfx.config.mem_row_size_in_kb) { |
| case 1: |
| split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_1KB; |
| break; |
| case 2: |
| default: |
| split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_2KB; |
| break; |
| case 4: |
| split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_4KB; |
| break; |
| } |
| |
| for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) |
| tile[reg_offset] = 0; |
| for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) |
| macrotile[reg_offset] = 0; |
| |
| switch (adev->asic_type) { |
| case CHIP_BONAIRE: |
| tile[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING)); |
| tile[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING)); |
| tile[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING)); |
| tile[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING)); |
| tile[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) | |
| TILE_SPLIT(split_equal_to_row_size)); |
| tile[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING)); |
| tile[6] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) | |
| TILE_SPLIT(split_equal_to_row_size)); |
| tile[7] = (TILE_SPLIT(split_equal_to_row_size)); |
| tile[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16)); |
| tile[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING)); |
| tile[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); |
| tile[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8)); |
| tile[12] = (TILE_SPLIT(split_equal_to_row_size)); |
| tile[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING)); |
| tile[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); |
| tile[15] = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); |
| tile[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8)); |
| tile[17] = (TILE_SPLIT(split_equal_to_row_size)); |
| tile[18] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[19] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING)); |
| tile[20] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[21] = (ARRAY_MODE(ARRAY_3D_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[22] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[23] = (TILE_SPLIT(split_equal_to_row_size)); |
| tile[24] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[25] = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[26] = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING)); |
| tile[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); |
| tile[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8)); |
| tile[30] = (TILE_SPLIT(split_equal_to_row_size)); |
| |
| macrotile[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_8_BANK)); |
| macrotile[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | |
| NUM_BANKS(ADDR_SURF_4_BANK)); |
| macrotile[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_8_BANK)); |
| macrotile[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | |
| NUM_BANKS(ADDR_SURF_4_BANK)); |
| |
| for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) |
| WREG32(mmGB_TILE_MODE0 + reg_offset, tile[reg_offset]); |
| for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) |
| if (reg_offset != 7) |
| WREG32(mmGB_MACROTILE_MODE0 + reg_offset, macrotile[reg_offset]); |
| break; |
| case CHIP_HAWAII: |
| tile[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING)); |
| tile[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING)); |
| tile[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING)); |
| tile[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING)); |
| tile[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) | |
| TILE_SPLIT(split_equal_to_row_size)); |
| tile[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) | |
| TILE_SPLIT(split_equal_to_row_size)); |
| tile[6] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) | |
| TILE_SPLIT(split_equal_to_row_size)); |
| tile[7] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) | |
| TILE_SPLIT(split_equal_to_row_size)); |
| tile[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16)); |
| tile[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING)); |
| tile[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); |
| tile[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8)); |
| tile[12] = (ARRAY_MODE(ARRAY_PRT_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8)); |
| tile[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING)); |
| tile[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); |
| tile[15] = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); |
| tile[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8)); |
| tile[17] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8)); |
| tile[18] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[19] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING)); |
| tile[20] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[21] = (ARRAY_MODE(ARRAY_3D_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[22] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[23] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[24] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[25] = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[26] = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING)); |
| tile[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); |
| tile[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P16_32x32_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8)); |
| tile[30] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P4_16x16) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8)); |
| |
| macrotile[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | |
| NUM_BANKS(ADDR_SURF_8_BANK)); |
| macrotile[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | |
| NUM_BANKS(ADDR_SURF_4_BANK)); |
| macrotile[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | |
| NUM_BANKS(ADDR_SURF_4_BANK)); |
| macrotile[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | |
| NUM_BANKS(ADDR_SURF_8_BANK)); |
| macrotile[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_8_BANK)); |
| macrotile[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) | |
| NUM_BANKS(ADDR_SURF_4_BANK)); |
| |
| for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) |
| WREG32(mmGB_TILE_MODE0 + reg_offset, tile[reg_offset]); |
| for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) |
| if (reg_offset != 7) |
| WREG32(mmGB_MACROTILE_MODE0 + reg_offset, macrotile[reg_offset]); |
| break; |
| case CHIP_KABINI: |
| case CHIP_KAVERI: |
| case CHIP_MULLINS: |
| default: |
| tile[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING)); |
| tile[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING)); |
| tile[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING)); |
| tile[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING)); |
| tile[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) | |
| TILE_SPLIT(split_equal_to_row_size)); |
| tile[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING)); |
| tile[6] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING) | |
| TILE_SPLIT(split_equal_to_row_size)); |
| tile[7] = (TILE_SPLIT(split_equal_to_row_size)); |
| tile[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) | |
| PIPE_CONFIG(ADDR_SURF_P2)); |
| tile[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING)); |
| tile[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); |
| tile[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8)); |
| tile[12] = (TILE_SPLIT(split_equal_to_row_size)); |
| tile[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING)); |
| tile[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); |
| tile[15] = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); |
| tile[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8)); |
| tile[17] = (TILE_SPLIT(split_equal_to_row_size)); |
| tile[18] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[19] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING)); |
| tile[20] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[21] = (ARRAY_MODE(ARRAY_3D_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[22] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[23] = (TILE_SPLIT(split_equal_to_row_size)); |
| tile[24] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[25] = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[26] = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1)); |
| tile[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING)); |
| tile[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2)); |
| tile[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) | |
| PIPE_CONFIG(ADDR_SURF_P2) | |
| MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) | |
| SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8)); |
| tile[30] = (TILE_SPLIT(split_equal_to_row_size)); |
| |
| macrotile[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) | |
| NUM_BANKS(ADDR_SURF_8_BANK)); |
| macrotile[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) | |
| NUM_BANKS(ADDR_SURF_8_BANK)); |
| macrotile[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_8_BANK)); |
| macrotile[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_8_BANK)); |
| macrotile[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_8_BANK)); |
| macrotile[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_8_BANK)); |
| macrotile[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_8_BANK)); |
| macrotile[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_4) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) | |
| NUM_BANKS(ADDR_SURF_16_BANK)); |
| macrotile[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
| BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
| MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
| NUM_BANKS(ADDR_SURF_8_BANK)); |
| |
| for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) |
| WREG32(mmGB_TILE_MODE0 + reg_offset, tile[reg_offset]); |
| for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++) |
| if (reg_offset != 7) |
| WREG32(mmGB_MACROTILE_MODE0 + reg_offset, macrotile[reg_offset]); |
| break; |
| } |
| } |
| |
| /** |
| * gfx_v7_0_select_se_sh - select which SE, SH to address |
| * |
| * @adev: amdgpu_device pointer |
| * @se_num: shader engine to address |
| * @sh_num: sh block to address |
| * |
| * Select which SE, SH combinations to address. Certain |
| * registers are instanced per SE or SH. 0xffffffff means |
| * broadcast to all SEs or SHs (CIK). |
| */ |
| static void gfx_v7_0_select_se_sh(struct amdgpu_device *adev, |
| u32 se_num, u32 sh_num, u32 instance) |
| { |
| u32 data; |
| |
| if (instance == 0xffffffff) |
| data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES, 1); |
| else |
| data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_INDEX, instance); |
| |
| if ((se_num == 0xffffffff) && (sh_num == 0xffffffff)) |
| data |= GRBM_GFX_INDEX__SH_BROADCAST_WRITES_MASK | |
| GRBM_GFX_INDEX__SE_BROADCAST_WRITES_MASK; |
| else if (se_num == 0xffffffff) |
| data |= GRBM_GFX_INDEX__SE_BROADCAST_WRITES_MASK | |
| (sh_num << GRBM_GFX_INDEX__SH_INDEX__SHIFT); |
| else if (sh_num == 0xffffffff) |
| data |= GRBM_GFX_INDEX__SH_BROADCAST_WRITES_MASK | |
| (se_num << GRBM_GFX_INDEX__SE_INDEX__SHIFT); |
| else |
| data |= (sh_num << GRBM_GFX_INDEX__SH_INDEX__SHIFT) | |
| (se_num << GRBM_GFX_INDEX__SE_INDEX__SHIFT); |
| WREG32(mmGRBM_GFX_INDEX, data); |
| } |
| |
| /** |
| * gfx_v7_0_get_rb_active_bitmap - computes the mask of enabled RBs |
| * |
| * @adev: amdgpu_device pointer |
| * |
| * Calculates the bitmask of enabled RBs (CIK). |
| * Returns the enabled RB bitmask. |
| */ |
| static u32 gfx_v7_0_get_rb_active_bitmap(struct amdgpu_device *adev) |
| { |
| u32 data, mask; |
| |
| data = RREG32(mmCC_RB_BACKEND_DISABLE); |
| data |= RREG32(mmGC_USER_RB_BACKEND_DISABLE); |
| |
| data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK; |
| data >>= GC_USER_RB_BACKEND_DISABLE__BACKEND_DISABLE__SHIFT; |
| |
| mask = amdgpu_gfx_create_bitmask(adev->gfx.config.max_backends_per_se / |
| adev->gfx.config.max_sh_per_se); |
| |
| return (~data) & mask; |
| } |
| |
| static void |
| gfx_v7_0_raster_config(struct amdgpu_device *adev, u32 *rconf, u32 *rconf1) |
| { |
| switch (adev->asic_type) { |
| case CHIP_BONAIRE: |
| *rconf |= RB_MAP_PKR0(2) | RB_XSEL2(1) | SE_MAP(2) | |
| SE_XSEL(1) | SE_YSEL(1); |
| *rconf1 |= 0x0; |
| break; |
| case CHIP_HAWAII: |
| *rconf |= RB_MAP_PKR0(2) | RB_MAP_PKR1(2) | |
| RB_XSEL2(1) | PKR_MAP(2) | PKR_XSEL(1) | |
| PKR_YSEL(1) | SE_MAP(2) | SE_XSEL(2) | |
| SE_YSEL(3); |
| *rconf1 |= SE_PAIR_MAP(2) | SE_PAIR_XSEL(3) | |
| SE_PAIR_YSEL(2); |
| break; |
| case CHIP_KAVERI: |
| *rconf |= RB_MAP_PKR0(2); |
| *rconf1 |= 0x0; |
| break; |
| case CHIP_KABINI: |
| case CHIP_MULLINS: |
| *rconf |= 0x0; |
| *rconf1 |= 0x0; |
| break; |
| default: |
| DRM_ERROR("unknown asic: 0x%x\n", adev->asic_type); |
| break; |
| } |
| } |
| |
| static void |
| gfx_v7_0_write_harvested_raster_configs(struct amdgpu_device *adev, |
| u32 raster_config, u32 raster_config_1, |
| unsigned rb_mask, unsigned num_rb) |
| { |
| unsigned sh_per_se = max_t(unsigned, adev->gfx.config.max_sh_per_se, 1); |
| unsigned num_se = max_t(unsigned, adev->gfx.config.max_shader_engines, 1); |
| unsigned rb_per_pkr = min_t(unsigned, num_rb / num_se / sh_per_se, 2); |
| unsigned rb_per_se = num_rb / num_se; |
| unsigned se_mask[4]; |
| unsigned se; |
| |
| se_mask[0] = ((1 << rb_per_se) - 1) & rb_mask; |
| se_mask[1] = (se_mask[0] << rb_per_se) & rb_mask; |
| se_mask[2] = (se_mask[1] << rb_per_se) & rb_mask; |
| se_mask[3] = (se_mask[2] << rb_per_se) & rb_mask; |
| |
| WARN_ON(!(num_se == 1 || num_se == 2 || num_se == 4)); |
| WARN_ON(!(sh_per_se == 1 || sh_per_se == 2)); |
| WARN_ON(!(rb_per_pkr == 1 || rb_per_pkr == 2)); |
| |
| if ((num_se > 2) && ((!se_mask[0] && !se_mask[1]) || |
| (!se_mask[2] && !se_mask[3]))) { |
| raster_config_1 &= ~SE_PAIR_MAP_MASK; |
| |
| if (!se_mask[0] && !se_mask[1]) { |
| raster_config_1 |= |
| SE_PAIR_MAP(RASTER_CONFIG_SE_PAIR_MAP_3); |
| } else { |
| raster_config_1 |= |
| SE_PAIR_MAP(RASTER_CONFIG_SE_PAIR_MAP_0); |
| } |
| } |
| |
| for (se = 0; se < num_se; se++) { |
| unsigned raster_config_se = raster_config; |
| unsigned pkr0_mask = ((1 << rb_per_pkr) - 1) << (se * rb_per_se); |
| unsigned pkr1_mask = pkr0_mask << rb_per_pkr; |
| int idx = (se / 2) * 2; |
| |
| if ((num_se > 1) && (!se_mask[idx] || !se_mask[idx + 1])) { |
| raster_config_se &= ~SE_MAP_MASK; |
| |
| if (!se_mask[idx]) { |
| raster_config_se |= SE_MAP(RASTER_CONFIG_SE_MAP_3); |
| } else { |
| raster_config_se |= SE_MAP(RASTER_CONFIG_SE_MAP_0); |
| } |
| } |
| |
| pkr0_mask &= rb_mask; |
| pkr1_mask &= rb_mask; |
| if (rb_per_se > 2 && (!pkr0_mask || !pkr1_mask)) { |
| raster_config_se &= ~PKR_MAP_MASK; |
| |
| if (!pkr0_mask) { |
| raster_config_se |= PKR_MAP(RASTER_CONFIG_PKR_MAP_3); |
| } else { |
| raster_config_se |= PKR_MAP(RASTER_CONFIG_PKR_MAP_0); |
| } |
| } |
| |
| if (rb_per_se >= 2) { |
| unsigned rb0_mask = 1 << (se * rb_per_se); |
| unsigned rb1_mask = rb0_mask << 1; |
| |
| rb0_mask &= rb_mask; |
| rb1_mask &= rb_mask; |
| if (!rb0_mask || !rb1_mask) { |
| raster_config_se &= ~RB_MAP_PKR0_MASK; |
| |
| if (!rb0_mask) { |
| raster_config_se |= |
| RB_MAP_PKR0(RASTER_CONFIG_RB_MAP_3); |
| } else { |
| raster_config_se |= |
| RB_MAP_PKR0(RASTER_CONFIG_RB_MAP_0); |
| } |
| } |
| |
| if (rb_per_se > 2) { |
| rb0_mask = 1 << (se * rb_per_se + rb_per_pkr); |
| rb1_mask = rb0_mask << 1; |
| rb0_mask &= rb_mask; |
| rb1_mask &= rb_mask; |
| if (!rb0_mask || !rb1_mask) { |
| raster_config_se &= ~RB_MAP_PKR1_MASK; |
| |
| if (!rb0_mask) { |
| raster_config_se |= |
| RB_MAP_PKR1(RASTER_CONFIG_RB_MAP_3); |
| } else { |
| raster_config_se |= |
| RB_MAP_PKR1(RASTER_CONFIG_RB_MAP_0); |
| } |
| } |
| } |
| } |
| |
| /* GRBM_GFX_INDEX has a different offset on CI+ */ |
| gfx_v7_0_select_se_sh(adev, se, 0xffffffff, 0xffffffff); |
| WREG32(mmPA_SC_RASTER_CONFIG, raster_config_se); |
| WREG32(mmPA_SC_RASTER_CONFIG_1, raster_config_1); |
| } |
| |
| /* GRBM_GFX_INDEX has a different offset on CI+ */ |
| gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); |
| } |
| |
| /** |
| * gfx_v7_0_setup_rb - setup the RBs on the asic |
| * |
| * @adev: amdgpu_device pointer |
| * @se_num: number of SEs (shader engines) for the asic |
| * @sh_per_se: number of SH blocks per SE for the asic |
| * |
| * Configures per-SE/SH RB registers (CIK). |
| */ |
| static void gfx_v7_0_setup_rb(struct amdgpu_device *adev) |
| { |
| int i, j; |
| u32 data; |
| u32 raster_config = 0, raster_config_1 = 0; |
| u32 active_rbs = 0; |
| u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se / |
| adev->gfx.config.max_sh_per_se; |
| unsigned num_rb_pipes; |
| |
| mutex_lock(&adev->grbm_idx_mutex); |
| for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { |
| for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { |
| gfx_v7_0_select_se_sh(adev, i, j, 0xffffffff); |
| data = gfx_v7_0_get_rb_active_bitmap(adev); |
| active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) * |
| rb_bitmap_width_per_sh); |
| } |
| } |
| gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); |
| |
| adev->gfx.config.backend_enable_mask = active_rbs; |
| adev->gfx.config.num_rbs = hweight32(active_rbs); |
| |
| num_rb_pipes = min_t(unsigned, adev->gfx.config.max_backends_per_se * |
| adev->gfx.config.max_shader_engines, 16); |
| |
| gfx_v7_0_raster_config(adev, &raster_config, &raster_config_1); |
| |
| if (!adev->gfx.config.backend_enable_mask || |
| adev->gfx.config.num_rbs >= num_rb_pipes) { |
| WREG32(mmPA_SC_RASTER_CONFIG, raster_config); |
| WREG32(mmPA_SC_RASTER_CONFIG_1, raster_config_1); |
| } else { |
| gfx_v7_0_write_harvested_raster_configs(adev, raster_config, raster_config_1, |
| adev->gfx.config.backend_enable_mask, |
| num_rb_pipes); |
| } |
| |
| /* cache the values for userspace */ |
| for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { |
| for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { |
| gfx_v7_0_select_se_sh(adev, i, j, 0xffffffff); |
| adev->gfx.config.rb_config[i][j].rb_backend_disable = |
| RREG32(mmCC_RB_BACKEND_DISABLE); |
| adev->gfx.config.rb_config[i][j].user_rb_backend_disable = |
| RREG32(mmGC_USER_RB_BACKEND_DISABLE); |
| adev->gfx.config.rb_config[i][j].raster_config = |
| RREG32(mmPA_SC_RASTER_CONFIG); |
| adev->gfx.config.rb_config[i][j].raster_config_1 = |
| RREG32(mmPA_SC_RASTER_CONFIG_1); |
| } |
| } |
| gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); |
| mutex_unlock(&adev->grbm_idx_mutex); |
| } |
| |
| /** |
| * gfx_v7_0_init_compute_vmid - gart enable |
| * |
| * @adev: amdgpu_device pointer |
| * |
| * Initialize compute vmid sh_mem registers |
| * |
| */ |
| #define DEFAULT_SH_MEM_BASES (0x6000) |
| #define FIRST_COMPUTE_VMID (8) |
| #define LAST_COMPUTE_VMID (16) |
| static void gfx_v7_0_init_compute_vmid(struct amdgpu_device *adev) |
| { |
| int i; |
| uint32_t sh_mem_config; |
| uint32_t sh_mem_bases; |
| |
| /* |
| * Configure apertures: |
| * LDS: 0x60000000'00000000 - 0x60000001'00000000 (4GB) |
| * Scratch: 0x60000001'00000000 - 0x60000002'00000000 (4GB) |
| * GPUVM: 0x60010000'00000000 - 0x60020000'00000000 (1TB) |
| */ |
| sh_mem_bases = DEFAULT_SH_MEM_BASES | (DEFAULT_SH_MEM_BASES << 16); |
| sh_mem_config = SH_MEM_ALIGNMENT_MODE_UNALIGNED << |
| SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT; |
| sh_mem_config |= MTYPE_NONCACHED << SH_MEM_CONFIG__DEFAULT_MTYPE__SHIFT; |
| mutex_lock(&adev->srbm_mutex); |
| for (i = FIRST_COMPUTE_VMID; i < LAST_COMPUTE_VMID; i++) { |
| cik_srbm_select(adev, 0, 0, 0, i); |
| /* CP and shaders */ |
| WREG32(mmSH_MEM_CONFIG, sh_mem_config); |
| WREG32(mmSH_MEM_APE1_BASE, 1); |
| WREG32(mmSH_MEM_APE1_LIMIT, 0); |
| WREG32(mmSH_MEM_BASES, sh_mem_bases); |
| } |
| cik_srbm_select(adev, 0, 0, 0, 0); |
| mutex_unlock(&adev->srbm_mutex); |
| |
| /* Initialize all compute VMIDs to have no GDS, GWS, or OA |
| acccess. These should be enabled by FW for target VMIDs. */ |
| for (i = FIRST_COMPUTE_VMID; i < LAST_COMPUTE_VMID; i++) { |
| WREG32(amdgpu_gds_reg_offset[i].mem_base, 0); |
| WREG32(amdgpu_gds_reg_offset[i].mem_size, 0); |
| WREG32(amdgpu_gds_reg_offset[i].gws, 0); |
| WREG32(amdgpu_gds_reg_offset[i].oa, 0); |
| } |
| } |
| |
| static void gfx_v7_0_init_gds_vmid(struct amdgpu_device *adev) |
| { |
| int vmid; |
| |
| /* |
| * Initialize all compute and user-gfx VMIDs to have no GDS, GWS, or OA |
| * access. Compute VMIDs should be enabled by FW for target VMIDs, |
| * the driver can enable them for graphics. VMID0 should maintain |
| * access so that HWS firmware can save/restore entries. |
| */ |
| for (vmid = 1; vmid < 16; vmid++) { |
| WREG32(amdgpu_gds_reg_offset[vmid].mem_base, 0); |
| WREG32(amdgpu_gds_reg_offset[vmid].mem_size, 0); |
| WREG32(amdgpu_gds_reg_offset[vmid].gws, 0); |
| WREG32(amdgpu_gds_reg_offset[vmid].oa, 0); |
| } |
| } |
| |
| static void gfx_v7_0_config_init(struct amdgpu_device *adev) |
| { |
| adev->gfx.config.double_offchip_lds_buf = 1; |
| } |
| |
| /** |
| * gfx_v7_0_constants_init - setup the 3D engine |
| * |
| * @adev: amdgpu_device pointer |
| * |
| * init the gfx constants such as the 3D engine, tiling configuration |
| * registers, maximum number of quad pipes, render backends... |
| */ |
| static void gfx_v7_0_constants_init(struct amdgpu_device *adev) |
| { |
| u32 sh_mem_cfg, sh_static_mem_cfg, sh_mem_base; |
| u32 tmp; |
| int i; |
| |
| WREG32(mmGRBM_CNTL, (0xff << GRBM_CNTL__READ_TIMEOUT__SHIFT)); |
| |
| WREG32(mmGB_ADDR_CONFIG, adev->gfx.config.gb_addr_config); |
| WREG32(mmHDP_ADDR_CONFIG, adev->gfx.config.gb_addr_config); |
| WREG32(mmDMIF_ADDR_CALC, adev->gfx.config.gb_addr_config); |
| |
| gfx_v7_0_tiling_mode_table_init(adev); |
| |
| gfx_v7_0_setup_rb(adev); |
| gfx_v7_0_get_cu_info(adev); |
| gfx_v7_0_config_init(adev); |
| |
| /* set HW defaults for 3D engine */ |
| WREG32(mmCP_MEQ_THRESHOLDS, |
| (0x30 << CP_MEQ_THRESHOLDS__MEQ1_START__SHIFT) | |
| (0x60 << CP_MEQ_THRESHOLDS__MEQ2_START__SHIFT)); |
| |
| mutex_lock(&adev->grbm_idx_mutex); |
| /* |
| * making sure that the following register writes will be broadcasted |
| * to all the shaders |
| */ |
| gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); |
| |
| /* XXX SH_MEM regs */ |
| /* where to put LDS, scratch, GPUVM in FSA64 space */ |
| sh_mem_cfg = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE, |
| SH_MEM_ALIGNMENT_MODE_UNALIGNED); |
| sh_mem_cfg = REG_SET_FIELD(sh_mem_cfg, SH_MEM_CONFIG, DEFAULT_MTYPE, |
| MTYPE_NC); |
| sh_mem_cfg = REG_SET_FIELD(sh_mem_cfg, SH_MEM_CONFIG, APE1_MTYPE, |
| MTYPE_UC); |
| sh_mem_cfg = REG_SET_FIELD(sh_mem_cfg, SH_MEM_CONFIG, PRIVATE_ATC, 0); |
| |
| sh_static_mem_cfg = REG_SET_FIELD(0, SH_STATIC_MEM_CONFIG, |
| SWIZZLE_ENABLE, 1); |
| sh_static_mem_cfg = REG_SET_FIELD(sh_static_mem_cfg, SH_STATIC_MEM_CONFIG, |
| ELEMENT_SIZE, 1); |
| sh_static_mem_cfg = REG_SET_FIELD(sh_static_mem_cfg, SH_STATIC_MEM_CONFIG, |
| INDEX_STRIDE, 3); |
| WREG32(mmSH_STATIC_MEM_CONFIG, sh_static_mem_cfg); |
| |
| mutex_lock(&adev->srbm_mutex); |
| for (i = 0; i < adev->vm_manager.id_mgr[0].num_ids; i++) { |
| if (i == 0) |
| sh_mem_base = 0; |
| else |
| sh_mem_base = adev->gmc.shared_aperture_start >> 48; |
| cik_srbm_select(adev, 0, 0, 0, i); |
| /* CP and shaders */ |
| WREG32(mmSH_MEM_CONFIG, sh_mem_cfg); |
| WREG32(mmSH_MEM_APE1_BASE, 1); |
| WREG32(mmSH_MEM_APE1_LIMIT, 0); |
| WREG32(mmSH_MEM_BASES, sh_mem_base); |
| } |
| cik_srbm_select(adev, 0, 0, 0, 0); |
| mutex_unlock(&adev->srbm_mutex); |
| |
| gfx_v7_0_init_compute_vmid(adev); |
| gfx_v7_0_init_gds_vmid(adev); |
| |
| WREG32(mmSX_DEBUG_1, 0x20); |
| |
| WREG32(mmTA_CNTL_AUX, 0x00010000); |
| |
| tmp = RREG32(mmSPI_CONFIG_CNTL); |
| tmp |= 0x03000000; |
| WREG32(mmSPI_CONFIG_CNTL, tmp); |
| |
| WREG32(mmSQ_CONFIG, 1); |
| |
| WREG32(mmDB_DEBUG, 0); |
| |
| tmp = RREG32(mmDB_DEBUG2) & ~0xf00fffff; |
| tmp |= 0x00000400; |
| WREG32(mmDB_DEBUG2, tmp); |
| |
| tmp = RREG32(mmDB_DEBUG3) & ~0x0002021c; |
| tmp |= 0x00020200; |
| WREG32(mmDB_DEBUG3, tmp); |
| |
| tmp = RREG32(mmCB_HW_CONTROL) & ~0x00010000; |
| tmp |= 0x00018208; |
| WREG32(mmCB_HW_CONTROL, tmp); |
| |
| WREG32(mmSPI_CONFIG_CNTL_1, (4 << SPI_CONFIG_CNTL_1__VTX_DONE_DELAY__SHIFT)); |
| |
| WREG32(mmPA_SC_FIFO_SIZE, |
| ((adev->gfx.config.sc_prim_fifo_size_frontend << PA_SC_FIFO_SIZE__SC_FRONTEND_PRIM_FIFO_SIZE__SHIFT) | |
| (adev->gfx.config.sc_prim_fifo_size_backend << PA_SC_FIFO_SIZE__SC_BACKEND_PRIM_FIFO_SIZE__SHIFT) | |
| (adev->gfx.config.sc_hiz_tile_fifo_size << PA_SC_FIFO_SIZE__SC_HIZ_TILE_FIFO_SIZE__SHIFT) | |
| (adev->gfx.config.sc_earlyz_tile_fifo_size << PA_SC_FIFO_SIZE__SC_EARLYZ_TILE_FIFO_SIZE__SHIFT))); |
| |
| WREG32(mmVGT_NUM_INSTANCES, 1); |
| |
| WREG32(mmCP_PERFMON_CNTL, 0); |
| |
| WREG32(mmSQ_CONFIG, 0); |
| |
| WREG32(mmPA_SC_FORCE_EOV_MAX_CNTS, |
| ((4095 << PA_SC_FORCE_EOV_MAX_CNTS__FORCE_EOV_MAX_CLK_CNT__SHIFT) | |
| (255 << PA_SC_FORCE_EOV_MAX_CNTS__FORCE_EOV_MAX_REZ_CNT__SHIFT))); |
| |
| WREG32(mmVGT_CACHE_INVALIDATION, |
| (VC_AND_TC << VGT_CACHE_INVALIDATION__CACHE_INVALIDATION__SHIFT) | |
| (ES_AND_GS_AUTO << VGT_CACHE_INVALIDATION__AUTO_INVLD_EN__SHIFT)); |
| |
| WREG32(mmVGT_GS_VERTEX_REUSE, 16); |
| WREG32(mmPA_SC_LINE_STIPPLE_STATE, 0); |
| |
| WREG32(mmPA_CL_ENHANCE, PA_CL_ENHANCE__CLIP_VTX_REORDER_ENA_MASK | |
| (3 << PA_CL_ENHANCE__NUM_CLIP_SEQ__SHIFT)); |
| WREG32(mmPA_SC_ENHANCE, PA_SC_ENHANCE__ENABLE_PA_SC_OUT_OF_ORDER_MASK); |
| |
| tmp = RREG32(mmSPI_ARB_PRIORITY); |
| tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS0, 2); |
| tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS1, 2); |
| tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS2, 2); |
| tmp = REG_SET_FIELD(tmp, SPI_ARB_PRIORITY, PIPE_ORDER_TS3, 2); |
| WREG32(mmSPI_ARB_PRIORITY, tmp); |
| |
| mutex_unlock(&adev->grbm_idx_mutex); |
| |
| udelay(50); |
| } |
| |
| /* |
| * GPU scratch registers helpers function. |
| */ |
| /** |
| * gfx_v7_0_scratch_init - setup driver info for CP scratch regs |
| * |
| * @adev: amdgpu_device pointer |
| * |
| * Set up the number and offset of the CP scratch registers. |
| * NOTE: use of CP scratch registers is a legacy inferface and |
| * is not used by default on newer asics (r6xx+). On newer asics, |
| * memory buffers are used for fences rather than scratch regs. |
| */ |
| static void gfx_v7_0_scratch_init(struct amdgpu_device *adev) |
| { |
| adev->gfx.scratch.num_reg = 8; |
| adev->gfx.scratch.reg_base = mmSCRATCH_REG0; |
| adev->gfx.scratch.free_mask = (1u << adev->gfx.scratch.num_reg) - 1; |
| } |
| |
| /** |
| * gfx_v7_0_ring_test_ring - basic gfx ring test |
| * |
| * @adev: amdgpu_device pointer |
| * @ring: amdgpu_ring structure holding ring information |
| * |
| * Allocate a scratch register and write to it using the gfx ring (CIK). |
| * Provides a basic gfx ring test to verify that the ring is working. |
| * Used by gfx_v7_0_cp_gfx_resume(); |
| * Returns 0 on success, error on failure. |
| */ |
| static int gfx_v7_0_ring_test_ring(struct amdgpu_ring *ring) |
| { |
| struct amdgpu_device *adev = ring->adev; |
| uint32_t scratch; |
| uint32_t tmp = 0; |
| unsigned i; |
| int r; |
| |
| r = amdgpu_gfx_scratch_get(adev, &scratch); |
| if (r) |
| return r; |
| |
| WREG32(scratch, 0xCAFEDEAD); |
| r = amdgpu_ring_alloc(ring, 3); |
| if (r) |
| goto error_free_scratch; |
| |
| amdgpu_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1)); |
| amdgpu_ring_write(ring, (scratch - PACKET3_SET_UCONFIG_REG_START)); |
| amdgpu_ring_write(ring, 0xDEADBEEF); |
| amdgpu_ring_commit(ring); |
| |
| for (i = 0; i < adev->usec_timeout; i++) { |
| tmp = RREG32(scratch); |
| if (tmp == 0xDEADBEEF) |
| break; |
| udelay(1); |
| } |
| if (i >= adev->usec_timeout) |
| r = -ETIMEDOUT; |
| |
| error_free_scratch: |
| amdgpu_gfx_scratch_free(adev, scratch); |
| return r; |
| } |
| |
| /** |
| * gfx_v7_0_ring_emit_hdp - emit an hdp flush on the cp |
| * |
| * @adev: amdgpu_device pointer |
| * @ridx: amdgpu ring index |
| * |
| * Emits an hdp flush on the cp. |
| */ |
| static void gfx_v7_0_ring_emit_hdp_flush(struct amdgpu_ring *ring) |
| { |
| u32 ref_and_mask; |
| int usepfp = ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE ? 0 : 1; |
| |
| if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) { |
| switch (ring->me) { |
| case 1: |
| ref_and_mask = GPU_HDP_FLUSH_DONE__CP2_MASK << ring->pipe; |
| break; |
| case 2: |
| ref_and_mask = GPU_HDP_FLUSH_DONE__CP6_MASK << ring->pipe; |
| break; |
| default: |
| return; |
| } |
| } else { |
| ref_and_mask = GPU_HDP_FLUSH_DONE__CP0_MASK; |
| } |
| |
| amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); |
| amdgpu_ring_write(ring, (WAIT_REG_MEM_OPERATION(1) | /* write, wait, write */ |
| WAIT_REG_MEM_FUNCTION(3) | /* == */ |
| WAIT_REG_MEM_ENGINE(usepfp))); /* pfp or me */ |
| amdgpu_ring_write(ring, mmGPU_HDP_FLUSH_REQ); |
| amdgpu_ring_write(ring, mmGPU_HDP_FLUSH_DONE); |
| amdgpu_ring_write(ring, ref_and_mask); |
| amdgpu_ring_write(ring, ref_and_mask); |
| amdgpu_ring_write(ring, 0x20); /* poll interval */ |
| } |
| |
| static void gfx_v7_0_ring_emit_vgt_flush(struct amdgpu_ring *ring) |
| { |
| amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); |
| amdgpu_ring_write(ring, EVENT_TYPE(VS_PARTIAL_FLUSH) | |
| EVENT_INDEX(4)); |
| |
| amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0)); |
| amdgpu_ring_write(ring, EVENT_TYPE(VGT_FLUSH) | |
| EVENT_INDEX(0)); |
| } |
| |
| /** |
| * gfx_v7_0_ring_emit_fence_gfx - emit a fence on the gfx ring |
| * |
| * @adev: amdgpu_device pointer |
| * @fence: amdgpu fence object |
| * |
| * Emits a fence sequnce number on the gfx ring and flushes |
| * GPU caches. |
| */ |
| static void gfx_v7_0_ring_emit_fence_gfx(struct amdgpu_ring *ring, u64 addr, |
| u64 seq, unsigned flags) |
| { |
| bool write64bit = flags & AMDGPU_FENCE_FLAG_64BIT; |
| bool int_sel = flags & AMDGPU_FENCE_FLAG_INT; |
| /* Workaround for cache flush problems. First send a dummy EOP |
| * event down the pipe with seq one below. |
| */ |
| amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4)); |
| amdgpu_ring_write(ring, (EOP_TCL1_ACTION_EN | |
| EOP_TC_ACTION_EN | |
| EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) | |
| EVENT_INDEX(5))); |
| amdgpu_ring_write(ring, addr & 0xfffffffc); |
| amdgpu_ring_write(ring, (upper_32_bits(addr) & 0xffff) | |
| DATA_SEL(1) | INT_SEL(0)); |
| amdgpu_ring_write(ring, lower_32_bits(seq - 1)); |
| amdgpu_ring_write(ring, upper_32_bits(seq - 1)); |
| |
| /* Then send the real EOP event down the pipe. */ |
| amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4)); |
| amdgpu_ring_write(ring, (EOP_TCL1_ACTION_EN | |
| EOP_TC_ACTION_EN | |
| EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) | |
| EVENT_INDEX(5))); |
| amdgpu_ring_write(ring, addr & 0xfffffffc); |
| amdgpu_ring_write(ring, (upper_32_bits(addr) & 0xffff) | |
| DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0)); |
| amdgpu_ring_write(ring, lower_32_bits(seq)); |
| amdgpu_ring_write(ring, upper_32_bits(seq)); |
| } |
| |
| /** |
| * gfx_v7_0_ring_emit_fence_compute - emit a fence on the compute ring |
| * |
| * @adev: amdgpu_device pointer |
| * @fence: amdgpu fence object |
| * |
| * Emits a fence sequnce number on the compute ring and flushes |
| * GPU caches. |
| */ |
| static void gfx_v7_0_ring_emit_fence_compute(struct amdgpu_ring *ring, |
| u64 addr, u64 seq, |
| unsigned flags) |
| { |
| bool write64bit = flags & AMDGPU_FENCE_FLAG_64BIT; |
| bool int_sel = flags & AMDGPU_FENCE_FLAG_INT; |
| |
| /* RELEASE_MEM - flush caches, send int */ |
| amdgpu_ring_write(ring, PACKET3(PACKET3_RELEASE_MEM, 5)); |
| amdgpu_ring_write(ring, (EOP_TCL1_ACTION_EN | |
| EOP_TC_ACTION_EN | |
| EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) | |
| EVENT_INDEX(5))); |
| amdgpu_ring_write(ring, DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0)); |
| amdgpu_ring_write(ring, addr & 0xfffffffc); |
| amdgpu_ring_write(ring, upper_32_bits(addr)); |
| amdgpu_ring_write(ring, lower_32_bits(seq)); |
| amdgpu_ring_write(ring, upper_32_bits(seq)); |
| } |
| |
| /* |
| * IB stuff |
| */ |
| /** |
| * gfx_v7_0_ring_emit_ib - emit an IB (Indirect Buffer) on the ring |
| * |
| * @ring: amdgpu_ring structure holding ring information |
| * @ib: amdgpu indirect buffer object |
| * |
| * Emits an DE (drawing engine) or CE (constant engine) IB |
| * on the gfx ring. IBs are usually generated by userspace |
| * acceleration drivers and submitted to the kernel for |
| * sheduling on the ring. This function schedules the IB |
| * on the gfx ring for execution by the GPU. |
| */ |
| static void gfx_v7_0_ring_emit_ib_gfx(struct amdgpu_ring *ring, |
| struct amdgpu_job *job, |
| struct amdgpu_ib *ib, |
| uint32_t flags) |
| { |
| unsigned vmid = AMDGPU_JOB_GET_VMID(job); |
| u32 header, control = 0; |
| |
| /* insert SWITCH_BUFFER packet before first IB in the ring frame */ |
| if (flags & AMDGPU_HAVE_CTX_SWITCH) { |
| amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); |
| amdgpu_ring_write(ring, 0); |
| } |
| |
| if (ib->flags & AMDGPU_IB_FLAG_CE) |
| header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2); |
| else |
| header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); |
| |
| control |= ib->length_dw | (vmid << 24); |
| |
| amdgpu_ring_write(ring, header); |
| amdgpu_ring_write(ring, |
| #ifdef __BIG_ENDIAN |
| (2 << 0) | |
| #endif |
| (ib->gpu_addr & 0xFFFFFFFC)); |
| amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF); |
| amdgpu_ring_write(ring, control); |
| } |
| |
| static void gfx_v7_0_ring_emit_ib_compute(struct amdgpu_ring *ring, |
| struct amdgpu_job *job, |
| struct amdgpu_ib *ib, |
| uint32_t flags) |
| { |
| unsigned vmid = AMDGPU_JOB_GET_VMID(job); |
| u32 control = INDIRECT_BUFFER_VALID | ib->length_dw | (vmid << 24); |
| |
| /* Currently, there is a high possibility to get wave ID mismatch |
| * between ME and GDS, leading to a hw deadlock, because ME generates |
| * different wave IDs than the GDS expects. This situation happens |
| * randomly when at least 5 compute pipes use GDS ordered append. |
| * The wave IDs generated by ME are also wrong after suspend/resume. |
| * Those are probably bugs somewhere else in the kernel driver. |
| * |
| * Writing GDS_COMPUTE_MAX_WAVE_ID resets wave ID counters in ME and |
| * GDS to 0 for this ring (me/pipe). |
| */ |
| if (ib->flags & AMDGPU_IB_FLAG_RESET_GDS_MAX_WAVE_ID) { |
| amdgpu_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); |
| amdgpu_ring_write(ring, mmGDS_COMPUTE_MAX_WAVE_ID - PACKET3_SET_CONFIG_REG_START); |
| amdgpu_ring_write(ring, ring->adev->gds.gds_compute_max_wave_id); |
| } |
| |
| amdgpu_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); |
| amdgpu_ring_write(ring, |
| #ifdef __BIG_ENDIAN |
| (2 << 0) | |
| #endif |
| (ib->gpu_addr & 0xFFFFFFFC)); |
| amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF); |
| amdgpu_ring_write(ring, control); |
| } |
| |
| static void gfx_v7_ring_emit_cntxcntl(struct amdgpu_ring *ring, uint32_t flags) |
| { |
| uint32_t dw2 = 0; |
| |
| dw2 |= 0x80000000; /* set load_enable otherwise this package is just NOPs */ |
| if (flags & AMDGPU_HAVE_CTX_SWITCH) { |
| gfx_v7_0_ring_emit_vgt_flush(ring); |
| /* set load_global_config & load_global_uconfig */ |
| dw2 |= 0x8001; |
| /* set load_cs_sh_regs */ |
| dw2 |= 0x01000000; |
| /* set load_per_context_state & load_gfx_sh_regs */ |
| dw2 |= 0x10002; |
| } |
| |
| amdgpu_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1)); |
| amdgpu_ring_write(ring, dw2); |
| amdgpu_ring_write(ring, 0); |
|