| Jerome Glisse | 771fe6b | 2009-06-05 14:42:42 +0200 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright 2008 Advanced Micro Devices, Inc. | 
 | 3 |  * Copyright 2008 Red Hat Inc. | 
 | 4 |  * Copyright 2009 Jerome Glisse. | 
 | 5 |  * | 
 | 6 |  * Permission is hereby granted, free of charge, to any person obtaining a | 
 | 7 |  * copy of this software and associated documentation files (the "Software"), | 
 | 8 |  * to deal in the Software without restriction, including without limitation | 
 | 9 |  * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 
 | 10 |  * and/or sell copies of the Software, and to permit persons to whom the | 
 | 11 |  * Software is furnished to do so, subject to the following conditions: | 
 | 12 |  * | 
 | 13 |  * The above copyright notice and this permission notice shall be included in | 
 | 14 |  * all copies or substantial portions of the Software. | 
 | 15 |  * | 
 | 16 |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
 | 17 |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
 | 18 |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL | 
 | 19 |  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | 
 | 20 |  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | 
 | 21 |  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | 
 | 22 |  * OTHER DEALINGS IN THE SOFTWARE. | 
 | 23 |  * | 
 | 24 |  * Authors: Dave Airlie | 
 | 25 |  *          Alex Deucher | 
 | 26 |  *          Jerome Glisse | 
 | 27 |  */ | 
 | 28 | #include "drmP.h" | 
| Jerome Glisse | 771fe6b | 2009-06-05 14:42:42 +0200 | [diff] [blame] | 29 | #include "radeon.h" | 
| Daniel Vetter | e699037 | 2010-03-11 21:19:17 +0000 | [diff] [blame] | 30 | #include "radeon_asic.h" | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 31 | #include "atom.h" | 
 | 32 | #include "r520d.h" | 
| Jerome Glisse | 771fe6b | 2009-06-05 14:42:42 +0200 | [diff] [blame] | 33 |  | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 34 | /* This files gather functions specifics to: r520,rv530,rv560,rv570,r580 */ | 
| Jerome Glisse | 771fe6b | 2009-06-05 14:42:42 +0200 | [diff] [blame] | 35 |  | 
| Alex Deucher | 89e5181 | 2012-02-23 17:53:38 -0500 | [diff] [blame] | 36 | int r520_mc_wait_for_idle(struct radeon_device *rdev) | 
| Jerome Glisse | 771fe6b | 2009-06-05 14:42:42 +0200 | [diff] [blame] | 37 | { | 
 | 38 | 	unsigned i; | 
 | 39 | 	uint32_t tmp; | 
 | 40 |  | 
 | 41 | 	for (i = 0; i < rdev->usec_timeout; i++) { | 
 | 42 | 		/* read MC_STATUS */ | 
 | 43 | 		tmp = RREG32_MC(R520_MC_STATUS); | 
 | 44 | 		if (tmp & R520_MC_STATUS_IDLE) { | 
 | 45 | 			return 0; | 
 | 46 | 		} | 
 | 47 | 		DRM_UDELAY(1); | 
 | 48 | 	} | 
 | 49 | 	return -1; | 
 | 50 | } | 
 | 51 |  | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 52 | static void r520_gpu_init(struct radeon_device *rdev) | 
