162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Copyright 2008 Advanced Micro Devices, Inc. 362306a36Sopenharmony_ci * Copyright 2008 Red Hat Inc. 462306a36Sopenharmony_ci * Copyright 2009 Jerome Glisse. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 762306a36Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 862306a36Sopenharmony_ci * to deal in the Software without restriction, including without limitation 962306a36Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1062306a36Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 1162306a36Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * The above copyright notice and this permission notice shall be included in 1462306a36Sopenharmony_ci * all copies or substantial portions of the Software. 1562306a36Sopenharmony_ci * 1662306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1762306a36Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1862306a36Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1962306a36Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 2062306a36Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 2162306a36Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2262306a36Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 2362306a36Sopenharmony_ci * 2462306a36Sopenharmony_ci * Authors: Dave Airlie 2562306a36Sopenharmony_ci * Alex Deucher 2662306a36Sopenharmony_ci * Jerome Glisse 2762306a36Sopenharmony_ci */ 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#include <linux/firmware.h> 3062306a36Sopenharmony_ci#include <linux/pci.h> 3162306a36Sopenharmony_ci#include <linux/slab.h> 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#include <drm/drm_device.h> 3462306a36Sopenharmony_ci#include <drm/radeon_drm.h> 3562306a36Sopenharmony_ci#include <drm/drm_fourcc.h> 3662306a36Sopenharmony_ci#include <drm/drm_framebuffer.h> 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#include "atom.h" 3962306a36Sopenharmony_ci#include "avivod.h" 4062306a36Sopenharmony_ci#include "radeon.h" 4162306a36Sopenharmony_ci#include "radeon_asic.h" 4262306a36Sopenharmony_ci#include "radeon_audio.h" 4362306a36Sopenharmony_ci#include "rv770d.h" 4462306a36Sopenharmony_ci#include "rv770.h" 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#define R700_PFP_UCODE_SIZE 848 4762306a36Sopenharmony_ci#define R700_PM4_UCODE_SIZE 1360 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistatic void rv770_gpu_init(struct radeon_device *rdev); 5062306a36Sopenharmony_civoid rv770_fini(struct radeon_device *rdev); 5162306a36Sopenharmony_cistatic void rv770_pcie_gen2_enable(struct radeon_device *rdev); 5262306a36Sopenharmony_ciint evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ciint rv770_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk) 5562306a36Sopenharmony_ci{ 5662306a36Sopenharmony_ci unsigned fb_div = 0, vclk_div = 0, dclk_div = 0; 5762306a36Sopenharmony_ci int r; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci /* RV740 uses evergreen uvd clk programming */ 6062306a36Sopenharmony_ci if (rdev->family == CHIP_RV740) 6162306a36Sopenharmony_ci return evergreen_set_uvd_clocks(rdev, vclk, dclk); 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci /* bypass vclk and dclk with bclk */ 6462306a36Sopenharmony_ci WREG32_P(CG_UPLL_FUNC_CNTL_2, 6562306a36Sopenharmony_ci VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1), 6662306a36Sopenharmony_ci ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK)); 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci if (!vclk || !dclk) { 6962306a36Sopenharmony_ci /* keep the Bypass mode, put PLL to sleep */ 7062306a36Sopenharmony_ci WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK); 7162306a36Sopenharmony_ci return 0; 7262306a36Sopenharmony_ci } 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 50000, 160000, 7562306a36Sopenharmony_ci 43663, 0x03FFFFFE, 1, 30, ~0, 7662306a36Sopenharmony_ci &fb_div, &vclk_div, &dclk_div); 7762306a36Sopenharmony_ci if (r) 7862306a36Sopenharmony_ci return r; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci fb_div |= 1; 8162306a36Sopenharmony_ci vclk_div -= 1; 8262306a36Sopenharmony_ci dclk_div -= 1; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci /* set UPLL_FB_DIV to 0x50000 */ 8562306a36Sopenharmony_ci WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(0x50000), ~UPLL_FB_DIV_MASK); 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci /* deassert UPLL_RESET and UPLL_SLEEP */ 8862306a36Sopenharmony_ci WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~(UPLL_RESET_MASK | UPLL_SLEEP_MASK)); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci /* assert BYPASS EN and FB_DIV[0] <- ??? why? */ 9162306a36Sopenharmony_ci WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK); 9262306a36Sopenharmony_ci WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(1), ~UPLL_FB_DIV(1)); 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL); 9562306a36Sopenharmony_ci if (r) 9662306a36Sopenharmony_ci return r; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci /* assert PLL_RESET */ 9962306a36Sopenharmony_ci WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK); 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci /* set the required FB_DIV, REF_DIV, Post divder values */ 10262306a36Sopenharmony_ci WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_REF_DIV(1), ~UPLL_REF_DIV_MASK); 10362306a36Sopenharmony_ci WREG32_P(CG_UPLL_FUNC_CNTL_2, 10462306a36Sopenharmony_ci UPLL_SW_HILEN(vclk_div >> 1) | 10562306a36Sopenharmony_ci UPLL_SW_LOLEN((vclk_div >> 1) + (vclk_div & 1)) | 10662306a36Sopenharmony_ci UPLL_SW_HILEN2(dclk_div >> 1) | 10762306a36Sopenharmony_ci UPLL_SW_LOLEN2((dclk_div >> 1) + (dclk_div & 1)), 10862306a36Sopenharmony_ci ~UPLL_SW_MASK); 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div), 11162306a36Sopenharmony_ci ~UPLL_FB_DIV_MASK); 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci /* give the PLL some time to settle */ 11462306a36Sopenharmony_ci mdelay(15); 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci /* deassert PLL_RESET */ 11762306a36Sopenharmony_ci WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK); 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci mdelay(15); 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci /* deassert BYPASS EN and FB_DIV[0] <- ??? why? */ 12262306a36Sopenharmony_ci WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK); 12362306a36Sopenharmony_ci WREG32_P(CG_UPLL_FUNC_CNTL_3, 0, ~UPLL_FB_DIV(1)); 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL); 12662306a36Sopenharmony_ci if (r) 12762306a36Sopenharmony_ci return r; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci /* switch VCLK and DCLK selection */ 13062306a36Sopenharmony_ci WREG32_P(CG_UPLL_FUNC_CNTL_2, 13162306a36Sopenharmony_ci VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2), 13262306a36Sopenharmony_ci ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK)); 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci mdelay(100); 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci return 0; 13762306a36Sopenharmony_ci} 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cistatic const u32 r7xx_golden_registers[] = { 14062306a36Sopenharmony_ci 0x8d00, 0xffffffff, 0x0e0e0074, 14162306a36Sopenharmony_ci 0x8d04, 0xffffffff, 0x013a2b34, 14262306a36Sopenharmony_ci 0x9508, 0xffffffff, 0x00000002, 14362306a36Sopenharmony_ci 0x8b20, 0xffffffff, 0, 14462306a36Sopenharmony_ci 0x88c4, 0xffffffff, 0x000000c2, 14562306a36Sopenharmony_ci 0x28350, 0xffffffff, 0, 14662306a36Sopenharmony_ci 0x9058, 0xffffffff, 0x0fffc40f, 14762306a36Sopenharmony_ci 0x240c, 0xffffffff, 0x00000380, 14862306a36Sopenharmony_ci 0x733c, 0xffffffff, 0x00000002, 14962306a36Sopenharmony_ci 0x2650, 0x00040000, 0, 15062306a36Sopenharmony_ci 0x20bc, 0x00040000, 0, 15162306a36Sopenharmony_ci 0x7300, 0xffffffff, 0x001000f0 15262306a36Sopenharmony_ci}; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cistatic const u32 r7xx_golden_dyn_gpr_registers[] = { 15562306a36Sopenharmony_ci 0x8db0, 0xffffffff, 0x98989898, 15662306a36Sopenharmony_ci 0x8db4, 0xffffffff, 0x98989898, 15762306a36Sopenharmony_ci 0x8db8, 0xffffffff, 0x98989898, 15862306a36Sopenharmony_ci 0x8dbc, 0xffffffff, 0x98989898, 15962306a36Sopenharmony_ci 0x8dc0, 0xffffffff, 0x98989898, 16062306a36Sopenharmony_ci 0x8dc4, 0xffffffff, 0x98989898, 16162306a36Sopenharmony_ci 0x8dc8, 0xffffffff, 0x98989898, 16262306a36Sopenharmony_ci 0x8dcc, 0xffffffff, 0x98989898, 16362306a36Sopenharmony_ci 0x88c4, 0xffffffff, 0x00000082 16462306a36Sopenharmony_ci}; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_cistatic const u32 rv770_golden_registers[] = { 16762306a36Sopenharmony_ci 0x562c, 0xffffffff, 0, 16862306a36Sopenharmony_ci 0x3f90, 0xffffffff, 0, 16962306a36Sopenharmony_ci 0x9148, 0xffffffff, 0, 17062306a36Sopenharmony_ci 0x3f94, 0xffffffff, 0, 17162306a36Sopenharmony_ci 0x914c, 0xffffffff, 0, 17262306a36Sopenharmony_ci 0x9698, 0x18000000, 0x18000000 17362306a36Sopenharmony_ci}; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_cistatic const u32 rv770ce_golden_registers[] = { 17662306a36Sopenharmony_ci 0x562c, 0xffffffff, 0, 17762306a36Sopenharmony_ci 0x3f90, 0xffffffff, 0x00cc0000, 17862306a36Sopenharmony_ci 0x9148, 0xffffffff, 0x00cc0000, 17962306a36Sopenharmony_ci 0x3f94, 0xffffffff, 0x00cc0000, 18062306a36Sopenharmony_ci 0x914c, 0xffffffff, 0x00cc0000, 18162306a36Sopenharmony_ci 0x9b7c, 0xffffffff, 0x00fa0000, 18262306a36Sopenharmony_ci 0x3f8c, 0xffffffff, 0x00fa0000, 18362306a36Sopenharmony_ci 0x9698, 0x18000000, 0x18000000 18462306a36Sopenharmony_ci}; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cistatic const u32 rv770_mgcg_init[] = { 18762306a36Sopenharmony_ci 0x8bcc, 0xffffffff, 0x130300f9, 18862306a36Sopenharmony_ci 0x5448, 0xffffffff, 0x100, 18962306a36Sopenharmony_ci 0x55e4, 0xffffffff, 0x100, 19062306a36Sopenharmony_ci 0x160c, 0xffffffff, 0x100, 19162306a36Sopenharmony_ci 0x5644, 0xffffffff, 0x100, 19262306a36Sopenharmony_ci 0xc164, 0xffffffff, 0x100, 19362306a36Sopenharmony_ci 0x8a18, 0xffffffff, 0x100, 19462306a36Sopenharmony_ci 0x897c, 0xffffffff, 0x8000100, 19562306a36Sopenharmony_ci 0x8b28, 0xffffffff, 0x3c000100, 19662306a36Sopenharmony_ci 0x9144, 0xffffffff, 0x100, 19762306a36Sopenharmony_ci 0x9a1c, 0xffffffff, 0x10000, 19862306a36Sopenharmony_ci 0x9a50, 0xffffffff, 0x100, 19962306a36Sopenharmony_ci 0x9a1c, 0xffffffff, 0x10001, 20062306a36Sopenharmony_ci 0x9a50, 0xffffffff, 0x100, 20162306a36Sopenharmony_ci 0x9a1c, 0xffffffff, 0x10002, 20262306a36Sopenharmony_ci 0x9a50, 0xffffffff, 0x100, 20362306a36Sopenharmony_ci 0x9a1c, 0xffffffff, 0x10003, 20462306a36Sopenharmony_ci 0x9a50, 0xffffffff, 0x100, 20562306a36Sopenharmony_ci 0x9a1c, 0xffffffff, 0x0, 20662306a36Sopenharmony_ci 0x9870, 0xffffffff, 0x100, 20762306a36Sopenharmony_ci 0x8d58, 0xffffffff, 0x100, 20862306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x0, 20962306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 21062306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x1, 21162306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 21262306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x2, 21362306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 21462306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x3, 21562306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 21662306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x4, 21762306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 21862306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x5, 21962306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 22062306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x6, 22162306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 22262306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x7, 22362306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 22462306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x8, 22562306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 22662306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x9, 22762306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 22862306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x8000, 22962306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x0, 23062306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 23162306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x1, 23262306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 23362306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x2, 23462306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 23562306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x3, 23662306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 23762306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x4, 23862306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 23962306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x5, 24062306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 24162306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x6, 24262306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 24362306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x7, 24462306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 24562306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x8, 24662306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 24762306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x9, 24862306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 24962306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x8000, 25062306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x0, 25162306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 25262306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x1, 25362306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 25462306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x2, 25562306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 25662306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x3, 25762306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 25862306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x4, 25962306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 26062306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x5, 26162306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 26262306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x6, 26362306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 26462306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x7, 26562306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 26662306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x8, 26762306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 26862306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x9, 26962306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 27062306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x80000000, 27162306a36Sopenharmony_ci 0x9030, 0xffffffff, 0x100, 27262306a36Sopenharmony_ci 0x9034, 0xffffffff, 0x100, 27362306a36Sopenharmony_ci 0x9038, 0xffffffff, 0x100, 27462306a36Sopenharmony_ci 0x903c, 0xffffffff, 0x100, 27562306a36Sopenharmony_ci 0x9040, 0xffffffff, 0x100, 27662306a36Sopenharmony_ci 0xa200, 0xffffffff, 0x100, 27762306a36Sopenharmony_ci 0xa204, 0xffffffff, 0x100, 27862306a36Sopenharmony_ci 0xa208, 0xffffffff, 0x100, 27962306a36Sopenharmony_ci 0xa20c, 0xffffffff, 0x100, 28062306a36Sopenharmony_ci 0x971c, 0xffffffff, 0x100, 28162306a36Sopenharmony_ci 0x915c, 0xffffffff, 0x00020001, 28262306a36Sopenharmony_ci 0x9160, 0xffffffff, 0x00040003, 28362306a36Sopenharmony_ci 0x916c, 0xffffffff, 0x00060005, 28462306a36Sopenharmony_ci 0x9170, 0xffffffff, 0x00080007, 28562306a36Sopenharmony_ci 0x9174, 0xffffffff, 0x000a0009, 28662306a36Sopenharmony_ci 0x9178, 0xffffffff, 0x000c000b, 28762306a36Sopenharmony_ci 0x917c, 0xffffffff, 0x000e000d, 28862306a36Sopenharmony_ci 0x9180, 0xffffffff, 0x0010000f, 28962306a36Sopenharmony_ci 0x918c, 0xffffffff, 0x00120011, 29062306a36Sopenharmony_ci 0x9190, 0xffffffff, 0x00140013, 29162306a36Sopenharmony_ci 0x9194, 0xffffffff, 0x00020001, 29262306a36Sopenharmony_ci 0x9198, 0xffffffff, 0x00040003, 29362306a36Sopenharmony_ci 0x919c, 0xffffffff, 0x00060005, 29462306a36Sopenharmony_ci 0x91a8, 0xffffffff, 0x00080007, 29562306a36Sopenharmony_ci 0x91ac, 0xffffffff, 0x000a0009, 29662306a36Sopenharmony_ci 0x91b0, 0xffffffff, 0x000c000b, 29762306a36Sopenharmony_ci 0x91b4, 0xffffffff, 0x000e000d, 29862306a36Sopenharmony_ci 0x91b8, 0xffffffff, 0x0010000f, 29962306a36Sopenharmony_ci 0x91c4, 0xffffffff, 0x00120011, 30062306a36Sopenharmony_ci 0x91c8, 0xffffffff, 0x00140013, 30162306a36Sopenharmony_ci 0x91cc, 0xffffffff, 0x00020001, 30262306a36Sopenharmony_ci 0x91d0, 0xffffffff, 0x00040003, 30362306a36Sopenharmony_ci 0x91d4, 0xffffffff, 0x00060005, 30462306a36Sopenharmony_ci 0x91e0, 0xffffffff, 0x00080007, 30562306a36Sopenharmony_ci 0x91e4, 0xffffffff, 0x000a0009, 30662306a36Sopenharmony_ci 0x91e8, 0xffffffff, 0x000c000b, 30762306a36Sopenharmony_ci 0x91ec, 0xffffffff, 0x00020001, 30862306a36Sopenharmony_ci 0x91f0, 0xffffffff, 0x00040003, 30962306a36Sopenharmony_ci 0x91f4, 0xffffffff, 0x00060005, 31062306a36Sopenharmony_ci 0x9200, 0xffffffff, 0x00080007, 31162306a36Sopenharmony_ci 0x9204, 0xffffffff, 0x000a0009, 31262306a36Sopenharmony_ci 0x9208, 0xffffffff, 0x000c000b, 31362306a36Sopenharmony_ci 0x920c, 0xffffffff, 0x000e000d, 31462306a36Sopenharmony_ci 0x9210, 0xffffffff, 0x0010000f, 31562306a36Sopenharmony_ci 0x921c, 0xffffffff, 0x00120011, 31662306a36Sopenharmony_ci 0x9220, 0xffffffff, 0x00140013, 31762306a36Sopenharmony_ci 0x9224, 0xffffffff, 0x00020001, 31862306a36Sopenharmony_ci 0x9228, 0xffffffff, 0x00040003, 31962306a36Sopenharmony_ci 0x922c, 0xffffffff, 0x00060005, 32062306a36Sopenharmony_ci 0x9238, 0xffffffff, 0x00080007, 32162306a36Sopenharmony_ci 0x923c, 0xffffffff, 0x000a0009, 32262306a36Sopenharmony_ci 0x9240, 0xffffffff, 0x000c000b, 32362306a36Sopenharmony_ci 0x9244, 0xffffffff, 0x000e000d, 32462306a36Sopenharmony_ci 0x9248, 0xffffffff, 0x0010000f, 32562306a36Sopenharmony_ci 0x9254, 0xffffffff, 0x00120011, 32662306a36Sopenharmony_ci 0x9258, 0xffffffff, 0x00140013, 32762306a36Sopenharmony_ci 0x925c, 0xffffffff, 0x00020001, 32862306a36Sopenharmony_ci 0x9260, 0xffffffff, 0x00040003, 32962306a36Sopenharmony_ci 0x9264, 0xffffffff, 0x00060005, 33062306a36Sopenharmony_ci 0x9270, 0xffffffff, 0x00080007, 33162306a36Sopenharmony_ci 0x9274, 0xffffffff, 0x000a0009, 33262306a36Sopenharmony_ci 0x9278, 0xffffffff, 0x000c000b, 33362306a36Sopenharmony_ci 0x927c, 0xffffffff, 0x000e000d, 33462306a36Sopenharmony_ci 0x9280, 0xffffffff, 0x0010000f, 33562306a36Sopenharmony_ci 0x928c, 0xffffffff, 0x00120011, 33662306a36Sopenharmony_ci 0x9290, 0xffffffff, 0x00140013, 33762306a36Sopenharmony_ci 0x9294, 0xffffffff, 0x00020001, 33862306a36Sopenharmony_ci 0x929c, 0xffffffff, 0x00040003, 33962306a36Sopenharmony_ci 0x92a0, 0xffffffff, 0x00060005, 34062306a36Sopenharmony_ci 0x92a4, 0xffffffff, 0x00080007 34162306a36Sopenharmony_ci}; 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_cistatic const u32 rv710_golden_registers[] = { 34462306a36Sopenharmony_ci 0x3f90, 0x00ff0000, 0x00fc0000, 34562306a36Sopenharmony_ci 0x9148, 0x00ff0000, 0x00fc0000, 34662306a36Sopenharmony_ci 0x3f94, 0x00ff0000, 0x00fc0000, 34762306a36Sopenharmony_ci 0x914c, 0x00ff0000, 0x00fc0000, 34862306a36Sopenharmony_ci 0xb4c, 0x00000020, 0x00000020, 34962306a36Sopenharmony_ci 0xa180, 0xffffffff, 0x00003f3f 35062306a36Sopenharmony_ci}; 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_cistatic const u32 rv710_mgcg_init[] = { 35362306a36Sopenharmony_ci 0x8bcc, 0xffffffff, 0x13030040, 35462306a36Sopenharmony_ci 0x5448, 0xffffffff, 0x100, 35562306a36Sopenharmony_ci 0x55e4, 0xffffffff, 0x100, 35662306a36Sopenharmony_ci 0x160c, 0xffffffff, 0x100, 35762306a36Sopenharmony_ci 0x5644, 0xffffffff, 0x100, 35862306a36Sopenharmony_ci 0xc164, 0xffffffff, 0x100, 35962306a36Sopenharmony_ci 0x8a18, 0xffffffff, 0x100, 36062306a36Sopenharmony_ci 0x897c, 0xffffffff, 0x8000100, 36162306a36Sopenharmony_ci 0x8b28, 0xffffffff, 0x3c000100, 36262306a36Sopenharmony_ci 0x9144, 0xffffffff, 0x100, 36362306a36Sopenharmony_ci 0x9a1c, 0xffffffff, 0x10000, 36462306a36Sopenharmony_ci 0x9a50, 0xffffffff, 0x100, 36562306a36Sopenharmony_ci 0x9a1c, 0xffffffff, 0x0, 36662306a36Sopenharmony_ci 0x9870, 0xffffffff, 0x100, 36762306a36Sopenharmony_ci 0x8d58, 0xffffffff, 0x100, 36862306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x0, 36962306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 37062306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x1, 37162306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 37262306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x8000, 37362306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x0, 37462306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 37562306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x1, 37662306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 37762306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x8000, 37862306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x0, 37962306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 38062306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x1, 38162306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 38262306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x80000000, 38362306a36Sopenharmony_ci 0x9030, 0xffffffff, 0x100, 38462306a36Sopenharmony_ci 0x9034, 0xffffffff, 0x100, 38562306a36Sopenharmony_ci 0x9038, 0xffffffff, 0x100, 38662306a36Sopenharmony_ci 0x903c, 0xffffffff, 0x100, 38762306a36Sopenharmony_ci 0x9040, 0xffffffff, 0x100, 38862306a36Sopenharmony_ci 0xa200, 0xffffffff, 0x100, 38962306a36Sopenharmony_ci 0xa204, 0xffffffff, 0x100, 39062306a36Sopenharmony_ci 0xa208, 0xffffffff, 0x100, 39162306a36Sopenharmony_ci 0xa20c, 0xffffffff, 0x100, 39262306a36Sopenharmony_ci 0x971c, 0xffffffff, 0x100, 39362306a36Sopenharmony_ci 0x915c, 0xffffffff, 0x00020001, 39462306a36Sopenharmony_ci 0x9174, 0xffffffff, 0x00000003, 39562306a36Sopenharmony_ci 0x9178, 0xffffffff, 0x00050001, 39662306a36Sopenharmony_ci 0x917c, 0xffffffff, 0x00030002, 39762306a36Sopenharmony_ci 0x918c, 0xffffffff, 0x00000004, 39862306a36Sopenharmony_ci 0x9190, 0xffffffff, 0x00070006, 39962306a36Sopenharmony_ci 0x9194, 0xffffffff, 0x00050001, 40062306a36Sopenharmony_ci 0x9198, 0xffffffff, 0x00030002, 40162306a36Sopenharmony_ci 0x91a8, 0xffffffff, 0x00000004, 40262306a36Sopenharmony_ci 0x91ac, 0xffffffff, 0x00070006, 40362306a36Sopenharmony_ci 0x91e8, 0xffffffff, 0x00000001, 40462306a36Sopenharmony_ci 0x9294, 0xffffffff, 0x00000001, 40562306a36Sopenharmony_ci 0x929c, 0xffffffff, 0x00000002, 40662306a36Sopenharmony_ci 0x92a0, 0xffffffff, 0x00040003, 40762306a36Sopenharmony_ci 0x9150, 0xffffffff, 0x4d940000 40862306a36Sopenharmony_ci}; 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_cistatic const u32 rv730_golden_registers[] = { 41162306a36Sopenharmony_ci 0x3f90, 0x00ff0000, 0x00f00000, 41262306a36Sopenharmony_ci 0x9148, 0x00ff0000, 0x00f00000, 41362306a36Sopenharmony_ci 0x3f94, 0x00ff0000, 0x00f00000, 41462306a36Sopenharmony_ci 0x914c, 0x00ff0000, 0x00f00000, 41562306a36Sopenharmony_ci 0x900c, 0xffffffff, 0x003b033f, 41662306a36Sopenharmony_ci 0xb4c, 0x00000020, 0x00000020, 41762306a36Sopenharmony_ci 0xa180, 0xffffffff, 0x00003f3f 41862306a36Sopenharmony_ci}; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_cistatic const u32 rv730_mgcg_init[] = { 42162306a36Sopenharmony_ci 0x8bcc, 0xffffffff, 0x130300f9, 42262306a36Sopenharmony_ci 0x5448, 0xffffffff, 0x100, 42362306a36Sopenharmony_ci 0x55e4, 0xffffffff, 0x100, 42462306a36Sopenharmony_ci 0x160c, 0xffffffff, 0x100, 42562306a36Sopenharmony_ci 0x5644, 0xffffffff, 0x100, 42662306a36Sopenharmony_ci 0xc164, 0xffffffff, 0x100, 42762306a36Sopenharmony_ci 0x8a18, 0xffffffff, 0x100, 42862306a36Sopenharmony_ci 0x897c, 0xffffffff, 0x8000100, 42962306a36Sopenharmony_ci 0x8b28, 0xffffffff, 0x3c000100, 43062306a36Sopenharmony_ci 0x9144, 0xffffffff, 0x100, 43162306a36Sopenharmony_ci 0x9a1c, 0xffffffff, 0x10000, 43262306a36Sopenharmony_ci 0x9a50, 0xffffffff, 0x100, 43362306a36Sopenharmony_ci 0x9a1c, 0xffffffff, 0x10001, 43462306a36Sopenharmony_ci 0x9a50, 0xffffffff, 0x100, 43562306a36Sopenharmony_ci 0x9a1c, 0xffffffff, 0x0, 43662306a36Sopenharmony_ci 0x9870, 0xffffffff, 0x100, 43762306a36Sopenharmony_ci 0x8d58, 0xffffffff, 0x100, 43862306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x0, 43962306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 44062306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x1, 44162306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 44262306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x2, 44362306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 44462306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x3, 44562306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 44662306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x4, 44762306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 44862306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x5, 44962306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 45062306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x6, 45162306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 45262306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x7, 45362306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 45462306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x8000, 45562306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x0, 45662306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 45762306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x1, 45862306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 45962306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x2, 46062306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 46162306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x3, 46262306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 46362306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x4, 46462306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 46562306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x5, 46662306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 46762306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x6, 46862306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 46962306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x7, 47062306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 47162306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x8000, 47262306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x0, 47362306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 47462306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x1, 47562306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 47662306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x2, 47762306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 47862306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x3, 47962306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 48062306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x4, 48162306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 48262306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x5, 48362306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 48462306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x6, 48562306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 48662306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x7, 48762306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 48862306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x80000000, 48962306a36Sopenharmony_ci 0x9030, 0xffffffff, 0x100, 49062306a36Sopenharmony_ci 0x9034, 0xffffffff, 0x100, 49162306a36Sopenharmony_ci 0x9038, 0xffffffff, 0x100, 49262306a36Sopenharmony_ci 0x903c, 0xffffffff, 0x100, 49362306a36Sopenharmony_ci 0x9040, 0xffffffff, 0x100, 49462306a36Sopenharmony_ci 0xa200, 0xffffffff, 0x100, 49562306a36Sopenharmony_ci 0xa204, 0xffffffff, 0x100, 49662306a36Sopenharmony_ci 0xa208, 0xffffffff, 0x100, 49762306a36Sopenharmony_ci 0xa20c, 0xffffffff, 0x100, 49862306a36Sopenharmony_ci 0x971c, 0xffffffff, 0x100, 49962306a36Sopenharmony_ci 0x915c, 0xffffffff, 0x00020001, 50062306a36Sopenharmony_ci 0x916c, 0xffffffff, 0x00040003, 50162306a36Sopenharmony_ci 0x9170, 0xffffffff, 0x00000005, 50262306a36Sopenharmony_ci 0x9178, 0xffffffff, 0x00050001, 50362306a36Sopenharmony_ci 0x917c, 0xffffffff, 0x00030002, 50462306a36Sopenharmony_ci 0x918c, 0xffffffff, 0x00000004, 50562306a36Sopenharmony_ci 0x9190, 0xffffffff, 0x00070006, 50662306a36Sopenharmony_ci 0x9194, 0xffffffff, 0x00050001, 50762306a36Sopenharmony_ci 0x9198, 0xffffffff, 0x00030002, 50862306a36Sopenharmony_ci 0x91a8, 0xffffffff, 0x00000004, 50962306a36Sopenharmony_ci 0x91ac, 0xffffffff, 0x00070006, 51062306a36Sopenharmony_ci 0x91b0, 0xffffffff, 0x00050001, 51162306a36Sopenharmony_ci 0x91b4, 0xffffffff, 0x00030002, 51262306a36Sopenharmony_ci 0x91c4, 0xffffffff, 0x00000004, 51362306a36Sopenharmony_ci 0x91c8, 0xffffffff, 0x00070006, 51462306a36Sopenharmony_ci 0x91cc, 0xffffffff, 0x00050001, 51562306a36Sopenharmony_ci 0x91d0, 0xffffffff, 0x00030002, 51662306a36Sopenharmony_ci 0x91e0, 0xffffffff, 0x00000004, 51762306a36Sopenharmony_ci 0x91e4, 0xffffffff, 0x00070006, 51862306a36Sopenharmony_ci 0x91e8, 0xffffffff, 0x00000001, 51962306a36Sopenharmony_ci 0x91ec, 0xffffffff, 0x00050001, 52062306a36Sopenharmony_ci 0x91f0, 0xffffffff, 0x00030002, 52162306a36Sopenharmony_ci 0x9200, 0xffffffff, 0x00000004, 52262306a36Sopenharmony_ci 0x9204, 0xffffffff, 0x00070006, 52362306a36Sopenharmony_ci 0x9208, 0xffffffff, 0x00050001, 52462306a36Sopenharmony_ci 0x920c, 0xffffffff, 0x00030002, 52562306a36Sopenharmony_ci 0x921c, 0xffffffff, 0x00000004, 52662306a36Sopenharmony_ci 0x9220, 0xffffffff, 0x00070006, 52762306a36Sopenharmony_ci 0x9224, 0xffffffff, 0x00050001, 52862306a36Sopenharmony_ci 0x9228, 0xffffffff, 0x00030002, 52962306a36Sopenharmony_ci 0x9238, 0xffffffff, 0x00000004, 53062306a36Sopenharmony_ci 0x923c, 0xffffffff, 0x00070006, 53162306a36Sopenharmony_ci 0x9240, 0xffffffff, 0x00050001, 53262306a36Sopenharmony_ci 0x9244, 0xffffffff, 0x00030002, 53362306a36Sopenharmony_ci 0x9254, 0xffffffff, 0x00000004, 53462306a36Sopenharmony_ci 0x9258, 0xffffffff, 0x00070006, 53562306a36Sopenharmony_ci 0x9294, 0xffffffff, 0x00000001, 53662306a36Sopenharmony_ci 0x929c, 0xffffffff, 0x00000002, 53762306a36Sopenharmony_ci 0x92a0, 0xffffffff, 0x00040003, 53862306a36Sopenharmony_ci 0x92a4, 0xffffffff, 0x00000005 53962306a36Sopenharmony_ci}; 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_cistatic const u32 rv740_golden_registers[] = { 54262306a36Sopenharmony_ci 0x88c4, 0xffffffff, 0x00000082, 54362306a36Sopenharmony_ci 0x28a50, 0xfffffffc, 0x00000004, 54462306a36Sopenharmony_ci 0x2650, 0x00040000, 0, 54562306a36Sopenharmony_ci 0x20bc, 0x00040000, 0, 54662306a36Sopenharmony_ci 0x733c, 0xffffffff, 0x00000002, 54762306a36Sopenharmony_ci 0x7300, 0xffffffff, 0x001000f0, 54862306a36Sopenharmony_ci 0x3f90, 0x00ff0000, 0, 54962306a36Sopenharmony_ci 0x9148, 0x00ff0000, 0, 55062306a36Sopenharmony_ci 0x3f94, 0x00ff0000, 0, 55162306a36Sopenharmony_ci 0x914c, 0x00ff0000, 0, 55262306a36Sopenharmony_ci 0x240c, 0xffffffff, 0x00000380, 55362306a36Sopenharmony_ci 0x8a14, 0x00000007, 0x00000007, 55462306a36Sopenharmony_ci 0x8b24, 0xffffffff, 0x00ff0fff, 55562306a36Sopenharmony_ci 0x28a4c, 0xffffffff, 0x00004000, 55662306a36Sopenharmony_ci 0xa180, 0xffffffff, 0x00003f3f, 55762306a36Sopenharmony_ci 0x8d00, 0xffffffff, 0x0e0e003a, 55862306a36Sopenharmony_ci 0x8d04, 0xffffffff, 0x013a0e2a, 55962306a36Sopenharmony_ci 0x8c00, 0xffffffff, 0xe400000f, 56062306a36Sopenharmony_ci 0x8db0, 0xffffffff, 0x98989898, 56162306a36Sopenharmony_ci 0x8db4, 0xffffffff, 0x98989898, 56262306a36Sopenharmony_ci 0x8db8, 0xffffffff, 0x98989898, 56362306a36Sopenharmony_ci 0x8dbc, 0xffffffff, 0x98989898, 56462306a36Sopenharmony_ci 0x8dc0, 0xffffffff, 0x98989898, 56562306a36Sopenharmony_ci 0x8dc4, 0xffffffff, 0x98989898, 56662306a36Sopenharmony_ci 0x8dc8, 0xffffffff, 0x98989898, 56762306a36Sopenharmony_ci 0x8dcc, 0xffffffff, 0x98989898, 56862306a36Sopenharmony_ci 0x9058, 0xffffffff, 0x0fffc40f, 56962306a36Sopenharmony_ci 0x900c, 0xffffffff, 0x003b033f, 57062306a36Sopenharmony_ci 0x28350, 0xffffffff, 0, 57162306a36Sopenharmony_ci 0x8cf0, 0x1fffffff, 0x08e00420, 57262306a36Sopenharmony_ci 0x9508, 0xffffffff, 0x00000002, 57362306a36Sopenharmony_ci 0x88c4, 0xffffffff, 0x000000c2, 57462306a36Sopenharmony_ci 0x9698, 0x18000000, 0x18000000 57562306a36Sopenharmony_ci}; 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_cistatic const u32 rv740_mgcg_init[] = { 57862306a36Sopenharmony_ci 0x8bcc, 0xffffffff, 0x13030100, 57962306a36Sopenharmony_ci 0x5448, 0xffffffff, 0x100, 58062306a36Sopenharmony_ci 0x55e4, 0xffffffff, 0x100, 58162306a36Sopenharmony_ci 0x160c, 0xffffffff, 0x100, 58262306a36Sopenharmony_ci 0x5644, 0xffffffff, 0x100, 58362306a36Sopenharmony_ci 0xc164, 0xffffffff, 0x100, 58462306a36Sopenharmony_ci 0x8a18, 0xffffffff, 0x100, 58562306a36Sopenharmony_ci 0x897c, 0xffffffff, 0x100, 58662306a36Sopenharmony_ci 0x8b28, 0xffffffff, 0x100, 58762306a36Sopenharmony_ci 0x9144, 0xffffffff, 0x100, 58862306a36Sopenharmony_ci 0x9a1c, 0xffffffff, 0x10000, 58962306a36Sopenharmony_ci 0x9a50, 0xffffffff, 0x100, 59062306a36Sopenharmony_ci 0x9a1c, 0xffffffff, 0x10001, 59162306a36Sopenharmony_ci 0x9a50, 0xffffffff, 0x100, 59262306a36Sopenharmony_ci 0x9a1c, 0xffffffff, 0x10002, 59362306a36Sopenharmony_ci 0x9a50, 0xffffffff, 0x100, 59462306a36Sopenharmony_ci 0x9a1c, 0xffffffff, 0x10003, 59562306a36Sopenharmony_ci 0x9a50, 0xffffffff, 0x100, 59662306a36Sopenharmony_ci 0x9a1c, 0xffffffff, 0x0, 59762306a36Sopenharmony_ci 0x9870, 0xffffffff, 0x100, 59862306a36Sopenharmony_ci 0x8d58, 0xffffffff, 0x100, 59962306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x0, 60062306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 60162306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x1, 60262306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 60362306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x2, 60462306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 60562306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x3, 60662306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 60762306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x4, 60862306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 60962306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x5, 61062306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 61162306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x6, 61262306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 61362306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x7, 61462306a36Sopenharmony_ci 0x9510, 0xffffffff, 0x100, 61562306a36Sopenharmony_ci 0x9500, 0xffffffff, 0x8000, 61662306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x0, 61762306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 61862306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x1, 61962306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 62062306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x2, 62162306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 62262306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x3, 62362306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 62462306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x4, 62562306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 62662306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x5, 62762306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 62862306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x6, 62962306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 63062306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x7, 63162306a36Sopenharmony_ci 0x949c, 0xffffffff, 0x100, 63262306a36Sopenharmony_ci 0x9490, 0xffffffff, 0x8000, 63362306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x0, 63462306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 63562306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x1, 63662306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 63762306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x2, 63862306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 63962306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x3, 64062306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 64162306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x4, 64262306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 64362306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x5, 64462306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 64562306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x6, 64662306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 64762306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x7, 64862306a36Sopenharmony_ci 0x9654, 0xffffffff, 0x100, 64962306a36Sopenharmony_ci 0x9604, 0xffffffff, 0x80000000, 65062306a36Sopenharmony_ci 0x9030, 0xffffffff, 0x100, 65162306a36Sopenharmony_ci 0x9034, 0xffffffff, 0x100, 65262306a36Sopenharmony_ci 0x9038, 0xffffffff, 0x100, 65362306a36Sopenharmony_ci 0x903c, 0xffffffff, 0x100, 65462306a36Sopenharmony_ci 0x9040, 0xffffffff, 0x100, 65562306a36Sopenharmony_ci 0xa200, 0xffffffff, 0x100, 65662306a36Sopenharmony_ci 0xa204, 0xffffffff, 0x100, 65762306a36Sopenharmony_ci 0xa208, 0xffffffff, 0x100, 65862306a36Sopenharmony_ci 0xa20c, 0xffffffff, 0x100, 65962306a36Sopenharmony_ci 0x971c, 0xffffffff, 0x100, 66062306a36Sopenharmony_ci 0x915c, 0xffffffff, 0x00020001, 66162306a36Sopenharmony_ci 0x9160, 0xffffffff, 0x00040003, 66262306a36Sopenharmony_ci 0x916c, 0xffffffff, 0x00060005, 66362306a36Sopenharmony_ci 0x9170, 0xffffffff, 0x00080007, 66462306a36Sopenharmony_ci 0x9174, 0xffffffff, 0x000a0009, 66562306a36Sopenharmony_ci 0x9178, 0xffffffff, 0x000c000b, 66662306a36Sopenharmony_ci 0x917c, 0xffffffff, 0x000e000d, 66762306a36Sopenharmony_ci 0x9180, 0xffffffff, 0x0010000f, 66862306a36Sopenharmony_ci 0x918c, 0xffffffff, 0x00120011, 66962306a36Sopenharmony_ci 0x9190, 0xffffffff, 0x00140013, 67062306a36Sopenharmony_ci 0x9194, 0xffffffff, 0x00020001, 67162306a36Sopenharmony_ci 0x9198, 0xffffffff, 0x00040003, 67262306a36Sopenharmony_ci 0x919c, 0xffffffff, 0x00060005, 67362306a36Sopenharmony_ci 0x91a8, 0xffffffff, 0x00080007, 67462306a36Sopenharmony_ci 0x91ac, 0xffffffff, 0x000a0009, 67562306a36Sopenharmony_ci 0x91b0, 0xffffffff, 0x000c000b, 67662306a36Sopenharmony_ci 0x91b4, 0xffffffff, 0x000e000d, 67762306a36Sopenharmony_ci 0x91b8, 0xffffffff, 0x0010000f, 67862306a36Sopenharmony_ci 0x91c4, 0xffffffff, 0x00120011, 67962306a36Sopenharmony_ci 0x91c8, 0xffffffff, 0x00140013, 68062306a36Sopenharmony_ci 0x91cc, 0xffffffff, 0x00020001, 68162306a36Sopenharmony_ci 0x91d0, 0xffffffff, 0x00040003, 68262306a36Sopenharmony_ci 0x91d4, 0xffffffff, 0x00060005, 68362306a36Sopenharmony_ci 0x91e0, 0xffffffff, 0x00080007, 68462306a36Sopenharmony_ci 0x91e4, 0xffffffff, 0x000a0009, 68562306a36Sopenharmony_ci 0x91e8, 0xffffffff, 0x000c000b, 68662306a36Sopenharmony_ci 0x91ec, 0xffffffff, 0x00020001, 68762306a36Sopenharmony_ci 0x91f0, 0xffffffff, 0x00040003, 68862306a36Sopenharmony_ci 0x91f4, 0xffffffff, 0x00060005, 68962306a36Sopenharmony_ci 0x9200, 0xffffffff, 0x00080007, 69062306a36Sopenharmony_ci 0x9204, 0xffffffff, 0x000a0009, 69162306a36Sopenharmony_ci 0x9208, 0xffffffff, 0x000c000b, 69262306a36Sopenharmony_ci 0x920c, 0xffffffff, 0x000e000d, 69362306a36Sopenharmony_ci 0x9210, 0xffffffff, 0x0010000f, 69462306a36Sopenharmony_ci 0x921c, 0xffffffff, 0x00120011, 69562306a36Sopenharmony_ci 0x9220, 0xffffffff, 0x00140013, 69662306a36Sopenharmony_ci 0x9224, 0xffffffff, 0x00020001, 69762306a36Sopenharmony_ci 0x9228, 0xffffffff, 0x00040003, 69862306a36Sopenharmony_ci 0x922c, 0xffffffff, 0x00060005, 69962306a36Sopenharmony_ci 0x9238, 0xffffffff, 0x00080007, 70062306a36Sopenharmony_ci 0x923c, 0xffffffff, 0x000a0009, 70162306a36Sopenharmony_ci 0x9240, 0xffffffff, 0x000c000b, 70262306a36Sopenharmony_ci 0x9244, 0xffffffff, 0x000e000d, 70362306a36Sopenharmony_ci 0x9248, 0xffffffff, 0x0010000f, 70462306a36Sopenharmony_ci 0x9254, 0xffffffff, 0x00120011, 70562306a36Sopenharmony_ci 0x9258, 0xffffffff, 0x00140013, 70662306a36Sopenharmony_ci 0x9294, 0xffffffff, 0x00020001, 70762306a36Sopenharmony_ci 0x929c, 0xffffffff, 0x00040003, 70862306a36Sopenharmony_ci 0x92a0, 0xffffffff, 0x00060005, 70962306a36Sopenharmony_ci 0x92a4, 0xffffffff, 0x00080007 71062306a36Sopenharmony_ci}; 71162306a36Sopenharmony_ci 71262306a36Sopenharmony_cistatic void rv770_init_golden_registers(struct radeon_device *rdev) 71362306a36Sopenharmony_ci{ 71462306a36Sopenharmony_ci switch (rdev->family) { 71562306a36Sopenharmony_ci case CHIP_RV770: 71662306a36Sopenharmony_ci radeon_program_register_sequence(rdev, 71762306a36Sopenharmony_ci r7xx_golden_registers, 71862306a36Sopenharmony_ci (const u32)ARRAY_SIZE(r7xx_golden_registers)); 71962306a36Sopenharmony_ci radeon_program_register_sequence(rdev, 72062306a36Sopenharmony_ci r7xx_golden_dyn_gpr_registers, 72162306a36Sopenharmony_ci (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers)); 72262306a36Sopenharmony_ci if (rdev->pdev->device == 0x994e) 72362306a36Sopenharmony_ci radeon_program_register_sequence(rdev, 72462306a36Sopenharmony_ci rv770ce_golden_registers, 72562306a36Sopenharmony_ci (const u32)ARRAY_SIZE(rv770ce_golden_registers)); 72662306a36Sopenharmony_ci else 72762306a36Sopenharmony_ci radeon_program_register_sequence(rdev, 72862306a36Sopenharmony_ci rv770_golden_registers, 72962306a36Sopenharmony_ci (const u32)ARRAY_SIZE(rv770_golden_registers)); 73062306a36Sopenharmony_ci radeon_program_register_sequence(rdev, 73162306a36Sopenharmony_ci rv770_mgcg_init, 73262306a36Sopenharmony_ci (const u32)ARRAY_SIZE(rv770_mgcg_init)); 73362306a36Sopenharmony_ci break; 73462306a36Sopenharmony_ci case CHIP_RV730: 73562306a36Sopenharmony_ci radeon_program_register_sequence(rdev, 73662306a36Sopenharmony_ci r7xx_golden_registers, 73762306a36Sopenharmony_ci (const u32)ARRAY_SIZE(r7xx_golden_registers)); 73862306a36Sopenharmony_ci radeon_program_register_sequence(rdev, 73962306a36Sopenharmony_ci r7xx_golden_dyn_gpr_registers, 74062306a36Sopenharmony_ci (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers)); 74162306a36Sopenharmony_ci radeon_program_register_sequence(rdev, 74262306a36Sopenharmony_ci rv730_golden_registers, 74362306a36Sopenharmony_ci (const u32)ARRAY_SIZE(rv730_golden_registers)); 74462306a36Sopenharmony_ci radeon_program_register_sequence(rdev, 74562306a36Sopenharmony_ci rv730_mgcg_init, 74662306a36Sopenharmony_ci (const u32)ARRAY_SIZE(rv730_mgcg_init)); 74762306a36Sopenharmony_ci break; 74862306a36Sopenharmony_ci case CHIP_RV710: 74962306a36Sopenharmony_ci radeon_program_register_sequence(rdev, 75062306a36Sopenharmony_ci r7xx_golden_registers, 75162306a36Sopenharmony_ci (const u32)ARRAY_SIZE(r7xx_golden_registers)); 75262306a36Sopenharmony_ci radeon_program_register_sequence(rdev, 75362306a36Sopenharmony_ci r7xx_golden_dyn_gpr_registers, 75462306a36Sopenharmony_ci (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers)); 75562306a36Sopenharmony_ci radeon_program_register_sequence(rdev, 75662306a36Sopenharmony_ci rv710_golden_registers, 75762306a36Sopenharmony_ci (const u32)ARRAY_SIZE(rv710_golden_registers)); 75862306a36Sopenharmony_ci radeon_program_register_sequence(rdev, 75962306a36Sopenharmony_ci rv710_mgcg_init, 76062306a36Sopenharmony_ci (const u32)ARRAY_SIZE(rv710_mgcg_init)); 76162306a36Sopenharmony_ci break; 76262306a36Sopenharmony_ci case CHIP_RV740: 76362306a36Sopenharmony_ci radeon_program_register_sequence(rdev, 76462306a36Sopenharmony_ci rv740_golden_registers, 76562306a36Sopenharmony_ci (const u32)ARRAY_SIZE(rv740_golden_registers)); 76662306a36Sopenharmony_ci radeon_program_register_sequence(rdev, 76762306a36Sopenharmony_ci rv740_mgcg_init, 76862306a36Sopenharmony_ci (const u32)ARRAY_SIZE(rv740_mgcg_init)); 76962306a36Sopenharmony_ci break; 77062306a36Sopenharmony_ci default: 77162306a36Sopenharmony_ci break; 77262306a36Sopenharmony_ci } 77362306a36Sopenharmony_ci} 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_ci#define PCIE_BUS_CLK 10000 77662306a36Sopenharmony_ci#define TCLK (PCIE_BUS_CLK / 10) 77762306a36Sopenharmony_ci 77862306a36Sopenharmony_ci/** 77962306a36Sopenharmony_ci * rv770_get_xclk - get the xclk 78062306a36Sopenharmony_ci * 78162306a36Sopenharmony_ci * @rdev: radeon_device pointer 78262306a36Sopenharmony_ci * 78362306a36Sopenharmony_ci * Returns the reference clock used by the gfx engine 78462306a36Sopenharmony_ci * (r7xx-cayman). 78562306a36Sopenharmony_ci */ 78662306a36Sopenharmony_ciu32 rv770_get_xclk(struct radeon_device *rdev) 78762306a36Sopenharmony_ci{ 78862306a36Sopenharmony_ci u32 reference_clock = rdev->clock.spll.reference_freq; 78962306a36Sopenharmony_ci u32 tmp = RREG32(CG_CLKPIN_CNTL); 79062306a36Sopenharmony_ci 79162306a36Sopenharmony_ci if (tmp & MUX_TCLK_TO_XCLK) 79262306a36Sopenharmony_ci return TCLK; 79362306a36Sopenharmony_ci 79462306a36Sopenharmony_ci if (tmp & XTALIN_DIVIDE) 79562306a36Sopenharmony_ci return reference_clock / 4; 79662306a36Sopenharmony_ci 79762306a36Sopenharmony_ci return reference_clock; 79862306a36Sopenharmony_ci} 79962306a36Sopenharmony_ci 80062306a36Sopenharmony_civoid rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, bool async) 80162306a36Sopenharmony_ci{ 80262306a36Sopenharmony_ci struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; 80362306a36Sopenharmony_ci struct drm_framebuffer *fb = radeon_crtc->base.primary->fb; 80462306a36Sopenharmony_ci u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset); 80562306a36Sopenharmony_ci int i; 80662306a36Sopenharmony_ci 80762306a36Sopenharmony_ci /* Lock the graphics update lock */ 80862306a36Sopenharmony_ci tmp |= AVIVO_D1GRPH_UPDATE_LOCK; 80962306a36Sopenharmony_ci WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp); 81062306a36Sopenharmony_ci 81162306a36Sopenharmony_ci /* flip at hsync for async, default is vsync */ 81262306a36Sopenharmony_ci WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, 81362306a36Sopenharmony_ci async ? AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0); 81462306a36Sopenharmony_ci /* update pitch */ 81562306a36Sopenharmony_ci WREG32(AVIVO_D1GRPH_PITCH + radeon_crtc->crtc_offset, 81662306a36Sopenharmony_ci fb->pitches[0] / fb->format->cpp[0]); 81762306a36Sopenharmony_ci /* update the scanout addresses */ 81862306a36Sopenharmony_ci if (radeon_crtc->crtc_id) { 81962306a36Sopenharmony_ci WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base)); 82062306a36Sopenharmony_ci WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base)); 82162306a36Sopenharmony_ci } else { 82262306a36Sopenharmony_ci WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base)); 82362306a36Sopenharmony_ci WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base)); 82462306a36Sopenharmony_ci } 82562306a36Sopenharmony_ci WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, 82662306a36Sopenharmony_ci (u32)crtc_base); 82762306a36Sopenharmony_ci WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, 82862306a36Sopenharmony_ci (u32)crtc_base); 82962306a36Sopenharmony_ci 83062306a36Sopenharmony_ci /* Wait for update_pending to go high. */ 83162306a36Sopenharmony_ci for (i = 0; i < rdev->usec_timeout; i++) { 83262306a36Sopenharmony_ci if (RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING) 83362306a36Sopenharmony_ci break; 83462306a36Sopenharmony_ci udelay(1); 83562306a36Sopenharmony_ci } 83662306a36Sopenharmony_ci DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n"); 83762306a36Sopenharmony_ci 83862306a36Sopenharmony_ci /* Unlock the lock, so double-buffering can take place inside vblank */ 83962306a36Sopenharmony_ci tmp &= ~AVIVO_D1GRPH_UPDATE_LOCK; 84062306a36Sopenharmony_ci WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp); 84162306a36Sopenharmony_ci} 84262306a36Sopenharmony_ci 84362306a36Sopenharmony_cibool rv770_page_flip_pending(struct radeon_device *rdev, int crtc_id) 84462306a36Sopenharmony_ci{ 84562306a36Sopenharmony_ci struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; 84662306a36Sopenharmony_ci 84762306a36Sopenharmony_ci /* Return current update_pending status: */ 84862306a36Sopenharmony_ci return !!(RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & 84962306a36Sopenharmony_ci AVIVO_D1GRPH_SURFACE_UPDATE_PENDING); 85062306a36Sopenharmony_ci} 85162306a36Sopenharmony_ci 85262306a36Sopenharmony_ci/* get temperature in millidegrees */ 85362306a36Sopenharmony_ciint rv770_get_temp(struct radeon_device *rdev) 85462306a36Sopenharmony_ci{ 85562306a36Sopenharmony_ci u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >> 85662306a36Sopenharmony_ci ASIC_T_SHIFT; 85762306a36Sopenharmony_ci int actual_temp; 85862306a36Sopenharmony_ci 85962306a36Sopenharmony_ci if (temp & 0x400) 86062306a36Sopenharmony_ci actual_temp = -256; 86162306a36Sopenharmony_ci else if (temp & 0x200) 86262306a36Sopenharmony_ci actual_temp = 255; 86362306a36Sopenharmony_ci else if (temp & 0x100) { 86462306a36Sopenharmony_ci actual_temp = temp & 0x1ff; 86562306a36Sopenharmony_ci actual_temp |= ~0x1ff; 86662306a36Sopenharmony_ci } else 86762306a36Sopenharmony_ci actual_temp = temp & 0xff; 86862306a36Sopenharmony_ci 86962306a36Sopenharmony_ci return (actual_temp * 1000) / 2; 87062306a36Sopenharmony_ci} 87162306a36Sopenharmony_ci 87262306a36Sopenharmony_civoid rv770_pm_misc(struct radeon_device *rdev) 87362306a36Sopenharmony_ci{ 87462306a36Sopenharmony_ci int req_ps_idx = rdev->pm.requested_power_state_index; 87562306a36Sopenharmony_ci int req_cm_idx = rdev->pm.requested_clock_mode_index; 87662306a36Sopenharmony_ci struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx]; 87762306a36Sopenharmony_ci struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; 87862306a36Sopenharmony_ci 87962306a36Sopenharmony_ci if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { 88062306a36Sopenharmony_ci /* 0xff01 is a flag rather then an actual voltage */ 88162306a36Sopenharmony_ci if (voltage->voltage == 0xff01) 88262306a36Sopenharmony_ci return; 88362306a36Sopenharmony_ci if (voltage->voltage != rdev->pm.current_vddc) { 88462306a36Sopenharmony_ci radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC); 88562306a36Sopenharmony_ci rdev->pm.current_vddc = voltage->voltage; 88662306a36Sopenharmony_ci DRM_DEBUG("Setting: v: %d\n", voltage->voltage); 88762306a36Sopenharmony_ci } 88862306a36Sopenharmony_ci } 88962306a36Sopenharmony_ci} 89062306a36Sopenharmony_ci 89162306a36Sopenharmony_ci/* 89262306a36Sopenharmony_ci * GART 89362306a36Sopenharmony_ci */ 89462306a36Sopenharmony_cistatic int rv770_pcie_gart_enable(struct radeon_device *rdev) 89562306a36Sopenharmony_ci{ 89662306a36Sopenharmony_ci u32 tmp; 89762306a36Sopenharmony_ci int r, i; 89862306a36Sopenharmony_ci 89962306a36Sopenharmony_ci if (rdev->gart.robj == NULL) { 90062306a36Sopenharmony_ci dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); 90162306a36Sopenharmony_ci return -EINVAL; 90262306a36Sopenharmony_ci } 90362306a36Sopenharmony_ci r = radeon_gart_table_vram_pin(rdev); 90462306a36Sopenharmony_ci if (r) 90562306a36Sopenharmony_ci return r; 90662306a36Sopenharmony_ci /* Setup L2 cache */ 90762306a36Sopenharmony_ci WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | 90862306a36Sopenharmony_ci ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | 90962306a36Sopenharmony_ci EFFECTIVE_L2_QUEUE_SIZE(7)); 91062306a36Sopenharmony_ci WREG32(VM_L2_CNTL2, 0); 91162306a36Sopenharmony_ci WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2)); 91262306a36Sopenharmony_ci /* Setup TLB control */ 91362306a36Sopenharmony_ci tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING | 91462306a36Sopenharmony_ci SYSTEM_ACCESS_MODE_NOT_IN_SYS | 91562306a36Sopenharmony_ci SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU | 91662306a36Sopenharmony_ci EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); 91762306a36Sopenharmony_ci WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); 91862306a36Sopenharmony_ci WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); 91962306a36Sopenharmony_ci WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); 92062306a36Sopenharmony_ci if (rdev->family == CHIP_RV740) 92162306a36Sopenharmony_ci WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp); 92262306a36Sopenharmony_ci WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); 92362306a36Sopenharmony_ci WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); 92462306a36Sopenharmony_ci WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); 92562306a36Sopenharmony_ci WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); 92662306a36Sopenharmony_ci WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); 92762306a36Sopenharmony_ci WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12); 92862306a36Sopenharmony_ci WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); 92962306a36Sopenharmony_ci WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | 93062306a36Sopenharmony_ci RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); 93162306a36Sopenharmony_ci WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR, 93262306a36Sopenharmony_ci (u32)(rdev->dummy_page.addr >> 12)); 93362306a36Sopenharmony_ci for (i = 1; i < 7; i++) 93462306a36Sopenharmony_ci WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); 93562306a36Sopenharmony_ci 93662306a36Sopenharmony_ci r600_pcie_gart_tlb_flush(rdev); 93762306a36Sopenharmony_ci DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 93862306a36Sopenharmony_ci (unsigned)(rdev->mc.gtt_size >> 20), 93962306a36Sopenharmony_ci (unsigned long long)rdev->gart.table_addr); 94062306a36Sopenharmony_ci rdev->gart.ready = true; 94162306a36Sopenharmony_ci return 0; 94262306a36Sopenharmony_ci} 94362306a36Sopenharmony_ci 94462306a36Sopenharmony_cistatic void rv770_pcie_gart_disable(struct radeon_device *rdev) 94562306a36Sopenharmony_ci{ 94662306a36Sopenharmony_ci u32 tmp; 94762306a36Sopenharmony_ci int i; 94862306a36Sopenharmony_ci 94962306a36Sopenharmony_ci /* Disable all tables */ 95062306a36Sopenharmony_ci for (i = 0; i < 7; i++) 95162306a36Sopenharmony_ci WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); 95262306a36Sopenharmony_ci 95362306a36Sopenharmony_ci /* Setup L2 cache */ 95462306a36Sopenharmony_ci WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING | 95562306a36Sopenharmony_ci EFFECTIVE_L2_QUEUE_SIZE(7)); 95662306a36Sopenharmony_ci WREG32(VM_L2_CNTL2, 0); 95762306a36Sopenharmony_ci WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2)); 95862306a36Sopenharmony_ci /* Setup TLB control */ 95962306a36Sopenharmony_ci tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); 96062306a36Sopenharmony_ci WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); 96162306a36Sopenharmony_ci WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); 96262306a36Sopenharmony_ci WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); 96362306a36Sopenharmony_ci WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); 96462306a36Sopenharmony_ci WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); 96562306a36Sopenharmony_ci WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); 96662306a36Sopenharmony_ci WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); 96762306a36Sopenharmony_ci radeon_gart_table_vram_unpin(rdev); 96862306a36Sopenharmony_ci} 96962306a36Sopenharmony_ci 97062306a36Sopenharmony_cistatic void rv770_pcie_gart_fini(struct radeon_device *rdev) 97162306a36Sopenharmony_ci{ 97262306a36Sopenharmony_ci radeon_gart_fini(rdev); 97362306a36Sopenharmony_ci rv770_pcie_gart_disable(rdev); 97462306a36Sopenharmony_ci radeon_gart_table_vram_free(rdev); 97562306a36Sopenharmony_ci} 97662306a36Sopenharmony_ci 97762306a36Sopenharmony_ci 97862306a36Sopenharmony_cistatic void rv770_agp_enable(struct radeon_device *rdev) 97962306a36Sopenharmony_ci{ 98062306a36Sopenharmony_ci u32 tmp; 98162306a36Sopenharmony_ci int i; 98262306a36Sopenharmony_ci 98362306a36Sopenharmony_ci /* Setup L2 cache */ 98462306a36Sopenharmony_ci WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | 98562306a36Sopenharmony_ci ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | 98662306a36Sopenharmony_ci EFFECTIVE_L2_QUEUE_SIZE(7)); 98762306a36Sopenharmony_ci WREG32(VM_L2_CNTL2, 0); 98862306a36Sopenharmony_ci WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2)); 98962306a36Sopenharmony_ci /* Setup TLB control */ 99062306a36Sopenharmony_ci tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING | 99162306a36Sopenharmony_ci SYSTEM_ACCESS_MODE_NOT_IN_SYS | 99262306a36Sopenharmony_ci SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU | 99362306a36Sopenharmony_ci EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); 99462306a36Sopenharmony_ci WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); 99562306a36Sopenharmony_ci WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); 99662306a36Sopenharmony_ci WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); 99762306a36Sopenharmony_ci WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); 99862306a36Sopenharmony_ci WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); 99962306a36Sopenharmony_ci WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); 100062306a36Sopenharmony_ci WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); 100162306a36Sopenharmony_ci for (i = 0; i < 7; i++) 100262306a36Sopenharmony_ci WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); 100362306a36Sopenharmony_ci} 100462306a36Sopenharmony_ci 100562306a36Sopenharmony_cistatic void rv770_mc_program(struct radeon_device *rdev) 100662306a36Sopenharmony_ci{ 100762306a36Sopenharmony_ci struct rv515_mc_save save; 100862306a36Sopenharmony_ci u32 tmp; 100962306a36Sopenharmony_ci int i, j; 101062306a36Sopenharmony_ci 101162306a36Sopenharmony_ci /* Initialize HDP */ 101262306a36Sopenharmony_ci for (i = 0, j = 0; i < 32; i++, j += 0x18) { 101362306a36Sopenharmony_ci WREG32((0x2c14 + j), 0x00000000); 101462306a36Sopenharmony_ci WREG32((0x2c18 + j), 0x00000000); 101562306a36Sopenharmony_ci WREG32((0x2c1c + j), 0x00000000); 101662306a36Sopenharmony_ci WREG32((0x2c20 + j), 0x00000000); 101762306a36Sopenharmony_ci WREG32((0x2c24 + j), 0x00000000); 101862306a36Sopenharmony_ci } 101962306a36Sopenharmony_ci /* r7xx hw bug. Read from HDP_DEBUG1 rather 102062306a36Sopenharmony_ci * than writing to HDP_REG_COHERENCY_FLUSH_CNTL 102162306a36Sopenharmony_ci */ 102262306a36Sopenharmony_ci tmp = RREG32(HDP_DEBUG1); 102362306a36Sopenharmony_ci 102462306a36Sopenharmony_ci rv515_mc_stop(rdev, &save); 102562306a36Sopenharmony_ci if (r600_mc_wait_for_idle(rdev)) { 102662306a36Sopenharmony_ci dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 102762306a36Sopenharmony_ci } 102862306a36Sopenharmony_ci /* Lockout access through VGA aperture*/ 102962306a36Sopenharmony_ci WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); 103062306a36Sopenharmony_ci /* Update configuration */ 103162306a36Sopenharmony_ci if (rdev->flags & RADEON_IS_AGP) { 103262306a36Sopenharmony_ci if (rdev->mc.vram_start < rdev->mc.gtt_start) { 103362306a36Sopenharmony_ci /* VRAM before AGP */ 103462306a36Sopenharmony_ci WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, 103562306a36Sopenharmony_ci rdev->mc.vram_start >> 12); 103662306a36Sopenharmony_ci WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, 103762306a36Sopenharmony_ci rdev->mc.gtt_end >> 12); 103862306a36Sopenharmony_ci } else { 103962306a36Sopenharmony_ci /* VRAM after AGP */ 104062306a36Sopenharmony_ci WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, 104162306a36Sopenharmony_ci rdev->mc.gtt_start >> 12); 104262306a36Sopenharmony_ci WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, 104362306a36Sopenharmony_ci rdev->mc.vram_end >> 12); 104462306a36Sopenharmony_ci } 104562306a36Sopenharmony_ci } else { 104662306a36Sopenharmony_ci WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, 104762306a36Sopenharmony_ci rdev->mc.vram_start >> 12); 104862306a36Sopenharmony_ci WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, 104962306a36Sopenharmony_ci rdev->mc.vram_end >> 12); 105062306a36Sopenharmony_ci } 105162306a36Sopenharmony_ci WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12); 105262306a36Sopenharmony_ci tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; 105362306a36Sopenharmony_ci tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); 105462306a36Sopenharmony_ci WREG32(MC_VM_FB_LOCATION, tmp); 105562306a36Sopenharmony_ci WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); 105662306a36Sopenharmony_ci WREG32(HDP_NONSURFACE_INFO, (2 << 7)); 105762306a36Sopenharmony_ci WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF); 105862306a36Sopenharmony_ci if (rdev->flags & RADEON_IS_AGP) { 105962306a36Sopenharmony_ci WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); 106062306a36Sopenharmony_ci WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); 106162306a36Sopenharmony_ci WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); 106262306a36Sopenharmony_ci } else { 106362306a36Sopenharmony_ci WREG32(MC_VM_AGP_BASE, 0); 106462306a36Sopenharmony_ci WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); 106562306a36Sopenharmony_ci WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); 106662306a36Sopenharmony_ci } 106762306a36Sopenharmony_ci if (r600_mc_wait_for_idle(rdev)) { 106862306a36Sopenharmony_ci dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); 106962306a36Sopenharmony_ci } 107062306a36Sopenharmony_ci rv515_mc_resume(rdev, &save); 107162306a36Sopenharmony_ci /* we need to own VRAM, so turn off the VGA renderer here 107262306a36Sopenharmony_ci * to stop it overwriting our objects */ 107362306a36Sopenharmony_ci rv515_vga_render_disable(rdev); 107462306a36Sopenharmony_ci} 107562306a36Sopenharmony_ci 107662306a36Sopenharmony_ci 107762306a36Sopenharmony_ci/* 107862306a36Sopenharmony_ci * CP. 107962306a36Sopenharmony_ci */ 108062306a36Sopenharmony_civoid r700_cp_stop(struct radeon_device *rdev) 108162306a36Sopenharmony_ci{ 108262306a36Sopenharmony_ci if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX) 108362306a36Sopenharmony_ci radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); 108462306a36Sopenharmony_ci WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT)); 108562306a36Sopenharmony_ci WREG32(SCRATCH_UMSK, 0); 108662306a36Sopenharmony_ci rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 108762306a36Sopenharmony_ci} 108862306a36Sopenharmony_ci 108962306a36Sopenharmony_cistatic int rv770_cp_load_microcode(struct radeon_device *rdev) 109062306a36Sopenharmony_ci{ 109162306a36Sopenharmony_ci const __be32 *fw_data; 109262306a36Sopenharmony_ci int i; 109362306a36Sopenharmony_ci 109462306a36Sopenharmony_ci if (!rdev->me_fw || !rdev->pfp_fw) 109562306a36Sopenharmony_ci return -EINVAL; 109662306a36Sopenharmony_ci 109762306a36Sopenharmony_ci r700_cp_stop(rdev); 109862306a36Sopenharmony_ci WREG32(CP_RB_CNTL, 109962306a36Sopenharmony_ci#ifdef __BIG_ENDIAN 110062306a36Sopenharmony_ci BUF_SWAP_32BIT | 110162306a36Sopenharmony_ci#endif 110262306a36Sopenharmony_ci RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3)); 110362306a36Sopenharmony_ci 110462306a36Sopenharmony_ci /* Reset cp */ 110562306a36Sopenharmony_ci WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP); 110662306a36Sopenharmony_ci RREG32(GRBM_SOFT_RESET); 110762306a36Sopenharmony_ci mdelay(15); 110862306a36Sopenharmony_ci WREG32(GRBM_SOFT_RESET, 0); 110962306a36Sopenharmony_ci 111062306a36Sopenharmony_ci fw_data = (const __be32 *)rdev->pfp_fw->data; 111162306a36Sopenharmony_ci WREG32(CP_PFP_UCODE_ADDR, 0); 111262306a36Sopenharmony_ci for (i = 0; i < R700_PFP_UCODE_SIZE; i++) 111362306a36Sopenharmony_ci WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++)); 111462306a36Sopenharmony_ci WREG32(CP_PFP_UCODE_ADDR, 0); 111562306a36Sopenharmony_ci 111662306a36Sopenharmony_ci fw_data = (const __be32 *)rdev->me_fw->data; 111762306a36Sopenharmony_ci WREG32(CP_ME_RAM_WADDR, 0); 111862306a36Sopenharmony_ci for (i = 0; i < R700_PM4_UCODE_SIZE; i++) 111962306a36Sopenharmony_ci WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++)); 112062306a36Sopenharmony_ci 112162306a36Sopenharmony_ci WREG32(CP_PFP_UCODE_ADDR, 0); 112262306a36Sopenharmony_ci WREG32(CP_ME_RAM_WADDR, 0); 112362306a36Sopenharmony_ci WREG32(CP_ME_RAM_RADDR, 0); 112462306a36Sopenharmony_ci return 0; 112562306a36Sopenharmony_ci} 112662306a36Sopenharmony_ci 112762306a36Sopenharmony_civoid r700_cp_fini(struct radeon_device *rdev) 112862306a36Sopenharmony_ci{ 112962306a36Sopenharmony_ci struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 113062306a36Sopenharmony_ci r700_cp_stop(rdev); 113162306a36Sopenharmony_ci radeon_ring_fini(rdev, ring); 113262306a36Sopenharmony_ci radeon_scratch_free(rdev, ring->rptr_save_reg); 113362306a36Sopenharmony_ci} 113462306a36Sopenharmony_ci 113562306a36Sopenharmony_civoid rv770_set_clk_bypass_mode(struct radeon_device *rdev) 113662306a36Sopenharmony_ci{ 113762306a36Sopenharmony_ci u32 tmp, i; 113862306a36Sopenharmony_ci 113962306a36Sopenharmony_ci if (rdev->flags & RADEON_IS_IGP) 114062306a36Sopenharmony_ci return; 114162306a36Sopenharmony_ci 114262306a36Sopenharmony_ci tmp = RREG32(CG_SPLL_FUNC_CNTL_2); 114362306a36Sopenharmony_ci tmp &= SCLK_MUX_SEL_MASK; 114462306a36Sopenharmony_ci tmp |= SCLK_MUX_SEL(1) | SCLK_MUX_UPDATE; 114562306a36Sopenharmony_ci WREG32(CG_SPLL_FUNC_CNTL_2, tmp); 114662306a36Sopenharmony_ci 114762306a36Sopenharmony_ci for (i = 0; i < rdev->usec_timeout; i++) { 114862306a36Sopenharmony_ci if (RREG32(CG_SPLL_STATUS) & SPLL_CHG_STATUS) 114962306a36Sopenharmony_ci break; 115062306a36Sopenharmony_ci udelay(1); 115162306a36Sopenharmony_ci } 115262306a36Sopenharmony_ci 115362306a36Sopenharmony_ci tmp &= ~SCLK_MUX_UPDATE; 115462306a36Sopenharmony_ci WREG32(CG_SPLL_FUNC_CNTL_2, tmp); 115562306a36Sopenharmony_ci 115662306a36Sopenharmony_ci tmp = RREG32(MPLL_CNTL_MODE); 115762306a36Sopenharmony_ci if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730)) 115862306a36Sopenharmony_ci tmp &= ~RV730_MPLL_MCLK_SEL; 115962306a36Sopenharmony_ci else 116062306a36Sopenharmony_ci tmp &= ~MPLL_MCLK_SEL; 116162306a36Sopenharmony_ci WREG32(MPLL_CNTL_MODE, tmp); 116262306a36Sopenharmony_ci} 116362306a36Sopenharmony_ci 116462306a36Sopenharmony_ci/* 116562306a36Sopenharmony_ci * Core functions 116662306a36Sopenharmony_ci */ 116762306a36Sopenharmony_cistatic void rv770_gpu_init(struct radeon_device *rdev) 116862306a36Sopenharmony_ci{ 116962306a36Sopenharmony_ci int i, j, num_qd_pipes; 117062306a36Sopenharmony_ci u32 ta_aux_cntl; 117162306a36Sopenharmony_ci u32 sx_debug_1; 117262306a36Sopenharmony_ci u32 smx_dc_ctl0; 117362306a36Sopenharmony_ci u32 db_debug3; 117462306a36Sopenharmony_ci u32 num_gs_verts_per_thread; 117562306a36Sopenharmony_ci u32 vgt_gs_per_es; 117662306a36Sopenharmony_ci u32 gs_prim_buffer_depth = 0; 117762306a36Sopenharmony_ci u32 sq_ms_fifo_sizes; 117862306a36Sopenharmony_ci u32 sq_config; 117962306a36Sopenharmony_ci u32 sq_thread_resource_mgmt; 118062306a36Sopenharmony_ci u32 hdp_host_path_cntl; 118162306a36Sopenharmony_ci u32 sq_dyn_gpr_size_simd_ab_0; 118262306a36Sopenharmony_ci u32 gb_tiling_config = 0; 118362306a36Sopenharmony_ci u32 cc_gc_shader_pipe_config = 0; 118462306a36Sopenharmony_ci u32 mc_arb_ramcfg; 118562306a36Sopenharmony_ci u32 db_debug4, tmp; 118662306a36Sopenharmony_ci u32 inactive_pipes, shader_pipe_config; 118762306a36Sopenharmony_ci u32 disabled_rb_mask; 118862306a36Sopenharmony_ci unsigned active_number; 118962306a36Sopenharmony_ci 119062306a36Sopenharmony_ci /* setup chip specs */ 119162306a36Sopenharmony_ci rdev->config.rv770.tiling_group_size = 256; 119262306a36Sopenharmony_ci switch (rdev->family) { 119362306a36Sopenharmony_ci case CHIP_RV770: 119462306a36Sopenharmony_ci rdev->config.rv770.max_pipes = 4; 119562306a36Sopenharmony_ci rdev->config.rv770.max_tile_pipes = 8; 119662306a36Sopenharmony_ci rdev->config.rv770.max_simds = 10; 119762306a36Sopenharmony_ci rdev->config.rv770.max_backends = 4; 119862306a36Sopenharmony_ci rdev->config.rv770.max_gprs = 256; 119962306a36Sopenharmony_ci rdev->config.rv770.max_threads = 248; 120062306a36Sopenharmony_ci rdev->config.rv770.max_stack_entries = 512; 120162306a36Sopenharmony_ci rdev->config.rv770.max_hw_contexts = 8; 120262306a36Sopenharmony_ci rdev->config.rv770.max_gs_threads = 16 * 2; 120362306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_size = 128; 120462306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_pos_size = 16; 120562306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_smx_size = 112; 120662306a36Sopenharmony_ci rdev->config.rv770.sq_num_cf_insts = 2; 120762306a36Sopenharmony_ci 120862306a36Sopenharmony_ci rdev->config.rv770.sx_num_of_sets = 7; 120962306a36Sopenharmony_ci rdev->config.rv770.sc_prim_fifo_size = 0xF9; 121062306a36Sopenharmony_ci rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30; 121162306a36Sopenharmony_ci rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130; 121262306a36Sopenharmony_ci break; 121362306a36Sopenharmony_ci case CHIP_RV730: 121462306a36Sopenharmony_ci rdev->config.rv770.max_pipes = 2; 121562306a36Sopenharmony_ci rdev->config.rv770.max_tile_pipes = 4; 121662306a36Sopenharmony_ci rdev->config.rv770.max_simds = 8; 121762306a36Sopenharmony_ci rdev->config.rv770.max_backends = 2; 121862306a36Sopenharmony_ci rdev->config.rv770.max_gprs = 128; 121962306a36Sopenharmony_ci rdev->config.rv770.max_threads = 248; 122062306a36Sopenharmony_ci rdev->config.rv770.max_stack_entries = 256; 122162306a36Sopenharmony_ci rdev->config.rv770.max_hw_contexts = 8; 122262306a36Sopenharmony_ci rdev->config.rv770.max_gs_threads = 16 * 2; 122362306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_size = 256; 122462306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_pos_size = 32; 122562306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_smx_size = 224; 122662306a36Sopenharmony_ci rdev->config.rv770.sq_num_cf_insts = 2; 122762306a36Sopenharmony_ci 122862306a36Sopenharmony_ci rdev->config.rv770.sx_num_of_sets = 7; 122962306a36Sopenharmony_ci rdev->config.rv770.sc_prim_fifo_size = 0xf9; 123062306a36Sopenharmony_ci rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30; 123162306a36Sopenharmony_ci rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130; 123262306a36Sopenharmony_ci if (rdev->config.rv770.sx_max_export_pos_size > 16) { 123362306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_pos_size -= 16; 123462306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_smx_size += 16; 123562306a36Sopenharmony_ci } 123662306a36Sopenharmony_ci break; 123762306a36Sopenharmony_ci case CHIP_RV710: 123862306a36Sopenharmony_ci rdev->config.rv770.max_pipes = 2; 123962306a36Sopenharmony_ci rdev->config.rv770.max_tile_pipes = 2; 124062306a36Sopenharmony_ci rdev->config.rv770.max_simds = 2; 124162306a36Sopenharmony_ci rdev->config.rv770.max_backends = 1; 124262306a36Sopenharmony_ci rdev->config.rv770.max_gprs = 256; 124362306a36Sopenharmony_ci rdev->config.rv770.max_threads = 192; 124462306a36Sopenharmony_ci rdev->config.rv770.max_stack_entries = 256; 124562306a36Sopenharmony_ci rdev->config.rv770.max_hw_contexts = 4; 124662306a36Sopenharmony_ci rdev->config.rv770.max_gs_threads = 8 * 2; 124762306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_size = 128; 124862306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_pos_size = 16; 124962306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_smx_size = 112; 125062306a36Sopenharmony_ci rdev->config.rv770.sq_num_cf_insts = 1; 125162306a36Sopenharmony_ci 125262306a36Sopenharmony_ci rdev->config.rv770.sx_num_of_sets = 7; 125362306a36Sopenharmony_ci rdev->config.rv770.sc_prim_fifo_size = 0x40; 125462306a36Sopenharmony_ci rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30; 125562306a36Sopenharmony_ci rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130; 125662306a36Sopenharmony_ci break; 125762306a36Sopenharmony_ci case CHIP_RV740: 125862306a36Sopenharmony_ci rdev->config.rv770.max_pipes = 4; 125962306a36Sopenharmony_ci rdev->config.rv770.max_tile_pipes = 4; 126062306a36Sopenharmony_ci rdev->config.rv770.max_simds = 8; 126162306a36Sopenharmony_ci rdev->config.rv770.max_backends = 4; 126262306a36Sopenharmony_ci rdev->config.rv770.max_gprs = 256; 126362306a36Sopenharmony_ci rdev->config.rv770.max_threads = 248; 126462306a36Sopenharmony_ci rdev->config.rv770.max_stack_entries = 512; 126562306a36Sopenharmony_ci rdev->config.rv770.max_hw_contexts = 8; 126662306a36Sopenharmony_ci rdev->config.rv770.max_gs_threads = 16 * 2; 126762306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_size = 256; 126862306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_pos_size = 32; 126962306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_smx_size = 224; 127062306a36Sopenharmony_ci rdev->config.rv770.sq_num_cf_insts = 2; 127162306a36Sopenharmony_ci 127262306a36Sopenharmony_ci rdev->config.rv770.sx_num_of_sets = 7; 127362306a36Sopenharmony_ci rdev->config.rv770.sc_prim_fifo_size = 0x100; 127462306a36Sopenharmony_ci rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30; 127562306a36Sopenharmony_ci rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130; 127662306a36Sopenharmony_ci 127762306a36Sopenharmony_ci if (rdev->config.rv770.sx_max_export_pos_size > 16) { 127862306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_pos_size -= 16; 127962306a36Sopenharmony_ci rdev->config.rv770.sx_max_export_smx_size += 16; 128062306a36Sopenharmony_ci } 128162306a36Sopenharmony_ci break; 128262306a36Sopenharmony_ci default: 128362306a36Sopenharmony_ci break; 128462306a36Sopenharmony_ci } 128562306a36Sopenharmony_ci 128662306a36Sopenharmony_ci /* Initialize HDP */ 128762306a36Sopenharmony_ci j = 0; 128862306a36Sopenharmony_ci for (i = 0; i < 32; i++) { 128962306a36Sopenharmony_ci WREG32((0x2c14 + j), 0x00000000); 129062306a36Sopenharmony_ci WREG32((0x2c18 + j), 0x00000000); 129162306a36Sopenharmony_ci WREG32((0x2c1c + j), 0x00000000); 129262306a36Sopenharmony_ci WREG32((0x2c20 + j), 0x00000000); 129362306a36Sopenharmony_ci WREG32((0x2c24 + j), 0x00000000); 129462306a36Sopenharmony_ci j += 0x18; 129562306a36Sopenharmony_ci } 129662306a36Sopenharmony_ci 129762306a36Sopenharmony_ci WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); 129862306a36Sopenharmony_ci 129962306a36Sopenharmony_ci /* setup tiling, simd, pipe config */ 130062306a36Sopenharmony_ci mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); 130162306a36Sopenharmony_ci 130262306a36Sopenharmony_ci shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG); 130362306a36Sopenharmony_ci inactive_pipes = (shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT; 130462306a36Sopenharmony_ci for (i = 0, tmp = 1, active_number = 0; i < R7XX_MAX_PIPES; i++) { 130562306a36Sopenharmony_ci if (!(inactive_pipes & tmp)) { 130662306a36Sopenharmony_ci active_number++; 130762306a36Sopenharmony_ci } 130862306a36Sopenharmony_ci tmp <<= 1; 130962306a36Sopenharmony_ci } 131062306a36Sopenharmony_ci if (active_number == 1) { 131162306a36Sopenharmony_ci WREG32(SPI_CONFIG_CNTL, DISABLE_INTERP_1); 131262306a36Sopenharmony_ci } else { 131362306a36Sopenharmony_ci WREG32(SPI_CONFIG_CNTL, 0); 131462306a36Sopenharmony_ci } 131562306a36Sopenharmony_ci 131662306a36Sopenharmony_ci cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00; 131762306a36Sopenharmony_ci tmp = rdev->config.rv770.max_simds - 131862306a36Sopenharmony_ci r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK); 131962306a36Sopenharmony_ci rdev->config.rv770.active_simds = tmp; 132062306a36Sopenharmony_ci 132162306a36Sopenharmony_ci switch (rdev->config.rv770.max_tile_pipes) { 132262306a36Sopenharmony_ci case 1: 132362306a36Sopenharmony_ci default: 132462306a36Sopenharmony_ci gb_tiling_config = PIPE_TILING(0); 132562306a36Sopenharmony_ci break; 132662306a36Sopenharmony_ci case 2: 132762306a36Sopenharmony_ci gb_tiling_config = PIPE_TILING(1); 132862306a36Sopenharmony_ci break; 132962306a36Sopenharmony_ci case 4: 133062306a36Sopenharmony_ci gb_tiling_config = PIPE_TILING(2); 133162306a36Sopenharmony_ci break; 133262306a36Sopenharmony_ci case 8: 133362306a36Sopenharmony_ci gb_tiling_config = PIPE_TILING(3); 133462306a36Sopenharmony_ci break; 133562306a36Sopenharmony_ci } 133662306a36Sopenharmony_ci rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes; 133762306a36Sopenharmony_ci 133862306a36Sopenharmony_ci disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK; 133962306a36Sopenharmony_ci tmp = 0; 134062306a36Sopenharmony_ci for (i = 0; i < rdev->config.rv770.max_backends; i++) 134162306a36Sopenharmony_ci tmp |= (1 << i); 134262306a36Sopenharmony_ci /* if all the backends are disabled, fix it up here */ 134362306a36Sopenharmony_ci if ((disabled_rb_mask & tmp) == tmp) { 134462306a36Sopenharmony_ci for (i = 0; i < rdev->config.rv770.max_backends; i++) 134562306a36Sopenharmony_ci disabled_rb_mask &= ~(1 << i); 134662306a36Sopenharmony_ci } 134762306a36Sopenharmony_ci tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT; 134862306a36Sopenharmony_ci tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends, 134962306a36Sopenharmony_ci R7XX_MAX_BACKENDS, disabled_rb_mask); 135062306a36Sopenharmony_ci gb_tiling_config |= tmp << 16; 135162306a36Sopenharmony_ci rdev->config.rv770.backend_map = tmp; 135262306a36Sopenharmony_ci 135362306a36Sopenharmony_ci if (rdev->family == CHIP_RV770) 135462306a36Sopenharmony_ci gb_tiling_config |= BANK_TILING(1); 135562306a36Sopenharmony_ci else { 135662306a36Sopenharmony_ci if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) 135762306a36Sopenharmony_ci gb_tiling_config |= BANK_TILING(1); 135862306a36Sopenharmony_ci else 135962306a36Sopenharmony_ci gb_tiling_config |= BANK_TILING(0); 136062306a36Sopenharmony_ci } 136162306a36Sopenharmony_ci rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3); 136262306a36Sopenharmony_ci gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT); 136362306a36Sopenharmony_ci if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) { 136462306a36Sopenharmony_ci gb_tiling_config |= ROW_TILING(3); 136562306a36Sopenharmony_ci gb_tiling_config |= SAMPLE_SPLIT(3); 136662306a36Sopenharmony_ci } else { 136762306a36Sopenharmony_ci gb_tiling_config |= 136862306a36Sopenharmony_ci ROW_TILING(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT)); 136962306a36Sopenharmony_ci gb_tiling_config |= 137062306a36Sopenharmony_ci SAMPLE_SPLIT(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT)); 137162306a36Sopenharmony_ci } 137262306a36Sopenharmony_ci 137362306a36Sopenharmony_ci gb_tiling_config |= BANK_SWAPS(1); 137462306a36Sopenharmony_ci rdev->config.rv770.tile_config = gb_tiling_config; 137562306a36Sopenharmony_ci 137662306a36Sopenharmony_ci WREG32(GB_TILING_CONFIG, gb_tiling_config); 137762306a36Sopenharmony_ci WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff)); 137862306a36Sopenharmony_ci WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff)); 137962306a36Sopenharmony_ci WREG32(DMA_TILING_CONFIG, (gb_tiling_config & 0xffff)); 138062306a36Sopenharmony_ci WREG32(DMA_TILING_CONFIG2, (gb_tiling_config & 0xffff)); 138162306a36Sopenharmony_ci if (rdev->family == CHIP_RV730) { 138262306a36Sopenharmony_ci WREG32(UVD_UDEC_DB_TILING_CONFIG, (gb_tiling_config & 0xffff)); 138362306a36Sopenharmony_ci WREG32(UVD_UDEC_DBW_TILING_CONFIG, (gb_tiling_config & 0xffff)); 138462306a36Sopenharmony_ci WREG32(UVD_UDEC_TILING_CONFIG, (gb_tiling_config & 0xffff)); 138562306a36Sopenharmony_ci } 138662306a36Sopenharmony_ci 138762306a36Sopenharmony_ci WREG32(CGTS_SYS_TCC_DISABLE, 0); 138862306a36Sopenharmony_ci WREG32(CGTS_TCC_DISABLE, 0); 138962306a36Sopenharmony_ci WREG32(CGTS_USER_SYS_TCC_DISABLE, 0); 139062306a36Sopenharmony_ci WREG32(CGTS_USER_TCC_DISABLE, 0); 139162306a36Sopenharmony_ci 139262306a36Sopenharmony_ci 139362306a36Sopenharmony_ci num_qd_pipes = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8); 139462306a36Sopenharmony_ci WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK); 139562306a36Sopenharmony_ci WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK); 139662306a36Sopenharmony_ci 139762306a36Sopenharmony_ci /* set HW defaults for 3D engine */ 139862306a36Sopenharmony_ci WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) | 139962306a36Sopenharmony_ci ROQ_IB2_START(0x2b))); 140062306a36Sopenharmony_ci 140162306a36Sopenharmony_ci WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30)); 140262306a36Sopenharmony_ci 140362306a36Sopenharmony_ci ta_aux_cntl = RREG32(TA_CNTL_AUX); 140462306a36Sopenharmony_ci WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO); 140562306a36Sopenharmony_ci 140662306a36Sopenharmony_ci sx_debug_1 = RREG32(SX_DEBUG_1); 140762306a36Sopenharmony_ci sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS; 140862306a36Sopenharmony_ci WREG32(SX_DEBUG_1, sx_debug_1); 140962306a36Sopenharmony_ci 141062306a36Sopenharmony_ci smx_dc_ctl0 = RREG32(SMX_DC_CTL0); 141162306a36Sopenharmony_ci smx_dc_ctl0 &= ~CACHE_DEPTH(0x1ff); 141262306a36Sopenharmony_ci smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1); 141362306a36Sopenharmony_ci WREG32(SMX_DC_CTL0, smx_dc_ctl0); 141462306a36Sopenharmony_ci 141562306a36Sopenharmony_ci if (rdev->family != CHIP_RV740) 141662306a36Sopenharmony_ci WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) | 141762306a36Sopenharmony_ci GS_FLUSH_CTL(4) | 141862306a36Sopenharmony_ci ACK_FLUSH_CTL(3) | 141962306a36Sopenharmony_ci SYNC_FLUSH_CTL)); 142062306a36Sopenharmony_ci 142162306a36Sopenharmony_ci if (rdev->family != CHIP_RV770) 142262306a36Sopenharmony_ci WREG32(SMX_SAR_CTL0, 0x00003f3f); 142362306a36Sopenharmony_ci 142462306a36Sopenharmony_ci db_debug3 = RREG32(DB_DEBUG3); 142562306a36Sopenharmony_ci db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f); 142662306a36Sopenharmony_ci switch (rdev->family) { 142762306a36Sopenharmony_ci case CHIP_RV770: 142862306a36Sopenharmony_ci case CHIP_RV740: 142962306a36Sopenharmony_ci db_debug3 |= DB_CLK_OFF_DELAY(0x1f); 143062306a36Sopenharmony_ci break; 143162306a36Sopenharmony_ci case CHIP_RV710: 143262306a36Sopenharmony_ci case CHIP_RV730: 143362306a36Sopenharmony_ci default: 143462306a36Sopenharmony_ci db_debug3 |= DB_CLK_OFF_DELAY(2); 143562306a36Sopenharmony_ci break; 143662306a36Sopenharmony_ci } 143762306a36Sopenharmony_ci WREG32(DB_DEBUG3, db_debug3); 143862306a36Sopenharmony_ci 143962306a36Sopenharmony_ci if (rdev->family != CHIP_RV770) { 144062306a36Sopenharmony_ci db_debug4 = RREG32(DB_DEBUG4); 144162306a36Sopenharmony_ci db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER; 144262306a36Sopenharmony_ci WREG32(DB_DEBUG4, db_debug4); 144362306a36Sopenharmony_ci } 144462306a36Sopenharmony_ci 144562306a36Sopenharmony_ci WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.rv770.sx_max_export_size / 4) - 1) | 144662306a36Sopenharmony_ci POSITION_BUFFER_SIZE((rdev->config.rv770.sx_max_export_pos_size / 4) - 1) | 144762306a36Sopenharmony_ci SMX_BUFFER_SIZE((rdev->config.rv770.sx_max_export_smx_size / 4) - 1))); 144862306a36Sopenharmony_ci 144962306a36Sopenharmony_ci WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.rv770.sc_prim_fifo_size) | 145062306a36Sopenharmony_ci SC_HIZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_hiz_tile_fifo_size) | 145162306a36Sopenharmony_ci SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_earlyz_tile_fifo_fize))); 145262306a36Sopenharmony_ci 145362306a36Sopenharmony_ci WREG32(PA_SC_MULTI_CHIP_CNTL, 0); 145462306a36Sopenharmony_ci 145562306a36Sopenharmony_ci WREG32(VGT_NUM_INSTANCES, 1); 145662306a36Sopenharmony_ci 145762306a36Sopenharmony_ci WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4)); 145862306a36Sopenharmony_ci 145962306a36Sopenharmony_ci WREG32(CP_PERFMON_CNTL, 0); 146062306a36Sopenharmony_ci 146162306a36Sopenharmony_ci sq_ms_fifo_sizes = (CACHE_FIFO_SIZE(16 * rdev->config.rv770.sq_num_cf_insts) | 146262306a36Sopenharmony_ci DONE_FIFO_HIWATER(0xe0) | 146362306a36Sopenharmony_ci ALU_UPDATE_FIFO_HIWATER(0x8)); 146462306a36Sopenharmony_ci switch (rdev->family) { 146562306a36Sopenharmony_ci case CHIP_RV770: 146662306a36Sopenharmony_ci case CHIP_RV730: 146762306a36Sopenharmony_ci case CHIP_RV710: 146862306a36Sopenharmony_ci sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1); 146962306a36Sopenharmony_ci break; 147062306a36Sopenharmony_ci case CHIP_RV740: 147162306a36Sopenharmony_ci default: 147262306a36Sopenharmony_ci sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4); 147362306a36Sopenharmony_ci break; 147462306a36Sopenharmony_ci } 147562306a36Sopenharmony_ci WREG32(SQ_MS_FIFO_SIZES, sq_ms_fifo_sizes); 147662306a36Sopenharmony_ci 147762306a36Sopenharmony_ci /* SQ_CONFIG, SQ_GPR_RESOURCE_MGMT, SQ_THREAD_RESOURCE_MGMT, SQ_STACK_RESOURCE_MGMT 147862306a36Sopenharmony_ci * should be adjusted as needed by the 2D/3D drivers. This just sets default values 147962306a36Sopenharmony_ci */ 148062306a36Sopenharmony_ci sq_config = RREG32(SQ_CONFIG); 148162306a36Sopenharmony_ci sq_config &= ~(PS_PRIO(3) | 148262306a36Sopenharmony_ci VS_PRIO(3) | 148362306a36Sopenharmony_ci GS_PRIO(3) | 148462306a36Sopenharmony_ci ES_PRIO(3)); 148562306a36Sopenharmony_ci sq_config |= (DX9_CONSTS | 148662306a36Sopenharmony_ci VC_ENABLE | 148762306a36Sopenharmony_ci EXPORT_SRC_C | 148862306a36Sopenharmony_ci PS_PRIO(0) | 148962306a36Sopenharmony_ci VS_PRIO(1) | 149062306a36Sopenharmony_ci GS_PRIO(2) | 149162306a36Sopenharmony_ci ES_PRIO(3)); 149262306a36Sopenharmony_ci if (rdev->family == CHIP_RV710) 149362306a36Sopenharmony_ci /* no vertex cache */ 149462306a36Sopenharmony_ci sq_config &= ~VC_ENABLE; 149562306a36Sopenharmony_ci 149662306a36Sopenharmony_ci WREG32(SQ_CONFIG, sq_config); 149762306a36Sopenharmony_ci 149862306a36Sopenharmony_ci WREG32(SQ_GPR_RESOURCE_MGMT_1, (NUM_PS_GPRS((rdev->config.rv770.max_gprs * 24)/64) | 149962306a36Sopenharmony_ci NUM_VS_GPRS((rdev->config.rv770.max_gprs * 24)/64) | 150062306a36Sopenharmony_ci NUM_CLAUSE_TEMP_GPRS(((rdev->config.rv770.max_gprs * 24)/64)/2))); 150162306a36Sopenharmony_ci 150262306a36Sopenharmony_ci WREG32(SQ_GPR_RESOURCE_MGMT_2, (NUM_GS_GPRS((rdev->config.rv770.max_gprs * 7)/64) | 150362306a36Sopenharmony_ci NUM_ES_GPRS((rdev->config.rv770.max_gprs * 7)/64))); 150462306a36Sopenharmony_ci 150562306a36Sopenharmony_ci sq_thread_resource_mgmt = (NUM_PS_THREADS((rdev->config.rv770.max_threads * 4)/8) | 150662306a36Sopenharmony_ci NUM_VS_THREADS((rdev->config.rv770.max_threads * 2)/8) | 150762306a36Sopenharmony_ci NUM_ES_THREADS((rdev->config.rv770.max_threads * 1)/8)); 150862306a36Sopenharmony_ci if (((rdev->config.rv770.max_threads * 1) / 8) > rdev->config.rv770.max_gs_threads) 150962306a36Sopenharmony_ci sq_thread_resource_mgmt |= NUM_GS_THREADS(rdev->config.rv770.max_gs_threads); 151062306a36Sopenharmony_ci else 151162306a36Sopenharmony_ci sq_thread_resource_mgmt |= NUM_GS_THREADS((rdev->config.rv770.max_gs_threads * 1)/8); 151262306a36Sopenharmony_ci WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt); 151362306a36Sopenharmony_ci 151462306a36Sopenharmony_ci WREG32(SQ_STACK_RESOURCE_MGMT_1, (NUM_PS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) | 151562306a36Sopenharmony_ci NUM_VS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4))); 151662306a36Sopenharmony_ci 151762306a36Sopenharmony_ci WREG32(SQ_STACK_RESOURCE_MGMT_2, (NUM_GS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) | 151862306a36Sopenharmony_ci NUM_ES_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4))); 151962306a36Sopenharmony_ci 152062306a36Sopenharmony_ci sq_dyn_gpr_size_simd_ab_0 = (SIMDA_RING0((rdev->config.rv770.max_gprs * 38)/64) | 152162306a36Sopenharmony_ci SIMDA_RING1((rdev->config.rv770.max_gprs * 38)/64) | 152262306a36Sopenharmony_ci SIMDB_RING0((rdev->config.rv770.max_gprs * 38)/64) | 152362306a36Sopenharmony_ci SIMDB_RING1((rdev->config.rv770.max_gprs * 38)/64)); 152462306a36Sopenharmony_ci 152562306a36Sopenharmony_ci WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_0, sq_dyn_gpr_size_simd_ab_0); 152662306a36Sopenharmony_ci WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_1, sq_dyn_gpr_size_simd_ab_0); 152762306a36Sopenharmony_ci WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_2, sq_dyn_gpr_size_simd_ab_0); 152862306a36Sopenharmony_ci WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_3, sq_dyn_gpr_size_simd_ab_0); 152962306a36Sopenharmony_ci WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_4, sq_dyn_gpr_size_simd_ab_0); 153062306a36Sopenharmony_ci WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_5, sq_dyn_gpr_size_simd_ab_0); 153162306a36Sopenharmony_ci WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_6, sq_dyn_gpr_size_simd_ab_0); 153262306a36Sopenharmony_ci WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_7, sq_dyn_gpr_size_simd_ab_0); 153362306a36Sopenharmony_ci 153462306a36Sopenharmony_ci WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) | 153562306a36Sopenharmony_ci FORCE_EOV_MAX_REZ_CNT(255))); 153662306a36Sopenharmony_ci 153762306a36Sopenharmony_ci if (rdev->family == CHIP_RV710) 153862306a36Sopenharmony_ci WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(TC_ONLY) | 153962306a36Sopenharmony_ci AUTO_INVLD_EN(ES_AND_GS_AUTO))); 154062306a36Sopenharmony_ci else 154162306a36Sopenharmony_ci WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(VC_AND_TC) | 154262306a36Sopenharmony_ci AUTO_INVLD_EN(ES_AND_GS_AUTO))); 154362306a36Sopenharmony_ci 154462306a36Sopenharmony_ci switch (rdev->family) { 154562306a36Sopenharmony_ci case CHIP_RV770: 154662306a36Sopenharmony_ci case CHIP_RV730: 154762306a36Sopenharmony_ci case CHIP_RV740: 154862306a36Sopenharmony_ci gs_prim_buffer_depth = 384; 154962306a36Sopenharmony_ci break; 155062306a36Sopenharmony_ci case CHIP_RV710: 155162306a36Sopenharmony_ci gs_prim_buffer_depth = 128; 155262306a36Sopenharmony_ci break; 155362306a36Sopenharmony_ci default: 155462306a36Sopenharmony_ci break; 155562306a36Sopenharmony_ci } 155662306a36Sopenharmony_ci 155762306a36Sopenharmony_ci num_gs_verts_per_thread = rdev->config.rv770.max_pipes * 16; 155862306a36Sopenharmony_ci vgt_gs_per_es = gs_prim_buffer_depth + num_gs_verts_per_thread; 155962306a36Sopenharmony_ci /* Max value for this is 256 */ 156062306a36Sopenharmony_ci if (vgt_gs_per_es > 256) 156162306a36Sopenharmony_ci vgt_gs_per_es = 256; 156262306a36Sopenharmony_ci 156362306a36Sopenharmony_ci WREG32(VGT_ES_PER_GS, 128); 156462306a36Sopenharmony_ci WREG32(VGT_GS_PER_ES, vgt_gs_per_es); 156562306a36Sopenharmony_ci WREG32(VGT_GS_PER_VS, 2); 156662306a36Sopenharmony_ci 156762306a36Sopenharmony_ci /* more default values. 2D/3D driver should adjust as needed */ 156862306a36Sopenharmony_ci WREG32(VGT_GS_VERTEX_REUSE, 16); 156962306a36Sopenharmony_ci WREG32(PA_SC_LINE_STIPPLE_STATE, 0); 157062306a36Sopenharmony_ci WREG32(VGT_STRMOUT_EN, 0); 157162306a36Sopenharmony_ci WREG32(SX_MISC, 0); 157262306a36Sopenharmony_ci WREG32(PA_SC_MODE_CNTL, 0); 157362306a36Sopenharmony_ci WREG32(PA_SC_EDGERULE, 0xaaaaaaaa); 157462306a36Sopenharmony_ci WREG32(PA_SC_AA_CONFIG, 0); 157562306a36Sopenharmony_ci WREG32(PA_SC_CLIPRECT_RULE, 0xffff); 157662306a36Sopenharmony_ci WREG32(PA_SC_LINE_STIPPLE, 0); 157762306a36Sopenharmony_ci WREG32(SPI_INPUT_Z, 0); 157862306a36Sopenharmony_ci WREG32(SPI_PS_IN_CONTROL_0, NUM_INTERP(2)); 157962306a36Sopenharmony_ci WREG32(CB_COLOR7_FRAG, 0); 158062306a36Sopenharmony_ci 158162306a36Sopenharmony_ci /* clear render buffer base addresses */ 158262306a36Sopenharmony_ci WREG32(CB_COLOR0_BASE, 0); 158362306a36Sopenharmony_ci WREG32(CB_COLOR1_BASE, 0); 158462306a36Sopenharmony_ci WREG32(CB_COLOR2_BASE, 0); 158562306a36Sopenharmony_ci WREG32(CB_COLOR3_BASE, 0); 158662306a36Sopenharmony_ci WREG32(CB_COLOR4_BASE, 0); 158762306a36Sopenharmony_ci WREG32(CB_COLOR5_BASE, 0); 158862306a36Sopenharmony_ci WREG32(CB_COLOR6_BASE, 0); 158962306a36Sopenharmony_ci WREG32(CB_COLOR7_BASE, 0); 159062306a36Sopenharmony_ci 159162306a36Sopenharmony_ci WREG32(TCP_CNTL, 0); 159262306a36Sopenharmony_ci 159362306a36Sopenharmony_ci hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL); 159462306a36Sopenharmony_ci WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl); 159562306a36Sopenharmony_ci 159662306a36Sopenharmony_ci WREG32(PA_SC_MULTI_CHIP_CNTL, 0); 159762306a36Sopenharmony_ci 159862306a36Sopenharmony_ci WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA | 159962306a36Sopenharmony_ci NUM_CLIP_SEQ(3))); 160062306a36Sopenharmony_ci WREG32(VC_ENHANCE, 0); 160162306a36Sopenharmony_ci} 160262306a36Sopenharmony_ci 160362306a36Sopenharmony_civoid r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc) 160462306a36Sopenharmony_ci{ 160562306a36Sopenharmony_ci u64 size_bf, size_af; 160662306a36Sopenharmony_ci 160762306a36Sopenharmony_ci if (mc->mc_vram_size > 0xE0000000) { 160862306a36Sopenharmony_ci /* leave room for at least 512M GTT */ 160962306a36Sopenharmony_ci dev_warn(rdev->dev, "limiting VRAM\n"); 161062306a36Sopenharmony_ci mc->real_vram_size = 0xE0000000; 161162306a36Sopenharmony_ci mc->mc_vram_size = 0xE0000000; 161262306a36Sopenharmony_ci } 161362306a36Sopenharmony_ci if (rdev->flags & RADEON_IS_AGP) { 161462306a36Sopenharmony_ci size_bf = mc->gtt_start; 161562306a36Sopenharmony_ci size_af = mc->mc_mask - mc->gtt_end; 161662306a36Sopenharmony_ci if (size_bf > size_af) { 161762306a36Sopenharmony_ci if (mc->mc_vram_size > size_bf) { 161862306a36Sopenharmony_ci dev_warn(rdev->dev, "limiting VRAM\n"); 161962306a36Sopenharmony_ci mc->real_vram_size = size_bf; 162062306a36Sopenharmony_ci mc->mc_vram_size = size_bf; 162162306a36Sopenharmony_ci } 162262306a36Sopenharmony_ci mc->vram_start = mc->gtt_start - mc->mc_vram_size; 162362306a36Sopenharmony_ci } else { 162462306a36Sopenharmony_ci if (mc->mc_vram_size > size_af) { 162562306a36Sopenharmony_ci dev_warn(rdev->dev, "limiting VRAM\n"); 162662306a36Sopenharmony_ci mc->real_vram_size = size_af; 162762306a36Sopenharmony_ci mc->mc_vram_size = size_af; 162862306a36Sopenharmony_ci } 162962306a36Sopenharmony_ci mc->vram_start = mc->gtt_end + 1; 163062306a36Sopenharmony_ci } 163162306a36Sopenharmony_ci mc->vram_end = mc->vram_start + mc->mc_vram_size - 1; 163262306a36Sopenharmony_ci dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n", 163362306a36Sopenharmony_ci mc->mc_vram_size >> 20, mc->vram_start, 163462306a36Sopenharmony_ci mc->vram_end, mc->real_vram_size >> 20); 163562306a36Sopenharmony_ci } else { 163662306a36Sopenharmony_ci radeon_vram_location(rdev, &rdev->mc, 0); 163762306a36Sopenharmony_ci rdev->mc.gtt_base_align = 0; 163862306a36Sopenharmony_ci radeon_gtt_location(rdev, mc); 163962306a36Sopenharmony_ci } 164062306a36Sopenharmony_ci} 164162306a36Sopenharmony_ci 164262306a36Sopenharmony_cistatic int rv770_mc_init(struct radeon_device *rdev) 164362306a36Sopenharmony_ci{ 164462306a36Sopenharmony_ci u32 tmp; 164562306a36Sopenharmony_ci int chansize, numchan; 164662306a36Sopenharmony_ci 164762306a36Sopenharmony_ci /* Get VRAM informations */ 164862306a36Sopenharmony_ci rdev->mc.vram_is_ddr = true; 164962306a36Sopenharmony_ci tmp = RREG32(MC_ARB_RAMCFG); 165062306a36Sopenharmony_ci if (tmp & CHANSIZE_OVERRIDE) { 165162306a36Sopenharmony_ci chansize = 16; 165262306a36Sopenharmony_ci } else if (tmp & CHANSIZE_MASK) { 165362306a36Sopenharmony_ci chansize = 64; 165462306a36Sopenharmony_ci } else { 165562306a36Sopenharmony_ci chansize = 32; 165662306a36Sopenharmony_ci } 165762306a36Sopenharmony_ci tmp = RREG32(MC_SHARED_CHMAP); 165862306a36Sopenharmony_ci switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) { 165962306a36Sopenharmony_ci case 0: 166062306a36Sopenharmony_ci default: 166162306a36Sopenharmony_ci numchan = 1; 166262306a36Sopenharmony_ci break; 166362306a36Sopenharmony_ci case 1: 166462306a36Sopenharmony_ci numchan = 2; 166562306a36Sopenharmony_ci break; 166662306a36Sopenharmony_ci case 2: 166762306a36Sopenharmony_ci numchan = 4; 166862306a36Sopenharmony_ci break; 166962306a36Sopenharmony_ci case 3: 167062306a36Sopenharmony_ci numchan = 8; 167162306a36Sopenharmony_ci break; 167262306a36Sopenharmony_ci } 167362306a36Sopenharmony_ci rdev->mc.vram_width = numchan * chansize; 167462306a36Sopenharmony_ci /* Could aper size report 0 ? */ 167562306a36Sopenharmony_ci rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); 167662306a36Sopenharmony_ci rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); 167762306a36Sopenharmony_ci /* Setup GPU memory space */ 167862306a36Sopenharmony_ci rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); 167962306a36Sopenharmony_ci rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); 168062306a36Sopenharmony_ci rdev->mc.visible_vram_size = rdev->mc.aper_size; 168162306a36Sopenharmony_ci r700_vram_gtt_location(rdev, &rdev->mc); 168262306a36Sopenharmony_ci radeon_update_bandwidth_info(rdev); 168362306a36Sopenharmony_ci 168462306a36Sopenharmony_ci return 0; 168562306a36Sopenharmony_ci} 168662306a36Sopenharmony_ci 168762306a36Sopenharmony_cistatic void rv770_uvd_init(struct radeon_device *rdev) 168862306a36Sopenharmony_ci{ 168962306a36Sopenharmony_ci int r; 169062306a36Sopenharmony_ci 169162306a36Sopenharmony_ci if (!rdev->has_uvd) 169262306a36Sopenharmony_ci return; 169362306a36Sopenharmony_ci 169462306a36Sopenharmony_ci r = radeon_uvd_init(rdev); 169562306a36Sopenharmony_ci if (r) { 169662306a36Sopenharmony_ci dev_err(rdev->dev, "failed UVD (%d) init.\n", r); 169762306a36Sopenharmony_ci /* 169862306a36Sopenharmony_ci * At this point rdev->uvd.vcpu_bo is NULL which trickles down 169962306a36Sopenharmony_ci * to early fails uvd_v2_2_resume() and thus nothing happens 170062306a36Sopenharmony_ci * there. So it is pointless to try to go through that code 170162306a36Sopenharmony_ci * hence why we disable uvd here. 170262306a36Sopenharmony_ci */ 170362306a36Sopenharmony_ci rdev->has_uvd = false; 170462306a36Sopenharmony_ci return; 170562306a36Sopenharmony_ci } 170662306a36Sopenharmony_ci rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL; 170762306a36Sopenharmony_ci r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096); 170862306a36Sopenharmony_ci} 170962306a36Sopenharmony_ci 171062306a36Sopenharmony_cistatic void rv770_uvd_start(struct radeon_device *rdev) 171162306a36Sopenharmony_ci{ 171262306a36Sopenharmony_ci int r; 171362306a36Sopenharmony_ci 171462306a36Sopenharmony_ci if (!rdev->has_uvd) 171562306a36Sopenharmony_ci return; 171662306a36Sopenharmony_ci 171762306a36Sopenharmony_ci r = uvd_v2_2_resume(rdev); 171862306a36Sopenharmony_ci if (r) { 171962306a36Sopenharmony_ci dev_err(rdev->dev, "failed UVD resume (%d).\n", r); 172062306a36Sopenharmony_ci goto error; 172162306a36Sopenharmony_ci } 172262306a36Sopenharmony_ci r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX); 172362306a36Sopenharmony_ci if (r) { 172462306a36Sopenharmony_ci dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r); 172562306a36Sopenharmony_ci goto error; 172662306a36Sopenharmony_ci } 172762306a36Sopenharmony_ci return; 172862306a36Sopenharmony_ci 172962306a36Sopenharmony_cierror: 173062306a36Sopenharmony_ci rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; 173162306a36Sopenharmony_ci} 173262306a36Sopenharmony_ci 173362306a36Sopenharmony_cistatic void rv770_uvd_resume(struct radeon_device *rdev) 173462306a36Sopenharmony_ci{ 173562306a36Sopenharmony_ci struct radeon_ring *ring; 173662306a36Sopenharmony_ci int r; 173762306a36Sopenharmony_ci 173862306a36Sopenharmony_ci if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size) 173962306a36Sopenharmony_ci return; 174062306a36Sopenharmony_ci 174162306a36Sopenharmony_ci ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; 174262306a36Sopenharmony_ci r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0)); 174362306a36Sopenharmony_ci if (r) { 174462306a36Sopenharmony_ci dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r); 174562306a36Sopenharmony_ci return; 174662306a36Sopenharmony_ci } 174762306a36Sopenharmony_ci r = uvd_v1_0_init(rdev); 174862306a36Sopenharmony_ci if (r) { 174962306a36Sopenharmony_ci dev_err(rdev->dev, "failed initializing UVD (%d).\n", r); 175062306a36Sopenharmony_ci return; 175162306a36Sopenharmony_ci } 175262306a36Sopenharmony_ci} 175362306a36Sopenharmony_ci 175462306a36Sopenharmony_cistatic int rv770_startup(struct radeon_device *rdev) 175562306a36Sopenharmony_ci{ 175662306a36Sopenharmony_ci struct radeon_ring *ring; 175762306a36Sopenharmony_ci int r; 175862306a36Sopenharmony_ci 175962306a36Sopenharmony_ci /* enable pcie gen2 link */ 176062306a36Sopenharmony_ci rv770_pcie_gen2_enable(rdev); 176162306a36Sopenharmony_ci 176262306a36Sopenharmony_ci /* scratch needs to be initialized before MC */ 176362306a36Sopenharmony_ci r = r600_vram_scratch_init(rdev); 176462306a36Sopenharmony_ci if (r) 176562306a36Sopenharmony_ci return r; 176662306a36Sopenharmony_ci 176762306a36Sopenharmony_ci rv770_mc_program(rdev); 176862306a36Sopenharmony_ci 176962306a36Sopenharmony_ci if (rdev->flags & RADEON_IS_AGP) { 177062306a36Sopenharmony_ci rv770_agp_enable(rdev); 177162306a36Sopenharmony_ci } else { 177262306a36Sopenharmony_ci r = rv770_pcie_gart_enable(rdev); 177362306a36Sopenharmony_ci if (r) 177462306a36Sopenharmony_ci return r; 177562306a36Sopenharmony_ci } 177662306a36Sopenharmony_ci 177762306a36Sopenharmony_ci rv770_gpu_init(rdev); 177862306a36Sopenharmony_ci 177962306a36Sopenharmony_ci /* allocate wb buffer */ 178062306a36Sopenharmony_ci r = radeon_wb_init(rdev); 178162306a36Sopenharmony_ci if (r) 178262306a36Sopenharmony_ci return r; 178362306a36Sopenharmony_ci 178462306a36Sopenharmony_ci r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX); 178562306a36Sopenharmony_ci if (r) { 178662306a36Sopenharmony_ci dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); 178762306a36Sopenharmony_ci return r; 178862306a36Sopenharmony_ci } 178962306a36Sopenharmony_ci 179062306a36Sopenharmony_ci r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX); 179162306a36Sopenharmony_ci if (r) { 179262306a36Sopenharmony_ci dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r); 179362306a36Sopenharmony_ci return r; 179462306a36Sopenharmony_ci } 179562306a36Sopenharmony_ci 179662306a36Sopenharmony_ci rv770_uvd_start(rdev); 179762306a36Sopenharmony_ci 179862306a36Sopenharmony_ci /* Enable IRQ */ 179962306a36Sopenharmony_ci if (!rdev->irq.installed) { 180062306a36Sopenharmony_ci r = radeon_irq_kms_init(rdev); 180162306a36Sopenharmony_ci if (r) 180262306a36Sopenharmony_ci return r; 180362306a36Sopenharmony_ci } 180462306a36Sopenharmony_ci 180562306a36Sopenharmony_ci r = r600_irq_init(rdev); 180662306a36Sopenharmony_ci if (r) { 180762306a36Sopenharmony_ci DRM_ERROR("radeon: IH init failed (%d).\n", r); 180862306a36Sopenharmony_ci radeon_irq_kms_fini(rdev); 180962306a36Sopenharmony_ci return r; 181062306a36Sopenharmony_ci } 181162306a36Sopenharmony_ci r600_irq_set(rdev); 181262306a36Sopenharmony_ci 181362306a36Sopenharmony_ci ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 181462306a36Sopenharmony_ci r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, 181562306a36Sopenharmony_ci RADEON_CP_PACKET2); 181662306a36Sopenharmony_ci if (r) 181762306a36Sopenharmony_ci return r; 181862306a36Sopenharmony_ci 181962306a36Sopenharmony_ci ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; 182062306a36Sopenharmony_ci r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, 182162306a36Sopenharmony_ci DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); 182262306a36Sopenharmony_ci if (r) 182362306a36Sopenharmony_ci return r; 182462306a36Sopenharmony_ci 182562306a36Sopenharmony_ci r = rv770_cp_load_microcode(rdev); 182662306a36Sopenharmony_ci if (r) 182762306a36Sopenharmony_ci return r; 182862306a36Sopenharmony_ci r = r600_cp_resume(rdev); 182962306a36Sopenharmony_ci if (r) 183062306a36Sopenharmony_ci return r; 183162306a36Sopenharmony_ci 183262306a36Sopenharmony_ci r = r600_dma_resume(rdev); 183362306a36Sopenharmony_ci if (r) 183462306a36Sopenharmony_ci return r; 183562306a36Sopenharmony_ci 183662306a36Sopenharmony_ci rv770_uvd_resume(rdev); 183762306a36Sopenharmony_ci 183862306a36Sopenharmony_ci r = radeon_ib_pool_init(rdev); 183962306a36Sopenharmony_ci if (r) { 184062306a36Sopenharmony_ci dev_err(rdev->dev, "IB initialization failed (%d).\n", r); 184162306a36Sopenharmony_ci return r; 184262306a36Sopenharmony_ci } 184362306a36Sopenharmony_ci 184462306a36Sopenharmony_ci r = radeon_audio_init(rdev); 184562306a36Sopenharmony_ci if (r) { 184662306a36Sopenharmony_ci DRM_ERROR("radeon: audio init failed\n"); 184762306a36Sopenharmony_ci return r; 184862306a36Sopenharmony_ci } 184962306a36Sopenharmony_ci 185062306a36Sopenharmony_ci return 0; 185162306a36Sopenharmony_ci} 185262306a36Sopenharmony_ci 185362306a36Sopenharmony_ciint rv770_resume(struct radeon_device *rdev) 185462306a36Sopenharmony_ci{ 185562306a36Sopenharmony_ci int r; 185662306a36Sopenharmony_ci 185762306a36Sopenharmony_ci /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw, 185862306a36Sopenharmony_ci * posting will perform necessary task to bring back GPU into good 185962306a36Sopenharmony_ci * shape. 186062306a36Sopenharmony_ci */ 186162306a36Sopenharmony_ci /* post card */ 186262306a36Sopenharmony_ci atom_asic_init(rdev->mode_info.atom_context); 186362306a36Sopenharmony_ci 186462306a36Sopenharmony_ci /* init golden registers */ 186562306a36Sopenharmony_ci rv770_init_golden_registers(rdev); 186662306a36Sopenharmony_ci 186762306a36Sopenharmony_ci if (rdev->pm.pm_method == PM_METHOD_DPM) 186862306a36Sopenharmony_ci radeon_pm_resume(rdev); 186962306a36Sopenharmony_ci 187062306a36Sopenharmony_ci rdev->accel_working = true; 187162306a36Sopenharmony_ci r = rv770_startup(rdev); 187262306a36Sopenharmony_ci if (r) { 187362306a36Sopenharmony_ci DRM_ERROR("r600 startup failed on resume\n"); 187462306a36Sopenharmony_ci rdev->accel_working = false; 187562306a36Sopenharmony_ci return r; 187662306a36Sopenharmony_ci } 187762306a36Sopenharmony_ci 187862306a36Sopenharmony_ci return r; 187962306a36Sopenharmony_ci 188062306a36Sopenharmony_ci} 188162306a36Sopenharmony_ci 188262306a36Sopenharmony_ciint rv770_suspend(struct radeon_device *rdev) 188362306a36Sopenharmony_ci{ 188462306a36Sopenharmony_ci radeon_pm_suspend(rdev); 188562306a36Sopenharmony_ci radeon_audio_fini(rdev); 188662306a36Sopenharmony_ci if (rdev->has_uvd) { 188762306a36Sopenharmony_ci radeon_uvd_suspend(rdev); 188862306a36Sopenharmony_ci uvd_v1_0_fini(rdev); 188962306a36Sopenharmony_ci } 189062306a36Sopenharmony_ci r700_cp_stop(rdev); 189162306a36Sopenharmony_ci r600_dma_stop(rdev); 189262306a36Sopenharmony_ci r600_irq_suspend(rdev); 189362306a36Sopenharmony_ci radeon_wb_disable(rdev); 189462306a36Sopenharmony_ci rv770_pcie_gart_disable(rdev); 189562306a36Sopenharmony_ci 189662306a36Sopenharmony_ci return 0; 189762306a36Sopenharmony_ci} 189862306a36Sopenharmony_ci 189962306a36Sopenharmony_ci/* Plan is to move initialization in that function and use 190062306a36Sopenharmony_ci * helper function so that radeon_device_init pretty much 190162306a36Sopenharmony_ci * do nothing more than calling asic specific function. This 190262306a36Sopenharmony_ci * should also allow to remove a bunch of callback function 190362306a36Sopenharmony_ci * like vram_info. 190462306a36Sopenharmony_ci */ 190562306a36Sopenharmony_ciint rv770_init(struct radeon_device *rdev) 190662306a36Sopenharmony_ci{ 190762306a36Sopenharmony_ci int r; 190862306a36Sopenharmony_ci 190962306a36Sopenharmony_ci /* Read BIOS */ 191062306a36Sopenharmony_ci if (!radeon_get_bios(rdev)) { 191162306a36Sopenharmony_ci if (ASIC_IS_AVIVO(rdev)) 191262306a36Sopenharmony_ci return -EINVAL; 191362306a36Sopenharmony_ci } 191462306a36Sopenharmony_ci /* Must be an ATOMBIOS */ 191562306a36Sopenharmony_ci if (!rdev->is_atom_bios) { 191662306a36Sopenharmony_ci dev_err(rdev->dev, "Expecting atombios for R600 GPU\n"); 191762306a36Sopenharmony_ci return -EINVAL; 191862306a36Sopenharmony_ci } 191962306a36Sopenharmony_ci r = radeon_atombios_init(rdev); 192062306a36Sopenharmony_ci if (r) 192162306a36Sopenharmony_ci return r; 192262306a36Sopenharmony_ci /* Post card if necessary */ 192362306a36Sopenharmony_ci if (!radeon_card_posted(rdev)) { 192462306a36Sopenharmony_ci if (!rdev->bios) { 192562306a36Sopenharmony_ci dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n"); 192662306a36Sopenharmony_ci return -EINVAL; 192762306a36Sopenharmony_ci } 192862306a36Sopenharmony_ci DRM_INFO("GPU not posted. posting now...\n"); 192962306a36Sopenharmony_ci atom_asic_init(rdev->mode_info.atom_context); 193062306a36Sopenharmony_ci } 193162306a36Sopenharmony_ci /* init golden registers */ 193262306a36Sopenharmony_ci rv770_init_golden_registers(rdev); 193362306a36Sopenharmony_ci /* Initialize scratch registers */ 193462306a36Sopenharmony_ci r600_scratch_init(rdev); 193562306a36Sopenharmony_ci /* Initialize surface registers */ 193662306a36Sopenharmony_ci radeon_surface_init(rdev); 193762306a36Sopenharmony_ci /* Initialize clocks */ 193862306a36Sopenharmony_ci radeon_get_clock_info(rdev->ddev); 193962306a36Sopenharmony_ci /* Fence driver */ 194062306a36Sopenharmony_ci radeon_fence_driver_init(rdev); 194162306a36Sopenharmony_ci /* initialize AGP */ 194262306a36Sopenharmony_ci if (rdev->flags & RADEON_IS_AGP) { 194362306a36Sopenharmony_ci r = radeon_agp_init(rdev); 194462306a36Sopenharmony_ci if (r) 194562306a36Sopenharmony_ci radeon_agp_disable(rdev); 194662306a36Sopenharmony_ci } 194762306a36Sopenharmony_ci r = rv770_mc_init(rdev); 194862306a36Sopenharmony_ci if (r) 194962306a36Sopenharmony_ci return r; 195062306a36Sopenharmony_ci /* Memory manager */ 195162306a36Sopenharmony_ci r = radeon_bo_init(rdev); 195262306a36Sopenharmony_ci if (r) 195362306a36Sopenharmony_ci return r; 195462306a36Sopenharmony_ci 195562306a36Sopenharmony_ci if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 195662306a36Sopenharmony_ci r = r600_init_microcode(rdev); 195762306a36Sopenharmony_ci if (r) { 195862306a36Sopenharmony_ci DRM_ERROR("Failed to load firmware!\n"); 195962306a36Sopenharmony_ci return r; 196062306a36Sopenharmony_ci } 196162306a36Sopenharmony_ci } 196262306a36Sopenharmony_ci 196362306a36Sopenharmony_ci /* Initialize power management */ 196462306a36Sopenharmony_ci radeon_pm_init(rdev); 196562306a36Sopenharmony_ci 196662306a36Sopenharmony_ci rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; 196762306a36Sopenharmony_ci r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); 196862306a36Sopenharmony_ci 196962306a36Sopenharmony_ci rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL; 197062306a36Sopenharmony_ci r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024); 197162306a36Sopenharmony_ci 197262306a36Sopenharmony_ci rv770_uvd_init(rdev); 197362306a36Sopenharmony_ci 197462306a36Sopenharmony_ci rdev->ih.ring_obj = NULL; 197562306a36Sopenharmony_ci r600_ih_ring_init(rdev, 64 * 1024); 197662306a36Sopenharmony_ci 197762306a36Sopenharmony_ci r = r600_pcie_gart_init(rdev); 197862306a36Sopenharmony_ci if (r) 197962306a36Sopenharmony_ci return r; 198062306a36Sopenharmony_ci 198162306a36Sopenharmony_ci rdev->accel_working = true; 198262306a36Sopenharmony_ci r = rv770_startup(rdev); 198362306a36Sopenharmony_ci if (r) { 198462306a36Sopenharmony_ci dev_err(rdev->dev, "disabling GPU acceleration\n"); 198562306a36Sopenharmony_ci r700_cp_fini(rdev); 198662306a36Sopenharmony_ci r600_dma_fini(rdev); 198762306a36Sopenharmony_ci r600_irq_fini(rdev); 198862306a36Sopenharmony_ci radeon_wb_fini(rdev); 198962306a36Sopenharmony_ci radeon_ib_pool_fini(rdev); 199062306a36Sopenharmony_ci radeon_irq_kms_fini(rdev); 199162306a36Sopenharmony_ci rv770_pcie_gart_fini(rdev); 199262306a36Sopenharmony_ci rdev->accel_working = false; 199362306a36Sopenharmony_ci } 199462306a36Sopenharmony_ci 199562306a36Sopenharmony_ci return 0; 199662306a36Sopenharmony_ci} 199762306a36Sopenharmony_ci 199862306a36Sopenharmony_civoid rv770_fini(struct radeon_device *rdev) 199962306a36Sopenharmony_ci{ 200062306a36Sopenharmony_ci radeon_pm_fini(rdev); 200162306a36Sopenharmony_ci r700_cp_fini(rdev); 200262306a36Sopenharmony_ci r600_dma_fini(rdev); 200362306a36Sopenharmony_ci r600_irq_fini(rdev); 200462306a36Sopenharmony_ci radeon_wb_fini(rdev); 200562306a36Sopenharmony_ci radeon_ib_pool_fini(rdev); 200662306a36Sopenharmony_ci radeon_irq_kms_fini(rdev); 200762306a36Sopenharmony_ci uvd_v1_0_fini(rdev); 200862306a36Sopenharmony_ci radeon_uvd_fini(rdev); 200962306a36Sopenharmony_ci rv770_pcie_gart_fini(rdev); 201062306a36Sopenharmony_ci r600_vram_scratch_fini(rdev); 201162306a36Sopenharmony_ci radeon_gem_fini(rdev); 201262306a36Sopenharmony_ci radeon_fence_driver_fini(rdev); 201362306a36Sopenharmony_ci radeon_agp_fini(rdev); 201462306a36Sopenharmony_ci radeon_bo_fini(rdev); 201562306a36Sopenharmony_ci radeon_atombios_fini(rdev); 201662306a36Sopenharmony_ci kfree(rdev->bios); 201762306a36Sopenharmony_ci rdev->bios = NULL; 201862306a36Sopenharmony_ci} 201962306a36Sopenharmony_ci 202062306a36Sopenharmony_cistatic void rv770_pcie_gen2_enable(struct radeon_device *rdev) 202162306a36Sopenharmony_ci{ 202262306a36Sopenharmony_ci u32 link_width_cntl, lanes, speed_cntl, tmp; 202362306a36Sopenharmony_ci u16 link_cntl2; 202462306a36Sopenharmony_ci 202562306a36Sopenharmony_ci if (radeon_pcie_gen2 == 0) 202662306a36Sopenharmony_ci return; 202762306a36Sopenharmony_ci 202862306a36Sopenharmony_ci if (rdev->flags & RADEON_IS_IGP) 202962306a36Sopenharmony_ci return; 203062306a36Sopenharmony_ci 203162306a36Sopenharmony_ci if (!(rdev->flags & RADEON_IS_PCIE)) 203262306a36Sopenharmony_ci return; 203362306a36Sopenharmony_ci 203462306a36Sopenharmony_ci /* x2 cards have a special sequence */ 203562306a36Sopenharmony_ci if (ASIC_IS_X2(rdev)) 203662306a36Sopenharmony_ci return; 203762306a36Sopenharmony_ci 203862306a36Sopenharmony_ci if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) && 203962306a36Sopenharmony_ci (rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT)) 204062306a36Sopenharmony_ci return; 204162306a36Sopenharmony_ci 204262306a36Sopenharmony_ci DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n"); 204362306a36Sopenharmony_ci 204462306a36Sopenharmony_ci /* advertise upconfig capability */ 204562306a36Sopenharmony_ci link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 204662306a36Sopenharmony_ci link_width_cntl &= ~LC_UPCONFIGURE_DIS; 204762306a36Sopenharmony_ci WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 204862306a36Sopenharmony_ci link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 204962306a36Sopenharmony_ci if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) { 205062306a36Sopenharmony_ci lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT; 205162306a36Sopenharmony_ci link_width_cntl &= ~(LC_LINK_WIDTH_MASK | 205262306a36Sopenharmony_ci LC_RECONFIG_ARC_MISSING_ESCAPE); 205362306a36Sopenharmony_ci link_width_cntl |= lanes | LC_RECONFIG_NOW | 205462306a36Sopenharmony_ci LC_RENEGOTIATE_EN | LC_UPCONFIGURE_SUPPORT; 205562306a36Sopenharmony_ci WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 205662306a36Sopenharmony_ci } else { 205762306a36Sopenharmony_ci link_width_cntl |= LC_UPCONFIGURE_DIS; 205862306a36Sopenharmony_ci WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 205962306a36Sopenharmony_ci } 206062306a36Sopenharmony_ci 206162306a36Sopenharmony_ci speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 206262306a36Sopenharmony_ci if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) && 206362306a36Sopenharmony_ci (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) { 206462306a36Sopenharmony_ci 206562306a36Sopenharmony_ci tmp = RREG32(0x541c); 206662306a36Sopenharmony_ci WREG32(0x541c, tmp | 0x8); 206762306a36Sopenharmony_ci WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN); 206862306a36Sopenharmony_ci link_cntl2 = RREG16(0x4088); 206962306a36Sopenharmony_ci link_cntl2 &= ~TARGET_LINK_SPEED_MASK; 207062306a36Sopenharmony_ci link_cntl2 |= 0x2; 207162306a36Sopenharmony_ci WREG16(0x4088, link_cntl2); 207262306a36Sopenharmony_ci WREG32(MM_CFGREGS_CNTL, 0); 207362306a36Sopenharmony_ci 207462306a36Sopenharmony_ci speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 207562306a36Sopenharmony_ci speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN; 207662306a36Sopenharmony_ci WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 207762306a36Sopenharmony_ci 207862306a36Sopenharmony_ci speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 207962306a36Sopenharmony_ci speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT; 208062306a36Sopenharmony_ci WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 208162306a36Sopenharmony_ci 208262306a36Sopenharmony_ci speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 208362306a36Sopenharmony_ci speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT; 208462306a36Sopenharmony_ci WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 208562306a36Sopenharmony_ci 208662306a36Sopenharmony_ci speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); 208762306a36Sopenharmony_ci speed_cntl |= LC_GEN2_EN_STRAP; 208862306a36Sopenharmony_ci WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl); 208962306a36Sopenharmony_ci 209062306a36Sopenharmony_ci } else { 209162306a36Sopenharmony_ci link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL); 209262306a36Sopenharmony_ci /* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */ 209362306a36Sopenharmony_ci if (1) 209462306a36Sopenharmony_ci link_width_cntl |= LC_UPCONFIGURE_DIS; 209562306a36Sopenharmony_ci else 209662306a36Sopenharmony_ci link_width_cntl &= ~LC_UPCONFIGURE_DIS; 209762306a36Sopenharmony_ci WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); 209862306a36Sopenharmony_ci } 209962306a36Sopenharmony_ci} 2100