Linux Audio

Check our new training course

Loading...
v3.1
   1/*
   2 * Copyright 2010 Advanced Micro Devices, Inc.
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice shall be included in
  12 * all copies or substantial portions of the Software.
  13 *
  14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20 * OTHER DEALINGS IN THE SOFTWARE.
  21 *
  22 * Authors: Alex Deucher
  23 */
  24#include <linux/firmware.h>
  25#include <linux/platform_device.h>
  26#include <linux/slab.h>
  27#include "drmP.h"
 
  28#include "radeon.h"
  29#include "radeon_asic.h"
  30#include "radeon_drm.h"
 
  31#include "nid.h"
  32#include "atom.h"
  33#include "ni_reg.h"
  34#include "cayman_blit_shaders.h"
 
 
  35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  36extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
  37extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
  38extern int evergreen_mc_wait_for_idle(struct radeon_device *rdev);
  39extern void evergreen_mc_program(struct radeon_device *rdev);
  40extern void evergreen_irq_suspend(struct radeon_device *rdev);
  41extern int evergreen_mc_init(struct radeon_device *rdev);
  42extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
  43
  44#define EVERGREEN_PFP_UCODE_SIZE 1120
  45#define EVERGREEN_PM4_UCODE_SIZE 1376
  46#define EVERGREEN_RLC_UCODE_SIZE 768
  47#define BTC_MC_UCODE_SIZE 6024
  48
  49#define CAYMAN_PFP_UCODE_SIZE 2176
  50#define CAYMAN_PM4_UCODE_SIZE 2176
  51#define CAYMAN_RLC_UCODE_SIZE 1024
  52#define CAYMAN_MC_UCODE_SIZE 6037
  53
  54/* Firmware Names */
  55MODULE_FIRMWARE("radeon/BARTS_pfp.bin");
  56MODULE_FIRMWARE("radeon/BARTS_me.bin");
  57MODULE_FIRMWARE("radeon/BARTS_mc.bin");
 
  58MODULE_FIRMWARE("radeon/BTC_rlc.bin");
  59MODULE_FIRMWARE("radeon/TURKS_pfp.bin");
  60MODULE_FIRMWARE("radeon/TURKS_me.bin");
  61MODULE_FIRMWARE("radeon/TURKS_mc.bin");
 
  62MODULE_FIRMWARE("radeon/CAICOS_pfp.bin");
  63MODULE_FIRMWARE("radeon/CAICOS_me.bin");
  64MODULE_FIRMWARE("radeon/CAICOS_mc.bin");
 
  65MODULE_FIRMWARE("radeon/CAYMAN_pfp.bin");
  66MODULE_FIRMWARE("radeon/CAYMAN_me.bin");
  67MODULE_FIRMWARE("radeon/CAYMAN_mc.bin");
  68MODULE_FIRMWARE("radeon/CAYMAN_rlc.bin");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  69
  70#define BTC_IO_MC_REGS_SIZE 29
  71
  72static const u32 barts_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
  73	{0x00000077, 0xff010100},
  74	{0x00000078, 0x00000000},
  75	{0x00000079, 0x00001434},
  76	{0x0000007a, 0xcc08ec08},
  77	{0x0000007b, 0x00040000},
  78	{0x0000007c, 0x000080c0},
  79	{0x0000007d, 0x09000000},
  80	{0x0000007e, 0x00210404},
  81	{0x00000081, 0x08a8e800},
  82	{0x00000082, 0x00030444},
  83	{0x00000083, 0x00000000},
  84	{0x00000085, 0x00000001},
  85	{0x00000086, 0x00000002},
  86	{0x00000087, 0x48490000},
  87	{0x00000088, 0x20244647},
  88	{0x00000089, 0x00000005},
  89	{0x0000008b, 0x66030000},
  90	{0x0000008c, 0x00006603},
  91	{0x0000008d, 0x00000100},
  92	{0x0000008f, 0x00001c0a},
  93	{0x00000090, 0xff000001},
  94	{0x00000094, 0x00101101},
  95	{0x00000095, 0x00000fff},
  96	{0x00000096, 0x00116fff},
  97	{0x00000097, 0x60010000},
  98	{0x00000098, 0x10010000},
  99	{0x00000099, 0x00006000},
 100	{0x0000009a, 0x00001000},
 101	{0x0000009f, 0x00946a00}
 102};
 103
 104static const u32 turks_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
 105	{0x00000077, 0xff010100},
 106	{0x00000078, 0x00000000},
 107	{0x00000079, 0x00001434},
 108	{0x0000007a, 0xcc08ec08},
 109	{0x0000007b, 0x00040000},
 110	{0x0000007c, 0x000080c0},
 111	{0x0000007d, 0x09000000},
 112	{0x0000007e, 0x00210404},
 113	{0x00000081, 0x08a8e800},
 114	{0x00000082, 0x00030444},
 115	{0x00000083, 0x00000000},
 116	{0x00000085, 0x00000001},
 117	{0x00000086, 0x00000002},
 118	{0x00000087, 0x48490000},
 119	{0x00000088, 0x20244647},
 120	{0x00000089, 0x00000005},
 121	{0x0000008b, 0x66030000},
 122	{0x0000008c, 0x00006603},
 123	{0x0000008d, 0x00000100},
 124	{0x0000008f, 0x00001c0a},
 125	{0x00000090, 0xff000001},
 126	{0x00000094, 0x00101101},
 127	{0x00000095, 0x00000fff},
 128	{0x00000096, 0x00116fff},
 129	{0x00000097, 0x60010000},
 130	{0x00000098, 0x10010000},
 131	{0x00000099, 0x00006000},
 132	{0x0000009a, 0x00001000},
 133	{0x0000009f, 0x00936a00}
 134};
 135
 136static const u32 caicos_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
 137	{0x00000077, 0xff010100},
 138	{0x00000078, 0x00000000},
 139	{0x00000079, 0x00001434},
 140	{0x0000007a, 0xcc08ec08},
 141	{0x0000007b, 0x00040000},
 142	{0x0000007c, 0x000080c0},
 143	{0x0000007d, 0x09000000},
 144	{0x0000007e, 0x00210404},
 145	{0x00000081, 0x08a8e800},
 146	{0x00000082, 0x00030444},
 147	{0x00000083, 0x00000000},
 148	{0x00000085, 0x00000001},
 149	{0x00000086, 0x00000002},
 150	{0x00000087, 0x48490000},
 151	{0x00000088, 0x20244647},
 152	{0x00000089, 0x00000005},
 153	{0x0000008b, 0x66030000},
 154	{0x0000008c, 0x00006603},
 155	{0x0000008d, 0x00000100},
 156	{0x0000008f, 0x00001c0a},
 157	{0x00000090, 0xff000001},
 158	{0x00000094, 0x00101101},
 159	{0x00000095, 0x00000fff},
 160	{0x00000096, 0x00116fff},
 161	{0x00000097, 0x60010000},
 162	{0x00000098, 0x10010000},
 163	{0x00000099, 0x00006000},
 164	{0x0000009a, 0x00001000},
 165	{0x0000009f, 0x00916a00}
 166};
 167
 168static const u32 cayman_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
 169	{0x00000077, 0xff010100},
 170	{0x00000078, 0x00000000},
 171	{0x00000079, 0x00001434},
 172	{0x0000007a, 0xcc08ec08},
 173	{0x0000007b, 0x00040000},
 174	{0x0000007c, 0x000080c0},
 175	{0x0000007d, 0x09000000},
 176	{0x0000007e, 0x00210404},
 177	{0x00000081, 0x08a8e800},
 178	{0x00000082, 0x00030444},
 179	{0x00000083, 0x00000000},
 180	{0x00000085, 0x00000001},
 181	{0x00000086, 0x00000002},
 182	{0x00000087, 0x48490000},
 183	{0x00000088, 0x20244647},
 184	{0x00000089, 0x00000005},
 185	{0x0000008b, 0x66030000},
 186	{0x0000008c, 0x00006603},
 187	{0x0000008d, 0x00000100},
 188	{0x0000008f, 0x00001c0a},
 189	{0x00000090, 0xff000001},
 190	{0x00000094, 0x00101101},
 191	{0x00000095, 0x00000fff},
 192	{0x00000096, 0x00116fff},
 193	{0x00000097, 0x60010000},
 194	{0x00000098, 0x10010000},
 195	{0x00000099, 0x00006000},
 196	{0x0000009a, 0x00001000},
 197	{0x0000009f, 0x00976b00}
 198};
 199
 200int ni_mc_load_microcode(struct radeon_device *rdev)
 201{
 202	const __be32 *fw_data;
 203	u32 mem_type, running, blackout = 0;
 204	u32 *io_mc_regs;
 205	int i, ucode_size, regs_size;
 206
 207	if (!rdev->mc_fw)
 208		return -EINVAL;
 209
 210	switch (rdev->family) {
 211	case CHIP_BARTS:
 212		io_mc_regs = (u32 *)&barts_io_mc_regs;
 213		ucode_size = BTC_MC_UCODE_SIZE;
 214		regs_size = BTC_IO_MC_REGS_SIZE;
 215		break;
 216	case CHIP_TURKS:
 217		io_mc_regs = (u32 *)&turks_io_mc_regs;
 218		ucode_size = BTC_MC_UCODE_SIZE;
 219		regs_size = BTC_IO_MC_REGS_SIZE;
 220		break;
 221	case CHIP_CAICOS:
 222	default:
 223		io_mc_regs = (u32 *)&caicos_io_mc_regs;
 224		ucode_size = BTC_MC_UCODE_SIZE;
 225		regs_size = BTC_IO_MC_REGS_SIZE;
 226		break;
 227	case CHIP_CAYMAN:
 228		io_mc_regs = (u32 *)&cayman_io_mc_regs;
 229		ucode_size = CAYMAN_MC_UCODE_SIZE;
 230		regs_size = BTC_IO_MC_REGS_SIZE;
 231		break;
 232	}
 233
 234	mem_type = (RREG32(MC_SEQ_MISC0) & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT;
 235	running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
 236
 237	if ((mem_type == MC_SEQ_MISC0_GDDR5_VALUE) && (running == 0)) {
 238		if (running) {
 239			blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
 240			WREG32(MC_SHARED_BLACKOUT_CNTL, 1);
 241		}
 242
 243		/* reset the engine and set to writable */
 244		WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
 245		WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
 246
 247		/* load mc io regs */
 248		for (i = 0; i < regs_size; i++) {
 249			WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
 250			WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
 251		}
 252		/* load the MC ucode */
 253		fw_data = (const __be32 *)rdev->mc_fw->data;
 254		for (i = 0; i < ucode_size; i++)
 255			WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
 256
 257		/* put the engine back into the active state */
 258		WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
 259		WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
 260		WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
 261
 262		/* wait for training to complete */
 263		while (!(RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD))
 264			udelay(10);
 
 
 
 265
 266		if (running)
 267			WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
 268	}
 269
 270	return 0;
 271}
 272
 273int ni_init_microcode(struct radeon_device *rdev)
 274{
 275	struct platform_device *pdev;
 276	const char *chip_name;
 277	const char *rlc_chip_name;
 278	size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size;
 
 279	char fw_name[30];
 280	int err;
 281
 282	DRM_DEBUG("\n");
 283
 284	pdev = platform_device_register_simple("radeon_cp", 0, NULL, 0);
 285	err = IS_ERR(pdev);
 286	if (err) {
 287		printk(KERN_ERR "radeon_cp: Failed to register firmware\n");
 288		return -EINVAL;
 289	}
 290
 291	switch (rdev->family) {
 292	case CHIP_BARTS:
 293		chip_name = "BARTS";
 294		rlc_chip_name = "BTC";
 295		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
 296		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
 297		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
 298		mc_req_size = BTC_MC_UCODE_SIZE * 4;
 
 299		break;
 300	case CHIP_TURKS:
 301		chip_name = "TURKS";
 302		rlc_chip_name = "BTC";
 303		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
 304		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
 305		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
 306		mc_req_size = BTC_MC_UCODE_SIZE * 4;
 
 307		break;
 308	case CHIP_CAICOS:
 309		chip_name = "CAICOS";
 310		rlc_chip_name = "BTC";
 311		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
 312		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
 313		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
 314		mc_req_size = BTC_MC_UCODE_SIZE * 4;
 
 315		break;
 316	case CHIP_CAYMAN:
 317		chip_name = "CAYMAN";
 318		rlc_chip_name = "CAYMAN";
 319		pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
 320		me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
 321		rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4;
 322		mc_req_size = CAYMAN_MC_UCODE_SIZE * 4;
 
 
 
 
 
 
 
 
 
 
 323		break;
 324	default: BUG();
 325	}
 326
 327	DRM_INFO("Loading %s Microcode\n", chip_name);
 328
 329	snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
 330	err = request_firmware(&rdev->pfp_fw, fw_name, &pdev->dev);
 331	if (err)
 332		goto out;
 333	if (rdev->pfp_fw->size != pfp_req_size) {
 334		printk(KERN_ERR
 335		       "ni_cp: Bogus length %zu in firmware \"%s\"\n",
 336		       rdev->pfp_fw->size, fw_name);
 337		err = -EINVAL;
 338		goto out;
 339	}
 340
 341	snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
 342	err = request_firmware(&rdev->me_fw, fw_name, &pdev->dev);
 343	if (err)
 344		goto out;
 345	if (rdev->me_fw->size != me_req_size) {
 346		printk(KERN_ERR
 347		       "ni_cp: Bogus length %zu in firmware \"%s\"\n",
 348		       rdev->me_fw->size, fw_name);
 349		err = -EINVAL;
 350	}
 351
 352	snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
 353	err = request_firmware(&rdev->rlc_fw, fw_name, &pdev->dev);
 354	if (err)
 355		goto out;
 356	if (rdev->rlc_fw->size != rlc_req_size) {
 357		printk(KERN_ERR
 358		       "ni_rlc: Bogus length %zu in firmware \"%s\"\n",
 359		       rdev->rlc_fw->size, fw_name);
 360		err = -EINVAL;
 361	}
 362
 363	snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
 364	err = request_firmware(&rdev->mc_fw, fw_name, &pdev->dev);
 365	if (err)
 366		goto out;
 367	if (rdev->mc_fw->size != mc_req_size) {
 368		printk(KERN_ERR
 369		       "ni_mc: Bogus length %zu in firmware \"%s\"\n",
 370		       rdev->mc_fw->size, fw_name);
 371		err = -EINVAL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 372	}
 373out:
 374	platform_device_unregister(pdev);
 375
 
 376	if (err) {
 377		if (err != -EINVAL)
 378			printk(KERN_ERR
 379			       "ni_cp: Failed to load firmware \"%s\"\n",
 380			       fw_name);
 381		release_firmware(rdev->pfp_fw);
 382		rdev->pfp_fw = NULL;
 383		release_firmware(rdev->me_fw);
 384		rdev->me_fw = NULL;
 385		release_firmware(rdev->rlc_fw);
 386		rdev->rlc_fw = NULL;
 387		release_firmware(rdev->mc_fw);
 388		rdev->mc_fw = NULL;
 389	}
 390	return err;
 391}
 392
 393/*
 394 * Core functions
 
 
 
 
 
 
 
 395 */
 396static u32 cayman_get_tile_pipe_to_backend_map(struct radeon_device *rdev,
 397					       u32 num_tile_pipes,
 398					       u32 num_backends_per_asic,
 399					       u32 *backend_disable_mask_per_asic,
 400					       u32 num_shader_engines)
 401{
 402	u32 backend_map = 0;
 403	u32 enabled_backends_mask = 0;
 404	u32 enabled_backends_count = 0;
 405	u32 num_backends_per_se;
 406	u32 cur_pipe;
 407	u32 swizzle_pipe[CAYMAN_MAX_PIPES];
 408	u32 cur_backend = 0;
 409	u32 i;
 410	bool force_no_swizzle;
 411
 412	/* force legal values */
 413	if (num_tile_pipes < 1)
 414		num_tile_pipes = 1;
 415	if (num_tile_pipes > rdev->config.cayman.max_tile_pipes)
 416		num_tile_pipes = rdev->config.cayman.max_tile_pipes;
 417	if (num_shader_engines < 1)
 418		num_shader_engines = 1;
 419	if (num_shader_engines > rdev->config.cayman.max_shader_engines)
 420		num_shader_engines = rdev->config.cayman.max_shader_engines;
 421	if (num_backends_per_asic < num_shader_engines)
 422		num_backends_per_asic = num_shader_engines;
 423	if (num_backends_per_asic > (rdev->config.cayman.max_backends_per_se * num_shader_engines))
 424		num_backends_per_asic = rdev->config.cayman.max_backends_per_se * num_shader_engines;
 425
 426	/* make sure we have the same number of backends per se */
 427	num_backends_per_asic = ALIGN(num_backends_per_asic, num_shader_engines);
 428	/* set up the number of backends per se */
 429	num_backends_per_se = num_backends_per_asic / num_shader_engines;
 430	if (num_backends_per_se > rdev->config.cayman.max_backends_per_se) {
 431		num_backends_per_se = rdev->config.cayman.max_backends_per_se;
 432		num_backends_per_asic = num_backends_per_se * num_shader_engines;
 433	}
 434
 435	/* create enable mask and count for enabled backends */
 436	for (i = 0; i < CAYMAN_MAX_BACKENDS; ++i) {
 437		if (((*backend_disable_mask_per_asic >> i) & 1) == 0) {
 438			enabled_backends_mask |= (1 << i);
 439			++enabled_backends_count;
 440		}
 441		if (enabled_backends_count == num_backends_per_asic)
 442			break;
 443	}
 444
 445	/* force the backends mask to match the current number of backends */
 446	if (enabled_backends_count != num_backends_per_asic) {
 447		u32 this_backend_enabled;
 448		u32 shader_engine;
 449		u32 backend_per_se;
 450
 451		enabled_backends_mask = 0;
 452		enabled_backends_count = 0;
 453		*backend_disable_mask_per_asic = CAYMAN_MAX_BACKENDS_MASK;
 454		for (i = 0; i < CAYMAN_MAX_BACKENDS; ++i) {
 455			/* calc the current se */
 456			shader_engine = i / rdev->config.cayman.max_backends_per_se;
 457			/* calc the backend per se */
 458			backend_per_se = i % rdev->config.cayman.max_backends_per_se;
 459			/* default to not enabled */
 460			this_backend_enabled = 0;
 461			if ((shader_engine < num_shader_engines) &&
 462			    (backend_per_se < num_backends_per_se))
 463				this_backend_enabled = 1;
 464			if (this_backend_enabled) {
 465				enabled_backends_mask |= (1 << i);
 466				*backend_disable_mask_per_asic &= ~(1 << i);
 467				++enabled_backends_count;
 468			}
 469		}
 470	}
 471
 472
 473	memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * CAYMAN_MAX_PIPES);
 474	switch (rdev->family) {
 475	case CHIP_CAYMAN:
 476		force_no_swizzle = true;
 477		break;
 478	default:
 479		force_no_swizzle = false;
 480		break;
 481	}
 482	if (force_no_swizzle) {
 483		bool last_backend_enabled = false;
 484
 485		force_no_swizzle = false;
 486		for (i = 0; i < CAYMAN_MAX_BACKENDS; ++i) {
 487			if (((enabled_backends_mask >> i) & 1) == 1) {
 488				if (last_backend_enabled)
 489					force_no_swizzle = true;
 490				last_backend_enabled = true;
 491			} else
 492				last_backend_enabled = false;
 493		}
 494	}
 495
 496	switch (num_tile_pipes) {
 497	case 1:
 498	case 3:
 499	case 5:
 500	case 7:
 501		DRM_ERROR("odd number of pipes!\n");
 502		break;
 503	case 2:
 504		swizzle_pipe[0] = 0;
 505		swizzle_pipe[1] = 1;
 506		break;
 507	case 4:
 508		if (force_no_swizzle) {
 509			swizzle_pipe[0] = 0;
 510			swizzle_pipe[1] = 1;
 511			swizzle_pipe[2] = 2;
 512			swizzle_pipe[3] = 3;
 513		} else {
 514			swizzle_pipe[0] = 0;
 515			swizzle_pipe[1] = 2;
 516			swizzle_pipe[2] = 1;
 517			swizzle_pipe[3] = 3;
 518		}
 519		break;
 520	case 6:
 521		if (force_no_swizzle) {
 522			swizzle_pipe[0] = 0;
 523			swizzle_pipe[1] = 1;
 524			swizzle_pipe[2] = 2;
 525			swizzle_pipe[3] = 3;
 526			swizzle_pipe[4] = 4;
 527			swizzle_pipe[5] = 5;
 528		} else {
 529			swizzle_pipe[0] = 0;
 530			swizzle_pipe[1] = 2;
 531			swizzle_pipe[2] = 4;
 532			swizzle_pipe[3] = 1;
 533			swizzle_pipe[4] = 3;
 534			swizzle_pipe[5] = 5;
 535		}
 536		break;
 537	case 8:
 538		if (force_no_swizzle) {
 539			swizzle_pipe[0] = 0;
 540			swizzle_pipe[1] = 1;
 541			swizzle_pipe[2] = 2;
 542			swizzle_pipe[3] = 3;
 543			swizzle_pipe[4] = 4;
 544			swizzle_pipe[5] = 5;
 545			swizzle_pipe[6] = 6;
 546			swizzle_pipe[7] = 7;
 547		} else {
 548			swizzle_pipe[0] = 0;
 549			swizzle_pipe[1] = 2;
 550			swizzle_pipe[2] = 4;
 551			swizzle_pipe[3] = 6;
 552			swizzle_pipe[4] = 1;
 553			swizzle_pipe[5] = 3;
 554			swizzle_pipe[6] = 5;
 555			swizzle_pipe[7] = 7;
 556		}
 557		break;
 558	}
 559
 560	for (cur_pipe = 0; cur_pipe < num_tile_pipes; ++cur_pipe) {
 561		while (((1 << cur_backend) & enabled_backends_mask) == 0)
 562			cur_backend = (cur_backend + 1) % CAYMAN_MAX_BACKENDS;
 563
 564		backend_map |= (((cur_backend & 0xf) << (swizzle_pipe[cur_pipe] * 4)));
 565
 566		cur_backend = (cur_backend + 1) % CAYMAN_MAX_BACKENDS;
 567	}
 568
 569	return backend_map;
 570}
 571
 572static u32 cayman_get_disable_mask_per_asic(struct radeon_device *rdev,
 573					    u32 disable_mask_per_se,
 574					    u32 max_disable_mask_per_se,
 575					    u32 num_shader_engines)
 576{
 577	u32 disable_field_width_per_se = r600_count_pipe_bits(disable_mask_per_se);
 578	u32 disable_mask_per_asic = disable_mask_per_se & max_disable_mask_per_se;
 579
 580	if (num_shader_engines == 1)
 581		return disable_mask_per_asic;
 582	else if (num_shader_engines == 2)
 583		return disable_mask_per_asic | (disable_mask_per_asic << disable_field_width_per_se);
 584	else
 585		return 0xffffffff;
 586}
 587
 
 
 
 588static void cayman_gpu_init(struct radeon_device *rdev)
 589{
 590	u32 cc_rb_backend_disable = 0;
 591	u32 cc_gc_shader_pipe_config;
 592	u32 gb_addr_config = 0;
 593	u32 mc_shared_chmap, mc_arb_ramcfg;
 594	u32 gb_backend_map;
 595	u32 cgts_tcc_disable;
 596	u32 sx_debug_1;
 597	u32 smx_dc_ctl0;
 598	u32 gc_user_shader_pipe_config;
 599	u32 gc_user_rb_backend_disable;
 600	u32 cgts_user_tcc_disable;
 601	u32 cgts_sm_ctrl_reg;
 602	u32 hdp_host_path_cntl;
 603	u32 tmp;
 
 604	int i, j;
 605
 606	switch (rdev->family) {
 607	case CHIP_CAYMAN:
 608	default:
 609		rdev->config.cayman.max_shader_engines = 2;
 610		rdev->config.cayman.max_pipes_per_simd = 4;
 611		rdev->config.cayman.max_tile_pipes = 8;
 612		rdev->config.cayman.max_simds_per_se = 12;
 613		rdev->config.cayman.max_backends_per_se = 4;
 614		rdev->config.cayman.max_texture_channel_caches = 8;
 615		rdev->config.cayman.max_gprs = 256;
 616		rdev->config.cayman.max_threads = 256;
 617		rdev->config.cayman.max_gs_threads = 32;
 618		rdev->config.cayman.max_stack_entries = 512;
 619		rdev->config.cayman.sx_num_of_sets = 8;
 620		rdev->config.cayman.sx_max_export_size = 256;
 621		rdev->config.cayman.sx_max_export_pos_size = 64;
 622		rdev->config.cayman.sx_max_export_smx_size = 192;
 623		rdev->config.cayman.max_hw_contexts = 8;
 624		rdev->config.cayman.sq_num_cf_insts = 2;
 625
 626		rdev->config.cayman.sc_prim_fifo_size = 0x100;
 627		rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
 628		rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 629		break;
 630	}
 631
 632	/* Initialize HDP */
 633	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
 634		WREG32((0x2c14 + j), 0x00000000);
 635		WREG32((0x2c18 + j), 0x00000000);
 636		WREG32((0x2c1c + j), 0x00000000);
 637		WREG32((0x2c20 + j), 0x00000000);
 638		WREG32((0x2c24 + j), 0x00000000);
 639	}
 640
 641	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
 
 
 642
 643	evergreen_fix_pci_max_read_req_size(rdev);
 644
 645	mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
 646	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
 647
 648	cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE);
 649	cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG);
 650	cgts_tcc_disable = 0xff000000;
 651	gc_user_rb_backend_disable = RREG32(GC_USER_RB_BACKEND_DISABLE);
 652	gc_user_shader_pipe_config = RREG32(GC_USER_SHADER_PIPE_CONFIG);
 653	cgts_user_tcc_disable = RREG32(CGTS_USER_TCC_DISABLE);
 654
 655	rdev->config.cayman.num_shader_engines = rdev->config.cayman.max_shader_engines;
 656	tmp = ((~gc_user_shader_pipe_config) & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT;
 657	rdev->config.cayman.num_shader_pipes_per_simd = r600_count_pipe_bits(tmp);
 658	rdev->config.cayman.num_tile_pipes = rdev->config.cayman.max_tile_pipes;
 659	tmp = ((~gc_user_shader_pipe_config) & INACTIVE_SIMDS_MASK) >> INACTIVE_SIMDS_SHIFT;
 660	rdev->config.cayman.num_simds_per_se = r600_count_pipe_bits(tmp);
 661	tmp = ((~gc_user_rb_backend_disable) & BACKEND_DISABLE_MASK) >> BACKEND_DISABLE_SHIFT;
 662	rdev->config.cayman.num_backends_per_se = r600_count_pipe_bits(tmp);
 663	tmp = (gc_user_rb_backend_disable & BACKEND_DISABLE_MASK) >> BACKEND_DISABLE_SHIFT;
 664	rdev->config.cayman.backend_disable_mask_per_asic =
 665		cayman_get_disable_mask_per_asic(rdev, tmp, CAYMAN_MAX_BACKENDS_PER_SE_MASK,
 666						 rdev->config.cayman.num_shader_engines);
 667	rdev->config.cayman.backend_map =
 668		cayman_get_tile_pipe_to_backend_map(rdev, rdev->config.cayman.num_tile_pipes,
 669						    rdev->config.cayman.num_backends_per_se *
 670						    rdev->config.cayman.num_shader_engines,
 671						    &rdev->config.cayman.backend_disable_mask_per_asic,
 672						    rdev->config.cayman.num_shader_engines);
 673	tmp = ((~cgts_user_tcc_disable) & TCC_DISABLE_MASK) >> TCC_DISABLE_SHIFT;
 674	rdev->config.cayman.num_texture_channel_caches = r600_count_pipe_bits(tmp);
 675	tmp = (mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT;
 676	rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
 677	if (rdev->config.cayman.mem_max_burst_length_bytes > 512)
 678		rdev->config.cayman.mem_max_burst_length_bytes = 512;
 679	tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
 680	rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
 681	if (rdev->config.cayman.mem_row_size_in_kb > 4)
 682		rdev->config.cayman.mem_row_size_in_kb = 4;
 683	/* XXX use MC settings? */
 684	rdev->config.cayman.shader_engine_tile_size = 32;
 685	rdev->config.cayman.num_gpus = 1;
 686	rdev->config.cayman.multi_gpu_tile_size = 64;
 687
 688	//gb_addr_config = 0x02011003
 689#if 0
 690	gb_addr_config = RREG32(GB_ADDR_CONFIG);
 691#else
 692	gb_addr_config = 0;
 693	switch (rdev->config.cayman.num_tile_pipes) {
 694	case 1:
 695	default:
 696		gb_addr_config |= NUM_PIPES(0);
 697		break;
 698	case 2:
 699		gb_addr_config |= NUM_PIPES(1);
 700		break;
 701	case 4:
 702		gb_addr_config |= NUM_PIPES(2);
 703		break;
 704	case 8:
 705		gb_addr_config |= NUM_PIPES(3);
 706		break;
 707	}
 708
 709	tmp = (rdev->config.cayman.mem_max_burst_length_bytes / 256) - 1;
 710	gb_addr_config |= PIPE_INTERLEAVE_SIZE(tmp);
 711	gb_addr_config |= NUM_SHADER_ENGINES(rdev->config.cayman.num_shader_engines - 1);
 712	tmp = (rdev->config.cayman.shader_engine_tile_size / 16) - 1;
 713	gb_addr_config |= SHADER_ENGINE_TILE_SIZE(tmp);
 714	switch (rdev->config.cayman.num_gpus) {
 715	case 1:
 716	default:
 717		gb_addr_config |= NUM_GPUS(0);
 718		break;
 719	case 2:
 720		gb_addr_config |= NUM_GPUS(1);
 721		break;
 722	case 4:
 723		gb_addr_config |= NUM_GPUS(2);
 724		break;
 725	}
 726	switch (rdev->config.cayman.multi_gpu_tile_size) {
 727	case 16:
 728		gb_addr_config |= MULTI_GPU_TILE_SIZE(0);
 729		break;
 730	case 32:
 731	default:
 732		gb_addr_config |= MULTI_GPU_TILE_SIZE(1);
 733		break;
 734	case 64:
 735		gb_addr_config |= MULTI_GPU_TILE_SIZE(2);
 736		break;
 737	case 128:
 738		gb_addr_config |= MULTI_GPU_TILE_SIZE(3);
 739		break;
 740	}
 741	switch (rdev->config.cayman.mem_row_size_in_kb) {
 742	case 1:
 743	default:
 744		gb_addr_config |= ROW_SIZE(0);
 745		break;
 746	case 2:
 747		gb_addr_config |= ROW_SIZE(1);
 748		break;
 749	case 4:
 750		gb_addr_config |= ROW_SIZE(2);
 751		break;
 752	}
 753#endif
 754
 755	tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT;
 756	rdev->config.cayman.num_tile_pipes = (1 << tmp);
 757	tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT;
 758	rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
 759	tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT;
 760	rdev->config.cayman.num_shader_engines = tmp + 1;
 761	tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT;
 762	rdev->config.cayman.num_gpus = tmp + 1;
 763	tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT;
 764	rdev->config.cayman.multi_gpu_tile_size = 1 << tmp;
 765	tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT;
 766	rdev->config.cayman.mem_row_size_in_kb = 1 << tmp;
 767
 768	//gb_backend_map = 0x76541032;
 769#if 0
 770	gb_backend_map = RREG32(GB_BACKEND_MAP);
 771#else
 772	gb_backend_map =
 773		cayman_get_tile_pipe_to_backend_map(rdev, rdev->config.cayman.num_tile_pipes,
 774						    rdev->config.cayman.num_backends_per_se *
 775						    rdev->config.cayman.num_shader_engines,
 776						    &rdev->config.cayman.backend_disable_mask_per_asic,
 777						    rdev->config.cayman.num_shader_engines);
 778#endif
 779	/* setup tiling info dword.  gb_addr_config is not adequate since it does
 780	 * not have bank info, so create a custom tiling dword.
 781	 * bits 3:0   num_pipes
 782	 * bits 7:4   num_banks
 783	 * bits 11:8  group_size
 784	 * bits 15:12 row_size
 785	 */
 786	rdev->config.cayman.tile_config = 0;
 787	switch (rdev->config.cayman.num_tile_pipes) {
 788	case 1:
 789	default:
 790		rdev->config.cayman.tile_config |= (0 << 0);
 791		break;
 792	case 2:
 793		rdev->config.cayman.tile_config |= (1 << 0);
 794		break;
 795	case 4:
 796		rdev->config.cayman.tile_config |= (2 << 0);
 797		break;
 798	case 8:
 799		rdev->config.cayman.tile_config |= (3 << 0);
 800		break;
 801	}
 802	rdev->config.cayman.tile_config |=
 803		((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 804	rdev->config.cayman.tile_config |=
 805		((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
 806	rdev->config.cayman.tile_config |=
 807		((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
 808
 809	rdev->config.cayman.backend_map = gb_backend_map;
 810	WREG32(GB_BACKEND_MAP, gb_backend_map);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 811	WREG32(GB_ADDR_CONFIG, gb_addr_config);
 812	WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
 
 
 813	WREG32(HDP_ADDR_CONFIG, gb_addr_config);
 814
 815	/* primary versions */
 816	WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable);
 817	WREG32(CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
 818	WREG32(CC_GC_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
 819
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 820	WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable);
 821	WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable);
 822
 823	/* user versions */
 824	WREG32(GC_USER_RB_BACKEND_DISABLE, cc_rb_backend_disable);
 825	WREG32(GC_USER_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
 826	WREG32(GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
 827
 828	WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable);
 829	WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable);
 830
 831	/* reprogram the shader complex */
 832	cgts_sm_ctrl_reg = RREG32(CGTS_SM_CTRL_REG);
 833	for (i = 0; i < 16; i++)
 834		WREG32(CGTS_SM_CTRL_REG, OVERRIDE);
 835	WREG32(CGTS_SM_CTRL_REG, cgts_sm_ctrl_reg);
 836
 837	/* set HW defaults for 3D engine */
 838	WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
 839
 840	sx_debug_1 = RREG32(SX_DEBUG_1);
 841	sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
 842	WREG32(SX_DEBUG_1, sx_debug_1);
 843
 844	smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
 845	smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
 846	smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.cayman.sx_num_of_sets);
 847	WREG32(SMX_DC_CTL0, smx_dc_ctl0);
 848
 849	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4) | CRC_SIMD_ID_WADDR_DISABLE);
 850
 851	/* need to be explicitly zero-ed */
 852	WREG32(VGT_OFFCHIP_LDS_BASE, 0);
 853	WREG32(SQ_LSTMP_RING_BASE, 0);
 854	WREG32(SQ_HSTMP_RING_BASE, 0);
 855	WREG32(SQ_ESTMP_RING_BASE, 0);
 856	WREG32(SQ_GSTMP_RING_BASE, 0);
 857	WREG32(SQ_VSTMP_RING_BASE, 0);
 858	WREG32(SQ_PSTMP_RING_BASE, 0);
 859
 860	WREG32(TA_CNTL_AUX, DISABLE_CUBE_ANISO);
 861
 862	WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.cayman.sx_max_export_size / 4) - 1) |
 863					POSITION_BUFFER_SIZE((rdev->config.cayman.sx_max_export_pos_size / 4) - 1) |
 864					SMX_BUFFER_SIZE((rdev->config.cayman.sx_max_export_smx_size / 4) - 1)));
 865
 866	WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.cayman.sc_prim_fifo_size) |
 867				 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_hiz_tile_fifo_size) |
 868				 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_earlyz_tile_fifo_size)));
 869
 870
 871	WREG32(VGT_NUM_INSTANCES, 1);
 872
 873	WREG32(CP_PERFMON_CNTL, 0);
 874
 875	WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.cayman.sq_num_cf_insts) |
 876				  FETCH_FIFO_HIWATER(0x4) |
 877				  DONE_FIFO_HIWATER(0xe0) |
 878				  ALU_UPDATE_FIFO_HIWATER(0x8)));
 879
 880	WREG32(SQ_GPR_RESOURCE_MGMT_1, NUM_CLAUSE_TEMP_GPRS(4));
 881	WREG32(SQ_CONFIG, (VC_ENABLE |
 882			   EXPORT_SRC_C |
 883			   GFX_PRIO(0) |
 884			   CS1_PRIO(0) |
 885			   CS2_PRIO(1)));
 886	WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, DYN_GPR_ENABLE);
 887
 888	WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
 889					  FORCE_EOV_MAX_REZ_CNT(255)));
 890
 891	WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
 892	       AUTO_INVLD_EN(ES_AND_GS_AUTO));
 893
 894	WREG32(VGT_GS_VERTEX_REUSE, 16);
 895	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
 896
 897	WREG32(CB_PERF_CTR0_SEL_0, 0);
 898	WREG32(CB_PERF_CTR0_SEL_1, 0);
 899	WREG32(CB_PERF_CTR1_SEL_0, 0);
 900	WREG32(CB_PERF_CTR1_SEL_1, 0);
 901	WREG32(CB_PERF_CTR2_SEL_0, 0);
 902	WREG32(CB_PERF_CTR2_SEL_1, 0);
 903	WREG32(CB_PERF_CTR3_SEL_0, 0);
 904	WREG32(CB_PERF_CTR3_SEL_1, 0);
 905
 906	tmp = RREG32(HDP_MISC_CNTL);
 907	tmp |= HDP_FLUSH_INVALIDATE_CACHE;
 908	WREG32(HDP_MISC_CNTL, tmp);
 909
 910	hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
 911	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
 912
 913	WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
 914
 915	udelay(50);
 
 
 
 
 
 
 
 
 
 
 916}
 917
 918/*
 919 * GART
 920 */
 921void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev)
 922{
 923	/* flush hdp cache */
 924	WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
 925
 926	/* bits 0-7 are the VM contexts0-7 */
 927	WREG32(VM_INVALIDATE_REQUEST, 1);
 928}
 929
 930int cayman_pcie_gart_enable(struct radeon_device *rdev)
 931{
 932	int r;
 933
 934	if (rdev->gart.table.vram.robj == NULL) {
 935		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
 936		return -EINVAL;
 937	}
 938	r = radeon_gart_table_vram_pin(rdev);
 939	if (r)
 940		return r;
 941	radeon_gart_restore(rdev);
 942	/* Setup TLB control */
 943	WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_TLB |
 
 
 944	       ENABLE_L1_FRAGMENT_PROCESSING |
 945	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
 
 946	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
 947	/* Setup L2 cache */
 948	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
 
 949	       ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
 950	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
 951	       EFFECTIVE_L2_QUEUE_SIZE(7) |
 952	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
 953	WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
 954	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
 
 955	       L2_CACHE_BIGK_FRAGMENT_SIZE(6));
 956	/* setup context0 */
 957	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
 958	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
 959	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
 960	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
 961			(u32)(rdev->dummy_page.addr >> 12));
 962	WREG32(VM_CONTEXT0_CNTL2, 0);
 963	WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
 964				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
 965	/* disable context1-7 */
 966	WREG32(VM_CONTEXT1_CNTL2, 0);
 967	WREG32(VM_CONTEXT1_CNTL, 0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 968
 969	cayman_pcie_gart_tlb_flush(rdev);
 
 
 
 970	rdev->gart.ready = true;
 971	return 0;
 972}
 973
 974void cayman_pcie_gart_disable(struct radeon_device *rdev)
 975{
 976	int r;
 
 
 
 
 
 977
 978	/* Disable all tables */
 979	WREG32(VM_CONTEXT0_CNTL, 0);
 980	WREG32(VM_CONTEXT1_CNTL, 0);
 981	/* Setup TLB control */
 982	WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING |
 983	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
 984	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
 985	/* Setup L2 cache */
 986	WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
 987	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
 988	       EFFECTIVE_L2_QUEUE_SIZE(7) |
 989	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
 990	WREG32(VM_L2_CNTL2, 0);
 991	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
 992	       L2_CACHE_BIGK_FRAGMENT_SIZE(6));
 993	if (rdev->gart.table.vram.robj) {
 994		r = radeon_bo_reserve(rdev->gart.table.vram.robj, false);
 995		if (likely(r == 0)) {
 996			radeon_bo_kunmap(rdev->gart.table.vram.robj);
 997			radeon_bo_unpin(rdev->gart.table.vram.robj);
 998			radeon_bo_unreserve(rdev->gart.table.vram.robj);
 999		}
1000	}
1001}
1002
1003void cayman_pcie_gart_fini(struct radeon_device *rdev)
1004{
1005	cayman_pcie_gart_disable(rdev);
1006	radeon_gart_table_vram_free(rdev);
1007	radeon_gart_fini(rdev);
1008}
1009
 
 
 
 
 
 
 