| Jerome Glisse | 771fe6b | 2009-06-05 14:42:42 +0200 | [diff] [blame] | 53 | { | 
 | 54 | 	unsigned pipe_select_current, gb_pipe_select, tmp; | 
 | 55 |  | 
| Jerome Glisse | d39c3b8 | 2009-09-28 18:34:43 +0200 | [diff] [blame] | 56 | 	rv515_vga_render_disable(rdev); | 
| Jerome Glisse | 771fe6b | 2009-06-05 14:42:42 +0200 | [diff] [blame] | 57 | 	/* | 
 | 58 | 	 * DST_PIPE_CONFIG		0x170C | 
 | 59 | 	 * GB_TILE_CONFIG		0x4018 | 
 | 60 | 	 * GB_FIFO_SIZE			0x4024 | 
 | 61 | 	 * GB_PIPE_SELECT		0x402C | 
 | 62 | 	 * GB_PIPE_SELECT2              0x4124 | 
 | 63 | 	 *	Z_PIPE_SHIFT			0 | 
 | 64 | 	 *	Z_PIPE_MASK			0x000000003 | 
 | 65 | 	 * GB_FIFO_SIZE2                0x4128 | 
 | 66 | 	 *	SC_SFIFO_SIZE_SHIFT		0 | 
 | 67 | 	 *	SC_SFIFO_SIZE_MASK		0x000000003 | 
 | 68 | 	 *	SC_MFIFO_SIZE_SHIFT		2 | 
 | 69 | 	 *	SC_MFIFO_SIZE_MASK		0x00000000C | 
 | 70 | 	 *	FG_SFIFO_SIZE_SHIFT		4 | 
 | 71 | 	 *	FG_SFIFO_SIZE_MASK		0x000000030 | 
 | 72 | 	 *	ZB_MFIFO_SIZE_SHIFT		6 | 
 | 73 | 	 *	ZB_MFIFO_SIZE_MASK		0x0000000C0 | 
 | 74 | 	 * GA_ENHANCE			0x4274 | 
 | 75 | 	 * SU_REG_DEST			0x42C8 | 
 | 76 | 	 */ | 
 | 77 | 	/* workaround for RV530 */ | 
 | 78 | 	if (rdev->family == CHIP_RV530) { | 
| Jerome Glisse | 771fe6b | 2009-06-05 14:42:42 +0200 | [diff] [blame] | 79 | 		WREG32(0x4128, 0xFF); | 
 | 80 | 	} | 
 | 81 | 	r420_pipes_init(rdev); | 
| Alex Deucher | d75ee3b | 2011-01-24 23:24:59 -0500 | [diff] [blame] | 82 | 	gb_pipe_select = RREG32(R400_GB_PIPE_SELECT); | 
 | 83 | 	tmp = RREG32(R300_DST_PIPE_CONFIG); | 
| Jerome Glisse | 771fe6b | 2009-06-05 14:42:42 +0200 | [diff] [blame] | 84 | 	pipe_select_current = (tmp >> 2) & 3; | 
 | 85 | 	tmp = (1 << pipe_select_current) | | 
 | 86 | 	      (((gb_pipe_select >> 8) & 0xF) << 4); | 
 | 87 | 	WREG32_PLL(0x000D, tmp); | 
 | 88 | 	if (r520_mc_wait_for_idle(rdev)) { | 
 | 89 | 		printk(KERN_WARNING "Failed to wait MC idle while " | 
 | 90 | 		       "programming pipes. Bad things might happen.\n"); | 
 | 91 | 	} | 
 | 92 | } | 
 | 93 |  | 
| Jerome Glisse | 771fe6b | 2009-06-05 14:42:42 +0200 | [diff] [blame] | 94 | static void r520_vram_get_type(struct radeon_device *rdev) | 
 | 95 | { | 
 | 96 | 	uint32_t tmp; | 
 | 97 |  | 
 | 98 | 	rdev->mc.vram_width = 128; | 
 | 99 | 	rdev->mc.vram_is_ddr = true; | 
 | 100 | 	tmp = RREG32_MC(R520_MC_CNTL0); | 
 | 101 | 	switch ((tmp & R520_MEM_NUM_CHANNELS_MASK) >> R520_MEM_NUM_CHANNELS_SHIFT) { | 
 | 102 | 	case 0: | 
 | 103 | 		rdev->mc.vram_width = 32; | 
 | 104 | 		break; | 
 | 105 | 	case 1: | 
 | 106 | 		rdev->mc.vram_width = 64; | 
 | 107 | 		break; | 
 | 108 | 	case 2: | 
 | 109 | 		rdev->mc.vram_width = 128; | 
 | 110 | 		break; | 
 | 111 | 	case 3: | 
 | 112 | 		rdev->mc.vram_width = 256; | 
 | 113 | 		break; | 
 | 114 | 	default: | 
 | 115 | 		rdev->mc.vram_width = 128; | 
 | 116 | 		break; | 
 | 117 | 	} | 
 | 118 | 	if (tmp & R520_MC_CHANNEL_SIZE) | 
 | 119 | 		rdev->mc.vram_width *= 2; | 
 | 120 | } | 
 | 121 |  | 
