Linux Audio

Check our new training course

Loading...
v6.13.7
   1/*
   2 * Copyright 2008 Advanced Micro Devices, Inc.
   3 * Copyright 2008 Red Hat Inc.
   4 * Copyright 2009 Jerome Glisse.
   5 *
   6 * Permission is hereby granted, free of charge, to any person obtaining a
   7 * copy of this software and associated documentation files (the "Software"),
   8 * to deal in the Software without restriction, including without limitation
   9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10 * and/or sell copies of the Software, and to permit persons to whom the
  11 * Software is furnished to do so, subject to the following conditions:
  12 *
  13 * The above copyright notice and this permission notice shall be included in
  14 * all copies or substantial portions of the Software.
  15 *
  16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  22 * OTHER DEALINGS IN THE SOFTWARE.
  23 *
  24 * Authors: Dave Airlie
  25 *          Alex Deucher
  26 *          Jerome Glisse
  27 */
  28
  29#include <linux/firmware.h>
  30#include <linux/pci.h>
  31#include <linux/slab.h>
  32
  33#include <drm/drm_device.h>
  34#include <drm/radeon_drm.h>
  35#include <drm/drm_fourcc.h>
  36#include <drm/drm_framebuffer.h>
  37
  38#include "atom.h"
  39#include "avivod.h"
  40#include "radeon.h"
  41#include "radeon_asic.h"
  42#include "radeon_audio.h"
  43#include "rv770d.h"
  44#include "rv770.h"
 
  45
  46#define R700_PFP_UCODE_SIZE 848
  47#define R700_PM4_UCODE_SIZE 1360
  48
  49static void rv770_gpu_init(struct radeon_device *rdev);
  50void rv770_fini(struct radeon_device *rdev);
  51static void rv770_pcie_gen2_enable(struct radeon_device *rdev);
  52int evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk);
  53
  54int rv770_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
  55{
  56	unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
  57	int r;
  58
  59	/* RV740 uses evergreen uvd clk programming */
  60	if (rdev->family == CHIP_RV740)
  61		return evergreen_set_uvd_clocks(rdev, vclk, dclk);
  62
  63	/* bypass vclk and dclk with bclk */
  64	WREG32_P(CG_UPLL_FUNC_CNTL_2,
  65		 VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
  66		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
  67
  68	if (!vclk || !dclk) {
  69		/* keep the Bypass mode, put PLL to sleep */
  70		WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
  71		return 0;
  72	}
  73
  74	r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 50000, 160000,
  75					  43663, 0x03FFFFFE, 1, 30, ~0,
  76					  &fb_div, &vclk_div, &dclk_div);
  77	if (r)
  78		return r;
  79
  80	fb_div |= 1;
  81	vclk_div -= 1;
  82	dclk_div -= 1;
  83
  84	/* set UPLL_FB_DIV to 0x50000 */
  85	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(0x50000), ~UPLL_FB_DIV_MASK);
  86
  87	/* deassert UPLL_RESET and UPLL_SLEEP */
  88	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~(UPLL_RESET_MASK | UPLL_SLEEP_MASK));
  89
  90	/* assert BYPASS EN and FB_DIV[0] <- ??? why? */
  91	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
  92	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(1), ~UPLL_FB_DIV(1));
  93
  94	r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
  95	if (r)
  96		return r;
  97
  98	/* assert PLL_RESET */
  99	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
 100
 101	/* set the required FB_DIV, REF_DIV, Post divder values */
 102	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_REF_DIV(1), ~UPLL_REF_DIV_MASK);
 103	WREG32_P(CG_UPLL_FUNC_CNTL_2,
 104		 UPLL_SW_HILEN(vclk_div >> 1) |
 105		 UPLL_SW_LOLEN((vclk_div >> 1) + (vclk_div & 1)) |
 106		 UPLL_SW_HILEN2(dclk_div >> 1) |
 107		 UPLL_SW_LOLEN2((dclk_div >> 1) + (dclk_div & 1)),
 108		 ~UPLL_SW_MASK);
 109
 110	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div),
 111		 ~UPLL_FB_DIV_MASK);
 112
 113	/* give the PLL some time to settle */
 114	mdelay(15);
 115
 116	/* deassert PLL_RESET */
 117	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
 118
 119	mdelay(15);
 120
 121	/* deassert BYPASS EN and FB_DIV[0] <- ??? why? */
 122	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
 123	WREG32_P(CG_UPLL_FUNC_CNTL_3, 0, ~UPLL_FB_DIV(1));
 124
 125	r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
 126	if (r)
 127		return r;
 128
 129	/* switch VCLK and DCLK selection */
 130	WREG32_P(CG_UPLL_FUNC_CNTL_2,
 131		 VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
 132		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
 133
 134	mdelay(100);
 135
 136	return 0;
 137}
 138
 139static const u32 r7xx_golden_registers[] = {
 
 140	0x8d00, 0xffffffff, 0x0e0e0074,
 141	0x8d04, 0xffffffff, 0x013a2b34,
 142	0x9508, 0xffffffff, 0x00000002,
 143	0x8b20, 0xffffffff, 0,
 144	0x88c4, 0xffffffff, 0x000000c2,
 145	0x28350, 0xffffffff, 0,
 146	0x9058, 0xffffffff, 0x0fffc40f,
 147	0x240c, 0xffffffff, 0x00000380,
 148	0x733c, 0xffffffff, 0x00000002,
 149	0x2650, 0x00040000, 0,
 150	0x20bc, 0x00040000, 0,
 151	0x7300, 0xffffffff, 0x001000f0
 152};
 153
 154static const u32 r7xx_golden_dyn_gpr_registers[] = {
 
 155	0x8db0, 0xffffffff, 0x98989898,
 156	0x8db4, 0xffffffff, 0x98989898,
 157	0x8db8, 0xffffffff, 0x98989898,
 158	0x8dbc, 0xffffffff, 0x98989898,
 159	0x8dc0, 0xffffffff, 0x98989898,
 160	0x8dc4, 0xffffffff, 0x98989898,
 161	0x8dc8, 0xffffffff, 0x98989898,
 162	0x8dcc, 0xffffffff, 0x98989898,
 163	0x88c4, 0xffffffff, 0x00000082
 164};
 165
 166static const u32 rv770_golden_registers[] = {
 
 167	0x562c, 0xffffffff, 0,
 168	0x3f90, 0xffffffff, 0,
 169	0x9148, 0xffffffff, 0,
 170	0x3f94, 0xffffffff, 0,
 171	0x914c, 0xffffffff, 0,
 172	0x9698, 0x18000000, 0x18000000
 173};
 174
 175static const u32 rv770ce_golden_registers[] = {
 
 176	0x562c, 0xffffffff, 0,
 177	0x3f90, 0xffffffff, 0x00cc0000,
 178	0x9148, 0xffffffff, 0x00cc0000,
 179	0x3f94, 0xffffffff, 0x00cc0000,
 180	0x914c, 0xffffffff, 0x00cc0000,
 181	0x9b7c, 0xffffffff, 0x00fa0000,
 182	0x3f8c, 0xffffffff, 0x00fa0000,
 183	0x9698, 0x18000000, 0x18000000
 184};
 185
 186static const u32 rv770_mgcg_init[] = {
 
 187	0x8bcc, 0xffffffff, 0x130300f9,
 188	0x5448, 0xffffffff, 0x100,
 189	0x55e4, 0xffffffff, 0x100,
 190	0x160c, 0xffffffff, 0x100,
 191	0x5644, 0xffffffff, 0x100,
 192	0xc164, 0xffffffff, 0x100,
 193	0x8a18, 0xffffffff, 0x100,
 194	0x897c, 0xffffffff, 0x8000100,
 195	0x8b28, 0xffffffff, 0x3c000100,
 196	0x9144, 0xffffffff, 0x100,
 197	0x9a1c, 0xffffffff, 0x10000,
 198	0x9a50, 0xffffffff, 0x100,
 199	0x9a1c, 0xffffffff, 0x10001,
 200	0x9a50, 0xffffffff, 0x100,
 201	0x9a1c, 0xffffffff, 0x10002,
 202	0x9a50, 0xffffffff, 0x100,
 203	0x9a1c, 0xffffffff, 0x10003,
 204	0x9a50, 0xffffffff, 0x100,
 205	0x9a1c, 0xffffffff, 0x0,
 206	0x9870, 0xffffffff, 0x100,
 207	0x8d58, 0xffffffff, 0x100,
 208	0x9500, 0xffffffff, 0x0,
 209	0x9510, 0xffffffff, 0x100,
 210	0x9500, 0xffffffff, 0x1,
 211	0x9510, 0xffffffff, 0x100,
 212	0x9500, 0xffffffff, 0x2,
 213	0x9510, 0xffffffff, 0x100,
 214	0x9500, 0xffffffff, 0x3,
 215	0x9510, 0xffffffff, 0x100,
 216	0x9500, 0xffffffff, 0x4,
 217	0x9510, 0xffffffff, 0x100,
 218	0x9500, 0xffffffff, 0x5,
 219	0x9510, 0xffffffff, 0x100,
 220	0x9500, 0xffffffff, 0x6,
 221	0x9510, 0xffffffff, 0x100,
 222	0x9500, 0xffffffff, 0x7,
 223	0x9510, 0xffffffff, 0x100,
 224	0x9500, 0xffffffff, 0x8,
 225	0x9510, 0xffffffff, 0x100,
 226	0x9500, 0xffffffff, 0x9,
 227	0x9510, 0xffffffff, 0x100,
 228	0x9500, 0xffffffff, 0x8000,
 229	0x9490, 0xffffffff, 0x0,
 230	0x949c, 0xffffffff, 0x100,
 231	0x9490, 0xffffffff, 0x1,
 232	0x949c, 0xffffffff, 0x100,
 233	0x9490, 0xffffffff, 0x2,
 234	0x949c, 0xffffffff, 0x100,
 235	0x9490, 0xffffffff, 0x3,
 236	0x949c, 0xffffffff, 0x100,
 237	0x9490, 0xffffffff, 0x4,
 238	0x949c, 0xffffffff, 0x100,
 239	0x9490, 0xffffffff, 0x5,
 240	0x949c, 0xffffffff, 0x100,
 241	0x9490, 0xffffffff, 0x6,
 242	0x949c, 0xffffffff, 0x100,
 243	0x9490, 0xffffffff, 0x7,
 244	0x949c, 0xffffffff, 0x100,
 245	0x9490, 0xffffffff, 0x8,
 246	0x949c, 0xffffffff, 0x100,
 247	0x9490, 0xffffffff, 0x9,
 248	0x949c, 0xffffffff, 0x100,
 249	0x9490, 0xffffffff, 0x8000,
 250	0x9604, 0xffffffff, 0x0,
 251	0x9654, 0xffffffff, 0x100,
 252	0x9604, 0xffffffff, 0x1,
 253	0x9654, 0xffffffff, 0x100,
 254	0x9604, 0xffffffff, 0x2,
 255	0x9654, 0xffffffff, 0x100,
 256	0x9604, 0xffffffff, 0x3,
 257	0x9654, 0xffffffff, 0x100,
 258	0x9604, 0xffffffff, 0x4,
 259	0x9654, 0xffffffff, 0x100,
 260	0x9604, 0xffffffff, 0x5,
 261	0x9654, 0xffffffff, 0x100,
 262	0x9604, 0xffffffff, 0x6,
 263	0x9654, 0xffffffff, 0x100,
 264	0x9604, 0xffffffff, 0x7,
 265	0x9654, 0xffffffff, 0x100,
 266	0x9604, 0xffffffff, 0x8,
 267	0x9654, 0xffffffff, 0x100,
 268	0x9604, 0xffffffff, 0x9,
 269	0x9654, 0xffffffff, 0x100,
 270	0x9604, 0xffffffff, 0x80000000,
 271	0x9030, 0xffffffff, 0x100,
 272	0x9034, 0xffffffff, 0x100,
 273	0x9038, 0xffffffff, 0x100,
 274	0x903c, 0xffffffff, 0x100,
 275	0x9040, 0xffffffff, 0x100,
 276	0xa200, 0xffffffff, 0x100,
 277	0xa204, 0xffffffff, 0x100,
 278	0xa208, 0xffffffff, 0x100,
 279	0xa20c, 0xffffffff, 0x100,
 280	0x971c, 0xffffffff, 0x100,
 281	0x915c, 0xffffffff, 0x00020001,
 282	0x9160, 0xffffffff, 0x00040003,
 283	0x916c, 0xffffffff, 0x00060005,
 284	0x9170, 0xffffffff, 0x00080007,
 285	0x9174, 0xffffffff, 0x000a0009,
 286	0x9178, 0xffffffff, 0x000c000b,
 287	0x917c, 0xffffffff, 0x000e000d,
 288	0x9180, 0xffffffff, 0x0010000f,
 289	0x918c, 0xffffffff, 0x00120011,
 290	0x9190, 0xffffffff, 0x00140013,
 291	0x9194, 0xffffffff, 0x00020001,
 292	0x9198, 0xffffffff, 0x00040003,
 293	0x919c, 0xffffffff, 0x00060005,
 294	0x91a8, 0xffffffff, 0x00080007,
 295	0x91ac, 0xffffffff, 0x000a0009,
 296	0x91b0, 0xffffffff, 0x000c000b,
 297	0x91b4, 0xffffffff, 0x000e000d,
 298	0x91b8, 0xffffffff, 0x0010000f,
 299	0x91c4, 0xffffffff, 0x00120011,
 300	0x91c8, 0xffffffff, 0x00140013,
 301	0x91cc, 0xffffffff, 0x00020001,
 302	0x91d0, 0xffffffff, 0x00040003,
 303	0x91d4, 0xffffffff, 0x00060005,
 304	0x91e0, 0xffffffff, 0x00080007,
 305	0x91e4, 0xffffffff, 0x000a0009,
 306	0x91e8, 0xffffffff, 0x000c000b,
 307	0x91ec, 0xffffffff, 0x00020001,
 308	0x91f0, 0xffffffff, 0x00040003,
 309	0x91f4, 0xffffffff, 0x00060005,
 310	0x9200, 0xffffffff, 0x00080007,
 311	0x9204, 0xffffffff, 0x000a0009,
 312	0x9208, 0xffffffff, 0x000c000b,
 313	0x920c, 0xffffffff, 0x000e000d,
 314	0x9210, 0xffffffff, 0x0010000f,
 315	0x921c, 0xffffffff, 0x00120011,
 316	0x9220, 0xffffffff, 0x00140013,
 317	0x9224, 0xffffffff, 0x00020001,
 318	0x9228, 0xffffffff, 0x00040003,
 319	0x922c, 0xffffffff, 0x00060005,
 320	0x9238, 0xffffffff, 0x00080007,
 321	0x923c, 0xffffffff, 0x000a0009,
 322	0x9240, 0xffffffff, 0x000c000b,
 323	0x9244, 0xffffffff, 0x000e000d,
 324	0x9248, 0xffffffff, 0x0010000f,
 325	0x9254, 0xffffffff, 0x00120011,
 326	0x9258, 0xffffffff, 0x00140013,
 327	0x925c, 0xffffffff, 0x00020001,
 328	0x9260, 0xffffffff, 0x00040003,
 329	0x9264, 0xffffffff, 0x00060005,
 330	0x9270, 0xffffffff, 0x00080007,
 331	0x9274, 0xffffffff, 0x000a0009,
 332	0x9278, 0xffffffff, 0x000c000b,
 333	0x927c, 0xffffffff, 0x000e000d,
 334	0x9280, 0xffffffff, 0x0010000f,
 335	0x928c, 0xffffffff, 0x00120011,
 336	0x9290, 0xffffffff, 0x00140013,
 337	0x9294, 0xffffffff, 0x00020001,
 338	0x929c, 0xffffffff, 0x00040003,
 339	0x92a0, 0xffffffff, 0x00060005,
 340	0x92a4, 0xffffffff, 0x00080007
 341};
 342
 343static const u32 rv710_golden_registers[] = {
 
 344	0x3f90, 0x00ff0000, 0x00fc0000,
 345	0x9148, 0x00ff0000, 0x00fc0000,
 346	0x3f94, 0x00ff0000, 0x00fc0000,
 347	0x914c, 0x00ff0000, 0x00fc0000,
 348	0xb4c, 0x00000020, 0x00000020,
 349	0xa180, 0xffffffff, 0x00003f3f
 350};
 351
 352static const u32 rv710_mgcg_init[] = {
 
 353	0x8bcc, 0xffffffff, 0x13030040,
 354	0x5448, 0xffffffff, 0x100,
 355	0x55e4, 0xffffffff, 0x100,
 356	0x160c, 0xffffffff, 0x100,
 357	0x5644, 0xffffffff, 0x100,
 358	0xc164, 0xffffffff, 0x100,
 359	0x8a18, 0xffffffff, 0x100,
 360	0x897c, 0xffffffff, 0x8000100,
 361	0x8b28, 0xffffffff, 0x3c000100,
 362	0x9144, 0xffffffff, 0x100,
 363	0x9a1c, 0xffffffff, 0x10000,
 364	0x9a50, 0xffffffff, 0x100,
 365	0x9a1c, 0xffffffff, 0x0,
 366	0x9870, 0xffffffff, 0x100,
 367	0x8d58, 0xffffffff, 0x100,
 368	0x9500, 0xffffffff, 0x0,
 369	0x9510, 0xffffffff, 0x100,
 370	0x9500, 0xffffffff, 0x1,
 371	0x9510, 0xffffffff, 0x100,
 372	0x9500, 0xffffffff, 0x8000,
 373	0x9490, 0xffffffff, 0x0,
 374	0x949c, 0xffffffff, 0x100,
 375	0x9490, 0xffffffff, 0x1,
 376	0x949c, 0xffffffff, 0x100,
 377	0x9490, 0xffffffff, 0x8000,
 378	0x9604, 0xffffffff, 0x0,
 379	0x9654, 0xffffffff, 0x100,
 380	0x9604, 0xffffffff, 0x1,
 381	0x9654, 0xffffffff, 0x100,
 382	0x9604, 0xffffffff, 0x80000000,
 383	0x9030, 0xffffffff, 0x100,
 384	0x9034, 0xffffffff, 0x100,
 385	0x9038, 0xffffffff, 0x100,
 386	0x903c, 0xffffffff, 0x100,
 387	0x9040, 0xffffffff, 0x100,
 388	0xa200, 0xffffffff, 0x100,
 389	0xa204, 0xffffffff, 0x100,
 390	0xa208, 0xffffffff, 0x100,
 391	0xa20c, 0xffffffff, 0x100,
 392	0x971c, 0xffffffff, 0x100,
 393	0x915c, 0xffffffff, 0x00020001,
 394	0x9174, 0xffffffff, 0x00000003,
 395	0x9178, 0xffffffff, 0x00050001,
 396	0x917c, 0xffffffff, 0x00030002,
 397	0x918c, 0xffffffff, 0x00000004,
 398	0x9190, 0xffffffff, 0x00070006,
 399	0x9194, 0xffffffff, 0x00050001,
 400	0x9198, 0xffffffff, 0x00030002,
 401	0x91a8, 0xffffffff, 0x00000004,
 402	0x91ac, 0xffffffff, 0x00070006,
 403	0x91e8, 0xffffffff, 0x00000001,
 404	0x9294, 0xffffffff, 0x00000001,
 405	0x929c, 0xffffffff, 0x00000002,
 406	0x92a0, 0xffffffff, 0x00040003,
 407	0x9150, 0xffffffff, 0x4d940000
 408};
 409
 410static const u32 rv730_golden_registers[] = {
 
 411	0x3f90, 0x00ff0000, 0x00f00000,
 412	0x9148, 0x00ff0000, 0x00f00000,
 413	0x3f94, 0x00ff0000, 0x00f00000,
 414	0x914c, 0x00ff0000, 0x00f00000,
 415	0x900c, 0xffffffff, 0x003b033f,
 416	0xb4c, 0x00000020, 0x00000020,
 417	0xa180, 0xffffffff, 0x00003f3f
 418};
 419
 420static const u32 rv730_mgcg_init[] = {
 
 421	0x8bcc, 0xffffffff, 0x130300f9,
 422	0x5448, 0xffffffff, 0x100,
 423	0x55e4, 0xffffffff, 0x100,
 424	0x160c, 0xffffffff, 0x100,
 425	0x5644, 0xffffffff, 0x100,
 426	0xc164, 0xffffffff, 0x100,
 427	0x8a18, 0xffffffff, 0x100,
 428	0x897c, 0xffffffff, 0x8000100,
 429	0x8b28, 0xffffffff, 0x3c000100,
 430	0x9144, 0xffffffff, 0x100,
 431	0x9a1c, 0xffffffff, 0x10000,
 432	0x9a50, 0xffffffff, 0x100,
 433	0x9a1c, 0xffffffff, 0x10001,
 434	0x9a50, 0xffffffff, 0x100,
 435	0x9a1c, 0xffffffff, 0x0,
 436	0x9870, 0xffffffff, 0x100,
 437	0x8d58, 0xffffffff, 0x100,
 438	0x9500, 0xffffffff, 0x0,
 439	0x9510, 0xffffffff, 0x100,
 440	0x9500, 0xffffffff, 0x1,
 441	0x9510, 0xffffffff, 0x100,
 442	0x9500, 0xffffffff, 0x2,
 443	0x9510, 0xffffffff, 0x100,
 444	0x9500, 0xffffffff, 0x3,
 445	0x9510, 0xffffffff, 0x100,
 446	0x9500, 0xffffffff, 0x4,
 447	0x9510, 0xffffffff, 0x100,
 448	0x9500, 0xffffffff, 0x5,
 449	0x9510, 0xffffffff, 0x100,
 450	0x9500, 0xffffffff, 0x6,
 451	0x9510, 0xffffffff, 0x100,
 452	0x9500, 0xffffffff, 0x7,
 453	0x9510, 0xffffffff, 0x100,
 454	0x9500, 0xffffffff, 0x8000,
 455	0x9490, 0xffffffff, 0x0,
 456	0x949c, 0xffffffff, 0x100,
 457	0x9490, 0xffffffff, 0x1,
 458	0x949c, 0xffffffff, 0x100,
 459	0x9490, 0xffffffff, 0x2,
 460	0x949c, 0xffffffff, 0x100,
 461	0x9490, 0xffffffff, 0x3,
 462	0x949c, 0xffffffff, 0x100,
 463	0x9490, 0xffffffff, 0x4,
 464	0x949c, 0xffffffff, 0x100,
 465	0x9490, 0xffffffff, 0x5,
 466	0x949c, 0xffffffff, 0x100,
 467	0x9490, 0xffffffff, 0x6,
 468	0x949c, 0xffffffff, 0x100,
 469	0x9490, 0xffffffff, 0x7,
 470	0x949c, 0xffffffff, 0x100,
 471	0x9490, 0xffffffff, 0x8000,
 472	0x9604, 0xffffffff, 0x0,
 473	0x9654, 0xffffffff, 0x100,
 474	0x9604, 0xffffffff, 0x1,
 475	0x9654, 0xffffffff, 0x100,
 476	0x9604, 0xffffffff, 0x2,
 477	0x9654, 0xffffffff, 0x100,
 478	0x9604, 0xffffffff, 0x3,
 479	0x9654, 0xffffffff, 0x100,
 480	0x9604, 0xffffffff, 0x4,
 481	0x9654, 0xffffffff, 0x100,
 482	0x9604, 0xffffffff, 0x5,
 483	0x9654, 0xffffffff, 0x100,
 484	0x9604, 0xffffffff, 0x6,
 485	0x9654, 0xffffffff, 0x100,
 486	0x9604, 0xffffffff, 0x7,
 487	0x9654, 0xffffffff, 0x100,
 488	0x9604, 0xffffffff, 0x80000000,
 489	0x9030, 0xffffffff, 0x100,
 490	0x9034, 0xffffffff, 0x100,
 491	0x9038, 0xffffffff, 0x100,
 492	0x903c, 0xffffffff, 0x100,
 493	0x9040, 0xffffffff, 0x100,
 494	0xa200, 0xffffffff, 0x100,
 495	0xa204, 0xffffffff, 0x100,
 496	0xa208, 0xffffffff, 0x100,
 497	0xa20c, 0xffffffff, 0x100,
 498	0x971c, 0xffffffff, 0x100,
 499	0x915c, 0xffffffff, 0x00020001,
 500	0x916c, 0xffffffff, 0x00040003,
 501	0x9170, 0xffffffff, 0x00000005,
 502	0x9178, 0xffffffff, 0x00050001,
 503	0x917c, 0xffffffff, 0x00030002,
 504	0x918c, 0xffffffff, 0x00000004,
 505	0x9190, 0xffffffff, 0x00070006,
 506	0x9194, 0xffffffff, 0x00050001,
 507	0x9198, 0xffffffff, 0x00030002,
 508	0x91a8, 0xffffffff, 0x00000004,
 509	0x91ac, 0xffffffff, 0x00070006,
 510	0x91b0, 0xffffffff, 0x00050001,
 511	0x91b4, 0xffffffff, 0x00030002,
 512	0x91c4, 0xffffffff, 0x00000004,
 513	0x91c8, 0xffffffff, 0x00070006,
 514	0x91cc, 0xffffffff, 0x00050001,
 515	0x91d0, 0xffffffff, 0x00030002,
 516	0x91e0, 0xffffffff, 0x00000004,
 517	0x91e4, 0xffffffff, 0x00070006,
 518	0x91e8, 0xffffffff, 0x00000001,
 519	0x91ec, 0xffffffff, 0x00050001,
 520	0x91f0, 0xffffffff, 0x00030002,
 521	0x9200, 0xffffffff, 0x00000004,
 522	0x9204, 0xffffffff, 0x00070006,
 523	0x9208, 0xffffffff, 0x00050001,
 524	0x920c, 0xffffffff, 0x00030002,
 525	0x921c, 0xffffffff, 0x00000004,
 526	0x9220, 0xffffffff, 0x00070006,
 527	0x9224, 0xffffffff, 0x00050001,
 528	0x9228, 0xffffffff, 0x00030002,
 529	0x9238, 0xffffffff, 0x00000004,
 530	0x923c, 0xffffffff, 0x00070006,
 531	0x9240, 0xffffffff, 0x00050001,
 532	0x9244, 0xffffffff, 0x00030002,
 533	0x9254, 0xffffffff, 0x00000004,
 534	0x9258, 0xffffffff, 0x00070006,
 535	0x9294, 0xffffffff, 0x00000001,
 536	0x929c, 0xffffffff, 0x00000002,
 537	0x92a0, 0xffffffff, 0x00040003,
 538	0x92a4, 0xffffffff, 0x00000005
 539};
 540
 541static const u32 rv740_golden_registers[] = {
 
 542	0x88c4, 0xffffffff, 0x00000082,
 543	0x28a50, 0xfffffffc, 0x00000004,
 544	0x2650, 0x00040000, 0,
 545	0x20bc, 0x00040000, 0,
 546	0x733c, 0xffffffff, 0x00000002,
 547	0x7300, 0xffffffff, 0x001000f0,
 548	0x3f90, 0x00ff0000, 0,
 549	0x9148, 0x00ff0000, 0,
 550	0x3f94, 0x00ff0000, 0,
 551	0x914c, 0x00ff0000, 0,
 552	0x240c, 0xffffffff, 0x00000380,
 553	0x8a14, 0x00000007, 0x00000007,
 554	0x8b24, 0xffffffff, 0x00ff0fff,
 555	0x28a4c, 0xffffffff, 0x00004000,
 556	0xa180, 0xffffffff, 0x00003f3f,
 557	0x8d00, 0xffffffff, 0x0e0e003a,
 558	0x8d04, 0xffffffff, 0x013a0e2a,
 559	0x8c00, 0xffffffff, 0xe400000f,
 560	0x8db0, 0xffffffff, 0x98989898,
 561	0x8db4, 0xffffffff, 0x98989898,
 562	0x8db8, 0xffffffff, 0x98989898,
 563	0x8dbc, 0xffffffff, 0x98989898,
 564	0x8dc0, 0xffffffff, 0x98989898,
 565	0x8dc4, 0xffffffff, 0x98989898,
 566	0x8dc8, 0xffffffff, 0x98989898,
 567	0x8dcc, 0xffffffff, 0x98989898,
 568	0x9058, 0xffffffff, 0x0fffc40f,
 569	0x900c, 0xffffffff, 0x003b033f,
 570	0x28350, 0xffffffff, 0,
 571	0x8cf0, 0x1fffffff, 0x08e00420,
 572	0x9508, 0xffffffff, 0x00000002,
 573	0x88c4, 0xffffffff, 0x000000c2,
 574	0x9698, 0x18000000, 0x18000000
 575};
 576
 577static const u32 rv740_mgcg_init[] = {
 
 578	0x8bcc, 0xffffffff, 0x13030100,
 579	0x5448, 0xffffffff, 0x100,
 580	0x55e4, 0xffffffff, 0x100,
 581	0x160c, 0xffffffff, 0x100,
 582	0x5644, 0xffffffff, 0x100,
 583	0xc164, 0xffffffff, 0x100,
 584	0x8a18, 0xffffffff, 0x100,
 585	0x897c, 0xffffffff, 0x100,
 586	0x8b28, 0xffffffff, 0x100,
 587	0x9144, 0xffffffff, 0x100,
 588	0x9a1c, 0xffffffff, 0x10000,
 589	0x9a50, 0xffffffff, 0x100,
 590	0x9a1c, 0xffffffff, 0x10001,
 591	0x9a50, 0xffffffff, 0x100,
 592	0x9a1c, 0xffffffff, 0x10002,
 593	0x9a50, 0xffffffff, 0x100,
 594	0x9a1c, 0xffffffff, 0x10003,
 595	0x9a50, 0xffffffff, 0x100,
 596	0x9a1c, 0xffffffff, 0x0,
 597	0x9870, 0xffffffff, 0x100,
 598	0x8d58, 0xffffffff, 0x100,
 599	0x9500, 0xffffffff, 0x0,
 600	0x9510, 0xffffffff, 0x100,
 601	0x9500, 0xffffffff, 0x1,
 602	0x9510, 0xffffffff, 0x100,
 603	0x9500, 0xffffffff, 0x2,
 604	0x9510, 0xffffffff, 0x100,
 605	0x9500, 0xffffffff, 0x3,
 606	0x9510, 0xffffffff, 0x100,
 607	0x9500, 0xffffffff, 0x4,
 608	0x9510, 0xffffffff, 0x100,
 609	0x9500, 0xffffffff, 0x5,
 610	0x9510, 0xffffffff, 0x100,
 611	0x9500, 0xffffffff, 0x6,
 612	0x9510, 0xffffffff, 0x100,
 613	0x9500, 0xffffffff, 0x7,
 614	0x9510, 0xffffffff, 0x100,
 615	0x9500, 0xffffffff, 0x8000,
 616	0x9490, 0xffffffff, 0x0,
 617	0x949c, 0xffffffff, 0x100,
 618	0x9490, 0xffffffff, 0x1,
 619	0x949c, 0xffffffff, 0x100,
 620	0x9490, 0xffffffff, 0x2,
 621	0x949c, 0xffffffff, 0x100,
 622	0x9490, 0xffffffff, 0x3,
 623	0x949c, 0xffffffff, 0x100,
 624	0x9490, 0xffffffff, 0x4,
 625	0x949c, 0xffffffff, 0x100,
 626	0x9490, 0xffffffff, 0x5,
 627	0x949c, 0xffffffff, 0x100,
 628	0x9490, 0xffffffff, 0x6,
 629	0x949c, 0xffffffff, 0x100,
 630	0x9490, 0xffffffff, 0x7,
 631	0x949c, 0xffffffff, 0x100,
 632	0x9490, 0xffffffff, 0x8000,
 633	0x9604, 0xffffffff, 0x0,
 634	0x9654, 0xffffffff, 0x100,
 635	0x9604, 0xffffffff, 0x1,
 636	0x9654, 0xffffffff, 0x100,
 637	0x9604, 0xffffffff, 0x2,
 638	0x9654, 0xffffffff, 0x100,
 639	0x9604, 0xffffffff, 0x3,
 640	0x9654, 0xffffffff, 0x100,
 641	0x9604, 0xffffffff, 0x4,
 642	0x9654, 0xffffffff, 0x100,
 643	0x9604, 0xffffffff, 0x5,
 644	0x9654, 0xffffffff, 0x100,
 645	0x9604, 0xffffffff, 0x6,
 646	0x9654, 0xffffffff, 0x100,
 647	0x9604, 0xffffffff, 0x7,
 648	0x9654, 0xffffffff, 0x100,
 649	0x9604, 0xffffffff, 0x80000000,
 650	0x9030, 0xffffffff, 0x100,
 651	0x9034, 0xffffffff, 0x100,
 652	0x9038, 0xffffffff, 0x100,
 653	0x903c, 0xffffffff, 0x100,
 654	0x9040, 0xffffffff, 0x100,
 655	0xa200, 0xffffffff, 0x100,
 656	0xa204, 0xffffffff, 0x100,
 657	0xa208, 0xffffffff, 0x100,
 658	0xa20c, 0xffffffff, 0x100,
 659	0x971c, 0xffffffff, 0x100,
 660	0x915c, 0xffffffff, 0x00020001,
 661	0x9160, 0xffffffff, 0x00040003,
 662	0x916c, 0xffffffff, 0x00060005,
 663	0x9170, 0xffffffff, 0x00080007,
 664	0x9174, 0xffffffff, 0x000a0009,
 665	0x9178, 0xffffffff, 0x000c000b,
 666	0x917c, 0xffffffff, 0x000e000d,
 667	0x9180, 0xffffffff, 0x0010000f,
 668	0x918c, 0xffffffff, 0x00120011,
 669	0x9190, 0xffffffff, 0x00140013,
 670	0x9194, 0xffffffff, 0x00020001,
 671	0x9198, 0xffffffff, 0x00040003,
 672	0x919c, 0xffffffff, 0x00060005,
 673	0x91a8, 0xffffffff, 0x00080007,
 674	0x91ac, 0xffffffff, 0x000a0009,
 675	0x91b0, 0xffffffff, 0x000c000b,
 676	0x91b4, 0xffffffff, 0x000e000d,
 677	0x91b8, 0xffffffff, 0x0010000f,
 678	0x91c4, 0xffffffff, 0x00120011,
 679	0x91c8, 0xffffffff, 0x00140013,
 680	0x91cc, 0xffffffff, 0x00020001,
 681	0x91d0, 0xffffffff, 0x00040003,
 682	0x91d4, 0xffffffff, 0x00060005,
 683	0x91e0, 0xffffffff, 0x00080007,
 684	0x91e4, 0xffffffff, 0x000a0009,
 685	0x91e8, 0xffffffff, 0x000c000b,
 686	0x91ec, 0xffffffff, 0x00020001,
 687	0x91f0, 0xffffffff, 0x00040003,
 688	0x91f4, 0xffffffff, 0x00060005,
 689	0x9200, 0xffffffff, 0x00080007,
 690	0x9204, 0xffffffff, 0x000a0009,
 691	0x9208, 0xffffffff, 0x000c000b,
 692	0x920c, 0xffffffff, 0x000e000d,
 693	0x9210, 0xffffffff, 0x0010000f,
 694	0x921c, 0xffffffff, 0x00120011,
 695	0x9220, 0xffffffff, 0x00140013,
 696	0x9224, 0xffffffff, 0x00020001,
 697	0x9228, 0xffffffff, 0x00040003,
 698	0x922c, 0xffffffff, 0x00060005,
 699	0x9238, 0xffffffff, 0x00080007,
 700	0x923c, 0xffffffff, 0x000a0009,
 701	0x9240, 0xffffffff, 0x000c000b,
 702	0x9244, 0xffffffff, 0x000e000d,
 703	0x9248, 0xffffffff, 0x0010000f,
 704	0x9254, 0xffffffff, 0x00120011,
 705	0x9258, 0xffffffff, 0x00140013,
 706	0x9294, 0xffffffff, 0x00020001,
 707	0x929c, 0xffffffff, 0x00040003,
 708	0x92a0, 0xffffffff, 0x00060005,
 709	0x92a4, 0xffffffff, 0x00080007
 710};
 711
 712static void rv770_init_golden_registers(struct radeon_device *rdev)
 713{
 714	switch (rdev->family) {
 715	case CHIP_RV770:
 716		radeon_program_register_sequence(rdev,
 717						 r7xx_golden_registers,
 718						 (const u32)ARRAY_SIZE(r7xx_golden_registers));
 719		radeon_program_register_sequence(rdev,
 720						 r7xx_golden_dyn_gpr_registers,
 721						 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
 722		if (rdev->pdev->device == 0x994e)
 723			radeon_program_register_sequence(rdev,
 724							 rv770ce_golden_registers,
 725							 (const u32)ARRAY_SIZE(rv770ce_golden_registers));
 726		else
 727			radeon_program_register_sequence(rdev,
 728							 rv770_golden_registers,
 729							 (const u32)ARRAY_SIZE(rv770_golden_registers));
 730		radeon_program_register_sequence(rdev,
 731						 rv770_mgcg_init,
 732						 (const u32)ARRAY_SIZE(rv770_mgcg_init));
 733		break;
 734	case CHIP_RV730:
 735		radeon_program_register_sequence(rdev,
 736						 r7xx_golden_registers,
 737						 (const u32)ARRAY_SIZE(r7xx_golden_registers));
 738		radeon_program_register_sequence(rdev,
 739						 r7xx_golden_dyn_gpr_registers,
 740						 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
 741		radeon_program_register_sequence(rdev,
 742						 rv730_golden_registers,
 743						 (const u32)ARRAY_SIZE(rv730_golden_registers));
 744		radeon_program_register_sequence(rdev,
 745						 rv730_mgcg_init,
 746						 (const u32)ARRAY_SIZE(rv730_mgcg_init));
 747		break;
 748	case CHIP_RV710:
 749		radeon_program_register_sequence(rdev,
 750						 r7xx_golden_registers,
 751						 (const u32)ARRAY_SIZE(r7xx_golden_registers));
 752		radeon_program_register_sequence(rdev,
 753						 r7xx_golden_dyn_gpr_registers,
 754						 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
 755		radeon_program_register_sequence(rdev,
 756						 rv710_golden_registers,
 757						 (const u32)ARRAY_SIZE(rv710_golden_registers));
 758		radeon_program_register_sequence(rdev,
 759						 rv710_mgcg_init,
 760						 (const u32)ARRAY_SIZE(rv710_mgcg_init));
 761		break;
 762	case CHIP_RV740:
 763		radeon_program_register_sequence(rdev,
 764						 rv740_golden_registers,
 765						 (const u32)ARRAY_SIZE(rv740_golden_registers));
 766		radeon_program_register_sequence(rdev,
 767						 rv740_mgcg_init,
 768						 (const u32)ARRAY_SIZE(rv740_mgcg_init));
 769		break;
 770	default:
 771		break;
 772	}
 773}
 774
 775#define PCIE_BUS_CLK                10000
 776#define TCLK                        (PCIE_BUS_CLK / 10)
 777
 778/**
 779 * rv770_get_xclk - get the xclk
 780 *
 781 * @rdev: radeon_device pointer
 782 *
 783 * Returns the reference clock used by the gfx engine
 784 * (r7xx-cayman).
 785 */
 786u32 rv770_get_xclk(struct radeon_device *rdev)
 787{
 788	u32 reference_clock = rdev->clock.spll.reference_freq;
 789	u32 tmp = RREG32(CG_CLKPIN_CNTL);
 790
 791	if (tmp & MUX_TCLK_TO_XCLK)
 792		return TCLK;
 793
 794	if (tmp & XTALIN_DIVIDE)
 795		return reference_clock / 4;
 796
 797	return reference_clock;
 798}
 799
 800void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, bool async)
 801{
 802	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
 803	struct drm_framebuffer *fb = radeon_crtc->base.primary->fb;
 804	u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset);
 805	int i;
 806
 807	/* Lock the graphics update lock */
 808	tmp |= AVIVO_D1GRPH_UPDATE_LOCK;
 809	WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
 810
 811	/* flip at hsync for async, default is vsync */
 812	WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset,
 813	       async ? AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
 814	/* update pitch */
 815	WREG32(AVIVO_D1GRPH_PITCH + radeon_crtc->crtc_offset,
 816	       fb->pitches[0] / fb->format->cpp[0]);
 817	/* update the scanout addresses */
 818	if (radeon_crtc->crtc_id) {
 819		WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
 820		WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
 821	} else {
 822		WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
 823		WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
 824	}
 825	WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
 826	       (u32)crtc_base);
 827	WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
 828	       (u32)crtc_base);
 829
 830	/* Wait for update_pending to go high. */
 831	for (i = 0; i < rdev->usec_timeout; i++) {
 832		if (RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING)
 833			break;
 834		udelay(1);
 835	}
 836	DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
 837
 838	/* Unlock the lock, so double-buffering can take place inside vblank */
 839	tmp &= ~AVIVO_D1GRPH_UPDATE_LOCK;
 840	WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
 841}
 842
 843bool rv770_page_flip_pending(struct radeon_device *rdev, int crtc_id)
 844{
 845	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
 846
 847	/* Return current update_pending status: */
 848	return !!(RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) &
 849		AVIVO_D1GRPH_SURFACE_UPDATE_PENDING);
 850}
 851
 852/* get temperature in millidegrees */
 853int rv770_get_temp(struct radeon_device *rdev)
 854{
 855	u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
 856		ASIC_T_SHIFT;
 857	int actual_temp;
 858
 859	if (temp & 0x400)
 860		actual_temp = -256;
 861	else if (temp & 0x200)
 862		actual_temp = 255;
 863	else if (temp & 0x100) {
 864		actual_temp = temp & 0x1ff;
 865		actual_temp |= ~0x1ff;
 866	} else
 867		actual_temp = temp & 0xff;
 868
 869	return (actual_temp * 1000) / 2;
 870}
 871
 872void rv770_pm_misc(struct radeon_device *rdev)
 873{
 874	int req_ps_idx = rdev->pm.requested_power_state_index;
 875	int req_cm_idx = rdev->pm.requested_clock_mode_index;
 876	struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
 877	struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
 878
 879	if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
 880		/* 0xff01 is a flag rather then an actual voltage */
 881		if (voltage->voltage == 0xff01)
 882			return;
 883		if (voltage->voltage != rdev->pm.current_vddc) {
 884			radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
 885			rdev->pm.current_vddc = voltage->voltage;
 886			DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
 887		}
 888	}
 889}
 890
 891/*
 892 * GART
 893 */
 894static int rv770_pcie_gart_enable(struct radeon_device *rdev)
 895{
 896	u32 tmp;
 897	int r, i;
 898
 899	if (rdev->gart.robj == NULL) {
 900		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
 901		return -EINVAL;
 902	}
 903	r = radeon_gart_table_vram_pin(rdev);
 904	if (r)
 905		return r;
 
 906	/* Setup L2 cache */
 907	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
 908				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
 909				EFFECTIVE_L2_QUEUE_SIZE(7));
 910	WREG32(VM_L2_CNTL2, 0);
 911	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
 912	/* Setup TLB control */
 913	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
 914		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
 915		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
 916		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
 917	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
 918	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
 919	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
 920	if (rdev->family == CHIP_RV740)
 921		WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
 922	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
 923	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
 924	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
 925	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
 926	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
 927	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
 928	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
 929	WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
 930				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
 931	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
 932			(u32)(rdev->dummy_page.addr >> 12));
 933	for (i = 1; i < 7; i++)
 934		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
 935
 936	r600_pcie_gart_tlb_flush(rdev);
 937	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
 938		 (unsigned)(rdev->mc.gtt_size >> 20),
 939		 (unsigned long long)rdev->gart.table_addr);
 940	rdev->gart.ready = true;
 941	return 0;
 942}
 943
 944static void rv770_pcie_gart_disable(struct radeon_device *rdev)
 945{
 946	u32 tmp;
 947	int i;
 948
 949	/* Disable all tables */
 950	for (i = 0; i < 7; i++)
 951		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
 952
 953	/* Setup L2 cache */
 954	WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
 955				EFFECTIVE_L2_QUEUE_SIZE(7));
 956	WREG32(VM_L2_CNTL2, 0);
 957	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
 958	/* Setup TLB control */
 959	tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
 960	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
 961	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
 962	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
 963	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
 964	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
 965	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
 966	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
 967	radeon_gart_table_vram_unpin(rdev);
 968}
 969
 970static void rv770_pcie_gart_fini(struct radeon_device *rdev)
 971{
 972	radeon_gart_fini(rdev);
 973	rv770_pcie_gart_disable(rdev);
 974	radeon_gart_table_vram_free(rdev);
 975}
 976
 977
 978static void rv770_agp_enable(struct radeon_device *rdev)
 979{
 980	u32 tmp;
 981	int i;
 982
 983	/* Setup L2 cache */
 984	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
 985				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
 986				EFFECTIVE_L2_QUEUE_SIZE(7));
 987	WREG32(VM_L2_CNTL2, 0);
 988	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
 989	/* Setup TLB control */
 990	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
 991		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
 992		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
 993		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
 994	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
 995	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
 996	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
 997	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
 998	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
 999	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