1010/*
1011 * CP.
1012 */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1013static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
1014{
1015	if (enable)
1016		WREG32(CP_ME_CNTL, 0);
1017	else {
1018		radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
 
1019		WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1020		WREG32(SCRATCH_UMSK, 0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1021	}
1022}
1023
1024static int cayman_cp_load_microcode(struct radeon_device *rdev)
1025{
1026	const __be32 *fw_data;
1027	int i;
1028
1029	if (!rdev->me_fw || !rdev->pfp_fw)
1030		return -EINVAL;
1031
1032	cayman_cp_enable(rdev, false);
1033
1034	fw_data = (const __be32 *)rdev->pfp_fw->data;
1035	WREG32(CP_PFP_UCODE_ADDR, 0);
1036	for (i = 0; i < CAYMAN_PFP_UCODE_SIZE; i++)
1037		WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1038	WREG32(CP_PFP_UCODE_ADDR, 0);
1039
1040	fw_data = (const __be32 *)rdev->me_fw->data;
1041	WREG32(CP_ME_RAM_WADDR, 0);
1042	for (i = 0; i < CAYMAN_PM4_UCODE_SIZE; i++)
1043		WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1044
1045	WREG32(CP_PFP_UCODE_ADDR, 0);
1046	WREG32(CP_ME_RAM_WADDR, 0);
1047	WREG32(CP_ME_RAM_RADDR, 0);
1048	return 0;
1049}
1050
1051static int cayman_cp_start(struct radeon_device *rdev)
1052{
 
1053	int r, i;
1054
1055	r = radeon_ring_lock(rdev, 7);
1056	if (r) {
1057		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1058		return r;
1059	}
1060	radeon_ring_write(rdev, PACKET3(PACKET3_ME_INITIALIZE, 5));
1061	radeon_ring_write(rdev, 0x1);
1062	radeon_ring_write(rdev, 0x0);
1063	radeon_ring_write(rdev, rdev->config.cayman.max_hw_contexts - 1);
1064	radeon_ring_write(rdev, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
1065	radeon_ring_write(rdev, 0);
1066	radeon_ring_write(rdev, 0);
1067	radeon_ring_unlock_commit(rdev);
1068
1069	cayman_cp_enable(rdev, true);
1070
1071	r = radeon_ring_lock(rdev, cayman_default_size + 19);
1072	if (r) {
1073		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1074		return r;
1075	}
1076
1077	/* setup clear context state */
1078	radeon_ring_write(rdev, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1079	radeon_ring_write(rdev, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
1080
1081	for (i = 0; i < cayman_default_size; i++)
1082		radeon_ring_write(rdev, cayman_default_state[i]);
1083
1084	radeon_ring_write(rdev, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1085	radeon_ring_write(rdev, PACKET3_PREAMBLE_END_CLEAR_STATE);
1086
1087	/* set clear context state */
1088	radeon_ring_write(rdev, PACKET3(PACKET3_CLEAR_STATE, 0));
1089	radeon_ring_write(rdev, 0);
1090
1091	/* SQ_VTX_BASE_VTX_LOC */
1092	radeon_ring_write(rdev, 0xc0026f00);
1093	radeon_ring_write(rdev, 0x00000000);
1094	radeon_ring_write(rdev, 0x00000000);
1095	radeon_ring_write(rdev, 0x00000000);
1096
1097	/* Clear consts */
1098	radeon_ring_write(rdev, 0xc0036f00);
1099	radeon_ring_write(rdev, 0x00000bc4);
1100	radeon_ring_write(rdev, 0xffffffff);
1101	radeon_ring_write(rdev, 0xffffffff);
1102	radeon_ring_write(rdev, 0xffffffff);
1103
1104	radeon_ring_write(rdev, 0xc0026900);
1105	radeon_ring_write(rdev, 0x00000316);
1106	radeon_ring_write(rdev, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
1107	radeon_ring_write(rdev, 0x00000010); /*  */
1108
1109	radeon_ring_unlock_commit(rdev);
1110
1111	/* XXX init other rings */
1112
1113	return 0;
1114}
1115
1116static void cayman_cp_fini(struct radeon_device *rdev)
1117{
 
1118	cayman_cp_enable(rdev, false);
1119	radeon_ring_fini(rdev);
 
1120}
1121
1122int cayman_cp_resume(struct radeon_device *rdev)
1123{
1124	u32 tmp;
1125	u32 rb_bufsz;
1126	int r;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1127
1128	/* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
1129	WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
1130				 SOFT_RESET_PA |
1131				 SOFT_RESET_SH |
1132				 SOFT_RESET_VGT |
1133				 SOFT_RESET_SPI |
1134				 SOFT_RESET_SX));
1135	RREG32(GRBM_SOFT_RESET);
1136	mdelay(15);
1137	WREG32(GRBM_SOFT_RESET, 0);
1138	RREG32(GRBM_SOFT_RESET);
1139
1140	WREG32(CP_SEM_WAIT_TIMER, 0x4);
 
1141
1142	/* Set the write pointer delay */
1143	WREG32(CP_RB_WPTR_DELAY, 0);
1144
1145	WREG32(CP_DEBUG, (1 << 27));
1146
1147	/* ring 0 - compute and gfx */
1148	/* Set ring buffer size */
1149	rb_bufsz = drm_order(rdev->cp.ring_size / 8);
1150	tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
 
 
 
 
 
 
 
 
1151#ifdef __BIG_ENDIAN
1152	tmp |= BUF_SWAP_32BIT;
1153#endif
1154	WREG32(CP_RB0_CNTL, tmp);
1155
1156	/* Initialize the ring buffer's read and write pointers */
1157	WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA);
1158	rdev->cp.wptr = 0;
1159	WREG32(CP_RB0_WPTR, rdev->cp.wptr);
1160
1161	/* set the wb address wether it's enabled or not */
1162	WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
1163	WREG32(CP_RB0_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
1164	WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
1165
1166	if (rdev->wb.enabled)
1167		WREG32(SCRATCH_UMSK, 0xff);
1168	else {
1169		tmp |= RB_NO_UPDATE;
1170		WREG32(SCRATCH_UMSK, 0);
1171	}
1172
1173	mdelay(1);
1174	WREG32(CP_RB0_CNTL, tmp);
 
 
1175
1176	WREG32(CP_RB0_BASE, rdev->cp.gpu_addr >> 8);
 
 
1177
1178	rdev->cp.rptr = RREG32(CP_RB0_RPTR);
 
 
1179
1180	/* ring1  - compute only */
1181	/* Set ring buffer size */
1182	rb_bufsz = drm_order(rdev->cp1.ring_size / 8);
1183	tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
1184#ifdef __BIG_ENDIAN
1185	tmp |= BUF_SWAP_32BIT;
1186#endif
1187	WREG32(CP_RB1_CNTL, tmp);
 
 
 
 
 
1188
1189	/* Initialize the ring buffer's read and write pointers */
1190	WREG32(CP_RB1_CNTL, tmp | RB_RPTR_WR_ENA);
1191	rdev->cp1.wptr = 0;
1192	WREG32(CP_RB1_WPTR, rdev->cp1.wptr);
1193
1194	/* set the wb address wether it's enabled or not */
1195	WREG32(CP_RB1_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFFFFFFFC);
1196	WREG32(CP_RB1_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFF);
1197
1198	mdelay(1);
1199	WREG32(CP_RB1_CNTL, tmp);
 
 
1200
1201	WREG32(CP_RB1_BASE, rdev->cp1.gpu_addr >> 8);
 
 
 
 
 
 
 
 
1202
1203	rdev->cp1.rptr = RREG32(CP_RB1_RPTR);
 
 
1204
1205	/* ring2 - compute only */
1206	/* Set ring buffer size */
1207	rb_bufsz = drm_order(rdev->cp2.ring_size / 8);
1208	tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
1209#ifdef __BIG_ENDIAN
1210	tmp |= BUF_SWAP_32BIT;
1211#endif
1212	WREG32(CP_RB2_CNTL, tmp);
1213
1214	/* Initialize the ring buffer's read and write pointers */
1215	WREG32(CP_RB2_CNTL, tmp | RB_RPTR_WR_ENA);
1216	rdev->cp2.wptr = 0;
1217	WREG32(CP_RB2_WPTR, rdev->cp2.wptr);
1218
1219	/* set the wb address wether it's enabled or not */
1220	WREG32(CP_RB2_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFFFFFFFC);
1221	WREG32(CP_RB2_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFF);
 
1222
1223	mdelay(1);
1224	WREG32(CP_RB2_CNTL, tmp);
 
 
1225
1226	WREG32(CP_RB2_BASE, rdev->cp2.gpu_addr >> 8);
 
1227
1228	rdev->cp2.rptr = RREG32(CP_RB2_RPTR);
 
 
 
1229
1230	/* start the rings */
1231	cayman_cp_start(rdev);
1232	rdev->cp.ready = true;
1233	rdev->cp1.ready = true;
1234	rdev->cp2.ready = true;
1235	/* this only test cp0 */
1236	r = radeon_ring_test(rdev);
1237	if (r) {
1238		rdev->cp.ready = false;
1239		rdev->cp1.ready = false;
1240		rdev->cp2.ready = false;
1241		return r;
1242	}
1243
1244	return 0;
1245}
1246
1247bool cayman_gpu_is_lockup(struct radeon_device *rdev)
1248{
1249	u32 srbm_status;
1250	u32 grbm_status;
1251	u32 grbm_status_se0, grbm_status_se1;
1252	struct r100_gpu_lockup *lockup = &rdev->config.cayman.lockup;
1253	int r;
1254
1255	srbm_status = RREG32(SRBM_STATUS);
1256	grbm_status = RREG32(GRBM_STATUS);
1257	grbm_status_se0 = RREG32(GRBM_STATUS_SE0);
1258	grbm_status_se1 = RREG32(GRBM_STATUS_SE1);
1259	if (!(grbm_status & GUI_ACTIVE)) {
1260		r100_gpu_lockup_update(lockup, &rdev->cp);
1261		return false;
 
 
 
 
 
 
 
 
 
 
 
 
1262	}
1263	/* force CP activities */
1264	r = radeon_ring_lock(rdev, 2);
1265	if (!r) {
1266		/* PACKET2 NOP */
1267		radeon_ring_write(rdev, 0x80000000);
1268		radeon_ring_write(rdev, 0x80000000);
1269		radeon_ring_unlock_commit(rdev);
1270	}
1271	/* XXX deal with CP0,1,2 */
1272	rdev->cp.rptr = RREG32(CP_RB0_RPTR);
1273	return r100_gpu_cp_is_lockup(rdev, lockup, &rdev->cp);
1274}
1275
1276static int cayman_gpu_soft_reset(struct radeon_device *rdev)
1277{
1278	struct evergreen_mc_save save;
1279	u32 grbm_reset = 0;
 
1280
1281	if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
1282		return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1283
1284	dev_info(rdev->dev, "GPU softreset \n");
1285	dev_info(rdev->dev, "  GRBM_STATUS=0x%08X\n",
1286		RREG32(GRBM_STATUS));
1287	dev_info(rdev->dev, "  GRBM_STATUS_SE0=0x%08X\n",
1288		RREG32(GRBM_STATUS_SE0));
1289	dev_info(rdev->dev, "  GRBM_STATUS_SE1=0x%08X\n",
1290		RREG32(GRBM_STATUS_SE1));
1291	dev_info(rdev->dev, "  SRBM_STATUS=0x%08X\n",
1292		RREG32(SRBM_STATUS));
1293	evergreen_mc_stop(rdev, &save);
1294	if (evergreen_mc_wait_for_idle(rdev)) {
1295		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1296	}
1297	/* Disable CP parsing/prefetching */
1298	WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
1299
1300	/* reset all the gfx blocks */
1301	grbm_reset = (SOFT_RESET_CP |
1302		      SOFT_RESET_CB |
1303		      SOFT_RESET_DB |
1304		      SOFT_RESET_GDS |
1305		      SOFT_RESET_PA |
1306		      SOFT_RESET_SC |
1307		      SOFT_RESET_SPI |
1308		      SOFT_RESET_SH |
1309		      SOFT_RESET_SX |
1310		      SOFT_RESET_TC |
1311		      SOFT_RESET_TA |
1312		      SOFT_RESET_VGT |
1313		      SOFT_RESET_IA);
1314
1315	dev_info(rdev->dev, "  GRBM_SOFT_RESET=0x%08X\n", grbm_reset);
1316	WREG32(GRBM_SOFT_RESET, grbm_reset);
1317	(void)RREG32(GRBM_SOFT_RESET);
1318	udelay(50);
1319	WREG32(GRBM_SOFT_RESET, 0);
1320	(void)RREG32(GRBM_SOFT_RESET);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1321	/* Wait a little for things to settle down */
1322	udelay(50);
1323	dev_info(rdev->dev, "  GRBM_STATUS=0x%08X\n",
1324		RREG32(GRBM_STATUS));
1325	dev_info(rdev->dev, "  GRBM_STATUS_SE0=0x%08X\n",
1326		RREG32(GRBM_STATUS_SE0));
1327	dev_info(rdev->dev, "  GRBM_STATUS_SE1=0x%08X\n",
1328		RREG32(GRBM_STATUS_SE1));
1329	dev_info(rdev->dev, "  SRBM_STATUS=0x%08X\n",
1330		RREG32(SRBM_STATUS));
1331	evergreen_mc_resume(rdev, &save);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1332	return 0;
1333}
1334
1335int cayman_asic_reset(struct radeon_device *rdev)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1336{
1337	return cayman_gpu_soft_reset(rdev);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1338}
1339
1340static int cayman_startup(struct radeon_device *rdev)
1341{
 
1342	int r;
1343
1344	if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
1345		r = ni_init_microcode(rdev);
 
 
 
 
 
 
 
 
 
 
 
 
1346		if (r) {
1347			DRM_ERROR("Failed to load firmware!\n");
1348			return r;
1349		}
1350	}
1351	r = ni_mc_load_microcode(rdev);
1352	if (r) {
1353		DRM_ERROR("Failed to load MC firmware!\n");
1354		return r;
1355	}
1356
1357	evergreen_mc_program(rdev);
1358	r = cayman_pcie_gart_enable(rdev);
1359	if (r)
1360		return r;
1361	cayman_gpu_init(rdev);
1362
1363	r = evergreen_blit_init(rdev);
1364	if (r) {
1365		evergreen_blit_fini(rdev);
1366		rdev->asic->copy = NULL;
1367		dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
 
 
 
 
 
 
1368	}
1369
1370	/* allocate wb buffer */
1371	r = radeon_wb_init(rdev);
1372	if (r)
1373		return r;
1374
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1375	/* Enable IRQ */
 
 
 
 
 
 
1376	r = r600_irq_init(rdev);
1377	if (r) {
1378		DRM_ERROR("radeon: IH init failed (%d).\n", r);
1379		radeon_irq_kms_fini(rdev);
1380		return r;
1381	}
1382	evergreen_irq_set(rdev);
1383
1384	r = radeon_ring_init(rdev, rdev->cp.ring_size);
 
 
 
 
 
 
 
1385	if (r)
1386		return r;
 
 
 
 
 
 
 
1387	r = cayman_cp_load_microcode(rdev);
1388	if (r)
1389		return r;
1390	r = cayman_cp_resume(rdev);
1391	if (r)
1392		return r;
1393
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1394	return 0;
1395}
1396
1397int cayman_resume(struct radeon_device *rdev)
1398{
1399	int r;
1400
1401	/* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
1402	 * posting will perform necessary task to bring back GPU into good
1403	 * shape.
1404	 */
1405	/* post card */
1406	atom_asic_init(rdev->mode_info.atom_context);
1407
 
 
 
 
 
 
 
1408	r = cayman_startup(rdev);
1409	if (r) {
1410		DRM_ERROR("cayman startup failed on resume\n");
 
1411		return r;
1412	}
1413
1414	r = r600_ib_test(rdev);
1415	if (r) {
1416		DRM_ERROR("radeon: failled testing IB (%d).\n", r);
1417		return r;
1418	}
1419
1420	return r;
1421
1422}
1423
1424int cayman_suspend(struct radeon_device *rdev)
1425{
1426	int r;
1427
1428	/* FIXME: we should wait for ring to be empty */
1429	cayman_cp_enable(rdev, false);
1430	rdev->cp.ready = false;
 
 
 
 
1431	evergreen_irq_suspend(rdev);
1432	radeon_wb_disable(rdev);
1433	cayman_pcie_gart_disable(rdev);
1434
1435	/* unpin shaders bo */
1436	r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
1437	if (likely(r == 0)) {
1438		radeon_bo_unpin(rdev->r600_blit.shader_obj);
1439		radeon_bo_unreserve(rdev->r600_blit.shader_obj);
1440	}
1441
1442	return 0;
1443}
1444
1445/* Plan is to move initialization in that function and use
1446 * helper function so that radeon_device_init pretty much
1447 * do nothing more than calling asic specific function. This
1448 * should also allow to remove a bunch of callback function
1449 * like vram_info.
1450 */
1451int cayman_init(struct radeon_device *rdev)
1452{
 
1453	int r;
1454
1455	/* This don't do much */
1456	r = radeon_gem_init(rdev);
1457	if (r)
1458		return r;
1459	/* Read BIOS */
1460	if (!radeon_get_bios(rdev)) {
1461		if (ASIC_IS_AVIVO(rdev))
1462			return -EINVAL;
1463	}
1464	/* Must be an ATOMBIOS */
1465	if (!rdev->is_atom_bios) {
1466		dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
1467		return -EINVAL;
1468	}
1469	r = radeon_atombios_init(rdev);
1470	if (r)
1471		return r;
1472
1473	/* Post card if necessary */
1474	if (!radeon_card_posted(rdev)) {
1475		if (!rdev->bios) {
1476			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
1477			return -EINVAL;
1478		}
1479		DRM_INFO("GPU not posted. posting now...\n");
1480		atom_asic_init(rdev->mode_info.atom_context);
1481	}
 
 
1482	/* Initialize scratch registers */
1483	r600_scratch_init(rdev);
1484	/* Initialize surface registers */
1485	radeon_surface_init(rdev);
1486	/* Initialize clocks */
1487	radeon_get_clock_info(rdev->ddev);
1488	/* Fence driver */
1489	r = radeon_fence_driver_init(rdev);
1490	if (r)
1491		return r;
1492	/* initialize memory controller */
1493	r = evergreen_mc_init(rdev);
1494	if (r)
1495		return r;
1496	/* Memory manager */
1497	r = radeon_bo_init(rdev);
1498	if (r)
1499		return r;
1500
1501	r = radeon_irq_kms_init(rdev);
1502	if (r)
1503		return r;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1504
1505	rdev->cp.ring_obj = NULL;
1506	r600_ring_init(rdev, 1024 * 1024);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1507
1508	rdev->ih.ring_obj = NULL;
1509	r600_ih_ring_init(rdev, 64 * 1024);
1510
1511	r = r600_pcie_gart_init(rdev);
1512	if (r)
1513		return r;
1514
1515	rdev->accel_working = true;
1516	r = cayman_startup(rdev);
1517	if (r) {
1518		dev_err(rdev->dev, "disabling GPU acceleration\n");
1519		cayman_cp_fini(rdev);
 
1520		r600_irq_fini(rdev);
 
 
1521		radeon_wb_fini(rdev);
 
 
1522		radeon_irq_kms_fini(rdev);
1523		cayman_pcie_gart_fini(rdev);
1524		rdev->accel_working = false;
1525	}
1526	if (rdev->accel_working) {
1527		r = radeon_ib_pool_init(rdev);
1528		if (r) {
1529			DRM_ERROR("radeon: failed initializing IB pool (%d).\n", r);
1530			rdev->accel_working = false;
1531		}
1532		r = r600_ib_test(rdev);
1533		if (r) {
1534			DRM_ERROR("radeon: failed testing IB (%d).\n", r);
1535			rdev->accel_working = false;
1536		}
1537	}
1538
1539	/* Don't start up if the MC ucode is missing.
1540	 * The default clocks and voltages before the MC ucode
1541	 * is loaded are not suffient for advanced operations.
 
 
 
1542	 */
1543	if (!rdev->mc_fw) {
1544		DRM_ERROR("radeon: MC ucode required for NI+.\n");
1545		return -EINVAL;
1546	}
1547
1548	return 0;
1549}
1550
1551void cayman_fini(struct radeon_device *rdev)
1552{
1553	evergreen_blit_fini(rdev);
1554	cayman_cp_fini(rdev);
 
1555	r600_irq_fini(rdev);
 
 
1556	radeon_wb_fini(rdev);
 
1557	radeon_ib_pool_fini(rdev);
1558	radeon_irq_kms_fini(rdev);
 
 
 
 
1559	cayman_pcie_gart_fini(rdev);
 
1560	radeon_gem_fini(rdev);
1561	radeon_fence_driver_fini(rdev);
1562	radeon_bo_fini(rdev);
1563	radeon_atombios_fini(rdev);
1564	kfree(rdev->bios);
1565	rdev->bios = NULL;
1566}
1567
v4.17
   1/*
   2 * Copyright 2010 Advanced Micro Devices, Inc.
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice shall be included in
  12 * all copies or substantial portions of the Software.
  13 *
  14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20 * OTHER DEALINGS IN THE SOFTWARE.
  21 *
  22 * Authors: Alex Deucher
  23 */
  24#include <linux/firmware.h>
 
  25#include <linux/slab.h>
  26#include <linux/module.h>
  27#include <drm/drmP.h>
  28#include "radeon.h"
  29#include "radeon_asic.h"
  30#include "radeon_audio.h"
  31#include <drm/radeon_drm.h>
  32#include "nid.h"
  33#include "atom.h"
  34#include "ni_reg.h"
  35#include "cayman_blit_shaders.h"
  36#include "radeon_ucode.h"
  37#include "clearstate_cayman.h"
  38
  39/*
  40 * Indirect registers accessor
  41 */
  42u32 tn_smc_rreg(struct radeon_device *rdev, u32 reg)
  43{
  44	unsigned long flags;
  45	u32 r;
  46
  47	spin_lock_irqsave(&rdev->smc_idx_lock, flags);
  48	WREG32(TN_SMC_IND_INDEX_0, (reg));
  49	r = RREG32(TN_SMC_IND_DATA_0);
  50	spin_unlock_irqrestore(&rdev->smc_idx_lock, flags);
  51	return r;
  52}
  53
  54void tn_smc_wreg(struct radeon_device *rdev, u32 reg, u32 v)
  55{
  56	unsigned long flags;
  57
  58	spin_lock_irqsave(&rdev->smc_idx_lock, flags);
  59	WREG32(TN_SMC_IND_INDEX_0, (reg));
  60	WREG32(TN_SMC_IND_DATA_0, (v));
  61	spin_unlock_irqrestore(&rdev->smc_idx_lock, flags);
  62}
  63
  64static const u32 tn_rlc_save_restore_register_list[] =
  65{
  66	0x98fc,
  67	0x98f0,
  68	0x9834,
  69	0x9838,
  70	0x9870,
  71	0x9874,
  72	0x8a14,
  73	0x8b24,
  74	0x8bcc,
  75	0x8b10,
  76	0x8c30,
  77	0x8d00,
  78	0x8d04,
  79	0x8c00,
  80	0x8c04,
  81	0x8c10,
  82	0x8c14,
  83	0x8d8c,
  84	0x8cf0,
  85	0x8e38,
  86	0x9508,
  87	0x9688,
  88	0x9608,
  89	0x960c,
  90	0x9610,
  91	0x9614,
  92	0x88c4,
  93	0x8978,
  94	0x88d4,
  95	0x900c,
  96	0x9100,
  97	0x913c,
  98	0x90e8,
  99	0x9354,
 100	0xa008,
 101	0x98f8,
 102	0x9148,
 103	0x914c,
 104	0x3f94,
 105	0x98f4,
 106	0x9b7c,
 107	0x3f8c,
 108	0x8950,
 109	0x8954,
 110	0x8a18,
 111	0x8b28,
 112	0x9144,
 113	0x3f90,
 114	0x915c,
 115	0x9160,
 116	0x9178,
 117	0x917c,
 118	0x9180,
 119	0x918c,
 120	0x9190,
 121	0x9194,
 122	0x9198,
 123	0x919c,
 124	0x91a8,
 125	0x91ac,
 126	0x91b0,
 127	0x91b4,
 128	0x91b8,
 129	0x91c4,
 130	0x91c8,
 131	0x91cc,
 132	0x91d0,
 133	0x91d4,
 134	0x91e0,
 135	0x91e4,
 136	0x91ec,
 137	0x91f0,
 138	0x91f4,
 139	0x9200,
 140	0x9204,
 141	0x929c,
 142	0x8030,
 143	0x9150,
 144	0x9a60,
 145	0x920c,
 146	0x9210,
 147	0x9228,
 148	0x922c,
 149	0x9244,
 150	0x9248,
 151	0x91e8,
 152	0x9294,
 153	0x9208,
 154	0x9224,
 155	0x9240,
 156	0x9220,
 157	0x923c,
 158	0x9258,
 159	0x9744,
 160	0xa200,
 161	0xa204,
 162	0xa208,
 163	0xa20c,
 164	0x8d58,
 165	0x9030,
 166	0x9034,
 167	0x9038,
 168	0x903c,
 169	0x9040,
 170	0x9654,
 171	0x897c,
 172	0xa210,
 173	0xa214,
 174	0x9868,
 175	0xa02c,
 176	0x9664,
 177	0x9698,
 178	0x949c,
 179	0x8e10,
 180	0x8e18,
 181	0x8c50,
 182	0x8c58,
 183	0x8c60,
 184	0x8c68,
 185	0x89b4,
 186	0x9830,
 187	0x802c,
 188};
 189
 190extern bool evergreen_is_display_hung(struct radeon_device *rdev);
 191extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
 192extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
 193extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
 194extern int evergreen_mc_wait_for_idle(struct radeon_device *rdev);
 195extern void evergreen_mc_program(struct radeon_device *rdev);
 196extern void evergreen_irq_suspend(struct radeon_device *rdev);
 197extern int evergreen_mc_init(struct radeon_device *rdev);
 198extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
 199extern void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
 200extern void evergreen_program_aspm(struct radeon_device *rdev);
 201extern void sumo_rlc_fini(struct radeon_device *rdev);
 202extern int sumo_rlc_init(struct radeon_device *rdev);
 203extern void evergreen_gpu_pci_config_reset(struct radeon_device *rdev);
 
 
 
 
 
 204
 205/* Firmware Names */
 206MODULE_FIRMWARE("radeon/BARTS_pfp.bin");
 207MODULE_FIRMWARE("radeon/BARTS_me.bin");
 208MODULE_FIRMWARE("radeon/BARTS_mc.bin");
 209MODULE_FIRMWARE("radeon/BARTS_smc.bin");
 210MODULE_FIRMWARE("radeon/BTC_rlc.bin");
 211MODULE_FIRMWARE("radeon/TURKS_pfp.bin");
 212MODULE_FIRMWARE("radeon/TURKS_me.bin");
 213MODULE_FIRMWARE("radeon/TURKS_mc.bin");
 214MODULE_FIRMWARE("radeon/TURKS_smc.bin");
 215MODULE_FIRMWARE("radeon/CAICOS_pfp.bin");
 216MODULE_FIRMWARE("radeon/CAICOS_me.bin");
 217MODULE_FIRMWARE("radeon/CAICOS_mc.bin");
 218MODULE_FIRMWARE("radeon/CAICOS_smc.bin");
 219MODULE_FIRMWARE("radeon/CAYMAN_pfp.bin");
 220MODULE_FIRMWARE("radeon/CAYMAN_me.bin");
 221MODULE_FIRMWARE("radeon/CAYMAN_mc.bin");
 222MODULE_FIRMWARE("radeon/CAYMAN_rlc.bin");
 223MODULE_FIRMWARE("radeon/CAYMAN_smc.bin");
 224MODULE_FIRMWARE("radeon/ARUBA_pfp.bin");
 225MODULE_FIRMWARE("radeon/ARUBA_me.bin");
 226MODULE_FIRMWARE("radeon/ARUBA_rlc.bin");
 227
 228
 229static const u32 cayman_golden_registers2[] =
 230{
 231	0x3e5c, 0xffffffff, 0x00000000,
 232	0x3e48, 0xffffffff, 0x00000000,
 233	0x3e4c, 0xffffffff, 0x00000000,
 234	0x3e64, 0xffffffff, 0x00000000,
 235	0x3e50, 0xffffffff, 0x00000000,
 236	0x3e60, 0xffffffff, 0x00000000
 237};
 238
 239static const u32 cayman_golden_registers[] =
 240{
 241	0x5eb4, 0xffffffff, 0x00000002,
 242	0x5e78, 0x8f311ff1, 0x001000f0,
 243	0x3f90, 0xffff0000, 0xff000000,
 244	0x9148, 0xffff0000, 0xff000000,
 245	0x3f94, 0xffff0000, 0xff000000,
 246	0x914c, 0xffff0000, 0xff000000,
 247	0xc78, 0x00000080, 0x00000080,
 248	0xbd4, 0x70073777, 0x00011003,
 249	0xd02c, 0xbfffff1f, 0x08421000,
 250	0xd0b8, 0x73773777, 0x02011003,
 251	0x5bc0, 0x00200000, 0x50100000,
 252	0x98f8, 0x33773777, 0x02011003,
 253	0x98fc, 0xffffffff, 0x76541032,
 254	0x7030, 0x31000311, 0x00000011,
 255	0x2f48, 0x33773777, 0x42010001,
 256	0x6b28, 0x00000010, 0x00000012,
 257	0x7728, 0x00000010, 0x00000012,
 258	0x10328, 0x00000010, 0x00000012,
 259	0x10f28, 0x00000010, 0x00000012,
 260	0x11b28, 0x00000010, 0x00000012,
 261	0x12728, 0x00000010, 0x00000012,
 262	0x240c, 0x000007ff, 0x00000000,
 263	0x8a14, 0xf000001f, 0x00000007,
 264	0x8b24, 0x3fff3fff, 0x00ff0fff,
 265	0x8b10, 0x0000ff0f, 0x00000000,
 266	0x28a4c, 0x07ffffff, 0x06000000,
 267	0x10c, 0x00000001, 0x00010003,
 268	0xa02c, 0xffffffff, 0x0000009b,
 269	0x913c, 0x0000010f, 0x01000100,
 270	0x8c04, 0xf8ff00ff, 0x40600060,
 271	0x28350, 0x00000f01, 0x00000000,
 272	0x9508, 0x3700001f, 0x00000002,
 273	0x960c, 0xffffffff, 0x54763210,
 274	0x88c4, 0x001f3ae3, 0x00000082,
 275	0x88d0, 0xffffffff, 0x0f40df40,
 276	0x88d4, 0x0000001f, 0x00000010,
 277	0x8974, 0xffffffff, 0x00000000
 278};
 279
 280static const u32 dvst_golden_registers2[] =
 281{
 282	0x8f8, 0xffffffff, 0,
 283	0x8fc, 0x00380000, 0,
 284	0x8f8, 0xffffffff, 1,
 285	0x8fc, 0x0e000000, 0
 286};
 287
 288static const u32 dvst_golden_registers[] =
 289{
 290	0x690, 0x3fff3fff, 0x20c00033,
 291	0x918c, 0x0fff0fff, 0x00010006,
 292	0x91a8, 0x0fff0fff, 0x00010006,
 293	0x9150, 0xffffdfff, 0x6e944040,
 294	0x917c, 0x0fff0fff, 0x00030002,
 295	0x9198, 0x0fff0fff, 0x00030002,
 296	0x915c, 0x0fff0fff, 0x00010000,
 297	0x3f90, 0xffff0001, 0xff000000,
 298	0x9178, 0x0fff0fff, 0x00070000,
 299	0x9194, 0x0fff0fff, 0x00070000,
 300	0x9148, 0xffff0001, 0xff000000,
 301	0x9190, 0x0fff0fff, 0x00090008,
 302	0x91ac, 0x0fff0fff, 0x00090008,
 303	0x3f94, 0xffff0000, 0xff000000,
 304	0x914c, 0xffff0000, 0xff000000,
 305	0x929c, 0x00000fff, 0x00000001,
 306	0x55e4, 0xff607fff, 0xfc000100,
 307	0x8a18, 0xff000fff, 0x00000100,
 308	0x8b28, 0xff000fff, 0x00000100,
 309	0x9144, 0xfffc0fff, 0x00000100,
 310	0x6ed8, 0x00010101, 0x00010000,
 311	0x9830, 0xffffffff, 0x00000000,
 312	0x9834, 0xf00fffff, 0x00000400,
 313	0x9838, 0xfffffffe, 0x00000000,
 314	0xd0c0, 0xff000fff, 0x00000100,
 315	0xd02c, 0xbfffff1f, 0x08421000,
 316	0xd0b8, 0x73773777, 0x12010001,
 317	0x5bb0, 0x000000f0, 0x00000070,
 318	0x98f8, 0x73773777, 0x12010001,
 319	0x98fc, 0xffffffff, 0x00000010,
 320	0x9b7c, 0x00ff0000, 0x00fc0000,
 321	0x8030, 0x00001f0f, 0x0000100a,
 322	0x2f48, 0x73773777, 0x12010001,
 323	0x2408, 0x00030000, 0x000c007f,
 324	0x8a14, 0xf000003f, 0x00000007,
 325	0x8b24, 0x3fff3fff, 0x00ff0fff,
 326	0x8b10, 0x0000ff0f, 0x00000000,
 327	0x28a4c, 0x07ffffff, 0x06000000,
 328	0x4d8, 0x00000fff, 0x00000100,
 329	0xa008, 0xffffffff, 0x00010000,
 330	0x913c, 0xffff03ff, 0x01000100,
 331	0x8c00, 0x000000ff, 0x00000003,
 332	0x8c04, 0xf8ff00ff, 0x40600060,
 333	0x8cf0, 0x1fff1fff, 0x08e00410,
 334	0x28350, 0x00000f01, 0x00000000,
 335	0x9508, 0xf700071f, 0x00000002,
 336	0x960c, 0xffffffff, 0x54763210,
 337	0x20ef8, 0x01ff01ff, 0x00000002,
 338	0x20e98, 0xfffffbff, 0x00200000,
 339	0x2015c, 0xffffffff, 0x00000f40,
 340	0x88c4, 0x001f3ae3, 0x00000082,
 341	0x8978, 0x3fffffff, 0x04050140,
 342	0x88d4, 0x0000001f, 0x00000010,
 343	0x8974, 0xffffffff, 0x00000000
 344};
 345
 346static const u32 scrapper_golden_registers[] =
 347{
 348	0x690, 0x3fff3fff, 0x20c00033,
 349	0x918c, 0x0fff0fff, 0x00010006,
 350	0x918c, 0x0fff0fff, 0x00010006,
 351	0x91a8, 0x0fff0fff, 0x00010006,
 352	0x91a8, 0x0fff0fff, 0x00010006,
 353	0x9150, 0xffffdfff, 0x6e944040,
 354	0x9150, 0xffffdfff, 0x6e944040,
 355	0x917c, 0x0fff0fff, 0x00030002,
 356	0x917c, 0x0fff0fff, 0x00030002,
 357	0x9198, 0x0fff0fff, 0x00030002,
 358	0x9198, 0x0fff0fff, 0x00030002,
 359	0x915c, 0x0fff0fff, 0x00010000,
 360	0x915c, 0x0fff0fff, 0x00010000,
 361	0x3f90, 0xffff0001, 0xff000000,
 362	0x3f90, 0xffff0001, 0xff000000,
 363	0x9178, 0x0fff0fff, 0x00070000,
 364	0x9178, 0x0fff0fff, 0x00070000,
 365	0x9194, 0x0fff0fff, 0x00070000,
 366	0x9194, 0x0fff0fff, 0x00070000,
 367	0x9148, 0xffff0001, 0xff000000,
 368	0x9148, 0xffff0001, 0xff000000,
 369	0x9190, 0x0fff0fff, 0x00090008,
 370	0x9190, 0x0fff0fff, 0x00090008,
 371	0x91ac, 0x0fff0fff, 0x00090008,
 372	0x91ac, 0x0fff0fff, 0x00090008,
 373	0x3f94, 0xffff0000, 0xff000000,
 374	0x3f94, 0xffff0000, 0xff000000,
 375	0x914c, 0xffff0000, 0xff000000,
 376	0x914c, 0xffff0000, 0xff000000,
 377	0x929c, 0x00000fff, 0x00000001,
 378	0x929c, 0x00000fff, 0x00000001,
 379	0x55e4, 0xff607fff, 0xfc000100,
 380	0x8a18, 0xff000fff, 0x00000100,
 381	0x8a18, 0xff000fff, 0x00000100,
 382	0x8b28, 0xff000fff, 0x00000100,
 383	0x8b28, 0xff000fff, 0x00000100,
 384	0x9144, 0xfffc0fff, 0x00000100,
 385	0x9144, 0xfffc0fff, 0x00000100,
 386	0x6ed8, 0x00010101, 0x00010000,
 387	0x9830, 0xffffffff, 0x00000000,
 388	0x9830, 0xffffffff, 0x00000000,
 389	0x9834, 0xf00fffff, 0x00000400,
 390	0x9834, 0xf00fffff, 0x00000400,
 391	0x9838, 0xfffffffe, 0x00000000,
 392	0x9838, 0xfffffffe, 0x00000000,
 393	0xd0c0, 0xff000fff, 0x00000100,
 394	0xd02c, 0xbfffff1f, 0x08421000,
 395	0xd02c, 0xbfffff1f, 0x08421000,
 396	0xd0b8, 0x73773777, 0x12010001,
 397	0xd0b8, 0x73773777, 0x12010001,
 398	0x5bb0, 0x000000f0, 0x00000070,
 399	0x98f8, 0x73773777, 0x12010001,
 400	0x98f8, 0x73773777, 0x12010001,
 401	0x98fc, 0xffffffff, 0x00000010,
 402	0x98fc, 0xffffffff, 0x00000010,
 403	0x9b7c, 0x00ff0000, 0x00fc0000,
 404	0x9b7c, 0x00ff0000, 0x00fc0000,
 405	0x8030, 0x00001f0f, 0x0000100a,
 406	0x8030, 0x00001f0f, 0x0000100a,
 407	0x2f48, 0x73773777, 0x12010001,
 408	0x2f48, 0x73773777, 0x12010001,
 409	0x2408, 0x00030000, 0x000c007f,
 410	0x8a14, 0xf000003f, 0x00000007,
 411	0x8a14, 0xf000003f, 0x00000007,
 412	0x8b24, 0x3fff3fff, 0x00ff0fff,
 413	0x8b24, 0x3fff3fff, 0x00ff0fff,
 414	0x8b10, 0x0000ff0f, 0x00000000,
 415	0x8b10, 0x0000ff0f, 0x00000000,
 416	0x28a4c, 0x07ffffff, 0x06000000,
 417	0x28a4c, 0x07ffffff, 0x06000000,
 418	0x4d8, 0x00000fff, 0x00000100,
 419	0x4d8, 0x00000fff, 0x00000100,
 420	0xa008, 0xffffffff, 0x00010000,
 421	0xa008, 0xffffffff, 0x00010000,
 422	0x913c, 0xffff03ff, 0x01000100,
 423	0x913c, 0xffff03ff, 0x01000100,
 424	0x90e8, 0x001fffff, 0x010400c0,
 425	0x8c00, 0x000000ff, 0x00000003,
 426	0x8c00, 0x000000ff, 0x00000003,
 427	0x8c04, 0xf8ff00ff, 0x40600060,
 428	0x8c04, 0xf8ff00ff, 0x40600060,
 429	0x8c30, 0x0000000f, 0x00040005,
 430	0x8cf0, 0x1fff1fff, 0x08e00410,
 431	0x8cf0, 0x1fff1fff, 0x08e00410,
 432	0x900c, 0x00ffffff, 0x0017071f,
 433	0x28350, 0x00000f01, 0x00000000,
 434	0x28350, 0x00000f01, 0x00000000,
 435	0x9508, 0xf700071f, 0x00000002,
 436	0x9508, 0xf700071f, 0x00000002,
 437	0x9688, 0x00300000, 0x0017000f,
 438	0x960c, 0xffffffff, 0x54763210,
 439	0x960c, 0xffffffff, 0x54763210,
 440	0x20ef8, 0x01ff01ff, 0x00000002,
 441	0x20e98, 0xfffffbff, 0x00200000,
 442	0x2015c, 0xffffffff, 0x00000f40,
 443	0x88c4, 0x001f3ae3, 0x00000082,
 444	0x88c4, 0x001f3ae3, 0x00000082,
 445	0x8978, 0x3fffffff, 0x04050140,
 446	0x8978, 0x3fffffff, 0x04050140,
 447	0x88d4, 0x0000001f, 0x00000010,
 448	0x88d4, 0x0000001f, 0x00000010,
 449	0x8974, 0xffffffff, 0x00000000,
 450	0x8974, 0xffffffff, 0x00000000
 451};
 452
 453static void ni_init_golden_registers(struct radeon_device *rdev)
 454{
 455	switch (rdev->family) {
 456	case CHIP_CAYMAN:
 457		radeon_program_register_sequence(rdev,
 458						 cayman_golden_registers,
 459						 (const u32)ARRAY_SIZE(cayman_golden_registers));
 460		radeon_program_register_sequence(rdev,
 461						 cayman_golden_registers2,
 462						 (const u32)ARRAY_SIZE(cayman_golden_registers2));
 463		break;
 464	case CHIP_ARUBA:
 465		if ((rdev->pdev->device == 0x9900) ||
 466		    (rdev->pdev->device == 0x9901) ||
 467		    (rdev->pdev->device == 0x9903) ||
 468		    (rdev->pdev->device == 0x9904) ||
 469		    (rdev->pdev->device == 0x9905) ||
 470		    (rdev->pdev->device == 0x9906) ||
 471		    (rdev->pdev->device == 0x9907) ||
 472		    (rdev->pdev->device == 0x9908) ||
 473		    (rdev->pdev->device == 0x9909) ||
 474		    (rdev->pdev->device == 0x990A) ||
 475		    (rdev->pdev->device == 0x990B) ||
 476		    (rdev->pdev->device == 0x990C) ||
 477		    (rdev->pdev->device == 0x990D) ||
 478		    (rdev->pdev->device == 0x990E) ||
 479		    (rdev->pdev->device == 0x990F) ||
 480		    (rdev->pdev->device == 0x9910) ||
 481		    (rdev->pdev->device == 0x9913) ||
 482		    (rdev->pdev->device == 0x9917) ||
 483		    (rdev->pdev->device == 0x9918)) {
 484			radeon_program_register_sequence(rdev,
 485							 dvst_golden_registers,
 486							 (const u32)ARRAY_SIZE(dvst_golden_registers));
 487			radeon_program_register_sequence(rdev,
 488							 dvst_golden_registers2,
 489							 (const u32)ARRAY_SIZE(dvst_golden_registers2));
 490		} else {
 491			radeon_program_register_sequence(rdev,
 492							 scrapper_golden_registers,
 493							 (const u32)ARRAY_SIZE(scrapper_golden_registers));
 494			radeon_program_register_sequence(rdev,
 495							 dvst_golden_registers2,
 496							 (const u32)ARRAY_SIZE(dvst_golden_registers2));
 497		}
 498		break;
 499	default:
 500		break;
 501	}
 502}
 503
 504#define BTC_IO_MC_REGS_SIZE 29
 505
 506static const u32 barts_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
 507	{0x00000077, 0xff010100},
 508	{0x00000078, 0x00000000},
 509	{0x00000079, 0x00001434},
 510	{0x0000007a, 0xcc08ec08},
 511	{0x0000007b, 0x00040000},
 512	{0x0000007c, 0x000080c0},
 513	{0x0000007d, 0x09000000},
 514	{0x0000007e, 0x00210404},
 515	{0x00000081, 0x08a8e800},
 516	{0x00000082, 0x00030444},
 517	{0x00000083, 0x00000000},
 518	{0x00000085, 0x00000001},
 519	{0x00000086, 0x00000002},
 520	{0x00000087, 0x48490000},
 521	{0x00000088, 0x20244647},
 522	{0x00000089, 0x00000005},
 523	{0x0000008b, 0x66030000},
 524	{0x0000008c, 0x00006603},
 525	{0x0000008d, 0x00000100},
 526	{0x0000008f, 0x00001c0a},
 527	{0x00000090, 0xff000001},
 528	{0x00000094, 0x00101101},
 529	{0x00000095, 0x00000fff},
 530	{0x00000096, 0x00116fff},
 531	{0x00000097, 0x60010000},
 532	{0x00000098, 0x10010000},
 533	{0x00000099, 0x00006000},
 534	{0x0000009a, 0x00001000},
 535	{0x0000009f, 0x00946a00}
 536};
 537
 538static const u32 turks_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
 539	{0x00000077, 0xff010100},
 540	{0x00000078, 0x00000000},
 541	{0x00000079, 0x00001434},
 542	{0x0000007a, 0xcc08ec08},
 543	{0x0000007b, 0x00040000},
 544	{0x0000007c, 0x000080c0},
 545	{0x0000007d, 0x09000000},
 546	{0x0000007e, 0x00210404},
 547	{0x00000081, 0x08a8e800},
 548	{0x00000082, 0x00030444},
 549	{0x00000083, 0x00000000},
 550	{0x00000085, 0x00000001},
 551	{0x00000086, 0x00000002},
 552	{0x00000087, 0x48490000},
 553	{0x00000088, 0x20244647},
 554	{0x00000089, 0x00000005},
 555	{0x0000008b, 0x66030000},
 556	{0x0000008c, 0x00006603},
 557	{0x0000008d, 0x00000100},
 558	{0x0000008f, 0x00001c0a},
 559	{0x00000090, 0xff000001},
 560	{0x00000094, 0x00101101},
 561	{0x00000095, 0x00000fff},
 562	{0x00000096, 0x00116fff},
 563	{0x00000097, 0x60010000},
 564	{0x00000098, 0x10010000},
 565	{0x00000099, 0x00006000},
 566	{0x0000009a, 0x00001000},
 567	{0x0000009f, 0x00936a00}
 568};
 569
 570static const u32 caicos_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
 571	{0x00000077, 0xff010100},
 572	{0x00000078, 0x00000000},
 573	{0x00000079, 0x00001434},
 574	{0x0000007a, 0xcc08ec08},
 575	{0x0000007b, 0x00040000},
 576	{0x0000007c, 0x000080c0},
 577	{0x0000007d, 0x09000000},
 578	{0x0000007e, 0x00210404},
 579	{0x00000081, 0x08a8e800},
 580	{0x00000082, 0x00030444},
 581	{0x00000083, 0x00000000},
 582	{0x00000085, 0x00000001},
 583	{0x00000086, 0x00000002},
 584	{0x00000087, 0x48490000},
 585	{0x00000088, 0x20244647},
 586	{0x00000089, 0x00000005},
 587	{0x0000008b, 0x66030000},
 588	{0x0000008c, 0x00006603},
 589	{0x0000008d, 0x00000100},
 590	{0x0000008f, 0x00001c0a},
 591	{0x00000090, 0xff000001},
 592	{0x00000094, 0x00101101},
 593	{0x00000095, 0x00000fff},
 594	{0x00000096, 0x00116fff},
 595	{0x00000097, 0x60010000},
 596	{0x00000098, 0x10010000},
 597	{0x00000099, 0x00006000},
 598	{0x0000009a, 0x00001000},
 599	{0x0000009f, 0x00916a00}
 600};
 601
 602static const u32 cayman_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
 603	{0x00000077, 0xff010100},
 604	{0x00000078, 0x00000000},
 605	{0x00000079, 0x00001434},
 606	{0x0000007a, 0xcc08ec08},
 607	{0x0000007b, 0x00040000},
 608	{0x0000007c, 0x000080c0},
 609	{0x0000007d, 0x09000000},
 610	{0x0000007e, 0x00210404},
 611	{0x00000081, 0x08a8e800},
 612	{0x00000082, 0x00030444},
 613	{0x00000083, 0x00000000},
 614	{0x00000085, 0x00000001},
 615	{0x00000086, 0x00000002},
 616	{0x00000087, 0x48490000},
 617	{0x00000088, 0x20244647},
 618	{0x00000089, 0x00000005},
 619	{0x0000008b, 0x66030000},
 620	{0x0000008c, 0x00006603},
 621	{0x0000008d, 0x00000100},
 622	{0x0000008f, 0x00001c0a},
 623	{0x00000090, 0xff000001},
 624	{0x00000094, 0x00101101},
 625	{0x00000095, 0x00000fff},
 626	{0x00000096, 0x00116fff},
 627	{0x00000097, 0x60010000},
 628	{0x00000098, 0x10010000},
 629	{0x00000099, 0x00006000},
 630	{0x0000009a, 0x00001000},
 631	{0x0000009f, 0x00976b00}
 632};
 633
 634int ni_mc_load_microcode(struct radeon_device *rdev)
 635{
 636	const __be32 *fw_data;
 637	u32 mem_type, running, blackout = 0;
 638	u32 *io_mc_regs;
 639	int i, ucode_size, regs_size;
 640
 641	if (!rdev->mc_fw)
 642		return -EINVAL;
 643
 644	switch (rdev->family) {
 645	case CHIP_BARTS:
 646		io_mc_regs = (u32 *)&barts_io_mc_regs;
 647		ucode_size = BTC_MC_UCODE_SIZE;
 648		regs_size = BTC_IO_MC_REGS_SIZE;
 649		break;
 650	case CHIP_TURKS:
 651		io_mc_regs = (u32 *)&turks_io_mc_regs;
 652		ucode_size = BTC_MC_UCODE_SIZE;
 653		regs_size = BTC_IO_MC_REGS_SIZE;
 654		break;
 655	case CHIP_CAICOS:
 656	default:
 657		io_mc_regs = (u32 *)&caicos_io_mc_regs;
 658		ucode_size = BTC_MC_UCODE_SIZE;
 659		regs_size = BTC_IO_MC_REGS_SIZE;
 660		break;
 661	case CHIP_CAYMAN:
 662		io_mc_regs = (u32 *)&cayman_io_mc_regs;
 663		ucode_size = CAYMAN_MC_UCODE_SIZE;
 664		regs_size = BTC_IO_MC_REGS_SIZE;
 665		break;
 666	}
 667
 668	mem_type = (RREG32(MC_SEQ_MISC0) & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT;
 669	running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
 670
 671	if ((mem_type == MC_SEQ_MISC0_GDDR5_VALUE) && (running == 0)) {
 672		if (running) {
 673			blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
 674			WREG32(MC_SHARED_BLACKOUT_CNTL, 1);
 675		}
 676
 677		/* reset the engine and set to writable */
 678		WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
 679		WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
 680
 681		/* load mc io regs */
 682		for (i = 0; i < regs_size; i++) {
 683			WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
 684			WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
 685		}
 686		/* load the MC ucode */
 687		fw_data = (const __be32 *)rdev->mc_fw->data;
 688		for (i = 0; i < ucode_size; i++)
 689			WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
 690
 691		/* put the engine back into the active state */
 692		WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
 693		WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
 694		WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
 695
 696		/* wait for training to complete */
 697		for (i = 0; i < rdev->usec_timeout; i++) {
 698			if (RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD)
 699				break;
 700			udelay(1);
 701		}
 702
 703		if (running)
 704			WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
 705	}
 706
 707	return 0;
 708}
 709
 710int ni_init_microcode(struct radeon_device *rdev)
 711{
 
 712	const char *chip_name;
 713	const char *rlc_chip_name;
 714	size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size;
 715	size_t smc_req_size = 0;
 716	char fw_name[30];
 717	int err;
 718
 719	DRM_DEBUG("\n");
 720
 
 
 
 
 
 
 
 721	switch (rdev->family) {
 722	case CHIP_BARTS:
 723		chip_name = "BARTS";
 724		rlc_chip_name = "BTC";
 725		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
 726		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
 727		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
 728		mc_req_size = BTC_MC_UCODE_SIZE * 4;
 729		smc_req_size = ALIGN(BARTS_SMC_UCODE_SIZE, 4);
 730		break;
 731	case CHIP_TURKS:
 732		chip_name = "TURKS";
 733		rlc_chip_name = "BTC";
 734		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
 735		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
 736		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
 737		mc_req_size = BTC_MC_UCODE_SIZE * 4;
 738		smc_req_size = ALIGN(TURKS_SMC_UCODE_SIZE, 4);
 739		break;
 740	case CHIP_CAICOS:
 741		chip_name = "CAICOS";
 742		rlc_chip_name = "BTC";
 743		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
 744		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
 745		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
 746		mc_req_size = BTC_MC_UCODE_SIZE * 4;
 747		smc_req_size = ALIGN(CAICOS_SMC_UCODE_SIZE, 4);
 748		break;
 749	case CHIP_CAYMAN:
 750		chip_name = "CAYMAN";
 751		rlc_chip_name = "CAYMAN";
 752		pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
 753		me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
 754		rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4;
 755		mc_req_size = CAYMAN_MC_UCODE_SIZE * 4;
 756		smc_req_size = ALIGN(CAYMAN_SMC_UCODE_SIZE, 4);
 757		break;
 758	case CHIP_ARUBA:
 759		chip_name = "ARUBA";
 760		rlc_chip_name = "ARUBA";
 761		/* pfp/me same size as CAYMAN */
 762		pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
 763		me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
 764		rlc_req_size = ARUBA_RLC_UCODE_SIZE * 4;
 765		mc_req_size = 0;
 766		break;
 767	default: BUG();
 768	}
 769
 770	DRM_INFO("Loading %s Microcode\n", chip_name);
 771
 772	snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
 773	err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
 774	if (err)
 775		goto out;
 776	if (rdev->pfp_fw->size != pfp_req_size) {
 777		pr_err("ni_cp: Bogus length %zu in firmware \"%s\"\n",
 
 778		       rdev->pfp_fw->size, fw_name);
 779		err = -EINVAL;
 780		goto out;
 781	}
 782
 783	snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
 784	err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
 785	if (err)
 786		goto out;
 787	if (rdev->me_fw->size != me_req_size) {
 788		pr_err("ni_cp: Bogus length %zu in firmware \"%s\"\n",
 
 789		       rdev->me_fw->size, fw_name);
 790		err = -EINVAL;
 791	}
 792
 793	snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
 794	err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
 795	if (err)
 796		goto out;
 797	if (rdev->rlc_fw->size != rlc_req_size) {
 798		pr_err("ni_rlc: Bogus length %zu in firmware \"%s\"\n",
 
 799		       rdev->rlc_fw->size, fw_name);
 800		err = -EINVAL;
 801	}
 802
 803	/* no MC ucode on TN */
 804	if (!(rdev->flags & RADEON_IS_IGP)) {
 805		snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
 806		err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
 807		if (err)
 808			goto out;
 809		if (rdev->mc_fw->size != mc_req_size) {
 810			pr_err("ni_mc: Bogus length %zu in firmware \"%s\"\n",
 811			       rdev->mc_fw->size, fw_name);
 812			err = -EINVAL;
 813		}
 814	}
 815
 816	if ((rdev->family >= CHIP_BARTS) && (rdev->family <= CHIP_CAYMAN)) {
 817		snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
 818		err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
 819		if (err) {
 820			pr_err("smc: error loading firmware \"%s\"\n", fw_name);
 821			release_firmware(rdev->smc_fw);
 822			rdev->smc_fw = NULL;
 823			err = 0;
 824		} else if (rdev->smc_fw->size != smc_req_size) {
 825			pr_err("ni_mc: Bogus length %zu in firmware \"%s\"\n",
 826			       rdev->mc_fw->size, fw_name);
 827			err = -EINVAL;
 828		}
 829	}
 
 
 830
 831out:
 832	if (err) {
 833		if (err != -EINVAL)
 834			pr_err("ni_cp: Failed to load firmware \"%s\"\n",
 
 835			       fw_name);
 836		release_firmware(rdev->pfp_fw);
 837		rdev->pfp_fw = NULL;
 838		release_firmware(rdev->me_fw);
 839		rdev->me_fw = NULL;
 840		release_firmware(rdev->rlc_fw);
 841		rdev->rlc_fw = NULL;
 842		release_firmware(rdev->mc_fw);
 843		rdev->mc_fw = NULL;
 844	}
 845	return err;
 846}
 847
 848/**
 849 * cayman_get_allowed_info_register - fetch the register for the info ioctl
 850 *
 851 * @rdev: radeon_device pointer
 852 * @reg: register offset in bytes
 853 * @val: register value
 854 *
 855 * Returns 0 for success or -EINVAL for an invalid register
 856 *
 857 */
 858int cayman_get_allowed_info_register(struct radeon_device *rdev,
 859				     u32 reg, u32 *val)
 860{
 861	switch (reg) {
 862	case GRBM_STATUS:
 863	case GRBM_STATUS_SE0:
 864	case GRBM_STATUS_SE1:
 865	case SRBM_STATUS:
 866	case SRBM_STATUS2:
 867	case (DMA_STATUS_REG + DMA0_REGISTER_OFFSET):
 868	case (DMA_STATUS_REG + DMA1_REGISTER_OFFSET):
 869	case UVD_STATUS:
 870		*val = RREG32(reg);
 871		return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 872	default:
 873		return -EINVAL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 874	}
 
 
 875}
 876
 877int tn_get_temp(struct radeon_device *rdev)
 
 
 
 878{
 879	u32 temp = RREG32_SMC(TN_CURRENT_GNB_TEMP) & 0x7ff;
 880	int actual_temp = (temp / 8) - 49;
 881
 882	return actual_temp * 1000;
 
 
 
 
 
 883}
 884
 885/*
 886 * Core functions
 887 */
 888static void cayman_gpu_init(struct radeon_device *rdev)
 889{
 
 
 890	u32 gb_addr_config = 0;
 891	u32 mc_shared_chmap, mc_arb_ramcfg;
 
 892	u32 cgts_tcc_disable;
 893	u32 sx_debug_1;
 894	u32 smx_dc_ctl0;
 
 
 
 895	u32 cgts_sm_ctrl_reg;
 896	u32 hdp_host_path_cntl;
 897	u32 tmp;
 898	u32 disabled_rb_mask;
 899	int i, j;
 900
 901	switch (rdev->family) {
 902	case CHIP_CAYMAN:
 
 903		rdev->config.cayman.max_shader_engines = 2;
 904		rdev->config.cayman.max_pipes_per_simd = 4;
 905		rdev->config.cayman.max_tile_pipes = 8;
 906		rdev->config.cayman.max_simds_per_se = 12;
 907		rdev->config.cayman.max_backends_per_se = 4;
 908		rdev->config.cayman.max_texture_channel_caches = 8;
 909		rdev->config.cayman.max_gprs = 256;
 910		rdev->config.cayman.max_threads = 256;
 911		rdev->config.cayman.max_gs_threads = 32;
 912		rdev->config.cayman.max_stack_entries = 512;
 913		rdev->config.cayman.sx_num_of_sets = 8;
 914		rdev->config.cayman.sx_max_export_size = 256;
 915		rdev->config.cayman.sx_max_export_pos_size = 64;
 916		rdev->config.cayman.sx_max_export_smx_size = 192;
 917		rdev->config.cayman.max_hw_contexts = 8;
 918		rdev->config.cayman.sq_num_cf_insts = 2;
 919
 920		rdev->config.cayman.sc_prim_fifo_size = 0x100;
 921		rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
 922		rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
 923		gb_addr_config = CAYMAN_GB_ADDR_CONFIG_GOLDEN;
 924		break;
 925	case CHIP_ARUBA:
 926	default:
 927		rdev->config.cayman.max_shader_engines = 1;
 928		rdev->config.cayman.max_pipes_per_simd = 4;
 929		rdev->config.cayman.max_tile_pipes = 2;
 930		if ((rdev->pdev->device == 0x9900) ||
 931		    (rdev->pdev->device == 0x9901) ||
 932		    (rdev->pdev->device == 0x9905) ||
 933		    (rdev->pdev->device == 0x9906) ||
 934		    (rdev->pdev->device == 0x9907) ||
 935		    (rdev->pdev->device == 0x9908) ||
 936		    (rdev->pdev->device == 0x9909) ||
 937		    (rdev->pdev->device == 0x990B) ||
 938		    (rdev->pdev->device == 0x990C) ||
 939		    (rdev->pdev->device == 0x990F) ||
 940		    (rdev->pdev->device == 0x9910) ||
 941		    (rdev->pdev->device == 0x9917) ||
 942		    (rdev->pdev->device == 0x9999) ||
 943		    (rdev->pdev->device == 0x999C)) {
 944			rdev->config.cayman.max_simds_per_se = 6;
 945			rdev->config.cayman.max_backends_per_se = 2;
 946			rdev->config.cayman.max_hw_contexts = 8;
 947			rdev->config.cayman.sx_max_export_size = 256;
 948			rdev->config.cayman.sx_max_export_pos_size = 64;
 949			rdev->config.cayman.sx_max_export_smx_size = 192;
 950		} else if ((rdev->pdev->device == 0x9903) ||
 951			   (rdev->pdev->device == 0x9904) ||
 952			   (rdev->pdev->device == 0x990A) ||
 953			   (rdev->pdev->device == 0x990D) ||
 954			   (rdev->pdev->device == 0x990E) ||
 955			   (rdev->pdev->device == 0x9913) ||
 956			   (rdev->pdev->device == 0x9918) ||
 957			   (rdev->pdev->device == 0x999D)) {
 958			rdev->config.cayman.max_simds_per_se = 4;
 959			rdev->config.cayman.max_backends_per_se = 2;
 960			rdev->config.cayman.max_hw_contexts = 8;
 961			rdev->config.cayman.sx_max_export_size = 256;
 962			rdev->config.cayman.sx_max_export_pos_size = 64;
 963			rdev->config.cayman.sx_max_export_smx_size = 192;
 964		} else if ((rdev->pdev->device == 0x9919) ||
 965			   (rdev->pdev->device == 0x9990) ||
 966			   (rdev->pdev->device == 0x9991) ||
 967			   (rdev->pdev->device == 0x9994) ||
 968			   (rdev->pdev->device == 0x9995) ||
 969			   (rdev->pdev->device == 0x9996) ||
 970			   (rdev->pdev->device == 0x999A) ||
 971			   (rdev->pdev->device == 0x99A0)) {
 972			rdev->config.cayman.max_simds_per_se = 3;
 973			rdev->config.cayman.max_backends_per_se = 1;
 974			rdev->config.cayman.max_hw_contexts = 4;
 975			rdev->config.cayman.sx_max_export_size = 128;
 976			rdev->config.cayman.sx_max_export_pos_size = 32;
 977			rdev->config.cayman.sx_max_export_smx_size = 96;
 978		} else {
 979			rdev->config.cayman.max_simds_per_se = 2;
 980			rdev->config.cayman.max_backends_per_se = 1;
 981			rdev->config.cayman.max_hw_contexts = 4;
 982			rdev->config.cayman.sx_max_export_size = 128;
 983			rdev->config.cayman.sx_max_export_pos_size = 32;
 984			rdev->config.cayman.sx_max_export_smx_size = 96;
 985		}
 986		rdev->config.cayman.max_texture_channel_caches = 2;
 987		rdev->config.cayman.max_gprs = 256;
 988		rdev->config.cayman.max_threads = 256;
 989		rdev->config.cayman.max_gs_threads = 32;
 990		rdev->config.cayman.max_stack_entries = 512;
 991		rdev->config.cayman.sx_num_of_sets = 8;
 992		rdev->config.cayman.sq_num_cf_insts = 2;
 993
 994		rdev->config.cayman.sc_prim_fifo_size = 0x40;
 995		rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
 996		rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
 997		gb_addr_config = ARUBA_GB_ADDR_CONFIG_GOLDEN;
 998		break;
 999	}
1000
1001	/* Initialize HDP */
1002	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
1003		WREG32((0x2c14 + j), 0x00000000);
1004		WREG32((0x2c18 + j), 0x00000000);
1005		WREG32((0x2c1c + j), 0x00000000);
1006		WREG32((0x2c20 + j), 0x00000000);
1007		WREG32((0x2c24 + j), 0x00000000);
1008	}
1009
1010	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
1011	WREG32(SRBM_INT_CNTL, 0x1);
1012	WREG32(SRBM_INT_ACK, 0x1);
1013
1014	evergreen_fix_pci_max_read_req_size(rdev);
1015
1016	mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
1017	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1018
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1019	tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
1020	rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
1021	if (rdev->config.cayman.mem_row_size_in_kb > 4)
1022		rdev->config.cayman.mem_row_size_in_kb = 4;
1023	/* XXX use MC settings? */
1024	rdev->config.cayman.shader_engine_tile_size = 32;
1025	rdev->config.cayman.num_gpus = 1;
1026	rdev->config.cayman.multi_gpu_tile_size = 64;
1027
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1028	tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT;
1029	rdev->config.cayman.num_tile_pipes = (1 << tmp);
1030	tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT;
1031	rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
1032	tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT;
1033	rdev->config.cayman.num_shader_engines = tmp + 1;
1034	tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT;
1035	rdev->config.cayman.num_gpus = tmp + 1;
1036	tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT;
1037	rdev->config.cayman.multi_gpu_tile_size = 1 << tmp;
1038	tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT;
1039	rdev->config.cayman.mem_row_size_in_kb = 1 << tmp;
1040
1041
 
 
 
 
 
 
 
 
 
 
1042	/* setup tiling info dword.  gb_addr_config is not adequate since it does
1043	 * not have bank info, so create a custom tiling dword.
1044	 * bits 3:0   num_pipes
1045	 * bits 7:4   num_banks
1046	 * bits 11:8  group_size
1047	 * bits 15:12 row_size
1048	 */
1049	rdev->config.cayman.tile_config = 0;
1050	switch (rdev->config.cayman.num_tile_pipes) {
1051	case 1:
1052	default:
1053		rdev->config.cayman.tile_config |= (0 << 0);
1054		break;
1055	case 2:
1056		rdev->config.cayman.tile_config |= (1 << 0);
1057		break;
1058	case 4:
1059		rdev->config.cayman.tile_config |= (2 << 0);
1060		break;
1061	case 8:
1062		rdev->config.cayman.tile_config |= (3 << 0);
1063		break;
1064	}
1065
1066	/* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */
1067	if (rdev->flags & RADEON_IS_IGP)
1068		rdev->config.cayman.tile_config |= 1 << 4;
1069	else {
1070		switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
1071		case 0: /* four banks */
1072			rdev->config.cayman.tile_config |= 0 << 4;
1073			break;
1074		case 1: /* eight banks */
1075			rdev->config.cayman.tile_config |= 1 << 4;
1076			break;
1077		case 2: /* sixteen banks */
1078		default:
1079			rdev->config.cayman.tile_config |= 2 << 4;
1080			break;
1081		}
1082	}
1083	rdev->config.cayman.tile_config |=
1084		((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
1085	rdev->config.cayman.tile_config |=
1086		((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
1087
1088	tmp = 0;
1089	for (i = (rdev->config.cayman.max_shader_engines - 1); i >= 0; i--) {
1090		u32 rb_disable_bitmap;
1091
1092		WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1093		WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1094		rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16;
1095		tmp <<= 4;
1096		tmp |= rb_disable_bitmap;
1097	}
1098	/* enabled rb are just the one not disabled :) */
1099	disabled_rb_mask = tmp;
1100	tmp = 0;
1101	for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
1102		tmp |= (1 << i);
1103	/* if all the backends are disabled, fix it up here */
1104	if ((disabled_rb_mask & tmp) == tmp) {
1105		for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
1106			disabled_rb_mask &= ~(1 << i);
1107	}
1108
1109	for (i = 0; i < rdev->config.cayman.max_shader_engines; i++) {
1110		u32 simd_disable_bitmap;
1111
1112		WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1113		WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
1114		simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
1115		simd_disable_bitmap |= 0xffffffff << rdev->config.cayman.max_simds_per_se;
1116		tmp <<= 16;
1117		tmp |= simd_disable_bitmap;
1118	}
1119	rdev->config.cayman.active_simds = hweight32(~tmp);
1120
1121	WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1122	WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1123
1124	WREG32(GB_ADDR_CONFIG, gb_addr_config);
1125	WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
1126	if (ASIC_IS_DCE6(rdev))
1127		WREG32(DMIF_ADDR_CALC, gb_addr_config);
1128	WREG32(HDP_ADDR_CONFIG, gb_addr_config);
1129	WREG32(DMA_TILING_CONFIG + DMA0_REGISTER_OFFSET, gb_addr_config);
1130	WREG32(DMA_TILING_CONFIG + DMA1_REGISTER_OFFSET, gb_addr_config);
1131	WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
1132	WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
1133	WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
1134
1135	if ((rdev->config.cayman.max_backends_per_se == 1) &&
1136	    (rdev->flags & RADEON_IS_IGP)) {
1137		if ((disabled_rb_mask & 3) == 2) {
1138			/* RB1 disabled, RB0 enabled */
1139			tmp = 0x00000000;
1140		} else {
1141			/* RB0 disabled, RB1 enabled */
1142			tmp = 0x11111111;
1143		}
1144	} else {
1145		tmp = gb_addr_config & NUM_PIPES_MASK;
1146		tmp = r6xx_remap_render_backend(rdev, tmp,
1147						rdev->config.cayman.max_backends_per_se *
1148						rdev->config.cayman.max_shader_engines,
1149						CAYMAN_MAX_BACKENDS, disabled_rb_mask);
1150	}
1151	rdev->config.cayman.backend_map = tmp;
1152	WREG32(GB_BACKEND_MAP, tmp);
1153
1154	cgts_tcc_disable = 0xffff0000;
1155	for (i = 0; i < rdev->config.cayman.max_texture_channel_caches; i++)
1156		cgts_tcc_disable &= ~(1 << (16 + i));
1157	WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable);
1158	WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable);
 
 
 
 
 
 
1159	WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable);
1160	WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable);
1161
1162	/* reprogram the shader complex */
1163	cgts_sm_ctrl_reg = RREG32(CGTS_SM_CTRL_REG);
1164	for (i = 0; i < 16; i++)
1165		WREG32(CGTS_SM_CTRL_REG, OVERRIDE);
1166	WREG32(CGTS_SM_CTRL_REG, cgts_sm_ctrl_reg);
1167
1168	/* set HW defaults for 3D engine */
1169	WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
1170
1171	sx_debug_1 = RREG32(SX_DEBUG_1);
1172	sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
1173	WREG32(SX_DEBUG_1, sx_debug_1);
1174
1175	smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
1176	smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
1177	smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.cayman.sx_num_of_sets);
1178	WREG32(SMX_DC_CTL0, smx_dc_ctl0);
1179
1180	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4) | CRC_SIMD_ID_WADDR_DISABLE);
1181
1182	/* need to be explicitly zero-ed */
1183	WREG32(VGT_OFFCHIP_LDS_BASE, 0);
1184	WREG32(SQ_LSTMP_RING_BASE, 0);
1185	WREG32(SQ_HSTMP_RING_BASE, 0);
1186	WREG32(SQ_ESTMP_RING_BASE, 0);
1187	WREG32(SQ_GSTMP_RING_BASE, 0);
1188	WREG32(SQ_VSTMP_RING_BASE, 0);
1189	WREG32(SQ_PSTMP_RING_BASE, 0);
1190
1191	WREG32(TA_CNTL_AUX, DISABLE_CUBE_ANISO);
1192
1193	WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.cayman.sx_max_export_size / 4) - 1) |
1194					POSITION_BUFFER_SIZE((rdev->config.cayman.sx_max_export_pos_size / 4) - 1) |
1195					SMX_BUFFER_SIZE((rdev->config.cayman.sx_max_export_smx_size / 4) - 1)));
1196
1197	WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.cayman.sc_prim_fifo_size) |
1198				 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_hiz_tile_fifo_size) |
1199				 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_earlyz_tile_fifo_size)));
1200
1201
1202	WREG32(VGT_NUM_INSTANCES, 1);
1203
1204	WREG32(CP_PERFMON_CNTL, 0);
1205
1206	WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.cayman.sq_num_cf_insts) |
1207				  FETCH_FIFO_HIWATER(0x4) |
1208				  DONE_FIFO_HIWATER(0xe0) |
1209				  ALU_UPDATE_FIFO_HIWATER(0x8)));
1210
1211	WREG32(SQ_GPR_RESOURCE_MGMT_1, NUM_CLAUSE_TEMP_GPRS(4));
1212	WREG32(SQ_CONFIG, (VC_ENABLE |
1213			   EXPORT_SRC_C |
1214			   GFX_PRIO(0) |
1215			   CS1_PRIO(0) |
1216			   CS2_PRIO(1)));
1217	WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, DYN_GPR_ENABLE);
1218
1219	WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1220					  FORCE_EOV_MAX_REZ_CNT(255)));
1221
1222	WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
1223	       AUTO_INVLD_EN(ES_AND_GS_AUTO));
1224
1225	WREG32(VGT_GS_VERTEX_REUSE, 16);
1226	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1227
1228	WREG32(CB_PERF_CTR0_SEL_0, 0);
1229	WREG32(CB_PERF_CTR0_SEL_1, 0);
1230	WREG32(CB_PERF_CTR1_SEL_0, 0);
1231	WREG32(CB_PERF_CTR1_SEL_1, 0);
1232	WREG32(CB_PERF_CTR2_SEL_0, 0);
1233	WREG32(CB_PERF_CTR2_SEL_1, 0);
1234	WREG32(CB_PERF_CTR3_SEL_0, 0);
1235	WREG32(CB_PERF_CTR3_SEL_1, 0);
1236
1237	tmp = RREG32(HDP_MISC_CNTL);
1238	tmp |= HDP_FLUSH_INVALIDATE_CACHE;
1239	WREG32(HDP_MISC_CNTL, tmp);
1240
1241	hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1242	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1243
1244	WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
1245
1246	udelay(50);
1247
1248	/* set clockgating golden values on TN */
1249	if (rdev->family == CHIP_ARUBA) {
1250		tmp = RREG32_CG(CG_CGTT_LOCAL_0);
1251		tmp &= ~0x00380000;
1252		WREG32_CG(CG_CGTT_LOCAL_0, tmp);
1253		tmp = RREG32_CG(CG_CGTT_LOCAL_1);
1254		tmp &= ~0x0e000000;
1255		WREG32_CG(CG_CGTT_LOCAL_1, tmp);
1256	}
1257}
1258
1259/*
1260 * GART
1261 */
1262void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev)
1263{
1264	/* flush hdp cache */
1265	WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
1266
1267	/* bits 0-7 are the VM contexts0-7 */
1268	WREG32(VM_INVALIDATE_REQUEST, 1);
1269}
1270
1271static int cayman_pcie_gart_enable(struct radeon_device *rdev)
1272{
1273	int i, r;
1274
1275	if (rdev->gart.robj == NULL) {
1276		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
1277		return -EINVAL;
1278	}
1279	r = radeon_gart_table_vram_pin(rdev);
1280	if (r)
1281		return r;
 
1282	/* Setup TLB control */
1283	WREG32(MC_VM_MX_L1_TLB_CNTL,
1284	       (0xA << 7) |
1285	       ENABLE_L1_TLB |
1286	       ENABLE_L1_FRAGMENT_PROCESSING |
1287	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1288	       ENABLE_ADVANCED_DRIVER_MODEL |
1289	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1290	/* Setup L2 cache */
1291	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
1292	       ENABLE_L2_FRAGMENT_PROCESSING |
1293	       ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1294	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1295	       EFFECTIVE_L2_QUEUE_SIZE(7) |
1296	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
1297	WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
1298	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1299	       BANK_SELECT(6) |
1300	       L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1301	/* setup context0 */
1302	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
1303	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
1304	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
1305	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
1306			(u32)(rdev->dummy_page.addr >> 12));
1307	WREG32(VM_CONTEXT0_CNTL2, 0);
1308	WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
1309				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
1310
1311	WREG32(0x15D4, 0);
1312	WREG32(0x15D8, 0);
1313	WREG32(0x15DC, 0);
1314
1315	/* empty context1-7 */
1316	/* Assign the pt base to something valid for now; the pts used for
1317	 * the VMs are determined by the application and setup and assigned
1318	 * on the fly in the vm part of radeon_gart.c
1319	 */
1320	for (i = 1; i < 8; i++) {
1321		WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (i << 2), 0);
1322		WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (i << 2),
1323			rdev->vm_manager.max_pfn - 1);
1324		WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
1325		       rdev->vm_manager.saved_table_addr[i]);
1326	}
1327
1328	/* enable context1-7 */
1329	WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
1330	       (u32)(rdev->dummy_page.addr >> 12));
1331	WREG32(VM_CONTEXT1_CNTL2, 4);
1332	WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
1333				PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) |
1334				RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1335				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1336				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1337				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1338				PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
1339				PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
1340				VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
1341				VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
1342				READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
1343				READ_PROTECTION_FAULT_ENABLE_DEFAULT |
1344				WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1345				WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
1346
1347	cayman_pcie_gart_tlb_flush(rdev);
1348	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
1349		 (unsigned)(rdev->mc.gtt_size >> 20),
1350		 (unsigned long long)rdev->gart.table_addr);
1351	rdev->gart.ready = true;
1352	return 0;
1353}
1354
1355static void cayman_pcie_gart_disable(struct radeon_device *rdev)
1356{
1357	unsigned i;
1358
1359	for (i = 1; i < 8; ++i) {
1360		rdev->vm_manager.saved_table_addr[i] = RREG32(
1361			VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2));
1362	}
1363
1364	/* Disable all tables */
1365	WREG32(VM_CONTEXT0_CNTL, 0);
1366	WREG32(VM_CONTEXT1_CNTL, 0);
1367	/* Setup TLB control */
1368	WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING |
1369	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1370	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1371	/* Setup L2 cache */
1372	WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1373	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1374	       EFFECTIVE_L2_QUEUE_SIZE(7) |
1375	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
1376	WREG32(VM_L2_CNTL2, 0);
1377	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1378	       L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1379	radeon_gart_table_vram_unpin(rdev);
 
 
 
 
 
 
 