| Jerome Glisse | d594e46 | 2010-02-17 21:54:29 +0000 | [diff] [blame] | 122 | void r520_mc_init(struct radeon_device *rdev) | 
| Jerome Glisse | 771fe6b | 2009-06-05 14:42:42 +0200 | [diff] [blame] | 123 | { | 
| Jerome Glisse | c93bb85 | 2009-07-13 21:04:08 +0200 | [diff] [blame] | 124 |  | 
| Jerome Glisse | 771fe6b | 2009-06-05 14:42:42 +0200 | [diff] [blame] | 125 | 	r520_vram_get_type(rdev); | 
| Dave Airlie | 2a0f891 | 2009-07-11 04:44:47 +1000 | [diff] [blame] | 126 | 	r100_vram_init_sizes(rdev); | 
| Jerome Glisse | d594e46 | 2010-02-17 21:54:29 +0000 | [diff] [blame] | 127 | 	radeon_vram_location(rdev, &rdev->mc, 0); | 
| Alex Deucher | 8d369bb | 2010-07-15 10:51:10 -0400 | [diff] [blame] | 128 | 	rdev->mc.gtt_base_align = 0; | 
| Jerome Glisse | d594e46 | 2010-02-17 21:54:29 +0000 | [diff] [blame] | 129 | 	if (!(rdev->flags & RADEON_IS_AGP)) | 
 | 130 | 		radeon_gtt_location(rdev, &rdev->mc); | 
| Alex Deucher | f47299c | 2010-03-16 20:54:38 -0400 | [diff] [blame] | 131 | 	radeon_update_bandwidth_info(rdev); | 
| Jerome Glisse | c93bb85 | 2009-07-13 21:04:08 +0200 | [diff] [blame] | 132 | } | 
 | 133 |  | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 134 | void r520_mc_program(struct radeon_device *rdev) | 