1000	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
1001	for (i = 0; i < 7; i++)
1002		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
1003}
1004
1005static void rv770_mc_program(struct radeon_device *rdev)
1006{
1007	struct rv515_mc_save save;
1008	u32 tmp;
1009	int i, j;
1010
1011	/* Initialize HDP */
1012	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
1013		WREG32((0x2c14 + j), 0x00000000);
1014		WREG32((0x2c18 + j), 0x00000000);
1015		WREG32((0x2c1c + j), 0x00000000);
1016		WREG32((0x2c20 + j), 0x00000000);
1017		WREG32((0x2c24 + j), 0x00000000);
1018	}
1019	/* r7xx hw bug.  Read from HDP_DEBUG1 rather
1020	 * than writing to HDP_REG_COHERENCY_FLUSH_CNTL
1021	 */
1022	tmp = RREG32(HDP_DEBUG1);
1023
1024	rv515_mc_stop(rdev, &save);
1025	if (r600_mc_wait_for_idle(rdev)) {
1026		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1027	}
1028	/* Lockout access through VGA aperture*/
1029	WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
1030	/* Update configuration */
1031	if (rdev->flags & RADEON_IS_AGP) {
1032		if (rdev->mc.vram_start < rdev->mc.gtt_start) {
1033			/* VRAM before AGP */
1034			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1035				rdev->mc.vram_start >> 12);
1036			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1037				rdev->mc.gtt_end >> 12);
1038		} else {
1039			/* VRAM after AGP */
1040			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1041				rdev->mc.gtt_start >> 12);
1042			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1043				rdev->mc.vram_end >> 12);
1044		}
1045	} else {
1046		WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1047			rdev->mc.vram_start >> 12);
1048		WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1049			rdev->mc.vram_end >> 12);
1050	}
1051	WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
1052	tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
1053	tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
1054	WREG32(MC_VM_FB_LOCATION, tmp);
1055	WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
1056	WREG32(HDP_NONSURFACE_INFO, (2 << 7));
1057	WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
1058	if (rdev->flags & RADEON_IS_AGP) {
1059		WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16);
1060		WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16);
1061		WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
1062	} else {
1063		WREG32(MC_VM_AGP_BASE, 0);
1064		WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
1065		WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
1066	}
1067	if (r600_mc_wait_for_idle(rdev)) {
1068		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1069	}
1070	rv515_mc_resume(rdev, &save);
1071	/* we need to own VRAM, so turn off the VGA renderer here
1072	 * to stop it overwriting our objects */
1073	rv515_vga_render_disable(rdev);
1074}
1075
1076
1077/*
1078 * CP.
1079 */
1080void r700_cp_stop(struct radeon_device *rdev)
1081{
1082	if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1083		radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1084	WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1085	WREG32(SCRATCH_UMSK, 0);
1086	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1087}
1088
1089static int rv770_cp_load_microcode(struct radeon_device *rdev)
1090{
1091	const __be32 *fw_data;
1092	int i;
1093
1094	if (!rdev->me_fw || !rdev->pfp_fw)
1095		return -EINVAL;
1096
1097	r700_cp_stop(rdev);
1098	WREG32(CP_RB_CNTL,
1099#ifdef __BIG_ENDIAN
1100	       BUF_SWAP_32BIT |
1101#endif
1102	       RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
1103
1104	/* Reset cp */
1105	WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
1106	RREG32(GRBM_SOFT_RESET);
1107	mdelay(15);
1108	WREG32(GRBM_SOFT_RESET, 0);
1109
1110	fw_data = (const __be32 *)rdev->pfp_fw->data;
1111	WREG32(CP_PFP_UCODE_ADDR, 0);
1112	for (i = 0; i < R700_PFP_UCODE_SIZE; i++)
1113		WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1114	WREG32(CP_PFP_UCODE_ADDR, 0);
1115
1116	fw_data = (const __be32 *)rdev->me_fw->data;
1117	WREG32(CP_ME_RAM_WADDR, 0);
1118	for (i = 0; i < R700_PM4_UCODE_SIZE; i++)
1119		WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1120
1121	WREG32(CP_PFP_UCODE_ADDR, 0);
1122	WREG32(CP_ME_RAM_WADDR, 0);
1123	WREG32(CP_ME_RAM_RADDR, 0);
1124	return 0;
1125}
1126
1127void r700_cp_fini(struct radeon_device *rdev)
1128{
1129	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1130	r700_cp_stop(rdev);
1131	radeon_ring_fini(rdev, ring);
1132	radeon_scratch_free(rdev, ring->rptr_save_reg);
1133}
1134
1135void rv770_set_clk_bypass_mode(struct radeon_device *rdev)
1136{
1137	u32 tmp, i;
1138
1139	if (rdev->flags & RADEON_IS_IGP)
1140		return;
1141
1142	tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
1143	tmp &= SCLK_MUX_SEL_MASK;
1144	tmp |= SCLK_MUX_SEL(1) | SCLK_MUX_UPDATE;
1145	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1146
1147	for (i = 0; i < rdev->usec_timeout; i++) {
1148		if (RREG32(CG_SPLL_STATUS) & SPLL_CHG_STATUS)
1149			break;
1150		udelay(1);
1151	}
1152
1153	tmp &= ~SCLK_MUX_UPDATE;
1154	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1155
1156	tmp = RREG32(MPLL_CNTL_MODE);
1157	if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730))
1158		tmp &= ~RV730_MPLL_MCLK_SEL;
1159	else
1160		tmp &= ~MPLL_MCLK_SEL;
1161	WREG32(MPLL_CNTL_MODE, tmp);
1162}
1163
1164/*
1165 * Core functions
1166 */
1167static void rv770_gpu_init(struct radeon_device *rdev)
1168{
1169	int i, j, num_qd_pipes;
1170	u32 ta_aux_cntl;
1171	u32 sx_debug_1;
1172	u32 smx_dc_ctl0;
1173	u32 db_debug3;
1174	u32 num_gs_verts_per_thread;
1175	u32 vgt_gs_per_es;
1176	u32 gs_prim_buffer_depth = 0;
1177	u32 sq_ms_fifo_sizes;
1178	u32 sq_config;
1179	u32 sq_thread_resource_mgmt;
1180	u32 hdp_host_path_cntl;
1181	u32 sq_dyn_gpr_size_simd_ab_0;
1182	u32 gb_tiling_config = 0;
 
1183	u32 cc_gc_shader_pipe_config = 0;
1184	u32 mc_arb_ramcfg;
1185	u32 db_debug4, tmp;
1186	u32 inactive_pipes, shader_pipe_config;
1187	u32 disabled_rb_mask;
1188	unsigned active_number;
1189
1190	/* setup chip specs */
1191	rdev->config.rv770.tiling_group_size = 256;
1192	switch (rdev->family) {
1193	case CHIP_RV770:
1194		rdev->config.rv770.max_pipes = 4;
1195		rdev->config.rv770.max_tile_pipes = 8;
1196		rdev->config.rv770.max_simds = 10;
1197		rdev->config.rv770.max_backends = 4;
1198		rdev->config.rv770.max_gprs = 256;
1199		rdev->config.rv770.max_threads = 248;
1200		rdev->config.rv770.max_stack_entries = 512;
1201		rdev->config.rv770.max_hw_contexts = 8;
1202		rdev->config.rv770.max_gs_threads = 16 * 2;
1203		rdev->config.rv770.sx_max_export_size = 128;
1204		rdev->config.rv770.sx_max_export_pos_size = 16;
1205		rdev->config.rv770.sx_max_export_smx_size = 112;
1206		rdev->config.rv770.sq_num_cf_insts = 2;
1207
1208		rdev->config.rv770.sx_num_of_sets = 7;
1209		rdev->config.rv770.sc_prim_fifo_size = 0xF9;
1210		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1211		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1212		break;
1213	case CHIP_RV730:
1214		rdev->config.rv770.max_pipes = 2;
1215		rdev->config.rv770.max_tile_pipes = 4;
1216		rdev->config.rv770.max_simds = 8;
1217		rdev->config.rv770.max_backends = 2;
1218		rdev->config.rv770.max_gprs = 128;
1219		rdev->config.rv770.max_threads = 248;
1220		rdev->config.rv770.max_stack_entries = 256;
1221		rdev->config.rv770.max_hw_contexts = 8;
1222		rdev->config.rv770.max_gs_threads = 16 * 2;
1223		rdev->config.rv770.sx_max_export_size = 256;
1224		rdev->config.rv770.sx_max_export_pos_size = 32;
1225		rdev->config.rv770.sx_max_export_smx_size = 224;
1226		rdev->config.rv770.sq_num_cf_insts = 2;
1227
1228		rdev->config.rv770.sx_num_of_sets = 7;
1229		rdev->config.rv770.sc_prim_fifo_size = 0xf9;
1230		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1231		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1232		if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1233			rdev->config.rv770.sx_max_export_pos_size -= 16;
1234			rdev->config.rv770.sx_max_export_smx_size += 16;
1235		}
1236		break;
1237	case CHIP_RV710:
1238		rdev->config.rv770.max_pipes = 2;
1239		rdev->config.rv770.max_tile_pipes = 2;
1240		rdev->config.rv770.max_simds = 2;
1241		rdev->config.rv770.max_backends = 1;
1242		rdev->config.rv770.max_gprs = 256;
1243		rdev->config.rv770.max_threads = 192;
1244		rdev->config.rv770.max_stack_entries = 256;
1245		rdev->config.rv770.max_hw_contexts = 4;
1246		rdev->config.rv770.max_gs_threads = 8 * 2;
1247		rdev->config.rv770.sx_max_export_size = 128;
1248		rdev->config.rv770.sx_max_export_pos_size = 16;
1249		rdev->config.rv770.sx_max_export_smx_size = 112;
1250		rdev->config.rv770.sq_num_cf_insts = 1;
1251
1252		rdev->config.rv770.sx_num_of_sets = 7;
1253		rdev->config.rv770.sc_prim_fifo_size = 0x40;
1254		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1255		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1256		break;
1257	case CHIP_RV740:
1258		rdev->config.rv770.max_pipes = 4;
1259		rdev->config.rv770.max_tile_pipes = 4;
1260		rdev->config.rv770.max_simds = 8;
1261		rdev->config.rv770.max_backends = 4;
1262		rdev->config.rv770.max_gprs = 256;
1263		rdev->config.rv770.max_threads = 248;
1264		rdev->config.rv770.max_stack_entries = 512;
1265		rdev->config.rv770.max_hw_contexts = 8;
1266		rdev->config.rv770.max_gs_threads = 16 * 2;
1267		rdev->config.rv770.sx_max_export_size = 256;
1268		rdev->config.rv770.sx_max_export_pos_size = 32;
1269		rdev->config.rv770.sx_max_export_smx_size = 224;
1270		rdev->config.rv770.sq_num_cf_insts = 2;
1271
1272		rdev->config.rv770.sx_num_of_sets = 7;
1273		rdev->config.rv770.sc_prim_fifo_size = 0x100;
1274		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1275		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1276
1277		if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1278			rdev->config.rv770.sx_max_export_pos_size -= 16;
1279			rdev->config.rv770.sx_max_export_smx_size += 16;
1280		}
1281		break;
1282	default:
1283		break;
1284	}
1285
1286	/* Initialize HDP */
1287	j = 0;
1288	for (i = 0; i < 32; i++) {
1289		WREG32((0x2c14 + j), 0x00000000);
1290		WREG32((0x2c18 + j), 0x00000000);
1291		WREG32((0x2c1c + j), 0x00000000);
1292		WREG32((0x2c20 + j), 0x00000000);
1293		WREG32((0x2c24 + j), 0x00000000);
1294		j += 0x18;
1295	}
1296
1297	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
1298
1299	/* setup tiling, simd, pipe config */
1300	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1301
1302	shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG);
1303	inactive_pipes = (shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT;
1304	for (i = 0, tmp = 1, active_number = 0; i < R7XX_MAX_PIPES; i++) {
1305		if (!(inactive_pipes & tmp)) {
1306			active_number++;
1307		}
1308		tmp <<= 1;
1309	}
1310	if (active_number == 1) {
1311		WREG32(SPI_CONFIG_CNTL, DISABLE_INTERP_1);
1312	} else {
1313		WREG32(SPI_CONFIG_CNTL, 0);
1314	}
1315
 
 
 
 
 
 
1316	cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
1317	tmp = rdev->config.rv770.max_simds -
1318		r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK);
1319	rdev->config.rv770.active_simds = tmp;
 
 
 
 
 
