18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright 2010 Advanced Micro Devices, Inc. 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 58c2ecf20Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 68c2ecf20Sopenharmony_ci * to deal in the Software without restriction, including without limitation 78c2ecf20Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 88c2ecf20Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 98c2ecf20Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 108c2ecf20Sopenharmony_ci * 118c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice shall be included in 128c2ecf20Sopenharmony_ci * all copies or substantial portions of the Software. 138c2ecf20Sopenharmony_ci * 148c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 158c2ecf20Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 168c2ecf20Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 178c2ecf20Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 188c2ecf20Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 198c2ecf20Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 208c2ecf20Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 218c2ecf20Sopenharmony_ci * 228c2ecf20Sopenharmony_ci * Authors: Alex Deucher 238c2ecf20Sopenharmony_ci */ 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci#include <linux/firmware.h> 268c2ecf20Sopenharmony_ci#include <linux/module.h> 278c2ecf20Sopenharmony_ci#include <linux/pci.h> 288c2ecf20Sopenharmony_ci#include <linux/slab.h> 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci#include <drm/radeon_drm.h> 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci#include "atom.h" 338c2ecf20Sopenharmony_ci#include "cayman_blit_shaders.h" 348c2ecf20Sopenharmony_ci#include "clearstate_cayman.h" 358c2ecf20Sopenharmony_ci#include "ni_reg.h" 368c2ecf20Sopenharmony_ci#include "nid.h" 378c2ecf20Sopenharmony_ci#include "radeon.h" 388c2ecf20Sopenharmony_ci#include "radeon_asic.h" 398c2ecf20Sopenharmony_ci#include "radeon_audio.h" 408c2ecf20Sopenharmony_ci#include "radeon_ucode.h" 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci/* 438c2ecf20Sopenharmony_ci * Indirect registers accessor 448c2ecf20Sopenharmony_ci */ 458c2ecf20Sopenharmony_ciu32 tn_smc_rreg(struct radeon_device *rdev, u32 reg) 468c2ecf20Sopenharmony_ci{ 478c2ecf20Sopenharmony_ci unsigned long flags; 488c2ecf20Sopenharmony_ci u32 r; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci spin_lock_irqsave(&rdev->smc_idx_lock, flags); 518c2ecf20Sopenharmony_ci WREG32(TN_SMC_IND_INDEX_0, (reg)); 528c2ecf20Sopenharmony_ci r = RREG32(TN_SMC_IND_DATA_0); 538c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&rdev->smc_idx_lock, flags); 548c2ecf20Sopenharmony_ci return r; 558c2ecf20Sopenharmony_ci} 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_civoid tn_smc_wreg(struct radeon_device *rdev, u32 reg, u32 v) 588c2ecf20Sopenharmony_ci{ 598c2ecf20Sopenharmony_ci unsigned long flags; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci spin_lock_irqsave(&rdev->smc_idx_lock, flags); 628c2ecf20Sopenharmony_ci WREG32(TN_SMC_IND_INDEX_0, (reg)); 638c2ecf20Sopenharmony_ci WREG32(TN_SMC_IND_DATA_0, (v)); 648c2ecf20Sopenharmony_ci spin_unlock_irqrestore(&rdev->smc_idx_lock, flags); 658c2ecf20Sopenharmony_ci} 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_cistatic const u32 tn_rlc_save_restore_register_list[] = 688c2ecf20Sopenharmony_ci{ 698c2ecf20Sopenharmony_ci 0x98fc, 708c2ecf20Sopenharmony_ci 0x98f0, 718c2ecf20Sopenharmony_ci 0x9834, 728c2ecf20Sopenharmony_ci 0x9838, 738c2ecf20Sopenharmony_ci 0x9870, 748c2ecf20Sopenharmony_ci 0x9874, 758c2ecf20Sopenharmony_ci 0x8a14, 768c2ecf20Sopenharmony_ci 0x8b24, 778c2ecf20Sopenharmony_ci 0x8bcc, 788c2ecf20Sopenharmony_ci 0x8b10, 798c2ecf20Sopenharmony_ci 0x8c30, 808c2ecf20Sopenharmony_ci 0x8d00, 818c2ecf20Sopenharmony_ci 0x8d04, 828c2ecf20Sopenharmony_ci 0x8c00, 838c2ecf20Sopenharmony_ci 0x8c04, 848c2ecf20Sopenharmony_ci 0x8c10, 858c2ecf20Sopenharmony_ci 0x8c14, 868c2ecf20Sopenharmony_ci 0x8d8c, 878c2ecf20Sopenharmony_ci 0x8cf0, 888c2ecf20Sopenharmony_ci 0x8e38, 898c2ecf20Sopenharmony_ci 0x9508, 908c2ecf20Sopenharmony_ci 0x9688, 918c2ecf20Sopenharmony_ci 0x9608, 928c2ecf20Sopenharmony_ci 0x960c, 938c2ecf20Sopenharmony_ci 0x9610, 948c2ecf20Sopenharmony_ci 0x9614, 958c2ecf20Sopenharmony_ci 0x88c4, 968c2ecf20Sopenharmony_ci 0x8978, 978c2ecf20Sopenharmony_ci 0x88d4, 988c2ecf20Sopenharmony_ci 0x900c, 998c2ecf20Sopenharmony_ci 0x9100, 1008c2ecf20Sopenharmony_ci 0x913c, 1018c2ecf20Sopenharmony_ci 0x90e8, 1028c2ecf20Sopenharmony_ci 0x9354, 1038c2ecf20Sopenharmony_ci 0xa008, 1048c2ecf20Sopenharmony_ci 0x98f8, 1058c2ecf20Sopenharmony_ci 0x9148, 1068c2ecf20Sopenharmony_ci 0x914c, 1078c2ecf20Sopenharmony_ci 0x3f94, 1088c2ecf20Sopenharmony_ci 0x98f4, 1098c2ecf20Sopenharmony_ci 0x9b7c, 1108c2ecf20Sopenharmony_ci 0x3f8c, 1118c2ecf20Sopenharmony_ci 0x8950, 1128c2ecf20Sopenharmony_ci 0x8954, 1138c2ecf20Sopenharmony_ci 0x8a18, 1148c2ecf20Sopenharmony_ci 0x8b28, 1158c2ecf20Sopenharmony_ci 0x9144, 1168c2ecf20Sopenharmony_ci 0x3f90, 1178c2ecf20Sopenharmony_ci 0x915c, 1188c2ecf20Sopenharmony_ci 0x9160, 1198c2ecf20Sopenharmony_ci 0x9178, 1208c2ecf20Sopenharmony_ci 0x917c, 1218c2ecf20Sopenharmony_ci 0x9180, 1228c2ecf20Sopenharmony_ci 0x918c, 1238c2ecf20Sopenharmony_ci 0x9190, 1248c2ecf20Sopenharmony_ci 0x9194, 1258c2ecf20Sopenharmony_ci 0x9198, 1268c2ecf20Sopenharmony_ci 0x919c, 1278c2ecf20Sopenharmony_ci 0x91a8, 1288c2ecf20Sopenharmony_ci 0x91ac, 1298c2ecf20Sopenharmony_ci 0x91b0, 1308c2ecf20Sopenharmony_ci 0x91b4, 1318c2ecf20Sopenharmony_ci 0x91b8, 1328c2ecf20Sopenharmony_ci 0x91c4, 1338c2ecf20Sopenharmony_ci 0x91c8, 1348c2ecf20Sopenharmony_ci 0x91cc, 1358c2ecf20Sopenharmony_ci 0x91d0, 1368c2ecf20Sopenharmony_ci 0x91d4, 1378c2ecf20Sopenharmony_ci 0x91e0, 1388c2ecf20Sopenharmony_ci 0x91e4, 1398c2ecf20Sopenharmony_ci 0x91ec, 1408c2ecf20Sopenharmony_ci 0x91f0, 1418c2ecf20Sopenharmony_ci 0x91f4, 1428c2ecf20Sopenharmony_ci 0x9200, 1438c2ecf20Sopenharmony_ci 0x9204, 1448c2ecf20Sopenharmony_ci 0x929c, 1458c2ecf20Sopenharmony_ci 0x8030, 1468c2ecf20Sopenharmony_ci 0x9150, 1478c2ecf20Sopenharmony_ci 0x9a60, 1488c2ecf20Sopenharmony_ci 0x920c, 1498c2ecf20Sopenharmony_ci 0x9210, 1508c2ecf20Sopenharmony_ci 0x9228, 1518c2ecf20Sopenharmony_ci 0x922c, 1528c2ecf20Sopenharmony_ci 0x9244, 1538c2ecf20Sopenharmony_ci 0x9248, 1548c2ecf20Sopenharmony_ci 0x91e8, 1558c2ecf20Sopenharmony_ci 0x9294, 1568c2ecf20Sopenharmony_ci 0x9208, 1578c2ecf20Sopenharmony_ci 0x9224, 1588c2ecf20Sopenharmony_ci 0x9240, 1598c2ecf20Sopenharmony_ci 0x9220, 1608c2ecf20Sopenharmony_ci 0x923c, 1618c2ecf20Sopenharmony_ci 0x9258, 1628c2ecf20Sopenharmony_ci 0x9744, 1638c2ecf20Sopenharmony_ci 0xa200, 1648c2ecf20Sopenharmony_ci 0xa204, 1658c2ecf20Sopenharmony_ci 0xa208, 1668c2ecf20Sopenharmony_ci 0xa20c, 1678c2ecf20Sopenharmony_ci 0x8d58, 1688c2ecf20Sopenharmony_ci 0x9030, 1698c2ecf20Sopenharmony_ci 0x9034, 1708c2ecf20Sopenharmony_ci 0x9038, 1718c2ecf20Sopenharmony_ci 0x903c, 1728c2ecf20Sopenharmony_ci 0x9040, 1738c2ecf20Sopenharmony_ci 0x9654, 1748c2ecf20Sopenharmony_ci 0x897c, 1758c2ecf20Sopenharmony_ci 0xa210, 1768c2ecf20Sopenharmony_ci 0xa214, 1778c2ecf20Sopenharmony_ci 0x9868, 1788c2ecf20Sopenharmony_ci 0xa02c, 1798c2ecf20Sopenharmony_ci 0x9664, 1808c2ecf20Sopenharmony_ci 0x9698, 1818c2ecf20Sopenharmony_ci 0x949c, 1828c2ecf20Sopenharmony_ci 0x8e10, 1838c2ecf20Sopenharmony_ci 0x8e18, 1848c2ecf20Sopenharmony_ci 0x8c50, 1858c2ecf20Sopenharmony_ci 0x8c58, 1868c2ecf20Sopenharmony_ci 0x8c60, 1878c2ecf20Sopenharmony_ci 0x8c68, 1888c2ecf20Sopenharmony_ci 0x89b4, 1898c2ecf20Sopenharmony_ci 0x9830, 1908c2ecf20Sopenharmony_ci 0x802c, 1918c2ecf20Sopenharmony_ci}; 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ciextern bool evergreen_is_display_hung(struct radeon_device *rdev); 1948c2ecf20Sopenharmony_ciextern void evergreen_print_gpu_status_regs(struct radeon_device *rdev); 1958c2ecf20Sopenharmony_ciextern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save); 1968c2ecf20Sopenharmony_ciextern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save); 1978c2ecf20Sopenharmony_ciextern int evergreen_mc_wait_for_idle(struct radeon_device *rdev); 1988c2ecf20Sopenharmony_ciextern void evergreen_mc_program(struct radeon_device *rdev); 1998c2ecf20Sopenharmony_ciextern void evergreen_irq_suspend(struct radeon_device *rdev); 2008c2ecf20Sopenharmony_ciextern int evergreen_mc_init(struct radeon_device *rdev); 2018c2ecf20Sopenharmony_ciextern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev); 2028c2ecf20Sopenharmony_ciextern void evergreen_pcie_gen2_enable(struct radeon_device *rdev); 2038c2ecf20Sopenharmony_ciextern void evergreen_program_aspm(struct radeon_device *rdev); 2048c2ecf20Sopenharmony_ciextern void sumo_rlc_fini(struct radeon_device *rdev); 2058c2ecf20Sopenharmony_ciextern int sumo_rlc_init(struct radeon_device *rdev); 2068c2ecf20Sopenharmony_ciextern void evergreen_gpu_pci_config_reset(struct radeon_device *rdev); 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci/* Firmware Names */ 2098c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/BARTS_pfp.bin"); 2108c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/BARTS_me.bin"); 2118c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/BARTS_mc.bin"); 2128c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/BARTS_smc.bin"); 2138c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/BTC_rlc.bin"); 2148c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/TURKS_pfp.bin"); 2158c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/TURKS_me.bin"); 2168c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/TURKS_mc.bin"); 2178c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/TURKS_smc.bin"); 2188c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/CAICOS_pfp.bin"); 2198c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/CAICOS_me.bin"); 2208c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/CAICOS_mc.bin"); 2218c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/CAICOS_smc.bin"); 2228c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/CAYMAN_pfp.bin"); 2238c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/CAYMAN_me.bin"); 2248c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/CAYMAN_mc.bin"); 2258c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/CAYMAN_rlc.bin"); 2268c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/CAYMAN_smc.bin"); 2278c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/ARUBA_pfp.bin"); 2288c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/ARUBA_me.bin"); 2298c2ecf20Sopenharmony_ciMODULE_FIRMWARE("radeon/ARUBA_rlc.bin"); 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_cistatic const u32 cayman_golden_registers2[] = 2338c2ecf20Sopenharmony_ci{ 2348c2ecf20Sopenharmony_ci 0x3e5c, 0xffffffff, 0x00000000, 2358c2ecf20Sopenharmony_ci 0x3e48, 0xffffffff, 0x00000000, 2368c2ecf20Sopenharmony_ci 0x3e4c, 0xffffffff, 0x00000000, 2378c2ecf20Sopenharmony_ci 0x3e64, 0xffffffff, 0x00000000, 2388c2ecf20Sopenharmony_ci 0x3e50, 0xffffffff, 0x00000000, 2398c2ecf20Sopenharmony_ci 0x3e60, 0xffffffff, 0x00000000 2408c2ecf20Sopenharmony_ci}; 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_cistatic const u32 cayman_golden_registers[] = 2438c2ecf20Sopenharmony_ci{ 2448c2ecf20Sopenharmony_ci 0x5eb4, 0xffffffff, 0x00000002, 2458c2ecf20Sopenharmony_ci 0x5e78, 0x8f311ff1, 0x001000f0, 2468c2ecf20Sopenharmony_ci 0x3f90, 0xffff0000, 0xff000000, 2478c2ecf20Sopenharmony_ci 0x9148, 0xffff0000, 0xff000000, 2488c2ecf20Sopenharmony_ci 0x3f94, 0xffff0000, 0xff000000, 2498c2ecf20Sopenharmony_ci 0x914c, 0xffff0000, 0xff000000, 2508c2ecf20Sopenharmony_ci 0xc78, 0x00000080, 0x00000080, 2518c2ecf20Sopenharmony_ci 0xbd4, 0x70073777, 0x00011003, 2528c2ecf20Sopenharmony_ci 0xd02c, 0xbfffff1f, 0x08421000, 2538c2ecf20Sopenharmony_ci 0xd0b8, 0x73773777, 0x02011003, 2548c2ecf20Sopenharmony_ci 0x5bc0, 0x00200000, 0x50100000, 2558c2ecf20Sopenharmony_ci 0x98f8, 0x33773777, 0x02011003, 2568c2ecf20Sopenharmony_ci 0x98fc, 0xffffffff, 0x76541032, 2578c2ecf20Sopenharmony_ci 0x7030, 0x31000311, 0x00000011, 2588c2ecf20Sopenharmony_ci 0x2f48, 0x33773777, 0x42010001, 2598c2ecf20Sopenharmony_ci 0x6b28, 0x00000010, 0x00000012, 2608c2ecf20Sopenharmony_ci 0x7728, 0x00000010, 0x00000012, 2618c2ecf20Sopenharmony_ci 0x10328, 0x00000010, 0x00000012, 2628c2ecf20Sopenharmony_ci 0x10f28, 0x00000010, 0x00000012, 2638c2ecf20Sopenharmony_ci 0x11b28, 0x00000010, 0x00000012, 2648c2ecf20Sopenharmony_ci 0x12728, 0x00000010, 0x00000012, 2658c2ecf20Sopenharmony_ci 0x240c, 0x000007ff, 0x00000000, 2668c2ecf20Sopenharmony_ci 0x8a14, 0xf000001f, 0x00000007, 2678c2ecf20Sopenharmony_ci 0x8b24, 0x3fff3fff, 0x00ff0fff, 2688c2ecf20Sopenharmony_ci 0x8b10, 0x0000ff0f, 0x00000000, 2698c2ecf20Sopenharmony_ci 0x28a4c, 0x07ffffff, 0x06000000, 2708c2ecf20Sopenharmony_ci 0x10c, 0x00000001, 0x00010003, 2718c2ecf20Sopenharmony_ci 0xa02c, 0xffffffff, 0x0000009b, 2728c2ecf20Sopenharmony_ci 0x913c, 0x0000010f, 0x01000100, 2738c2ecf20Sopenharmony_ci 0x8c04, 0xf8ff00ff, 0x40600060, 2748c2ecf20Sopenharmony_ci 0x28350, 0x00000f01, 0x00000000, 2758c2ecf20Sopenharmony_ci 0x9508, 0x3700001f, 0x00000002, 2768c2ecf20Sopenharmony_ci 0x960c, 0xffffffff, 0x54763210, 2778c2ecf20Sopenharmony_ci 0x88c4, 0x001f3ae3, 0x00000082, 2788c2ecf20Sopenharmony_ci 0x88d0, 0xffffffff, 0x0f40df40, 2798c2ecf20Sopenharmony_ci 0x88d4, 0x0000001f, 0x00000010, 2808c2ecf20Sopenharmony_ci 0x8974, 0xffffffff, 0x00000000 2818c2ecf20Sopenharmony_ci}; 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_cistatic const u32 dvst_golden_registers2[] = 2848c2ecf20Sopenharmony_ci{ 2858c2ecf20Sopenharmony_ci 0x8f8, 0xffffffff, 0, 2868c2ecf20Sopenharmony_ci 0x8fc, 0x00380000, 0, 2878c2ecf20Sopenharmony_ci 0x8f8, 0xffffffff, 1, 2888c2ecf20Sopenharmony_ci 0x8fc, 0x0e000000, 0 2898c2ecf20Sopenharmony_ci}; 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_cistatic const u32 dvst_golden_registers[] = 2928c2ecf20Sopenharmony_ci{ 2938c2ecf20Sopenharmony_ci 0x690, 0x3fff3fff, 0x20c00033, 2948c2ecf20Sopenharmony_ci 0x918c, 0x0fff0fff, 0x00010006, 2958c2ecf20Sopenharmony_ci 0x91a8, 0x0fff0fff, 0x00010006, 2968c2ecf20Sopenharmony_ci 0x9150, 0xffffdfff, 0x6e944040, 2978c2ecf20Sopenharmony_ci 0x917c, 0x0fff0fff, 0x00030002, 2988c2ecf20Sopenharmony_ci 0x9198, 0x0fff0fff, 0x00030002, 2998c2ecf20Sopenharmony_ci 0x915c, 0x0fff0fff, 0x00010000, 3008c2ecf20Sopenharmony_ci 0x3f90, 0xffff0001, 0xff000000, 3018c2ecf20Sopenharmony_ci 0x9178, 0x0fff0fff, 0x00070000, 3028c2ecf20Sopenharmony_ci 0x9194, 0x0fff0fff, 0x00070000, 3038c2ecf20Sopenharmony_ci 0x9148, 0xffff0001, 0xff000000, 3048c2ecf20Sopenharmony_ci 0x9190, 0x0fff0fff, 0x00090008, 3058c2ecf20Sopenharmony_ci 0x91ac, 0x0fff0fff, 0x00090008, 3068c2ecf20Sopenharmony_ci 0x3f94, 0xffff0000, 0xff000000, 3078c2ecf20Sopenharmony_ci 0x914c, 0xffff0000, 0xff000000, 3088c2ecf20Sopenharmony_ci 0x929c, 0x00000fff, 0x00000001, 3098c2ecf20Sopenharmony_ci 0x55e4, 0xff607fff, 0xfc000100, 3108c2ecf20Sopenharmony_ci 0x8a18, 0xff000fff, 0x00000100, 3118c2ecf20Sopenharmony_ci 0x8b28, 0xff000fff, 0x00000100, 3128c2ecf20Sopenharmony_ci 0x9144, 0xfffc0fff, 0x00000100, 3138c2ecf20Sopenharmony_ci 0x6ed8, 0x00010101, 0x00010000, 3148c2ecf20Sopenharmony_ci 0x9830, 0xffffffff, 0x00000000, 3158c2ecf20Sopenharmony_ci 0x9834, 0xf00fffff, 0x00000400, 3168c2ecf20Sopenharmony_ci 0x9838, 0xfffffffe, 0x00000000, 3178c2ecf20Sopenharmony_ci 0xd0c0, 0xff000fff, 0x00000100, 3188c2ecf20Sopenharmony_ci 0xd02c, 0xbfffff1f, 0x08421000, 3198c2ecf20Sopenharmony_ci 0xd0b8, 0x73773777, 0x12010001, 3208c2ecf20Sopenharmony_ci 0x5bb0, 0x000000f0, 0x00000070, 3218c2ecf20Sopenharmony_ci 0x98f8, 0x73773777, 0x12010001, 3228c2ecf20Sopenharmony_ci 0x98fc, 0xffffffff, 0x00000010, 3238c2ecf20Sopenharmony_ci 0x9b7c, 0x00ff0000, 0x00fc0000, 3248c2ecf20Sopenharmony_ci 0x8030, 0x00001f0f, 0x0000100a, 3258c2ecf20Sopenharmony_ci 0x2f48, 0x73773777, 0x12010001, 3268c2ecf20Sopenharmony_ci 0x2408, 0x00030000, 0x000c007f, 3278c2ecf20Sopenharmony_ci 0x8a14, 0xf000003f, 0x00000007, 3288c2ecf20Sopenharmony_ci 0x8b24, 0x3fff3fff, 0x00ff0fff, 3298c2ecf20Sopenharmony_ci 0x8b10, 0x0000ff0f, 0x00000000, 3308c2ecf20Sopenharmony_ci 0x28a4c, 0x07ffffff, 0x06000000, 3318c2ecf20Sopenharmony_ci 0x4d8, 0x00000fff, 0x00000100, 3328c2ecf20Sopenharmony_ci 0xa008, 0xffffffff, 0x00010000, 3338c2ecf20Sopenharmony_ci 0x913c, 0xffff03ff, 0x01000100, 3348c2ecf20Sopenharmony_ci 0x8c00, 0x000000ff, 0x00000003, 3358c2ecf20Sopenharmony_ci 0x8c04, 0xf8ff00ff, 0x40600060, 3368c2ecf20Sopenharmony_ci 0x8cf0, 0x1fff1fff, 0x08e00410, 3378c2ecf20Sopenharmony_ci 0x28350, 0x00000f01, 0x00000000, 3388c2ecf20Sopenharmony_ci 0x9508, 0xf700071f, 0x00000002, 3398c2ecf20Sopenharmony_ci 0x960c, 0xffffffff, 0x54763210, 3408c2ecf20Sopenharmony_ci 0x20ef8, 0x01ff01ff, 0x00000002, 3418c2ecf20Sopenharmony_ci 0x20e98, 0xfffffbff, 0x00200000, 3428c2ecf20Sopenharmony_ci 0x2015c, 0xffffffff, 0x00000f40, 3438c2ecf20Sopenharmony_ci 0x88c4, 0x001f3ae3, 0x00000082, 3448c2ecf20Sopenharmony_ci 0x8978, 0x3fffffff, 0x04050140, 3458c2ecf20Sopenharmony_ci 0x88d4, 0x0000001f, 0x00000010, 3468c2ecf20Sopenharmony_ci 0x8974, 0xffffffff, 0x00000000 3478c2ecf20Sopenharmony_ci}; 3488c2ecf20Sopenharmony_ci 3498c2ecf20Sopenharmony_cistatic const u32 scrapper_golden_registers[] = 3508c2ecf20Sopenharmony_ci{ 3518c2ecf20Sopenharmony_ci 0x690, 0x3fff3fff, 0x20c00033, 3528c2ecf20Sopenharmony_ci 0x918c, 0x0fff0fff, 0x00010006, 3538c2ecf20Sopenharmony_ci 0x918c, 0x0fff0fff, 0x00010006, 3548c2ecf20Sopenharmony_ci 0x91a8, 0x0fff0fff, 0x00010006, 3558c2ecf20Sopenharmony_ci 0x91a8, 0x0fff0fff, 0x00010006, 3568c2ecf20Sopenharmony_ci 0x9150, 0xffffdfff, 0x6e944040, 3578c2ecf20Sopenharmony_ci 0x9150, 0xffffdfff, 0x6e944040, 3588c2ecf20Sopenharmony_ci 0x917c, 0x0fff0fff, 0x00030002, 3598c2ecf20Sopenharmony_ci 0x917c, 0x0fff0fff, 0x00030002, 3608c2ecf20Sopenharmony_ci 0x9198, 0x0fff0fff, 0x00030002, 3618c2ecf20Sopenharmony_ci 0x9198, 0x0fff0fff, 0x00030002, 3628c2ecf20Sopenharmony_ci 0x915c, 0x0fff0fff, 0x00010000, 3638c2ecf20Sopenharmony_ci 0x915c, 0x0fff0fff, 0x00010000, 3648c2ecf20Sopenharmony_ci 0x3f90, 0xffff0001, 0xff000000, 3658c2ecf20Sopenharmony_ci 0x3f90, 0xffff0001, 0xff000000, 3668c2ecf20Sopenharmony_ci 0x9178, 0x0fff0fff, 0x00070000, 3678c2ecf20Sopenharmony_ci 0x9178, 0x0fff0fff, 0x00070000, 3688c2ecf20Sopenharmony_ci 0x9194, 0x0fff0fff, 0x00070000, 3698c2ecf20Sopenharmony_ci 0x9194, 0x0fff0fff, 0x00070000, 3708c2ecf20Sopenharmony_ci 0x9148, 0xffff0001, 0xff000000, 3718c2ecf20Sopenharmony_ci 0x9148, 0xffff0001, 0xff000000, 3728c2ecf20Sopenharmony_ci 0x9190, 0x0fff0fff, 0x00090008, 3738c2ecf20Sopenharmony_ci 0x9190, 0x0fff0fff, 0x00090008, 3748c2ecf20Sopenharmony_ci 0x91ac, 0x0fff0fff, 0x00090008, 3758c2ecf20Sopenharmony_ci 0x91ac, 0x0fff0fff, 0x00090008, 3768c2ecf20Sopenharmony_ci 0x3f94, 0xffff0000, 0xff000000, 3778c2ecf20Sopenharmony_ci 0x3f94, 0xffff0000, 0xff000000, 3788c2ecf20Sopenharmony_ci 0x914c, 0xffff0000, 0xff000000, 3798c2ecf20Sopenharmony_ci 0x914c, 0xffff0000, 0xff000000, 3808c2ecf20Sopenharmony_ci 0x929c, 0x00000fff, 0x00000001, 3818c2ecf20Sopenharmony_ci 0x929c, 0x00000fff, 0x00000001, 3828c2ecf20Sopenharmony_ci 0x55e4, 0xff607fff, 0xfc000100, 3838c2ecf20Sopenharmony_ci 0x8a18, 0xff000fff, 0x00000100, 3848c2ecf20Sopenharmony_ci 0x8a18, 0xff000fff, 0x00000100, 3858c2ecf20Sopenharmony_ci 0x8b28, 0xff000fff, 0x00000100, 3868c2ecf20Sopenharmony_ci 0x8b28, 0xff000fff, 0x00000100, 3878c2ecf20Sopenharmony_ci 0x9144, 0xfffc0fff, 0x00000100, 3888c2ecf20Sopenharmony_ci 0x9144, 0xfffc0fff, 0x00000100, 3898c2ecf20Sopenharmony_ci 0x6ed8, 0x00010101, 0x00010000, 3908c2ecf20Sopenharmony_ci 0x9830, 0xffffffff, 0x00000000, 3918c2ecf20Sopenharmony_ci 0x9830, 0xffffffff, 0x00000000, 3928c2ecf20Sopenharmony_ci 0x9834, 0xf00fffff, 0x00000400, 3938c2ecf20Sopenharmony_ci 0x9834, 0xf00fffff, 0x00000400, 3948c2ecf20Sopenharmony_ci 0x9838, 0xfffffffe, 0x00000000, 3958c2ecf20Sopenharmony_ci 0x9838, 0xfffffffe, 0x00000000, 3968c2ecf20Sopenharmony_ci 0xd0c0, 0xff000fff, 0x00000100, 3978c2ecf20Sopenharmony_ci 0xd02c, 0xbfffff1f, 0x08421000, 3988c2ecf20Sopenharmony_ci 0xd02c, 0xbfffff1f, 0x08421000, 3998c2ecf20Sopenharmony_ci 0xd0b8, 0x73773777, 0x12010001, 4008c2ecf20Sopenharmony_ci 0xd0b8, 0x73773777, 0x12010001, 4018c2ecf20Sopenharmony_ci 0x5bb0, 0x000000f0, 0x00000070, 4028c2ecf20Sopenharmony_ci 0x98f8, 0x73773777, 0x12010001, 4038c2ecf20Sopenharmony_ci 0x98f8, 0x73773777, 0x12010001, 4048c2ecf20Sopenharmony_ci 0x98fc, 0xffffffff, 0x00000010, 4058c2ecf20Sopenharmony_ci 0x98fc, 0xffffffff, 0x00000010, 4068c2ecf20Sopenharmony_ci 0x9b7c, 0x00ff0000, 0x00fc0000, 4078c2ecf20Sopenharmony_ci 0x9b7c, 0x00ff0000, 0x00fc0000, 4088c2ecf20Sopenharmony_ci 0x8030, 0x00001f0f, 0x0000100a, 4098c2ecf20Sopenharmony_ci 0x8030, 0x00001f0f, 0x0000100a, 4108c2ecf20Sopenharmony_ci 0x2f48, 0x73773777, 0x12010001, 4118c2ecf20Sopenharmony_ci 0x2f48, 0x73773777, 0x12010001, 4128c2ecf20Sopenharmony_ci 0x2408, 0x00030000, 0x000c007f, 4138c2ecf20Sopenharmony_ci 0x8a14, 0xf000003f, 0x00000007, 4148c2ecf20Sopenharmony_ci 0x8a14, 0xf000003f, 0x00000007, 4158c2ecf20Sopenharmony_ci 0x8b24, 0x3fff3fff, 0x00ff0fff, 4168c2ecf20Sopenharmony_ci 0x8b24, 0x3fff3fff, 0x00ff0fff, 4178c2ecf20Sopenharmony_ci 0x8b10, 0x0000ff0f, 0x00000000, 4188c2ecf20Sopenharmony_ci 0x8b10, 0x0000ff0f, 0x00000000, 4198c2ecf20Sopenharmony_ci 0x28a4c, 0x07ffffff, 0x06000000, 4208c2ecf20Sopenharmony_ci 0x28a4c, 0x07ffffff, 0x06000000, 4218c2ecf20Sopenharmony_ci 0x4d8, 0x00000fff, 0x00000100, 4228c2ecf20Sopenharmony_ci 0x4d8, 0x00000fff, 0x00000100, 4238c2ecf20Sopenharmony_ci 0xa008, 0xffffffff, 0x00010000, 4248c2ecf20Sopenharmony_ci 0xa008, 0xffffffff, 0x00010000, 4258c2ecf20Sopenharmony_ci 0x913c, 0xffff03ff, 0x01000100, 4268c2ecf20Sopenharmony_ci 0x913c, 0xffff03ff, 0x01000100, 4278c2ecf20Sopenharmony_ci 0x90e8, 0x001fffff, 0x010400c0, 4288c2ecf20Sopenharmony_ci 0x8c00, 0x000000ff, 0x00000003, 4298c2ecf20Sopenharmony_ci 0x8c00, 0x000000ff, 0x00000003, 4308c2ecf20Sopenharmony_ci 0x8c04, 0xf8ff00ff, 0x40600060, 4318c2ecf20Sopenharmony_ci 0x8c04, 0xf8ff00ff, 0x40600060, 4328c2ecf20Sopenharmony_ci 0x8c30, 0x0000000f, 0x00040005, 4338c2ecf20Sopenharmony_ci 0x8cf0, 0x1fff1fff, 0x08e00410, 4348c2ecf20Sopenharmony_ci 0x8cf0, 0x1fff1fff, 0x08e00410, 4358c2ecf20Sopenharmony_ci 0x900c, 0x00ffffff, 0x0017071f, 4368c2ecf20Sopenharmony_ci 0x28350, 0x00000f01, 0x00000000, 4378c2ecf20Sopenharmony_ci 0x28350, 0x00000f01, 0x00000000, 4388c2ecf20Sopenharmony_ci 0x9508, 0xf700071f, 0x00000002, 4398c2ecf20Sopenharmony_ci 0x9508, 0xf700071f, 0x00000002, 4408c2ecf20Sopenharmony_ci 0x9688, 0x00300000, 0x0017000f, 4418c2ecf20Sopenharmony_ci 0x960c, 0xffffffff, 0x54763210, 4428c2ecf20Sopenharmony_ci 0x960c, 0xffffffff, 0x54763210, 4438c2ecf20Sopenharmony_ci 0x20ef8, 0x01ff01ff, 0x00000002, 4448c2ecf20Sopenharmony_ci 0x20e98, 0xfffffbff, 0x00200000, 4458c2ecf20Sopenharmony_ci 0x2015c, 0xffffffff, 0x00000f40, 4468c2ecf20Sopenharmony_ci 0x88c4, 0x001f3ae3, 0x00000082, 4478c2ecf20Sopenharmony_ci 0x88c4, 0x001f3ae3, 0x00000082, 4488c2ecf20Sopenharmony_ci 0x8978, 0x3fffffff, 0x04050140, 4498c2ecf20Sopenharmony_ci 0x8978, 0x3fffffff, 0x04050140, 4508c2ecf20Sopenharmony_ci 0x88d4, 0x0000001f, 0x00000010, 4518c2ecf20Sopenharmony_ci 0x88d4, 0x0000001f, 0x00000010, 4528c2ecf20Sopenharmony_ci 0x8974, 0xffffffff, 0x00000000, 4538c2ecf20Sopenharmony_ci 0x8974, 0xffffffff, 0x00000000 4548c2ecf20Sopenharmony_ci}; 4558c2ecf20Sopenharmony_ci 4568c2ecf20Sopenharmony_cistatic void ni_init_golden_registers(struct radeon_device *rdev) 4578c2ecf20Sopenharmony_ci{ 4588c2ecf20Sopenharmony_ci switch (rdev->family) { 4598c2ecf20Sopenharmony_ci case CHIP_CAYMAN: 4608c2ecf20Sopenharmony_ci radeon_program_register_sequence(rdev, 4618c2ecf20Sopenharmony_ci cayman_golden_registers, 4628c2ecf20Sopenharmony_ci (const u32)ARRAY_SIZE(cayman_golden_registers)); 4638c2ecf20Sopenharmony_ci radeon_program_register_sequence(rdev, 4648c2ecf20Sopenharmony_ci cayman_golden_registers2, 4658c2ecf20Sopenharmony_ci (const u32)ARRAY_SIZE(cayman_golden_registers2)); 4668c2ecf20Sopenharmony_ci break; 4678c2ecf20Sopenharmony_ci case CHIP_ARUBA: 4688c2ecf20Sopenharmony_ci if ((rdev->pdev->device == 0x9900) || 4698c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9901) || 4708c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9903) || 4718c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9904) || 4728c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9905) || 4738c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9906) || 4748c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9907) || 4758c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9908) || 4768c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9909) || 4778c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x990A) || 4788c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x990B) || 4798c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x990C) || 4808c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x990D) || 4818c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x990E) || 4828c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x990F) || 4838c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9910) || 4848c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9913) || 4858c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9917) || 4868c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9918)) { 4878c2ecf20Sopenharmony_ci radeon_program_register_sequence(rdev, 4888c2ecf20Sopenharmony_ci dvst_golden_registers, 4898c2ecf20Sopenharmony_ci (const u32)ARRAY_SIZE(dvst_golden_registers)); 4908c2ecf20Sopenharmony_ci radeon_program_register_sequence(rdev, 4918c2ecf20Sopenharmony_ci dvst_golden_registers2, 4928c2ecf20Sopenharmony_ci (const u32)ARRAY_SIZE(dvst_golden_registers2)); 4938c2ecf20Sopenharmony_ci } else { 4948c2ecf20Sopenharmony_ci radeon_program_register_sequence(rdev, 4958c2ecf20Sopenharmony_ci scrapper_golden_registers, 4968c2ecf20Sopenharmony_ci (const u32)ARRAY_SIZE(scrapper_golden_registers)); 4978c2ecf20Sopenharmony_ci radeon_program_register_sequence(rdev, 4988c2ecf20Sopenharmony_ci dvst_golden_registers2, 4998c2ecf20Sopenharmony_ci (const u32)ARRAY_SIZE(dvst_golden_registers2)); 5008c2ecf20Sopenharmony_ci } 5018c2ecf20Sopenharmony_ci break; 5028c2ecf20Sopenharmony_ci default: 5038c2ecf20Sopenharmony_ci break; 5048c2ecf20Sopenharmony_ci } 5058c2ecf20Sopenharmony_ci} 5068c2ecf20Sopenharmony_ci 5078c2ecf20Sopenharmony_ci#define BTC_IO_MC_REGS_SIZE 29 5088c2ecf20Sopenharmony_ci 5098c2ecf20Sopenharmony_cistatic const u32 barts_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = { 5108c2ecf20Sopenharmony_ci {0x00000077, 0xff010100}, 5118c2ecf20Sopenharmony_ci {0x00000078, 0x00000000}, 5128c2ecf20Sopenharmony_ci {0x00000079, 0x00001434}, 5138c2ecf20Sopenharmony_ci {0x0000007a, 0xcc08ec08}, 5148c2ecf20Sopenharmony_ci {0x0000007b, 0x00040000}, 5158c2ecf20Sopenharmony_ci {0x0000007c, 0x000080c0}, 5168c2ecf20Sopenharmony_ci {0x0000007d, 0x09000000}, 5178c2ecf20Sopenharmony_ci {0x0000007e, 0x00210404}, 5188c2ecf20Sopenharmony_ci {0x00000081, 0x08a8e800}, 5198c2ecf20Sopenharmony_ci {0x00000082, 0x00030444}, 5208c2ecf20Sopenharmony_ci {0x00000083, 0x00000000}, 5218c2ecf20Sopenharmony_ci {0x00000085, 0x00000001}, 5228c2ecf20Sopenharmony_ci {0x00000086, 0x00000002}, 5238c2ecf20Sopenharmony_ci {0x00000087, 0x48490000}, 5248c2ecf20Sopenharmony_ci {0x00000088, 0x20244647}, 5258c2ecf20Sopenharmony_ci {0x00000089, 0x00000005}, 5268c2ecf20Sopenharmony_ci {0x0000008b, 0x66030000}, 5278c2ecf20Sopenharmony_ci {0x0000008c, 0x00006603}, 5288c2ecf20Sopenharmony_ci {0x0000008d, 0x00000100}, 5298c2ecf20Sopenharmony_ci {0x0000008f, 0x00001c0a}, 5308c2ecf20Sopenharmony_ci {0x00000090, 0xff000001}, 5318c2ecf20Sopenharmony_ci {0x00000094, 0x00101101}, 5328c2ecf20Sopenharmony_ci {0x00000095, 0x00000fff}, 5338c2ecf20Sopenharmony_ci {0x00000096, 0x00116fff}, 5348c2ecf20Sopenharmony_ci {0x00000097, 0x60010000}, 5358c2ecf20Sopenharmony_ci {0x00000098, 0x10010000}, 5368c2ecf20Sopenharmony_ci {0x00000099, 0x00006000}, 5378c2ecf20Sopenharmony_ci {0x0000009a, 0x00001000}, 5388c2ecf20Sopenharmony_ci {0x0000009f, 0x00946a00} 5398c2ecf20Sopenharmony_ci}; 5408c2ecf20Sopenharmony_ci 5418c2ecf20Sopenharmony_cistatic const u32 turks_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = { 5428c2ecf20Sopenharmony_ci {0x00000077, 0xff010100}, 5438c2ecf20Sopenharmony_ci {0x00000078, 0x00000000}, 5448c2ecf20Sopenharmony_ci {0x00000079, 0x00001434}, 5458c2ecf20Sopenharmony_ci {0x0000007a, 0xcc08ec08}, 5468c2ecf20Sopenharmony_ci {0x0000007b, 0x00040000}, 5478c2ecf20Sopenharmony_ci {0x0000007c, 0x000080c0}, 5488c2ecf20Sopenharmony_ci {0x0000007d, 0x09000000}, 5498c2ecf20Sopenharmony_ci {0x0000007e, 0x00210404}, 5508c2ecf20Sopenharmony_ci {0x00000081, 0x08a8e800}, 5518c2ecf20Sopenharmony_ci {0x00000082, 0x00030444}, 5528c2ecf20Sopenharmony_ci {0x00000083, 0x00000000}, 5538c2ecf20Sopenharmony_ci {0x00000085, 0x00000001}, 5548c2ecf20Sopenharmony_ci {0x00000086, 0x00000002}, 5558c2ecf20Sopenharmony_ci {0x00000087, 0x48490000}, 5568c2ecf20Sopenharmony_ci {0x00000088, 0x20244647}, 5578c2ecf20Sopenharmony_ci {0x00000089, 0x00000005}, 5588c2ecf20Sopenharmony_ci {0x0000008b, 0x66030000}, 5598c2ecf20Sopenharmony_ci {0x0000008c, 0x00006603}, 5608c2ecf20Sopenharmony_ci {0x0000008d, 0x00000100}, 5618c2ecf20Sopenharmony_ci {0x0000008f, 0x00001c0a}, 5628c2ecf20Sopenharmony_ci {0x00000090, 0xff000001}, 5638c2ecf20Sopenharmony_ci {0x00000094, 0x00101101}, 5648c2ecf20Sopenharmony_ci {0x00000095, 0x00000fff}, 5658c2ecf20Sopenharmony_ci {0x00000096, 0x00116fff}, 5668c2ecf20Sopenharmony_ci {0x00000097, 0x60010000}, 5678c2ecf20Sopenharmony_ci {0x00000098, 0x10010000}, 5688c2ecf20Sopenharmony_ci {0x00000099, 0x00006000}, 5698c2ecf20Sopenharmony_ci {0x0000009a, 0x00001000}, 5708c2ecf20Sopenharmony_ci {0x0000009f, 0x00936a00} 5718c2ecf20Sopenharmony_ci}; 5728c2ecf20Sopenharmony_ci 5738c2ecf20Sopenharmony_cistatic const u32 caicos_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = { 5748c2ecf20Sopenharmony_ci {0x00000077, 0xff010100}, 5758c2ecf20Sopenharmony_ci {0x00000078, 0x00000000}, 5768c2ecf20Sopenharmony_ci {0x00000079, 0x00001434}, 5778c2ecf20Sopenharmony_ci {0x0000007a, 0xcc08ec08}, 5788c2ecf20Sopenharmony_ci {0x0000007b, 0x00040000}, 5798c2ecf20Sopenharmony_ci {0x0000007c, 0x000080c0}, 5808c2ecf20Sopenharmony_ci {0x0000007d, 0x09000000}, 5818c2ecf20Sopenharmony_ci {0x0000007e, 0x00210404}, 5828c2ecf20Sopenharmony_ci {0x00000081, 0x08a8e800}, 5838c2ecf20Sopenharmony_ci {0x00000082, 0x00030444}, 5848c2ecf20Sopenharmony_ci {0x00000083, 0x00000000}, 5858c2ecf20Sopenharmony_ci {0x00000085, 0x00000001}, 5868c2ecf20Sopenharmony_ci {0x00000086, 0x00000002}, 5878c2ecf20Sopenharmony_ci {0x00000087, 0x48490000}, 5888c2ecf20Sopenharmony_ci {0x00000088, 0x20244647}, 5898c2ecf20Sopenharmony_ci {0x00000089, 0x00000005}, 5908c2ecf20Sopenharmony_ci {0x0000008b, 0x66030000}, 5918c2ecf20Sopenharmony_ci {0x0000008c, 0x00006603}, 5928c2ecf20Sopenharmony_ci {0x0000008d, 0x00000100}, 5938c2ecf20Sopenharmony_ci {0x0000008f, 0x00001c0a}, 5948c2ecf20Sopenharmony_ci {0x00000090, 0xff000001}, 5958c2ecf20Sopenharmony_ci {0x00000094, 0x00101101}, 5968c2ecf20Sopenharmony_ci {0x00000095, 0x00000fff}, 5978c2ecf20Sopenharmony_ci {0x00000096, 0x00116fff}, 5988c2ecf20Sopenharmony_ci {0x00000097, 0x60010000}, 5998c2ecf20Sopenharmony_ci {0x00000098, 0x10010000}, 6008c2ecf20Sopenharmony_ci {0x00000099, 0x00006000}, 6018c2ecf20Sopenharmony_ci {0x0000009a, 0x00001000}, 6028c2ecf20Sopenharmony_ci {0x0000009f, 0x00916a00} 6038c2ecf20Sopenharmony_ci}; 6048c2ecf20Sopenharmony_ci 6058c2ecf20Sopenharmony_cistatic const u32 cayman_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = { 6068c2ecf20Sopenharmony_ci {0x00000077, 0xff010100}, 6078c2ecf20Sopenharmony_ci {0x00000078, 0x00000000}, 6088c2ecf20Sopenharmony_ci {0x00000079, 0x00001434}, 6098c2ecf20Sopenharmony_ci {0x0000007a, 0xcc08ec08}, 6108c2ecf20Sopenharmony_ci {0x0000007b, 0x00040000}, 6118c2ecf20Sopenharmony_ci {0x0000007c, 0x000080c0}, 6128c2ecf20Sopenharmony_ci {0x0000007d, 0x09000000}, 6138c2ecf20Sopenharmony_ci {0x0000007e, 0x00210404}, 6148c2ecf20Sopenharmony_ci {0x00000081, 0x08a8e800}, 6158c2ecf20Sopenharmony_ci {0x00000082, 0x00030444}, 6168c2ecf20Sopenharmony_ci {0x00000083, 0x00000000}, 6178c2ecf20Sopenharmony_ci {0x00000085, 0x00000001}, 6188c2ecf20Sopenharmony_ci {0x00000086, 0x00000002}, 6198c2ecf20Sopenharmony_ci {0x00000087, 0x48490000}, 6208c2ecf20Sopenharmony_ci {0x00000088, 0x20244647}, 6218c2ecf20Sopenharmony_ci {0x00000089, 0x00000005}, 6228c2ecf20Sopenharmony_ci {0x0000008b, 0x66030000}, 6238c2ecf20Sopenharmony_ci {0x0000008c, 0x00006603}, 6248c2ecf20Sopenharmony_ci {0x0000008d, 0x00000100}, 6258c2ecf20Sopenharmony_ci {0x0000008f, 0x00001c0a}, 6268c2ecf20Sopenharmony_ci {0x00000090, 0xff000001}, 6278c2ecf20Sopenharmony_ci {0x00000094, 0x00101101}, 6288c2ecf20Sopenharmony_ci {0x00000095, 0x00000fff}, 6298c2ecf20Sopenharmony_ci {0x00000096, 0x00116fff}, 6308c2ecf20Sopenharmony_ci {0x00000097, 0x60010000}, 6318c2ecf20Sopenharmony_ci {0x00000098, 0x10010000}, 6328c2ecf20Sopenharmony_ci {0x00000099, 0x00006000}, 6338c2ecf20Sopenharmony_ci {0x0000009a, 0x00001000}, 6348c2ecf20Sopenharmony_ci {0x0000009f, 0x00976b00} 6358c2ecf20Sopenharmony_ci}; 6368c2ecf20Sopenharmony_ci 6378c2ecf20Sopenharmony_ciint ni_mc_load_microcode(struct radeon_device *rdev) 6388c2ecf20Sopenharmony_ci{ 6398c2ecf20Sopenharmony_ci const __be32 *fw_data; 6408c2ecf20Sopenharmony_ci u32 mem_type, running, blackout = 0; 6418c2ecf20Sopenharmony_ci u32 *io_mc_regs; 6428c2ecf20Sopenharmony_ci int i, ucode_size, regs_size; 6438c2ecf20Sopenharmony_ci 6448c2ecf20Sopenharmony_ci if (!rdev->mc_fw) 6458c2ecf20Sopenharmony_ci return -EINVAL; 6468c2ecf20Sopenharmony_ci 6478c2ecf20Sopenharmony_ci switch (rdev->family) { 6488c2ecf20Sopenharmony_ci case CHIP_BARTS: 6498c2ecf20Sopenharmony_ci io_mc_regs = (u32 *)&barts_io_mc_regs; 6508c2ecf20Sopenharmony_ci ucode_size = BTC_MC_UCODE_SIZE; 6518c2ecf20Sopenharmony_ci regs_size = BTC_IO_MC_REGS_SIZE; 6528c2ecf20Sopenharmony_ci break; 6538c2ecf20Sopenharmony_ci case CHIP_TURKS: 6548c2ecf20Sopenharmony_ci io_mc_regs = (u32 *)&turks_io_mc_regs; 6558c2ecf20Sopenharmony_ci ucode_size = BTC_MC_UCODE_SIZE; 6568c2ecf20Sopenharmony_ci regs_size = BTC_IO_MC_REGS_SIZE; 6578c2ecf20Sopenharmony_ci break; 6588c2ecf20Sopenharmony_ci case CHIP_CAICOS: 6598c2ecf20Sopenharmony_ci default: 6608c2ecf20Sopenharmony_ci io_mc_regs = (u32 *)&caicos_io_mc_regs; 6618c2ecf20Sopenharmony_ci ucode_size = BTC_MC_UCODE_SIZE; 6628c2ecf20Sopenharmony_ci regs_size = BTC_IO_MC_REGS_SIZE; 6638c2ecf20Sopenharmony_ci break; 6648c2ecf20Sopenharmony_ci case CHIP_CAYMAN: 6658c2ecf20Sopenharmony_ci io_mc_regs = (u32 *)&cayman_io_mc_regs; 6668c2ecf20Sopenharmony_ci ucode_size = CAYMAN_MC_UCODE_SIZE; 6678c2ecf20Sopenharmony_ci regs_size = BTC_IO_MC_REGS_SIZE; 6688c2ecf20Sopenharmony_ci break; 6698c2ecf20Sopenharmony_ci } 6708c2ecf20Sopenharmony_ci 6718c2ecf20Sopenharmony_ci mem_type = (RREG32(MC_SEQ_MISC0) & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT; 6728c2ecf20Sopenharmony_ci running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK; 6738c2ecf20Sopenharmony_ci 6748c2ecf20Sopenharmony_ci if ((mem_type == MC_SEQ_MISC0_GDDR5_VALUE) && (running == 0)) { 6758c2ecf20Sopenharmony_ci if (running) { 6768c2ecf20Sopenharmony_ci blackout = RREG32(MC_SHARED_BLACKOUT_CNTL); 6778c2ecf20Sopenharmony_ci WREG32(MC_SHARED_BLACKOUT_CNTL, 1); 6788c2ecf20Sopenharmony_ci } 6798c2ecf20Sopenharmony_ci 6808c2ecf20Sopenharmony_ci /* reset the engine and set to writable */ 6818c2ecf20Sopenharmony_ci WREG32(MC_SEQ_SUP_CNTL, 0x00000008); 6828c2ecf20Sopenharmony_ci WREG32(MC_SEQ_SUP_CNTL, 0x00000010); 6838c2ecf20Sopenharmony_ci 6848c2ecf20Sopenharmony_ci /* load mc io regs */ 6858c2ecf20Sopenharmony_ci for (i = 0; i < regs_size; i++) { 6868c2ecf20Sopenharmony_ci WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]); 6878c2ecf20Sopenharmony_ci WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]); 6888c2ecf20Sopenharmony_ci } 6898c2ecf20Sopenharmony_ci /* load the MC ucode */ 6908c2ecf20Sopenharmony_ci fw_data = (const __be32 *)rdev->mc_fw->data; 6918c2ecf20Sopenharmony_ci for (i = 0; i < ucode_size; i++) 6928c2ecf20Sopenharmony_ci WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++)); 6938c2ecf20Sopenharmony_ci 6948c2ecf20Sopenharmony_ci /* put the engine back into the active state */ 6958c2ecf20Sopenharmony_ci WREG32(MC_SEQ_SUP_CNTL, 0x00000008); 6968c2ecf20Sopenharmony_ci WREG32(MC_SEQ_SUP_CNTL, 0x00000004); 6978c2ecf20Sopenharmony_ci WREG32(MC_SEQ_SUP_CNTL, 0x00000001); 6988c2ecf20Sopenharmony_ci 6998c2ecf20Sopenharmony_ci /* wait for training to complete */ 7008c2ecf20Sopenharmony_ci for (i = 0; i < rdev->usec_timeout; i++) { 7018c2ecf20Sopenharmony_ci if (RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD) 7028c2ecf20Sopenharmony_ci break; 7038c2ecf20Sopenharmony_ci udelay(1); 7048c2ecf20Sopenharmony_ci } 7058c2ecf20Sopenharmony_ci 7068c2ecf20Sopenharmony_ci if (running) 7078c2ecf20Sopenharmony_ci WREG32(MC_SHARED_BLACKOUT_CNTL, blackout); 7088c2ecf20Sopenharmony_ci } 7098c2ecf20Sopenharmony_ci 7108c2ecf20Sopenharmony_ci return 0; 7118c2ecf20Sopenharmony_ci} 7128c2ecf20Sopenharmony_ci 7138c2ecf20Sopenharmony_ciint ni_init_microcode(struct radeon_device *rdev) 7148c2ecf20Sopenharmony_ci{ 7158c2ecf20Sopenharmony_ci const char *chip_name; 7168c2ecf20Sopenharmony_ci const char *rlc_chip_name; 7178c2ecf20Sopenharmony_ci size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size; 7188c2ecf20Sopenharmony_ci size_t smc_req_size = 0; 7198c2ecf20Sopenharmony_ci char fw_name[30]; 7208c2ecf20Sopenharmony_ci int err; 7218c2ecf20Sopenharmony_ci 7228c2ecf20Sopenharmony_ci DRM_DEBUG("\n"); 7238c2ecf20Sopenharmony_ci 7248c2ecf20Sopenharmony_ci switch (rdev->family) { 7258c2ecf20Sopenharmony_ci case CHIP_BARTS: 7268c2ecf20Sopenharmony_ci chip_name = "BARTS"; 7278c2ecf20Sopenharmony_ci rlc_chip_name = "BTC"; 7288c2ecf20Sopenharmony_ci pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4; 7298c2ecf20Sopenharmony_ci me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4; 7308c2ecf20Sopenharmony_ci rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4; 7318c2ecf20Sopenharmony_ci mc_req_size = BTC_MC_UCODE_SIZE * 4; 7328c2ecf20Sopenharmony_ci smc_req_size = ALIGN(BARTS_SMC_UCODE_SIZE, 4); 7338c2ecf20Sopenharmony_ci break; 7348c2ecf20Sopenharmony_ci case CHIP_TURKS: 7358c2ecf20Sopenharmony_ci chip_name = "TURKS"; 7368c2ecf20Sopenharmony_ci rlc_chip_name = "BTC"; 7378c2ecf20Sopenharmony_ci pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4; 7388c2ecf20Sopenharmony_ci me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4; 7398c2ecf20Sopenharmony_ci rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4; 7408c2ecf20Sopenharmony_ci mc_req_size = BTC_MC_UCODE_SIZE * 4; 7418c2ecf20Sopenharmony_ci smc_req_size = ALIGN(TURKS_SMC_UCODE_SIZE, 4); 7428c2ecf20Sopenharmony_ci break; 7438c2ecf20Sopenharmony_ci case CHIP_CAICOS: 7448c2ecf20Sopenharmony_ci chip_name = "CAICOS"; 7458c2ecf20Sopenharmony_ci rlc_chip_name = "BTC"; 7468c2ecf20Sopenharmony_ci pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4; 7478c2ecf20Sopenharmony_ci me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4; 7488c2ecf20Sopenharmony_ci rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4; 7498c2ecf20Sopenharmony_ci mc_req_size = BTC_MC_UCODE_SIZE * 4; 7508c2ecf20Sopenharmony_ci smc_req_size = ALIGN(CAICOS_SMC_UCODE_SIZE, 4); 7518c2ecf20Sopenharmony_ci break; 7528c2ecf20Sopenharmony_ci case CHIP_CAYMAN: 7538c2ecf20Sopenharmony_ci chip_name = "CAYMAN"; 7548c2ecf20Sopenharmony_ci rlc_chip_name = "CAYMAN"; 7558c2ecf20Sopenharmony_ci pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4; 7568c2ecf20Sopenharmony_ci me_req_size = CAYMAN_PM4_UCODE_SIZE * 4; 7578c2ecf20Sopenharmony_ci rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4; 7588c2ecf20Sopenharmony_ci mc_req_size = CAYMAN_MC_UCODE_SIZE * 4; 7598c2ecf20Sopenharmony_ci smc_req_size = ALIGN(CAYMAN_SMC_UCODE_SIZE, 4); 7608c2ecf20Sopenharmony_ci break; 7618c2ecf20Sopenharmony_ci case CHIP_ARUBA: 7628c2ecf20Sopenharmony_ci chip_name = "ARUBA"; 7638c2ecf20Sopenharmony_ci rlc_chip_name = "ARUBA"; 7648c2ecf20Sopenharmony_ci /* pfp/me same size as CAYMAN */ 7658c2ecf20Sopenharmony_ci pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4; 7668c2ecf20Sopenharmony_ci me_req_size = CAYMAN_PM4_UCODE_SIZE * 4; 7678c2ecf20Sopenharmony_ci rlc_req_size = ARUBA_RLC_UCODE_SIZE * 4; 7688c2ecf20Sopenharmony_ci mc_req_size = 0; 7698c2ecf20Sopenharmony_ci break; 7708c2ecf20Sopenharmony_ci default: BUG(); 7718c2ecf20Sopenharmony_ci } 7728c2ecf20Sopenharmony_ci 7738c2ecf20Sopenharmony_ci DRM_INFO("Loading %s Microcode\n", chip_name); 7748c2ecf20Sopenharmony_ci 7758c2ecf20Sopenharmony_ci snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name); 7768c2ecf20Sopenharmony_ci err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev); 7778c2ecf20Sopenharmony_ci if (err) 7788c2ecf20Sopenharmony_ci goto out; 7798c2ecf20Sopenharmony_ci if (rdev->pfp_fw->size != pfp_req_size) { 7808c2ecf20Sopenharmony_ci pr_err("ni_cp: Bogus length %zu in firmware \"%s\"\n", 7818c2ecf20Sopenharmony_ci rdev->pfp_fw->size, fw_name); 7828c2ecf20Sopenharmony_ci err = -EINVAL; 7838c2ecf20Sopenharmony_ci goto out; 7848c2ecf20Sopenharmony_ci } 7858c2ecf20Sopenharmony_ci 7868c2ecf20Sopenharmony_ci snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name); 7878c2ecf20Sopenharmony_ci err = request_firmware(&rdev->me_fw, fw_name, rdev->dev); 7888c2ecf20Sopenharmony_ci if (err) 7898c2ecf20Sopenharmony_ci goto out; 7908c2ecf20Sopenharmony_ci if (rdev->me_fw->size != me_req_size) { 7918c2ecf20Sopenharmony_ci pr_err("ni_cp: Bogus length %zu in firmware \"%s\"\n", 7928c2ecf20Sopenharmony_ci rdev->me_fw->size, fw_name); 7938c2ecf20Sopenharmony_ci err = -EINVAL; 7948c2ecf20Sopenharmony_ci } 7958c2ecf20Sopenharmony_ci 7968c2ecf20Sopenharmony_ci snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name); 7978c2ecf20Sopenharmony_ci err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev); 7988c2ecf20Sopenharmony_ci if (err) 7998c2ecf20Sopenharmony_ci goto out; 8008c2ecf20Sopenharmony_ci if (rdev->rlc_fw->size != rlc_req_size) { 8018c2ecf20Sopenharmony_ci pr_err("ni_rlc: Bogus length %zu in firmware \"%s\"\n", 8028c2ecf20Sopenharmony_ci rdev->rlc_fw->size, fw_name); 8038c2ecf20Sopenharmony_ci err = -EINVAL; 8048c2ecf20Sopenharmony_ci } 8058c2ecf20Sopenharmony_ci 8068c2ecf20Sopenharmony_ci /* no MC ucode on TN */ 8078c2ecf20Sopenharmony_ci if (!(rdev->flags & RADEON_IS_IGP)) { 8088c2ecf20Sopenharmony_ci snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); 8098c2ecf20Sopenharmony_ci err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); 8108c2ecf20Sopenharmony_ci if (err) 8118c2ecf20Sopenharmony_ci goto out; 8128c2ecf20Sopenharmony_ci if (rdev->mc_fw->size != mc_req_size) { 8138c2ecf20Sopenharmony_ci pr_err("ni_mc: Bogus length %zu in firmware \"%s\"\n", 8148c2ecf20Sopenharmony_ci rdev->mc_fw->size, fw_name); 8158c2ecf20Sopenharmony_ci err = -EINVAL; 8168c2ecf20Sopenharmony_ci } 8178c2ecf20Sopenharmony_ci } 8188c2ecf20Sopenharmony_ci 8198c2ecf20Sopenharmony_ci if ((rdev->family >= CHIP_BARTS) && (rdev->family <= CHIP_CAYMAN)) { 8208c2ecf20Sopenharmony_ci snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); 8218c2ecf20Sopenharmony_ci err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); 8228c2ecf20Sopenharmony_ci if (err) { 8238c2ecf20Sopenharmony_ci pr_err("smc: error loading firmware \"%s\"\n", fw_name); 8248c2ecf20Sopenharmony_ci release_firmware(rdev->smc_fw); 8258c2ecf20Sopenharmony_ci rdev->smc_fw = NULL; 8268c2ecf20Sopenharmony_ci err = 0; 8278c2ecf20Sopenharmony_ci } else if (rdev->smc_fw->size != smc_req_size) { 8288c2ecf20Sopenharmony_ci pr_err("ni_mc: Bogus length %zu in firmware \"%s\"\n", 8298c2ecf20Sopenharmony_ci rdev->mc_fw->size, fw_name); 8308c2ecf20Sopenharmony_ci err = -EINVAL; 8318c2ecf20Sopenharmony_ci } 8328c2ecf20Sopenharmony_ci } 8338c2ecf20Sopenharmony_ci 8348c2ecf20Sopenharmony_ciout: 8358c2ecf20Sopenharmony_ci if (err) { 8368c2ecf20Sopenharmony_ci if (err != -EINVAL) 8378c2ecf20Sopenharmony_ci pr_err("ni_cp: Failed to load firmware \"%s\"\n", 8388c2ecf20Sopenharmony_ci fw_name); 8398c2ecf20Sopenharmony_ci release_firmware(rdev->pfp_fw); 8408c2ecf20Sopenharmony_ci rdev->pfp_fw = NULL; 8418c2ecf20Sopenharmony_ci release_firmware(rdev->me_fw); 8428c2ecf20Sopenharmony_ci rdev->me_fw = NULL; 8438c2ecf20Sopenharmony_ci release_firmware(rdev->rlc_fw); 8448c2ecf20Sopenharmony_ci rdev->rlc_fw = NULL; 8458c2ecf20Sopenharmony_ci release_firmware(rdev->mc_fw); 8468c2ecf20Sopenharmony_ci rdev->mc_fw = NULL; 8478c2ecf20Sopenharmony_ci } 8488c2ecf20Sopenharmony_ci return err; 8498c2ecf20Sopenharmony_ci} 8508c2ecf20Sopenharmony_ci 8518c2ecf20Sopenharmony_ci/** 8528c2ecf20Sopenharmony_ci * cayman_get_allowed_info_register - fetch the register for the info ioctl 8538c2ecf20Sopenharmony_ci * 8548c2ecf20Sopenharmony_ci * @rdev: radeon_device pointer 8558c2ecf20Sopenharmony_ci * @reg: register offset in bytes 8568c2ecf20Sopenharmony_ci * @val: register value 8578c2ecf20Sopenharmony_ci * 8588c2ecf20Sopenharmony_ci * Returns 0 for success or -EINVAL for an invalid register 8598c2ecf20Sopenharmony_ci * 8608c2ecf20Sopenharmony_ci */ 8618c2ecf20Sopenharmony_ciint cayman_get_allowed_info_register(struct radeon_device *rdev, 8628c2ecf20Sopenharmony_ci u32 reg, u32 *val) 8638c2ecf20Sopenharmony_ci{ 8648c2ecf20Sopenharmony_ci switch (reg) { 8658c2ecf20Sopenharmony_ci case GRBM_STATUS: 8668c2ecf20Sopenharmony_ci case GRBM_STATUS_SE0: 8678c2ecf20Sopenharmony_ci case GRBM_STATUS_SE1: 8688c2ecf20Sopenharmony_ci case SRBM_STATUS: 8698c2ecf20Sopenharmony_ci case SRBM_STATUS2: 8708c2ecf20Sopenharmony_ci case (DMA_STATUS_REG + DMA0_REGISTER_OFFSET): 8718c2ecf20Sopenharmony_ci case (DMA_STATUS_REG + DMA1_REGISTER_OFFSET): 8728c2ecf20Sopenharmony_ci case UVD_STATUS: 8738c2ecf20Sopenharmony_ci *val = RREG32(reg); 8748c2ecf20Sopenharmony_ci return 0; 8758c2ecf20Sopenharmony_ci default: 8768c2ecf20Sopenharmony_ci return -EINVAL; 8778c2ecf20Sopenharmony_ci } 8788c2ecf20Sopenharmony_ci} 8798c2ecf20Sopenharmony_ci 8808c2ecf20Sopenharmony_ciint tn_get_temp(struct radeon_device *rdev) 8818c2ecf20Sopenharmony_ci{ 8828c2ecf20Sopenharmony_ci u32 temp = RREG32_SMC(TN_CURRENT_GNB_TEMP) & 0x7ff; 8838c2ecf20Sopenharmony_ci int actual_temp = (temp / 8) - 49; 8848c2ecf20Sopenharmony_ci 8858c2ecf20Sopenharmony_ci return actual_temp * 1000; 8868c2ecf20Sopenharmony_ci} 8878c2ecf20Sopenharmony_ci 8888c2ecf20Sopenharmony_ci/* 8898c2ecf20Sopenharmony_ci * Core functions 8908c2ecf20Sopenharmony_ci */ 8918c2ecf20Sopenharmony_cistatic void cayman_gpu_init(struct radeon_device *rdev) 8928c2ecf20Sopenharmony_ci{ 8938c2ecf20Sopenharmony_ci u32 gb_addr_config = 0; 8948c2ecf20Sopenharmony_ci u32 mc_shared_chmap, mc_arb_ramcfg; 8958c2ecf20Sopenharmony_ci u32 cgts_tcc_disable; 8968c2ecf20Sopenharmony_ci u32 sx_debug_1; 8978c2ecf20Sopenharmony_ci u32 smx_dc_ctl0; 8988c2ecf20Sopenharmony_ci u32 cgts_sm_ctrl_reg; 8998c2ecf20Sopenharmony_ci u32 hdp_host_path_cntl; 9008c2ecf20Sopenharmony_ci u32 tmp; 9018c2ecf20Sopenharmony_ci u32 disabled_rb_mask; 9028c2ecf20Sopenharmony_ci int i, j; 9038c2ecf20Sopenharmony_ci 9048c2ecf20Sopenharmony_ci switch (rdev->family) { 9058c2ecf20Sopenharmony_ci case CHIP_CAYMAN: 9068c2ecf20Sopenharmony_ci rdev->config.cayman.max_shader_engines = 2; 9078c2ecf20Sopenharmony_ci rdev->config.cayman.max_pipes_per_simd = 4; 9088c2ecf20Sopenharmony_ci rdev->config.cayman.max_tile_pipes = 8; 9098c2ecf20Sopenharmony_ci rdev->config.cayman.max_simds_per_se = 12; 9108c2ecf20Sopenharmony_ci rdev->config.cayman.max_backends_per_se = 4; 9118c2ecf20Sopenharmony_ci rdev->config.cayman.max_texture_channel_caches = 8; 9128c2ecf20Sopenharmony_ci rdev->config.cayman.max_gprs = 256; 9138c2ecf20Sopenharmony_ci rdev->config.cayman.max_threads = 256; 9148c2ecf20Sopenharmony_ci rdev->config.cayman.max_gs_threads = 32; 9158c2ecf20Sopenharmony_ci rdev->config.cayman.max_stack_entries = 512; 9168c2ecf20Sopenharmony_ci rdev->config.cayman.sx_num_of_sets = 8; 9178c2ecf20Sopenharmony_ci rdev->config.cayman.sx_max_export_size = 256; 9188c2ecf20Sopenharmony_ci rdev->config.cayman.sx_max_export_pos_size = 64; 9198c2ecf20Sopenharmony_ci rdev->config.cayman.sx_max_export_smx_size = 192; 9208c2ecf20Sopenharmony_ci rdev->config.cayman.max_hw_contexts = 8; 9218c2ecf20Sopenharmony_ci rdev->config.cayman.sq_num_cf_insts = 2; 9228c2ecf20Sopenharmony_ci 9238c2ecf20Sopenharmony_ci rdev->config.cayman.sc_prim_fifo_size = 0x100; 9248c2ecf20Sopenharmony_ci rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30; 9258c2ecf20Sopenharmony_ci rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130; 9268c2ecf20Sopenharmony_ci gb_addr_config = CAYMAN_GB_ADDR_CONFIG_GOLDEN; 9278c2ecf20Sopenharmony_ci break; 9288c2ecf20Sopenharmony_ci case CHIP_ARUBA: 9298c2ecf20Sopenharmony_ci default: 9308c2ecf20Sopenharmony_ci rdev->config.cayman.max_shader_engines = 1; 9318c2ecf20Sopenharmony_ci rdev->config.cayman.max_pipes_per_simd = 4; 9328c2ecf20Sopenharmony_ci rdev->config.cayman.max_tile_pipes = 2; 9338c2ecf20Sopenharmony_ci if ((rdev->pdev->device == 0x9900) || 9348c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9901) || 9358c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9905) || 9368c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9906) || 9378c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9907) || 9388c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9908) || 9398c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9909) || 9408c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x990B) || 9418c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x990C) || 9428c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x990F) || 9438c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9910) || 9448c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9917) || 9458c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9999) || 9468c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x999C)) { 9478c2ecf20Sopenharmony_ci rdev->config.cayman.max_simds_per_se = 6; 9488c2ecf20Sopenharmony_ci rdev->config.cayman.max_backends_per_se = 2; 9498c2ecf20Sopenharmony_ci rdev->config.cayman.max_hw_contexts = 8; 9508c2ecf20Sopenharmony_ci rdev->config.cayman.sx_max_export_size = 256; 9518c2ecf20Sopenharmony_ci rdev->config.cayman.sx_max_export_pos_size = 64; 9528c2ecf20Sopenharmony_ci rdev->config.cayman.sx_max_export_smx_size = 192; 9538c2ecf20Sopenharmony_ci } else if ((rdev->pdev->device == 0x9903) || 9548c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9904) || 9558c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x990A) || 9568c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x990D) || 9578c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x990E) || 9588c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9913) || 9598c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9918) || 9608c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x999D)) { 9618c2ecf20Sopenharmony_ci rdev->config.cayman.max_simds_per_se = 4; 9628c2ecf20Sopenharmony_ci rdev->config.cayman.max_backends_per_se = 2; 9638c2ecf20Sopenharmony_ci rdev->config.cayman.max_hw_contexts = 8; 9648c2ecf20Sopenharmony_ci rdev->config.cayman.sx_max_export_size = 256; 9658c2ecf20Sopenharmony_ci rdev->config.cayman.sx_max_export_pos_size = 64; 9668c2ecf20Sopenharmony_ci rdev->config.cayman.sx_max_export_smx_size = 192; 9678c2ecf20Sopenharmony_ci } else if ((rdev->pdev->device == 0x9919) || 9688c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9990) || 9698c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9991) || 9708c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9994) || 9718c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9995) || 9728c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x9996) || 9738c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x999A) || 9748c2ecf20Sopenharmony_ci (rdev->pdev->device == 0x99A0)) { 9758c2ecf20Sopenharmony_ci rdev->config.cayman.max_simds_per_se = 3; 9768c2ecf20Sopenharmony_ci rdev->config.cayman.max_backends_per_se = 1; 9778c2ecf20Sopenharmony_ci rdev->config.cayman.max_hw_contexts = 4; 9788c2ecf20Sopenharmony_ci rdev->config.cayman.sx_max_export_size = 128; 9798c2ecf20Sopenharmony_ci rdev->config.cayman.sx_max_export_pos_size = 32; 9808c2ecf20Sopenharmony_ci rdev->config.cayman.sx_max_export_smx_size = 96; 9818c2ecf20Sopenharmony_ci } else { 9828c2ecf20Sopenharmony_ci rdev->config.cayman.max_simds_per_se = 2; 9838c2ecf20Sopenharmony_ci rdev->config.cayman.max_backends_per_se = 1; 9848c2ecf20Sopenharmony_ci rdev->config.cayman.max_hw_contexts = 4; 9858c2ecf20Sopenharmony_ci rdev->config.cayman.sx_max_export_size = 128; 9868c2ecf20Sopenharmony_ci rdev->config.cayman.sx_max_export_pos_size = 32; 9878c2ecf20Sopenharmony_ci rdev->config.cayman.sx_max_export_smx_size = 96; 9888c2ecf20Sopenharmony_ci } 9898c2ecf20Sopenharmony_ci rdev->config.cayman.max_texture_channel_caches = 2; 9908c2ecf20Sopenharmony_ci rdev->config.cayman.max_gprs = 256; 9918c2ecf20Sopenharmony_ci rdev->config.cayman.max_threads = 256; 9928c2ecf20Sopenharmony_ci rdev->config.cayman.max_gs_threads = 32; 9938c2ecf20Sopenharmony_ci rdev->config.cayman.max_stack_entries = 512; 9948c2ecf20Sopenharmony_ci rdev->config.cayman.sx_num_of_sets = 8; 9958c2ecf20Sopenharmony_ci rdev->config.cayman.sq_num_cf_insts = 2; 9968c2ecf20Sopenharmony_ci 9978c2ecf20Sopenharmony_ci rdev->config.cayman.sc_prim_fifo_size = 0x40; 9988c2ecf20Sopenharmony_ci rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30; 9998c2ecf20Sopenharmony_ci rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130; 10008c2ecf20Sopenharmony_ci gb_addr_config = ARUBA_GB_ADDR_CONFIG_GOLDEN; 10018c2ecf20Sopenharmony_ci break; 10028c2ecf20Sopenharmony_ci } 10038c2ecf20Sopenharmony_ci 10048c2ecf20Sopenharmony_ci /* Initialize HDP */ 10058c2ecf20Sopenharmony_ci for (i = 0, j = 0; i < 32; i++, j += 0x18) { 10068c2ecf20Sopenharmony_ci WREG32((0x2c14 + j), 0x00000000); 10078c2ecf20Sopenharmony_ci WREG32((0x2c18 + j), 0x00000000); 10088c2ecf20Sopenharmony_ci WREG32((0x2c1c + j), 0x00000000); 10098c2ecf20Sopenharmony_ci WREG32((0x2c20 + j), 0x00000000); 10108c2ecf20Sopenharmony_ci WREG32((0x2c24 + j), 0x00000000); 10118c2ecf20Sopenharmony_ci } 10128c2ecf20Sopenharmony_ci 10138c2ecf20Sopenharmony_ci WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); 10148c2ecf20Sopenharmony_ci WREG32(SRBM_INT_CNTL, 0x1); 10158c2ecf20Sopenharmony_ci WREG32(SRBM_INT_ACK, 0x1); 10168c2ecf20Sopenharmony_ci 10178c2ecf20Sopenharmony_ci evergreen_fix_pci_max_read_req_size(rdev); 10188c2ecf20Sopenharmony_ci 10198c2ecf20Sopenharmony_ci mc_shared_chmap = RREG32(MC_SHARED_CHMAP); 10208c2ecf20Sopenharmony_ci mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); 10218c2ecf20Sopenharmony_ci 10228c2ecf20Sopenharmony_ci tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT; 10238c2ecf20Sopenharmony_ci rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024; 10248c2ecf20Sopenharmony_ci if (rdev->config.cayman.mem_row_size_in_kb > 4) 10258c2ecf20Sopenharmony_ci rdev->config.cayman.mem_row_size_in_kb = 4; 10268c2ecf20Sopenharmony_ci /* XXX use MC settings? */ 10278c2ecf20Sopenharmony_ci rdev->config.cayman.shader_engine_tile_size = 32; 10288c2ecf20Sopenharmony_ci rdev->config.cayman.num_gpus = 1; 10298c2ecf20Sopenharmony_ci rdev->config.cayman.multi_gpu_tile_size = 64; 10308c2ecf20Sopenharmony_ci 10318c2ecf20Sopenharmony_ci tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT; 10328c2ecf20Sopenharmony_ci rdev->config.cayman.num_tile_pipes = (1 << tmp); 10338c2ecf20Sopenharmony_ci tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT; 10348c2ecf20Sopenharmony_ci rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256; 10358c2ecf20Sopenharmony_ci tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT; 10368c2ecf20Sopenharmony_ci rdev->config.cayman.num_shader_engines = tmp + 1; 10378c2ecf20Sopenharmony_ci tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT; 10388c2ecf20Sopenharmony_ci rdev->config.cayman.num_gpus = tmp + 1; 10398c2ecf20Sopenharmony_ci tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT; 10408c2ecf20Sopenharmony_ci rdev->config.cayman.multi_gpu_tile_size = 1 << tmp; 10418c2ecf20Sopenharmony_ci tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT; 10428c2ecf20Sopenharmony_ci rdev->config.cayman.mem_row_size_in_kb = 1 << tmp; 10438c2ecf20Sopenharmony_ci 10448c2ecf20Sopenharmony_ci 10458c2ecf20Sopenharmony_ci /* setup tiling info dword. gb_addr_config is not adequate since it does 10468c2ecf20Sopenharmony_ci * not have bank info, so create a custom tiling dword. 10478c2ecf20Sopenharmony_ci * bits 3:0 num_pipes 10488c2ecf20Sopenharmony_ci * bits 7:4 num_banks 10498c2ecf20Sopenharmony_ci * bits 11:8 group_size 10508c2ecf20Sopenharmony_ci * bits 15:12 row_size 10518c2ecf20Sopenharmony_ci */ 10528c2ecf20Sopenharmony_ci rdev->config.cayman.tile_config = 0; 10538c2ecf20Sopenharmony_ci switch (rdev->config.cayman.num_tile_pipes) { 10548c2ecf20Sopenharmony_ci case 1: 10558c2ecf20Sopenharmony_ci default: 10568c2ecf20Sopenharmony_ci rdev->config.cayman.tile_config |= (0 << 0); 10578c2ecf20Sopenharmony_ci break; 10588c2ecf20Sopenharmony_ci case 2: 10598c2ecf20Sopenharmony_ci rdev->config.cayman.tile_config |= (1 << 0); 10608c2ecf20Sopenharmony_ci break; 10618c2ecf20Sopenharmony_ci case 4: 10628c2ecf20Sopenharmony_ci rdev->config.cayman.tile_config |= (2 << 0); 10638c2ecf20Sopenharmony_ci break; 10648c2ecf20Sopenharmony_ci case 8: 10658c2ecf20Sopenharmony_ci rdev->config.cayman.tile_config |= (3 << 0); 10668c2ecf20Sopenharmony_ci break; 10678c2ecf20Sopenharmony_ci } 10688c2ecf20Sopenharmony_ci 10698c2ecf20Sopenharmony_ci /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */ 10708c2ecf20Sopenharmony_ci if (rdev->flags & RADEON_IS_IGP) 10718c2ecf20Sopenharmony_ci rdev->config.cayman.tile_config |= 1 << 4; 10728c2ecf20Sopenharmony_ci else { 10738c2ecf20Sopenharmony_ci switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) { 10748c2ecf20Sopenharmony_ci case 0: /* four banks */ 10758c2ecf20Sopenharmony_ci rdev->config.cayman.tile_config |= 0 << 4; 10768c2ecf20Sopenharmony_ci break; 10778c2ecf20Sopenharmony_ci case 1: /* eight banks */ 10788c2ecf20Sopenharmony_ci rdev->config.cayman.tile_config |= 1 << 4; 10798c2ecf20Sopenharmony_ci break; 10808c2ecf20Sopenharmony_ci case 2: /* sixteen banks */ 10818c2ecf20Sopenharmony_ci default: 10828c2ecf20Sopenharmony_ci rdev->config.cayman.tile_config |= 2 << 4; 10838c2ecf20Sopenharmony_ci break; 10848c2ecf20Sopenharmony_ci } 10858c2ecf20Sopenharmony_ci } 10868c2ecf20Sopenharmony_ci rdev->config.cayman.tile_config |= 10878c2ecf20Sopenharmony_ci ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8; 10888c2ecf20Sopenharmony_ci rdev->config.cayman.tile_config |= 10898c2ecf20Sopenharmony_ci ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12; 10908c2ecf20Sopenharmony_ci 10918c2ecf20Sopenharmony_ci tmp = 0; 10928c2ecf20Sopenharmony_ci for (i = (rdev->config.cayman.max_shader_engines - 1); i >= 0; i--) { 10938c2ecf20Sopenharmony_ci u32 rb_disable_bitmap; 10948c2ecf20Sopenharmony_ci 10958c2ecf20Sopenharmony_ci WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 10968c2ecf20Sopenharmony_ci WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 10978c2ecf20Sopenharmony_ci rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16; 10988c2ecf20Sopenharmony_ci tmp <<= 4; 10998c2ecf20Sopenharmony_ci tmp |= rb_disable_bitmap; 11008c2ecf20Sopenharmony_ci } 11018c2ecf20Sopenharmony_ci /* enabled rb are just the one not disabled :) */ 11028c2ecf20Sopenharmony_ci disabled_rb_mask = tmp; 11038c2ecf20Sopenharmony_ci tmp = 0; 11048c2ecf20Sopenharmony_ci for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++) 11058c2ecf20Sopenharmony_ci tmp |= (1 << i); 11068c2ecf20Sopenharmony_ci /* if all the backends are disabled, fix it up here */ 11078c2ecf20Sopenharmony_ci if ((disabled_rb_mask & tmp) == tmp) { 11088c2ecf20Sopenharmony_ci for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++) 11098c2ecf20Sopenharmony_ci disabled_rb_mask &= ~(1 << i); 11108c2ecf20Sopenharmony_ci } 11118c2ecf20Sopenharmony_ci 11128c2ecf20Sopenharmony_ci for (i = 0; i < rdev->config.cayman.max_shader_engines; i++) { 11138c2ecf20Sopenharmony_ci u32 simd_disable_bitmap; 11148c2ecf20Sopenharmony_ci 11158c2ecf20Sopenharmony_ci WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 11168c2ecf20Sopenharmony_ci WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); 11178c2ecf20Sopenharmony_ci simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16; 11188c2ecf20Sopenharmony_ci simd_disable_bitmap |= 0xffffffff << rdev->config.cayman.max_simds_per_se; 11198c2ecf20Sopenharmony_ci tmp <<= 16; 11208c2ecf20Sopenharmony_ci tmp |= simd_disable_bitmap; 11218c2ecf20Sopenharmony_ci } 11228c2ecf20Sopenharmony_ci rdev->config.cayman.active_simds = hweight32(~tmp); 11238c2ecf20Sopenharmony_ci 11248c2ecf20Sopenharmony_ci WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 11258c2ecf20Sopenharmony_ci WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); 11268c2ecf20Sopenharmony_ci 11278c2ecf20Sopenharmony_ci WREG32(GB_ADDR_CONFIG, gb_addr_config); 11288c2ecf20Sopenharmony_ci WREG32(DMIF_ADDR_CONFIG, gb_addr_config); 11298c2ecf20Sopenharmony_ci if (ASIC_IS_DCE6(rdev)) 11308c2ecf20Sopenharmony_ci WREG32(DMIF_ADDR_CALC, gb_addr_config); 11318c2ecf20Sopenharmony_ci WREG32(HDP_ADDR_CONFIG, gb_addr_config); 11328c2ecf20Sopenharmony_ci WREG32(DMA_TILING_CONFIG + DMA0_REGISTER_OFFSET, gb_addr_config); 11338c2ecf20Sopenharmony_ci WREG32(DMA_TILING_CONFIG + DMA1_REGISTER_OFFSET, gb_addr_config); 11348c2ecf20Sopenharmony_ci WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config); 11358c2ecf20Sopenharmony_ci WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config); 11368c2ecf20Sopenharmony_ci WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config); 11378c2ecf20Sopenharmony_ci 11388c2ecf20Sopenharmony_ci if ((rdev->config.cayman.max_backends_per_se == 1) && 11398c2ecf20Sopenharmony_ci (rdev->flags & RADEON_IS_IGP)) { 11408c2ecf20Sopenharmony_ci if ((disabled_rb_mask & 3) == 2) { 11418c2ecf20Sopenharmony_ci /* RB1 disabled, RB0 enabled */ 11428c2ecf20Sopenharmony_ci tmp = 0x00000000; 11438c2ecf20Sopenharmony_ci } else { 11448c2ecf20Sopenharmony_ci /* RB0 disabled, RB1 enabled */ 11458c2ecf20Sopenharmony_ci tmp = 0x11111111; 11468c2ecf20Sopenharmony_ci } 11478c2ecf20Sopenharmony_ci } else { 11488c2ecf20Sopenharmony_ci tmp = gb_addr_config & NUM_PIPES_MASK; 11498c2ecf20Sopenharmony_ci tmp = r6xx_remap_render_backend(rdev, tmp, 11508c2ecf20Sopenharmony_ci rdev->config.cayman.max_backends_per_se * 11518c2ecf20Sopenharmony_ci rdev->config.cayman.max_shader_engines, 11528c2ecf20Sopenharmony_ci CAYMAN_MAX_BACKENDS, disabled_rb_mask); 11538c2ecf20Sopenharmony_ci } 11548c2ecf20Sopenharmony_ci rdev->config.cayman.backend_map = tmp; 11558c2ecf20Sopenharmony_ci WREG32(GB_BACKEND_MAP, tmp); 11568c2ecf20Sopenharmony_ci 11578c2ecf20Sopenharmony_ci cgts_tcc_disable = 0xffff0000; 11588c2ecf20Sopenharmony_ci for (i = 0; i < rdev->config.cayman.max_texture_channel_caches; i++) 11598c2ecf20Sopenharmony_ci cgts_tcc_disable &= ~(1 << (16 + i)); 11608c2ecf20Sopenharmony_ci WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable); 11618c2ecf20Sopenharmony_ci WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable); 11628c2ecf20Sopenharmony_ci WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable); 11638c2ecf20Sopenharmony_ci WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable); 11648c2ecf20Sopenharmony_ci 11658c2ecf20Sopenharmony_ci /* reprogram the shader complex */ 11668c2ecf20Sopenharmony_ci cgts_sm_ctrl_reg = RREG32(CGTS_SM_CTRL_REG); 11678c2ecf20Sopenharmony_ci for (i = 0; i < 16; i++) 11688c2ecf20Sopenharmony_ci WREG32(CGTS_SM_CTRL_REG, OVERRIDE); 11698c2ecf20Sopenharmony_ci WREG32(CGTS_SM_CTRL_REG, cgts_sm_ctrl_reg); 11708c2ecf20Sopenharmony_ci 11718c2ecf20Sopenharmony_ci /* set HW defaults for 3D engine */ 11728c2ecf20Sopenharmony_ci WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60)); 11738c2ecf20Sopenharmony_ci 11748c2ecf20Sopenharmony_ci sx_debug_1 = RREG32(SX_DEBUG_1); 11758c2ecf20Sopenharmony_ci sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS; 11768c2ecf20Sopenharmony_ci WREG32(SX_DEBUG_1, sx_debug_1); 11778c2ecf20Sopenharmony_ci 11788c2ecf20Sopenharmony_ci smx_dc_ctl0 = RREG32(SMX_DC_CTL0); 11798c2ecf20Sopenharmony_ci smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff); 11808c2ecf20Sopenharmony_ci smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.cayman.sx_num_of_sets); 11818c2ecf20Sopenharmony_ci WREG32(SMX_DC_CTL0, smx_dc_ctl0); 11828c2ecf20Sopenharmony_ci 11838c2ecf20Sopenharmony_ci WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4) | CRC_SIMD_ID_WADDR_DISABLE); 11848c2ecf20Sopenharmony_ci 11858c2ecf20Sopenharmony_ci /* need to be explicitly zero-ed */ 11868c2ecf20Sopenharmony_ci WREG32(VGT_OFFCHIP_LDS_BASE, 0); 11878c2ecf20Sopenharmony_ci WREG32(SQ_LSTMP_RING_BASE, 0); 11888c2ecf20Sopenharmony_ci WREG32(SQ_HSTMP_RING_BASE, 0); 11898c2ecf20Sopenharmony_ci WREG32(SQ_ESTMP_RING_BASE, 0); 11908c2ecf20Sopenharmony_ci WREG32(SQ_GSTMP_RING_BASE, 0); 11918c2ecf20Sopenharmony_ci WREG32(SQ_VSTMP_RING_BASE, 0); 11928c2ecf20Sopenharmony_ci WREG32(SQ_PSTMP_RING_BASE, 0); 11938c2ecf20Sopenharmony_ci 11948c2ecf20Sopenharmony_ci WREG32(TA_CNTL_AUX, DISABLE_CUBE_ANISO); 11958c2ecf20Sopenharmony_ci 11968c2ecf20Sopenharmony_ci WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.cayman.sx_max_export_size / 4) - 1) | 11978c2ecf20Sopenharmony_ci POSITION_BUFFER_SIZE((rdev->config.cayman.sx_max_export_pos_size / 4) - 1) | 11988c2ecf20Sopenharmony_ci SMX_BUFFER_SIZE((rdev->config.cayman.sx_max_export_smx_size / 4) - 1))); 11998c2ecf20Sopenharmony_ci 12008c2ecf20Sopenharmony_ci WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.cayman.sc_prim_fifo_size) | 12018c2ecf20Sopenharmony_ci SC_HIZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_hiz_tile_fifo_size) | 12028c2ecf20Sopenharmony_ci SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_earlyz_tile_fifo_size))); 12038c2ecf20Sopenharmony_ci 12048c2ecf20Sopenharmony_ci 12058c2ecf20Sopenharmony_ci WREG32(VGT_NUM_INSTANCES, 1); 12068c2ecf20Sopenharmony_ci 12078c2ecf20Sopenharmony_ci WREG32(CP_PERFMON_CNTL, 0); 12088c2ecf20Sopenharmony_ci 12098c2ecf20Sopenharmony_ci WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.cayman.sq_num_cf_insts) | 12108c2ecf20Sopenharmony_ci FETCH_FIFO_HIWATER(0x4) | 12118c2ecf20Sopenharmony_ci DONE_FIFO_HIWATER(0xe0) | 12128c2ecf20Sopenharmony_ci ALU_UPDATE_FIFO_HIWATER(0x8))); 12138c2ecf20Sopenharmony_ci 12148c2ecf20Sopenharmony_ci WREG32(SQ_GPR_RESOURCE_MGMT_1, NUM_CLAUSE_TEMP_GPRS(4)); 12158c2ecf20Sopenharmony_ci WREG32(SQ_CONFIG, (VC_ENABLE | 12168c2ecf20Sopenharmony_ci EXPORT_SRC_C | 12178c2ecf20Sopenharmony_ci GFX_PRIO(0) | 12188c2ecf20Sopenharmony_ci CS1_PRIO(0) | 12198c2ecf20Sopenharmony_ci CS2_PRIO(1))); 12208c2ecf20Sopenharmony_ci WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, DYN_GPR_ENABLE); 12218c2ecf20Sopenharmony_ci 12228c2ecf20Sopenharmony_ci WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) | 12238c2ecf20Sopenharmony_ci FORCE_EOV_MAX_REZ_CNT(255))); 12248c2ecf20Sopenharmony_ci 12258c2ecf20Sopenharmony_ci WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) | 12268c2ecf20Sopenharmony_ci AUTO_INVLD_EN(ES_AND_GS_AUTO)); 12278c2ecf20Sopenharmony_ci 12288c2ecf20Sopenharmony_ci WREG32(VGT_GS_VERTEX_REUSE, 16); 12298c2ecf20Sopenharmony_ci WREG32(PA_SC_LINE_STIPPLE_STATE, 0); 12308c2ecf20Sopenharmony_ci 12318c2ecf20Sopenharmony_ci WREG32(CB_PERF_CTR0_SEL_0, 0); 12328c2ecf20Sopenharmony_ci WREG32(CB_PERF_CTR0_SEL_1, 0); 12338c2ecf20Sopenharmony_ci WREG32(CB_PERF_CTR1_SEL_0, 0); 12348c2ecf20Sopenharmony_ci WREG32(CB_PERF_CTR1_SEL_1, 0); 12358c2ecf20Sopenharmony_ci WREG32(CB_PERF_CTR2_SEL_0, 0); 12368c2ecf20Sopenharmony_ci WREG32(CB_PERF_CTR2_SEL_1, 0); 12378c2ecf20Sopenharmony_ci WREG32(CB_PERF_CTR3_SEL_0, 0); 12388c2ecf20Sopenharmony_ci WREG32(CB_PERF_CTR3_SEL_1, 0); 12398c2ecf20Sopenharmony_ci 12408c2ecf20Sopenharmony_ci tmp = RREG32(HDP_MISC_CNTL); 12418c2ecf20Sopenharmony_ci tmp |= HDP_FLUSH_INVALIDATE_CACHE; 12428c2ecf20Sopenharmony_ci WREG32(HDP_MISC_CNTL, tmp); 12438c2ecf20Sopenharmony_ci 12448c2ecf20Sopenharmony_ci hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL); 12458c2ecf20Sopenharmony_ci WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl); 12468c2ecf20Sopenharmony_ci 12478c2ecf20Sopenharmony_ci WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3)); 12488c2ecf20Sopenharmony_ci 12498c2ecf20Sopenharmony_ci udelay(50); 12508c2ecf20Sopenharmony_ci 12518c2ecf20Sopenharmony_ci /* set clockgating golden values on TN */ 12528c2ecf20Sopenharmony_ci if (rdev->family == CHIP_ARUBA) { 12538c2ecf20Sopenharmony_ci tmp = RREG32_CG(CG_CGTT_LOCAL_0); 12548c2ecf20Sopenharmony_ci tmp &= ~0x00380000; 12558c2ecf20Sopenharmony_ci WREG32_CG(CG_CGTT_LOCAL_0, tmp); 12568c2ecf20Sopenharmony_ci tmp = RREG32_CG(CG_CGTT_LOCAL_1); 12578c2ecf20Sopenharmony_ci tmp &= ~0x0e000000; 12588c2ecf20Sopenharmony_ci WREG32_CG(CG_CGTT_LOCAL_1, tmp); 12598c2ecf20Sopenharmony_ci } 12608c2ecf20Sopenharmony_ci} 12618c2ecf20Sopenharmony_ci 12628c2ecf20Sopenharmony_ci/* 12638c2ecf20Sopenharmony_ci * GART 12648c2ecf20Sopenharmony_ci */ 12658c2ecf20Sopenharmony_civoid cayman_pcie_gart_tlb_flush(struct radeon_device *rdev) 12668c2ecf20Sopenharmony_ci{ 12678c2ecf20Sopenharmony_ci /* flush hdp cache */ 12688c2ecf20Sopenharmony_ci WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); 12698c2ecf20Sopenharmony_ci 12708c2ecf20Sopenharmony_ci /* bits 0-7 are the VM contexts0-7 */ 12718c2ecf20Sopenharmony_ci WREG32(VM_INVALIDATE_REQUEST, 1); 12728c2ecf20Sopenharmony_ci} 12738c2ecf20Sopenharmony_ci 12748c2ecf20Sopenharmony_cistatic int cayman_pcie_gart_enable(struct radeon_device *rdev) 12758c2ecf20Sopenharmony_ci{ 12768c2ecf20Sopenharmony_ci int i, r; 12778c2ecf20Sopenharmony_ci 12788c2ecf20Sopenharmony_ci if (rdev->gart.robj == NULL) { 12798c2ecf20Sopenharmony_ci dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); 12808c2ecf20Sopenharmony_ci return -EINVAL; 12818c2ecf20Sopenharmony_ci } 12828c2ecf20Sopenharmony_ci r = radeon_gart_table_vram_pin(rdev); 12838c2ecf20Sopenharmony_ci if (r) 12848c2ecf20Sopenharmony_ci return r; 12858c2ecf20Sopenharmony_ci /* Setup TLB control */ 12868c2ecf20Sopenharmony_ci WREG32(MC_VM_MX_L1_TLB_CNTL, 12878c2ecf20Sopenharmony_ci (0xA << 7) | 12888c2ecf20Sopenharmony_ci ENABLE_L1_TLB | 12898c2ecf20Sopenharmony_ci ENABLE_L1_FRAGMENT_PROCESSING | 12908c2ecf20Sopenharmony_ci SYSTEM_ACCESS_MODE_NOT_IN_SYS | 12918c2ecf20Sopenharmony_ci ENABLE_ADVANCED_DRIVER_MODEL | 12928c2ecf20Sopenharmony_ci SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU); 12938c2ecf20Sopenharmony_ci /* Setup L2 cache */ 12948c2ecf20Sopenharmony_ci WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | 12958c2ecf20Sopenharmony_ci ENABLE_L2_FRAGMENT_PROCESSING | 12968c2ecf20Sopenharmony_ci ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | 12978c2ecf20Sopenharmony_ci ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE | 12988c2ecf20Sopenharmony_ci EFFECTIVE_L2_QUEUE_SIZE(7) | 12998c2ecf20Sopenharmony_ci CONTEXT1_IDENTITY_ACCESS_MODE(1)); 13008c2ecf20Sopenharmony_ci WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE); 13018c2ecf20Sopenharmony_ci WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY | 13028c2ecf20Sopenharmony_ci BANK_SELECT(6) | 13038c2ecf20Sopenharmony_ci L2_CACHE_BIGK_FRAGMENT_SIZE(6)); 13048c2ecf20Sopenharmony_ci /* setup context0 */ 13058c2ecf20Sopenharmony_ci WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); 13068c2ecf20Sopenharmony_ci WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12); 13078c2ecf20Sopenharmony_ci WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); 13088c2ecf20Sopenharmony_ci WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR, 13098c2ecf20Sopenharmony_ci (u32)(rdev->dummy_page.addr >> 12)); 13108c2ecf20Sopenharmony_ci WREG32(VM_CONTEXT0_CNTL2, 0); 13118c2ecf20Sopenharmony_ci WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | 13128c2ecf20Sopenharmony_ci RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); 13138c2ecf20Sopenharmony_ci 13148c2ecf20Sopenharmony_ci WREG32(0x15D4, 0); 13158c2ecf20Sopenharmony_ci WREG32(0x15D8, 0); 13168c2ecf20Sopenharmony_ci WREG32(0x15DC, 0); 13178c2ecf20Sopenharmony_ci 13188c2ecf20Sopenharmony_ci /* empty context1-7 */ 13198c2ecf20Sopenharmony_ci /* Assign the pt base to something valid for now; the pts used for 13208c2ecf20Sopenharmony_ci * the VMs are determined by the application and setup and assigned 13218c2ecf20Sopenharmony_ci * on the fly in the vm part of radeon_gart.c 13228c2ecf20Sopenharmony_ci */ 13238c2ecf20Sopenharmony_ci for (i = 1; i < 8; i++) { 13248c2ecf20Sopenharmony_ci WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (i << 2), 0); 13258c2ecf20Sopenharmony_ci WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (i << 2), 13268c2ecf20Sopenharmony_ci rdev->vm_manager.max_pfn - 1); 13278c2ecf20Sopenharmony_ci WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2), 13288c2ecf20Sopenharmony_ci rdev->vm_manager.saved_table_addr[i]); 13298c2ecf20Sopenharmony_ci } 13308c2ecf20Sopenharmony_ci 13318c2ecf20Sopenharmony_ci /* enable context1-7 */ 13328c2ecf20Sopenharmony_ci WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR, 13338c2ecf20Sopenharmony_ci (u32)(rdev->dummy_page.addr >> 12)); 13348c2ecf20Sopenharmony_ci WREG32(VM_CONTEXT1_CNTL2, 4); 13358c2ecf20Sopenharmony_ci WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) | 13368c2ecf20Sopenharmony_ci PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) | 13378c2ecf20Sopenharmony_ci RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT | 13388c2ecf20Sopenharmony_ci RANGE_PROTECTION_FAULT_ENABLE_DEFAULT | 13398c2ecf20Sopenharmony_ci DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT | 13408c2ecf20Sopenharmony_ci DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT | 13418c2ecf20Sopenharmony_ci PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT | 13428c2ecf20Sopenharmony_ci PDE0_PROTECTION_FAULT_ENABLE_DEFAULT | 13438c2ecf20Sopenharmony_ci VALID_PROTECTION_FAULT_ENABLE_INTERRUPT | 13448c2ecf20Sopenharmony_ci VALID_PROTECTION_FAULT_ENABLE_DEFAULT | 13458c2ecf20Sopenharmony_ci READ_PROTECTION_FAULT_ENABLE_INTERRUPT | 13468c2ecf20Sopenharmony_ci READ_PROTECTION_FAULT_ENABLE_DEFAULT | 13478c2ecf20Sopenharmony_ci WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT | 13488c2ecf20Sopenharmony_ci WRITE_PROTECTION_FAULT_ENABLE_DEFAULT); 13498c2ecf20Sopenharmony_ci 13508c2ecf20Sopenharmony_ci cayman_pcie_gart_tlb_flush(rdev); 13518c2ecf20Sopenharmony_ci DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 13528c2ecf20Sopenharmony_ci (unsigned)(rdev->mc.gtt_size >> 20), 13538c2ecf20Sopenharmony_ci (unsigned long long)rdev->gart.table_addr); 13548c2ecf20Sopenharmony_ci rdev->gart.ready = true; 13558c2ecf20Sopenharmony_ci return 0; 13568c2ecf20Sopenharmony_ci} 13578c2ecf20Sopenharmony_ci 13588c2ecf20Sopenharmony_cistatic void cayman_pcie_gart_disable(struct radeon_device *rdev) 13598c2ecf20Sopenharmony_ci{ 13608c2ecf20Sopenharmony_ci unsigned i; 13618c2ecf20Sopenharmony_ci 13628c2ecf20Sopenharmony_ci for (i = 1; i < 8; ++i) { 13638c2ecf20Sopenharmony_ci rdev->vm_manager.saved_table_addr[i] = RREG32( 13648c2ecf20Sopenharmony_ci VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2)); 13658c2ecf20Sopenharmony_ci } 13668c2ecf20Sopenharmony_ci 13678c2ecf20Sopenharmony_ci /* Disable all tables */ 13688c2ecf20Sopenharmony_ci WREG32(VM_CONTEXT0_CNTL, 0); 13698c2ecf20Sopenharmony_ci WREG32(VM_CONTEXT1_CNTL, 0); 13708c2ecf20Sopenharmony_ci /* Setup TLB control */ 13718c2ecf20Sopenharmony_ci WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING | 13728c2ecf20Sopenharmony_ci SYSTEM_ACCESS_MODE_NOT_IN_SYS | 13738c2ecf20Sopenharmony_ci SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU); 13748c2ecf20Sopenharmony_ci /* Setup L2 cache */ 13758c2ecf20Sopenharmony_ci WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | 13768c2ecf20Sopenharmony_ci ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE | 13778c2ecf20Sopenharmony_ci EFFECTIVE_L2_QUEUE_SIZE(7) | 13788c2ecf20Sopenharmony_ci CONTEXT1_IDENTITY_ACCESS_MODE(1)); 13798c2ecf20Sopenharmony_ci WREG32(VM_L2_CNTL2, 0); 13808c2ecf20Sopenharmony_ci WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY | 13818c2ecf20Sopenharmony_ci L2_CACHE_BIGK_FRAGMENT_SIZE(6)); 13828c2ecf20Sopenharmony_ci radeon_gart_table_vram_unpin(rdev); 13838c2ecf20Sopenharmony_ci} 13848c2ecf20Sopenharmony_ci 13858c2ecf20Sopenharmony_cistatic void cayman_pcie_gart_fini(struct radeon_device *rdev) 13868c2ecf20Sopenharmony_ci{ 13878c2ecf20Sopenharmony_ci cayman_pcie_gart_disable(rdev); 13888c2ecf20Sopenharmony_ci radeon_gart_table_vram_free(rdev); 13898c2ecf20Sopenharmony_ci radeon_gart_fini(rdev); 13908c2ecf20Sopenharmony_ci} 13918c2ecf20Sopenharmony_ci 13928c2ecf20Sopenharmony_civoid cayman_cp_int_cntl_setup(struct radeon_device *rdev, 13938c2ecf20Sopenharmony_ci int ring, u32 cp_int_cntl) 13948c2ecf20Sopenharmony_ci{ 13958c2ecf20Sopenharmony_ci WREG32(SRBM_GFX_CNTL, RINGID(ring)); 13968c2ecf20Sopenharmony_ci WREG32(CP_INT_CNTL, cp_int_cntl); 13978c2ecf20Sopenharmony_ci} 13988c2ecf20Sopenharmony_ci 13998c2ecf20Sopenharmony_ci/* 14008c2ecf20Sopenharmony_ci * CP. 14018c2ecf20Sopenharmony_ci */ 14028c2ecf20Sopenharmony_civoid cayman_fence_ring_emit(struct radeon_device *rdev, 14038c2ecf20Sopenharmony_ci struct radeon_fence *fence) 14048c2ecf20Sopenharmony_ci{ 14058c2ecf20Sopenharmony_ci struct radeon_ring *ring = &rdev->ring[fence->ring]; 14068c2ecf20Sopenharmony_ci u64 addr = rdev->fence_drv[fence->ring].gpu_addr; 14078c2ecf20Sopenharmony_ci u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA | 14088c2ecf20Sopenharmony_ci PACKET3_SH_ACTION_ENA; 14098c2ecf20Sopenharmony_ci 14108c2ecf20Sopenharmony_ci /* flush read cache over gart for this vmid */ 14118c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); 14128c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl); 14138c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0xFFFFFFFF); 14148c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0); 14158c2ecf20Sopenharmony_ci radeon_ring_write(ring, 10); /* poll interval */ 14168c2ecf20Sopenharmony_ci /* EVENT_WRITE_EOP - flush caches, send int */ 14178c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4)); 14188c2ecf20Sopenharmony_ci radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5)); 14198c2ecf20Sopenharmony_ci radeon_ring_write(ring, lower_32_bits(addr)); 14208c2ecf20Sopenharmony_ci radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2)); 14218c2ecf20Sopenharmony_ci radeon_ring_write(ring, fence->seq); 14228c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0); 14238c2ecf20Sopenharmony_ci} 14248c2ecf20Sopenharmony_ci 14258c2ecf20Sopenharmony_civoid cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib) 14268c2ecf20Sopenharmony_ci{ 14278c2ecf20Sopenharmony_ci struct radeon_ring *ring = &rdev->ring[ib->ring]; 14288c2ecf20Sopenharmony_ci unsigned vm_id = ib->vm ? ib->vm->ids[ib->ring].id : 0; 14298c2ecf20Sopenharmony_ci u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA | 14308c2ecf20Sopenharmony_ci PACKET3_SH_ACTION_ENA; 14318c2ecf20Sopenharmony_ci 14328c2ecf20Sopenharmony_ci /* set to DX10/11 mode */ 14338c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0)); 14348c2ecf20Sopenharmony_ci radeon_ring_write(ring, 1); 14358c2ecf20Sopenharmony_ci 14368c2ecf20Sopenharmony_ci if (ring->rptr_save_reg) { 14378c2ecf20Sopenharmony_ci uint32_t next_rptr = ring->wptr + 3 + 4 + 8; 14388c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); 14398c2ecf20Sopenharmony_ci radeon_ring_write(ring, ((ring->rptr_save_reg - 14408c2ecf20Sopenharmony_ci PACKET3_SET_CONFIG_REG_START) >> 2)); 14418c2ecf20Sopenharmony_ci radeon_ring_write(ring, next_rptr); 14428c2ecf20Sopenharmony_ci } 14438c2ecf20Sopenharmony_ci 14448c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); 14458c2ecf20Sopenharmony_ci radeon_ring_write(ring, 14468c2ecf20Sopenharmony_ci#ifdef __BIG_ENDIAN 14478c2ecf20Sopenharmony_ci (2 << 0) | 14488c2ecf20Sopenharmony_ci#endif 14498c2ecf20Sopenharmony_ci (ib->gpu_addr & 0xFFFFFFFC)); 14508c2ecf20Sopenharmony_ci radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF); 14518c2ecf20Sopenharmony_ci radeon_ring_write(ring, ib->length_dw | (vm_id << 24)); 14528c2ecf20Sopenharmony_ci 14538c2ecf20Sopenharmony_ci /* flush read cache over gart for this vmid */ 14548c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); 14558c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl); 14568c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0xFFFFFFFF); 14578c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0); 14588c2ecf20Sopenharmony_ci radeon_ring_write(ring, (vm_id << 24) | 10); /* poll interval */ 14598c2ecf20Sopenharmony_ci} 14608c2ecf20Sopenharmony_ci 14618c2ecf20Sopenharmony_cistatic void cayman_cp_enable(struct radeon_device *rdev, bool enable) 14628c2ecf20Sopenharmony_ci{ 14638c2ecf20Sopenharmony_ci if (enable) 14648c2ecf20Sopenharmony_ci WREG32(CP_ME_CNTL, 0); 14658c2ecf20Sopenharmony_ci else { 14668c2ecf20Sopenharmony_ci if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX) 14678c2ecf20Sopenharmony_ci radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); 14688c2ecf20Sopenharmony_ci WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT)); 14698c2ecf20Sopenharmony_ci WREG32(SCRATCH_UMSK, 0); 14708c2ecf20Sopenharmony_ci rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 14718c2ecf20Sopenharmony_ci } 14728c2ecf20Sopenharmony_ci} 14738c2ecf20Sopenharmony_ci 14748c2ecf20Sopenharmony_ciu32 cayman_gfx_get_rptr(struct radeon_device *rdev, 14758c2ecf20Sopenharmony_ci struct radeon_ring *ring) 14768c2ecf20Sopenharmony_ci{ 14778c2ecf20Sopenharmony_ci u32 rptr; 14788c2ecf20Sopenharmony_ci 14798c2ecf20Sopenharmony_ci if (rdev->wb.enabled) 14808c2ecf20Sopenharmony_ci rptr = rdev->wb.wb[ring->rptr_offs/4]; 14818c2ecf20Sopenharmony_ci else { 14828c2ecf20Sopenharmony_ci if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) 14838c2ecf20Sopenharmony_ci rptr = RREG32(CP_RB0_RPTR); 14848c2ecf20Sopenharmony_ci else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) 14858c2ecf20Sopenharmony_ci rptr = RREG32(CP_RB1_RPTR); 14868c2ecf20Sopenharmony_ci else 14878c2ecf20Sopenharmony_ci rptr = RREG32(CP_RB2_RPTR); 14888c2ecf20Sopenharmony_ci } 14898c2ecf20Sopenharmony_ci 14908c2ecf20Sopenharmony_ci return rptr; 14918c2ecf20Sopenharmony_ci} 14928c2ecf20Sopenharmony_ci 14938c2ecf20Sopenharmony_ciu32 cayman_gfx_get_wptr(struct radeon_device *rdev, 14948c2ecf20Sopenharmony_ci struct radeon_ring *ring) 14958c2ecf20Sopenharmony_ci{ 14968c2ecf20Sopenharmony_ci u32 wptr; 14978c2ecf20Sopenharmony_ci 14988c2ecf20Sopenharmony_ci if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) 14998c2ecf20Sopenharmony_ci wptr = RREG32(CP_RB0_WPTR); 15008c2ecf20Sopenharmony_ci else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) 15018c2ecf20Sopenharmony_ci wptr = RREG32(CP_RB1_WPTR); 15028c2ecf20Sopenharmony_ci else 15038c2ecf20Sopenharmony_ci wptr = RREG32(CP_RB2_WPTR); 15048c2ecf20Sopenharmony_ci 15058c2ecf20Sopenharmony_ci return wptr; 15068c2ecf20Sopenharmony_ci} 15078c2ecf20Sopenharmony_ci 15088c2ecf20Sopenharmony_civoid cayman_gfx_set_wptr(struct radeon_device *rdev, 15098c2ecf20Sopenharmony_ci struct radeon_ring *ring) 15108c2ecf20Sopenharmony_ci{ 15118c2ecf20Sopenharmony_ci if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) { 15128c2ecf20Sopenharmony_ci WREG32(CP_RB0_WPTR, ring->wptr); 15138c2ecf20Sopenharmony_ci (void)RREG32(CP_RB0_WPTR); 15148c2ecf20Sopenharmony_ci } else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) { 15158c2ecf20Sopenharmony_ci WREG32(CP_RB1_WPTR, ring->wptr); 15168c2ecf20Sopenharmony_ci (void)RREG32(CP_RB1_WPTR); 15178c2ecf20Sopenharmony_ci } else { 15188c2ecf20Sopenharmony_ci WREG32(CP_RB2_WPTR, ring->wptr); 15198c2ecf20Sopenharmony_ci (void)RREG32(CP_RB2_WPTR); 15208c2ecf20Sopenharmony_ci } 15218c2ecf20Sopenharmony_ci} 15228c2ecf20Sopenharmony_ci 15238c2ecf20Sopenharmony_cistatic int cayman_cp_load_microcode(struct radeon_device *rdev) 15248c2ecf20Sopenharmony_ci{ 15258c2ecf20Sopenharmony_ci const __be32 *fw_data; 15268c2ecf20Sopenharmony_ci int i; 15278c2ecf20Sopenharmony_ci 15288c2ecf20Sopenharmony_ci if (!rdev->me_fw || !rdev->pfp_fw) 15298c2ecf20Sopenharmony_ci return -EINVAL; 15308c2ecf20Sopenharmony_ci 15318c2ecf20Sopenharmony_ci cayman_cp_enable(rdev, false); 15328c2ecf20Sopenharmony_ci 15338c2ecf20Sopenharmony_ci fw_data = (const __be32 *)rdev->pfp_fw->data; 15348c2ecf20Sopenharmony_ci WREG32(CP_PFP_UCODE_ADDR, 0); 15358c2ecf20Sopenharmony_ci for (i = 0; i < CAYMAN_PFP_UCODE_SIZE; i++) 15368c2ecf20Sopenharmony_ci WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++)); 15378c2ecf20Sopenharmony_ci WREG32(CP_PFP_UCODE_ADDR, 0); 15388c2ecf20Sopenharmony_ci 15398c2ecf20Sopenharmony_ci fw_data = (const __be32 *)rdev->me_fw->data; 15408c2ecf20Sopenharmony_ci WREG32(CP_ME_RAM_WADDR, 0); 15418c2ecf20Sopenharmony_ci for (i = 0; i < CAYMAN_PM4_UCODE_SIZE; i++) 15428c2ecf20Sopenharmony_ci WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++)); 15438c2ecf20Sopenharmony_ci 15448c2ecf20Sopenharmony_ci WREG32(CP_PFP_UCODE_ADDR, 0); 15458c2ecf20Sopenharmony_ci WREG32(CP_ME_RAM_WADDR, 0); 15468c2ecf20Sopenharmony_ci WREG32(CP_ME_RAM_RADDR, 0); 15478c2ecf20Sopenharmony_ci return 0; 15488c2ecf20Sopenharmony_ci} 15498c2ecf20Sopenharmony_ci 15508c2ecf20Sopenharmony_cistatic int cayman_cp_start(struct radeon_device *rdev) 15518c2ecf20Sopenharmony_ci{ 15528c2ecf20Sopenharmony_ci struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 15538c2ecf20Sopenharmony_ci int r, i; 15548c2ecf20Sopenharmony_ci 15558c2ecf20Sopenharmony_ci r = radeon_ring_lock(rdev, ring, 7); 15568c2ecf20Sopenharmony_ci if (r) { 15578c2ecf20Sopenharmony_ci DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); 15588c2ecf20Sopenharmony_ci return r; 15598c2ecf20Sopenharmony_ci } 15608c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5)); 15618c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0x1); 15628c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0x0); 15638c2ecf20Sopenharmony_ci radeon_ring_write(ring, rdev->config.cayman.max_hw_contexts - 1); 15648c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1)); 15658c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0); 15668c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0); 15678c2ecf20Sopenharmony_ci radeon_ring_unlock_commit(rdev, ring, false); 15688c2ecf20Sopenharmony_ci 15698c2ecf20Sopenharmony_ci cayman_cp_enable(rdev, true); 15708c2ecf20Sopenharmony_ci 15718c2ecf20Sopenharmony_ci r = radeon_ring_lock(rdev, ring, cayman_default_size + 19); 15728c2ecf20Sopenharmony_ci if (r) { 15738c2ecf20Sopenharmony_ci DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); 15748c2ecf20Sopenharmony_ci return r; 15758c2ecf20Sopenharmony_ci } 15768c2ecf20Sopenharmony_ci 15778c2ecf20Sopenharmony_ci /* setup clear context state */ 15788c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0)); 15798c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE); 15808c2ecf20Sopenharmony_ci 15818c2ecf20Sopenharmony_ci for (i = 0; i < cayman_default_size; i++) 15828c2ecf20Sopenharmony_ci radeon_ring_write(ring, cayman_default_state[i]); 15838c2ecf20Sopenharmony_ci 15848c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0)); 15858c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE); 15868c2ecf20Sopenharmony_ci 15878c2ecf20Sopenharmony_ci /* set clear context state */ 15888c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0)); 15898c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0); 15908c2ecf20Sopenharmony_ci 15918c2ecf20Sopenharmony_ci /* SQ_VTX_BASE_VTX_LOC */ 15928c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0xc0026f00); 15938c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0x00000000); 15948c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0x00000000); 15958c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0x00000000); 15968c2ecf20Sopenharmony_ci 15978c2ecf20Sopenharmony_ci /* Clear consts */ 15988c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0xc0036f00); 15998c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0x00000bc4); 16008c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0xffffffff); 16018c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0xffffffff); 16028c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0xffffffff); 16038c2ecf20Sopenharmony_ci 16048c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0xc0026900); 16058c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0x00000316); 16068c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */ 16078c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0x00000010); /* */ 16088c2ecf20Sopenharmony_ci 16098c2ecf20Sopenharmony_ci radeon_ring_unlock_commit(rdev, ring, false); 16108c2ecf20Sopenharmony_ci 16118c2ecf20Sopenharmony_ci /* XXX init other rings */ 16128c2ecf20Sopenharmony_ci 16138c2ecf20Sopenharmony_ci return 0; 16148c2ecf20Sopenharmony_ci} 16158c2ecf20Sopenharmony_ci 16168c2ecf20Sopenharmony_cistatic void cayman_cp_fini(struct radeon_device *rdev) 16178c2ecf20Sopenharmony_ci{ 16188c2ecf20Sopenharmony_ci struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 16198c2ecf20Sopenharmony_ci cayman_cp_enable(rdev, false); 16208c2ecf20Sopenharmony_ci radeon_ring_fini(rdev, ring); 16218c2ecf20Sopenharmony_ci radeon_scratch_free(rdev, ring->rptr_save_reg); 16228c2ecf20Sopenharmony_ci} 16238c2ecf20Sopenharmony_ci 16248c2ecf20Sopenharmony_cistatic int cayman_cp_resume(struct radeon_device *rdev) 16258c2ecf20Sopenharmony_ci{ 16268c2ecf20Sopenharmony_ci static const int ridx[] = { 16278c2ecf20Sopenharmony_ci RADEON_RING_TYPE_GFX_INDEX, 16288c2ecf20Sopenharmony_ci CAYMAN_RING_TYPE_CP1_INDEX, 16298c2ecf20Sopenharmony_ci CAYMAN_RING_TYPE_CP2_INDEX 16308c2ecf20Sopenharmony_ci }; 16318c2ecf20Sopenharmony_ci static const unsigned cp_rb_cntl[] = { 16328c2ecf20Sopenharmony_ci CP_RB0_CNTL, 16338c2ecf20Sopenharmony_ci CP_RB1_CNTL, 16348c2ecf20Sopenharmony_ci CP_RB2_CNTL, 16358c2ecf20Sopenharmony_ci }; 16368c2ecf20Sopenharmony_ci static const unsigned cp_rb_rptr_addr[] = { 16378c2ecf20Sopenharmony_ci CP_RB0_RPTR_ADDR, 16388c2ecf20Sopenharmony_ci CP_RB1_RPTR_ADDR, 16398c2ecf20Sopenharmony_ci CP_RB2_RPTR_ADDR 16408c2ecf20Sopenharmony_ci }; 16418c2ecf20Sopenharmony_ci static const unsigned cp_rb_rptr_addr_hi[] = { 16428c2ecf20Sopenharmony_ci CP_RB0_RPTR_ADDR_HI, 16438c2ecf20Sopenharmony_ci CP_RB1_RPTR_ADDR_HI, 16448c2ecf20Sopenharmony_ci CP_RB2_RPTR_ADDR_HI 16458c2ecf20Sopenharmony_ci }; 16468c2ecf20Sopenharmony_ci static const unsigned cp_rb_base[] = { 16478c2ecf20Sopenharmony_ci CP_RB0_BASE, 16488c2ecf20Sopenharmony_ci CP_RB1_BASE, 16498c2ecf20Sopenharmony_ci CP_RB2_BASE 16508c2ecf20Sopenharmony_ci }; 16518c2ecf20Sopenharmony_ci static const unsigned cp_rb_rptr[] = { 16528c2ecf20Sopenharmony_ci CP_RB0_RPTR, 16538c2ecf20Sopenharmony_ci CP_RB1_RPTR, 16548c2ecf20Sopenharmony_ci CP_RB2_RPTR 16558c2ecf20Sopenharmony_ci }; 16568c2ecf20Sopenharmony_ci static const unsigned cp_rb_wptr[] = { 16578c2ecf20Sopenharmony_ci CP_RB0_WPTR, 16588c2ecf20Sopenharmony_ci CP_RB1_WPTR, 16598c2ecf20Sopenharmony_ci CP_RB2_WPTR 16608c2ecf20Sopenharmony_ci }; 16618c2ecf20Sopenharmony_ci struct radeon_ring *ring; 16628c2ecf20Sopenharmony_ci int i, r; 16638c2ecf20Sopenharmony_ci 16648c2ecf20Sopenharmony_ci /* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */ 16658c2ecf20Sopenharmony_ci WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP | 16668c2ecf20Sopenharmony_ci SOFT_RESET_PA | 16678c2ecf20Sopenharmony_ci SOFT_RESET_SH | 16688c2ecf20Sopenharmony_ci SOFT_RESET_VGT | 16698c2ecf20Sopenharmony_ci SOFT_RESET_SPI | 16708c2ecf20Sopenharmony_ci SOFT_RESET_SX)); 16718c2ecf20Sopenharmony_ci RREG32(GRBM_SOFT_RESET); 16728c2ecf20Sopenharmony_ci mdelay(15); 16738c2ecf20Sopenharmony_ci WREG32(GRBM_SOFT_RESET, 0); 16748c2ecf20Sopenharmony_ci RREG32(GRBM_SOFT_RESET); 16758c2ecf20Sopenharmony_ci 16768c2ecf20Sopenharmony_ci WREG32(CP_SEM_WAIT_TIMER, 0x0); 16778c2ecf20Sopenharmony_ci WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0); 16788c2ecf20Sopenharmony_ci 16798c2ecf20Sopenharmony_ci /* Set the write pointer delay */ 16808c2ecf20Sopenharmony_ci WREG32(CP_RB_WPTR_DELAY, 0); 16818c2ecf20Sopenharmony_ci 16828c2ecf20Sopenharmony_ci WREG32(CP_DEBUG, (1 << 27)); 16838c2ecf20Sopenharmony_ci 16848c2ecf20Sopenharmony_ci /* set the wb address whether it's enabled or not */ 16858c2ecf20Sopenharmony_ci WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF); 16868c2ecf20Sopenharmony_ci WREG32(SCRATCH_UMSK, 0xff); 16878c2ecf20Sopenharmony_ci 16888c2ecf20Sopenharmony_ci for (i = 0; i < 3; ++i) { 16898c2ecf20Sopenharmony_ci uint32_t rb_cntl; 16908c2ecf20Sopenharmony_ci uint64_t addr; 16918c2ecf20Sopenharmony_ci 16928c2ecf20Sopenharmony_ci /* Set ring buffer size */ 16938c2ecf20Sopenharmony_ci ring = &rdev->ring[ridx[i]]; 16948c2ecf20Sopenharmony_ci rb_cntl = order_base_2(ring->ring_size / 8); 16958c2ecf20Sopenharmony_ci rb_cntl |= order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8; 16968c2ecf20Sopenharmony_ci#ifdef __BIG_ENDIAN 16978c2ecf20Sopenharmony_ci rb_cntl |= BUF_SWAP_32BIT; 16988c2ecf20Sopenharmony_ci#endif 16998c2ecf20Sopenharmony_ci WREG32(cp_rb_cntl[i], rb_cntl); 17008c2ecf20Sopenharmony_ci 17018c2ecf20Sopenharmony_ci /* set the wb address whether it's enabled or not */ 17028c2ecf20Sopenharmony_ci addr = rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET; 17038c2ecf20Sopenharmony_ci WREG32(cp_rb_rptr_addr[i], addr & 0xFFFFFFFC); 17048c2ecf20Sopenharmony_ci WREG32(cp_rb_rptr_addr_hi[i], upper_32_bits(addr) & 0xFF); 17058c2ecf20Sopenharmony_ci } 17068c2ecf20Sopenharmony_ci 17078c2ecf20Sopenharmony_ci /* set the rb base addr, this causes an internal reset of ALL rings */ 17088c2ecf20Sopenharmony_ci for (i = 0; i < 3; ++i) { 17098c2ecf20Sopenharmony_ci ring = &rdev->ring[ridx[i]]; 17108c2ecf20Sopenharmony_ci WREG32(cp_rb_base[i], ring->gpu_addr >> 8); 17118c2ecf20Sopenharmony_ci } 17128c2ecf20Sopenharmony_ci 17138c2ecf20Sopenharmony_ci for (i = 0; i < 3; ++i) { 17148c2ecf20Sopenharmony_ci /* Initialize the ring buffer's read and write pointers */ 17158c2ecf20Sopenharmony_ci ring = &rdev->ring[ridx[i]]; 17168c2ecf20Sopenharmony_ci WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA); 17178c2ecf20Sopenharmony_ci 17188c2ecf20Sopenharmony_ci ring->wptr = 0; 17198c2ecf20Sopenharmony_ci WREG32(cp_rb_rptr[i], 0); 17208c2ecf20Sopenharmony_ci WREG32(cp_rb_wptr[i], ring->wptr); 17218c2ecf20Sopenharmony_ci 17228c2ecf20Sopenharmony_ci mdelay(1); 17238c2ecf20Sopenharmony_ci WREG32_P(cp_rb_cntl[i], 0, ~RB_RPTR_WR_ENA); 17248c2ecf20Sopenharmony_ci } 17258c2ecf20Sopenharmony_ci 17268c2ecf20Sopenharmony_ci /* start the rings */ 17278c2ecf20Sopenharmony_ci cayman_cp_start(rdev); 17288c2ecf20Sopenharmony_ci rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true; 17298c2ecf20Sopenharmony_ci rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false; 17308c2ecf20Sopenharmony_ci rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false; 17318c2ecf20Sopenharmony_ci /* this only test cp0 */ 17328c2ecf20Sopenharmony_ci r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]); 17338c2ecf20Sopenharmony_ci if (r) { 17348c2ecf20Sopenharmony_ci rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 17358c2ecf20Sopenharmony_ci rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false; 17368c2ecf20Sopenharmony_ci rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false; 17378c2ecf20Sopenharmony_ci return r; 17388c2ecf20Sopenharmony_ci } 17398c2ecf20Sopenharmony_ci 17408c2ecf20Sopenharmony_ci if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX) 17418c2ecf20Sopenharmony_ci radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size); 17428c2ecf20Sopenharmony_ci 17438c2ecf20Sopenharmony_ci return 0; 17448c2ecf20Sopenharmony_ci} 17458c2ecf20Sopenharmony_ci 17468c2ecf20Sopenharmony_ciu32 cayman_gpu_check_soft_reset(struct radeon_device *rdev) 17478c2ecf20Sopenharmony_ci{ 17488c2ecf20Sopenharmony_ci u32 reset_mask = 0; 17498c2ecf20Sopenharmony_ci u32 tmp; 17508c2ecf20Sopenharmony_ci 17518c2ecf20Sopenharmony_ci /* GRBM_STATUS */ 17528c2ecf20Sopenharmony_ci tmp = RREG32(GRBM_STATUS); 17538c2ecf20Sopenharmony_ci if (tmp & (PA_BUSY | SC_BUSY | 17548c2ecf20Sopenharmony_ci SH_BUSY | SX_BUSY | 17558c2ecf20Sopenharmony_ci TA_BUSY | VGT_BUSY | 17568c2ecf20Sopenharmony_ci DB_BUSY | CB_BUSY | 17578c2ecf20Sopenharmony_ci GDS_BUSY | SPI_BUSY | 17588c2ecf20Sopenharmony_ci IA_BUSY | IA_BUSY_NO_DMA)) 17598c2ecf20Sopenharmony_ci reset_mask |= RADEON_RESET_GFX; 17608c2ecf20Sopenharmony_ci 17618c2ecf20Sopenharmony_ci if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING | 17628c2ecf20Sopenharmony_ci CP_BUSY | CP_COHERENCY_BUSY)) 17638c2ecf20Sopenharmony_ci reset_mask |= RADEON_RESET_CP; 17648c2ecf20Sopenharmony_ci 17658c2ecf20Sopenharmony_ci if (tmp & GRBM_EE_BUSY) 17668c2ecf20Sopenharmony_ci reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP; 17678c2ecf20Sopenharmony_ci 17688c2ecf20Sopenharmony_ci /* DMA_STATUS_REG 0 */ 17698c2ecf20Sopenharmony_ci tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET); 17708c2ecf20Sopenharmony_ci if (!(tmp & DMA_IDLE)) 17718c2ecf20Sopenharmony_ci reset_mask |= RADEON_RESET_DMA; 17728c2ecf20Sopenharmony_ci 17738c2ecf20Sopenharmony_ci /* DMA_STATUS_REG 1 */ 17748c2ecf20Sopenharmony_ci tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET); 17758c2ecf20Sopenharmony_ci if (!(tmp & DMA_IDLE)) 17768c2ecf20Sopenharmony_ci reset_mask |= RADEON_RESET_DMA1; 17778c2ecf20Sopenharmony_ci 17788c2ecf20Sopenharmony_ci /* SRBM_STATUS2 */ 17798c2ecf20Sopenharmony_ci tmp = RREG32(SRBM_STATUS2); 17808c2ecf20Sopenharmony_ci if (tmp & DMA_BUSY) 17818c2ecf20Sopenharmony_ci reset_mask |= RADEON_RESET_DMA; 17828c2ecf20Sopenharmony_ci 17838c2ecf20Sopenharmony_ci if (tmp & DMA1_BUSY) 17848c2ecf20Sopenharmony_ci reset_mask |= RADEON_RESET_DMA1; 17858c2ecf20Sopenharmony_ci 17868c2ecf20Sopenharmony_ci /* SRBM_STATUS */ 17878c2ecf20Sopenharmony_ci tmp = RREG32(SRBM_STATUS); 17888c2ecf20Sopenharmony_ci if (tmp & (RLC_RQ_PENDING | RLC_BUSY)) 17898c2ecf20Sopenharmony_ci reset_mask |= RADEON_RESET_RLC; 17908c2ecf20Sopenharmony_ci 17918c2ecf20Sopenharmony_ci if (tmp & IH_BUSY) 17928c2ecf20Sopenharmony_ci reset_mask |= RADEON_RESET_IH; 17938c2ecf20Sopenharmony_ci 17948c2ecf20Sopenharmony_ci if (tmp & SEM_BUSY) 17958c2ecf20Sopenharmony_ci reset_mask |= RADEON_RESET_SEM; 17968c2ecf20Sopenharmony_ci 17978c2ecf20Sopenharmony_ci if (tmp & GRBM_RQ_PENDING) 17988c2ecf20Sopenharmony_ci reset_mask |= RADEON_RESET_GRBM; 17998c2ecf20Sopenharmony_ci 18008c2ecf20Sopenharmony_ci if (tmp & VMC_BUSY) 18018c2ecf20Sopenharmony_ci reset_mask |= RADEON_RESET_VMC; 18028c2ecf20Sopenharmony_ci 18038c2ecf20Sopenharmony_ci if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY | 18048c2ecf20Sopenharmony_ci MCC_BUSY | MCD_BUSY)) 18058c2ecf20Sopenharmony_ci reset_mask |= RADEON_RESET_MC; 18068c2ecf20Sopenharmony_ci 18078c2ecf20Sopenharmony_ci if (evergreen_is_display_hung(rdev)) 18088c2ecf20Sopenharmony_ci reset_mask |= RADEON_RESET_DISPLAY; 18098c2ecf20Sopenharmony_ci 18108c2ecf20Sopenharmony_ci /* VM_L2_STATUS */ 18118c2ecf20Sopenharmony_ci tmp = RREG32(VM_L2_STATUS); 18128c2ecf20Sopenharmony_ci if (tmp & L2_BUSY) 18138c2ecf20Sopenharmony_ci reset_mask |= RADEON_RESET_VMC; 18148c2ecf20Sopenharmony_ci 18158c2ecf20Sopenharmony_ci /* Skip MC reset as it's mostly likely not hung, just busy */ 18168c2ecf20Sopenharmony_ci if (reset_mask & RADEON_RESET_MC) { 18178c2ecf20Sopenharmony_ci DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask); 18188c2ecf20Sopenharmony_ci reset_mask &= ~RADEON_RESET_MC; 18198c2ecf20Sopenharmony_ci } 18208c2ecf20Sopenharmony_ci 18218c2ecf20Sopenharmony_ci return reset_mask; 18228c2ecf20Sopenharmony_ci} 18238c2ecf20Sopenharmony_ci 18248c2ecf20Sopenharmony_cistatic void cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask) 18258c2ecf20Sopenharmony_ci{ 18268c2ecf20Sopenharmony_ci struct evergreen_mc_save save; 18278c2ecf20Sopenharmony_ci u32 grbm_soft_reset = 0, srbm_soft_reset = 0; 18288c2ecf20Sopenharmony_ci u32 tmp; 18298c2ecf20Sopenharmony_ci 18308c2ecf20Sopenharmony_ci if (reset_mask == 0) 18318c2ecf20Sopenharmony_ci return; 18328c2ecf20Sopenharmony_ci 18338c2ecf20Sopenharmony_ci dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask); 18348c2ecf20Sopenharmony_ci 18358c2ecf20Sopenharmony_ci evergreen_print_gpu_status_regs(rdev); 18368c2ecf20Sopenharmony_ci dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_ADDR 0x%08X\n", 18378c2ecf20Sopenharmony_ci RREG32(0x14F8)); 18388c2ecf20Sopenharmony_ci dev_info(rdev->dev, " VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n", 18398c2ecf20Sopenharmony_ci RREG32(0x14D8)); 18408c2ecf20Sopenharmony_ci dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", 18418c2ecf20Sopenharmony_ci RREG32(0x14FC)); 18428c2ecf20Sopenharmony_ci dev_info(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", 18438c2ecf20Sopenharmony_ci RREG32(0x14DC)); 18448c2ecf20Sopenharmony_ci 18458c2ecf20Sopenharmony_ci /* Disable CP parsing/prefetching */ 18468c2ecf20Sopenharmony_ci WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); 18478c2ecf20Sopenharmony_ci 18488c2ecf20Sopenharmony_ci if (reset_mask & RADEON_RESET_DMA) { 18498c2ecf20Sopenharmony_ci /* dma0 */ 18508c2ecf20Sopenharmony_ci tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET); 18518c2ecf20Sopenharmony_ci tmp &= ~DMA_RB_ENABLE; 18528c2ecf20Sopenharmony_ci WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp); 18538c2ecf20Sopenharmony_ci } 18548c2ecf20Sopenharmony_ci 18558c2ecf20Sopenharmony_ci if (reset_mask & RADEON_RESET_DMA1) { 18568c2ecf20Sopenharmony_ci /* dma1 */ 18578c2ecf20Sopenharmony_ci tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET); 18588c2ecf20Sopenharmony_ci tmp &= ~DMA_RB_ENABLE; 18598c2ecf20Sopenharmony_ci WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp); 18608c2ecf20Sopenharmony_ci } 18618c2ecf20Sopenharmony_ci 18628c2ecf20Sopenharmony_ci udelay(50); 18638c2ecf20Sopenharmony_ci 18648c2ecf20Sopenharmony_ci evergreen_mc_stop(rdev, &save); 18658c2ecf20Sopenharmony_ci if (evergreen_mc_wait_for_idle(rdev)) { 18668c2ecf20Sopenharmony_ci dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 18678c2ecf20Sopenharmony_ci } 18688c2ecf20Sopenharmony_ci 18698c2ecf20Sopenharmony_ci if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) { 18708c2ecf20Sopenharmony_ci grbm_soft_reset = SOFT_RESET_CB | 18718c2ecf20Sopenharmony_ci SOFT_RESET_DB | 18728c2ecf20Sopenharmony_ci SOFT_RESET_GDS | 18738c2ecf20Sopenharmony_ci SOFT_RESET_PA | 18748c2ecf20Sopenharmony_ci SOFT_RESET_SC | 18758c2ecf20Sopenharmony_ci SOFT_RESET_SPI | 18768c2ecf20Sopenharmony_ci SOFT_RESET_SH | 18778c2ecf20Sopenharmony_ci SOFT_RESET_SX | 18788c2ecf20Sopenharmony_ci SOFT_RESET_TC | 18798c2ecf20Sopenharmony_ci SOFT_RESET_TA | 18808c2ecf20Sopenharmony_ci SOFT_RESET_VGT | 18818c2ecf20Sopenharmony_ci SOFT_RESET_IA; 18828c2ecf20Sopenharmony_ci } 18838c2ecf20Sopenharmony_ci 18848c2ecf20Sopenharmony_ci if (reset_mask & RADEON_RESET_CP) { 18858c2ecf20Sopenharmony_ci grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT; 18868c2ecf20Sopenharmony_ci 18878c2ecf20Sopenharmony_ci srbm_soft_reset |= SOFT_RESET_GRBM; 18888c2ecf20Sopenharmony_ci } 18898c2ecf20Sopenharmony_ci 18908c2ecf20Sopenharmony_ci if (reset_mask & RADEON_RESET_DMA) 18918c2ecf20Sopenharmony_ci srbm_soft_reset |= SOFT_RESET_DMA; 18928c2ecf20Sopenharmony_ci 18938c2ecf20Sopenharmony_ci if (reset_mask & RADEON_RESET_DMA1) 18948c2ecf20Sopenharmony_ci srbm_soft_reset |= SOFT_RESET_DMA1; 18958c2ecf20Sopenharmony_ci 18968c2ecf20Sopenharmony_ci if (reset_mask & RADEON_RESET_DISPLAY) 18978c2ecf20Sopenharmony_ci srbm_soft_reset |= SOFT_RESET_DC; 18988c2ecf20Sopenharmony_ci 18998c2ecf20Sopenharmony_ci if (reset_mask & RADEON_RESET_RLC) 19008c2ecf20Sopenharmony_ci srbm_soft_reset |= SOFT_RESET_RLC; 19018c2ecf20Sopenharmony_ci 19028c2ecf20Sopenharmony_ci if (reset_mask & RADEON_RESET_SEM) 19038c2ecf20Sopenharmony_ci srbm_soft_reset |= SOFT_RESET_SEM; 19048c2ecf20Sopenharmony_ci 19058c2ecf20Sopenharmony_ci if (reset_mask & RADEON_RESET_IH) 19068c2ecf20Sopenharmony_ci srbm_soft_reset |= SOFT_RESET_IH; 19078c2ecf20Sopenharmony_ci 19088c2ecf20Sopenharmony_ci if (reset_mask & RADEON_RESET_GRBM) 19098c2ecf20Sopenharmony_ci srbm_soft_reset |= SOFT_RESET_GRBM; 19108c2ecf20Sopenharmony_ci 19118c2ecf20Sopenharmony_ci if (reset_mask & RADEON_RESET_VMC) 19128c2ecf20Sopenharmony_ci srbm_soft_reset |= SOFT_RESET_VMC; 19138c2ecf20Sopenharmony_ci 19148c2ecf20Sopenharmony_ci if (!(rdev->flags & RADEON_IS_IGP)) { 19158c2ecf20Sopenharmony_ci if (reset_mask & RADEON_RESET_MC) 19168c2ecf20Sopenharmony_ci srbm_soft_reset |= SOFT_RESET_MC; 19178c2ecf20Sopenharmony_ci } 19188c2ecf20Sopenharmony_ci 19198c2ecf20Sopenharmony_ci if (grbm_soft_reset) { 19208c2ecf20Sopenharmony_ci tmp = RREG32(GRBM_SOFT_RESET); 19218c2ecf20Sopenharmony_ci tmp |= grbm_soft_reset; 19228c2ecf20Sopenharmony_ci dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp); 19238c2ecf20Sopenharmony_ci WREG32(GRBM_SOFT_RESET, tmp); 19248c2ecf20Sopenharmony_ci tmp = RREG32(GRBM_SOFT_RESET); 19258c2ecf20Sopenharmony_ci 19268c2ecf20Sopenharmony_ci udelay(50); 19278c2ecf20Sopenharmony_ci 19288c2ecf20Sopenharmony_ci tmp &= ~grbm_soft_reset; 19298c2ecf20Sopenharmony_ci WREG32(GRBM_SOFT_RESET, tmp); 19308c2ecf20Sopenharmony_ci tmp = RREG32(GRBM_SOFT_RESET); 19318c2ecf20Sopenharmony_ci } 19328c2ecf20Sopenharmony_ci 19338c2ecf20Sopenharmony_ci if (srbm_soft_reset) { 19348c2ecf20Sopenharmony_ci tmp = RREG32(SRBM_SOFT_RESET); 19358c2ecf20Sopenharmony_ci tmp |= srbm_soft_reset; 19368c2ecf20Sopenharmony_ci dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp); 19378c2ecf20Sopenharmony_ci WREG32(SRBM_SOFT_RESET, tmp); 19388c2ecf20Sopenharmony_ci tmp = RREG32(SRBM_SOFT_RESET); 19398c2ecf20Sopenharmony_ci 19408c2ecf20Sopenharmony_ci udelay(50); 19418c2ecf20Sopenharmony_ci 19428c2ecf20Sopenharmony_ci tmp &= ~srbm_soft_reset; 19438c2ecf20Sopenharmony_ci WREG32(SRBM_SOFT_RESET, tmp); 19448c2ecf20Sopenharmony_ci tmp = RREG32(SRBM_SOFT_RESET); 19458c2ecf20Sopenharmony_ci } 19468c2ecf20Sopenharmony_ci 19478c2ecf20Sopenharmony_ci /* Wait a little for things to settle down */ 19488c2ecf20Sopenharmony_ci udelay(50); 19498c2ecf20Sopenharmony_ci 19508c2ecf20Sopenharmony_ci evergreen_mc_resume(rdev, &save); 19518c2ecf20Sopenharmony_ci udelay(50); 19528c2ecf20Sopenharmony_ci 19538c2ecf20Sopenharmony_ci evergreen_print_gpu_status_regs(rdev); 19548c2ecf20Sopenharmony_ci} 19558c2ecf20Sopenharmony_ci 19568c2ecf20Sopenharmony_ciint cayman_asic_reset(struct radeon_device *rdev, bool hard) 19578c2ecf20Sopenharmony_ci{ 19588c2ecf20Sopenharmony_ci u32 reset_mask; 19598c2ecf20Sopenharmony_ci 19608c2ecf20Sopenharmony_ci if (hard) { 19618c2ecf20Sopenharmony_ci evergreen_gpu_pci_config_reset(rdev); 19628c2ecf20Sopenharmony_ci return 0; 19638c2ecf20Sopenharmony_ci } 19648c2ecf20Sopenharmony_ci 19658c2ecf20Sopenharmony_ci reset_mask = cayman_gpu_check_soft_reset(rdev); 19668c2ecf20Sopenharmony_ci 19678c2ecf20Sopenharmony_ci if (reset_mask) 19688c2ecf20Sopenharmony_ci r600_set_bios_scratch_engine_hung(rdev, true); 19698c2ecf20Sopenharmony_ci 19708c2ecf20Sopenharmony_ci cayman_gpu_soft_reset(rdev, reset_mask); 19718c2ecf20Sopenharmony_ci 19728c2ecf20Sopenharmony_ci reset_mask = cayman_gpu_check_soft_reset(rdev); 19738c2ecf20Sopenharmony_ci 19748c2ecf20Sopenharmony_ci if (reset_mask) 19758c2ecf20Sopenharmony_ci evergreen_gpu_pci_config_reset(rdev); 19768c2ecf20Sopenharmony_ci 19778c2ecf20Sopenharmony_ci r600_set_bios_scratch_engine_hung(rdev, false); 19788c2ecf20Sopenharmony_ci 19798c2ecf20Sopenharmony_ci return 0; 19808c2ecf20Sopenharmony_ci} 19818c2ecf20Sopenharmony_ci 19828c2ecf20Sopenharmony_ci/** 19838c2ecf20Sopenharmony_ci * cayman_gfx_is_lockup - Check if the GFX engine is locked up 19848c2ecf20Sopenharmony_ci * 19858c2ecf20Sopenharmony_ci * @rdev: radeon_device pointer 19868c2ecf20Sopenharmony_ci * @ring: radeon_ring structure holding ring information 19878c2ecf20Sopenharmony_ci * 19888c2ecf20Sopenharmony_ci * Check if the GFX engine is locked up. 19898c2ecf20Sopenharmony_ci * Returns true if the engine appears to be locked up, false if not. 19908c2ecf20Sopenharmony_ci */ 19918c2ecf20Sopenharmony_cibool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring) 19928c2ecf20Sopenharmony_ci{ 19938c2ecf20Sopenharmony_ci u32 reset_mask = cayman_gpu_check_soft_reset(rdev); 19948c2ecf20Sopenharmony_ci 19958c2ecf20Sopenharmony_ci if (!(reset_mask & (RADEON_RESET_GFX | 19968c2ecf20Sopenharmony_ci RADEON_RESET_COMPUTE | 19978c2ecf20Sopenharmony_ci RADEON_RESET_CP))) { 19988c2ecf20Sopenharmony_ci radeon_ring_lockup_update(rdev, ring); 19998c2ecf20Sopenharmony_ci return false; 20008c2ecf20Sopenharmony_ci } 20018c2ecf20Sopenharmony_ci return radeon_ring_test_lockup(rdev, ring); 20028c2ecf20Sopenharmony_ci} 20038c2ecf20Sopenharmony_ci 20048c2ecf20Sopenharmony_cistatic void cayman_uvd_init(struct radeon_device *rdev) 20058c2ecf20Sopenharmony_ci{ 20068c2ecf20Sopenharmony_ci int r; 20078c2ecf20Sopenharmony_ci 20088c2ecf20Sopenharmony_ci if (!rdev->has_uvd) 20098c2ecf20Sopenharmony_ci return; 20108c2ecf20Sopenharmony_ci 20118c2ecf20Sopenharmony_ci r = radeon_uvd_init(rdev); 20128c2ecf20Sopenharmony_ci if (r) { 20138c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed UVD (%d) init.\n", r); 20148c2ecf20Sopenharmony_ci /* 20158c2ecf20Sopenharmony_ci * At this point rdev->uvd.vcpu_bo is NULL which trickles down 20168c2ecf20Sopenharmony_ci * to early fails uvd_v2_2_resume() and thus nothing happens 20178c2ecf20Sopenharmony_ci * there. So it is pointless to try to go through that code 20188c2ecf20Sopenharmony_ci * hence why we disable uvd here. 20198c2ecf20Sopenharmony_ci */ 20208c2ecf20Sopenharmony_ci rdev->has_uvd = false; 20218c2ecf20Sopenharmony_ci return; 20228c2ecf20Sopenharmony_ci } 20238c2ecf20Sopenharmony_ci rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL; 20248c2ecf20Sopenharmony_ci r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096); 20258c2ecf20Sopenharmony_ci} 20268c2ecf20Sopenharmony_ci 20278c2ecf20Sopenharmony_cistatic void cayman_uvd_start(struct radeon_device *rdev) 20288c2ecf20Sopenharmony_ci{ 20298c2ecf20Sopenharmony_ci int r; 20308c2ecf20Sopenharmony_ci 20318c2ecf20Sopenharmony_ci if (!rdev->has_uvd) 20328c2ecf20Sopenharmony_ci return; 20338c2ecf20Sopenharmony_ci 20348c2ecf20Sopenharmony_ci r = uvd_v2_2_resume(rdev); 20358c2ecf20Sopenharmony_ci if (r) { 20368c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed UVD resume (%d).\n", r); 20378c2ecf20Sopenharmony_ci goto error; 20388c2ecf20Sopenharmony_ci } 20398c2ecf20Sopenharmony_ci r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX); 20408c2ecf20Sopenharmony_ci if (r) { 20418c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r); 20428c2ecf20Sopenharmony_ci goto error; 20438c2ecf20Sopenharmony_ci } 20448c2ecf20Sopenharmony_ci return; 20458c2ecf20Sopenharmony_ci 20468c2ecf20Sopenharmony_cierror: 20478c2ecf20Sopenharmony_ci rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; 20488c2ecf20Sopenharmony_ci} 20498c2ecf20Sopenharmony_ci 20508c2ecf20Sopenharmony_cistatic void cayman_uvd_resume(struct radeon_device *rdev) 20518c2ecf20Sopenharmony_ci{ 20528c2ecf20Sopenharmony_ci struct radeon_ring *ring; 20538c2ecf20Sopenharmony_ci int r; 20548c2ecf20Sopenharmony_ci 20558c2ecf20Sopenharmony_ci if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size) 20568c2ecf20Sopenharmony_ci return; 20578c2ecf20Sopenharmony_ci 20588c2ecf20Sopenharmony_ci ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; 20598c2ecf20Sopenharmony_ci r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0)); 20608c2ecf20Sopenharmony_ci if (r) { 20618c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r); 20628c2ecf20Sopenharmony_ci return; 20638c2ecf20Sopenharmony_ci } 20648c2ecf20Sopenharmony_ci r = uvd_v1_0_init(rdev); 20658c2ecf20Sopenharmony_ci if (r) { 20668c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed initializing UVD (%d).\n", r); 20678c2ecf20Sopenharmony_ci return; 20688c2ecf20Sopenharmony_ci } 20698c2ecf20Sopenharmony_ci} 20708c2ecf20Sopenharmony_ci 20718c2ecf20Sopenharmony_cistatic void cayman_vce_init(struct radeon_device *rdev) 20728c2ecf20Sopenharmony_ci{ 20738c2ecf20Sopenharmony_ci int r; 20748c2ecf20Sopenharmony_ci 20758c2ecf20Sopenharmony_ci /* Only set for CHIP_ARUBA */ 20768c2ecf20Sopenharmony_ci if (!rdev->has_vce) 20778c2ecf20Sopenharmony_ci return; 20788c2ecf20Sopenharmony_ci 20798c2ecf20Sopenharmony_ci r = radeon_vce_init(rdev); 20808c2ecf20Sopenharmony_ci if (r) { 20818c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed VCE (%d) init.\n", r); 20828c2ecf20Sopenharmony_ci /* 20838c2ecf20Sopenharmony_ci * At this point rdev->vce.vcpu_bo is NULL which trickles down 20848c2ecf20Sopenharmony_ci * to early fails cayman_vce_start() and thus nothing happens 20858c2ecf20Sopenharmony_ci * there. So it is pointless to try to go through that code 20868c2ecf20Sopenharmony_ci * hence why we disable vce here. 20878c2ecf20Sopenharmony_ci */ 20888c2ecf20Sopenharmony_ci rdev->has_vce = false; 20898c2ecf20Sopenharmony_ci return; 20908c2ecf20Sopenharmony_ci } 20918c2ecf20Sopenharmony_ci rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_obj = NULL; 20928c2ecf20Sopenharmony_ci r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE1_INDEX], 4096); 20938c2ecf20Sopenharmony_ci rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_obj = NULL; 20948c2ecf20Sopenharmony_ci r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE2_INDEX], 4096); 20958c2ecf20Sopenharmony_ci} 20968c2ecf20Sopenharmony_ci 20978c2ecf20Sopenharmony_cistatic void cayman_vce_start(struct radeon_device *rdev) 20988c2ecf20Sopenharmony_ci{ 20998c2ecf20Sopenharmony_ci int r; 21008c2ecf20Sopenharmony_ci 21018c2ecf20Sopenharmony_ci if (!rdev->has_vce) 21028c2ecf20Sopenharmony_ci return; 21038c2ecf20Sopenharmony_ci 21048c2ecf20Sopenharmony_ci r = radeon_vce_resume(rdev); 21058c2ecf20Sopenharmony_ci if (r) { 21068c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed VCE resume (%d).\n", r); 21078c2ecf20Sopenharmony_ci goto error; 21088c2ecf20Sopenharmony_ci } 21098c2ecf20Sopenharmony_ci r = vce_v1_0_resume(rdev); 21108c2ecf20Sopenharmony_ci if (r) { 21118c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed VCE resume (%d).\n", r); 21128c2ecf20Sopenharmony_ci goto error; 21138c2ecf20Sopenharmony_ci } 21148c2ecf20Sopenharmony_ci r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE1_INDEX); 21158c2ecf20Sopenharmony_ci if (r) { 21168c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed initializing VCE1 fences (%d).\n", r); 21178c2ecf20Sopenharmony_ci goto error; 21188c2ecf20Sopenharmony_ci } 21198c2ecf20Sopenharmony_ci r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE2_INDEX); 21208c2ecf20Sopenharmony_ci if (r) { 21218c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed initializing VCE2 fences (%d).\n", r); 21228c2ecf20Sopenharmony_ci goto error; 21238c2ecf20Sopenharmony_ci } 21248c2ecf20Sopenharmony_ci return; 21258c2ecf20Sopenharmony_ci 21268c2ecf20Sopenharmony_cierror: 21278c2ecf20Sopenharmony_ci rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0; 21288c2ecf20Sopenharmony_ci rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0; 21298c2ecf20Sopenharmony_ci} 21308c2ecf20Sopenharmony_ci 21318c2ecf20Sopenharmony_cistatic void cayman_vce_resume(struct radeon_device *rdev) 21328c2ecf20Sopenharmony_ci{ 21338c2ecf20Sopenharmony_ci struct radeon_ring *ring; 21348c2ecf20Sopenharmony_ci int r; 21358c2ecf20Sopenharmony_ci 21368c2ecf20Sopenharmony_ci if (!rdev->has_vce || !rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size) 21378c2ecf20Sopenharmony_ci return; 21388c2ecf20Sopenharmony_ci 21398c2ecf20Sopenharmony_ci ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX]; 21408c2ecf20Sopenharmony_ci r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0); 21418c2ecf20Sopenharmony_ci if (r) { 21428c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r); 21438c2ecf20Sopenharmony_ci return; 21448c2ecf20Sopenharmony_ci } 21458c2ecf20Sopenharmony_ci ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX]; 21468c2ecf20Sopenharmony_ci r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0); 21478c2ecf20Sopenharmony_ci if (r) { 21488c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r); 21498c2ecf20Sopenharmony_ci return; 21508c2ecf20Sopenharmony_ci } 21518c2ecf20Sopenharmony_ci r = vce_v1_0_init(rdev); 21528c2ecf20Sopenharmony_ci if (r) { 21538c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed initializing VCE (%d).\n", r); 21548c2ecf20Sopenharmony_ci return; 21558c2ecf20Sopenharmony_ci } 21568c2ecf20Sopenharmony_ci} 21578c2ecf20Sopenharmony_ci 21588c2ecf20Sopenharmony_cistatic int cayman_startup(struct radeon_device *rdev) 21598c2ecf20Sopenharmony_ci{ 21608c2ecf20Sopenharmony_ci struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 21618c2ecf20Sopenharmony_ci int r; 21628c2ecf20Sopenharmony_ci 21638c2ecf20Sopenharmony_ci /* enable pcie gen2 link */ 21648c2ecf20Sopenharmony_ci evergreen_pcie_gen2_enable(rdev); 21658c2ecf20Sopenharmony_ci /* enable aspm */ 21668c2ecf20Sopenharmony_ci evergreen_program_aspm(rdev); 21678c2ecf20Sopenharmony_ci 21688c2ecf20Sopenharmony_ci /* scratch needs to be initialized before MC */ 21698c2ecf20Sopenharmony_ci r = r600_vram_scratch_init(rdev); 21708c2ecf20Sopenharmony_ci if (r) 21718c2ecf20Sopenharmony_ci return r; 21728c2ecf20Sopenharmony_ci 21738c2ecf20Sopenharmony_ci evergreen_mc_program(rdev); 21748c2ecf20Sopenharmony_ci 21758c2ecf20Sopenharmony_ci if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) { 21768c2ecf20Sopenharmony_ci r = ni_mc_load_microcode(rdev); 21778c2ecf20Sopenharmony_ci if (r) { 21788c2ecf20Sopenharmony_ci DRM_ERROR("Failed to load MC firmware!\n"); 21798c2ecf20Sopenharmony_ci return r; 21808c2ecf20Sopenharmony_ci } 21818c2ecf20Sopenharmony_ci } 21828c2ecf20Sopenharmony_ci 21838c2ecf20Sopenharmony_ci r = cayman_pcie_gart_enable(rdev); 21848c2ecf20Sopenharmony_ci if (r) 21858c2ecf20Sopenharmony_ci return r; 21868c2ecf20Sopenharmony_ci cayman_gpu_init(rdev); 21878c2ecf20Sopenharmony_ci 21888c2ecf20Sopenharmony_ci /* allocate rlc buffers */ 21898c2ecf20Sopenharmony_ci if (rdev->flags & RADEON_IS_IGP) { 21908c2ecf20Sopenharmony_ci rdev->rlc.reg_list = tn_rlc_save_restore_register_list; 21918c2ecf20Sopenharmony_ci rdev->rlc.reg_list_size = 21928c2ecf20Sopenharmony_ci (u32)ARRAY_SIZE(tn_rlc_save_restore_register_list); 21938c2ecf20Sopenharmony_ci rdev->rlc.cs_data = cayman_cs_data; 21948c2ecf20Sopenharmony_ci r = sumo_rlc_init(rdev); 21958c2ecf20Sopenharmony_ci if (r) { 21968c2ecf20Sopenharmony_ci DRM_ERROR("Failed to init rlc BOs!\n"); 21978c2ecf20Sopenharmony_ci return r; 21988c2ecf20Sopenharmony_ci } 21998c2ecf20Sopenharmony_ci } 22008c2ecf20Sopenharmony_ci 22018c2ecf20Sopenharmony_ci /* allocate wb buffer */ 22028c2ecf20Sopenharmony_ci r = radeon_wb_init(rdev); 22038c2ecf20Sopenharmony_ci if (r) 22048c2ecf20Sopenharmony_ci return r; 22058c2ecf20Sopenharmony_ci 22068c2ecf20Sopenharmony_ci r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX); 22078c2ecf20Sopenharmony_ci if (r) { 22088c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); 22098c2ecf20Sopenharmony_ci return r; 22108c2ecf20Sopenharmony_ci } 22118c2ecf20Sopenharmony_ci 22128c2ecf20Sopenharmony_ci cayman_uvd_start(rdev); 22138c2ecf20Sopenharmony_ci cayman_vce_start(rdev); 22148c2ecf20Sopenharmony_ci 22158c2ecf20Sopenharmony_ci r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX); 22168c2ecf20Sopenharmony_ci if (r) { 22178c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); 22188c2ecf20Sopenharmony_ci return r; 22198c2ecf20Sopenharmony_ci } 22208c2ecf20Sopenharmony_ci 22218c2ecf20Sopenharmony_ci r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX); 22228c2ecf20Sopenharmony_ci if (r) { 22238c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); 22248c2ecf20Sopenharmony_ci return r; 22258c2ecf20Sopenharmony_ci } 22268c2ecf20Sopenharmony_ci 22278c2ecf20Sopenharmony_ci r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX); 22288c2ecf20Sopenharmony_ci if (r) { 22298c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r); 22308c2ecf20Sopenharmony_ci return r; 22318c2ecf20Sopenharmony_ci } 22328c2ecf20Sopenharmony_ci 22338c2ecf20Sopenharmony_ci r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX); 22348c2ecf20Sopenharmony_ci if (r) { 22358c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r); 22368c2ecf20Sopenharmony_ci return r; 22378c2ecf20Sopenharmony_ci } 22388c2ecf20Sopenharmony_ci 22398c2ecf20Sopenharmony_ci /* Enable IRQ */ 22408c2ecf20Sopenharmony_ci if (!rdev->irq.installed) { 22418c2ecf20Sopenharmony_ci r = radeon_irq_kms_init(rdev); 22428c2ecf20Sopenharmony_ci if (r) 22438c2ecf20Sopenharmony_ci return r; 22448c2ecf20Sopenharmony_ci } 22458c2ecf20Sopenharmony_ci 22468c2ecf20Sopenharmony_ci r = r600_irq_init(rdev); 22478c2ecf20Sopenharmony_ci if (r) { 22488c2ecf20Sopenharmony_ci DRM_ERROR("radeon: IH init failed (%d).\n", r); 22498c2ecf20Sopenharmony_ci radeon_irq_kms_fini(rdev); 22508c2ecf20Sopenharmony_ci return r; 22518c2ecf20Sopenharmony_ci } 22528c2ecf20Sopenharmony_ci evergreen_irq_set(rdev); 22538c2ecf20Sopenharmony_ci 22548c2ecf20Sopenharmony_ci r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, 22558c2ecf20Sopenharmony_ci RADEON_CP_PACKET2); 22568c2ecf20Sopenharmony_ci if (r) 22578c2ecf20Sopenharmony_ci return r; 22588c2ecf20Sopenharmony_ci 22598c2ecf20Sopenharmony_ci ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; 22608c2ecf20Sopenharmony_ci r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, 22618c2ecf20Sopenharmony_ci DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); 22628c2ecf20Sopenharmony_ci if (r) 22638c2ecf20Sopenharmony_ci return r; 22648c2ecf20Sopenharmony_ci 22658c2ecf20Sopenharmony_ci ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]; 22668c2ecf20Sopenharmony_ci r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET, 22678c2ecf20Sopenharmony_ci DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); 22688c2ecf20Sopenharmony_ci if (r) 22698c2ecf20Sopenharmony_ci return r; 22708c2ecf20Sopenharmony_ci 22718c2ecf20Sopenharmony_ci r = cayman_cp_load_microcode(rdev); 22728c2ecf20Sopenharmony_ci if (r) 22738c2ecf20Sopenharmony_ci return r; 22748c2ecf20Sopenharmony_ci r = cayman_cp_resume(rdev); 22758c2ecf20Sopenharmony_ci if (r) 22768c2ecf20Sopenharmony_ci return r; 22778c2ecf20Sopenharmony_ci 22788c2ecf20Sopenharmony_ci r = cayman_dma_resume(rdev); 22798c2ecf20Sopenharmony_ci if (r) 22808c2ecf20Sopenharmony_ci return r; 22818c2ecf20Sopenharmony_ci 22828c2ecf20Sopenharmony_ci cayman_uvd_resume(rdev); 22838c2ecf20Sopenharmony_ci cayman_vce_resume(rdev); 22848c2ecf20Sopenharmony_ci 22858c2ecf20Sopenharmony_ci r = radeon_ib_pool_init(rdev); 22868c2ecf20Sopenharmony_ci if (r) { 22878c2ecf20Sopenharmony_ci dev_err(rdev->dev, "IB initialization failed (%d).\n", r); 22888c2ecf20Sopenharmony_ci return r; 22898c2ecf20Sopenharmony_ci } 22908c2ecf20Sopenharmony_ci 22918c2ecf20Sopenharmony_ci r = radeon_vm_manager_init(rdev); 22928c2ecf20Sopenharmony_ci if (r) { 22938c2ecf20Sopenharmony_ci dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r); 22948c2ecf20Sopenharmony_ci return r; 22958c2ecf20Sopenharmony_ci } 22968c2ecf20Sopenharmony_ci 22978c2ecf20Sopenharmony_ci r = radeon_audio_init(rdev); 22988c2ecf20Sopenharmony_ci if (r) 22998c2ecf20Sopenharmony_ci return r; 23008c2ecf20Sopenharmony_ci 23018c2ecf20Sopenharmony_ci return 0; 23028c2ecf20Sopenharmony_ci} 23038c2ecf20Sopenharmony_ci 23048c2ecf20Sopenharmony_ciint cayman_resume(struct radeon_device *rdev) 23058c2ecf20Sopenharmony_ci{ 23068c2ecf20Sopenharmony_ci int r; 23078c2ecf20Sopenharmony_ci 23088c2ecf20Sopenharmony_ci /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw, 23098c2ecf20Sopenharmony_ci * posting will perform necessary task to bring back GPU into good 23108c2ecf20Sopenharmony_ci * shape. 23118c2ecf20Sopenharmony_ci */ 23128c2ecf20Sopenharmony_ci /* post card */ 23138c2ecf20Sopenharmony_ci atom_asic_init(rdev->mode_info.atom_context); 23148c2ecf20Sopenharmony_ci 23158c2ecf20Sopenharmony_ci /* init golden registers */ 23168c2ecf20Sopenharmony_ci ni_init_golden_registers(rdev); 23178c2ecf20Sopenharmony_ci 23188c2ecf20Sopenharmony_ci if (rdev->pm.pm_method == PM_METHOD_DPM) 23198c2ecf20Sopenharmony_ci radeon_pm_resume(rdev); 23208c2ecf20Sopenharmony_ci 23218c2ecf20Sopenharmony_ci rdev->accel_working = true; 23228c2ecf20Sopenharmony_ci r = cayman_startup(rdev); 23238c2ecf20Sopenharmony_ci if (r) { 23248c2ecf20Sopenharmony_ci DRM_ERROR("cayman startup failed on resume\n"); 23258c2ecf20Sopenharmony_ci rdev->accel_working = false; 23268c2ecf20Sopenharmony_ci return r; 23278c2ecf20Sopenharmony_ci } 23288c2ecf20Sopenharmony_ci return r; 23298c2ecf20Sopenharmony_ci} 23308c2ecf20Sopenharmony_ci 23318c2ecf20Sopenharmony_ciint cayman_suspend(struct radeon_device *rdev) 23328c2ecf20Sopenharmony_ci{ 23338c2ecf20Sopenharmony_ci radeon_pm_suspend(rdev); 23348c2ecf20Sopenharmony_ci radeon_audio_fini(rdev); 23358c2ecf20Sopenharmony_ci radeon_vm_manager_fini(rdev); 23368c2ecf20Sopenharmony_ci cayman_cp_enable(rdev, false); 23378c2ecf20Sopenharmony_ci cayman_dma_stop(rdev); 23388c2ecf20Sopenharmony_ci if (rdev->has_uvd) { 23398c2ecf20Sopenharmony_ci uvd_v1_0_fini(rdev); 23408c2ecf20Sopenharmony_ci radeon_uvd_suspend(rdev); 23418c2ecf20Sopenharmony_ci } 23428c2ecf20Sopenharmony_ci evergreen_irq_suspend(rdev); 23438c2ecf20Sopenharmony_ci radeon_wb_disable(rdev); 23448c2ecf20Sopenharmony_ci cayman_pcie_gart_disable(rdev); 23458c2ecf20Sopenharmony_ci return 0; 23468c2ecf20Sopenharmony_ci} 23478c2ecf20Sopenharmony_ci 23488c2ecf20Sopenharmony_ci/* Plan is to move initialization in that function and use 23498c2ecf20Sopenharmony_ci * helper function so that radeon_device_init pretty much 23508c2ecf20Sopenharmony_ci * do nothing more than calling asic specific function. This 23518c2ecf20Sopenharmony_ci * should also allow to remove a bunch of callback function 23528c2ecf20Sopenharmony_ci * like vram_info. 23538c2ecf20Sopenharmony_ci */ 23548c2ecf20Sopenharmony_ciint cayman_init(struct radeon_device *rdev) 23558c2ecf20Sopenharmony_ci{ 23568c2ecf20Sopenharmony_ci struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 23578c2ecf20Sopenharmony_ci int r; 23588c2ecf20Sopenharmony_ci 23598c2ecf20Sopenharmony_ci /* Read BIOS */ 23608c2ecf20Sopenharmony_ci if (!radeon_get_bios(rdev)) { 23618c2ecf20Sopenharmony_ci if (ASIC_IS_AVIVO(rdev)) 23628c2ecf20Sopenharmony_ci return -EINVAL; 23638c2ecf20Sopenharmony_ci } 23648c2ecf20Sopenharmony_ci /* Must be an ATOMBIOS */ 23658c2ecf20Sopenharmony_ci if (!rdev->is_atom_bios) { 23668c2ecf20Sopenharmony_ci dev_err(rdev->dev, "Expecting atombios for cayman GPU\n"); 23678c2ecf20Sopenharmony_ci return -EINVAL; 23688c2ecf20Sopenharmony_ci } 23698c2ecf20Sopenharmony_ci r = radeon_atombios_init(rdev); 23708c2ecf20Sopenharmony_ci if (r) 23718c2ecf20Sopenharmony_ci return r; 23728c2ecf20Sopenharmony_ci 23738c2ecf20Sopenharmony_ci /* Post card if necessary */ 23748c2ecf20Sopenharmony_ci if (!radeon_card_posted(rdev)) { 23758c2ecf20Sopenharmony_ci if (!rdev->bios) { 23768c2ecf20Sopenharmony_ci dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n"); 23778c2ecf20Sopenharmony_ci return -EINVAL; 23788c2ecf20Sopenharmony_ci } 23798c2ecf20Sopenharmony_ci DRM_INFO("GPU not posted. posting now...\n"); 23808c2ecf20Sopenharmony_ci atom_asic_init(rdev->mode_info.atom_context); 23818c2ecf20Sopenharmony_ci } 23828c2ecf20Sopenharmony_ci /* init golden registers */ 23838c2ecf20Sopenharmony_ci ni_init_golden_registers(rdev); 23848c2ecf20Sopenharmony_ci /* Initialize scratch registers */ 23858c2ecf20Sopenharmony_ci r600_scratch_init(rdev); 23868c2ecf20Sopenharmony_ci /* Initialize surface registers */ 23878c2ecf20Sopenharmony_ci radeon_surface_init(rdev); 23888c2ecf20Sopenharmony_ci /* Initialize clocks */ 23898c2ecf20Sopenharmony_ci radeon_get_clock_info(rdev->ddev); 23908c2ecf20Sopenharmony_ci /* Fence driver */ 23918c2ecf20Sopenharmony_ci r = radeon_fence_driver_init(rdev); 23928c2ecf20Sopenharmony_ci if (r) 23938c2ecf20Sopenharmony_ci return r; 23948c2ecf20Sopenharmony_ci /* initialize memory controller */ 23958c2ecf20Sopenharmony_ci r = evergreen_mc_init(rdev); 23968c2ecf20Sopenharmony_ci if (r) 23978c2ecf20Sopenharmony_ci return r; 23988c2ecf20Sopenharmony_ci /* Memory manager */ 23998c2ecf20Sopenharmony_ci r = radeon_bo_init(rdev); 24008c2ecf20Sopenharmony_ci if (r) 24018c2ecf20Sopenharmony_ci return r; 24028c2ecf20Sopenharmony_ci 24038c2ecf20Sopenharmony_ci if (rdev->flags & RADEON_IS_IGP) { 24048c2ecf20Sopenharmony_ci if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 24058c2ecf20Sopenharmony_ci r = ni_init_microcode(rdev); 24068c2ecf20Sopenharmony_ci if (r) { 24078c2ecf20Sopenharmony_ci DRM_ERROR("Failed to load firmware!\n"); 24088c2ecf20Sopenharmony_ci return r; 24098c2ecf20Sopenharmony_ci } 24108c2ecf20Sopenharmony_ci } 24118c2ecf20Sopenharmony_ci } else { 24128c2ecf20Sopenharmony_ci if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) { 24138c2ecf20Sopenharmony_ci r = ni_init_microcode(rdev); 24148c2ecf20Sopenharmony_ci if (r) { 24158c2ecf20Sopenharmony_ci DRM_ERROR("Failed to load firmware!\n"); 24168c2ecf20Sopenharmony_ci return r; 24178c2ecf20Sopenharmony_ci } 24188c2ecf20Sopenharmony_ci } 24198c2ecf20Sopenharmony_ci } 24208c2ecf20Sopenharmony_ci 24218c2ecf20Sopenharmony_ci /* Initialize power management */ 24228c2ecf20Sopenharmony_ci radeon_pm_init(rdev); 24238c2ecf20Sopenharmony_ci 24248c2ecf20Sopenharmony_ci ring->ring_obj = NULL; 24258c2ecf20Sopenharmony_ci r600_ring_init(rdev, ring, 1024 * 1024); 24268c2ecf20Sopenharmony_ci 24278c2ecf20Sopenharmony_ci ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; 24288c2ecf20Sopenharmony_ci ring->ring_obj = NULL; 24298c2ecf20Sopenharmony_ci r600_ring_init(rdev, ring, 64 * 1024); 24308c2ecf20Sopenharmony_ci 24318c2ecf20Sopenharmony_ci ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]; 24328c2ecf20Sopenharmony_ci ring->ring_obj = NULL; 24338c2ecf20Sopenharmony_ci r600_ring_init(rdev, ring, 64 * 1024); 24348c2ecf20Sopenharmony_ci 24358c2ecf20Sopenharmony_ci cayman_uvd_init(rdev); 24368c2ecf20Sopenharmony_ci cayman_vce_init(rdev); 24378c2ecf20Sopenharmony_ci 24388c2ecf20Sopenharmony_ci rdev->ih.ring_obj = NULL; 24398c2ecf20Sopenharmony_ci r600_ih_ring_init(rdev, 64 * 1024); 24408c2ecf20Sopenharmony_ci 24418c2ecf20Sopenharmony_ci r = r600_pcie_gart_init(rdev); 24428c2ecf20Sopenharmony_ci if (r) 24438c2ecf20Sopenharmony_ci return r; 24448c2ecf20Sopenharmony_ci 24458c2ecf20Sopenharmony_ci rdev->accel_working = true; 24468c2ecf20Sopenharmony_ci r = cayman_startup(rdev); 24478c2ecf20Sopenharmony_ci if (r) { 24488c2ecf20Sopenharmony_ci dev_err(rdev->dev, "disabling GPU acceleration\n"); 24498c2ecf20Sopenharmony_ci cayman_cp_fini(rdev); 24508c2ecf20Sopenharmony_ci cayman_dma_fini(rdev); 24518c2ecf20Sopenharmony_ci r600_irq_fini(rdev); 24528c2ecf20Sopenharmony_ci if (rdev->flags & RADEON_IS_IGP) 24538c2ecf20Sopenharmony_ci sumo_rlc_fini(rdev); 24548c2ecf20Sopenharmony_ci radeon_wb_fini(rdev); 24558c2ecf20Sopenharmony_ci radeon_ib_pool_fini(rdev); 24568c2ecf20Sopenharmony_ci radeon_vm_manager_fini(rdev); 24578c2ecf20Sopenharmony_ci radeon_irq_kms_fini(rdev); 24588c2ecf20Sopenharmony_ci cayman_pcie_gart_fini(rdev); 24598c2ecf20Sopenharmony_ci rdev->accel_working = false; 24608c2ecf20Sopenharmony_ci } 24618c2ecf20Sopenharmony_ci 24628c2ecf20Sopenharmony_ci /* Don't start up if the MC ucode is missing. 24638c2ecf20Sopenharmony_ci * The default clocks and voltages before the MC ucode 24648c2ecf20Sopenharmony_ci * is loaded are not suffient for advanced operations. 24658c2ecf20Sopenharmony_ci * 24668c2ecf20Sopenharmony_ci * We can skip this check for TN, because there is no MC 24678c2ecf20Sopenharmony_ci * ucode. 24688c2ecf20Sopenharmony_ci */ 24698c2ecf20Sopenharmony_ci if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) { 24708c2ecf20Sopenharmony_ci DRM_ERROR("radeon: MC ucode required for NI+.\n"); 24718c2ecf20Sopenharmony_ci return -EINVAL; 24728c2ecf20Sopenharmony_ci } 24738c2ecf20Sopenharmony_ci 24748c2ecf20Sopenharmony_ci return 0; 24758c2ecf20Sopenharmony_ci} 24768c2ecf20Sopenharmony_ci 24778c2ecf20Sopenharmony_civoid cayman_fini(struct radeon_device *rdev) 24788c2ecf20Sopenharmony_ci{ 24798c2ecf20Sopenharmony_ci radeon_pm_fini(rdev); 24808c2ecf20Sopenharmony_ci cayman_cp_fini(rdev); 24818c2ecf20Sopenharmony_ci cayman_dma_fini(rdev); 24828c2ecf20Sopenharmony_ci r600_irq_fini(rdev); 24838c2ecf20Sopenharmony_ci if (rdev->flags & RADEON_IS_IGP) 24848c2ecf20Sopenharmony_ci sumo_rlc_fini(rdev); 24858c2ecf20Sopenharmony_ci radeon_wb_fini(rdev); 24868c2ecf20Sopenharmony_ci radeon_vm_manager_fini(rdev); 24878c2ecf20Sopenharmony_ci radeon_ib_pool_fini(rdev); 24888c2ecf20Sopenharmony_ci radeon_irq_kms_fini(rdev); 24898c2ecf20Sopenharmony_ci uvd_v1_0_fini(rdev); 24908c2ecf20Sopenharmony_ci radeon_uvd_fini(rdev); 24918c2ecf20Sopenharmony_ci if (rdev->has_vce) 24928c2ecf20Sopenharmony_ci radeon_vce_fini(rdev); 24938c2ecf20Sopenharmony_ci cayman_pcie_gart_fini(rdev); 24948c2ecf20Sopenharmony_ci r600_vram_scratch_fini(rdev); 24958c2ecf20Sopenharmony_ci radeon_gem_fini(rdev); 24968c2ecf20Sopenharmony_ci radeon_fence_driver_fini(rdev); 24978c2ecf20Sopenharmony_ci radeon_bo_fini(rdev); 24988c2ecf20Sopenharmony_ci radeon_atombios_fini(rdev); 24998c2ecf20Sopenharmony_ci kfree(rdev->bios); 25008c2ecf20Sopenharmony_ci rdev->bios = NULL; 25018c2ecf20Sopenharmony_ci} 25028c2ecf20Sopenharmony_ci 25038c2ecf20Sopenharmony_ci/* 25048c2ecf20Sopenharmony_ci * vm 25058c2ecf20Sopenharmony_ci */ 25068c2ecf20Sopenharmony_ciint cayman_vm_init(struct radeon_device *rdev) 25078c2ecf20Sopenharmony_ci{ 25088c2ecf20Sopenharmony_ci /* number of VMs */ 25098c2ecf20Sopenharmony_ci rdev->vm_manager.nvm = 8; 25108c2ecf20Sopenharmony_ci /* base offset of vram pages */ 25118c2ecf20Sopenharmony_ci if (rdev->flags & RADEON_IS_IGP) { 25128c2ecf20Sopenharmony_ci u64 tmp = RREG32(FUS_MC_VM_FB_OFFSET); 25138c2ecf20Sopenharmony_ci tmp <<= 22; 25148c2ecf20Sopenharmony_ci rdev->vm_manager.vram_base_offset = tmp; 25158c2ecf20Sopenharmony_ci } else 25168c2ecf20Sopenharmony_ci rdev->vm_manager.vram_base_offset = 0; 25178c2ecf20Sopenharmony_ci return 0; 25188c2ecf20Sopenharmony_ci} 25198c2ecf20Sopenharmony_ci 25208c2ecf20Sopenharmony_civoid cayman_vm_fini(struct radeon_device *rdev) 25218c2ecf20Sopenharmony_ci{ 25228c2ecf20Sopenharmony_ci} 25238c2ecf20Sopenharmony_ci 25248c2ecf20Sopenharmony_ci/** 25258c2ecf20Sopenharmony_ci * cayman_vm_decode_fault - print human readable fault info 25268c2ecf20Sopenharmony_ci * 25278c2ecf20Sopenharmony_ci * @rdev: radeon_device pointer 25288c2ecf20Sopenharmony_ci * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value 25298c2ecf20Sopenharmony_ci * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value 25308c2ecf20Sopenharmony_ci * 25318c2ecf20Sopenharmony_ci * Print human readable fault information (cayman/TN). 25328c2ecf20Sopenharmony_ci */ 25338c2ecf20Sopenharmony_civoid cayman_vm_decode_fault(struct radeon_device *rdev, 25348c2ecf20Sopenharmony_ci u32 status, u32 addr) 25358c2ecf20Sopenharmony_ci{ 25368c2ecf20Sopenharmony_ci u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT; 25378c2ecf20Sopenharmony_ci u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT; 25388c2ecf20Sopenharmony_ci u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT; 25398c2ecf20Sopenharmony_ci char *block; 25408c2ecf20Sopenharmony_ci 25418c2ecf20Sopenharmony_ci switch (mc_id) { 25428c2ecf20Sopenharmony_ci case 32: 25438c2ecf20Sopenharmony_ci case 16: 25448c2ecf20Sopenharmony_ci case 96: 25458c2ecf20Sopenharmony_ci case 80: 25468c2ecf20Sopenharmony_ci case 160: 25478c2ecf20Sopenharmony_ci case 144: 25488c2ecf20Sopenharmony_ci case 224: 25498c2ecf20Sopenharmony_ci case 208: 25508c2ecf20Sopenharmony_ci block = "CB"; 25518c2ecf20Sopenharmony_ci break; 25528c2ecf20Sopenharmony_ci case 33: 25538c2ecf20Sopenharmony_ci case 17: 25548c2ecf20Sopenharmony_ci case 97: 25558c2ecf20Sopenharmony_ci case 81: 25568c2ecf20Sopenharmony_ci case 161: 25578c2ecf20Sopenharmony_ci case 145: 25588c2ecf20Sopenharmony_ci case 225: 25598c2ecf20Sopenharmony_ci case 209: 25608c2ecf20Sopenharmony_ci block = "CB_FMASK"; 25618c2ecf20Sopenharmony_ci break; 25628c2ecf20Sopenharmony_ci case 34: 25638c2ecf20Sopenharmony_ci case 18: 25648c2ecf20Sopenharmony_ci case 98: 25658c2ecf20Sopenharmony_ci case 82: 25668c2ecf20Sopenharmony_ci case 162: 25678c2ecf20Sopenharmony_ci case 146: 25688c2ecf20Sopenharmony_ci case 226: 25698c2ecf20Sopenharmony_ci case 210: 25708c2ecf20Sopenharmony_ci block = "CB_CMASK"; 25718c2ecf20Sopenharmony_ci break; 25728c2ecf20Sopenharmony_ci case 35: 25738c2ecf20Sopenharmony_ci case 19: 25748c2ecf20Sopenharmony_ci case 99: 25758c2ecf20Sopenharmony_ci case 83: 25768c2ecf20Sopenharmony_ci case 163: 25778c2ecf20Sopenharmony_ci case 147: 25788c2ecf20Sopenharmony_ci case 227: 25798c2ecf20Sopenharmony_ci case 211: 25808c2ecf20Sopenharmony_ci block = "CB_IMMED"; 25818c2ecf20Sopenharmony_ci break; 25828c2ecf20Sopenharmony_ci case 36: 25838c2ecf20Sopenharmony_ci case 20: 25848c2ecf20Sopenharmony_ci case 100: 25858c2ecf20Sopenharmony_ci case 84: 25868c2ecf20Sopenharmony_ci case 164: 25878c2ecf20Sopenharmony_ci case 148: 25888c2ecf20Sopenharmony_ci case 228: 25898c2ecf20Sopenharmony_ci case 212: 25908c2ecf20Sopenharmony_ci block = "DB"; 25918c2ecf20Sopenharmony_ci break; 25928c2ecf20Sopenharmony_ci case 37: 25938c2ecf20Sopenharmony_ci case 21: 25948c2ecf20Sopenharmony_ci case 101: 25958c2ecf20Sopenharmony_ci case 85: 25968c2ecf20Sopenharmony_ci case 165: 25978c2ecf20Sopenharmony_ci case 149: 25988c2ecf20Sopenharmony_ci case 229: 25998c2ecf20Sopenharmony_ci case 213: 26008c2ecf20Sopenharmony_ci block = "DB_HTILE"; 26018c2ecf20Sopenharmony_ci break; 26028c2ecf20Sopenharmony_ci case 38: 26038c2ecf20Sopenharmony_ci case 22: 26048c2ecf20Sopenharmony_ci case 102: 26058c2ecf20Sopenharmony_ci case 86: 26068c2ecf20Sopenharmony_ci case 166: 26078c2ecf20Sopenharmony_ci case 150: 26088c2ecf20Sopenharmony_ci case 230: 26098c2ecf20Sopenharmony_ci case 214: 26108c2ecf20Sopenharmony_ci block = "SX"; 26118c2ecf20Sopenharmony_ci break; 26128c2ecf20Sopenharmony_ci case 39: 26138c2ecf20Sopenharmony_ci case 23: 26148c2ecf20Sopenharmony_ci case 103: 26158c2ecf20Sopenharmony_ci case 87: 26168c2ecf20Sopenharmony_ci case 167: 26178c2ecf20Sopenharmony_ci case 151: 26188c2ecf20Sopenharmony_ci case 231: 26198c2ecf20Sopenharmony_ci case 215: 26208c2ecf20Sopenharmony_ci block = "DB_STEN"; 26218c2ecf20Sopenharmony_ci break; 26228c2ecf20Sopenharmony_ci case 40: 26238c2ecf20Sopenharmony_ci case 24: 26248c2ecf20Sopenharmony_ci case 104: 26258c2ecf20Sopenharmony_ci case 88: 26268c2ecf20Sopenharmony_ci case 232: 26278c2ecf20Sopenharmony_ci case 216: 26288c2ecf20Sopenharmony_ci case 168: 26298c2ecf20Sopenharmony_ci case 152: 26308c2ecf20Sopenharmony_ci block = "TC_TFETCH"; 26318c2ecf20Sopenharmony_ci break; 26328c2ecf20Sopenharmony_ci case 41: 26338c2ecf20Sopenharmony_ci case 25: 26348c2ecf20Sopenharmony_ci case 105: 26358c2ecf20Sopenharmony_ci case 89: 26368c2ecf20Sopenharmony_ci case 233: 26378c2ecf20Sopenharmony_ci case 217: 26388c2ecf20Sopenharmony_ci case 169: 26398c2ecf20Sopenharmony_ci case 153: 26408c2ecf20Sopenharmony_ci block = "TC_VFETCH"; 26418c2ecf20Sopenharmony_ci break; 26428c2ecf20Sopenharmony_ci case 42: 26438c2ecf20Sopenharmony_ci case 26: 26448c2ecf20Sopenharmony_ci case 106: 26458c2ecf20Sopenharmony_ci case 90: 26468c2ecf20Sopenharmony_ci case 234: 26478c2ecf20Sopenharmony_ci case 218: 26488c2ecf20Sopenharmony_ci case 170: 26498c2ecf20Sopenharmony_ci case 154: 26508c2ecf20Sopenharmony_ci block = "VC"; 26518c2ecf20Sopenharmony_ci break; 26528c2ecf20Sopenharmony_ci case 112: 26538c2ecf20Sopenharmony_ci block = "CP"; 26548c2ecf20Sopenharmony_ci break; 26558c2ecf20Sopenharmony_ci case 113: 26568c2ecf20Sopenharmony_ci case 114: 26578c2ecf20Sopenharmony_ci block = "SH"; 26588c2ecf20Sopenharmony_ci break; 26598c2ecf20Sopenharmony_ci case 115: 26608c2ecf20Sopenharmony_ci block = "VGT"; 26618c2ecf20Sopenharmony_ci break; 26628c2ecf20Sopenharmony_ci case 178: 26638c2ecf20Sopenharmony_ci block = "IH"; 26648c2ecf20Sopenharmony_ci break; 26658c2ecf20Sopenharmony_ci case 51: 26668c2ecf20Sopenharmony_ci block = "RLC"; 26678c2ecf20Sopenharmony_ci break; 26688c2ecf20Sopenharmony_ci case 55: 26698c2ecf20Sopenharmony_ci block = "DMA"; 26708c2ecf20Sopenharmony_ci break; 26718c2ecf20Sopenharmony_ci case 56: 26728c2ecf20Sopenharmony_ci block = "HDP"; 26738c2ecf20Sopenharmony_ci break; 26748c2ecf20Sopenharmony_ci default: 26758c2ecf20Sopenharmony_ci block = "unknown"; 26768c2ecf20Sopenharmony_ci break; 26778c2ecf20Sopenharmony_ci } 26788c2ecf20Sopenharmony_ci 26798c2ecf20Sopenharmony_ci printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n", 26808c2ecf20Sopenharmony_ci protections, vmid, addr, 26818c2ecf20Sopenharmony_ci (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read", 26828c2ecf20Sopenharmony_ci block, mc_id); 26838c2ecf20Sopenharmony_ci} 26848c2ecf20Sopenharmony_ci 26858c2ecf20Sopenharmony_ci/** 26868c2ecf20Sopenharmony_ci * cayman_vm_flush - vm flush using the CP 26878c2ecf20Sopenharmony_ci * 26888c2ecf20Sopenharmony_ci * @rdev: radeon_device pointer 26898c2ecf20Sopenharmony_ci * 26908c2ecf20Sopenharmony_ci * Update the page table base and flush the VM TLB 26918c2ecf20Sopenharmony_ci * using the CP (cayman-si). 26928c2ecf20Sopenharmony_ci */ 26938c2ecf20Sopenharmony_civoid cayman_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring, 26948c2ecf20Sopenharmony_ci unsigned vm_id, uint64_t pd_addr) 26958c2ecf20Sopenharmony_ci{ 26968c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET0(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2), 0)); 26978c2ecf20Sopenharmony_ci radeon_ring_write(ring, pd_addr >> 12); 26988c2ecf20Sopenharmony_ci 26998c2ecf20Sopenharmony_ci /* flush hdp cache */ 27008c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET0(HDP_MEM_COHERENCY_FLUSH_CNTL, 0)); 27018c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0x1); 27028c2ecf20Sopenharmony_ci 27038c2ecf20Sopenharmony_ci /* bits 0-7 are the VM contexts0-7 */ 27048c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0)); 27058c2ecf20Sopenharmony_ci radeon_ring_write(ring, 1 << vm_id); 27068c2ecf20Sopenharmony_ci 27078c2ecf20Sopenharmony_ci /* wait for the invalidate to complete */ 27088c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); 27098c2ecf20Sopenharmony_ci radeon_ring_write(ring, (WAIT_REG_MEM_FUNCTION(0) | /* always */ 27108c2ecf20Sopenharmony_ci WAIT_REG_MEM_ENGINE(0))); /* me */ 27118c2ecf20Sopenharmony_ci radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2); 27128c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0); 27138c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0); /* ref */ 27148c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0); /* mask */ 27158c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0x20); /* poll interval */ 27168c2ecf20Sopenharmony_ci 27178c2ecf20Sopenharmony_ci /* sync PFP to ME, otherwise we might get invalid PFP reads */ 27188c2ecf20Sopenharmony_ci radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); 27198c2ecf20Sopenharmony_ci radeon_ring_write(ring, 0x0); 27208c2ecf20Sopenharmony_ci} 27218c2ecf20Sopenharmony_ci 27228c2ecf20Sopenharmony_ciint tn_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk) 27238c2ecf20Sopenharmony_ci{ 27248c2ecf20Sopenharmony_ci struct atom_clock_dividers dividers; 27258c2ecf20Sopenharmony_ci int r, i; 27268c2ecf20Sopenharmony_ci 27278c2ecf20Sopenharmony_ci r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, 27288c2ecf20Sopenharmony_ci ecclk, false, ÷rs); 27298c2ecf20Sopenharmony_ci if (r) 27308c2ecf20Sopenharmony_ci return r; 27318c2ecf20Sopenharmony_ci 27328c2ecf20Sopenharmony_ci for (i = 0; i < 100; i++) { 27338c2ecf20Sopenharmony_ci if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS) 27348c2ecf20Sopenharmony_ci break; 27358c2ecf20Sopenharmony_ci mdelay(10); 27368c2ecf20Sopenharmony_ci } 27378c2ecf20Sopenharmony_ci if (i == 100) 27388c2ecf20Sopenharmony_ci return -ETIMEDOUT; 27398c2ecf20Sopenharmony_ci 27408c2ecf20Sopenharmony_ci WREG32_P(CG_ECLK_CNTL, dividers.post_div, ~(ECLK_DIR_CNTL_EN|ECLK_DIVIDER_MASK)); 27418c2ecf20Sopenharmony_ci 27428c2ecf20Sopenharmony_ci for (i = 0; i < 100; i++) { 27438c2ecf20Sopenharmony_ci if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS) 27448c2ecf20Sopenharmony_ci break; 27458c2ecf20Sopenharmony_ci mdelay(10); 27468c2ecf20Sopenharmony_ci } 27478c2ecf20Sopenharmony_ci if (i == 100) 27488c2ecf20Sopenharmony_ci return -ETIMEDOUT; 27498c2ecf20Sopenharmony_ci 27508c2ecf20Sopenharmony_ci return 0; 27518c2ecf20Sopenharmony_ci} 2752