| Jerome Glisse | c93bb85 | 2009-07-13 21:04:08 +0200 | [diff] [blame] | 135 | { | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 136 | 	struct rv515_mc_save save; | 
 | 137 |  | 
 | 138 | 	/* Stops all mc clients */ | 
 | 139 | 	rv515_mc_stop(rdev, &save); | 
 | 140 |  | 
 | 141 | 	/* Wait for mc idle */ | 
 | 142 | 	if (r520_mc_wait_for_idle(rdev)) | 
 | 143 | 		dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); | 
 | 144 | 	/* Write VRAM size in case we are limiting it */ | 
 | 145 | 	WREG32(R_0000F8_CONFIG_MEMSIZE, rdev->mc.real_vram_size); | 
 | 146 | 	/* Program MC, should be a 32bits limited address space */ | 
 | 147 | 	WREG32_MC(R_000004_MC_FB_LOCATION, | 
 | 148 | 			S_000004_MC_FB_START(rdev->mc.vram_start >> 16) | | 
 | 149 | 			S_000004_MC_FB_TOP(rdev->mc.vram_end >> 16)); | 
 | 150 | 	WREG32(R_000134_HDP_FB_LOCATION, | 
 | 151 | 		S_000134_HDP_FB_START(rdev->mc.vram_start >> 16)); | 
 | 152 | 	if (rdev->flags & RADEON_IS_AGP) { | 
 | 153 | 		WREG32_MC(R_000005_MC_AGP_LOCATION, | 
 | 154 | 			S_000005_MC_AGP_START(rdev->mc.gtt_start >> 16) | | 
 | 155 | 			S_000005_MC_AGP_TOP(rdev->mc.gtt_end >> 16)); | 
 | 156 | 		WREG32_MC(R_000006_AGP_BASE, lower_32_bits(rdev->mc.agp_base)); | 
 | 157 | 		WREG32_MC(R_000007_AGP_BASE_2, | 
 | 158 | 			S_000007_AGP_BASE_ADDR_2(upper_32_bits(rdev->mc.agp_base))); | 
 | 159 | 	} else { | 
 | 160 | 		WREG32_MC(R_000005_MC_AGP_LOCATION, 0xFFFFFFFF); | 
 | 161 | 		WREG32_MC(R_000006_AGP_BASE, 0); | 
 | 162 | 		WREG32_MC(R_000007_AGP_BASE_2, 0); | 
 | 163 | 	} | 
 | 164 |  | 
 | 165 | 	rv515_mc_resume(rdev, &save); | 
 | 166 | } | 
 | 167 |  | 
 | 168 | static int r520_startup(struct radeon_device *rdev) | 
 | 169 | { | 
 | 170 | 	int r; | 
 | 171 |  | 
 | 172 | 	r520_mc_program(rdev); | 
 | 173 | 	/* Resume clock */ | 
 | 174 | 	rv515_clock_startup(rdev); | 
 | 175 | 	/* Initialize GPU configuration (# pipes, ...) */ | 
 | 176 | 	r520_gpu_init(rdev); | 
 | 177 | 	/* Initialize GART (initialize after TTM so we can allocate | 
 | 178 | 	 * memory through TTM but finalize after TTM) */ | 
 | 179 | 	if (rdev->flags & RADEON_IS_PCIE) { | 
 | 180 | 		r = rv370_pcie_gart_enable(rdev); | 
 | 181 | 		if (r) | 
 | 182 | 			return r; | 
 | 183 | 	} | 
| Alex Deucher | 724c80e | 2010-08-27 18:25:25 -0400 | [diff] [blame] | 184 |  | 
 | 185 | 	/* allocate wb buffer */ | 
 | 186 | 	r = radeon_wb_init(rdev); | 
 | 187 | 	if (r) | 
 | 188 | 		return r; | 
 | 189 |  | 
| Jerome Glisse | 30eb77f | 2011-11-20 20:45:34 +0000 | [diff] [blame] | 190 | 	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX); | 
 | 191 | 	if (r) { | 
 | 192 | 		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); | 
 | 193 | 		return r; | 
 | 194 | 	} | 
 | 195 |  | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 196 | 	/* Enable IRQ */ | 
| Jerome Glisse | ac447df | 2009-09-30 22:18:43 +0200 | [diff] [blame] | 197 | 	rs600_irq_set(rdev); | 
| Jerome Glisse | cafe660 | 2010-01-07 12:39:21 +0100 | [diff] [blame] | 198 | 	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 199 | 	/* 1M ring buffer */ | 
 | 200 | 	r = r100_cp_init(rdev, 1024 * 1024); | 
 | 201 | 	if (r) { | 
| Paul Bolle | ec4f2ac | 2011-01-28 23:32:04 +0100 | [diff] [blame] | 202 | 		dev_err(rdev->dev, "failed initializing CP (%d).\n", r); | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 203 | 		return r; | 
 | 204 | 	} | 
| Jerome Glisse | b15ba51 | 2011-11-15 11:48:34 -0500 | [diff] [blame] | 205 |  | 
 | 206 | 	r = radeon_ib_pool_start(rdev); | 
 | 207 | 	if (r) | 
 | 208 | 		return r; | 
 | 209 |  | 
| Christian König | 7bd560e | 2012-05-02 15:11:12 +0200 | [diff] [blame] | 210 | 	r = radeon_ib_ring_tests(rdev); | 
 | 211 | 	if (r) | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 212 | 		return r; | 