1380}
1381
1382static void cayman_pcie_gart_fini(struct radeon_device *rdev)
1383{
1384	cayman_pcie_gart_disable(rdev);
1385	radeon_gart_table_vram_free(rdev);
1386	radeon_gart_fini(rdev);
1387}
1388
1389void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
1390			      int ring, u32 cp_int_cntl)
1391{
1392	WREG32(SRBM_GFX_CNTL, RINGID(ring));
1393	WREG32(CP_INT_CNTL, cp_int_cntl);
1394}
1395
1396/*
1397 * CP.
1398 */
1399void cayman_fence_ring_emit(struct radeon_device *rdev,
1400			    struct radeon_fence *fence)
1401{
1402	struct radeon_ring *ring = &rdev->ring[fence->ring];
1403	u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
1404	u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
1405		PACKET3_SH_ACTION_ENA;
1406
1407	/* flush read cache over gart for this vmid */
1408	radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1409	radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
1410	radeon_ring_write(ring, 0xFFFFFFFF);
1411	radeon_ring_write(ring, 0);
1412	radeon_ring_write(ring, 10); /* poll interval */
1413	/* EVENT_WRITE_EOP - flush caches, send int */
1414	radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
1415	radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
1416	radeon_ring_write(ring, lower_32_bits(addr));
1417	radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
1418	radeon_ring_write(ring, fence->seq);
1419	radeon_ring_write(ring, 0);
1420}
1421
1422void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
1423{
1424	struct radeon_ring *ring = &rdev->ring[ib->ring];
1425	unsigned vm_id = ib->vm ? ib->vm->ids[ib->ring].id : 0;
1426	u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
1427		PACKET3_SH_ACTION_ENA;
1428
1429	/* set to DX10/11 mode */
1430	radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
1431	radeon_ring_write(ring, 1);
1432
1433	if (ring->rptr_save_reg) {
1434		uint32_t next_rptr = ring->wptr + 3 + 4 + 8;
1435		radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
1436		radeon_ring_write(ring, ((ring->rptr_save_reg - 
1437					  PACKET3_SET_CONFIG_REG_START) >> 2));
1438		radeon_ring_write(ring, next_rptr);
1439	}
1440
1441	radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
1442	radeon_ring_write(ring,
1443#ifdef __BIG_ENDIAN
1444			  (2 << 0) |
1445#endif
1446			  (ib->gpu_addr & 0xFFFFFFFC));
1447	radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF);
1448	radeon_ring_write(ring, ib->length_dw | (vm_id << 24));
1449
1450	/* flush read cache over gart for this vmid */
1451	radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1452	radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
1453	radeon_ring_write(ring, 0xFFFFFFFF);
1454	radeon_ring_write(ring, 0);
1455	radeon_ring_write(ring, (vm_id << 24) | 10); /* poll interval */
1456}
1457
1458static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
1459{
1460	if (enable)
1461		WREG32(CP_ME_CNTL, 0);
1462	else {
1463		if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1464			radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1465		WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1466		WREG32(SCRATCH_UMSK, 0);
1467		rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1468	}
1469}
1470
1471u32 cayman_gfx_get_rptr(struct radeon_device *rdev,
1472			struct radeon_ring *ring)
1473{
1474	u32 rptr;
1475
1476	if (rdev->wb.enabled)
1477		rptr = rdev->wb.wb[ring->rptr_offs/4];
1478	else {
1479		if (ring->idx == RADEON_RING_TYPE_GFX_INDEX)
1480			rptr = RREG32(CP_RB0_RPTR);
1481		else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX)
1482			rptr = RREG32(CP_RB1_RPTR);
1483		else
1484			rptr = RREG32(CP_RB2_RPTR);
1485	}
1486
1487	return rptr;
1488}
1489
1490u32 cayman_gfx_get_wptr(struct radeon_device *rdev,
1491			struct radeon_ring *ring)
1492{
1493	u32 wptr;
1494
1495	if (ring->idx == RADEON_RING_TYPE_GFX_INDEX)
1496		wptr = RREG32(CP_RB0_WPTR);
1497	else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX)
1498		wptr = RREG32(CP_RB1_WPTR);
1499	else
1500		wptr = RREG32(CP_RB2_WPTR);
1501
1502	return wptr;
1503}
1504
1505void cayman_gfx_set_wptr(struct radeon_device *rdev,
1506			 struct radeon_ring *ring)
1507{
1508	if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) {
1509		WREG32(CP_RB0_WPTR, ring->wptr);
1510		(void)RREG32(CP_RB0_WPTR);
1511	} else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) {
1512		WREG32(CP_RB1_WPTR, ring->wptr);
1513		(void)RREG32(CP_RB1_WPTR);
1514	} else {
1515		WREG32(CP_RB2_WPTR, ring->wptr);
1516		(void)RREG32(CP_RB2_WPTR);
1517	}
1518}
1519
1520static int cayman_cp_load_microcode(struct radeon_device *rdev)
1521{
1522	const __be32 *fw_data;
1523	int i;
1524
1525	if (!rdev->me_fw || !rdev->pfp_fw)
1526		return -EINVAL;
1527
1528	cayman_cp_enable(rdev, false);
1529
1530	fw_data = (const __be32 *)rdev->pfp_fw->data;
1531	WREG32(CP_PFP_UCODE_ADDR, 0);
1532	for (i = 0; i < CAYMAN_PFP_UCODE_SIZE; i++)
1533		WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1534	WREG32(CP_PFP_UCODE_ADDR, 0);
1535
1536	fw_data = (const __be32 *)rdev->me_fw->data;
1537	WREG32(CP_ME_RAM_WADDR, 0);
1538	for (i = 0; i < CAYMAN_PM4_UCODE_SIZE; i++)
1539		WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1540
1541	WREG32(CP_PFP_UCODE_ADDR, 0);
1542	WREG32(CP_ME_RAM_WADDR, 0);
1543	WREG32(CP_ME_RAM_RADDR, 0);
1544	return 0;
1545}
1546
1547static int cayman_cp_start(struct radeon_device *rdev)
1548{
1549	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1550	int r, i;
1551
1552	r = radeon_ring_lock(rdev, ring, 7);
1553	if (r) {
1554		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1555		return r;
1556	}
1557	radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
1558	radeon_ring_write(ring, 0x1);
1559	radeon_ring_write(ring, 0x0);
1560	radeon_ring_write(ring, rdev->config.cayman.max_hw_contexts - 1);
1561	radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
1562	radeon_ring_write(ring, 0);
1563	radeon_ring_write(ring, 0);
1564	radeon_ring_unlock_commit(rdev, ring, false);
1565
1566	cayman_cp_enable(rdev, true);
1567
1568	r = radeon_ring_lock(rdev, ring, cayman_default_size + 19);
1569	if (r) {
1570		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1571		return r;
1572	}
1573
1574	/* setup clear context state */
1575	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1576	radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
1577
1578	for (i = 0; i < cayman_default_size; i++)
1579		radeon_ring_write(ring, cayman_default_state[i]);
1580
1581	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1582	radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
1583
1584	/* set clear context state */
1585	radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
1586	radeon_ring_write(ring, 0);
1587
1588	/* SQ_VTX_BASE_VTX_LOC */
1589	radeon_ring_write(ring, 0xc0026f00);
1590	radeon_ring_write(ring, 0x00000000);
1591	radeon_ring_write(ring, 0x00000000);
1592	radeon_ring_write(ring, 0x00000000);
1593
1594	/* Clear consts */
1595	radeon_ring_write(ring, 0xc0036f00);
1596	radeon_ring_write(ring, 0x00000bc4);
1597	radeon_ring_write(ring, 0xffffffff);
1598	radeon_ring_write(ring, 0xffffffff);
1599	radeon_ring_write(ring, 0xffffffff);
1600
1601	radeon_ring_write(ring, 0xc0026900);
1602	radeon_ring_write(ring, 0x00000316);
1603	radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
1604	radeon_ring_write(ring, 0x00000010); /*  */
1605
1606	radeon_ring_unlock_commit(rdev, ring, false);
1607
1608	/* XXX init other rings */
1609
1610	return 0;
1611}
1612
1613static void cayman_cp_fini(struct radeon_device *rdev)
1614{
1615	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1616	cayman_cp_enable(rdev, false);
1617	radeon_ring_fini(rdev, ring);
1618	radeon_scratch_free(rdev, ring->rptr_save_reg);
1619}
1620
1621static int cayman_cp_resume(struct radeon_device *rdev)
1622{
1623	static const int ridx[] = {
1624		RADEON_RING_TYPE_GFX_INDEX,
1625		CAYMAN_RING_TYPE_CP1_INDEX,
1626		CAYMAN_RING_TYPE_CP2_INDEX
1627	};
1628	static const unsigned cp_rb_cntl[] = {
1629		CP_RB0_CNTL,
1630		CP_RB1_CNTL,
1631		CP_RB2_CNTL,
1632	};
1633	static const unsigned cp_rb_rptr_addr[] = {
1634		CP_RB0_RPTR_ADDR,
1635		CP_RB1_RPTR_ADDR,
1636		CP_RB2_RPTR_ADDR
1637	};
1638	static const unsigned cp_rb_rptr_addr_hi[] = {
1639		CP_RB0_RPTR_ADDR_HI,
1640		CP_RB1_RPTR_ADDR_HI,
1641		CP_RB2_RPTR_ADDR_HI
1642	};
1643	static const unsigned cp_rb_base[] = {
1644		CP_RB0_BASE,
1645		CP_RB1_BASE,
1646		CP_RB2_BASE
1647	};
1648	static const unsigned cp_rb_rptr[] = {
1649		CP_RB0_RPTR,
1650		CP_RB1_RPTR,
1651		CP_RB2_RPTR
1652	};
1653	static const unsigned cp_rb_wptr[] = {
1654		CP_RB0_WPTR,
1655		CP_RB1_WPTR,
1656		CP_RB2_WPTR
1657	};
1658	struct radeon_ring *ring;
1659	int i, r;
1660
1661	/* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
1662	WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
1663				 SOFT_RESET_PA |
1664				 SOFT_RESET_SH |
1665				 SOFT_RESET_VGT |
1666				 SOFT_RESET_SPI |
1667				 SOFT_RESET_SX));
1668	RREG32(GRBM_SOFT_RESET);
1669	mdelay(15);
1670	WREG32(GRBM_SOFT_RESET, 0);
1671	RREG32(GRBM_SOFT_RESET);
1672
1673	WREG32(CP_SEM_WAIT_TIMER, 0x0);
1674	WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
1675
1676	/* Set the write pointer delay */
1677	WREG32(CP_RB_WPTR_DELAY, 0);
1678
1679	WREG32(CP_DEBUG, (1 << 27));
1680
1681	/* set the wb address whether it's enabled or not */
1682	WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
1683	WREG32(SCRATCH_UMSK, 0xff);
1684
1685	for (i = 0; i < 3; ++i) {
1686		uint32_t rb_cntl;
1687		uint64_t addr;
1688
1689		/* Set ring buffer size */
1690		ring = &rdev->ring[ridx[i]];
1691		rb_cntl = order_base_2(ring->ring_size / 8);
1692		rb_cntl |= order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8;
1693#ifdef __BIG_ENDIAN
1694		rb_cntl |= BUF_SWAP_32BIT;
1695#endif
1696		WREG32(cp_rb_cntl[i], rb_cntl);
1697
1698		/* set the wb address whether it's enabled or not */
1699		addr = rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET;
1700		WREG32(cp_rb_rptr_addr[i], addr & 0xFFFFFFFC);
1701		WREG32(cp_rb_rptr_addr_hi[i], upper_32_bits(addr) & 0xFF);
1702	}
 
 
 
 
1703
1704	/* set the rb base addr, this causes an internal reset of ALL rings */
1705	for (i = 0; i < 3; ++i) {
1706		ring = &rdev->ring[ridx[i]];
1707		WREG32(cp_rb_base[i], ring->gpu_addr >> 8);
 
1708	}
1709
1710	for (i = 0; i < 3; ++i) {
1711		/* Initialize the ring buffer's read and write pointers */
1712		ring = &rdev->ring[ridx[i]];
1713		WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA);
1714
1715		ring->wptr = 0;
1716		WREG32(cp_rb_rptr[i], 0);
1717		WREG32(cp_rb_wptr[i], ring->wptr);
1718
1719		mdelay(1);
1720		WREG32_P(cp_rb_cntl[i], 0, ~RB_RPTR_WR_ENA);
1721	}
1722
1723	/* start the rings */
1724	cayman_cp_start(rdev);
1725	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
1726	rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1727	rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1728	/* this only test cp0 */
1729	r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
1730	if (r) {
1731		rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1732		rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1733		rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1734		return r;
1735	}
1736
1737	if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1738		radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
 
 
1739
1740	return 0;
1741}
 