1320
1321	switch (rdev->config.rv770.max_tile_pipes) {
1322	case 1:
1323	default:
1324		gb_tiling_config = PIPE_TILING(0);
1325		break;
1326	case 2:
1327		gb_tiling_config = PIPE_TILING(1);
1328		break;
1329	case 4:
1330		gb_tiling_config = PIPE_TILING(2);
1331		break;
1332	case 8:
1333		gb_tiling_config = PIPE_TILING(3);
1334		break;
1335	}
1336	rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
1337
1338	disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK;
1339	tmp = 0;
1340	for (i = 0; i < rdev->config.rv770.max_backends; i++)
1341		tmp |= (1 << i);
1342	/* if all the backends are disabled, fix it up here */
1343	if ((disabled_rb_mask & tmp) == tmp) {
1344		for (i = 0; i < rdev->config.rv770.max_backends; i++)
1345			disabled_rb_mask &= ~(1 << i);
1346	}
1347	tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT;
1348	tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends,
1349					R7XX_MAX_BACKENDS, disabled_rb_mask);
1350	gb_tiling_config |= tmp << 16;
1351	rdev->config.rv770.backend_map = tmp;
1352
1353	if (rdev->family == CHIP_RV770)
1354		gb_tiling_config |= BANK_TILING(1);
1355	else {
1356		if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
1357			gb_tiling_config |= BANK_TILING(1);
1358		else
1359			gb_tiling_config |= BANK_TILING(0);
1360	}
1361	rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3);
1362	gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
1363	if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) {
1364		gb_tiling_config |= ROW_TILING(3);
1365		gb_tiling_config |= SAMPLE_SPLIT(3);
1366	} else {
1367		gb_tiling_config |=
1368			ROW_TILING(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1369		gb_tiling_config |=
1370			SAMPLE_SPLIT(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1371	}
1372
1373	gb_tiling_config |= BANK_SWAPS(1);
1374	rdev->config.rv770.tile_config = gb_tiling_config;
1375
1376	WREG32(GB_TILING_CONFIG, gb_tiling_config);
1377	WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1378	WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1379	WREG32(DMA_TILING_CONFIG, (gb_tiling_config & 0xffff));
1380	WREG32(DMA_TILING_CONFIG2, (gb_tiling_config & 0xffff));
1381	if (rdev->family == CHIP_RV730) {
1382		WREG32(UVD_UDEC_DB_TILING_CONFIG, (gb_tiling_config & 0xffff));
1383		WREG32(UVD_UDEC_DBW_TILING_CONFIG, (gb_tiling_config & 0xffff));
1384		WREG32(UVD_UDEC_TILING_CONFIG, (gb_tiling_config & 0xffff));
1385	}
1386
1387	WREG32(CGTS_SYS_TCC_DISABLE, 0);
1388	WREG32(CGTS_TCC_DISABLE, 0);
1389	WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
1390	WREG32(CGTS_USER_TCC_DISABLE, 0);
1391
1392
1393	num_qd_pipes = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8);
1394	WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK);
1395	WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK);
1396
1397	/* set HW defaults for 3D engine */
1398	WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
1399				     ROQ_IB2_START(0x2b)));
1400
1401	WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
1402
1403	ta_aux_cntl = RREG32(TA_CNTL_AUX);
1404	WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO);
1405
1406	sx_debug_1 = RREG32(SX_DEBUG_1);
1407	sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
1408	WREG32(SX_DEBUG_1, sx_debug_1);
1409
1410	smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
1411	smx_dc_ctl0 &= ~CACHE_DEPTH(0x1ff);
1412	smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1);
1413	WREG32(SMX_DC_CTL0, smx_dc_ctl0);
1414
1415	if (rdev->family != CHIP_RV740)
1416		WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
1417				       GS_FLUSH_CTL(4) |
1418				       ACK_FLUSH_CTL(3) |
1419				       SYNC_FLUSH_CTL));
1420
1421	if (rdev->family != CHIP_RV770)
1422		WREG32(SMX_SAR_CTL0, 0x00003f3f);
1423
1424	db_debug3 = RREG32(DB_DEBUG3);
1425	db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
1426	switch (rdev->family) {
1427	case CHIP_RV770:
1428	case CHIP_RV740:
1429		db_debug3 |= DB_CLK_OFF_DELAY(0x1f);
1430		break;
1431	case CHIP_RV710:
1432	case CHIP_RV730:
1433	default:
1434		db_debug3 |= DB_CLK_OFF_DELAY(2);
1435		break;
1436	}
1437	WREG32(DB_DEBUG3, db_debug3);
1438
1439	if (rdev->family != CHIP_RV770) {
1440		db_debug4 = RREG32(DB_DEBUG4);
1441		db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER;
1442		WREG32(DB_DEBUG4, db_debug4);
1443	}
1444
1445	WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.rv770.sx_max_export_size / 4) - 1) |
1446					POSITION_BUFFER_SIZE((rdev->config.rv770.sx_max_export_pos_size / 4) - 1) |
1447					SMX_BUFFER_SIZE((rdev->config.rv770.sx_max_export_smx_size / 4) - 1)));
1448
1449	WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.rv770.sc_prim_fifo_size) |
1450				 SC_HIZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_hiz_tile_fifo_size) |
1451				 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_earlyz_tile_fifo_fize)));
1452
1453	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1454
1455	WREG32(VGT_NUM_INSTANCES, 1);
1456
1457	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
1458
1459	WREG32(CP_PERFMON_CNTL, 0);
1460
1461	sq_ms_fifo_sizes = (CACHE_FIFO_SIZE(16 * rdev->config.rv770.sq_num_cf_insts) |
1462			    DONE_FIFO_HIWATER(0xe0) |
1463			    ALU_UPDATE_FIFO_HIWATER(0x8));
1464	switch (rdev->family) {
1465	case CHIP_RV770:
1466	case CHIP_RV730:
1467	case CHIP_RV710:
1468		sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
1469		break;
1470	case CHIP_RV740:
1471	default:
1472		sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4);
1473		break;
1474	}
1475	WREG32(SQ_MS_FIFO_SIZES, sq_ms_fifo_sizes);
1476
1477	/* SQ_CONFIG, SQ_GPR_RESOURCE_MGMT, SQ_THREAD_RESOURCE_MGMT, SQ_STACK_RESOURCE_MGMT
1478	 * should be adjusted as needed by the 2D/3D drivers.  This just sets default values
1479	 */
1480	sq_config = RREG32(SQ_CONFIG);
1481	sq_config &= ~(PS_PRIO(3) |
1482		       VS_PRIO(3) |
1483		       GS_PRIO(3) |
1484		       ES_PRIO(3));
1485	sq_config |= (DX9_CONSTS |
1486		      VC_ENABLE |
1487		      EXPORT_SRC_C |
1488		      PS_PRIO(0) |
1489		      VS_PRIO(1) |
1490		      GS_PRIO(2) |
1491		      ES_PRIO(3));
1492	if (rdev->family == CHIP_RV710)
1493		/* no vertex cache */
1494		sq_config &= ~VC_ENABLE;
1495
1496	WREG32(SQ_CONFIG, sq_config);
1497
1498	WREG32(SQ_GPR_RESOURCE_MGMT_1,  (NUM_PS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1499					 NUM_VS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1500					 NUM_CLAUSE_TEMP_GPRS(((rdev->config.rv770.max_gprs * 24)/64)/2)));
1501
1502	WREG32(SQ_GPR_RESOURCE_MGMT_2,  (NUM_GS_GPRS((rdev->config.rv770.max_gprs * 7)/64) |
1503					 NUM_ES_GPRS((rdev->config.rv770.max_gprs * 7)/64)));
1504
1505	sq_thread_resource_mgmt = (NUM_PS_THREADS((rdev->config.rv770.max_threads * 4)/8) |
1506				   NUM_VS_THREADS((rdev->config.rv770.max_threads * 2)/8) |
1507				   NUM_ES_THREADS((rdev->config.rv770.max_threads * 1)/8));
1508	if (((rdev->config.rv770.max_threads * 1) / 8) > rdev->config.rv770.max_gs_threads)
1509		sq_thread_resource_mgmt |= NUM_GS_THREADS(rdev->config.rv770.max_gs_threads);
1510	else
1511		sq_thread_resource_mgmt |= NUM_GS_THREADS((rdev->config.rv770.max_gs_threads * 1)/8);
1512	WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt);
1513
1514	WREG32(SQ_STACK_RESOURCE_MGMT_1, (NUM_PS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1515						     NUM_VS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1516
1517	WREG32(SQ_STACK_RESOURCE_MGMT_2, (NUM_GS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1518						     NUM_ES_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1519
1520	sq_dyn_gpr_size_simd_ab_0 = (SIMDA_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1521				     SIMDA_RING1((rdev->config.rv770.max_gprs * 38)/64) |
1522				     SIMDB_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1523				     SIMDB_RING1((rdev->config.rv770.max_gprs * 38)/64));
1524
1525	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_0, sq_dyn_gpr_size_simd_ab_0);
1526	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_1, sq_dyn_gpr_size_simd_ab_0);
1527	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_2, sq_dyn_gpr_size_simd_ab_0);
1528	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_3, sq_dyn_gpr_size_simd_ab_0);
1529	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_4, sq_dyn_gpr_size_simd_ab_0);
1530	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_5, sq_dyn_gpr_size_simd_ab_0);
1531	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_6, sq_dyn_gpr_size_simd_ab_0);
1532	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_7, sq_dyn_gpr_size_simd_ab_0);
1533
1534	WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1535					  FORCE_EOV_MAX_REZ_CNT(255)));
1536
1537	if (rdev->family == CHIP_RV710)
1538		WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(TC_ONLY) |
1539						AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1540	else
1541		WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(VC_AND_TC) |
1542						AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1543
1544	switch (rdev->family) {
1545	case CHIP_RV770:
1546	case CHIP_RV730:
1547	case CHIP_RV740:
1548		gs_prim_buffer_depth = 384;
1549		break;
1550	case CHIP_RV710:
1551		gs_prim_buffer_depth = 128;
1552		break;
1553	default:
1554		break;
1555	}
1556
1557	num_gs_verts_per_thread = rdev->config.rv770.max_pipes * 16;
1558	vgt_gs_per_es = gs_prim_buffer_depth + num_gs_verts_per_thread;
1559	/* Max value for this is 256 */
1560	if (vgt_gs_per_es > 256)
1561		vgt_gs_per_es = 256;
1562
1563	WREG32(VGT_ES_PER_GS, 128);
1564	WREG32(VGT_GS_PER_ES, vgt_gs_per_es);
1565	WREG32(VGT_GS_PER_VS, 2);
1566
1567	/* more default values. 2D/3D driver should adjust as needed */
1568	WREG32(VGT_GS_VERTEX_REUSE, 16);
1569	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1570	WREG32(VGT_STRMOUT_EN, 0);
1571	WREG32(SX_MISC, 0);
1572	WREG32(PA_SC_MODE_CNTL, 0);
1573	WREG32(PA_SC_EDGERULE, 0xaaaaaaaa);
1574	WREG32(PA_SC_AA_CONFIG, 0);
1575	WREG32(PA_SC_CLIPRECT_RULE, 0xffff);
1576	WREG32(PA_SC_LINE_STIPPLE, 0);
1577	WREG32(SPI_INPUT_Z, 0);
1578	WREG32(SPI_PS_IN_CONTROL_0, NUM_INTERP(2));
1579	WREG32(CB_COLOR7_FRAG, 0);
1580
1581	/* clear render buffer base addresses */
1582	WREG32(CB_COLOR0_BASE, 0);
1583	WREG32(CB_COLOR1_BASE, 0);
1584	WREG32(CB_COLOR2_BASE, 0);
1585	WREG32(CB_COLOR3_BASE, 0);
1586	WREG32(CB_COLOR4_BASE, 0);
1587	WREG32(CB_COLOR5_BASE, 0);
1588	WREG32(CB_COLOR6_BASE, 0);
1589	WREG32(CB_COLOR7_BASE, 0);
1590
1591	WREG32(TCP_CNTL, 0);
1592
1593	hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1594	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1595
1596	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1597
1598	WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
1599					  NUM_CLIP_SEQ(3)));
1600	WREG32(VC_ENHANCE, 0);
1601}
1602
1603void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
1604{
1605	u64 size_bf, size_af;
1606
1607	if (mc->mc_vram_size > 0xE0000000) {
1608		/* leave room for at least 512M GTT */
1609		dev_warn(rdev->dev, "limiting VRAM\n");
1610		mc->real_vram_size = 0xE0000000;
1611		mc->mc_vram_size = 0xE0000000;
1612	}
1613	if (rdev->flags & RADEON_IS_AGP) {
1614		size_bf = mc->gtt_start;
1615		size_af = mc->mc_mask - mc->gtt_end;
1616		if (size_bf > size_af) {
1617			if (mc->mc_vram_size > size_bf) {
1618				dev_warn(rdev->dev, "limiting VRAM\n");
1619				mc->real_vram_size = size_bf;
1620				mc->mc_vram_size = size_bf;
1621			}
1622			mc->vram_start = mc->gtt_start - mc->mc_vram_size;
1623		} else {
1624			if (mc->mc_vram_size > size_af) {
1625				dev_warn(rdev->dev, "limiting VRAM\n");
1626				mc->real_vram_size = size_af;
1627				mc->mc_vram_size = size_af;
1628			}
1629			mc->vram_start = mc->gtt_end + 1;
1630		}
1631		mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
1632		dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",
1633				mc->mc_vram_size >> 20, mc->vram_start,
1634				mc->vram_end, mc->real_vram_size >> 20);
1635	} else {
1636		radeon_vram_location(rdev, &rdev->mc, 0);
1637		rdev->mc.gtt_base_align = 0;
1638		radeon_gtt_location(rdev, mc);
1639	}
1640}
1641
1642static int rv770_mc_init(struct radeon_device *rdev)
1643{
1644	u32 tmp;
1645	int chansize, numchan;
1646
1647	/* Get VRAM informations */
1648	rdev->mc.vram_is_ddr = true;
1649	tmp = RREG32(MC_ARB_RAMCFG);
1650	if (tmp & CHANSIZE_OVERRIDE) {
1651		chansize = 16;
1652	} else if (tmp & CHANSIZE_MASK) {
1653		chansize = 64;
1654	} else {
1655		chansize = 32;
1656	}
1657	tmp = RREG32(MC_SHARED_CHMAP);
1658	switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
1659	case 0:
1660	default:
1661		numchan = 1;
1662		break;
1663	case 1:
1664		numchan = 2;
1665		break;
1666	case 2:
1667		numchan = 4;
1668		break;
1669	case 3:
1670		numchan = 8;
1671		break;
1672	}
1673	rdev->mc.vram_width = numchan * chansize;
1674	/* Could aper size report 0 ? */
1675	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
1676	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
1677	/* Setup GPU memory space */
1678	rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
1679	rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
1680	rdev->mc.visible_vram_size = rdev->mc.aper_size;
1681	r700_vram_gtt_location(rdev, &rdev->mc);
1682	radeon_update_bandwidth_info(rdev);
1683
1684	return 0;
1685}
1686
1687static void rv770_uvd_init(struct radeon_device *rdev)
1688{
1689	int r;
1690
1691	if (!rdev->has_uvd)
1692		return;
1693
1694	r = radeon_uvd_init(rdev);
1695	if (r) {
1696		dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
1697		/*
1698		 * At this point rdev->uvd.vcpu_bo is NULL which trickles down
1699		 * to early fails uvd_v2_2_resume() and thus nothing happens
1700		 * there. So it is pointless to try to go through that code
1701		 * hence why we disable uvd here.
1702		 */
1703		rdev->has_uvd = false;
1704		return;
1705	}
1706	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
1707	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
1708}
1709
1710static void rv770_uvd_start(struct radeon_device *rdev)
1711{
1712	int r;
1713
1714	if (!rdev->has_uvd)
1715		return;
1716
1717	r = uvd_v2_2_resume(rdev);
1718	if (r) {
1719		dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
1720		goto error;
1721	}
1722	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
1723	if (r) {
1724		dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
1725		goto error;
1726	}
1727	return;
1728
1729error:
1730	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
1731}
1732
1733static void rv770_uvd_resume(struct radeon_device *rdev)
1734{
1735	struct radeon_ring *ring;
1736	int r;
1737
1738	if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
1739		return;
1740
1741	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
1742	r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0));
1743	if (r) {
1744		dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
1745		return;
1746	}
1747	r = uvd_v1_0_init(rdev);
1748	if (r) {
1749		dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
1750		return;
1751	}
1752}
1753
1754static int rv770_startup(struct radeon_device *rdev)
1755{
1756	struct radeon_ring *ring;
1757	int r;
1758
1759	/* enable pcie gen2 link */
1760	rv770_pcie_gen2_enable(rdev);
1761
1762	/* scratch needs to be initialized before MC */
1763	r = r600_vram_scratch_init(rdev);
1764	if (r)
1765		return r;
1766
1767	rv770_mc_program(rdev);
1768
1769	if (rdev->flags & RADEON_IS_AGP) {
1770		rv770_agp_enable(rdev);
1771	} else {
1772		r = rv770_pcie_gart_enable(rdev);
1773		if (r)
1774			return r;
1775	}
1776
1777	rv770_gpu_init(rdev);
1778
1779	/* allocate wb buffer */
1780	r = radeon_wb_init(rdev);
1781	if (r)
1782		return r;
1783
1784	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
1785	if (r) {
1786		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1787		return r;
1788	}
1789
1790	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
1791	if (r) {
1792		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
1793		return r;
1794	}
1795
1796	rv770_uvd_start(rdev);
 
 
 
 
 
 
 
 
 
1797
1798	/* Enable IRQ */
1799	if (!rdev->irq.installed) {
1800		r = radeon_irq_kms_init(rdev);
1801		if (r)
1802			return r;
1803	}
1804
1805	r = r600_irq_init(rdev);
1806	if (r) {
1807		DRM_ERROR("radeon: IH init failed (%d).\n", r);
1808		radeon_irq_kms_fini(rdev);
1809		return r;
1810	}
1811	r600_irq_set(rdev);
1812
1813	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1814	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
1815			     RADEON_CP_PACKET2);
1816	if (r)
1817		return r;
1818
1819	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
1820	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
1821			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
1822	if (r)
1823		return r;
1824
1825	r = rv770_cp_load_microcode(rdev);
1826	if (r)
1827		return r;
1828	r = r600_cp_resume(rdev);
1829	if (r)
1830		return r;
1831
1832	r = r600_dma_resume(rdev);
1833	if (r)
1834		return r;
1835
1836	rv770_uvd_resume(rdev);
 
 
 
 
 
 
 
 
 