| Christian König | 7bd560e | 2012-05-02 15:11:12 +0200 | [diff] [blame] | 213 |  | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 214 | 	return 0; | 
 | 215 | } | 
 | 216 |  | 
 | 217 | int r520_resume(struct radeon_device *rdev) | 
 | 218 | { | 
| Jerome Glisse | 6b7746e | 2012-02-20 17:57:20 -0500 | [diff] [blame] | 219 | 	int r; | 
 | 220 |  | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 221 | 	/* Make sur GART are not working */ | 
 | 222 | 	if (rdev->flags & RADEON_IS_PCIE) | 
 | 223 | 		rv370_pcie_gart_disable(rdev); | 
 | 224 | 	/* Resume clock before doing reset */ | 
 | 225 | 	rv515_clock_startup(rdev); | 
 | 226 | 	/* Reset gpu before posting otherwise ATOM will enter infinite loop */ | 
| Jerome Glisse | a2d07b7 | 2010-03-09 14:45:11 +0000 | [diff] [blame] | 227 | 	if (radeon_asic_reset(rdev)) { | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 228 | 		dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | 
 | 229 | 			RREG32(R_000E40_RBBM_STATUS), | 
 | 230 | 			RREG32(R_0007C0_CP_STAT)); | 
 | 231 | 	} | 
 | 232 | 	/* post */ | 
 | 233 | 	atom_asic_init(rdev->mode_info.atom_context); | 
 | 234 | 	/* Resume clock after posting */ | 
 | 235 | 	rv515_clock_startup(rdev); | 
| Dave Airlie | 550e2d9 | 2009-12-09 14:15:38 +1000 | [diff] [blame] | 236 | 	/* Initialize surface registers */ | 
 | 237 | 	radeon_surface_init(rdev); | 
| Jerome Glisse | b15ba51 | 2011-11-15 11:48:34 -0500 | [diff] [blame] | 238 |  | 
 | 239 | 	rdev->accel_working = true; | 
| Jerome Glisse | 6b7746e | 2012-02-20 17:57:20 -0500 | [diff] [blame] | 240 | 	r = r520_startup(rdev); | 
 | 241 | 	if (r) { | 
 | 242 | 		rdev->accel_working = false; | 
 | 243 | 	} | 
 | 244 | 	return r; | 