1742
1743u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev)
1744{
1745	u32 reset_mask = 0;
1746	u32 tmp;
1747
1748	/* GRBM_STATUS */
1749	tmp = RREG32(GRBM_STATUS);
1750	if (tmp & (PA_BUSY | SC_BUSY |
1751		   SH_BUSY | SX_BUSY |
1752		   TA_BUSY | VGT_BUSY |
1753		   DB_BUSY | CB_BUSY |
1754		   GDS_BUSY | SPI_BUSY |
1755		   IA_BUSY | IA_BUSY_NO_DMA))
1756		reset_mask |= RADEON_RESET_GFX;
1757
1758	if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING |
1759		   CP_BUSY | CP_COHERENCY_BUSY))
1760		reset_mask |= RADEON_RESET_CP;
1761
1762	if (tmp & GRBM_EE_BUSY)
1763		reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
 
 
 
 
 
 
1764
1765	/* DMA_STATUS_REG 0 */
1766	tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET);
1767	if (!(tmp & DMA_IDLE))
1768		reset_mask |= RADEON_RESET_DMA;
1769
1770	/* DMA_STATUS_REG 1 */
1771	tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET);
1772	if (!(tmp & DMA_IDLE))
1773		reset_mask |= RADEON_RESET_DMA1;
1774
1775	/* SRBM_STATUS2 */
1776	tmp = RREG32(SRBM_STATUS2);
1777	if (tmp & DMA_BUSY)
1778		reset_mask |= RADEON_RESET_DMA;
1779
1780	if (tmp & DMA1_BUSY)
1781		reset_mask |= RADEON_RESET_DMA1;
1782
1783	/* SRBM_STATUS */
1784	tmp = RREG32(SRBM_STATUS);
1785	if (tmp & (RLC_RQ_PENDING | RLC_BUSY))
1786		reset_mask |= RADEON_RESET_RLC;
1787
1788	if (tmp & IH_BUSY)
1789		reset_mask |= RADEON_RESET_IH;
 
 
 
 
 
 
 
 
 
 
 
