xref: /kernel/linux/linux-5.10/drivers/gpu/drm/radeon/ni.c (revision 8c2ecf20)
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, &dividers);
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