| Jerome Glisse | 771fe6b | 2009-06-05 14:42:42 +0200 | [diff] [blame] | 245 | } | 
| Jerome Glisse | d39c3b8 | 2009-09-28 18:34:43 +0200 | [diff] [blame] | 246 |  | 
 | 247 | int r520_init(struct radeon_device *rdev) | 
 | 248 | { | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 249 | 	int r; | 
 | 250 |  | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 251 | 	/* Initialize scratch registers */ | 
 | 252 | 	radeon_scratch_init(rdev); | 
 | 253 | 	/* Initialize surface registers */ | 
 | 254 | 	radeon_surface_init(rdev); | 
| Dave Airlie | 4c712e6 | 2010-07-15 12:13:50 +1000 | [diff] [blame] | 255 | 	/* restore some register to sane defaults */ | 
 | 256 | 	r100_restore_sanity(rdev); | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 257 | 	/* TODO: disable VGA need to use VGA request */ | 
 | 258 | 	/* BIOS*/ | 
 | 259 | 	if (!radeon_get_bios(rdev)) { | 
 | 260 | 		if (ASIC_IS_AVIVO(rdev)) | 
 | 261 | 			return -EINVAL; | 
 | 262 | 	} | 
 | 263 | 	if (rdev->is_atom_bios) { | 
 | 264 | 		r = radeon_atombios_init(rdev); | 
 | 265 | 		if (r) | 
 | 266 | 			return r; | 
 | 267 | 	} else { | 
 | 268 | 		dev_err(rdev->dev, "Expecting atombios for RV515 GPU\n"); | 
 | 269 | 		return -EINVAL; | 
 | 270 | 	} | 
 | 271 | 	/* Reset gpu before posting otherwise ATOM will enter infinite loop */ | 
| Jerome Glisse | a2d07b7 | 2010-03-09 14:45:11 +0000 | [diff] [blame] | 272 | 	if (radeon_asic_reset(rdev)) { | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 273 | 		dev_warn(rdev->dev, | 
 | 274 | 			"GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | 
 | 275 | 			RREG32(R_000E40_RBBM_STATUS), | 
 | 276 | 			RREG32(R_0007C0_CP_STAT)); | 
 | 277 | 	} | 
 | 278 | 	/* check if cards are posted or not */ | 
| Dave Airlie | 72542d7 | 2009-12-01 14:06:31 +1000 | [diff] [blame] | 279 | 	if (radeon_boot_test_post_card(rdev) == false) | 
 | 280 | 		return -EINVAL; | 
 | 281 |  | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 282 | 	if (!radeon_card_posted(rdev) && rdev->bios) { | 
 | 283 | 		DRM_INFO("GPU not posted. posting now...\n"); | 
 | 284 | 		atom_asic_init(rdev->mode_info.atom_context); | 
 | 285 | 	} | 
 | 286 | 	/* Initialize clocks */ | 
 | 287 | 	radeon_get_clock_info(rdev->ddev); | 
| Jerome Glisse | d594e46 | 2010-02-17 21:54:29 +0000 | [diff] [blame] | 288 | 	/* initialize AGP */ | 
 | 289 | 	if (rdev->flags & RADEON_IS_AGP) { | 
 | 290 | 		r = radeon_agp_init(rdev); | 
 | 291 | 		if (r) { | 
 | 292 | 			radeon_agp_disable(rdev); | 
 | 293 | 		} | 
 | 294 | 	} | 
 | 295 | 	/* initialize memory controller */ | 
 | 296 | 	r520_mc_init(rdev); | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 297 | 	rv515_debugfs(rdev); | 
 | 298 | 	/* Fence driver */ | 
| Jerome Glisse | 30eb77f | 2011-11-20 20:45:34 +0000 | [diff] [blame] | 299 | 	r = radeon_fence_driver_init(rdev); | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 300 | 	if (r) | 
 | 301 | 		return r; | 
 | 302 | 	r = radeon_irq_kms_init(rdev); | 
 | 303 | 	if (r) | 
 | 304 | 		return r; | 
 | 305 | 	/* Memory manager */ | 
| Jerome Glisse | 4c78867 | 2009-11-20 14:29:23 +0100 | [diff] [blame] | 306 | 	r = radeon_bo_init(rdev); | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 307 | 	if (r) | 
 | 308 | 		return r; | 
 | 309 | 	r = rv370_pcie_gart_init(rdev); | 
 | 310 | 	if (r) | 
 | 311 | 		return r; | 
| Jerome Glisse | d39c3b8 | 2009-09-28 18:34:43 +0200 | [diff] [blame] | 312 | 	rv515_set_safe_registers(rdev); | 
| Jerome Glisse | b15ba51 | 2011-11-15 11:48:34 -0500 | [diff] [blame] | 313 |  | 
 | 314 | 	r = radeon_ib_pool_init(rdev); | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 315 | 	rdev->accel_working = true; | 
| Jerome Glisse | b15ba51 | 2011-11-15 11:48:34 -0500 | [diff] [blame] | 316 | 	if (r) { | 
 | 317 | 		dev_err(rdev->dev, "IB initialization failed (%d).\n", r); | 
 | 318 | 		rdev->accel_working = false; | 
 | 319 | 	} | 
 | 320 |  | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 321 | 	r = r520_startup(rdev); | 
 | 322 | 	if (r) { | 
 | 323 | 		/* Somethings want wront with the accel init stop accel */ | 
 | 324 | 		dev_err(rdev->dev, "Disabling GPU acceleration\n"); | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 325 | 		r100_cp_fini(rdev); | 
| Alex Deucher | 724c80e | 2010-08-27 18:25:25 -0400 | [diff] [blame] | 326 | 		radeon_wb_fini(rdev); | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 327 | 		r100_ib_fini(rdev); | 
| Jerome Glisse | 655efd3 | 2010-02-02 11:51:45 +0100 | [diff] [blame] | 328 | 		radeon_irq_kms_fini(rdev); | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 329 | 		rv370_pcie_gart_fini(rdev); | 
 | 330 | 		radeon_agp_fini(rdev); | 
| Jerome Glisse | f0ed1f6 | 2009-09-28 20:39:19 +0200 | [diff] [blame] | 331 | 		rdev->accel_working = false; | 
 | 332 | 	} | 
| Jerome Glisse | d39c3b8 | 2009-09-28 18:34:43 +0200 | [diff] [blame] | 333 | 	return 0; | 
 | 334 | } |