1790
1791	if (tmp & SEM_BUSY)
1792		reset_mask |= RADEON_RESET_SEM;
1793
1794	if (tmp & GRBM_RQ_PENDING)
1795		reset_mask |= RADEON_RESET_GRBM;
 
 
 
 
 
1796
1797	if (tmp & VMC_BUSY)
1798		reset_mask |= RADEON_RESET_VMC;
1799
1800	if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
1801		   MCC_BUSY | MCD_BUSY))
1802		reset_mask |= RADEON_RESET_MC;
1803
1804	if (evergreen_is_display_hung(rdev))
1805		reset_mask |= RADEON_RESET_DISPLAY;
1806
1807	/* VM_L2_STATUS */
1808	tmp = RREG32(VM_L2_STATUS);
1809	if (tmp & L2_BUSY)
1810		reset_mask |= RADEON_RESET_VMC;
1811
1812	/* Skip MC reset as it's mostly likely not hung, just busy */
1813	if (reset_mask & RADEON_RESET_MC) {
1814		DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
1815		reset_mask &= ~RADEON_RESET_MC;
1816	}
1817
1818	return reset_mask;
 
 
 
 
 
 
 
 
 
1819}
1820
1821static void cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
1822{
1823	struct evergreen_mc_save save;
1824	u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
1825	u32 tmp;
1826
1827	if (reset_mask == 0)
1828		return;
1829
1830	dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
1831
1832	evergreen_print_gpu_status_regs(rdev);
1833	dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_ADDR   0x%08X\n",
1834		 RREG32(0x14F8));
1835	dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n",
1836		 RREG32(0x14D8));
1837	dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
1838		 RREG32(0x14FC));
1839	dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
1840		 RREG32(0x14DC));
1841
1842	/* Disable CP parsing/prefetching */
1843	WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
1844
1845	if (reset_mask & RADEON_RESET_DMA) {
1846		/* dma0 */
1847		tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
1848		tmp &= ~DMA_RB_ENABLE;
1849		WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp);
1850	}
1851
1852	if (reset_mask & RADEON_RESET_DMA1) {
1853		/* dma1 */
1854		tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
1855		tmp &= ~DMA_RB_ENABLE;
1856		WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp);
1857	}
1858
1859	udelay(50);
1860
 
 
 
 
 
 
 
 
 
