18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright 2008 Advanced Micro Devices, Inc. 38c2ecf20Sopenharmony_ci * Copyright 2008 Red Hat Inc. 48c2ecf20Sopenharmony_ci * Copyright 2009 Jerome Glisse. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 78c2ecf20Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 88c2ecf20Sopenharmony_ci * to deal in the Software without restriction, including without limitation 98c2ecf20Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 108c2ecf20Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 118c2ecf20Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 128c2ecf20Sopenharmony_ci * 138c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice shall be included in 148c2ecf20Sopenharmony_ci * all copies or substantial portions of the Software. 158c2ecf20Sopenharmony_ci * 168c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 178c2ecf20Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 188c2ecf20Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 198c2ecf20Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 208c2ecf20Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 218c2ecf20Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 228c2ecf20Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 238c2ecf20Sopenharmony_ci * 248c2ecf20Sopenharmony_ci * Authors: Dave Airlie 258c2ecf20Sopenharmony_ci * Alex Deucher 268c2ecf20Sopenharmony_ci * Jerome Glisse 278c2ecf20Sopenharmony_ci */ 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci#include "radeon.h" 308c2ecf20Sopenharmony_ci#include "radeon_asic.h" 318c2ecf20Sopenharmony_ci#include "atom.h" 328c2ecf20Sopenharmony_ci#include "r520d.h" 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci/* This files gather functions specifics to: r520,rv530,rv560,rv570,r580 */ 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ciint r520_mc_wait_for_idle(struct radeon_device *rdev) 378c2ecf20Sopenharmony_ci{ 388c2ecf20Sopenharmony_ci unsigned i; 398c2ecf20Sopenharmony_ci uint32_t tmp; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci for (i = 0; i < rdev->usec_timeout; i++) { 428c2ecf20Sopenharmony_ci /* read MC_STATUS */ 438c2ecf20Sopenharmony_ci tmp = RREG32_MC(R520_MC_STATUS); 448c2ecf20Sopenharmony_ci if (tmp & R520_MC_STATUS_IDLE) { 458c2ecf20Sopenharmony_ci return 0; 468c2ecf20Sopenharmony_ci } 478c2ecf20Sopenharmony_ci udelay(1); 488c2ecf20Sopenharmony_ci } 498c2ecf20Sopenharmony_ci return -1; 508c2ecf20Sopenharmony_ci} 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cistatic void r520_gpu_init(struct radeon_device *rdev) 538c2ecf20Sopenharmony_ci{ 548c2ecf20Sopenharmony_ci unsigned pipe_select_current, gb_pipe_select, tmp; 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci rv515_vga_render_disable(rdev); 578c2ecf20Sopenharmony_ci /* 588c2ecf20Sopenharmony_ci * DST_PIPE_CONFIG 0x170C 598c2ecf20Sopenharmony_ci * GB_TILE_CONFIG 0x4018 608c2ecf20Sopenharmony_ci * GB_FIFO_SIZE 0x4024 618c2ecf20Sopenharmony_ci * GB_PIPE_SELECT 0x402C 628c2ecf20Sopenharmony_ci * GB_PIPE_SELECT2 0x4124 638c2ecf20Sopenharmony_ci * Z_PIPE_SHIFT 0 648c2ecf20Sopenharmony_ci * Z_PIPE_MASK 0x000000003 658c2ecf20Sopenharmony_ci * GB_FIFO_SIZE2 0x4128 668c2ecf20Sopenharmony_ci * SC_SFIFO_SIZE_SHIFT 0 678c2ecf20Sopenharmony_ci * SC_SFIFO_SIZE_MASK 0x000000003 688c2ecf20Sopenharmony_ci * SC_MFIFO_SIZE_SHIFT 2 698c2ecf20Sopenharmony_ci * SC_MFIFO_SIZE_MASK 0x00000000C 708c2ecf20Sopenharmony_ci * FG_SFIFO_SIZE_SHIFT 4 718c2ecf20Sopenharmony_ci * FG_SFIFO_SIZE_MASK 0x000000030 728c2ecf20Sopenharmony_ci * ZB_MFIFO_SIZE_SHIFT 6 738c2ecf20Sopenharmony_ci * ZB_MFIFO_SIZE_MASK 0x0000000C0 748c2ecf20Sopenharmony_ci * GA_ENHANCE 0x4274 758c2ecf20Sopenharmony_ci * SU_REG_DEST 0x42C8 768c2ecf20Sopenharmony_ci */ 778c2ecf20Sopenharmony_ci /* workaround for RV530 */ 788c2ecf20Sopenharmony_ci if (rdev->family == CHIP_RV530) { 798c2ecf20Sopenharmony_ci WREG32(0x4128, 0xFF); 808c2ecf20Sopenharmony_ci } 818c2ecf20Sopenharmony_ci r420_pipes_init(rdev); 828c2ecf20Sopenharmony_ci gb_pipe_select = RREG32(R400_GB_PIPE_SELECT); 838c2ecf20Sopenharmony_ci tmp = RREG32(R300_DST_PIPE_CONFIG); 848c2ecf20Sopenharmony_ci pipe_select_current = (tmp >> 2) & 3; 858c2ecf20Sopenharmony_ci tmp = (1 << pipe_select_current) | 868c2ecf20Sopenharmony_ci (((gb_pipe_select >> 8) & 0xF) << 4); 878c2ecf20Sopenharmony_ci WREG32_PLL(0x000D, tmp); 888c2ecf20Sopenharmony_ci if (r520_mc_wait_for_idle(rdev)) { 898c2ecf20Sopenharmony_ci pr_warn("Failed to wait MC idle while programming pipes. Bad things might happen.\n"); 908c2ecf20Sopenharmony_ci } 918c2ecf20Sopenharmony_ci} 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_cistatic void r520_vram_get_type(struct radeon_device *rdev) 948c2ecf20Sopenharmony_ci{ 958c2ecf20Sopenharmony_ci uint32_t tmp; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci rdev->mc.vram_width = 128; 988c2ecf20Sopenharmony_ci rdev->mc.vram_is_ddr = true; 998c2ecf20Sopenharmony_ci tmp = RREG32_MC(R520_MC_CNTL0); 1008c2ecf20Sopenharmony_ci switch ((tmp & R520_MEM_NUM_CHANNELS_MASK) >> R520_MEM_NUM_CHANNELS_SHIFT) { 1018c2ecf20Sopenharmony_ci case 0: 1028c2ecf20Sopenharmony_ci rdev->mc.vram_width = 32; 1038c2ecf20Sopenharmony_ci break; 1048c2ecf20Sopenharmony_ci case 1: 1058c2ecf20Sopenharmony_ci rdev->mc.vram_width = 64; 1068c2ecf20Sopenharmony_ci break; 1078c2ecf20Sopenharmony_ci case 2: 1088c2ecf20Sopenharmony_ci rdev->mc.vram_width = 128; 1098c2ecf20Sopenharmony_ci break; 1108c2ecf20Sopenharmony_ci case 3: 1118c2ecf20Sopenharmony_ci rdev->mc.vram_width = 256; 1128c2ecf20Sopenharmony_ci break; 1138c2ecf20Sopenharmony_ci default: 1148c2ecf20Sopenharmony_ci rdev->mc.vram_width = 128; 1158c2ecf20Sopenharmony_ci break; 1168c2ecf20Sopenharmony_ci } 1178c2ecf20Sopenharmony_ci if (tmp & R520_MC_CHANNEL_SIZE) 1188c2ecf20Sopenharmony_ci rdev->mc.vram_width *= 2; 1198c2ecf20Sopenharmony_ci} 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_cistatic void r520_mc_init(struct radeon_device *rdev) 1228c2ecf20Sopenharmony_ci{ 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ci r520_vram_get_type(rdev); 1258c2ecf20Sopenharmony_ci r100_vram_init_sizes(rdev); 1268c2ecf20Sopenharmony_ci radeon_vram_location(rdev, &rdev->mc, 0); 1278c2ecf20Sopenharmony_ci rdev->mc.gtt_base_align = 0; 1288c2ecf20Sopenharmony_ci if (!(rdev->flags & RADEON_IS_AGP)) 1298c2ecf20Sopenharmony_ci radeon_gtt_location(rdev, &rdev->mc); 1308c2ecf20Sopenharmony_ci radeon_update_bandwidth_info(rdev); 1318c2ecf20Sopenharmony_ci} 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_cistatic void r520_mc_program(struct radeon_device *rdev) 1348c2ecf20Sopenharmony_ci{ 1358c2ecf20Sopenharmony_ci struct rv515_mc_save save; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci /* Stops all mc clients */ 1388c2ecf20Sopenharmony_ci rv515_mc_stop(rdev, &save); 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci /* Wait for mc idle */ 1418c2ecf20Sopenharmony_ci if (r520_mc_wait_for_idle(rdev)) 1428c2ecf20Sopenharmony_ci dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); 1438c2ecf20Sopenharmony_ci /* Write VRAM size in case we are limiting it */ 1448c2ecf20Sopenharmony_ci WREG32(R_0000F8_CONFIG_MEMSIZE, rdev->mc.real_vram_size); 1458c2ecf20Sopenharmony_ci /* Program MC, should be a 32bits limited address space */ 1468c2ecf20Sopenharmony_ci WREG32_MC(R_000004_MC_FB_LOCATION, 1478c2ecf20Sopenharmony_ci S_000004_MC_FB_START(rdev->mc.vram_start >> 16) | 1488c2ecf20Sopenharmony_ci S_000004_MC_FB_TOP(rdev->mc.vram_end >> 16)); 1498c2ecf20Sopenharmony_ci WREG32(R_000134_HDP_FB_LOCATION, 1508c2ecf20Sopenharmony_ci S_000134_HDP_FB_START(rdev->mc.vram_start >> 16)); 1518c2ecf20Sopenharmony_ci if (rdev->flags & RADEON_IS_AGP) { 1528c2ecf20Sopenharmony_ci WREG32_MC(R_000005_MC_AGP_LOCATION, 1538c2ecf20Sopenharmony_ci S_000005_MC_AGP_START(rdev->mc.gtt_start >> 16) | 1548c2ecf20Sopenharmony_ci S_000005_MC_AGP_TOP(rdev->mc.gtt_end >> 16)); 1558c2ecf20Sopenharmony_ci WREG32_MC(R_000006_AGP_BASE, lower_32_bits(rdev->mc.agp_base)); 1568c2ecf20Sopenharmony_ci WREG32_MC(R_000007_AGP_BASE_2, 1578c2ecf20Sopenharmony_ci S_000007_AGP_BASE_ADDR_2(upper_32_bits(rdev->mc.agp_base))); 1588c2ecf20Sopenharmony_ci } else { 1598c2ecf20Sopenharmony_ci WREG32_MC(R_000005_MC_AGP_LOCATION, 0xFFFFFFFF); 1608c2ecf20Sopenharmony_ci WREG32_MC(R_000006_AGP_BASE, 0); 1618c2ecf20Sopenharmony_ci WREG32_MC(R_000007_AGP_BASE_2, 0); 1628c2ecf20Sopenharmony_ci } 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci rv515_mc_resume(rdev, &save); 1658c2ecf20Sopenharmony_ci} 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_cistatic int r520_startup(struct radeon_device *rdev) 1688c2ecf20Sopenharmony_ci{ 1698c2ecf20Sopenharmony_ci int r; 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci r520_mc_program(rdev); 1728c2ecf20Sopenharmony_ci /* Resume clock */ 1738c2ecf20Sopenharmony_ci rv515_clock_startup(rdev); 1748c2ecf20Sopenharmony_ci /* Initialize GPU configuration (# pipes, ...) */ 1758c2ecf20Sopenharmony_ci r520_gpu_init(rdev); 1768c2ecf20Sopenharmony_ci /* Initialize GART (initialize after TTM so we can allocate 1778c2ecf20Sopenharmony_ci * memory through TTM but finalize after TTM) */ 1788c2ecf20Sopenharmony_ci if (rdev->flags & RADEON_IS_PCIE) { 1798c2ecf20Sopenharmony_ci r = rv370_pcie_gart_enable(rdev); 1808c2ecf20Sopenharmony_ci if (r) 1818c2ecf20Sopenharmony_ci return r; 1828c2ecf20Sopenharmony_ci } 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_ci /* allocate wb buffer */ 1858c2ecf20Sopenharmony_ci r = radeon_wb_init(rdev); 1868c2ecf20Sopenharmony_ci if (r) 1878c2ecf20Sopenharmony_ci return r; 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_ci r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX); 1908c2ecf20Sopenharmony_ci if (r) { 1918c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); 1928c2ecf20Sopenharmony_ci return r; 1938c2ecf20Sopenharmony_ci } 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_ci /* Enable IRQ */ 1968c2ecf20Sopenharmony_ci if (!rdev->irq.installed) { 1978c2ecf20Sopenharmony_ci r = radeon_irq_kms_init(rdev); 1988c2ecf20Sopenharmony_ci if (r) 1998c2ecf20Sopenharmony_ci return r; 2008c2ecf20Sopenharmony_ci } 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_ci rs600_irq_set(rdev); 2038c2ecf20Sopenharmony_ci rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 2048c2ecf20Sopenharmony_ci /* 1M ring buffer */ 2058c2ecf20Sopenharmony_ci r = r100_cp_init(rdev, 1024 * 1024); 2068c2ecf20Sopenharmony_ci if (r) { 2078c2ecf20Sopenharmony_ci dev_err(rdev->dev, "failed initializing CP (%d).\n", r); 2088c2ecf20Sopenharmony_ci return r; 2098c2ecf20Sopenharmony_ci } 2108c2ecf20Sopenharmony_ci 2118c2ecf20Sopenharmony_ci r = radeon_ib_pool_init(rdev); 2128c2ecf20Sopenharmony_ci if (r) { 2138c2ecf20Sopenharmony_ci dev_err(rdev->dev, "IB initialization failed (%d).\n", r); 2148c2ecf20Sopenharmony_ci return r; 2158c2ecf20Sopenharmony_ci } 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci return 0; 2188c2ecf20Sopenharmony_ci} 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ciint r520_resume(struct radeon_device *rdev) 2218c2ecf20Sopenharmony_ci{ 2228c2ecf20Sopenharmony_ci int r; 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci /* Make sur GART are not working */ 2258c2ecf20Sopenharmony_ci if (rdev->flags & RADEON_IS_PCIE) 2268c2ecf20Sopenharmony_ci rv370_pcie_gart_disable(rdev); 2278c2ecf20Sopenharmony_ci /* Resume clock before doing reset */ 2288c2ecf20Sopenharmony_ci rv515_clock_startup(rdev); 2298c2ecf20Sopenharmony_ci /* Reset gpu before posting otherwise ATOM will enter infinite loop */ 2308c2ecf20Sopenharmony_ci if (radeon_asic_reset(rdev)) { 2318c2ecf20Sopenharmony_ci dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", 2328c2ecf20Sopenharmony_ci RREG32(R_000E40_RBBM_STATUS), 2338c2ecf20Sopenharmony_ci RREG32(R_0007C0_CP_STAT)); 2348c2ecf20Sopenharmony_ci } 2358c2ecf20Sopenharmony_ci /* post */ 2368c2ecf20Sopenharmony_ci atom_asic_init(rdev->mode_info.atom_context); 2378c2ecf20Sopenharmony_ci /* Resume clock after posting */ 2388c2ecf20Sopenharmony_ci rv515_clock_startup(rdev); 2398c2ecf20Sopenharmony_ci /* Initialize surface registers */ 2408c2ecf20Sopenharmony_ci radeon_surface_init(rdev); 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_ci rdev->accel_working = true; 2438c2ecf20Sopenharmony_ci r = r520_startup(rdev); 2448c2ecf20Sopenharmony_ci if (r) { 2458c2ecf20Sopenharmony_ci rdev->accel_working = false; 2468c2ecf20Sopenharmony_ci } 2478c2ecf20Sopenharmony_ci return r; 2488c2ecf20Sopenharmony_ci} 2498c2ecf20Sopenharmony_ci 2508c2ecf20Sopenharmony_ciint r520_init(struct radeon_device *rdev) 2518c2ecf20Sopenharmony_ci{ 2528c2ecf20Sopenharmony_ci int r; 2538c2ecf20Sopenharmony_ci 2548c2ecf20Sopenharmony_ci /* Initialize scratch registers */ 2558c2ecf20Sopenharmony_ci radeon_scratch_init(rdev); 2568c2ecf20Sopenharmony_ci /* Initialize surface registers */ 2578c2ecf20Sopenharmony_ci radeon_surface_init(rdev); 2588c2ecf20Sopenharmony_ci /* restore some register to sane defaults */ 2598c2ecf20Sopenharmony_ci r100_restore_sanity(rdev); 2608c2ecf20Sopenharmony_ci /* TODO: disable VGA need to use VGA request */ 2618c2ecf20Sopenharmony_ci /* BIOS*/ 2628c2ecf20Sopenharmony_ci if (!radeon_get_bios(rdev)) { 2638c2ecf20Sopenharmony_ci if (ASIC_IS_AVIVO(rdev)) 2648c2ecf20Sopenharmony_ci return -EINVAL; 2658c2ecf20Sopenharmony_ci } 2668c2ecf20Sopenharmony_ci if (rdev->is_atom_bios) { 2678c2ecf20Sopenharmony_ci r = radeon_atombios_init(rdev); 2688c2ecf20Sopenharmony_ci if (r) 2698c2ecf20Sopenharmony_ci return r; 2708c2ecf20Sopenharmony_ci } else { 2718c2ecf20Sopenharmony_ci dev_err(rdev->dev, "Expecting atombios for RV515 GPU\n"); 2728c2ecf20Sopenharmony_ci return -EINVAL; 2738c2ecf20Sopenharmony_ci } 2748c2ecf20Sopenharmony_ci /* Reset gpu before posting otherwise ATOM will enter infinite loop */ 2758c2ecf20Sopenharmony_ci if (radeon_asic_reset(rdev)) { 2768c2ecf20Sopenharmony_ci dev_warn(rdev->dev, 2778c2ecf20Sopenharmony_ci "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", 2788c2ecf20Sopenharmony_ci RREG32(R_000E40_RBBM_STATUS), 2798c2ecf20Sopenharmony_ci RREG32(R_0007C0_CP_STAT)); 2808c2ecf20Sopenharmony_ci } 2818c2ecf20Sopenharmony_ci /* check if cards are posted or not */ 2828c2ecf20Sopenharmony_ci if (radeon_boot_test_post_card(rdev) == false) 2838c2ecf20Sopenharmony_ci return -EINVAL; 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_ci if (!radeon_card_posted(rdev) && rdev->bios) { 2868c2ecf20Sopenharmony_ci DRM_INFO("GPU not posted. posting now...\n"); 2878c2ecf20Sopenharmony_ci atom_asic_init(rdev->mode_info.atom_context); 2888c2ecf20Sopenharmony_ci } 2898c2ecf20Sopenharmony_ci /* Initialize clocks */ 2908c2ecf20Sopenharmony_ci radeon_get_clock_info(rdev->ddev); 2918c2ecf20Sopenharmony_ci /* initialize AGP */ 2928c2ecf20Sopenharmony_ci if (rdev->flags & RADEON_IS_AGP) { 2938c2ecf20Sopenharmony_ci r = radeon_agp_init(rdev); 2948c2ecf20Sopenharmony_ci if (r) { 2958c2ecf20Sopenharmony_ci radeon_agp_disable(rdev); 2968c2ecf20Sopenharmony_ci } 2978c2ecf20Sopenharmony_ci } 2988c2ecf20Sopenharmony_ci /* initialize memory controller */ 2998c2ecf20Sopenharmony_ci r520_mc_init(rdev); 3008c2ecf20Sopenharmony_ci rv515_debugfs(rdev); 3018c2ecf20Sopenharmony_ci /* Fence driver */ 3028c2ecf20Sopenharmony_ci r = radeon_fence_driver_init(rdev); 3038c2ecf20Sopenharmony_ci if (r) 3048c2ecf20Sopenharmony_ci return r; 3058c2ecf20Sopenharmony_ci /* Memory manager */ 3068c2ecf20Sopenharmony_ci r = radeon_bo_init(rdev); 3078c2ecf20Sopenharmony_ci if (r) 3088c2ecf20Sopenharmony_ci return r; 3098c2ecf20Sopenharmony_ci r = rv370_pcie_gart_init(rdev); 3108c2ecf20Sopenharmony_ci if (r) 3118c2ecf20Sopenharmony_ci return r; 3128c2ecf20Sopenharmony_ci rv515_set_safe_registers(rdev); 3138c2ecf20Sopenharmony_ci 3148c2ecf20Sopenharmony_ci /* Initialize power management */ 3158c2ecf20Sopenharmony_ci radeon_pm_init(rdev); 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_ci rdev->accel_working = true; 3188c2ecf20Sopenharmony_ci r = r520_startup(rdev); 3198c2ecf20Sopenharmony_ci if (r) { 3208c2ecf20Sopenharmony_ci /* Somethings want wront with the accel init stop accel */ 3218c2ecf20Sopenharmony_ci dev_err(rdev->dev, "Disabling GPU acceleration\n"); 3228c2ecf20Sopenharmony_ci r100_cp_fini(rdev); 3238c2ecf20Sopenharmony_ci radeon_wb_fini(rdev); 3248c2ecf20Sopenharmony_ci radeon_ib_pool_fini(rdev); 3258c2ecf20Sopenharmony_ci radeon_irq_kms_fini(rdev); 3268c2ecf20Sopenharmony_ci rv370_pcie_gart_fini(rdev); 3278c2ecf20Sopenharmony_ci radeon_agp_fini(rdev); 3288c2ecf20Sopenharmony_ci rdev->accel_working = false; 3298c2ecf20Sopenharmony_ci } 3308c2ecf20Sopenharmony_ci return 0; 3318c2ecf20Sopenharmony_ci} 332