1837
1838	r = radeon_ib_pool_init(rdev);
1839	if (r) {
1840		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
1841		return r;
1842	}
1843
1844	r = radeon_audio_init(rdev);
1845	if (r) {
1846		DRM_ERROR("radeon: audio init failed\n");
1847		return r;
1848	}
1849
1850	return 0;
1851}
1852
1853int rv770_resume(struct radeon_device *rdev)
1854{
1855	int r;
1856
1857	/* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
1858	 * posting will perform necessary task to bring back GPU into good
1859	 * shape.
1860	 */
1861	/* post card */
1862	atom_asic_init(rdev->mode_info.atom_context);
1863
1864	/* init golden registers */
1865	rv770_init_golden_registers(rdev);
1866
1867	if (rdev->pm.pm_method == PM_METHOD_DPM)
1868		radeon_pm_resume(rdev);
1869
1870	rdev->accel_working = true;
1871	r = rv770_startup(rdev);
1872	if (r) {
1873		DRM_ERROR("r600 startup failed on resume\n");
1874		rdev->accel_working = false;
1875		return r;
1876	}
1877
1878	return r;
1879
1880}
1881
1882int rv770_suspend(struct radeon_device *rdev)
1883{
1884	radeon_pm_suspend(rdev);
1885	radeon_audio_fini(rdev);
1886	if (rdev->has_uvd) {
1887		radeon_uvd_suspend(rdev);
1888		uvd_v1_0_fini(rdev);
1889	}
1890	r700_cp_stop(rdev);
1891	r600_dma_stop(rdev);
1892	r600_irq_suspend(rdev);
1893	radeon_wb_disable(rdev);
1894	rv770_pcie_gart_disable(rdev);
1895
1896	return 0;
1897}
1898
1899/* Plan is to move initialization in that function and use
1900 * helper function so that radeon_device_init pretty much
1901 * do nothing more than calling asic specific function. This
1902 * should also allow to remove a bunch of callback function
1903 * like vram_info.
1904 */
1905int rv770_init(struct radeon_device *rdev)
1906{
1907	int r;
1908
1909	/* Read BIOS */
1910	if (!radeon_get_bios(rdev)) {
1911		if (ASIC_IS_AVIVO(rdev))
1912			return -EINVAL;
1913	}
1914	/* Must be an ATOMBIOS */
1915	if (!rdev->is_atom_bios) {
1916		dev_err(rdev->dev, "Expecting atombios for R600 GPU\n");
1917		return -EINVAL;
1918	}
1919	r = radeon_atombios_init(rdev);
1920	if (r)
1921		return r;
1922	/* Post card if necessary */
1923	if (!radeon_card_posted(rdev)) {
1924		if (!rdev->bios) {
1925			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
1926			return -EINVAL;
1927		}
1928		DRM_INFO("GPU not posted. posting now...\n");
1929		atom_asic_init(rdev->mode_info.atom_context);
1930	}
1931	/* init golden registers */
1932	rv770_init_golden_registers(rdev);
1933	/* Initialize scratch registers */
1934	r600_scratch_init(rdev);
1935	/* Initialize surface registers */
1936	radeon_surface_init(rdev);
1937	/* Initialize clocks */
1938	radeon_get_clock_info(rdev_to_drm(rdev));
1939	/* Fence driver */
1940	radeon_fence_driver_init(rdev);
 
 
1941	/* initialize AGP */
1942	if (rdev->flags & RADEON_IS_AGP) {
1943		r = radeon_agp_init(rdev);
1944		if (r)
1945			radeon_agp_disable(rdev);
1946	}
1947	r = rv770_mc_init(rdev);
1948	if (r)
1949		return r;
1950	/* Memory manager */
1951	r = radeon_bo_init(rdev);
1952	if (r)
1953		return r;
1954
1955	if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
1956		r = r600_init_microcode(rdev);
1957		if (r) {
1958			DRM_ERROR("Failed to load firmware!\n");
1959			return r;
1960		}
1961	}
1962
1963	/* Initialize power management */
1964	radeon_pm_init(rdev);
1965
1966	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
1967	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
1968
1969	rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
1970	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
1971
1972	rv770_uvd_init(rdev);
 
 
 
 
 