1861	evergreen_mc_stop(rdev, &save);
1862	if (evergreen_mc_wait_for_idle(rdev)) {
1863		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1864	}
 
 
1865
1866	if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) {
1867		grbm_soft_reset = SOFT_RESET_CB |
1868			SOFT_RESET_DB |
1869			SOFT_RESET_GDS |
1870			SOFT_RESET_PA |
1871			SOFT_RESET_SC |
1872			SOFT_RESET_SPI |
1873			SOFT_RESET_SH |
1874			SOFT_RESET_SX |
1875			SOFT_RESET_TC |
1876			SOFT_RESET_TA |
1877			SOFT_RESET_VGT |
1878			SOFT_RESET_IA;
1879	}
1880
1881	if (reset_mask & RADEON_RESET_CP) {
1882		grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT;
1883
1884		srbm_soft_reset |= SOFT_RESET_GRBM;
1885	}
1886
1887	if (reset_mask & RADEON_RESET_DMA)
1888		srbm_soft_reset |= SOFT_RESET_DMA;
1889
1890	if (reset_mask & RADEON_RESET_DMA1)
1891		srbm_soft_reset |= SOFT_RESET_DMA1;
1892
1893	if (reset_mask & RADEON_RESET_DISPLAY)
1894		srbm_soft_reset |= SOFT_RESET_DC;
1895
1896	if (reset_mask & RADEON_RESET_RLC)
1897		srbm_soft_reset |= SOFT_RESET_RLC;
1898
1899	if (reset_mask & RADEON_RESET_SEM)
1900		srbm_soft_reset |= SOFT_RESET_SEM;
1901
1902	if (reset_mask & RADEON_RESET_IH)
1903		srbm_soft_reset |= SOFT_RESET_IH;
1904
1905	if (reset_mask & RADEON_RESET_GRBM)
1906		srbm_soft_reset |= SOFT_RESET_GRBM;
1907
1908	if (reset_mask & RADEON_RESET_VMC)
1909		srbm_soft_reset |= SOFT_RESET_VMC;
1910
1911	if (!(rdev->flags & RADEON_IS_IGP)) {
1912		if (reset_mask & RADEON_RESET_MC)
1913			srbm_soft_reset |= SOFT_RESET_MC;
1914	}
1915
1916	if (grbm_soft_reset) {
1917		tmp = RREG32(GRBM_SOFT_RESET);
1918		tmp |= grbm_soft_reset;
1919		dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
1920		WREG32(GRBM_SOFT_RESET, tmp);
1921		tmp = RREG32(GRBM_SOFT_RESET);
1922
1923		udelay(50);
1924
1925		tmp &= ~grbm_soft_reset;
1926		WREG32(GRBM_SOFT_RESET, tmp);
1927		tmp = RREG32(GRBM_SOFT_RESET);
1928	}
1929
1930	if (srbm_soft_reset) {
1931		tmp = RREG32(SRBM_SOFT_RESET);
1932		tmp |= srbm_soft_reset;
1933		dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
1934		WREG32(SRBM_SOFT_RESET, tmp);
1935		tmp = RREG32(SRBM_SOFT_RESET);
1936
1937		udelay(50);
1938
1939		tmp &= ~srbm_soft_reset;
1940		WREG32(SRBM_SOFT_RESET, tmp);
1941		tmp = RREG32(SRBM_SOFT_RESET);
1942	}
1943
1944	/* Wait a little for things to settle down */
1945	udelay(50);
1946
 
 
 
 
 
 
 
1947	evergreen_mc_resume(rdev, &save);
1948	udelay(50);
1949
1950	evergreen_print_gpu_status_regs(rdev);
1951}
1952
1953int cayman_asic_reset(struct radeon_device *rdev, bool hard)
1954{
1955	u32 reset_mask;
1956
1957	if (hard) {
1958		evergreen_gpu_pci_config_reset(rdev);
1959		return 0;
1960	}
1961
1962	reset_mask = cayman_gpu_check_soft_reset(rdev);
1963
1964	if (reset_mask)
1965		r600_set_bios_scratch_engine_hung(rdev, true);
1966
1967	cayman_gpu_soft_reset(rdev, reset_mask);
1968
1969	reset_mask = cayman_gpu_check_soft_reset(rdev);
1970
1971	if (reset_mask)
1972		evergreen_gpu_pci_config_reset(rdev);
1973
1974	r600_set_bios_scratch_engine_hung(rdev, false);
1975
1976	return 0;
1977}
1978
1979/**
1980 * cayman_gfx_is_lockup - Check if the GFX engine is locked up
1981 *
1982 * @rdev: radeon_device pointer
1983 * @ring: radeon_ring structure holding ring information
1984 *
1985 * Check if the GFX engine is locked up.
1986 * Returns true if the engine appears to be locked up, false if not.
1987 */
1988bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
1989{
1990	u32 reset_mask = cayman_gpu_check_soft_reset(rdev);
1991
1992	if (!(reset_mask & (RADEON_RESET_GFX |
1993			    RADEON_RESET_COMPUTE |
1994			    RADEON_RESET_CP))) {
1995		radeon_ring_lockup_update(rdev, ring);
1996		return false;
1997	}
1998	return radeon_ring_test_lockup(rdev, ring);
1999}
2000
2001static void cayman_uvd_init(struct radeon_device *rdev)
2002{
2003	int r;
2004
2005	if (!rdev->has_uvd)
2006		return;
2007
2008	r = radeon_uvd_init(rdev);
2009	if (r) {
2010		dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
2011		/*
2012		 * At this point rdev->uvd.vcpu_bo is NULL which trickles down
2013		 * to early fails uvd_v2_2_resume() and thus nothing happens
2014		 * there. So it is pointless to try to go through that code
2015		 * hence why we disable uvd here.
2016		 */
2017		rdev->has_uvd = 0;
2018		return;
2019	}
2020	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
2021	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
2022}
2023
2024static void cayman_uvd_start(struct radeon_device *rdev)
2025{
2026	int r;
2027
2028	if (!rdev->has_uvd)
2029		return;
2030
2031	r = uvd_v2_2_resume(rdev);
2032	if (r) {
2033		dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
2034		goto error;
2035	}
2036	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
2037	if (r) {
2038		dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
2039		goto error;
2040	}
2041	return;
2042
2043error:
2044	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
2045}
2046
2047static void cayman_uvd_resume(struct radeon_device *rdev)
2048{
2049	struct radeon_ring *ring;
2050	int r;
2051
2052	if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
2053		return;
2054
2055	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
2056	r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0));
2057	if (r) {
2058		dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
2059		return;
2060	}
2061	r = uvd_v1_0_init(rdev);
2062	if (r) {
2063		dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
2064		return;
2065	}
2066}
2067
2068static void cayman_vce_init(struct radeon_device *rdev)
2069{
2070	int r;
2071
2072	/* Only set for CHIP_ARUBA */
2073	if (!rdev->has_vce)
2074		return;
2075
2076	r = radeon_vce_init(rdev);
2077	if (r) {
2078		dev_err(rdev->dev, "failed VCE (%d) init.\n", r);
2079		/*
2080		 * At this point rdev->vce.vcpu_bo is NULL which trickles down
2081		 * to early fails cayman_vce_start() and thus nothing happens
2082		 * there. So it is pointless to try to go through that code
2083		 * hence why we disable vce here.
2084		 */
2085		rdev->has_vce = 0;
2086		return;
2087	}
2088	rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_obj = NULL;
2089	r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE1_INDEX], 4096);
2090	rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_obj = NULL;
2091	r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE2_INDEX], 4096);
2092}
2093
2094static void cayman_vce_start(struct radeon_device *rdev)
2095{
2096	int r;
2097
2098	if (!rdev->has_vce)
2099		return;
2100
2101	r = radeon_vce_resume(rdev);
2102	if (r) {
2103		dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
2104		goto error;
2105	}
2106	r = vce_v1_0_resume(rdev);
2107	if (r) {
2108		dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
2109		goto error;
2110	}
2111	r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE1_INDEX);
2112	if (r) {
2113		dev_err(rdev->dev, "failed initializing VCE1 fences (%d).\n", r);
2114		goto error;
2115	}
2116	r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE2_INDEX);
2117	if (r) {
2118		dev_err(rdev->dev, "failed initializing VCE2 fences (%d).\n", r);
2119		goto error;
2120	}
2121	return;
2122
2123error:
2124	rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
2125	rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
2126}
2127
2128static void cayman_vce_resume(struct radeon_device *rdev)
2129{
2130	struct radeon_ring *ring;
2131	int r;
2132
2133	if (!rdev->has_vce || !rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size)
2134		return;
2135
2136	ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
2137	r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0);
2138	if (r) {
2139		dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
2140		return;
2141	}
2142	ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
2143	r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0);
2144	if (r) {
2145		dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
2146		return;
2147	}
2148	r = vce_v1_0_init(rdev);
2149	if (r) {
2150		dev_err(rdev->dev, "failed initializing VCE (%d).\n", r);
2151		return;
2152	}
2153}
2154
2155static int cayman_startup(struct radeon_device *rdev)
2156{
2157	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2158	int r;
2159
2160	/* enable pcie gen2 link */
2161	evergreen_pcie_gen2_enable(rdev);
2162	/* enable aspm */
2163	evergreen_program_aspm(rdev);
2164
2165	/* scratch needs to be initialized before MC */
2166	r = r600_vram_scratch_init(rdev);
2167	if (r)
2168		return r;
2169
2170	evergreen_mc_program(rdev);
2171
2172	if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) {
2173		r = ni_mc_load_microcode(rdev);
2174		if (r) {
2175			DRM_ERROR("Failed to load MC firmware!\n");
2176			return r;
2177		}
2178	}
 
 
 
 
 