1973
1974	rdev->ih.ring_obj = NULL;
1975	r600_ih_ring_init(rdev, 64 * 1024);
1976
1977	r = r600_pcie_gart_init(rdev);
1978	if (r)
1979		return r;
1980
1981	rdev->accel_working = true;
1982	r = rv770_startup(rdev);
1983	if (r) {
1984		dev_err(rdev->dev, "disabling GPU acceleration\n");
1985		r700_cp_fini(rdev);
1986		r600_dma_fini(rdev);
1987		r600_irq_fini(rdev);
1988		radeon_wb_fini(rdev);
1989		radeon_ib_pool_fini(rdev);
1990		radeon_irq_kms_fini(rdev);
1991		rv770_pcie_gart_fini(rdev);
1992		rdev->accel_working = false;
1993	}
1994
1995	return 0;
1996}
1997
1998void rv770_fini(struct radeon_device *rdev)
1999{
2000	radeon_pm_fini(rdev);
2001	r700_cp_fini(rdev);
2002	r600_dma_fini(rdev);
2003	r600_irq_fini(rdev);
2004	radeon_wb_fini(rdev);
2005	radeon_ib_pool_fini(rdev);
2006	radeon_irq_kms_fini(rdev);
2007	uvd_v1_0_fini(rdev);
2008	radeon_uvd_fini(rdev);
2009	rv770_pcie_gart_fini(rdev);
2010	r600_vram_scratch_fini(rdev);
2011	radeon_gem_fini(rdev);
2012	radeon_fence_driver_fini(rdev);
2013	radeon_agp_fini(rdev);
2014	radeon_bo_fini(rdev);
2015	radeon_atombios_fini(rdev);
2016	kfree(rdev->bios);
2017	rdev->bios = NULL;
2018}
2019
2020static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
2021{
2022	u32 link_width_cntl, lanes, speed_cntl, tmp;
2023	u16 link_cntl2;
2024
2025	if (radeon_pcie_gen2 == 0)
2026		return;
2027
2028	if (rdev->flags & RADEON_IS_IGP)
2029		return;
2030
2031	if (!(rdev->flags & RADEON_IS_PCIE))
2032		return;
2033
2034	/* x2 cards have a special sequence */
2035	if (ASIC_IS_X2(rdev))
2036		return;
2037
2038	if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) &&
2039		(rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))
2040		return;
2041
2042	DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
2043
2044	/* advertise upconfig capability */
2045	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2046	link_width_cntl &= ~LC_UPCONFIGURE_DIS;
2047	WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2048	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2049	if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) {
2050		lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT;
2051		link_width_cntl &= ~(LC_LINK_WIDTH_MASK |
2052				     LC_RECONFIG_ARC_MISSING_ESCAPE);
2053		link_width_cntl |= lanes | LC_RECONFIG_NOW |
2054			LC_RENEGOTIATE_EN | LC_UPCONFIGURE_SUPPORT;
2055		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2056	} else {
2057		link_width_cntl |= LC_UPCONFIGURE_DIS;
2058		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2059	}
2060
2061	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2062	if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
2063	    (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
2064
2065		tmp = RREG32(0x541c);
2066		WREG32(0x541c, tmp | 0x8);
2067		WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN);
2068		link_cntl2 = RREG16(0x4088);
2069		link_cntl2 &= ~TARGET_LINK_SPEED_MASK;
2070		link_cntl2 |= 0x2;
2071		WREG16(0x4088, link_cntl2);
2072		WREG32(MM_CFGREGS_CNTL, 0);
2073
2074		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2075		speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
2076		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2077
2078		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2079		speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT;
2080		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2081
2082		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2083		speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
2084		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2085
2086		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2087		speed_cntl |= LC_GEN2_EN_STRAP;
2088		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2089
2090	} else {
2091		link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2092		/* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
2093		if (1)
2094			link_width_cntl |= LC_UPCONFIGURE_DIS;
2095		else
2096			link_width_cntl &= ~LC_UPCONFIGURE_DIS;
2097		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2098	}
2099}
v3.15
   1/*
   2 * Copyright 2008 Advanced Micro Devices, Inc.
   3 * Copyright 2008 Red Hat Inc.
   4 * Copyright 2009 Jerome Glisse.
   5 *
   6 * Permission is hereby granted, free of charge, to any person obtaining a
   7 * copy of this software and associated documentation files (the "Software"),
   8 * to deal in the Software without restriction, including without limitation
   9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10 * and/or sell copies of the Software, and to permit persons to whom the
  11 * Software is furnished to do so, subject to the following conditions:
  12 *
  13 * The above copyright notice and this permission notice shall be included in
  14 * all copies or substantial portions of the Software.
  15 *
  16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  22 * OTHER DEALINGS IN THE SOFTWARE.
  23 *
  24 * Authors: Dave Airlie
  25 *          Alex Deucher
  26 *          Jerome Glisse
  27 */
 
  28#include <linux/firmware.h>
  29#include <linux/platform_device.h>
  30#include <linux/slab.h>
  31#include <drm/drmP.h>
 
 
 
 
 
 
 
  32#include "radeon.h"
  33#include "radeon_asic.h"
  34#include <drm/radeon_drm.h>
  35#include "rv770d.h"
  36#include "atom.h"
  37#include "avivod.h"
  38
  39#define R700_PFP_UCODE_SIZE 848
  40#define R700_PM4_UCODE_SIZE 1360
  41
  42static void rv770_gpu_init(struct radeon_device *rdev);
  43void rv770_fini(struct radeon_device *rdev);
  44static void rv770_pcie_gen2_enable(struct radeon_device *rdev);
  45int evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk);
  46
  47int rv770_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
  48{
  49	unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
  50	int r;
  51
  52	/* RV740 uses evergreen uvd clk programming */
  53	if (rdev->family == CHIP_RV740)
  54		return evergreen_set_uvd_clocks(rdev, vclk, dclk);
  55
  56	/* bypass vclk and dclk with bclk */
  57	WREG32_P(CG_UPLL_FUNC_CNTL_2,
  58		 VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
  59		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
  60
  61	if (!vclk || !dclk) {
  62		/* keep the Bypass mode, put PLL to sleep */
  63		WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
  64		return 0;
  65	}
  66
  67	r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 50000, 160000,
  68					  43663, 0x03FFFFFE, 1, 30, ~0,
  69					  &fb_div, &vclk_div, &dclk_div);
  70	if (r)
  71		return r;
  72
  73	fb_div |= 1;
  74	vclk_div -= 1;
  75	dclk_div -= 1;
  76
  77	/* set UPLL_FB_DIV to 0x50000 */
  78	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(0x50000), ~UPLL_FB_DIV_MASK);
  79
  80	/* deassert UPLL_RESET and UPLL_SLEEP */
  81	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~(UPLL_RESET_MASK | UPLL_SLEEP_MASK));
  82
  83	/* assert BYPASS EN and FB_DIV[0] <- ??? why? */
  84	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
  85	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(1), ~UPLL_FB_DIV(1));
  86
  87	r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
  88	if (r)
  89		return r;
  90
  91	/* assert PLL_RESET */
  92	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
  93
  94	/* set the required FB_DIV, REF_DIV, Post divder values */
  95	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_REF_DIV(1), ~UPLL_REF_DIV_MASK);
  96	WREG32_P(CG_UPLL_FUNC_CNTL_2,
  97		 UPLL_SW_HILEN(vclk_div >> 1) |
  98		 UPLL_SW_LOLEN((vclk_div >> 1) + (vclk_div & 1)) |
  99		 UPLL_SW_HILEN2(dclk_div >> 1) |
 100		 UPLL_SW_LOLEN2((dclk_div >> 1) + (dclk_div & 1)),
 101		 ~UPLL_SW_MASK);
 102
 103	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div),
 104		 ~UPLL_FB_DIV_MASK);
 105
 106	/* give the PLL some time to settle */
 107	mdelay(15);
 108
 109	/* deassert PLL_RESET */
 110	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
 111
 112	mdelay(15);
 113
 114	/* deassert BYPASS EN and FB_DIV[0] <- ??? why? */
 115	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
 116	WREG32_P(CG_UPLL_FUNC_CNTL_3, 0, ~UPLL_FB_DIV(1));
 117
 118	r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
 119	if (r)
 120		return r;
 121
 122	/* switch VCLK and DCLK selection */
 123	WREG32_P(CG_UPLL_FUNC_CNTL_2,
 124		 VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
 125		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
 126
 127	mdelay(100);
 128
 129	return 0;
 130}
 131
 132static const u32 r7xx_golden_registers[] =
 133{
 134	0x8d00, 0xffffffff, 0x0e0e0074,
 135	0x8d04, 0xffffffff, 0x013a2b34,
 136	0x9508, 0xffffffff, 0x00000002,
 137	0x8b20, 0xffffffff, 0,
 138	0x88c4, 0xffffffff, 0x000000c2,
 139	0x28350, 0xffffffff, 0,
 140	0x9058, 0xffffffff, 0x0fffc40f,
 141	0x240c, 0xffffffff, 0x00000380,
 142	0x733c, 0xffffffff, 0x00000002,
 143	0x2650, 0x00040000, 0,
 144	0x20bc, 0x00040000, 0,
 145	0x7300, 0xffffffff, 0x001000f0
 146};
 147
 148static const u32 r7xx_golden_dyn_gpr_registers[] =
 149{
 150	0x8db0, 0xffffffff, 0x98989898,
 151	0x8db4, 0xffffffff, 0x98989898,
 152	0x8db8, 0xffffffff, 0x98989898,
 153	0x8dbc, 0xffffffff, 0x98989898,
 154	0x8dc0, 0xffffffff, 0x98989898,
 155	0x8dc4, 0xffffffff, 0x98989898,
 156	0x8dc8, 0xffffffff, 0x98989898,
 157	0x8dcc, 0xffffffff, 0x98989898,
 158	0x88c4, 0xffffffff, 0x00000082
 159};
 160
 161static const u32 rv770_golden_registers[] =
 162{
 163	0x562c, 0xffffffff, 0,
 164	0x3f90, 0xffffffff, 0,
 165	0x9148, 0xffffffff, 0,
 166	0x3f94, 0xffffffff, 0,
 167	0x914c, 0xffffffff, 0,
 168	0x9698, 0x18000000, 0x18000000
 169};
 170
 171static const u32 rv770ce_golden_registers[] =
 172{
 173	0x562c, 0xffffffff, 0,
 174	0x3f90, 0xffffffff, 0x00cc0000,
 175	0x9148, 0xffffffff, 0x00cc0000,
 176	0x3f94, 0xffffffff, 0x00cc0000,
 177	0x914c, 0xffffffff, 0x00cc0000,
 178	0x9b7c, 0xffffffff, 0x00fa0000,
 179	0x3f8c, 0xffffffff, 0x00fa0000,
 180	0x9698, 0x18000000, 0x18000000
 181};
 182
 183static const u32 rv770_mgcg_init[] =
 184{
 185	0x8bcc, 0xffffffff, 0x130300f9,
 186	0x5448, 0xffffffff, 0x100,
 187	0x55e4, 0xffffffff, 0x100,
 188	0x160c, 0xffffffff, 0x100,
 189	0x5644, 0xffffffff, 0x100,
 190	0xc164, 0xffffffff, 0x100,
 191	0x8a18, 0xffffffff, 0x100,
 192	0x897c, 0xffffffff, 0x8000100,
 193	0x8b28, 0xffffffff, 0x3c000100,
 194	0x9144, 0xffffffff, 0x100,
 195	0x9a1c, 0xffffffff, 0x10000,
 196	0x9a50, 0xffffffff, 0x100,
 197	0x9a1c, 0xffffffff, 0x10001,
 198	0x9a50, 0xffffffff, 0x100,
 199	0x9a1c, 0xffffffff, 0x10002,
 200	0x9a50, 0xffffffff, 0x100,
 201	0x9a1c, 0xffffffff, 0x10003,
 202	0x9a50, 0xffffffff, 0x100,
 203	0x9a1c, 0xffffffff, 0x0,
 204	0x9870, 0xffffffff, 0x100,
 205	0x8d58, 0xffffffff, 0x100,
 206	0x9500, 0xffffffff, 0x0,
 207	0x9510, 0xffffffff, 0x100,
 208	0x9500, 0xffffffff, 0x1,
 209	0x9510, 0xffffffff, 0x100,
 210	0x9500, 0xffffffff, 0x2,
 211	0x9510, 0xffffffff, 0x100,
 212	0x9500, 0xffffffff, 0x3,
 213	0x9510, 0xffffffff, 0x100,
 214	0x9500, 0xffffffff, 0x4,
 215	0x9510, 0xffffffff, 0x100,
 216	0x9500, 0xffffffff, 0x5,
 217	0x9510, 0xffffffff, 0x100,
 218	0x9500, 0xffffffff, 0x6,
 219	0x9510, 0xffffffff, 0x100,
 220	0x9500, 0xffffffff, 0x7,
 221	0x9510, 0xffffffff, 0x100,
 222	0x9500, 0xffffffff, 0x8,
 223	0x9510, 0xffffffff, 0x100,
 224	0x9500, 0xffffffff, 0x9,
 225	0x9510, 0xffffffff, 0x100,
 226	0x9500, 0xffffffff, 0x8000,
 227	0x9490, 0xffffffff, 0x0,
 228	0x949c, 0xffffffff, 0x100,
 229	0x9490, 0xffffffff, 0x1,
 230	0x949c, 0xffffffff, 0x100,
 231	0x9490, 0xffffffff, 0x2,
 232	0x949c, 0xffffffff, 0x100,
 233	0x9490, 0xffffffff, 0x3,
 234	0x949c, 0xffffffff, 0x100,
 235	0x9490, 0xffffffff, 0x4,
 236	0x949c, 0xffffffff, 0x100,
 237	0x9490, 0xffffffff, 0x5,
 238	0x949c, 0xffffffff, 0x100,
 239	0x9490, 0xffffffff, 0x6,
 240	0x949c, 0xffffffff, 0x100,
 241	0x9490, 0xffffffff, 0x7,
 242	0x949c, 0xffffffff, 0x100,
 243	0x9490, 0xffffffff, 0x8,
 244	0x949c, 0xffffffff, 0x100,
 245	0x9490, 0xffffffff, 0x9,
 246	0x949c, 0xffffffff, 0x100,
 247	0x9490, 0xffffffff, 0x8000,
 248	0x9604, 0xffffffff, 0x0,
 249	0x9654, 0xffffffff, 0x100,
 250	0x9604, 0xffffffff, 0x1,
 251	0x9654, 0xffffffff, 0x100,
 252	0x9604, 0xffffffff, 0x2,
 253	0x9654, 0xffffffff, 0x100,
 254	0x9604, 0xffffffff, 0x3,
 255	0x9654, 0xffffffff, 0x100,
 256	0x9604, 0xffffffff, 0x4,
 257	0x9654, 0xffffffff, 0x100,
 258	0x9604, 0xffffffff, 0x5,
 259	0x9654, 0xffffffff, 0x100,
 260	0x9604, 0xffffffff, 0x6,
 261	0x9654, 0xffffffff, 0x100,
 262	0x9604, 0xffffffff, 0x7,
 263	0x9654, 0xffffffff, 0x100,
 264	0x9604, 0xffffffff, 0x8,
 265	0x9654, 0xffffffff, 0x100,
 266	0x9604, 0xffffffff, 0x9,
 267	0x9654, 0xffffffff, 0x100,
 268	0x9604, 0xffffffff, 0x80000000,
 269	0x9030, 0xffffffff, 0x100,
 270	0x9034, 0xffffffff, 0x100,
 271	0x9038, 0xffffffff, 0x100,
 272	0x903c, 0xffffffff, 0x100,
 273	0x9040, 0xffffffff, 0x100,
 274	0xa200, 0xffffffff, 0x100,
 275	0xa204, 0xffffffff, 0x100,
 276	0xa208, 0xffffffff, 0x100,
 277	0xa20c, 0xffffffff, 0x100,
 278	0x971c, 0xffffffff, 0x100,
 279	0x915c, 0xffffffff, 0x00020001,
 280	0x9160, 0xffffffff, 0x00040003,
 281	0x916c, 0xffffffff, 0x00060005,
 282	0x9170, 0xffffffff, 0x00080007,
 283	0x9174, 0xffffffff, 0x000a0009,
 284	0x9178, 0xffffffff, 0x000c000b,
 285	0x917c, 0xffffffff, 0x000e000d,
 286	0x9180, 0xffffffff, 0x0010000f,
 287	0x918c, 0xffffffff, 0x00120011,
 288	0x9190, 0xffffffff, 0x00140013,
 289	0x9194, 0xffffffff, 0x00020001,
 290	0x9198, 0xffffffff, 0x00040003,
 291	0x919c, 0xffffffff, 0x00060005,
 292	0x91a8, 0xffffffff, 0x00080007,
 293	0x91ac, 0xffffffff, 0x000a0009,
 294	0x91b0, 0xffffffff, 0x000c000b,
 295	0x91b4, 0xffffffff, 0x000e000d,
 296	0x91b8, 0xffffffff, 0x0010000f,
 297	0x91c4, 0xffffffff, 0x00120011,
 298	0x91c8, 0xffffffff, 0x00140013,
 299	0x91cc, 0xffffffff, 0x00020001,
 300	0x91d0, 0xffffffff, 0x00040003,
 301	0x91d4, 0xffffffff, 0x00060005,
 302	0x91e0, 0xffffffff, 0x00080007,
 303	0x91e4, 0xffffffff, 0x000a0009,
 304	0x91e8, 0xffffffff, 0x000c000b,
 305	0x91ec, 0xffffffff, 0x00020001,
 306	0x91f0, 0xffffffff, 0x00040003,
 307	0x91f4, 0xffffffff, 0x00060005,
 308	0x9200, 0xffffffff, 0x00080007,
 309	0x9204, 0xffffffff, 0x000a0009,
 310	0x9208, 0xffffffff, 0x000c000b,
 311	0x920c, 0xffffffff, 0x000e000d,
 312	0x9210, 0xffffffff, 0x0010000f,
 313	0x921c, 0xffffffff, 0x00120011,
 314	0x9220, 0xffffffff, 0x00140013,
 315	0x9224, 0xffffffff, 0x00020001,
 316	0x9228, 0xffffffff, 0x00040003,
 317	0x922c, 0xffffffff, 0x00060005,
 318	0x9238, 0xffffffff, 0x00080007,
 319	0x923c, 0xffffffff, 0x000a0009,
 320	0x9240, 0xffffffff, 0x000c000b,
 321	0x9244, 0xffffffff, 0x000e000d,
 322	0x9248, 0xffffffff, 0x0010000f,
 323	0x9254, 0xffffffff, 0x00120011,
 324	0x9258, 0xffffffff, 0x00140013,
 325	0x925c, 0xffffffff, 0x00020001,
 326	0x9260, 0xffffffff, 0x00040003,
 327	0x9264, 0xffffffff, 0x00060005,
 328	0x9270, 0xffffffff, 0x00080007,
 329	0x9274, 0xffffffff, 0x000a0009,
 330	0x9278, 0xffffffff, 0x000c000b,
 331	0x927c, 0xffffffff, 0x000e000d,
 332	0x9280, 0xffffffff, 0x0010000f,
 333	0x928c, 0xffffffff, 0x00120011,
 334	0x9290, 0xffffffff, 0x00140013,
 335	0x9294, 0xffffffff, 0x00020001,
 336	0x929c, 0xffffffff, 0x00040003,
 337	0x92a0, 0xffffffff, 0x00060005,
 338	0x92a4, 0xffffffff, 0x00080007
 339};
 340
 341static const u32 rv710_golden_registers[] =
 342{
 343	0x3f90, 0x00ff0000, 0x00fc0000,
 344	0x9148, 0x00ff0000, 0x00fc0000,
 345	0x3f94, 0x00ff0000, 0x00fc0000,
 346	0x914c, 0x00ff0000, 0x00fc0000,
 347	0xb4c, 0x00000020, 0x00000020,
 348	0xa180, 0xffffffff, 0x00003f3f
 349};
 350
 351static const u32 rv710_mgcg_init[] =
 352{
 353	0x8bcc, 0xffffffff, 0x13030040,
 354	0x5448, 0xffffffff, 0x100,
 355	0x55e4, 0xffffffff, 0x100,
 356	0x160c, 0xffffffff, 0x100,
 357	0x5644, 0xffffffff, 0x100,
 358	0xc164, 0xffffffff, 0x100,
 359	0x8a18, 0xffffffff, 0x100,
 360	0x897c, 0xffffffff, 0x8000100,
 361	0x8b28, 0xffffffff, 0x3c000100,
 362	0x9144, 0xffffffff, 0x100,
 363	0x9a1c, 0xffffffff, 0x10000,
 364	0x9a50, 0xffffffff, 0x100,
 365	0x9a1c, 0xffffffff, 0x0,
 366	0x9870, 0xffffffff, 0x100,
 367	0x8d58, 0xffffffff, 0x100,
 368	0x9500, 0xffffffff, 0x0,
 369	0x9510, 0xffffffff, 0x100,
 370	0x9500, 0xffffffff, 0x1,
 371	0x9510, 0xffffffff, 0x100,
 372	0x9500, 0xffffffff, 0x8000,
 373	0x9490, 0xffffffff, 0x0,
 374	0x949c, 0xffffffff, 0x100,
 375	0x9490, 0xffffffff, 0x1,
 376	0x949c, 0xffffffff, 0x100,
 377	0x9490, 0xffffffff, 0x8000,
 378	0x9604, 0xffffffff, 0x0,
 379	0x9654, 0xffffffff, 0x100,
 380	0x9604, 0xffffffff, 0x1,
 381	0x9654, 0xffffffff, 0x100,
 382	0x9604, 0xffffffff, 0x80000000,
 383	0x9030, 0xffffffff, 0x100,
 384	0x9034, 0xffffffff, 0x100,
 385	0x9038, 0xffffffff, 0x100,
 386	0x903c, 0xffffffff, 0x100,
 387	0x9040, 0xffffffff, 0x100,
 388	0xa200, 0xffffffff, 0x100,
 389	0xa204, 0xffffffff, 0x100,
 390	0xa208, 0xffffffff, 0x100,
 391	0xa20c, 0xffffffff, 0x100,
 392	0x971c, 0xffffffff, 0x100,
 393	0x915c, 0xffffffff, 0x00020001,
 394	0x9174, 0xffffffff, 0x00000003,
 395	0x9178, 0xffffffff, 0x00050001,
 396	0x917c, 0xffffffff, 0x00030002,
 397	0x918c, 0xffffffff, 0x00000004,
 398	0x9190, 0xffffffff, 0x00070006,
 399	0x9194, 0xffffffff, 0x00050001,
 400	0x9198, 0xffffffff, 0x00030002,
 401	0x91a8, 0xffffffff, 0x00000004,
 402	0x91ac, 0xffffffff, 0x00070006,
 403	0x91e8, 0xffffffff, 0x00000001,
 404	0x9294, 0xffffffff, 0x00000001,
 405	0x929c, 0xffffffff, 0x00000002,
 406	0x92a0, 0xffffffff, 0x00040003,
 407	0x9150, 0xffffffff, 0x4d940000
 408};
 409
 410static const u32 rv730_golden_registers[] =
 411{
 412	0x3f90, 0x00ff0000, 0x00f00000,
 413	0x9148, 0x00ff0000, 0x00f00000,
 414	0x3f94, 0x00ff0000, 0x00f00000,
 415	0x914c, 0x00ff0000, 0x00f00000,
 416	0x900c, 0xffffffff, 0x003b033f,
 417	0xb4c, 0x00000020, 0x00000020,
 418	0xa180, 0xffffffff, 0x00003f3f
 419};
 420
 421static const u32 rv730_mgcg_init[] =
 422{
 423	0x8bcc, 0xffffffff, 0x130300f9,
 424	0x5448, 0xffffffff, 0x100,
 425	0x55e4, 0xffffffff, 0x100,
 426	0x160c, 0xffffffff, 0x100,
 427	0x5644, 0xffffffff, 0x100,
 428	0xc164, 0xffffffff, 0x100,
 429	0x8a18, 0xffffffff, 0x100,
 430	0x897c, 0xffffffff, 0x8000100,
 431	0x8b28, 0xffffffff, 0x3c000100,
 432	0x9144, 0xffffffff, 0x100,
 433	0x9a1c, 0xffffffff, 0x10000,
 434	0x9a50, 0xffffffff, 0x100,
 435	0x9a1c, 0xffffffff, 0x10001,
 436	0x9a50, 0xffffffff, 0x100,
 437	0x9a1c, 0xffffffff, 0x0,
 438	0x9870, 0xffffffff, 0x100,
 439	0x8d58, 0xffffffff, 0x100,
 440	0x9500, 0xffffffff, 0x0,
 441	0x9510, 0xffffffff, 0x100,
 442	0x9500, 0xffffffff, 0x1,
 443	0x9510, 0xffffffff, 0x100,
 444	0x9500, 0xffffffff, 0x2,
 445	0x9510, 0xffffffff, 0x100,
 446	0x9500, 0xffffffff, 0x3,
 447	0x9510, 0xffffffff, 0x100,
 448	0x9500, 0xffffffff, 0x4,
 449	0x9510, 0xffffffff, 0x100,
 450	0x9500, 0xffffffff, 0x5,
 451	0x9510, 0xffffffff, 0x100,
 452	0x9500, 0xffffffff, 0x6,
 453	0x9510, 0xffffffff, 0x100,
 454	0x9500, 0xffffffff, 0x7,
 455	0x9510, 0xffffffff, 0x100,
 456	0x9500, 0xffffffff, 0x8000,
 457	0x9490, 0xffffffff, 0x0,
 458	0x949c, 0xffffffff, 0x100,
 459	0x9490, 0xffffffff, 0x1,
 460	0x949c, 0xffffffff, 0x100,
 461	0x9490, 0xffffffff, 0x2,
 462	0x949c, 0xffffffff, 0x100,
 463	0x9490, 0xffffffff, 0x3,
 464	0x949c, 0xffffffff, 0x100,
 465	0x9490, 0xffffffff, 0x4,
 466	0x949c, 0xffffffff, 0x100,
 467	0x9490, 0xffffffff, 0x5,
 468	0x949c, 0xffffffff, 0x100,
 469	0x9490, 0xffffffff, 0x6,
 470	0x949c, 0xffffffff, 0x100,
 471	0x9490, 0xffffffff, 0x7,
 472	0x949c, 0xffffffff, 0x100,
 473	0x9490, 0xffffffff, 0x8000,
 474	0x9604, 0xffffffff, 0x0,
 475	0x9654, 0xffffffff, 0x100,
 476	0x9604, 0xffffffff, 0x1,
 477	0x9654, 0xffffffff, 0x100,
 478	0x9604, 0xffffffff, 0x2,
 479	0x9654, 0xffffffff, 0x100,
 480	0x9604, 0xffffffff, 0x3,
 481	0x9654, 0xffffffff, 0x100,
 482	0x9604, 0xffffffff, 0x4,
 483	0x9654, 0xffffffff, 0x100,
 484	0x9604, 0xffffffff, 0x5,
 485	0x9654, 0xffffffff, 0x100,
 486	0x9604, 0xffffffff, 0x6,
 487	0x9654, 0xffffffff, 0x100,
 488	0x9604, 0xffffffff, 0x7,
 489	0x9654, 0xffffffff, 0x100,
 490	0x9604, 0xffffffff, 0x80000000,
 491	0x9030, 0xffffffff, 0x100,
 492	0x9034, 0xffffffff, 0x100,
 493	0x9038, 0xffffffff, 0x100,
 494	0x903c, 0xffffffff, 0x100,
 495	0x9040, 0xffffffff, 0x100,
 496	0xa200, 0xffffffff, 0x100,
 497	0xa204, 0xffffffff, 0x100,
 498	0xa208, 0xffffffff, 0x100,
 499	0xa20c, 0xffffffff, 0x100,
 500	0x971c, 0xffffffff, 0x100,
 501	0x915c, 0xffffffff, 0x00020001,
 502	0x916c, 0xffffffff, 0x00040003,
 503	0x9170, 0xffffffff, 0x00000005,
 504	0x9178, 0xffffffff, 0x00050001,
 505	0x917c, 0xffffffff, 0x00030002,
 506	0x918c, 0xffffffff, 0x00000004,
 507	0x9190, 0xffffffff, 0x00070006,
 508	0x9194, 0xffffffff, 0x00050001,
 509	0x9198, 0xffffffff, 0x00030002,
 510	0x91a8, 0xffffffff, 0x00000004,
 511	0x91ac, 0xffffffff, 0x00070006,
 512	0x91b0, 0xffffffff, 0x00050001,
 513	0x91b4, 0xffffffff, 0x00030002,
 514	0x91c4, 0xffffffff, 0x00000004,
 515	0x91c8, 0xffffffff, 0x00070006,
 516	0x91cc, 0xffffffff, 0x00050001,
 517	0x91d0, 0xffffffff, 0x00030002,
 518	0x91e0, 0xffffffff, 0x00000004,
 519	0x91e4, 0xffffffff, 0x00070006,
 520	0x91e8, 0xffffffff, 0x00000001,
 521	0x91ec, 0xffffffff, 0x00050001,
 522	0x91f0, 0xffffffff, 0x00030002,
 523	0x9200, 0xffffffff, 0x00000004,
 524	0x9204, 0xffffffff, 0x00070006,
 525	0x9208, 0xffffffff, 0x00050001,
 526	0x920c, 0xffffffff, 0x00030002,
 527	0x921c, 0xffffffff, 0x00000004,
 528	0x9220, 0xffffffff, 0x00070006,
 529	0x9224, 0xffffffff, 0x00050001,
 530	0x9228, 0xffffffff, 0x00030002,
 531	0x9238, 0xffffffff, 0x00000004,
 532	0x923c, 0xffffffff, 0x00070006,
 533	0x9240, 0xffffffff, 0x00050001,
 534	0x9244, 0xffffffff, 0x00030002,
 535	0x9254, 0xffffffff, 0x00000004,
 536	0x9258, 0xffffffff, 0x00070006,
 537	0x9294, 0xffffffff, 0x00000001,
 538	0x929c, 0xffffffff, 0x00000002,
 539	0x92a0, 0xffffffff, 0x00040003,
 540	0x92a4, 0xffffffff, 0x00000005
 541};
 542
 543static const u32 rv740_golden_registers[] =
 544{
 545	0x88c4, 0xffffffff, 0x00000082,
 546	0x28a50, 0xfffffffc, 0x00000004,
 547	0x2650, 0x00040000, 0,
 548	0x20bc, 0x00040000, 0,
 549	0x733c, 0xffffffff, 0x00000002,
 550	0x7300, 0xffffffff, 0x001000f0,
 551	0x3f90, 0x00ff0000, 0,
 552	0x9148, 0x00ff0000, 0,
 553	0x3f94, 0x00ff0000, 0,
 554	0x914c, 0x00ff0000, 0,
 555	0x240c, 0xffffffff, 0x00000380,
 556	0x8a14, 0x00000007, 0x00000007,
 557	0x8b24, 0xffffffff, 0x00ff0fff,
 558	0x28a4c, 0xffffffff, 0x00004000,
 559	0xa180, 0xffffffff, 0x00003f3f,
 560	0x8d00, 0xffffffff, 0x0e0e003a,
 561	0x8d04, 0xffffffff, 0x013a0e2a,
 562	0x8c00, 0xffffffff, 0xe400000f,
 563	0x8db0, 0xffffffff, 0x98989898,
 564	0x8db4, 0xffffffff, 0x98989898,
 565	0x8db8, 0xffffffff, 0x98989898,
 566	0x8dbc, 0xffffffff, 0x98989898,
 567	0x8dc0, 0xffffffff, 0x98989898,
 568	0x8dc4, 0xffffffff, 0x98989898,
 569	0x8dc8, 0xffffffff, 0x98989898,
 570	0x8dcc, 0xffffffff, 0x98989898,
 571	0x9058, 0xffffffff, 0x0fffc40f,
 572	0x900c, 0xffffffff, 0x003b033f,
 573	0x28350, 0xffffffff, 0,
 574	0x8cf0, 0x1fffffff, 0x08e00420,
 575	0x9508, 0xffffffff, 0x00000002,
 576	0x88c4, 0xffffffff, 0x000000c2,
 577	0x9698, 0x18000000, 0x18000000
 578};
 579
 580static const u32 rv740_mgcg_init[] =
 581{
 582	0x8bcc, 0xffffffff, 0x13030100,
 583	0x5448, 0xffffffff, 0x100,
 584	0x55e4, 0xffffffff, 0x100,
 585	0x160c, 0xffffffff, 0x100,
 586	0x5644, 0xffffffff, 0x100,
 587	0xc164, 0xffffffff, 0x100,
 588	0x8a18, 0xffffffff, 0x100,
 589	0x897c, 0xffffffff, 0x100,
 590	0x8b28, 0xffffffff, 0x100,
 591	0x9144, 0xffffffff, 0x100,
 592	0x9a1c, 0xffffffff, 0x10000,
 593	0x9a50, 0xffffffff, 0x100,
 594	0x9a1c, 0xffffffff, 0x10001,
 595	0x9a50, 0xffffffff, 0x100,
 596	0x9a1c, 0xffffffff, 0x10002,
 597	0x9a50, 0xffffffff, 0x100,
 598	0x9a1c, 0xffffffff, 0x10003,
 599	0x9a50, 0xffffffff, 0x100,
 600	0x9a1c, 0xffffffff, 0x0,
 601	0x9870, 0xffffffff, 0x100,
 602	0x8d58, 0xffffffff, 0x100,
 603	0x9500, 0xffffffff, 0x0,
 604	0x9510, 0xffffffff, 0x100,
 605	0x9500, 0xffffffff, 0x1,
 606	0x9510, 0xffffffff, 0x100,
 607	0x9500, 0xffffffff, 0x2,
 608	0x9510, 0xffffffff, 0x100,
 609	0x9500, 0xffffffff, 0x3,
 610	0x9510, 0xffffffff, 0x100,
 611	0x9500, 0xffffffff, 0x4,
 612	0x9510, 0xffffffff, 0x100,
 613	0x9500, 0xffffffff, 0x5,
 614	0x9510, 0xffffffff, 0x100,
 615	0x9500, 0xffffffff, 0x6,
 616	0x9510, 0xffffffff, 0x100,
 617	0x9500, 0xffffffff, 0x7,
 618	0x9510, 0xffffffff, 0x100,
 619	0x9500, 0xffffffff, 0x8000,
 620	0x9490, 0xffffffff, 0x0,
 621	0x949c, 0xffffffff, 0x100,
 622	0x9490, 0xffffffff, 0x1,
 623	0x949c, 0xffffffff, 0x100,
 624	0x9490, 0xffffffff, 0x2,
 625	0x949c, 0xffffffff, 0x100,
 626	0x9490, 0xffffffff, 0x3,
 627	0x949c, 0xffffffff, 0x100,
 628	0x9490, 0xffffffff, 0x4,
 629	0x949c, 0xffffffff, 0x100,
 630	0x9490, 0xffffffff, 0x5,
 631	0x949c, 0xffffffff, 0x100,
 632	0x9490, 0xffffffff, 0x6,
 633	0x949c, 0xffffffff, 0x100,
 634	0x9490, 0xffffffff, 0x7,
 635	0x949c, 0xffffffff, 0x100,
 636	0x9490, 0xffffffff, 0x8000,
 637	0x9604, 0xffffffff, 0x0,
 638	0x9654, 0xffffffff, 0x100,
 639	0x9604, 0xffffffff, 0x1,
 640	0x9654, 0xffffffff, 0x100,
 641	0x9604, 0xffffffff, 0x2,
 642	0x9654, 0xffffffff, 0x100,
 643	0x9604, 0xffffffff, 0x3,
 644	0x9654, 0xffffffff, 0x100,
 645	0x9604, 0xffffffff, 0x4,
 646	0x9654, 0xffffffff, 0x100,
 647	0x9604, 0xffffffff, 0x5,
 648	0x9654, 0xffffffff, 0x100,
 649	0x9604, 0xffffffff, 0x6,
 650	0x9654, 0xffffffff, 0x100,
 651	0x9604, 0xffffffff, 0x7,
 652	0x9654, 0xffffffff, 0x100,
 653	0x9604, 0xffffffff, 0x80000000,
 654	0x9030, 0xffffffff, 0x100,
 655	0x9034, 0xffffffff, 0x100,
 656	0x9038, 0xffffffff, 0x100,
 657	0x903c, 0xffffffff, 0x100,
 658	0x9040, 0xffffffff, 0x100,
 659	0xa200, 0xffffffff, 0x100,
 660	0xa204, 0xffffffff, 0x100,
 661	0xa208, 0xffffffff, 0x100,
 662	0xa20c, 0xffffffff, 0x100,
 663	0x971c, 0xffffffff, 0x100,
 664	0x915c, 0xffffffff, 0x00020001,
 665	0x9160, 0xffffffff, 0x00040003,
 666	0x916c, 0xffffffff, 0x00060005,
 667	0x9170, 0xffffffff, 0x00080007,
 668	0x9174, 0xffffffff, 0x000a0009,
 669	0x9178, 0xffffffff, 0x000c000b,
 670	0x917c, 0xffffffff, 0x000e000d,
 671	0x9180, 0xffffffff, 0x0010000f,
 672	0x918c, 0xffffffff, 0x00120011,
 673	0x9190, 0xffffffff, 0x00140013,
 674	0x9194, 0xffffffff, 0x00020001,
 675	0x9198, 0xffffffff, 0x00040003,
 676	0x919c, 0xffffffff, 0x00060005,
 677	0x91a8, 0xffffffff, 0x00080007,
 678	0x91ac, 0xffffffff, 0x000a0009,
 679	0x91b0, 0xffffffff, 0x000c000b,
 680	0x91b4, 0xffffffff, 0x000e000d,
 681	0x91b8, 0xffffffff, 0x0010000f,
 682	0x91c4, 0xffffffff, 0x00120011,
 683	0x91c8, 0xffffffff, 0x00140013,
 684	0x91cc, 0xffffffff, 0x00020001,
 685	0x91d0, 0xffffffff, 0x00040003,
 686	0x91d4, 0xffffffff, 0x00060005,
 687	0x91e0, 0xffffffff, 0x00080007,
 688	0x91e4, 0xffffffff, 0x000a0009,
 689	0x91e8, 0xffffffff, 0x000c000b,
 690	0x91ec, 0xffffffff, 0x00020001,
 691	0x91f0, 0xffffffff, 0x00040003,
 692	0x91f4, 0xffffffff, 0x00060005,
 693	0x9200, 0xffffffff, 0x00080007,
 694	0x9204, 0xffffffff, 0x000a0009,
 695	0x9208, 0xffffffff, 0x000c000b,
 696	0x920c, 0xffffffff, 0x000e000d,
 697	0x9210, 0xffffffff, 0x0010000f,
 698	0x921c, 0xffffffff, 0x00120011,
 699	0x9220, 0xffffffff, 0x00140013,
 700	0x9224, 0xffffffff, 0x00020001,
 701	0x9228, 0xffffffff, 0x00040003,
 702	0x922c, 0xffffffff, 0x00060005,
 703	0x9238, 0xffffffff, 0x00080007,
 704	0x923c, 0xffffffff, 0x000a0009,
 705	0x9240, 0xffffffff, 0x000c000b,
 706	0x9244, 0xffffffff, 0x000e000d,
 707	0x9248, 0xffffffff, 0x0010000f,
 708	0x9254, 0xffffffff, 0x00120011,
 709	0x9258, 0xffffffff, 0x00140013,
 710	0x9294, 0xffffffff, 0x00020001,
 711	0x929c, 0xffffffff, 0x00040003,
 712	0x92a0, 0xffffffff, 0x00060005,
 713	0x92a4, 0xffffffff, 0x00080007
 714};
 715
 716static void rv770_init_golden_registers(struct radeon_device *rdev)
 717{
 718	switch (rdev->family) {
 719	case CHIP_RV770:
 720		radeon_program_register_sequence(rdev,
 721						 r7xx_golden_registers,
 722						 (const u32)ARRAY_SIZE(r7xx_golden_registers));
 723		radeon_program_register_sequence(rdev,
 724						 r7xx_golden_dyn_gpr_registers,
 725						 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
 726		if (rdev->pdev->device == 0x994e)
 727			radeon_program_register_sequence(rdev,
 728							 rv770ce_golden_registers,
 729							 (const u32)ARRAY_SIZE(rv770ce_golden_registers));
 730		else
 731			radeon_program_register_sequence(rdev,
 732							 rv770_golden_registers,
 733							 (const u32)ARRAY_SIZE(rv770_golden_registers));
 734		radeon_program_register_sequence(rdev,
 735						 rv770_mgcg_init,
 736						 (const u32)ARRAY_SIZE(rv770_mgcg_init));
 737		break;
 738	case CHIP_RV730:
 739		radeon_program_register_sequence(rdev,
 740						 r7xx_golden_registers,
 741						 (const u32)ARRAY_SIZE(r7xx_golden_registers));
 742		radeon_program_register_sequence(rdev,
 743						 r7xx_golden_dyn_gpr_registers,
 744						 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
 745		radeon_program_register_sequence(rdev,
 746						 rv730_golden_registers,
 747						 (const u32)ARRAY_SIZE(rv730_golden_registers));
 748		radeon_program_register_sequence(rdev,
 749						 rv730_mgcg_init,
 750						 (const u32)ARRAY_SIZE(rv730_mgcg_init));
 751		break;
 752	case CHIP_RV710:
 753		radeon_program_register_sequence(rdev,
 754						 r7xx_golden_registers,
 755						 (const u32)ARRAY_SIZE(r7xx_golden_registers));
 756		radeon_program_register_sequence(rdev,
 757						 r7xx_golden_dyn_gpr_registers,
 758						 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
 759		radeon_program_register_sequence(rdev,
 760						 rv710_golden_registers,
 761						 (const u32)ARRAY_SIZE(rv710_golden_registers));
 762		radeon_program_register_sequence(rdev,
 763						 rv710_mgcg_init,
 764						 (const u32)ARRAY_SIZE(rv710_mgcg_init));
 765		break;
 766	case CHIP_RV740:
 767		radeon_program_register_sequence(rdev,
 768						 rv740_golden_registers,
 769						 (const u32)ARRAY_SIZE(rv740_golden_registers));
 770		radeon_program_register_sequence(rdev,
 771						 rv740_mgcg_init,
 772						 (const u32)ARRAY_SIZE(rv740_mgcg_init));
 773		break;
 774	default:
 775		break;
 776	}
 777}
 778
 779#define PCIE_BUS_CLK                10000
 780#define TCLK                        (PCIE_BUS_CLK / 10)
 781
 782/**
 783 * rv770_get_xclk - get the xclk
 784 *
 785 * @rdev: radeon_device pointer
 786 *
 787 * Returns the reference clock used by the gfx engine
 788 * (r7xx-cayman).
 789 */
 790u32 rv770_get_xclk(struct radeon_device *rdev)
 791{
 792	u32 reference_clock = rdev->clock.spll.reference_freq;
 793	u32 tmp = RREG32(CG_CLKPIN_CNTL);
 794
 795	if (tmp & MUX_TCLK_TO_XCLK)
 796		return TCLK;
 797
 798	if (tmp & XTALIN_DIVIDE)
 799		return reference_clock / 4;
 800
 801	return reference_clock;
 802}
 803
 804u32 rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
 805{
 806	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
 
 807	u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset);
 808	int i;
 809
 810	/* Lock the graphics update lock */
 811	tmp |= AVIVO_D1GRPH_UPDATE_LOCK;
 812	WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
 813
 
 
 
 
 
 
 814	/* update the scanout addresses */
 815	if (radeon_crtc->crtc_id) {
 816		WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
 817		WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
 818	} else {
 819		WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
 820		WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
 821	}
 822	WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
 823	       (u32)crtc_base);
 824	WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
 825	       (u32)crtc_base);
 826
 827	/* Wait for update_pending to go high. */
 828	for (i = 0; i < rdev->usec_timeout; i++) {
 829		if (RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING)
 830			break;
 831		udelay(1);
 832	}
 833	DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
 834
 835	/* Unlock the lock, so double-buffering can take place inside vblank */
 836	tmp &= ~AVIVO_D1GRPH_UPDATE_LOCK;
 837	WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
 
 
 
 
 
 838
 839	/* Return current update_pending status: */
 840	return RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING;
 
 841}
 842
 843/* get temperature in millidegrees */
 844int rv770_get_temp(struct radeon_device *rdev)
 845{
 846	u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
 847		ASIC_T_SHIFT;
 848	int actual_temp;
 849
 850	if (temp & 0x400)
 851		actual_temp = -256;
 852	else if (temp & 0x200)
 853		actual_temp = 255;
 854	else if (temp & 0x100) {
 855		actual_temp = temp & 0x1ff;
 856		actual_temp |= ~0x1ff;
 857	} else
 858		actual_temp = temp & 0xff;
 859
 860	return (actual_temp * 1000) / 2;
 861}
 862
 863void rv770_pm_misc(struct radeon_device *rdev)
 864{
 865	int req_ps_idx = rdev->pm.requested_power_state_index;
 866	int req_cm_idx = rdev->pm.requested_clock_mode_index;
 867	struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
 868	struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
 869
 870	if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
 871		/* 0xff01 is a flag rather then an actual voltage */
 872		if (voltage->voltage == 0xff01)
 873			return;
 874		if (voltage->voltage != rdev->pm.current_vddc) {
 875			radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
 876			rdev->pm.current_vddc = voltage->voltage;
 877			DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
 878		}
 879	}
 880}
 881
 882/*
 883 * GART
 884 */
 885static int rv770_pcie_gart_enable(struct radeon_device *rdev)
 886{
 887	u32 tmp;
 888	int r, i;
 889
 890	if (rdev->gart.robj == NULL) {
 891		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
 892		return -EINVAL;
 893	}
 894	r = radeon_gart_table_vram_pin(rdev);
 895	if (r)
 896		return r;
 897	radeon_gart_restore(rdev);
 898	/* Setup L2 cache */
 899	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
 900				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
 901				EFFECTIVE_L2_QUEUE_SIZE(7));
 902	WREG32(VM_L2_CNTL2, 0);
 903	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
 904	/* Setup TLB control */
 905	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
 906		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
 907		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
 908		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
 909	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
 910	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
 911	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
 912	if (rdev->family == CHIP_RV740)
 913		WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
 914	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
 915	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
 916	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
 917	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
 918	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
 919	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
 920	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
 921	WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
 922				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
 923	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
 924			(u32)(rdev->dummy_page.addr >> 12));
 925	for (i = 1; i < 7; i++)
 926		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
 927
 928	r600_pcie_gart_tlb_flush(rdev);
 929	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
 930		 (unsigned)(rdev->mc.gtt_size >> 20),
 931		 (unsigned long long)rdev->gart.table_addr);
 932	rdev->gart.ready = true;
 933	return 0;
 934}
 935
 936static void rv770_pcie_gart_disable(struct radeon_device *rdev)
 937{
 938	u32 tmp;
 939	int i;
 940
 941	/* Disable all tables */
 942	for (i = 0; i < 7; i++)
 943		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
 944
 945	/* Setup L2 cache */
 946	WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
 947				EFFECTIVE_L2_QUEUE_SIZE(7));
 948	WREG32(VM_L2_CNTL2, 0);
 949	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
 950	/* Setup TLB control */
 951	tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
 952	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
 953	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
 954	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
 955	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
 956	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
 957	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
 958	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
 959	radeon_gart_table_vram_unpin(rdev);
 960}
 961
 962static void rv770_pcie_gart_fini(struct radeon_device *rdev)
 963{
 964	radeon_gart_fini(rdev);
 965	rv770_pcie_gart_disable(rdev);
 966	radeon_gart_table_vram_free(rdev);
 967}
 968
 969
 970static void rv770_agp_enable(struct radeon_device *rdev)
 971{
 972	u32 tmp;
 973	int i;
 974
 975	/* Setup L2 cache */
 976	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
 977				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
 978				EFFECTIVE_L2_QUEUE_SIZE(7));
 979	WREG32(VM_L2_CNTL2, 0);
 980	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
 981	/* Setup TLB control */
 982	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
 983		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
 984		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
 985		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
 986	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
 987	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
 988	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
 989	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
 990	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
 991	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
 992	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
 993	for (i = 0; i < 7; i++)
 994		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
 995}
 996
 997static void rv770_mc_program(struct radeon_device *rdev)
 998{
 999	struct rv515_mc_save save;
1000	u32 tmp;
1001	int i, j;
1002
1003	/* Initialize HDP */
1004	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
1005		WREG32((0x2c14 + j), 0x00000000);
1006		WREG32((0x2c18 + j), 0x00000000);
1007		WREG32((0x2c1c + j), 0x00000000);
1008		WREG32((0x2c20 + j), 0x00000000);
1009		WREG32((0x2c24 + j), 0x00000000);
1010	}
1011	/* r7xx hw bug.  Read from HDP_DEBUG1 rather
1012	 * than writing to HDP_REG_COHERENCY_FLUSH_CNTL
1013	 */
1014	tmp = RREG32(HDP_DEBUG1);
1015
1016	rv515_mc_stop(rdev, &save);
1017	if (r600_mc_wait_for_idle(rdev)) {
1018		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1019	}
1020	/* Lockout access through VGA aperture*/
1021	WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
1022	/* Update configuration */
1023	if (rdev->flags & RADEON_IS_AGP) {
1024		if (rdev->mc.vram_start < rdev->mc.gtt_start) {
1025			/* VRAM before AGP */
1026			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1027				rdev->mc.vram_start >> 12);
1028			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1029				rdev->mc.gtt_end >> 12);
1030		} else {
1031			/* VRAM after AGP */
1032			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1033				rdev->mc.gtt_start >> 12);
1034			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1035				rdev->mc.vram_end >> 12);
1036		}
1037	} else {
1038		WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1039			rdev->mc.vram_start >> 12);
1040		WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1041			rdev->mc.vram_end >> 12);
1042	}
1043	WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
1044	tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
1045	tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
1046	WREG32(MC_VM_FB_LOCATION, tmp);
1047	WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
1048	WREG32(HDP_NONSURFACE_INFO, (2 << 7));
1049	WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
1050	if (rdev->flags & RADEON_IS_AGP) {
1051		WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16);
1052		WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16);
1053		WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
1054	} else {
1055		WREG32(MC_VM_AGP_BASE, 0);
1056		WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
1057		WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
1058	}
1059	if (r600_mc_wait_for_idle(rdev)) {
1060		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1061	}
1062	rv515_mc_resume(rdev, &save);
1063	/* we need to own VRAM, so turn off the VGA renderer here
1064	 * to stop it overwriting our objects */
1065	rv515_vga_render_disable(rdev);
1066}
1067
1068
1069/*
1070 * CP.
1071 */
1072void r700_cp_stop(struct radeon_device *rdev)
1073{
1074	if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1075		radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1076	WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1077	WREG32(SCRATCH_UMSK, 0);
1078	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1079}
1080
1081static int rv770_cp_load_microcode(struct radeon_device *rdev)
1082{
1083	const __be32 *fw_data;
1084	int i;
1085
1086	if (!rdev->me_fw || !rdev->pfp_fw)
1087		return -EINVAL;
1088
1089	r700_cp_stop(rdev);
1090	WREG32(CP_RB_CNTL,
1091#ifdef __BIG_ENDIAN
1092	       BUF_SWAP_32BIT |
1093#endif
1094	       RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
1095
1096	/* Reset cp */
1097	WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
1098	RREG32(GRBM_SOFT_RESET);
1099	mdelay(15);
1100	WREG32(GRBM_SOFT_RESET, 0);
1101
1102	fw_data = (const __be32 *)rdev->pfp_fw->data;
1103	WREG32(CP_PFP_UCODE_ADDR, 0);
1104	for (i = 0; i < R700_PFP_UCODE_SIZE; i++)
1105		WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1106	WREG32(CP_PFP_UCODE_ADDR, 0);
1107
1108	fw_data = (const __be32 *)rdev->me_fw->data;
1109	WREG32(CP_ME_RAM_WADDR, 0);
1110	for (i = 0; i < R700_PM4_UCODE_SIZE; i++)
1111		WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1112
1113	WREG32(CP_PFP_UCODE_ADDR, 0);
1114	WREG32(CP_ME_RAM_WADDR, 0);
1115	WREG32(CP_ME_RAM_RADDR, 0);
1116	return 0;
1117}
1118
1119void r700_cp_fini(struct radeon_device *rdev)
1120{
1121	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1122	r700_cp_stop(rdev);
1123	radeon_ring_fini(rdev, ring);
1124	radeon_scratch_free(rdev, ring->rptr_save_reg);
1125}
1126
1127void rv770_set_clk_bypass_mode(struct radeon_device *rdev)
1128{
1129	u32 tmp, i;
1130
1131	if (rdev->flags & RADEON_IS_IGP)
1132		return;
1133
1134	tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
1135	tmp &= SCLK_MUX_SEL_MASK;
1136	tmp |= SCLK_MUX_SEL(1) | SCLK_MUX_UPDATE;
1137	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1138
1139	for (i = 0; i < rdev->usec_timeout; i++) {
1140		if (RREG32(CG_SPLL_STATUS) & SPLL_CHG_STATUS)
1141			break;
1142		udelay(1);
1143	}
1144
1145	tmp &= ~SCLK_MUX_UPDATE;
1146	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1147
1148	tmp = RREG32(MPLL_CNTL_MODE);
1149	if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730))
1150		tmp &= ~RV730_MPLL_MCLK_SEL;
1151	else
1152		tmp &= ~MPLL_MCLK_SEL;
1153	WREG32(MPLL_CNTL_MODE, tmp);
1154}
1155
1156/*
1157 * Core functions
1158 */
1159static void rv770_gpu_init(struct radeon_device *rdev)
1160{
1161	int i, j, num_qd_pipes;
1162	u32 ta_aux_cntl;
1163	u32 sx_debug_1;
1164	u32 smx_dc_ctl0;
1165	u32 db_debug3;
1166	u32 num_gs_verts_per_thread;
1167	u32 vgt_gs_per_es;
1168	u32 gs_prim_buffer_depth = 0;
1169	u32 sq_ms_fifo_sizes;
1170	u32 sq_config;
1171	u32 sq_thread_resource_mgmt;
1172	u32 hdp_host_path_cntl;
1173	u32 sq_dyn_gpr_size_simd_ab_0;
1174	u32 gb_tiling_config = 0;
1175	u32 cc_rb_backend_disable = 0;
1176	u32 cc_gc_shader_pipe_config = 0;
1177	u32 mc_arb_ramcfg;
1178	u32 db_debug4, tmp;
1179	u32 inactive_pipes, shader_pipe_config;
1180	u32 disabled_rb_mask;
1181	unsigned active_number;
1182
1183	/* setup chip specs */
1184	rdev->config.rv770.tiling_group_size = 256;
1185	switch (rdev->family) {
1186	case CHIP_RV770:
1187		rdev->config.rv770.max_pipes = 4;
1188		rdev->config.rv770.max_tile_pipes = 8;
1189		rdev->config.rv770.max_simds = 10;
1190		rdev->config.rv770.max_backends = 4;
1191		rdev->config.rv770.max_gprs = 256;
1192		rdev->config.rv770.max_threads = 248;
1193		rdev->config.rv770.max_stack_entries = 512;
1194		rdev->config.rv770.max_hw_contexts = 8;
1195		rdev->config.rv770.max_gs_threads = 16 * 2;
1196		rdev->config.rv770.sx_max_export_size = 128;
1197		rdev->config.rv770.sx_max_export_pos_size = 16;
1198		rdev->config.rv770.sx_max_export_smx_size = 112;
1199		rdev->config.rv770.sq_num_cf_insts = 2;
1200
1201		rdev->config.rv770.sx_num_of_sets = 7;
1202		rdev->config.rv770.sc_prim_fifo_size = 0xF9;
1203		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1204		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1205		break;
1206	case CHIP_RV730:
1207		rdev->config.rv770.max_pipes = 2;
1208		rdev->config.rv770.max_tile_pipes = 4;
1209		rdev->config.rv770.max_simds = 8;
1210		rdev->config.rv770.max_backends = 2;
1211		rdev->config.rv770.max_gprs = 128;
1212		rdev->config.rv770.max_threads = 248;
1213		rdev->config.rv770.max_stack_entries = 256;
1214		rdev->config.rv770.max_hw_contexts = 8;
1215		rdev->config.rv770.max_gs_threads = 16 * 2;
1216		rdev->config.rv770.sx_max_export_size = 256;
1217		rdev->config.rv770.sx_max_export_pos_size = 32;
1218		rdev->config.rv770.sx_max_export_smx_size = 224;
1219		rdev->config.rv770.sq_num_cf_insts = 2;
1220
1221		rdev->config.rv770.sx_num_of_sets = 7;
1222		rdev->config.rv770.sc_prim_fifo_size = 0xf9;
1223		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1224		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1225		if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1226			rdev->config.rv770.sx_max_export_pos_size -= 16;
1227			rdev->config.rv770.sx_max_export_smx_size += 16;
1228		}
1229		break;
1230	case CHIP_RV710:
1231		rdev->config.rv770.max_pipes = 2;
1232		rdev->config.rv770.max_tile_pipes = 2;
1233		rdev->config.rv770.max_simds = 2;
1234		rdev->config.rv770.max_backends = 1;
1235		rdev->config.rv770.max_gprs = 256;
1236		rdev->config.rv770.max_threads = 192;
1237		rdev->config.rv770.max_stack_entries = 256;
1238		rdev->config.rv770.max_hw_contexts = 4;
1239		rdev->config.rv770.max_gs_threads = 8 * 2;
1240		rdev->config.rv770.sx_max_export_size = 128;
1241		rdev->config.rv770.sx_max_export_pos_size = 16;
1242		rdev->config.rv770.sx_max_export_smx_size = 112;
1243		rdev->config.rv770.sq_num_cf_insts = 1;
1244
1245		rdev->config.rv770.sx_num_of_sets = 7;
1246		rdev->config.rv770.sc_prim_fifo_size = 0x40;
1247		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1248		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1249		break;
1250	case CHIP_RV740:
1251		rdev->config.rv770.max_pipes = 4;
1252		rdev->config.rv770.max_tile_pipes = 4;
1253		rdev->config.rv770.max_simds = 8;
1254		rdev->config.rv770.max_backends = 4;
1255		rdev->config.rv770.max_gprs = 256;
1256		rdev->config.rv770.max_threads = 248;
1257		rdev->config.rv770.max_stack_entries = 512;
1258		rdev->config.rv770.max_hw_contexts = 8;
1259		rdev->config.rv770.max_gs_threads = 16 * 2;
1260		rdev->config.rv770.sx_max_export_size = 256;
1261		rdev->config.rv770.sx_max_export_pos_size = 32;
1262		rdev->config.rv770.sx_max_export_smx_size = 224;
1263		rdev->config.rv770.sq_num_cf_insts = 2;
1264
1265		rdev->config.rv770.sx_num_of_sets = 7;
1266		rdev->config.rv770.sc_prim_fifo_size = 0x100;
1267		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1268		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1269
1270		if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1271			rdev->config.rv770.sx_max_export_pos_size -= 16;
1272			rdev->config.rv770.sx_max_export_smx_size += 16;
1273		}
1274		break;
1275	default:
1276		break;
1277	}
1278
1279	/* Initialize HDP */
1280	j = 0;
1281	for (i = 0; i < 32; i++) {
1282		WREG32((0x2c14 + j), 0x00000000);
1283		WREG32((0x2c18 + j), 0x00000000);
1284		WREG32((0x2c1c + j), 0x00000000);
1285		WREG32((0x2c20 + j), 0x00000000);
1286		WREG32((0x2c24 + j), 0x00000000);
1287		j += 0x18;
1288	}
1289
1290	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
1291
1292	/* setup tiling, simd, pipe config */
1293	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1294
1295	shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG);
1296	inactive_pipes = (shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT;
1297	for (i = 0, tmp = 1, active_number = 0; i < R7XX_MAX_PIPES; i++) {
1298		if (!(inactive_pipes & tmp)) {
1299			active_number++;
1300		}
1301		tmp <<= 1;
1302	}
1303	if (active_number == 1) {
1304		WREG32(SPI_CONFIG_CNTL, DISABLE_INTERP_1);
1305	} else {
1306		WREG32(SPI_CONFIG_CNTL, 0);
1307	}
1308
1309	cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000;
1310	tmp = R7XX_MAX_BACKENDS - r600_count_pipe_bits(cc_rb_backend_disable >> 16);
1311	if (tmp < rdev->config.rv770.max_backends) {
1312		rdev->config.rv770.max_backends = tmp;
1313	}
1314
1315	cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
1316	tmp = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config >> 8) & R7XX_MAX_PIPES_MASK);
1317	if (tmp < rdev->config.rv770.max_pipes) {
1318		rdev->config.rv770.max_pipes = tmp;
1319	}
1320	tmp = R7XX_MAX_SIMDS - r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK);
1321	if (tmp < rdev->config.rv770.max_simds) {
1322		rdev->config.rv770.max_simds = tmp;
1323	}
1324
1325	switch (rdev->config.rv770.max_tile_pipes) {
1326	case 1:
1327	default:
1328		gb_tiling_config = PIPE_TILING(0);
1329		break;
1330	case 2:
1331		gb_tiling_config = PIPE_TILING(1);
1332		break;
1333	case 4:
1334		gb_tiling_config = PIPE_TILING(2);
1335		break;
1336	case 8:
1337		gb_tiling_config = PIPE_TILING(3);
1338		break;
1339	}
1340	rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
1341
1342	disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK;
 
 
 
 
 
 
 
 
1343	tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT;
1344	tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends,
1345					R7XX_MAX_BACKENDS, disabled_rb_mask);
1346	gb_tiling_config |= tmp << 16;
1347	rdev->config.rv770.backend_map = tmp;
1348
1349	if (rdev->family == CHIP_RV770)
1350		gb_tiling_config |= BANK_TILING(1);
1351	else {
1352		if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
1353			gb_tiling_config |= BANK_TILING(1);
1354		else
1355			gb_tiling_config |= BANK_TILING(0);
1356	}
1357	rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3);
1358	gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
1359	if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) {
1360		gb_tiling_config |= ROW_TILING(3);
1361		gb_tiling_config |= SAMPLE_SPLIT(3);
1362	} else {
1363		gb_tiling_config |=
1364			ROW_TILING(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1365		gb_tiling_config |=
1366			SAMPLE_SPLIT(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1367	}
1368
1369	gb_tiling_config |= BANK_SWAPS(1);
1370	rdev->config.rv770.tile_config = gb_tiling_config;
1371
1372	WREG32(GB_TILING_CONFIG, gb_tiling_config);
1373	WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1374	WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1375	WREG32(DMA_TILING_CONFIG, (gb_tiling_config & 0xffff));
1376	WREG32(DMA_TILING_CONFIG2, (gb_tiling_config & 0xffff));
1377	if (rdev->family == CHIP_RV730) {
1378		WREG32(UVD_UDEC_DB_TILING_CONFIG, (gb_tiling_config & 0xffff));
1379		WREG32(UVD_UDEC_DBW_TILING_CONFIG, (gb_tiling_config & 0xffff));
1380		WREG32(UVD_UDEC_TILING_CONFIG, (gb_tiling_config & 0xffff));
1381	}
1382
1383	WREG32(CGTS_SYS_TCC_DISABLE, 0);
1384	WREG32(CGTS_TCC_DISABLE, 0);
1385	WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
1386	WREG32(CGTS_USER_TCC_DISABLE, 0);
1387
1388
1389	num_qd_pipes = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8);
1390	WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK);
1391	WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK);
1392
1393	/* set HW defaults for 3D engine */
1394	WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
1395				     ROQ_IB2_START(0x2b)));
1396
1397	WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
1398
1399	ta_aux_cntl = RREG32(TA_CNTL_AUX);
1400	WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO);
1401
1402	sx_debug_1 = RREG32(SX_DEBUG_1);
1403	sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
1404	WREG32(SX_DEBUG_1, sx_debug_1);
1405
1406	smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
1407	smx_dc_ctl0 &= ~CACHE_DEPTH(0x1ff);
1408	smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1);
1409	WREG32(SMX_DC_CTL0, smx_dc_ctl0);
1410
1411	if (rdev->family != CHIP_RV740)
1412		WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
1413				       GS_FLUSH_CTL(4) |
1414				       ACK_FLUSH_CTL(3) |
1415				       SYNC_FLUSH_CTL));
1416
1417	if (rdev->family != CHIP_RV770)
1418		WREG32(SMX_SAR_CTL0, 0x00003f3f);
1419
1420	db_debug3 = RREG32(DB_DEBUG3);
1421	db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
1422	switch (rdev->family) {
1423	case CHIP_RV770:
1424	case CHIP_RV740:
1425		db_debug3 |= DB_CLK_OFF_DELAY(0x1f);
1426		break;
1427	case CHIP_RV710:
1428	case CHIP_RV730:
1429	default:
1430		db_debug3 |= DB_CLK_OFF_DELAY(2);
1431		break;
1432	}
1433	WREG32(DB_DEBUG3, db_debug3);
1434
1435	if (rdev->family != CHIP_RV770) {
1436		db_debug4 = RREG32(DB_DEBUG4);
1437		db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER;
1438		WREG32(DB_DEBUG4, db_debug4);
1439	}
1440
1441	WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.rv770.sx_max_export_size / 4) - 1) |
1442					POSITION_BUFFER_SIZE((rdev->config.rv770.sx_max_export_pos_size / 4) - 1) |
1443					SMX_BUFFER_SIZE((rdev->config.rv770.sx_max_export_smx_size / 4) - 1)));
1444
1445	WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.rv770.sc_prim_fifo_size) |
1446				 SC_HIZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_hiz_tile_fifo_size) |
1447				 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_earlyz_tile_fifo_fize)));
1448
1449	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1450
1451	WREG32(VGT_NUM_INSTANCES, 1);
1452
1453	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
1454
1455	WREG32(CP_PERFMON_CNTL, 0);
1456
1457	sq_ms_fifo_sizes = (CACHE_FIFO_SIZE(16 * rdev->config.rv770.sq_num_cf_insts) |
1458			    DONE_FIFO_HIWATER(0xe0) |
1459			    ALU_UPDATE_FIFO_HIWATER(0x8));
1460	switch (rdev->family) {
1461	case CHIP_RV770:
1462	case CHIP_RV730:
1463	case CHIP_RV710:
1464		sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
1465		break;
1466	case CHIP_RV740:
1467	default:
1468		sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4);
1469		break;
1470	}
1471	WREG32(SQ_MS_FIFO_SIZES, sq_ms_fifo_sizes);
1472
1473	/* SQ_CONFIG, SQ_GPR_RESOURCE_MGMT, SQ_THREAD_RESOURCE_MGMT, SQ_STACK_RESOURCE_MGMT
1474	 * should be adjusted as needed by the 2D/3D drivers.  This just sets default values
1475	 */
1476	sq_config = RREG32(SQ_CONFIG);
1477	sq_config &= ~(PS_PRIO(3) |
1478		       VS_PRIO(3) |
1479		       GS_PRIO(3) |
1480		       ES_PRIO(3));
1481	sq_config |= (DX9_CONSTS |
1482		      VC_ENABLE |
1483		      EXPORT_SRC_C |
1484		      PS_PRIO(0) |
1485		      VS_PRIO(1) |
1486		      GS_PRIO(2) |
1487		      ES_PRIO(3));
1488	if (rdev->family == CHIP_RV710)
1489		/* no vertex cache */
1490		sq_config &= ~VC_ENABLE;
1491
1492	WREG32(SQ_CONFIG, sq_config);
1493
1494	WREG32(SQ_GPR_RESOURCE_MGMT_1,  (NUM_PS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1495					 NUM_VS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1496					 NUM_CLAUSE_TEMP_GPRS(((rdev->config.rv770.max_gprs * 24)/64)/2)));
1497
1498	WREG32(SQ_GPR_RESOURCE_MGMT_2,  (NUM_GS_GPRS((rdev->config.rv770.max_gprs * 7)/64) |
1499					 NUM_ES_GPRS((rdev->config.rv770.max_gprs * 7)/64)));
1500
1501	sq_thread_resource_mgmt = (NUM_PS_THREADS((rdev->config.rv770.max_threads * 4)/8) |
1502				   NUM_VS_THREADS((rdev->config.rv770.max_threads * 2)/8) |
1503				   NUM_ES_THREADS((rdev->config.rv770.max_threads * 1)/8));
1504	if (((rdev->config.rv770.max_threads * 1) / 8) > rdev->config.rv770.max_gs_threads)
1505		sq_thread_resource_mgmt |= NUM_GS_THREADS(rdev->config.rv770.max_gs_threads);
1506	else
1507		sq_thread_resource_mgmt |= NUM_GS_THREADS((rdev->config.rv770.max_gs_threads * 1)/8);
1508	WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt);
1509
1510	WREG32(SQ_STACK_RESOURCE_MGMT_1, (NUM_PS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1511						     NUM_VS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1512
1513	WREG32(SQ_STACK_RESOURCE_MGMT_2, (NUM_GS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1514						     NUM_ES_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1515
1516	sq_dyn_gpr_size_simd_ab_0 = (SIMDA_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1517				     SIMDA_RING1((rdev->config.rv770.max_gprs * 38)/64) |
1518				     SIMDB_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1519				     SIMDB_RING1((rdev->config.rv770.max_gprs * 38)/64));
1520
1521	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_0, sq_dyn_gpr_size_simd_ab_0);
1522	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_1, sq_dyn_gpr_size_simd_ab_0);
1523	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_2, sq_dyn_gpr_size_simd_ab_0);
1524	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_3, sq_dyn_gpr_size_simd_ab_0);
1525	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_4, sq_dyn_gpr_size_simd_ab_0);
1526	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_5, sq_dyn_gpr_size_simd_ab_0);
1527	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_6, sq_dyn_gpr_size_simd_ab_0);
1528	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_7, sq_dyn_gpr_size_simd_ab_0);
1529
1530	WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1531					  FORCE_EOV_MAX_REZ_CNT(255)));
1532
1533	if (rdev->family == CHIP_RV710)
1534		WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(TC_ONLY) |
1535						AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1536	else
1537		WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(VC_AND_TC) |
1538						AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1539
1540	switch (rdev->family) {
1541	case CHIP_RV770:
1542	case CHIP_RV730:
1543	case CHIP_RV740:
1544		gs_prim_buffer_depth = 384;
1545		break;
1546	case CHIP_RV710:
1547		gs_prim_buffer_depth = 128;
1548		break;
1549	default:
1550		break;
1551	}
1552
1553	num_gs_verts_per_thread = rdev->config.rv770.max_pipes * 16;
1554	vgt_gs_per_es = gs_prim_buffer_depth + num_gs_verts_per_thread;
1555	/* Max value for this is 256 */
1556	if (vgt_gs_per_es > 256)
1557		vgt_gs_per_es = 256;
1558
1559	WREG32(VGT_ES_PER_GS, 128);
1560	WREG32(VGT_GS_PER_ES, vgt_gs_per_es);
1561	WREG32(VGT_GS_PER_VS, 2);
1562
1563	/* more default values. 2D/3D driver should adjust as needed */
1564	WREG32(VGT_GS_VERTEX_REUSE, 16);
1565	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1566	WREG32(VGT_STRMOUT_EN, 0);
1567	WREG32(SX_MISC, 0);
1568	WREG32(PA_SC_MODE_CNTL, 0);
1569	WREG32(PA_SC_EDGERULE, 0xaaaaaaaa);
1570	WREG32(PA_SC_AA_CONFIG, 0);
1571	WREG32(PA_SC_CLIPRECT_RULE, 0xffff);
1572	WREG32(PA_SC_LINE_STIPPLE, 0);
1573	WREG32(SPI_INPUT_Z, 0);
1574	WREG32(SPI_PS_IN_CONTROL_0, NUM_INTERP(2));
1575	WREG32(CB_COLOR7_FRAG, 0);
1576
1577	/* clear render buffer base addresses */
1578	WREG32(CB_COLOR0_BASE, 0);
1579	WREG32(CB_COLOR1_BASE, 0);
1580	WREG32(CB_COLOR2_BASE, 0);
1581	WREG32(CB_COLOR3_BASE, 0);
1582	WREG32(CB_COLOR4_BASE, 0);
1583	WREG32(CB_COLOR5_BASE, 0);
1584	WREG32(CB_COLOR6_BASE, 0);
1585	WREG32(CB_COLOR7_BASE, 0);
1586
1587	WREG32(TCP_CNTL, 0);
1588
1589	hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1590	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1591
1592	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1593
1594	WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
1595					  NUM_CLIP_SEQ(3)));
1596	WREG32(VC_ENHANCE, 0);
1597}
1598
1599void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
1600{
1601	u64 size_bf, size_af;
1602
1603	if (mc->mc_vram_size > 0xE0000000) {
1604		/* leave room for at least 512M GTT */
1605		dev_warn(rdev->dev, "limiting VRAM\n");
1606		mc->real_vram_size = 0xE0000000;
1607		mc->mc_vram_size = 0xE0000000;
1608	}
1609	if (rdev->flags & RADEON_IS_AGP) {
1610		size_bf = mc->gtt_start;
1611		size_af = mc->mc_mask - mc->gtt_end;
1612		if (size_bf > size_af) {
1613			if (mc->mc_vram_size > size_bf) {
1614				dev_warn(rdev->dev, "limiting VRAM\n");
1615				mc->real_vram_size = size_bf;
1616				mc->mc_vram_size = size_bf;
1617			}
1618			mc->vram_start = mc->gtt_start - mc->mc_vram_size;
1619		} else {
1620			if (mc->mc_vram_size > size_af) {
1621				dev_warn(rdev->dev, "limiting VRAM\n");
1622				mc->real_vram_size = size_af;
1623				mc->mc_vram_size = size_af;
1624			}
1625			mc->vram_start = mc->gtt_end + 1;
1626		}
1627		mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
1628		dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",
1629				mc->mc_vram_size >> 20, mc->vram_start,
1630				mc->vram_end, mc->real_vram_size >> 20);
1631	} else {
1632		radeon_vram_location(rdev, &rdev->mc, 0);
1633		rdev->mc.gtt_base_align = 0;
1634		radeon_gtt_location(rdev, mc);
1635	}
1636}
1637
1638static int rv770_mc_init(struct radeon_device *rdev)
1639{
1640	u32 tmp;
1641	int chansize, numchan;
1642
1643	/* Get VRAM informations */
1644	rdev->mc.vram_is_ddr = true;
1645	tmp = RREG32(MC_ARB_RAMCFG);
1646	if (tmp & CHANSIZE_OVERRIDE) {
1647		chansize = 16;
1648	} else if (tmp & CHANSIZE_MASK) {
1649		chansize = 64;
1650	} else {
1651		chansize = 32;
1652	}
1653	tmp = RREG32(MC_SHARED_CHMAP);
1654	switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
1655	case 0:
1656	default:
1657		numchan = 1;
1658		break;
1659	case 1:
1660		numchan = 2;
1661		break;
1662	case 2:
1663		numchan = 4;
1664		break;
1665	case 3:
1666		numchan = 8;
1667		break;
1668	}
1669	rdev->mc.vram_width = numchan * chansize;
1670	/* Could aper size report 0 ? */
1671	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
1672	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
1673	/* Setup GPU memory space */
1674	rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
1675	rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
1676	rdev->mc.visible_vram_size = rdev->mc.aper_size;
1677	r700_vram_gtt_location(rdev, &rdev->mc);
1678	radeon_update_bandwidth_info(rdev);
1679
1680	return 0;
1681}
1682
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1683static int rv770_startup(struct radeon_device *rdev)
1684{
1685	struct radeon_ring *ring;
1686	int r;
1687
1688	/* enable pcie gen2 link */
1689	rv770_pcie_gen2_enable(rdev);
1690
1691	/* scratch needs to be initialized before MC */
1692	r = r600_vram_scratch_init(rdev);
1693	if (r)
1694		return r;
1695
1696	rv770_mc_program(rdev);
1697
1698	if (rdev->flags & RADEON_IS_AGP) {
1699		rv770_agp_enable(rdev);
1700	} else {
1701		r = rv770_pcie_gart_enable(rdev);
1702		if (r)
1703			return r;
1704	}
1705
1706	rv770_gpu_init(rdev);
1707
1708	/* allocate wb buffer */
1709	r = radeon_wb_init(rdev);
1710	if (r)
1711		return r;
1712
1713	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
1714	if (r) {
1715		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1716		return r;
1717	}
1718
1719	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
1720	if (r) {
1721		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
1722		return r;
1723	}
1724
1725	r = uvd_v2_2_resume(rdev);
1726	if (!r) {
1727		r = radeon_fence_driver_start_ring(rdev,
1728						   R600_RING_TYPE_UVD_INDEX);
1729		if (r)
1730			dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
1731	}
1732
1733	if (r)
1734		rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
1735
1736	/* Enable IRQ */
1737	if (!rdev->irq.installed) {
1738		r = radeon_irq_kms_init(rdev);
1739		if (r)
1740			return r;
1741	}
1742
1743	r = r600_irq_init(rdev);
1744	if (r) {
1745		DRM_ERROR("radeon: IH init failed (%d).\n", r);
1746		radeon_irq_kms_fini(rdev);
1747		return r;
1748	}
1749	r600_irq_set(rdev);
1750
1751	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1752	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
1753			     RADEON_CP_PACKET2);
1754	if (r)
1755		return r;
1756
1757	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
1758	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
1759			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
1760	if (r)
1761		return r;
1762
1763	r = rv770_cp_load_microcode(rdev);
1764	if (r)
1765		return r;
1766	r = r600_cp_resume(rdev);
1767	if (r)
1768		return r;
1769
1770	r = r600_dma_resume(rdev);
1771	if (r)
1772		return r;
1773
1774	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
1775	if (ring->ring_size) {
1776		r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
1777				     RADEON_CP_PACKET2);
1778		if (!r)
1779			r = uvd_v1_0_init(rdev);
1780
1781		if (r)
1782			DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
1783	}
1784
1785	r = radeon_ib_pool_init(rdev);
1786	if (r) {
1787		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
1788		return r;
1789	}
1790
1791	r = r600_audio_init(rdev);
1792	if (r) {
1793		DRM_ERROR("radeon: audio init failed\n");
1794		return r;
1795	}
1796
1797	return 0;
1798}
1799
1800int rv770_resume(struct radeon_device *rdev)
1801{
1802	int r;
1803
1804	/* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
1805	 * posting will perform necessary task to bring back GPU into good
1806	 * shape.
1807	 */
1808	/* post card */
1809	atom_asic_init(rdev->mode_info.atom_context);
1810
1811	/* init golden registers */
1812	rv770_init_golden_registers(rdev);
1813
1814	if (rdev->pm.pm_method == PM_METHOD_DPM)
1815		radeon_pm_resume(rdev);
1816
1817	rdev->accel_working = true;
1818	r = rv770_startup(rdev);
1819	if (r) {
1820		DRM_ERROR("r600 startup failed on resume\n");
1821		rdev->accel_working = false;
1822		return r;
1823	}
1824
1825	return r;
1826
1827}
1828
1829int rv770_suspend(struct radeon_device *rdev)
1830{
1831	radeon_pm_suspend(rdev);
1832	r600_audio_fini(rdev);
1833	uvd_v1_0_fini(rdev);
1834	radeon_uvd_suspend(rdev);
 
 
1835	r700_cp_stop(rdev);
1836	r600_dma_stop(rdev);
1837	r600_irq_suspend(rdev);
1838	radeon_wb_disable(rdev);
1839	rv770_pcie_gart_disable(rdev);
1840
1841	return 0;
1842}
1843
1844/* Plan is to move initialization in that function and use
1845 * helper function so that radeon_device_init pretty much
1846 * do nothing more than calling asic specific function. This
1847 * should also allow to remove a bunch of callback function
1848 * like vram_info.
1849 */
1850int rv770_init(struct radeon_device *rdev)
1851{
1852	int r;
1853
1854	/* Read BIOS */
1855	if (!radeon_get_bios(rdev)) {
1856		if (ASIC_IS_AVIVO(rdev))
1857			return -EINVAL;
1858	}
1859	/* Must be an ATOMBIOS */
1860	if (!rdev->is_atom_bios) {
1861		dev_err(rdev->dev, "Expecting atombios for R600 GPU\n");
1862		return -EINVAL;
1863	}
1864	r = radeon_atombios_init(rdev);
1865	if (r)
1866		return r;
1867	/* Post card if necessary */
1868	if (!radeon_card_posted(rdev)) {
1869		if (!rdev->bios) {
1870			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
1871			return -EINVAL;
1872		}
1873		DRM_INFO("GPU not posted. posting now...\n");
1874		atom_asic_init(rdev->mode_info.atom_context);
1875	}
1876	/* init golden registers */
1877	rv770_init_golden_registers(rdev);
1878	/* Initialize scratch registers */
1879	r600_scratch_init(rdev);
1880	/* Initialize surface registers */
1881	radeon_surface_init(rdev);
1882	/* Initialize clocks */
1883	radeon_get_clock_info(rdev->ddev);
1884	/* Fence driver */
1885	r = radeon_fence_driver_init(rdev);
1886	if (r)
1887		return r;
1888	/* initialize AGP */
1889	if (rdev->flags & RADEON_IS_AGP) {
1890		r = radeon_agp_init(rdev);
1891		if (r)
1892			radeon_agp_disable(rdev);
1893	}
1894	r = rv770_mc_init(rdev);
1895	if (r)
1896		return r;
1897	/* Memory manager */
1898	r = radeon_bo_init(rdev);
1899	if (r)
1900		return r;
1901
1902	if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
1903		r = r600_init_microcode(rdev);
1904		if (r) {
1905			DRM_ERROR("Failed to load firmware!\n");
1906			return r;
1907		}
1908	}
1909
1910	/* Initialize power management */
1911	radeon_pm_init(rdev);
1912
1913	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
1914	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
1915
1916	rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
1917	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
1918
1919	r = radeon_uvd_init(rdev);
1920	if (!r) {
1921		rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
1922		r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX],
1923			       4096);
1924	}
1925
1926	rdev->ih.ring_obj = NULL;
1927	r600_ih_ring_init(rdev, 64 * 1024);
1928
1929	r = r600_pcie_gart_init(rdev);
1930	if (r)
1931		return r;
1932
1933	rdev->accel_working = true;
1934	r = rv770_startup(rdev);
1935	if (r) {
1936		dev_err(rdev->dev, "disabling GPU acceleration\n");
1937		r700_cp_fini(rdev);
1938		r600_dma_fini(rdev);
1939		r600_irq_fini(rdev);
1940		radeon_wb_fini(rdev);
1941		radeon_ib_pool_fini(rdev);
1942		radeon_irq_kms_fini(rdev);
1943		rv770_pcie_gart_fini(rdev);
1944		rdev->accel_working = false;
1945	}
1946
1947	return 0;
1948}
1949
1950void rv770_fini(struct radeon_device *rdev)
1951{
1952	radeon_pm_fini(rdev);
1953	r700_cp_fini(rdev);
1954	r600_dma_fini(rdev);
1955	r600_irq_fini(rdev);
1956	radeon_wb_fini(rdev);
1957	radeon_ib_pool_fini(rdev);
1958	radeon_irq_kms_fini(rdev);
1959	uvd_v1_0_fini(rdev);
1960	radeon_uvd_fini(rdev);
1961	rv770_pcie_gart_fini(rdev);
1962	r600_vram_scratch_fini(rdev);
1963	radeon_gem_fini(rdev);
1964	radeon_fence_driver_fini(rdev);
1965	radeon_agp_fini(rdev);
1966	radeon_bo_fini(rdev);
1967	radeon_atombios_fini(rdev);
1968	kfree(rdev->bios);
1969	rdev->bios = NULL;
1970}
1971
1972static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
1973{
1974	u32 link_width_cntl, lanes, speed_cntl, tmp;
1975	u16 link_cntl2;
1976
1977	if (radeon_pcie_gen2 == 0)
1978		return;
1979
1980	if (rdev->flags & RADEON_IS_IGP)
1981		return;
1982
1983	if (!(rdev->flags & RADEON_IS_PCIE))
1984		return;
1985
1986	/* x2 cards have a special sequence */
1987	if (ASIC_IS_X2(rdev))
1988		return;
1989
1990	if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) &&
1991		(rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))
1992		return;
1993
1994	DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
1995
1996	/* advertise upconfig capability */
1997	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1998	link_width_cntl &= ~LC_UPCONFIGURE_DIS;
1999	WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2000	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2001	if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) {
2002		lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT;
2003		link_width_cntl &= ~(LC_LINK_WIDTH_MASK |
2004				     LC_RECONFIG_ARC_MISSING_ESCAPE);
2005		link_width_cntl |= lanes | LC_RECONFIG_NOW |
2006			LC_RENEGOTIATE_EN | LC_UPCONFIGURE_SUPPORT;
2007		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2008	} else {
2009		link_width_cntl |= LC_UPCONFIGURE_DIS;
2010		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2011	}
2012
2013	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2014	if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
2015	    (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
2016
2017		tmp = RREG32(0x541c);
2018		WREG32(0x541c, tmp | 0x8);
2019		WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN);
2020		link_cntl2 = RREG16(0x4088);
2021		link_cntl2 &= ~TARGET_LINK_SPEED_MASK;
2022		link_cntl2 |= 0x2;
2023		WREG16(0x4088, link_cntl2);
2024		WREG32(MM_CFGREGS_CNTL, 0);
2025
2026		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2027		speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
2028		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2029
2030		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2031		speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT;
2032		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2033
2034		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2035		speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
2036		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2037
2038		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2039		speed_cntl |= LC_GEN2_EN_STRAP;
2040		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2041
2042	} else {
2043		link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2044		/* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
2045		if (1)
2046			link_width_cntl |= LC_UPCONFIGURE_DIS;
2047		else
2048			link_width_cntl &= ~LC_UPCONFIGURE_DIS;
2049		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2050	}
2051}