2179
 
2180	r = cayman_pcie_gart_enable(rdev);
2181	if (r)
2182		return r;
2183	cayman_gpu_init(rdev);
2184
2185	/* allocate rlc buffers */
2186	if (rdev->flags & RADEON_IS_IGP) {
2187		rdev->rlc.reg_list = tn_rlc_save_restore_register_list;
2188		rdev->rlc.reg_list_size =
2189			(u32)ARRAY_SIZE(tn_rlc_save_restore_register_list);
2190		rdev->rlc.cs_data = cayman_cs_data;
2191		r = sumo_rlc_init(rdev);
2192		if (r) {
2193			DRM_ERROR("Failed to init rlc BOs!\n");
2194			return r;
2195		}
2196	}
2197
2198	/* allocate wb buffer */
2199	r = radeon_wb_init(rdev);
2200	if (r)
2201		return r;
2202
2203	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
2204	if (r) {
2205		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
2206		return r;
2207	}
2208
2209	cayman_uvd_start(rdev);
2210	cayman_vce_start(rdev);
2211
2212	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
2213	if (r) {
2214		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
2215		return r;
2216	}
2217
2218	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
2219	if (r) {
2220		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
2221		return r;
2222	}
2223
2224	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
2225	if (r) {
2226		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
2227		return r;
2228	}
2229
2230	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
2231	if (r) {
2232		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
2233		return r;
2234	}
2235
2236	/* Enable IRQ */
2237	if (!rdev->irq.installed) {
2238		r = radeon_irq_kms_init(rdev);
2239		if (r)
2240			return r;
2241	}
2242
2243	r = r600_irq_init(rdev);
2244	if (r) {
2245		DRM_ERROR("radeon: IH init failed (%d).\n", r);
2246		radeon_irq_kms_fini(rdev);
2247		return r;
2248	}
2249	evergreen_irq_set(rdev);
2250
2251	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
2252			     RADEON_CP_PACKET2);
2253	if (r)
2254		return r;
2255
2256	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2257	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
2258			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2259	if (r)
2260		return r;
2261
2262	ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
2263	r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
2264			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2265	if (r)
2266		return r;
2267
2268	r = cayman_cp_load_microcode(rdev);
2269	if (r)
2270		return r;
2271	r = cayman_cp_resume(rdev);
2272	if (r)
2273		return r;
2274
2275	r = cayman_dma_resume(rdev);
2276	if (r)
2277		return r;
2278
2279	cayman_uvd_resume(rdev);
2280	cayman_vce_resume(rdev);
2281
2282	r = radeon_ib_pool_init(rdev);
2283	if (r) {
2284		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
2285		return r;
2286	}
2287
2288	r = radeon_vm_manager_init(rdev);
2289	if (r) {
2290		dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
2291		return r;
2292	}
2293
2294	r = radeon_audio_init(rdev);
2295	if (r)
2296		return r;
2297
2298	return 0;
2299}
2300
2301int cayman_resume(struct radeon_device *rdev)
2302{
2303	int r;
2304
2305	/* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
2306	 * posting will perform necessary task to bring back GPU into good
2307	 * shape.
2308	 */
2309	/* post card */
2310	atom_asic_init(rdev->mode_info.atom_context);
2311
2312	/* init golden registers */
2313	ni_init_golden_registers(rdev);
2314
2315	if (rdev->pm.pm_method == PM_METHOD_DPM)
2316		radeon_pm_resume(rdev);
2317
2318	rdev->accel_working = true;
2319	r = cayman_startup(rdev);
2320	if (r) {
2321		DRM_ERROR("cayman startup failed on resume\n");
2322		rdev->accel_working = false;
2323		return r;
2324	}
 
 
 
 
 
 
 
2325	return r;
 
2326}
2327
2328int cayman_suspend(struct radeon_device *rdev)
2329{
2330	radeon_pm_suspend(rdev);
2331	radeon_audio_fini(rdev);
2332	radeon_vm_manager_fini(rdev);
2333	cayman_cp_enable(rdev, false);
2334	cayman_dma_stop(rdev);
2335	if (rdev->has_uvd) {
2336		uvd_v1_0_fini(rdev);
2337		radeon_uvd_suspend(rdev);
2338	}
2339	evergreen_irq_suspend(rdev);
2340	radeon_wb_disable(rdev);
2341	cayman_pcie_gart_disable(rdev);
 
 
 
 
 
 
 
 
2342	return 0;
2343}
2344
2345/* Plan is to move initialization in that function and use
2346 * helper function so that radeon_device_init pretty much
2347 * do nothing more than calling asic specific function. This
2348 * should also allow to remove a bunch of callback function
2349 * like vram_info.
2350 */
2351int cayman_init(struct radeon_device *rdev)
2352{
2353	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2354	int r;
2355
 
 
 
 
2356	/* Read BIOS */
2357	if (!radeon_get_bios(rdev)) {
2358		if (ASIC_IS_AVIVO(rdev))
2359			return -EINVAL;
2360	}
2361	/* Must be an ATOMBIOS */
2362	if (!rdev->is_atom_bios) {
2363		dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
2364		return -EINVAL;
2365	}
2366	r = radeon_atombios_init(rdev);
2367	if (r)
2368		return r;
2369
2370	/* Post card if necessary */
2371	if (!radeon_card_posted(rdev)) {
2372		if (!rdev->bios) {
2373			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
2374			return -EINVAL;
2375		}
2376		DRM_INFO("GPU not posted. posting now...\n");
2377		atom_asic_init(rdev->mode_info.atom_context);
2378	}
2379	/* init golden registers */
2380	ni_init_golden_registers(rdev);
2381	/* Initialize scratch registers */
2382	r600_scratch_init(rdev);
2383	/* Initialize surface registers */
2384	radeon_surface_init(rdev);
2385	/* Initialize clocks */
2386	radeon_get_clock_info(rdev->ddev);
2387	/* Fence driver */
2388	r = radeon_fence_driver_init(rdev);
2389	if (r)
2390		return r;
2391	/* initialize memory controller */
2392	r = evergreen_mc_init(rdev);
2393	if (r)
2394		return r;
2395	/* Memory manager */
2396	r = radeon_bo_init(rdev);
2397	if (r)
2398		return r;
2399
2400	if (rdev->flags & RADEON_IS_IGP) {
2401		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
2402			r = ni_init_microcode(rdev);
2403			if (r) {
2404				DRM_ERROR("Failed to load firmware!\n");
2405				return r;
2406			}
2407		}
2408	} else {
2409		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
2410			r = ni_init_microcode(rdev);
2411			if (r) {
2412				DRM_ERROR("Failed to load firmware!\n");
2413				return r;
2414			}
2415		}
2416	}
2417
2418	/* Initialize power management */
2419	radeon_pm_init(rdev);
2420
2421	ring->ring_obj = NULL;
2422	r600_ring_init(rdev, ring, 1024 * 1024);
2423
2424	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2425	ring->ring_obj = NULL;
2426	r600_ring_init(rdev, ring, 64 * 1024);
2427
2428	ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
2429	ring->ring_obj = NULL;
2430	r600_ring_init(rdev, ring, 64 * 1024);
2431
2432	cayman_uvd_init(rdev);
2433	cayman_vce_init(rdev);
2434
2435	rdev->ih.ring_obj = NULL;
2436	r600_ih_ring_init(rdev, 64 * 1024);
2437
2438	r = r600_pcie_gart_init(rdev);
2439	if (r)
2440		return r;
2441
2442	rdev->accel_working = true;
2443	r = cayman_startup(rdev);
2444	if (r) {
2445		dev_err(rdev->dev, "disabling GPU acceleration\n");
2446		cayman_cp_fini(rdev);
2447		cayman_dma_fini(rdev);
2448		r600_irq_fini(rdev);
2449		if (rdev->flags & RADEON_IS_IGP)
2450			sumo_rlc_fini(rdev);
2451		radeon_wb_fini(rdev);
2452		radeon_ib_pool_fini(rdev);
2453		radeon_vm_manager_fini(rdev);
2454		radeon_irq_kms_fini(rdev);
2455		cayman_pcie_gart_fini(rdev);
2456		rdev->accel_working = false;
2457	}
 
 
 
 
 
 
 
 
 
 
 
 
2458
2459	/* Don't start up if the MC ucode is missing.
2460	 * The default clocks and voltages before the MC ucode
2461	 * is loaded are not suffient for advanced operations.
2462	 *
2463	 * We can skip this check for TN, because there is no MC
2464	 * ucode.
2465	 */
2466	if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
2467		DRM_ERROR("radeon: MC ucode required for NI+.\n");
2468		return -EINVAL;
2469	}
2470
2471	return 0;
2472}
2473
2474void cayman_fini(struct radeon_device *rdev)
2475{
2476	radeon_pm_fini(rdev);
2477	cayman_cp_fini(rdev);
2478	cayman_dma_fini(rdev);
2479	r600_irq_fini(rdev);
2480	if (rdev->flags & RADEON_IS_IGP)
2481		sumo_rlc_fini(rdev);
2482	radeon_wb_fini(rdev);
2483	radeon_vm_manager_fini(rdev);
2484	radeon_ib_pool_fini(rdev);
2485	radeon_irq_kms_fini(rdev);
2486	uvd_v1_0_fini(rdev);
2487	radeon_uvd_fini(rdev);
2488	if (rdev->has_vce)
2489		radeon_vce_fini(rdev);
2490	cayman_pcie_gart_fini(rdev);
2491	r600_vram_scratch_fini(rdev);
2492	radeon_gem_fini(rdev);
2493	radeon_fence_driver_fini(rdev);
2494	radeon_bo_fini(rdev);
2495	radeon_atombios_fini(rdev);
2496	kfree(rdev->bios);
2497	rdev->bios = NULL;
2498}
2499
2500/*
2501 * vm
2502 */
2503int cayman_vm_init(struct radeon_device *rdev)
2504{
2505	/* number of VMs */
2506	rdev->vm_manager.nvm = 8;
2507	/* base offset of vram pages */
2508	if (rdev->flags & RADEON_IS_IGP) {
2509		u64 tmp = RREG32(FUS_MC_VM_FB_OFFSET);
2510		tmp <<= 22;
2511		rdev->vm_manager.vram_base_offset = tmp;
2512	} else
2513		rdev->vm_manager.vram_base_offset = 0;
2514	return 0;
2515}
2516
2517void cayman_vm_fini(struct radeon_device *rdev)
2518{
2519}
2520
2521/**
2522 * cayman_vm_decode_fault - print human readable fault info
2523 *
2524 * @rdev: radeon_device pointer
2525 * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
2526 * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
2527 *
2528 * Print human readable fault information (cayman/TN).
2529 */
2530void cayman_vm_decode_fault(struct radeon_device *rdev,
2531			    u32 status, u32 addr)
2532{
2533	u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
2534	u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
2535	u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
2536	char *block;
2537
2538	switch (mc_id) {
2539	case 32:
2540	case 16:
2541	case 96:
2542	case 80:
2543	case 160:
2544	case 144:
2545	case 224:
2546	case 208:
2547		block = "CB";
2548		break;
2549	case 33:
2550	case 17:
2551	case 97:
2552	case 81:
2553	case 161:
2554	case 145:
2555	case 225:
2556	case 209:
2557		block = "CB_FMASK";
2558		break;
2559	case 34:
2560	case 18:
2561	case 98:
2562	case 82:
2563	case 162:
2564	case 146:
2565	case 226:
2566	case 210:
2567		block = "CB_CMASK";
2568		break;
2569	case 35:
2570	case 19:
2571	case 99:
2572	case 83:
2573	case 163:
2574	case 147:
2575	case 227:
2576	case 211:
2577		block = "CB_IMMED";
2578		break;
2579	case 36:
2580	case 20:
2581	case 100:
2582	case 84:
2583	case 164:
2584	case 148:
2585	case 228:
2586	case 212:
2587		block = "DB";
2588		break;
2589	case 37:
2590	case 21:
2591	case 101:
2592	case 85:
2593	case 165:
2594	case 149:
2595	case 229:
2596	case 213:
2597		block = "DB_HTILE";
2598		break;
2599	case 38:
2600	case 22:
2601	case 102:
2602	case 86:
2603	case 166:
2604	case 150:
2605	case 230:
2606	case 214:
2607		block = "SX";
2608		break;
2609	case 39:
2610	case 23:
2611	case 103:
2612	case 87:
2613	case 167:
2614	case 151:
2615	case 231:
2616	case 215:
2617		block = "DB_STEN";
2618		break;
2619	case 40:
2620	case 24:
2621	case 104:
2622	case 88:
2623	case 232:
2624	case 216:
2625	case 168:
2626	case 152:
2627		block = "TC_TFETCH";
2628		break;
2629	case 41:
2630	case 25:
2631	case 105:
2632	case 89:
2633	case 233:
2634	case 217:
2635	case 169:
2636	case 153:
2637		block = "TC_VFETCH";
2638		break;
2639	case 42:
2640	case 26:
2641	case 106:
2642	case 90:
2643	case 234:
2644	case 218:
2645	case 170:
2646	case 154:
2647		block = "VC";
2648		break;
2649	case 112:
2650		block = "CP";
2651		break;
2652	case 113:
2653	case 114:
2654		block = "SH";
2655		break;
2656	case 115:
2657		block = "VGT";
2658		break;
2659	case 178:
2660		block = "IH";
2661		break;
2662	case 51:
2663		block = "RLC";
2664		break;
2665	case 55:
2666		block = "DMA";
2667		break;
2668	case 56:
2669		block = "HDP";
2670		break;
2671	default:
2672		block = "unknown";
2673		break;
2674	}
2675
2676	printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n",
2677	       protections, vmid, addr,
2678	       (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
2679	       block, mc_id);
2680}
2681
2682/**
2683 * cayman_vm_flush - vm flush using the CP
2684 *
2685 * @rdev: radeon_device pointer
2686 *
2687 * Update the page table base and flush the VM TLB
2688 * using the CP (cayman-si).
2689 */
2690void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
2691		     unsigned vm_id, uint64_t pd_addr)
2692{
2693	radeon_ring_write(ring, PACKET0(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2), 0));
2694	radeon_ring_write(ring, pd_addr >> 12);
2695
2696	/* flush hdp cache */
2697	radeon_ring_write(ring, PACKET0(HDP_MEM_COHERENCY_FLUSH_CNTL, 0));
2698	radeon_ring_write(ring, 0x1);
2699
2700	/* bits 0-7 are the VM contexts0-7 */
2701	radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0));
2702	radeon_ring_write(ring, 1 << vm_id);
2703
2704	/* wait for the invalidate to complete */
2705	radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
2706	radeon_ring_write(ring, (WAIT_REG_MEM_FUNCTION(0) |  /* always */
2707				 WAIT_REG_MEM_ENGINE(0))); /* me */
2708	radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
2709	radeon_ring_write(ring, 0);
2710	radeon_ring_write(ring, 0); /* ref */
2711	radeon_ring_write(ring, 0); /* mask */
2712	radeon_ring_write(ring, 0x20); /* poll interval */
2713
2714	/* sync PFP to ME, otherwise we might get invalid PFP reads */
2715	radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
2716	radeon_ring_write(ring, 0x0);
2717}
2718
2719int tn_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk)
2720{
2721	struct atom_clock_dividers dividers;
2722	int r, i;
2723
2724	r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
2725					   ecclk, false, &dividers);
2726	if (r)
2727		return r;
2728
2729	for (i = 0; i < 100; i++) {
2730		if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS)
2731			break;
2732		mdelay(10);
2733	}
2734	if (i == 100)
2735		return -ETIMEDOUT;
2736
2737	WREG32_P(CG_ECLK_CNTL, dividers.post_div, ~(ECLK_DIR_CNTL_EN|ECLK_DIVIDER_MASK));
2738
2739	for (i = 0; i < 100; i++) {
2740		if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS)
2741			break;
2742		mdelay(10);
2743	}
2744	if (i == 100)
2745		return -ETIMEDOUT;
2746
2747	return 0;
2748}