Linux Audio

Check our new training course

Loading...
v4.6
   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/slab.h>
  30#include <drm/drmP.h>
  31#include "radeon.h"
  32#include "radeon_asic.h"
  33#include "radeon_audio.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
 804void 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
 840bool rv770_page_flip_pending(struct radeon_device *rdev, int crtc_id)
 841{
 842	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
 843
 844	/* Return current update_pending status: */
 845	return !!(RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) &
 846		AVIVO_D1GRPH_SURFACE_UPDATE_PENDING);
 847}
 848
 849/* get temperature in millidegrees */
 850int rv770_get_temp(struct radeon_device *rdev)
 851{
 852	u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
 853		ASIC_T_SHIFT;
 854	int actual_temp;
 855
 856	if (temp & 0x400)
 857		actual_temp = -256;
 858	else if (temp & 0x200)
 859		actual_temp = 255;
 860	else if (temp & 0x100) {
 861		actual_temp = temp & 0x1ff;
 862		actual_temp |= ~0x1ff;
 863	} else
 864		actual_temp = temp & 0xff;
 865
 866	return (actual_temp * 1000) / 2;
 867}
 868
 869void rv770_pm_misc(struct radeon_device *rdev)
 870{
 871	int req_ps_idx = rdev->pm.requested_power_state_index;
 872	int req_cm_idx = rdev->pm.requested_clock_mode_index;
 873	struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
 874	struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
 875
 876	if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
 877		/* 0xff01 is a flag rather then an actual voltage */
 878		if (voltage->voltage == 0xff01)
 879			return;
 880		if (voltage->voltage != rdev->pm.current_vddc) {
 881			radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
 882			rdev->pm.current_vddc = voltage->voltage;
 883			DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
 884		}
 885	}
 886}
 887
 888/*
 889 * GART
 890 */
 891static int rv770_pcie_gart_enable(struct radeon_device *rdev)
 892{
 893	u32 tmp;
 894	int r, i;
 895
 896	if (rdev->gart.robj == NULL) {
 897		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
 898		return -EINVAL;
 899	}
 900	r = radeon_gart_table_vram_pin(rdev);
 901	if (r)
 902		return r;
 903	/* Setup L2 cache */
 904	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
 905				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
 906				EFFECTIVE_L2_QUEUE_SIZE(7));
 907	WREG32(VM_L2_CNTL2, 0);
 908	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
 909	/* Setup TLB control */
 910	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
 911		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
 912		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
 913		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
 914	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
 915	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
 916	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
 917	if (rdev->family == CHIP_RV740)
 918		WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
 919	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
 920	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
 921	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
 922	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
 923	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
 924	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
 925	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
 926	WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
 927				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
 928	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
 929			(u32)(rdev->dummy_page.addr >> 12));
 930	for (i = 1; i < 7; i++)
 931		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
 932
 933	r600_pcie_gart_tlb_flush(rdev);
 934	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
 935		 (unsigned)(rdev->mc.gtt_size >> 20),
 936		 (unsigned long long)rdev->gart.table_addr);
 937	rdev->gart.ready = true;
 938	return 0;
 939}
 940
 941static void rv770_pcie_gart_disable(struct radeon_device *rdev)
 942{
 943	u32 tmp;
 944	int i;
 945
 946	/* Disable all tables */
 947	for (i = 0; i < 7; i++)
 948		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
 949
 950	/* Setup L2 cache */
 951	WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
 952				EFFECTIVE_L2_QUEUE_SIZE(7));
 953	WREG32(VM_L2_CNTL2, 0);
 954	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
 955	/* Setup TLB control */
 956	tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
 957	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
 958	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
 959	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
 960	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
 961	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
 962	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
 963	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
 964	radeon_gart_table_vram_unpin(rdev);
 965}
 966
 967static void rv770_pcie_gart_fini(struct radeon_device *rdev)
 968{
 969	radeon_gart_fini(rdev);
 970	rv770_pcie_gart_disable(rdev);
 971	radeon_gart_table_vram_free(rdev);
 972}
 973
 974
 975static void rv770_agp_enable(struct radeon_device *rdev)
 976{
 977	u32 tmp;
 978	int i;
 979
 980	/* Setup L2 cache */
 981	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
 982				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
 983				EFFECTIVE_L2_QUEUE_SIZE(7));
 984	WREG32(VM_L2_CNTL2, 0);
 985	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
 986	/* Setup TLB control */
 987	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
 988		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
 989		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
 990		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
 991	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
 992	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
 993	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
 994	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
 995	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
 996	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
 997	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
 998	for (i = 0; i < 7; i++)
 999		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
1000}
1001
1002static void rv770_mc_program(struct radeon_device *rdev)
1003{
1004	struct rv515_mc_save save;
1005	u32 tmp;
1006	int i, j;
1007
1008	/* Initialize HDP */
1009	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
1010		WREG32((0x2c14 + j), 0x00000000);
1011		WREG32((0x2c18 + j), 0x00000000);
1012		WREG32((0x2c1c + j), 0x00000000);
1013		WREG32((0x2c20 + j), 0x00000000);
1014		WREG32((0x2c24 + j), 0x00000000);
1015	}
1016	/* r7xx hw bug.  Read from HDP_DEBUG1 rather
1017	 * than writing to HDP_REG_COHERENCY_FLUSH_CNTL
1018	 */
1019	tmp = RREG32(HDP_DEBUG1);
1020
1021	rv515_mc_stop(rdev, &save);
1022	if (r600_mc_wait_for_idle(rdev)) {
1023		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1024	}
1025	/* Lockout access through VGA aperture*/
1026	WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
1027	/* Update configuration */
1028	if (rdev->flags & RADEON_IS_AGP) {
1029		if (rdev->mc.vram_start < rdev->mc.gtt_start) {
1030			/* VRAM before AGP */
1031			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1032				rdev->mc.vram_start >> 12);
1033			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1034				rdev->mc.gtt_end >> 12);
1035		} else {
1036			/* VRAM after AGP */
1037			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1038				rdev->mc.gtt_start >> 12);
1039			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1040				rdev->mc.vram_end >> 12);
1041		}
1042	} else {
1043		WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1044			rdev->mc.vram_start >> 12);
1045		WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1046			rdev->mc.vram_end >> 12);
1047	}
1048	WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
1049	tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
1050	tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
1051	WREG32(MC_VM_FB_LOCATION, tmp);
1052	WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
1053	WREG32(HDP_NONSURFACE_INFO, (2 << 7));
1054	WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
1055	if (rdev->flags & RADEON_IS_AGP) {
1056		WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16);
1057		WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16);
1058		WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
1059	} else {
1060		WREG32(MC_VM_AGP_BASE, 0);
1061		WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
1062		WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
1063	}
1064	if (r600_mc_wait_for_idle(rdev)) {
1065		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1066	}
1067	rv515_mc_resume(rdev, &save);
1068	/* we need to own VRAM, so turn off the VGA renderer here
1069	 * to stop it overwriting our objects */
1070	rv515_vga_render_disable(rdev);
1071}
1072
1073
1074/*
1075 * CP.
1076 */
1077void r700_cp_stop(struct radeon_device *rdev)
1078{
1079	if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1080		radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1081	WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1082	WREG32(SCRATCH_UMSK, 0);
1083	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1084}
1085
1086static int rv770_cp_load_microcode(struct radeon_device *rdev)
1087{
1088	const __be32 *fw_data;
1089	int i;
1090
1091	if (!rdev->me_fw || !rdev->pfp_fw)
1092		return -EINVAL;
1093
1094	r700_cp_stop(rdev);
1095	WREG32(CP_RB_CNTL,
1096#ifdef __BIG_ENDIAN
1097	       BUF_SWAP_32BIT |
1098#endif
1099	       RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
1100
1101	/* Reset cp */
1102	WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
1103	RREG32(GRBM_SOFT_RESET);
1104	mdelay(15);
1105	WREG32(GRBM_SOFT_RESET, 0);
1106
1107	fw_data = (const __be32 *)rdev->pfp_fw->data;
1108	WREG32(CP_PFP_UCODE_ADDR, 0);
1109	for (i = 0; i < R700_PFP_UCODE_SIZE; i++)
1110		WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1111	WREG32(CP_PFP_UCODE_ADDR, 0);
1112
1113	fw_data = (const __be32 *)rdev->me_fw->data;
1114	WREG32(CP_ME_RAM_WADDR, 0);
1115	for (i = 0; i < R700_PM4_UCODE_SIZE; i++)
1116		WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1117
1118	WREG32(CP_PFP_UCODE_ADDR, 0);
1119	WREG32(CP_ME_RAM_WADDR, 0);
1120	WREG32(CP_ME_RAM_RADDR, 0);
1121	return 0;
1122}
1123
1124void r700_cp_fini(struct radeon_device *rdev)
1125{
1126	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1127	r700_cp_stop(rdev);
1128	radeon_ring_fini(rdev, ring);
1129	radeon_scratch_free(rdev, ring->rptr_save_reg);
1130}
1131
1132void rv770_set_clk_bypass_mode(struct radeon_device *rdev)
1133{
1134	u32 tmp, i;
1135
1136	if (rdev->flags & RADEON_IS_IGP)
1137		return;
1138
1139	tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
1140	tmp &= SCLK_MUX_SEL_MASK;
1141	tmp |= SCLK_MUX_SEL(1) | SCLK_MUX_UPDATE;
1142	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1143
1144	for (i = 0; i < rdev->usec_timeout; i++) {
1145		if (RREG32(CG_SPLL_STATUS) & SPLL_CHG_STATUS)
1146			break;
1147		udelay(1);
1148	}
1149
1150	tmp &= ~SCLK_MUX_UPDATE;
1151	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1152
1153	tmp = RREG32(MPLL_CNTL_MODE);
1154	if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730))
1155		tmp &= ~RV730_MPLL_MCLK_SEL;
1156	else
1157		tmp &= ~MPLL_MCLK_SEL;
1158	WREG32(MPLL_CNTL_MODE, tmp);
1159}
1160
1161/*
1162 * Core functions
1163 */
1164static void rv770_gpu_init(struct radeon_device *rdev)
1165{
1166	int i, j, num_qd_pipes;
1167	u32 ta_aux_cntl;
1168	u32 sx_debug_1;
1169	u32 smx_dc_ctl0;
1170	u32 db_debug3;
1171	u32 num_gs_verts_per_thread;
1172	u32 vgt_gs_per_es;
1173	u32 gs_prim_buffer_depth = 0;
1174	u32 sq_ms_fifo_sizes;
1175	u32 sq_config;
1176	u32 sq_thread_resource_mgmt;
1177	u32 hdp_host_path_cntl;
1178	u32 sq_dyn_gpr_size_simd_ab_0;
1179	u32 gb_tiling_config = 0;
1180	u32 cc_gc_shader_pipe_config = 0;
1181	u32 mc_arb_ramcfg;
1182	u32 db_debug4, tmp;
1183	u32 inactive_pipes, shader_pipe_config;
1184	u32 disabled_rb_mask;
1185	unsigned active_number;
1186
1187	/* setup chip specs */
1188	rdev->config.rv770.tiling_group_size = 256;
1189	switch (rdev->family) {
1190	case CHIP_RV770:
1191		rdev->config.rv770.max_pipes = 4;
1192		rdev->config.rv770.max_tile_pipes = 8;
1193		rdev->config.rv770.max_simds = 10;
1194		rdev->config.rv770.max_backends = 4;
1195		rdev->config.rv770.max_gprs = 256;
1196		rdev->config.rv770.max_threads = 248;
1197		rdev->config.rv770.max_stack_entries = 512;
1198		rdev->config.rv770.max_hw_contexts = 8;
1199		rdev->config.rv770.max_gs_threads = 16 * 2;
1200		rdev->config.rv770.sx_max_export_size = 128;
1201		rdev->config.rv770.sx_max_export_pos_size = 16;
1202		rdev->config.rv770.sx_max_export_smx_size = 112;
1203		rdev->config.rv770.sq_num_cf_insts = 2;
1204
1205		rdev->config.rv770.sx_num_of_sets = 7;
1206		rdev->config.rv770.sc_prim_fifo_size = 0xF9;
1207		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1208		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1209		break;
1210	case CHIP_RV730:
1211		rdev->config.rv770.max_pipes = 2;
1212		rdev->config.rv770.max_tile_pipes = 4;
1213		rdev->config.rv770.max_simds = 8;
1214		rdev->config.rv770.max_backends = 2;
1215		rdev->config.rv770.max_gprs = 128;
1216		rdev->config.rv770.max_threads = 248;
1217		rdev->config.rv770.max_stack_entries = 256;
1218		rdev->config.rv770.max_hw_contexts = 8;
1219		rdev->config.rv770.max_gs_threads = 16 * 2;
1220		rdev->config.rv770.sx_max_export_size = 256;
1221		rdev->config.rv770.sx_max_export_pos_size = 32;
1222		rdev->config.rv770.sx_max_export_smx_size = 224;
1223		rdev->config.rv770.sq_num_cf_insts = 2;
1224
1225		rdev->config.rv770.sx_num_of_sets = 7;
1226		rdev->config.rv770.sc_prim_fifo_size = 0xf9;
1227		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1228		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1229		if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1230			rdev->config.rv770.sx_max_export_pos_size -= 16;
1231			rdev->config.rv770.sx_max_export_smx_size += 16;
1232		}
1233		break;
1234	case CHIP_RV710:
1235		rdev->config.rv770.max_pipes = 2;
1236		rdev->config.rv770.max_tile_pipes = 2;
1237		rdev->config.rv770.max_simds = 2;
1238		rdev->config.rv770.max_backends = 1;
1239		rdev->config.rv770.max_gprs = 256;
1240		rdev->config.rv770.max_threads = 192;
1241		rdev->config.rv770.max_stack_entries = 256;
1242		rdev->config.rv770.max_hw_contexts = 4;
1243		rdev->config.rv770.max_gs_threads = 8 * 2;
1244		rdev->config.rv770.sx_max_export_size = 128;
1245		rdev->config.rv770.sx_max_export_pos_size = 16;
1246		rdev->config.rv770.sx_max_export_smx_size = 112;
1247		rdev->config.rv770.sq_num_cf_insts = 1;
1248
1249		rdev->config.rv770.sx_num_of_sets = 7;
1250		rdev->config.rv770.sc_prim_fifo_size = 0x40;
1251		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1252		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1253		break;
1254	case CHIP_RV740:
1255		rdev->config.rv770.max_pipes = 4;
1256		rdev->config.rv770.max_tile_pipes = 4;
1257		rdev->config.rv770.max_simds = 8;
1258		rdev->config.rv770.max_backends = 4;
1259		rdev->config.rv770.max_gprs = 256;
1260		rdev->config.rv770.max_threads = 248;
1261		rdev->config.rv770.max_stack_entries = 512;
1262		rdev->config.rv770.max_hw_contexts = 8;
1263		rdev->config.rv770.max_gs_threads = 16 * 2;
1264		rdev->config.rv770.sx_max_export_size = 256;
1265		rdev->config.rv770.sx_max_export_pos_size = 32;
1266		rdev->config.rv770.sx_max_export_smx_size = 224;
1267		rdev->config.rv770.sq_num_cf_insts = 2;
1268
1269		rdev->config.rv770.sx_num_of_sets = 7;
1270		rdev->config.rv770.sc_prim_fifo_size = 0x100;
1271		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1272		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1273
1274		if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1275			rdev->config.rv770.sx_max_export_pos_size -= 16;
1276			rdev->config.rv770.sx_max_export_smx_size += 16;
1277		}
1278		break;
1279	default:
1280		break;
1281	}
1282
1283	/* Initialize HDP */
1284	j = 0;
1285	for (i = 0; i < 32; i++) {
1286		WREG32((0x2c14 + j), 0x00000000);
1287		WREG32((0x2c18 + j), 0x00000000);
1288		WREG32((0x2c1c + j), 0x00000000);
1289		WREG32((0x2c20 + j), 0x00000000);
1290		WREG32((0x2c24 + j), 0x00000000);
1291		j += 0x18;
1292	}
1293
1294	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
1295
1296	/* setup tiling, simd, pipe config */
1297	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1298
1299	shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG);
1300	inactive_pipes = (shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT;
1301	for (i = 0, tmp = 1, active_number = 0; i < R7XX_MAX_PIPES; i++) {
1302		if (!(inactive_pipes & tmp)) {
1303			active_number++;
1304		}
1305		tmp <<= 1;
1306	}
1307	if (active_number == 1) {
1308		WREG32(SPI_CONFIG_CNTL, DISABLE_INTERP_1);
1309	} else {
1310		WREG32(SPI_CONFIG_CNTL, 0);
1311	}
1312
1313	cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
1314	tmp = rdev->config.rv770.max_simds -
1315		r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK);
1316	rdev->config.rv770.active_simds = tmp;
1317
1318	switch (rdev->config.rv770.max_tile_pipes) {
1319	case 1:
1320	default:
1321		gb_tiling_config = PIPE_TILING(0);
1322		break;
1323	case 2:
1324		gb_tiling_config = PIPE_TILING(1);
1325		break;
1326	case 4:
1327		gb_tiling_config = PIPE_TILING(2);
1328		break;
1329	case 8:
1330		gb_tiling_config = PIPE_TILING(3);
1331		break;
1332	}
1333	rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
1334
1335	disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK;
1336	tmp = 0;
1337	for (i = 0; i < rdev->config.rv770.max_backends; i++)
1338		tmp |= (1 << i);
1339	/* if all the backends are disabled, fix it up here */
1340	if ((disabled_rb_mask & tmp) == tmp) {
1341		for (i = 0; i < rdev->config.rv770.max_backends; i++)
1342			disabled_rb_mask &= ~(1 << i);
1343	}
1344	tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT;
1345	tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends,
1346					R7XX_MAX_BACKENDS, disabled_rb_mask);
1347	gb_tiling_config |= tmp << 16;
1348	rdev->config.rv770.backend_map = tmp;
1349
1350	if (rdev->family == CHIP_RV770)
1351		gb_tiling_config |= BANK_TILING(1);
1352	else {
1353		if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
1354			gb_tiling_config |= BANK_TILING(1);
1355		else
1356			gb_tiling_config |= BANK_TILING(0);
1357	}
1358	rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3);
1359	gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
1360	if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) {
1361		gb_tiling_config |= ROW_TILING(3);
1362		gb_tiling_config |= SAMPLE_SPLIT(3);
1363	} else {
1364		gb_tiling_config |=
1365			ROW_TILING(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1366		gb_tiling_config |=
1367			SAMPLE_SPLIT(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1368	}
1369
1370	gb_tiling_config |= BANK_SWAPS(1);
1371	rdev->config.rv770.tile_config = gb_tiling_config;
1372
1373	WREG32(GB_TILING_CONFIG, gb_tiling_config);
1374	WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1375	WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1376	WREG32(DMA_TILING_CONFIG, (gb_tiling_config & 0xffff));
1377	WREG32(DMA_TILING_CONFIG2, (gb_tiling_config & 0xffff));
1378	if (rdev->family == CHIP_RV730) {
1379		WREG32(UVD_UDEC_DB_TILING_CONFIG, (gb_tiling_config & 0xffff));
1380		WREG32(UVD_UDEC_DBW_TILING_CONFIG, (gb_tiling_config & 0xffff));
1381		WREG32(UVD_UDEC_TILING_CONFIG, (gb_tiling_config & 0xffff));
1382	}
1383
1384	WREG32(CGTS_SYS_TCC_DISABLE, 0);
1385	WREG32(CGTS_TCC_DISABLE, 0);
1386	WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
1387	WREG32(CGTS_USER_TCC_DISABLE, 0);
1388
1389
1390	num_qd_pipes = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8);
1391	WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK);
1392	WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK);
1393
1394	/* set HW defaults for 3D engine */
1395	WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
1396				     ROQ_IB2_START(0x2b)));
1397
1398	WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
1399
1400	ta_aux_cntl = RREG32(TA_CNTL_AUX);
1401	WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO);
1402
1403	sx_debug_1 = RREG32(SX_DEBUG_1);
1404	sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
1405	WREG32(SX_DEBUG_1, sx_debug_1);
1406
1407	smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
1408	smx_dc_ctl0 &= ~CACHE_DEPTH(0x1ff);
1409	smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1);
1410	WREG32(SMX_DC_CTL0, smx_dc_ctl0);
1411
1412	if (rdev->family != CHIP_RV740)
1413		WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
1414				       GS_FLUSH_CTL(4) |
1415				       ACK_FLUSH_CTL(3) |
1416				       SYNC_FLUSH_CTL));
1417
1418	if (rdev->family != CHIP_RV770)
1419		WREG32(SMX_SAR_CTL0, 0x00003f3f);
1420
1421	db_debug3 = RREG32(DB_DEBUG3);
1422	db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
1423	switch (rdev->family) {
1424	case CHIP_RV770:
1425	case CHIP_RV740:
1426		db_debug3 |= DB_CLK_OFF_DELAY(0x1f);
1427		break;
1428	case CHIP_RV710:
1429	case CHIP_RV730:
1430	default:
1431		db_debug3 |= DB_CLK_OFF_DELAY(2);
1432		break;
1433	}
1434	WREG32(DB_DEBUG3, db_debug3);
1435
1436	if (rdev->family != CHIP_RV770) {
1437		db_debug4 = RREG32(DB_DEBUG4);
1438		db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER;
1439		WREG32(DB_DEBUG4, db_debug4);
1440	}
1441
1442	WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.rv770.sx_max_export_size / 4) - 1) |
1443					POSITION_BUFFER_SIZE((rdev->config.rv770.sx_max_export_pos_size / 4) - 1) |
1444					SMX_BUFFER_SIZE((rdev->config.rv770.sx_max_export_smx_size / 4) - 1)));
1445
1446	WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.rv770.sc_prim_fifo_size) |
1447				 SC_HIZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_hiz_tile_fifo_size) |
1448				 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_earlyz_tile_fifo_fize)));
1449
1450	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1451
1452	WREG32(VGT_NUM_INSTANCES, 1);
1453
1454	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
1455
1456	WREG32(CP_PERFMON_CNTL, 0);
1457
1458	sq_ms_fifo_sizes = (CACHE_FIFO_SIZE(16 * rdev->config.rv770.sq_num_cf_insts) |
1459			    DONE_FIFO_HIWATER(0xe0) |
1460			    ALU_UPDATE_FIFO_HIWATER(0x8));
1461	switch (rdev->family) {
1462	case CHIP_RV770:
1463	case CHIP_RV730:
1464	case CHIP_RV710:
1465		sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
1466		break;
1467	case CHIP_RV740:
1468	default:
1469		sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4);
1470		break;
1471	}
1472	WREG32(SQ_MS_FIFO_SIZES, sq_ms_fifo_sizes);
1473
1474	/* SQ_CONFIG, SQ_GPR_RESOURCE_MGMT, SQ_THREAD_RESOURCE_MGMT, SQ_STACK_RESOURCE_MGMT
1475	 * should be adjusted as needed by the 2D/3D drivers.  This just sets default values
1476	 */
1477	sq_config = RREG32(SQ_CONFIG);
1478	sq_config &= ~(PS_PRIO(3) |
1479		       VS_PRIO(3) |
1480		       GS_PRIO(3) |
1481		       ES_PRIO(3));
1482	sq_config |= (DX9_CONSTS |
1483		      VC_ENABLE |
1484		      EXPORT_SRC_C |
1485		      PS_PRIO(0) |
1486		      VS_PRIO(1) |
1487		      GS_PRIO(2) |
1488		      ES_PRIO(3));
1489	if (rdev->family == CHIP_RV710)
1490		/* no vertex cache */
1491		sq_config &= ~VC_ENABLE;
1492
1493	WREG32(SQ_CONFIG, sq_config);
1494
1495	WREG32(SQ_GPR_RESOURCE_MGMT_1,  (NUM_PS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1496					 NUM_VS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1497					 NUM_CLAUSE_TEMP_GPRS(((rdev->config.rv770.max_gprs * 24)/64)/2)));
1498
1499	WREG32(SQ_GPR_RESOURCE_MGMT_2,  (NUM_GS_GPRS((rdev->config.rv770.max_gprs * 7)/64) |
1500					 NUM_ES_GPRS((rdev->config.rv770.max_gprs * 7)/64)));
1501
1502	sq_thread_resource_mgmt = (NUM_PS_THREADS((rdev->config.rv770.max_threads * 4)/8) |
1503				   NUM_VS_THREADS((rdev->config.rv770.max_threads * 2)/8) |
1504				   NUM_ES_THREADS((rdev->config.rv770.max_threads * 1)/8));
1505	if (((rdev->config.rv770.max_threads * 1) / 8) > rdev->config.rv770.max_gs_threads)
1506		sq_thread_resource_mgmt |= NUM_GS_THREADS(rdev->config.rv770.max_gs_threads);
1507	else
1508		sq_thread_resource_mgmt |= NUM_GS_THREADS((rdev->config.rv770.max_gs_threads * 1)/8);
1509	WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt);
1510
1511	WREG32(SQ_STACK_RESOURCE_MGMT_1, (NUM_PS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1512						     NUM_VS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1513
1514	WREG32(SQ_STACK_RESOURCE_MGMT_2, (NUM_GS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1515						     NUM_ES_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1516
1517	sq_dyn_gpr_size_simd_ab_0 = (SIMDA_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1518				     SIMDA_RING1((rdev->config.rv770.max_gprs * 38)/64) |
1519				     SIMDB_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1520				     SIMDB_RING1((rdev->config.rv770.max_gprs * 38)/64));
1521
1522	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_0, sq_dyn_gpr_size_simd_ab_0);
1523	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_1, sq_dyn_gpr_size_simd_ab_0);
1524	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_2, sq_dyn_gpr_size_simd_ab_0);
1525	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_3, sq_dyn_gpr_size_simd_ab_0);
1526	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_4, sq_dyn_gpr_size_simd_ab_0);
1527	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_5, sq_dyn_gpr_size_simd_ab_0);
1528	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_6, sq_dyn_gpr_size_simd_ab_0);
1529	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_7, sq_dyn_gpr_size_simd_ab_0);
1530
1531	WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1532					  FORCE_EOV_MAX_REZ_CNT(255)));
1533
1534	if (rdev->family == CHIP_RV710)
1535		WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(TC_ONLY) |
1536						AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1537	else
1538		WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(VC_AND_TC) |
1539						AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1540
1541	switch (rdev->family) {
1542	case CHIP_RV770:
1543	case CHIP_RV730:
1544	case CHIP_RV740:
1545		gs_prim_buffer_depth = 384;
1546		break;
1547	case CHIP_RV710:
1548		gs_prim_buffer_depth = 128;
1549		break;
1550	default:
1551		break;
1552	}
1553
1554	num_gs_verts_per_thread = rdev->config.rv770.max_pipes * 16;
1555	vgt_gs_per_es = gs_prim_buffer_depth + num_gs_verts_per_thread;
1556	/* Max value for this is 256 */
1557	if (vgt_gs_per_es > 256)
1558		vgt_gs_per_es = 256;
1559
1560	WREG32(VGT_ES_PER_GS, 128);
1561	WREG32(VGT_GS_PER_ES, vgt_gs_per_es);
1562	WREG32(VGT_GS_PER_VS, 2);
1563
1564	/* more default values. 2D/3D driver should adjust as needed */
1565	WREG32(VGT_GS_VERTEX_REUSE, 16);
1566	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1567	WREG32(VGT_STRMOUT_EN, 0);
1568	WREG32(SX_MISC, 0);
1569	WREG32(PA_SC_MODE_CNTL, 0);
1570	WREG32(PA_SC_EDGERULE, 0xaaaaaaaa);
1571	WREG32(PA_SC_AA_CONFIG, 0);
1572	WREG32(PA_SC_CLIPRECT_RULE, 0xffff);
1573	WREG32(PA_SC_LINE_STIPPLE, 0);
1574	WREG32(SPI_INPUT_Z, 0);
1575	WREG32(SPI_PS_IN_CONTROL_0, NUM_INTERP(2));
1576	WREG32(CB_COLOR7_FRAG, 0);
1577
1578	/* clear render buffer base addresses */
1579	WREG32(CB_COLOR0_BASE, 0);
1580	WREG32(CB_COLOR1_BASE, 0);
1581	WREG32(CB_COLOR2_BASE, 0);
1582	WREG32(CB_COLOR3_BASE, 0);
1583	WREG32(CB_COLOR4_BASE, 0);
1584	WREG32(CB_COLOR5_BASE, 0);
1585	WREG32(CB_COLOR6_BASE, 0);
1586	WREG32(CB_COLOR7_BASE, 0);
1587
1588	WREG32(TCP_CNTL, 0);
1589
1590	hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1591	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1592
1593	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1594
1595	WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
1596					  NUM_CLIP_SEQ(3)));
1597	WREG32(VC_ENHANCE, 0);
1598}
1599
1600void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
1601{
1602	u64 size_bf, size_af;
1603
1604	if (mc->mc_vram_size > 0xE0000000) {
1605		/* leave room for at least 512M GTT */
1606		dev_warn(rdev->dev, "limiting VRAM\n");
1607		mc->real_vram_size = 0xE0000000;
1608		mc->mc_vram_size = 0xE0000000;
1609	}
1610	if (rdev->flags & RADEON_IS_AGP) {
1611		size_bf = mc->gtt_start;
1612		size_af = mc->mc_mask - mc->gtt_end;
1613		if (size_bf > size_af) {
1614			if (mc->mc_vram_size > size_bf) {
1615				dev_warn(rdev->dev, "limiting VRAM\n");
1616				mc->real_vram_size = size_bf;
1617				mc->mc_vram_size = size_bf;
1618			}
1619			mc->vram_start = mc->gtt_start - mc->mc_vram_size;
1620		} else {
1621			if (mc->mc_vram_size > size_af) {
1622				dev_warn(rdev->dev, "limiting VRAM\n");
1623				mc->real_vram_size = size_af;
1624				mc->mc_vram_size = size_af;
1625			}
1626			mc->vram_start = mc->gtt_end + 1;
1627		}
1628		mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
1629		dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",
1630				mc->mc_vram_size >> 20, mc->vram_start,
1631				mc->vram_end, mc->real_vram_size >> 20);
1632	} else {
1633		radeon_vram_location(rdev, &rdev->mc, 0);
1634		rdev->mc.gtt_base_align = 0;
1635		radeon_gtt_location(rdev, mc);
1636	}
1637}
1638
1639static int rv770_mc_init(struct radeon_device *rdev)
1640{
1641	u32 tmp;
1642	int chansize, numchan;
1643
1644	/* Get VRAM informations */
1645	rdev->mc.vram_is_ddr = true;
1646	tmp = RREG32(MC_ARB_RAMCFG);
1647	if (tmp & CHANSIZE_OVERRIDE) {
1648		chansize = 16;
1649	} else if (tmp & CHANSIZE_MASK) {
1650		chansize = 64;
1651	} else {
1652		chansize = 32;
1653	}
1654	tmp = RREG32(MC_SHARED_CHMAP);
1655	switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
1656	case 0:
1657	default:
1658		numchan = 1;
1659		break;
1660	case 1:
1661		numchan = 2;
1662		break;
1663	case 2:
1664		numchan = 4;
1665		break;
1666	case 3:
1667		numchan = 8;
1668		break;
1669	}
1670	rdev->mc.vram_width = numchan * chansize;
1671	/* Could aper size report 0 ? */
1672	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
1673	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
1674	/* Setup GPU memory space */
1675	rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
1676	rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
1677	rdev->mc.visible_vram_size = rdev->mc.aper_size;
1678	r700_vram_gtt_location(rdev, &rdev->mc);
1679	radeon_update_bandwidth_info(rdev);
1680
1681	return 0;
1682}
1683
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1684static int rv770_startup(struct radeon_device *rdev)
1685{
1686	struct radeon_ring *ring;
1687	int r;
1688
1689	/* enable pcie gen2 link */
1690	rv770_pcie_gen2_enable(rdev);
1691
1692	/* scratch needs to be initialized before MC */
1693	r = r600_vram_scratch_init(rdev);
1694	if (r)
1695		return r;
1696
1697	rv770_mc_program(rdev);
1698
1699	if (rdev->flags & RADEON_IS_AGP) {
1700		rv770_agp_enable(rdev);
1701	} else {
1702		r = rv770_pcie_gart_enable(rdev);
1703		if (r)
1704			return r;
1705	}
1706
1707	rv770_gpu_init(rdev);
1708
1709	/* allocate wb buffer */
1710	r = radeon_wb_init(rdev);
1711	if (r)
1712		return r;
1713
1714	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
1715	if (r) {
1716		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1717		return r;
1718	}
1719
1720	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
1721	if (r) {
1722		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
1723		return r;
1724	}
1725
1726	r = uvd_v2_2_resume(rdev);
1727	if (!r) {
1728		r = radeon_fence_driver_start_ring(rdev,
1729						   R600_RING_TYPE_UVD_INDEX);
1730		if (r)
1731			dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
1732	}
1733
1734	if (r)
1735		rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
1736
1737	/* Enable IRQ */
1738	if (!rdev->irq.installed) {
1739		r = radeon_irq_kms_init(rdev);
1740		if (r)
1741			return r;
1742	}
1743
1744	r = r600_irq_init(rdev);
1745	if (r) {
1746		DRM_ERROR("radeon: IH init failed (%d).\n", r);
1747		radeon_irq_kms_fini(rdev);
1748		return r;
1749	}
1750	r600_irq_set(rdev);
1751
1752	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1753	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
1754			     RADEON_CP_PACKET2);
1755	if (r)
1756		return r;
1757
1758	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
1759	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
1760			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
1761	if (r)
1762		return r;
1763
1764	r = rv770_cp_load_microcode(rdev);
1765	if (r)
1766		return r;
1767	r = r600_cp_resume(rdev);
1768	if (r)
1769		return r;
1770
1771	r = r600_dma_resume(rdev);
1772	if (r)
1773		return r;
1774
1775	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
1776	if (ring->ring_size) {
1777		r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
1778				     RADEON_CP_PACKET2);
1779		if (!r)
1780			r = uvd_v1_0_init(rdev);
1781
1782		if (r)
1783			DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
1784	}
1785
1786	r = radeon_ib_pool_init(rdev);
1787	if (r) {
1788		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
1789		return r;
1790	}
1791
1792	r = radeon_audio_init(rdev);
1793	if (r) {
1794		DRM_ERROR("radeon: audio init failed\n");
1795		return r;
1796	}
1797
1798	return 0;
1799}
1800
1801int rv770_resume(struct radeon_device *rdev)
1802{
1803	int r;
1804
1805	/* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
1806	 * posting will perform necessary task to bring back GPU into good
1807	 * shape.
1808	 */
1809	/* post card */
1810	atom_asic_init(rdev->mode_info.atom_context);
1811
1812	/* init golden registers */
1813	rv770_init_golden_registers(rdev);
1814
1815	if (rdev->pm.pm_method == PM_METHOD_DPM)
1816		radeon_pm_resume(rdev);
1817
1818	rdev->accel_working = true;
1819	r = rv770_startup(rdev);
1820	if (r) {
1821		DRM_ERROR("r600 startup failed on resume\n");
1822		rdev->accel_working = false;
1823		return r;
1824	}
1825
1826	return r;
1827
1828}
1829
1830int rv770_suspend(struct radeon_device *rdev)
1831{
1832	radeon_pm_suspend(rdev);
1833	radeon_audio_fini(rdev);
1834	uvd_v1_0_fini(rdev);
1835	radeon_uvd_suspend(rdev);
 
 
1836	r700_cp_stop(rdev);
1837	r600_dma_stop(rdev);
1838	r600_irq_suspend(rdev);
1839	radeon_wb_disable(rdev);
1840	rv770_pcie_gart_disable(rdev);
1841
1842	return 0;
1843}
1844
1845/* Plan is to move initialization in that function and use
1846 * helper function so that radeon_device_init pretty much
1847 * do nothing more than calling asic specific function. This
1848 * should also allow to remove a bunch of callback function
1849 * like vram_info.
1850 */
1851int rv770_init(struct radeon_device *rdev)
1852{
1853	int r;
1854
1855	/* Read BIOS */
1856	if (!radeon_get_bios(rdev)) {
1857		if (ASIC_IS_AVIVO(rdev))
1858			return -EINVAL;
1859	}
1860	/* Must be an ATOMBIOS */
1861	if (!rdev->is_atom_bios) {
1862		dev_err(rdev->dev, "Expecting atombios for R600 GPU\n");
1863		return -EINVAL;
1864	}
1865	r = radeon_atombios_init(rdev);
1866	if (r)
1867		return r;
1868	/* Post card if necessary */
1869	if (!radeon_card_posted(rdev)) {
1870		if (!rdev->bios) {
1871			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
1872			return -EINVAL;
1873		}
1874		DRM_INFO("GPU not posted. posting now...\n");
1875		atom_asic_init(rdev->mode_info.atom_context);
1876	}
1877	/* init golden registers */
1878	rv770_init_golden_registers(rdev);
1879	/* Initialize scratch registers */
1880	r600_scratch_init(rdev);
1881	/* Initialize surface registers */
1882	radeon_surface_init(rdev);
1883	/* Initialize clocks */
1884	radeon_get_clock_info(rdev->ddev);
1885	/* Fence driver */
1886	r = radeon_fence_driver_init(rdev);
1887	if (r)
1888		return r;
1889	/* initialize AGP */
1890	if (rdev->flags & RADEON_IS_AGP) {
1891		r = radeon_agp_init(rdev);
1892		if (r)
1893			radeon_agp_disable(rdev);
1894	}
1895	r = rv770_mc_init(rdev);
1896	if (r)
1897		return r;
1898	/* Memory manager */
1899	r = radeon_bo_init(rdev);
1900	if (r)
1901		return r;
1902
1903	if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
1904		r = r600_init_microcode(rdev);
1905		if (r) {
1906			DRM_ERROR("Failed to load firmware!\n");
1907			return r;
1908		}
1909	}
1910
1911	/* Initialize power management */
1912	radeon_pm_init(rdev);
1913
1914	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
1915	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
1916
1917	rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
1918	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
1919
1920	r = radeon_uvd_init(rdev);
1921	if (!r) {
1922		rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
1923		r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX],
1924			       4096);
1925	}
1926
1927	rdev->ih.ring_obj = NULL;
1928	r600_ih_ring_init(rdev, 64 * 1024);
1929
1930	r = r600_pcie_gart_init(rdev);
1931	if (r)
1932		return r;
1933
1934	rdev->accel_working = true;
1935	r = rv770_startup(rdev);
1936	if (r) {
1937		dev_err(rdev->dev, "disabling GPU acceleration\n");
1938		r700_cp_fini(rdev);
1939		r600_dma_fini(rdev);
1940		r600_irq_fini(rdev);
1941		radeon_wb_fini(rdev);
1942		radeon_ib_pool_fini(rdev);
1943		radeon_irq_kms_fini(rdev);
1944		rv770_pcie_gart_fini(rdev);
1945		rdev->accel_working = false;
1946	}
1947
1948	return 0;
1949}
1950
1951void rv770_fini(struct radeon_device *rdev)
1952{
1953	radeon_pm_fini(rdev);
1954	r700_cp_fini(rdev);
1955	r600_dma_fini(rdev);
1956	r600_irq_fini(rdev);
1957	radeon_wb_fini(rdev);
1958	radeon_ib_pool_fini(rdev);
1959	radeon_irq_kms_fini(rdev);
1960	uvd_v1_0_fini(rdev);
1961	radeon_uvd_fini(rdev);
1962	rv770_pcie_gart_fini(rdev);
1963	r600_vram_scratch_fini(rdev);
1964	radeon_gem_fini(rdev);
1965	radeon_fence_driver_fini(rdev);
1966	radeon_agp_fini(rdev);
1967	radeon_bo_fini(rdev);
1968	radeon_atombios_fini(rdev);
1969	kfree(rdev->bios);
1970	rdev->bios = NULL;
1971}
1972
1973static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
1974{
1975	u32 link_width_cntl, lanes, speed_cntl, tmp;
1976	u16 link_cntl2;
1977
1978	if (radeon_pcie_gen2 == 0)
1979		return;
1980
1981	if (rdev->flags & RADEON_IS_IGP)
1982		return;
1983
1984	if (!(rdev->flags & RADEON_IS_PCIE))
1985		return;
1986
1987	/* x2 cards have a special sequence */
1988	if (ASIC_IS_X2(rdev))
1989		return;
1990
1991	if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) &&
1992		(rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))
1993		return;
1994
1995	DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
1996
1997	/* advertise upconfig capability */
1998	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1999	link_width_cntl &= ~LC_UPCONFIGURE_DIS;
2000	WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2001	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2002	if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) {
2003		lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT;
2004		link_width_cntl &= ~(LC_LINK_WIDTH_MASK |
2005				     LC_RECONFIG_ARC_MISSING_ESCAPE);
2006		link_width_cntl |= lanes | LC_RECONFIG_NOW |
2007			LC_RENEGOTIATE_EN | LC_UPCONFIGURE_SUPPORT;
2008		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2009	} else {
2010		link_width_cntl |= LC_UPCONFIGURE_DIS;
2011		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2012	}
2013
2014	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2015	if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
2016	    (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
2017
2018		tmp = RREG32(0x541c);
2019		WREG32(0x541c, tmp | 0x8);
2020		WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN);
2021		link_cntl2 = RREG16(0x4088);
2022		link_cntl2 &= ~TARGET_LINK_SPEED_MASK;
2023		link_cntl2 |= 0x2;
2024		WREG16(0x4088, link_cntl2);
2025		WREG32(MM_CFGREGS_CNTL, 0);
2026
2027		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2028		speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
2029		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2030
2031		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2032		speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT;
2033		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2034
2035		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2036		speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
2037		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2038
2039		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2040		speed_cntl |= LC_GEN2_EN_STRAP;
2041		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2042
2043	} else {
2044		link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2045		/* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
2046		if (1)
2047			link_width_cntl |= LC_UPCONFIGURE_DIS;
2048		else
2049			link_width_cntl &= ~LC_UPCONFIGURE_DIS;
2050		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2051	}
2052}
v4.17
   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/slab.h>
  30#include <drm/drmP.h>
  31#include "radeon.h"
  32#include "radeon_asic.h"
  33#include "radeon_audio.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
 804void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, bool async)
 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	WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset,
 816	       async ? AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
 817	if (radeon_crtc->crtc_id) {
 818		WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
 819		WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
 820	} else {
 821		WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
 822		WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
 823	}
 824	WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
 825	       (u32)crtc_base);
 826	WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
 827	       (u32)crtc_base);
 828
 829	/* Wait for update_pending to go high. */
 830	for (i = 0; i < rdev->usec_timeout; i++) {
 831		if (RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING)
 832			break;
 833		udelay(1);
 834	}
 835	DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
 836
 837	/* Unlock the lock, so double-buffering can take place inside vblank */
 838	tmp &= ~AVIVO_D1GRPH_UPDATE_LOCK;
 839	WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
 840}
 841
 842bool rv770_page_flip_pending(struct radeon_device *rdev, int crtc_id)
 843{
 844	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
 845
 846	/* Return current update_pending status: */
 847	return !!(RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) &
 848		AVIVO_D1GRPH_SURFACE_UPDATE_PENDING);
 849}
 850
 851/* get temperature in millidegrees */
 852int rv770_get_temp(struct radeon_device *rdev)
 853{
 854	u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
 855		ASIC_T_SHIFT;
 856	int actual_temp;
 857
 858	if (temp & 0x400)
 859		actual_temp = -256;
 860	else if (temp & 0x200)
 861		actual_temp = 255;
 862	else if (temp & 0x100) {
 863		actual_temp = temp & 0x1ff;
 864		actual_temp |= ~0x1ff;
 865	} else
 866		actual_temp = temp & 0xff;
 867
 868	return (actual_temp * 1000) / 2;
 869}
 870
 871void rv770_pm_misc(struct radeon_device *rdev)
 872{
 873	int req_ps_idx = rdev->pm.requested_power_state_index;
 874	int req_cm_idx = rdev->pm.requested_clock_mode_index;
 875	struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
 876	struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
 877
 878	if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
 879		/* 0xff01 is a flag rather then an actual voltage */
 880		if (voltage->voltage == 0xff01)
 881			return;
 882		if (voltage->voltage != rdev->pm.current_vddc) {
 883			radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
 884			rdev->pm.current_vddc = voltage->voltage;
 885			DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
 886		}
 887	}
 888}
 889
 890/*
 891 * GART
 892 */
 893static int rv770_pcie_gart_enable(struct radeon_device *rdev)
 894{
 895	u32 tmp;
 896	int r, i;
 897
 898	if (rdev->gart.robj == NULL) {
 899		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
 900		return -EINVAL;
 901	}
 902	r = radeon_gart_table_vram_pin(rdev);
 903	if (r)
 904		return r;
 905	/* Setup L2 cache */
 906	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
 907				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
 908				EFFECTIVE_L2_QUEUE_SIZE(7));
 909	WREG32(VM_L2_CNTL2, 0);
 910	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
 911	/* Setup TLB control */
 912	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
 913		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
 914		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
 915		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
 916	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
 917	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
 918	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
 919	if (rdev->family == CHIP_RV740)
 920		WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
 921	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
 922	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
 923	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
 924	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
 925	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
 926	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
 927	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
 928	WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
 929				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
 930	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
 931			(u32)(rdev->dummy_page.addr >> 12));
 932	for (i = 1; i < 7; i++)
 933		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
 934
 935	r600_pcie_gart_tlb_flush(rdev);
 936	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
 937		 (unsigned)(rdev->mc.gtt_size >> 20),
 938		 (unsigned long long)rdev->gart.table_addr);
 939	rdev->gart.ready = true;
 940	return 0;
 941}
 942
 943static void rv770_pcie_gart_disable(struct radeon_device *rdev)
 944{
 945	u32 tmp;
 946	int i;
 947
 948	/* Disable all tables */
 949	for (i = 0; i < 7; i++)
 950		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
 951
 952	/* Setup L2 cache */
 953	WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
 954				EFFECTIVE_L2_QUEUE_SIZE(7));
 955	WREG32(VM_L2_CNTL2, 0);
 956	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
 957	/* Setup TLB control */
 958	tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
 959	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
 960	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
 961	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
 962	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
 963	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
 964	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
 965	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
 966	radeon_gart_table_vram_unpin(rdev);
 967}
 968
 969static void rv770_pcie_gart_fini(struct radeon_device *rdev)
 970{
 971	radeon_gart_fini(rdev);
 972	rv770_pcie_gart_disable(rdev);
 973	radeon_gart_table_vram_free(rdev);
 974}
 975
 976
 977static void rv770_agp_enable(struct radeon_device *rdev)
 978{
 979	u32 tmp;
 980	int i;
 981
 982	/* Setup L2 cache */
 983	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
 984				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
 985				EFFECTIVE_L2_QUEUE_SIZE(7));
 986	WREG32(VM_L2_CNTL2, 0);
 987	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
 988	/* Setup TLB control */
 989	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
 990		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
 991		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
 992		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
 993	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
 994	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
 995	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
 996	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
 997	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
 998	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
 999	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
1000	for (i = 0; i < 7; i++)
1001		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
1002}
1003
1004static void rv770_mc_program(struct radeon_device *rdev)
1005{
1006	struct rv515_mc_save save;
1007	u32 tmp;
1008	int i, j;
1009
1010	/* Initialize HDP */
1011	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
1012		WREG32((0x2c14 + j), 0x00000000);
1013		WREG32((0x2c18 + j), 0x00000000);
1014		WREG32((0x2c1c + j), 0x00000000);
1015		WREG32((0x2c20 + j), 0x00000000);
1016		WREG32((0x2c24 + j), 0x00000000);
1017	}
1018	/* r7xx hw bug.  Read from HDP_DEBUG1 rather
1019	 * than writing to HDP_REG_COHERENCY_FLUSH_CNTL
1020	 */
1021	tmp = RREG32(HDP_DEBUG1);
1022
1023	rv515_mc_stop(rdev, &save);
1024	if (r600_mc_wait_for_idle(rdev)) {
1025		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1026	}
1027	/* Lockout access through VGA aperture*/
1028	WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
1029	/* Update configuration */
1030	if (rdev->flags & RADEON_IS_AGP) {
1031		if (rdev->mc.vram_start < rdev->mc.gtt_start) {
1032			/* VRAM before AGP */
1033			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1034				rdev->mc.vram_start >> 12);
1035			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1036				rdev->mc.gtt_end >> 12);
1037		} else {
1038			/* VRAM after AGP */
1039			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1040				rdev->mc.gtt_start >> 12);
1041			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1042				rdev->mc.vram_end >> 12);
1043		}
1044	} else {
1045		WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
1046			rdev->mc.vram_start >> 12);
1047		WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
1048			rdev->mc.vram_end >> 12);
1049	}
1050	WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
1051	tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
1052	tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
1053	WREG32(MC_VM_FB_LOCATION, tmp);
1054	WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
1055	WREG32(HDP_NONSURFACE_INFO, (2 << 7));
1056	WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
1057	if (rdev->flags & RADEON_IS_AGP) {
1058		WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16);
1059		WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16);
1060		WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
1061	} else {
1062		WREG32(MC_VM_AGP_BASE, 0);
1063		WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
1064		WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
1065	}
1066	if (r600_mc_wait_for_idle(rdev)) {
1067		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1068	}
1069	rv515_mc_resume(rdev, &save);
1070	/* we need to own VRAM, so turn off the VGA renderer here
1071	 * to stop it overwriting our objects */
1072	rv515_vga_render_disable(rdev);
1073}
1074
1075
1076/*
1077 * CP.
1078 */
1079void r700_cp_stop(struct radeon_device *rdev)
1080{
1081	if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1082		radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1083	WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1084	WREG32(SCRATCH_UMSK, 0);
1085	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1086}
1087
1088static int rv770_cp_load_microcode(struct radeon_device *rdev)
1089{
1090	const __be32 *fw_data;
1091	int i;
1092
1093	if (!rdev->me_fw || !rdev->pfp_fw)
1094		return -EINVAL;
1095
1096	r700_cp_stop(rdev);
1097	WREG32(CP_RB_CNTL,
1098#ifdef __BIG_ENDIAN
1099	       BUF_SWAP_32BIT |
1100#endif
1101	       RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
1102
1103	/* Reset cp */
1104	WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
1105	RREG32(GRBM_SOFT_RESET);
1106	mdelay(15);
1107	WREG32(GRBM_SOFT_RESET, 0);
1108
1109	fw_data = (const __be32 *)rdev->pfp_fw->data;
1110	WREG32(CP_PFP_UCODE_ADDR, 0);
1111	for (i = 0; i < R700_PFP_UCODE_SIZE; i++)
1112		WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1113	WREG32(CP_PFP_UCODE_ADDR, 0);
1114
1115	fw_data = (const __be32 *)rdev->me_fw->data;
1116	WREG32(CP_ME_RAM_WADDR, 0);
1117	for (i = 0; i < R700_PM4_UCODE_SIZE; i++)
1118		WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1119
1120	WREG32(CP_PFP_UCODE_ADDR, 0);
1121	WREG32(CP_ME_RAM_WADDR, 0);
1122	WREG32(CP_ME_RAM_RADDR, 0);
1123	return 0;
1124}
1125
1126void r700_cp_fini(struct radeon_device *rdev)
1127{
1128	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1129	r700_cp_stop(rdev);
1130	radeon_ring_fini(rdev, ring);
1131	radeon_scratch_free(rdev, ring->rptr_save_reg);
1132}
1133
1134void rv770_set_clk_bypass_mode(struct radeon_device *rdev)
1135{
1136	u32 tmp, i;
1137
1138	if (rdev->flags & RADEON_IS_IGP)
1139		return;
1140
1141	tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
1142	tmp &= SCLK_MUX_SEL_MASK;
1143	tmp |= SCLK_MUX_SEL(1) | SCLK_MUX_UPDATE;
1144	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1145
1146	for (i = 0; i < rdev->usec_timeout; i++) {
1147		if (RREG32(CG_SPLL_STATUS) & SPLL_CHG_STATUS)
1148			break;
1149		udelay(1);
1150	}
1151
1152	tmp &= ~SCLK_MUX_UPDATE;
1153	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
1154
1155	tmp = RREG32(MPLL_CNTL_MODE);
1156	if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730))
1157		tmp &= ~RV730_MPLL_MCLK_SEL;
1158	else
1159		tmp &= ~MPLL_MCLK_SEL;
1160	WREG32(MPLL_CNTL_MODE, tmp);
1161}
1162
1163/*
1164 * Core functions
1165 */
1166static void rv770_gpu_init(struct radeon_device *rdev)
1167{
1168	int i, j, num_qd_pipes;
1169	u32 ta_aux_cntl;
1170	u32 sx_debug_1;
1171	u32 smx_dc_ctl0;
1172	u32 db_debug3;
1173	u32 num_gs_verts_per_thread;
1174	u32 vgt_gs_per_es;
1175	u32 gs_prim_buffer_depth = 0;
1176	u32 sq_ms_fifo_sizes;
1177	u32 sq_config;
1178	u32 sq_thread_resource_mgmt;
1179	u32 hdp_host_path_cntl;
1180	u32 sq_dyn_gpr_size_simd_ab_0;
1181	u32 gb_tiling_config = 0;
1182	u32 cc_gc_shader_pipe_config = 0;
1183	u32 mc_arb_ramcfg;
1184	u32 db_debug4, tmp;
1185	u32 inactive_pipes, shader_pipe_config;
1186	u32 disabled_rb_mask;
1187	unsigned active_number;
1188
1189	/* setup chip specs */
1190	rdev->config.rv770.tiling_group_size = 256;
1191	switch (rdev->family) {
1192	case CHIP_RV770:
1193		rdev->config.rv770.max_pipes = 4;
1194		rdev->config.rv770.max_tile_pipes = 8;
1195		rdev->config.rv770.max_simds = 10;
1196		rdev->config.rv770.max_backends = 4;
1197		rdev->config.rv770.max_gprs = 256;
1198		rdev->config.rv770.max_threads = 248;
1199		rdev->config.rv770.max_stack_entries = 512;
1200		rdev->config.rv770.max_hw_contexts = 8;
1201		rdev->config.rv770.max_gs_threads = 16 * 2;
1202		rdev->config.rv770.sx_max_export_size = 128;
1203		rdev->config.rv770.sx_max_export_pos_size = 16;
1204		rdev->config.rv770.sx_max_export_smx_size = 112;
1205		rdev->config.rv770.sq_num_cf_insts = 2;
1206
1207		rdev->config.rv770.sx_num_of_sets = 7;
1208		rdev->config.rv770.sc_prim_fifo_size = 0xF9;
1209		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1210		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1211		break;
1212	case CHIP_RV730:
1213		rdev->config.rv770.max_pipes = 2;
1214		rdev->config.rv770.max_tile_pipes = 4;
1215		rdev->config.rv770.max_simds = 8;
1216		rdev->config.rv770.max_backends = 2;
1217		rdev->config.rv770.max_gprs = 128;
1218		rdev->config.rv770.max_threads = 248;
1219		rdev->config.rv770.max_stack_entries = 256;
1220		rdev->config.rv770.max_hw_contexts = 8;
1221		rdev->config.rv770.max_gs_threads = 16 * 2;
1222		rdev->config.rv770.sx_max_export_size = 256;
1223		rdev->config.rv770.sx_max_export_pos_size = 32;
1224		rdev->config.rv770.sx_max_export_smx_size = 224;
1225		rdev->config.rv770.sq_num_cf_insts = 2;
1226
1227		rdev->config.rv770.sx_num_of_sets = 7;
1228		rdev->config.rv770.sc_prim_fifo_size = 0xf9;
1229		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1230		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1231		if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1232			rdev->config.rv770.sx_max_export_pos_size -= 16;
1233			rdev->config.rv770.sx_max_export_smx_size += 16;
1234		}
1235		break;
1236	case CHIP_RV710:
1237		rdev->config.rv770.max_pipes = 2;
1238		rdev->config.rv770.max_tile_pipes = 2;
1239		rdev->config.rv770.max_simds = 2;
1240		rdev->config.rv770.max_backends = 1;
1241		rdev->config.rv770.max_gprs = 256;
1242		rdev->config.rv770.max_threads = 192;
1243		rdev->config.rv770.max_stack_entries = 256;
1244		rdev->config.rv770.max_hw_contexts = 4;
1245		rdev->config.rv770.max_gs_threads = 8 * 2;
1246		rdev->config.rv770.sx_max_export_size = 128;
1247		rdev->config.rv770.sx_max_export_pos_size = 16;
1248		rdev->config.rv770.sx_max_export_smx_size = 112;
1249		rdev->config.rv770.sq_num_cf_insts = 1;
1250
1251		rdev->config.rv770.sx_num_of_sets = 7;
1252		rdev->config.rv770.sc_prim_fifo_size = 0x40;
1253		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1254		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1255		break;
1256	case CHIP_RV740:
1257		rdev->config.rv770.max_pipes = 4;
1258		rdev->config.rv770.max_tile_pipes = 4;
1259		rdev->config.rv770.max_simds = 8;
1260		rdev->config.rv770.max_backends = 4;
1261		rdev->config.rv770.max_gprs = 256;
1262		rdev->config.rv770.max_threads = 248;
1263		rdev->config.rv770.max_stack_entries = 512;
1264		rdev->config.rv770.max_hw_contexts = 8;
1265		rdev->config.rv770.max_gs_threads = 16 * 2;
1266		rdev->config.rv770.sx_max_export_size = 256;
1267		rdev->config.rv770.sx_max_export_pos_size = 32;
1268		rdev->config.rv770.sx_max_export_smx_size = 224;
1269		rdev->config.rv770.sq_num_cf_insts = 2;
1270
1271		rdev->config.rv770.sx_num_of_sets = 7;
1272		rdev->config.rv770.sc_prim_fifo_size = 0x100;
1273		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
1274		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
1275
1276		if (rdev->config.rv770.sx_max_export_pos_size > 16) {
1277			rdev->config.rv770.sx_max_export_pos_size -= 16;
1278			rdev->config.rv770.sx_max_export_smx_size += 16;
1279		}
1280		break;
1281	default:
1282		break;
1283	}
1284
1285	/* Initialize HDP */
1286	j = 0;
1287	for (i = 0; i < 32; i++) {
1288		WREG32((0x2c14 + j), 0x00000000);
1289		WREG32((0x2c18 + j), 0x00000000);
1290		WREG32((0x2c1c + j), 0x00000000);
1291		WREG32((0x2c20 + j), 0x00000000);
1292		WREG32((0x2c24 + j), 0x00000000);
1293		j += 0x18;
1294	}
1295
1296	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
1297
1298	/* setup tiling, simd, pipe config */
1299	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1300
1301	shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG);
1302	inactive_pipes = (shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT;
1303	for (i = 0, tmp = 1, active_number = 0; i < R7XX_MAX_PIPES; i++) {
1304		if (!(inactive_pipes & tmp)) {
1305			active_number++;
1306		}
1307		tmp <<= 1;
1308	}
1309	if (active_number == 1) {
1310		WREG32(SPI_CONFIG_CNTL, DISABLE_INTERP_1);
1311	} else {
1312		WREG32(SPI_CONFIG_CNTL, 0);
1313	}
1314
1315	cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
1316	tmp = rdev->config.rv770.max_simds -
1317		r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK);
1318	rdev->config.rv770.active_simds = tmp;
1319
1320	switch (rdev->config.rv770.max_tile_pipes) {
1321	case 1:
1322	default:
1323		gb_tiling_config = PIPE_TILING(0);
1324		break;
1325	case 2:
1326		gb_tiling_config = PIPE_TILING(1);
1327		break;
1328	case 4:
1329		gb_tiling_config = PIPE_TILING(2);
1330		break;
1331	case 8:
1332		gb_tiling_config = PIPE_TILING(3);
1333		break;
1334	}
1335	rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
1336
1337	disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK;
1338	tmp = 0;
1339	for (i = 0; i < rdev->config.rv770.max_backends; i++)
1340		tmp |= (1 << i);
1341	/* if all the backends are disabled, fix it up here */
1342	if ((disabled_rb_mask & tmp) == tmp) {
1343		for (i = 0; i < rdev->config.rv770.max_backends; i++)
1344			disabled_rb_mask &= ~(1 << i);
1345	}
1346	tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT;
1347	tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends,
1348					R7XX_MAX_BACKENDS, disabled_rb_mask);
1349	gb_tiling_config |= tmp << 16;
1350	rdev->config.rv770.backend_map = tmp;
1351
1352	if (rdev->family == CHIP_RV770)
1353		gb_tiling_config |= BANK_TILING(1);
1354	else {
1355		if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
1356			gb_tiling_config |= BANK_TILING(1);
1357		else
1358			gb_tiling_config |= BANK_TILING(0);
1359	}
1360	rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3);
1361	gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
1362	if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) {
1363		gb_tiling_config |= ROW_TILING(3);
1364		gb_tiling_config |= SAMPLE_SPLIT(3);
1365	} else {
1366		gb_tiling_config |=
1367			ROW_TILING(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1368		gb_tiling_config |=
1369			SAMPLE_SPLIT(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
1370	}
1371
1372	gb_tiling_config |= BANK_SWAPS(1);
1373	rdev->config.rv770.tile_config = gb_tiling_config;
1374
1375	WREG32(GB_TILING_CONFIG, gb_tiling_config);
1376	WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1377	WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff));
1378	WREG32(DMA_TILING_CONFIG, (gb_tiling_config & 0xffff));
1379	WREG32(DMA_TILING_CONFIG2, (gb_tiling_config & 0xffff));
1380	if (rdev->family == CHIP_RV730) {
1381		WREG32(UVD_UDEC_DB_TILING_CONFIG, (gb_tiling_config & 0xffff));
1382		WREG32(UVD_UDEC_DBW_TILING_CONFIG, (gb_tiling_config & 0xffff));
1383		WREG32(UVD_UDEC_TILING_CONFIG, (gb_tiling_config & 0xffff));
1384	}
1385
1386	WREG32(CGTS_SYS_TCC_DISABLE, 0);
1387	WREG32(CGTS_TCC_DISABLE, 0);
1388	WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
1389	WREG32(CGTS_USER_TCC_DISABLE, 0);
1390
1391
1392	num_qd_pipes = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8);
1393	WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK);
1394	WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK);
1395
1396	/* set HW defaults for 3D engine */
1397	WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
1398				     ROQ_IB2_START(0x2b)));
1399
1400	WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
1401
1402	ta_aux_cntl = RREG32(TA_CNTL_AUX);
1403	WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO);
1404
1405	sx_debug_1 = RREG32(SX_DEBUG_1);
1406	sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
1407	WREG32(SX_DEBUG_1, sx_debug_1);
1408
1409	smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
1410	smx_dc_ctl0 &= ~CACHE_DEPTH(0x1ff);
1411	smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1);
1412	WREG32(SMX_DC_CTL0, smx_dc_ctl0);
1413
1414	if (rdev->family != CHIP_RV740)
1415		WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
1416				       GS_FLUSH_CTL(4) |
1417				       ACK_FLUSH_CTL(3) |
1418				       SYNC_FLUSH_CTL));
1419
1420	if (rdev->family != CHIP_RV770)
1421		WREG32(SMX_SAR_CTL0, 0x00003f3f);
1422
1423	db_debug3 = RREG32(DB_DEBUG3);
1424	db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
1425	switch (rdev->family) {
1426	case CHIP_RV770:
1427	case CHIP_RV740:
1428		db_debug3 |= DB_CLK_OFF_DELAY(0x1f);
1429		break;
1430	case CHIP_RV710:
1431	case CHIP_RV730:
1432	default:
1433		db_debug3 |= DB_CLK_OFF_DELAY(2);
1434		break;
1435	}
1436	WREG32(DB_DEBUG3, db_debug3);
1437
1438	if (rdev->family != CHIP_RV770) {
1439		db_debug4 = RREG32(DB_DEBUG4);
1440		db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER;
1441		WREG32(DB_DEBUG4, db_debug4);
1442	}
1443
1444	WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.rv770.sx_max_export_size / 4) - 1) |
1445					POSITION_BUFFER_SIZE((rdev->config.rv770.sx_max_export_pos_size / 4) - 1) |
1446					SMX_BUFFER_SIZE((rdev->config.rv770.sx_max_export_smx_size / 4) - 1)));
1447
1448	WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.rv770.sc_prim_fifo_size) |
1449				 SC_HIZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_hiz_tile_fifo_size) |
1450				 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_earlyz_tile_fifo_fize)));
1451
1452	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1453
1454	WREG32(VGT_NUM_INSTANCES, 1);
1455
1456	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
1457
1458	WREG32(CP_PERFMON_CNTL, 0);
1459
1460	sq_ms_fifo_sizes = (CACHE_FIFO_SIZE(16 * rdev->config.rv770.sq_num_cf_insts) |
1461			    DONE_FIFO_HIWATER(0xe0) |
1462			    ALU_UPDATE_FIFO_HIWATER(0x8));
1463	switch (rdev->family) {
1464	case CHIP_RV770:
1465	case CHIP_RV730:
1466	case CHIP_RV710:
1467		sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
1468		break;
1469	case CHIP_RV740:
1470	default:
1471		sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4);
1472		break;
1473	}
1474	WREG32(SQ_MS_FIFO_SIZES, sq_ms_fifo_sizes);
1475
1476	/* SQ_CONFIG, SQ_GPR_RESOURCE_MGMT, SQ_THREAD_RESOURCE_MGMT, SQ_STACK_RESOURCE_MGMT
1477	 * should be adjusted as needed by the 2D/3D drivers.  This just sets default values
1478	 */
1479	sq_config = RREG32(SQ_CONFIG);
1480	sq_config &= ~(PS_PRIO(3) |
1481		       VS_PRIO(3) |
1482		       GS_PRIO(3) |
1483		       ES_PRIO(3));
1484	sq_config |= (DX9_CONSTS |
1485		      VC_ENABLE |
1486		      EXPORT_SRC_C |
1487		      PS_PRIO(0) |
1488		      VS_PRIO(1) |
1489		      GS_PRIO(2) |
1490		      ES_PRIO(3));
1491	if (rdev->family == CHIP_RV710)
1492		/* no vertex cache */
1493		sq_config &= ~VC_ENABLE;
1494
1495	WREG32(SQ_CONFIG, sq_config);
1496
1497	WREG32(SQ_GPR_RESOURCE_MGMT_1,  (NUM_PS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1498					 NUM_VS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
1499					 NUM_CLAUSE_TEMP_GPRS(((rdev->config.rv770.max_gprs * 24)/64)/2)));
1500
1501	WREG32(SQ_GPR_RESOURCE_MGMT_2,  (NUM_GS_GPRS((rdev->config.rv770.max_gprs * 7)/64) |
1502					 NUM_ES_GPRS((rdev->config.rv770.max_gprs * 7)/64)));
1503
1504	sq_thread_resource_mgmt = (NUM_PS_THREADS((rdev->config.rv770.max_threads * 4)/8) |
1505				   NUM_VS_THREADS((rdev->config.rv770.max_threads * 2)/8) |
1506				   NUM_ES_THREADS((rdev->config.rv770.max_threads * 1)/8));
1507	if (((rdev->config.rv770.max_threads * 1) / 8) > rdev->config.rv770.max_gs_threads)
1508		sq_thread_resource_mgmt |= NUM_GS_THREADS(rdev->config.rv770.max_gs_threads);
1509	else
1510		sq_thread_resource_mgmt |= NUM_GS_THREADS((rdev->config.rv770.max_gs_threads * 1)/8);
1511	WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt);
1512
1513	WREG32(SQ_STACK_RESOURCE_MGMT_1, (NUM_PS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1514						     NUM_VS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1515
1516	WREG32(SQ_STACK_RESOURCE_MGMT_2, (NUM_GS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
1517						     NUM_ES_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
1518
1519	sq_dyn_gpr_size_simd_ab_0 = (SIMDA_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1520				     SIMDA_RING1((rdev->config.rv770.max_gprs * 38)/64) |
1521				     SIMDB_RING0((rdev->config.rv770.max_gprs * 38)/64) |
1522				     SIMDB_RING1((rdev->config.rv770.max_gprs * 38)/64));
1523
1524	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_0, sq_dyn_gpr_size_simd_ab_0);
1525	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_1, sq_dyn_gpr_size_simd_ab_0);
1526	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_2, sq_dyn_gpr_size_simd_ab_0);
1527	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_3, sq_dyn_gpr_size_simd_ab_0);
1528	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_4, sq_dyn_gpr_size_simd_ab_0);
1529	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_5, sq_dyn_gpr_size_simd_ab_0);
1530	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_6, sq_dyn_gpr_size_simd_ab_0);
1531	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_7, sq_dyn_gpr_size_simd_ab_0);
1532
1533	WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1534					  FORCE_EOV_MAX_REZ_CNT(255)));
1535
1536	if (rdev->family == CHIP_RV710)
1537		WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(TC_ONLY) |
1538						AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1539	else
1540		WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(VC_AND_TC) |
1541						AUTO_INVLD_EN(ES_AND_GS_AUTO)));
1542
1543	switch (rdev->family) {
1544	case CHIP_RV770:
1545	case CHIP_RV730:
1546	case CHIP_RV740:
1547		gs_prim_buffer_depth = 384;
1548		break;
1549	case CHIP_RV710:
1550		gs_prim_buffer_depth = 128;
1551		break;
1552	default:
1553		break;
1554	}
1555
1556	num_gs_verts_per_thread = rdev->config.rv770.max_pipes * 16;
1557	vgt_gs_per_es = gs_prim_buffer_depth + num_gs_verts_per_thread;
1558	/* Max value for this is 256 */
1559	if (vgt_gs_per_es > 256)
1560		vgt_gs_per_es = 256;
1561
1562	WREG32(VGT_ES_PER_GS, 128);
1563	WREG32(VGT_GS_PER_ES, vgt_gs_per_es);
1564	WREG32(VGT_GS_PER_VS, 2);
1565
1566	/* more default values. 2D/3D driver should adjust as needed */
1567	WREG32(VGT_GS_VERTEX_REUSE, 16);
1568	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1569	WREG32(VGT_STRMOUT_EN, 0);
1570	WREG32(SX_MISC, 0);
1571	WREG32(PA_SC_MODE_CNTL, 0);
1572	WREG32(PA_SC_EDGERULE, 0xaaaaaaaa);
1573	WREG32(PA_SC_AA_CONFIG, 0);
1574	WREG32(PA_SC_CLIPRECT_RULE, 0xffff);
1575	WREG32(PA_SC_LINE_STIPPLE, 0);
1576	WREG32(SPI_INPUT_Z, 0);
1577	WREG32(SPI_PS_IN_CONTROL_0, NUM_INTERP(2));
1578	WREG32(CB_COLOR7_FRAG, 0);
1579
1580	/* clear render buffer base addresses */
1581	WREG32(CB_COLOR0_BASE, 0);
1582	WREG32(CB_COLOR1_BASE, 0);
1583	WREG32(CB_COLOR2_BASE, 0);
1584	WREG32(CB_COLOR3_BASE, 0);
1585	WREG32(CB_COLOR4_BASE, 0);
1586	WREG32(CB_COLOR5_BASE, 0);
1587	WREG32(CB_COLOR6_BASE, 0);
1588	WREG32(CB_COLOR7_BASE, 0);
1589
1590	WREG32(TCP_CNTL, 0);
1591
1592	hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1593	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1594
1595	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
1596
1597	WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
1598					  NUM_CLIP_SEQ(3)));
1599	WREG32(VC_ENHANCE, 0);
1600}
1601
1602void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
1603{
1604	u64 size_bf, size_af;
1605
1606	if (mc->mc_vram_size > 0xE0000000) {
1607		/* leave room for at least 512M GTT */
1608		dev_warn(rdev->dev, "limiting VRAM\n");
1609		mc->real_vram_size = 0xE0000000;
1610		mc->mc_vram_size = 0xE0000000;
1611	}
1612	if (rdev->flags & RADEON_IS_AGP) {
1613		size_bf = mc->gtt_start;
1614		size_af = mc->mc_mask - mc->gtt_end;
1615		if (size_bf > size_af) {
1616			if (mc->mc_vram_size > size_bf) {
1617				dev_warn(rdev->dev, "limiting VRAM\n");
1618				mc->real_vram_size = size_bf;
1619				mc->mc_vram_size = size_bf;
1620			}
1621			mc->vram_start = mc->gtt_start - mc->mc_vram_size;
1622		} else {
1623			if (mc->mc_vram_size > size_af) {
1624				dev_warn(rdev->dev, "limiting VRAM\n");
1625				mc->real_vram_size = size_af;
1626				mc->mc_vram_size = size_af;
1627			}
1628			mc->vram_start = mc->gtt_end + 1;
1629		}
1630		mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
1631		dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",
1632				mc->mc_vram_size >> 20, mc->vram_start,
1633				mc->vram_end, mc->real_vram_size >> 20);
1634	} else {
1635		radeon_vram_location(rdev, &rdev->mc, 0);
1636		rdev->mc.gtt_base_align = 0;
1637		radeon_gtt_location(rdev, mc);
1638	}
1639}
1640
1641static int rv770_mc_init(struct radeon_device *rdev)
1642{
1643	u32 tmp;
1644	int chansize, numchan;
1645
1646	/* Get VRAM informations */
1647	rdev->mc.vram_is_ddr = true;
1648	tmp = RREG32(MC_ARB_RAMCFG);
1649	if (tmp & CHANSIZE_OVERRIDE) {
1650		chansize = 16;
1651	} else if (tmp & CHANSIZE_MASK) {
1652		chansize = 64;
1653	} else {
1654		chansize = 32;
1655	}
1656	tmp = RREG32(MC_SHARED_CHMAP);
1657	switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
1658	case 0:
1659	default:
1660		numchan = 1;
1661		break;
1662	case 1:
1663		numchan = 2;
1664		break;
1665	case 2:
1666		numchan = 4;
1667		break;
1668	case 3:
1669		numchan = 8;
1670		break;
1671	}
1672	rdev->mc.vram_width = numchan * chansize;
1673	/* Could aper size report 0 ? */
1674	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
1675	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
1676	/* Setup GPU memory space */
1677	rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
1678	rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
1679	rdev->mc.visible_vram_size = rdev->mc.aper_size;
1680	r700_vram_gtt_location(rdev, &rdev->mc);
1681	radeon_update_bandwidth_info(rdev);
1682
1683	return 0;
1684}
1685
1686static void rv770_uvd_init(struct radeon_device *rdev)
1687{
1688	int r;
1689
1690	if (!rdev->has_uvd)
1691		return;
1692
1693	r = radeon_uvd_init(rdev);
1694	if (r) {
1695		dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
1696		/*
1697		 * At this point rdev->uvd.vcpu_bo is NULL which trickles down
1698		 * to early fails uvd_v2_2_resume() and thus nothing happens
1699		 * there. So it is pointless to try to go through that code
1700		 * hence why we disable uvd here.
1701		 */
1702		rdev->has_uvd = 0;
1703		return;
1704	}
1705	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
1706	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
1707}
1708
1709static void rv770_uvd_start(struct radeon_device *rdev)
1710{
1711	int r;
1712
1713	if (!rdev->has_uvd)
1714		return;
1715
1716	r = uvd_v2_2_resume(rdev);
1717	if (r) {
1718		dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
1719		goto error;
1720	}
1721	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
1722	if (r) {
1723		dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
1724		goto error;
1725	}
1726	return;
1727
1728error:
1729	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
1730}
1731
1732static void rv770_uvd_resume(struct radeon_device *rdev)
1733{
1734	struct radeon_ring *ring;
1735	int r;
1736
1737	if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
1738		return;
1739
1740	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
1741	r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0));
1742	if (r) {
1743		dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
1744		return;
1745	}
1746	r = uvd_v1_0_init(rdev);
1747	if (r) {
1748		dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
1749		return;
1750	}
1751}
1752
1753static int rv770_startup(struct radeon_device *rdev)
1754{
1755	struct radeon_ring *ring;
1756	int r;
1757
1758	/* enable pcie gen2 link */
1759	rv770_pcie_gen2_enable(rdev);
1760
1761	/* scratch needs to be initialized before MC */
1762	r = r600_vram_scratch_init(rdev);
1763	if (r)
1764		return r;
1765
1766	rv770_mc_program(rdev);
1767
1768	if (rdev->flags & RADEON_IS_AGP) {
1769		rv770_agp_enable(rdev);
1770	} else {
1771		r = rv770_pcie_gart_enable(rdev);
1772		if (r)
1773			return r;
1774	}
1775
1776	rv770_gpu_init(rdev);
1777
1778	/* allocate wb buffer */
1779	r = radeon_wb_init(rdev);
1780	if (r)
1781		return r;
1782
1783	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
1784	if (r) {
1785		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
1786		return r;
1787	}
1788
1789	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
1790	if (r) {
1791		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
1792		return r;
1793	}
1794
1795	rv770_uvd_start(rdev);
 
 
 
 
 
 
 
 
 
1796
1797	/* Enable IRQ */
1798	if (!rdev->irq.installed) {
1799		r = radeon_irq_kms_init(rdev);
1800		if (r)
1801			return r;
1802	}
1803
1804	r = r600_irq_init(rdev);
1805	if (r) {
1806		DRM_ERROR("radeon: IH init failed (%d).\n", r);
1807		radeon_irq_kms_fini(rdev);
1808		return r;
1809	}
1810	r600_irq_set(rdev);
1811
1812	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1813	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
1814			     RADEON_CP_PACKET2);
1815	if (r)
1816		return r;
1817
1818	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
1819	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
1820			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
1821	if (r)
1822		return r;
1823
1824	r = rv770_cp_load_microcode(rdev);
1825	if (r)
1826		return r;
1827	r = r600_cp_resume(rdev);
1828	if (r)
1829		return r;
1830
1831	r = r600_dma_resume(rdev);
1832	if (r)
1833		return r;
1834
1835	rv770_uvd_resume(rdev);
 
 
 
 
 
 
 
 
 
1836
1837	r = radeon_ib_pool_init(rdev);
1838	if (r) {
1839		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
1840		return r;
1841	}
1842
1843	r = radeon_audio_init(rdev);
1844	if (r) {
1845		DRM_ERROR("radeon: audio init failed\n");
1846		return r;
1847	}
1848
1849	return 0;
1850}
1851
1852int rv770_resume(struct radeon_device *rdev)
1853{
1854	int r;
1855
1856	/* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
1857	 * posting will perform necessary task to bring back GPU into good
1858	 * shape.
1859	 */
1860	/* post card */
1861	atom_asic_init(rdev->mode_info.atom_context);
1862
1863	/* init golden registers */
1864	rv770_init_golden_registers(rdev);
1865
1866	if (rdev->pm.pm_method == PM_METHOD_DPM)
1867		radeon_pm_resume(rdev);
1868
1869	rdev->accel_working = true;
1870	r = rv770_startup(rdev);
1871	if (r) {
1872		DRM_ERROR("r600 startup failed on resume\n");
1873		rdev->accel_working = false;
1874		return r;
1875	}
1876
1877	return r;
1878
1879}
1880
1881int rv770_suspend(struct radeon_device *rdev)
1882{
1883	radeon_pm_suspend(rdev);
1884	radeon_audio_fini(rdev);
1885	if (rdev->has_uvd) {
1886		uvd_v1_0_fini(rdev);
1887		radeon_uvd_suspend(rdev);
1888	}
1889	r700_cp_stop(rdev);
1890	r600_dma_stop(rdev);
1891	r600_irq_suspend(rdev);
1892	radeon_wb_disable(rdev);
1893	rv770_pcie_gart_disable(rdev);
1894
1895	return 0;
1896}
1897
1898/* Plan is to move initialization in that function and use
1899 * helper function so that radeon_device_init pretty much
1900 * do nothing more than calling asic specific function. This
1901 * should also allow to remove a bunch of callback function
1902 * like vram_info.
1903 */
1904int rv770_init(struct radeon_device *rdev)
1905{
1906	int r;
1907
1908	/* Read BIOS */
1909	if (!radeon_get_bios(rdev)) {
1910		if (ASIC_IS_AVIVO(rdev))
1911			return -EINVAL;
1912	}
1913	/* Must be an ATOMBIOS */
1914	if (!rdev->is_atom_bios) {
1915		dev_err(rdev->dev, "Expecting atombios for R600 GPU\n");
1916		return -EINVAL;
1917	}
1918	r = radeon_atombios_init(rdev);
1919	if (r)
1920		return r;
1921	/* Post card if necessary */
1922	if (!radeon_card_posted(rdev)) {
1923		if (!rdev->bios) {
1924			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
1925			return -EINVAL;
1926		}
1927		DRM_INFO("GPU not posted. posting now...\n");
1928		atom_asic_init(rdev->mode_info.atom_context);
1929	}
1930	/* init golden registers */
1931	rv770_init_golden_registers(rdev);
1932	/* Initialize scratch registers */
1933	r600_scratch_init(rdev);
1934	/* Initialize surface registers */
1935	radeon_surface_init(rdev);
1936	/* Initialize clocks */
1937	radeon_get_clock_info(rdev->ddev);
1938	/* Fence driver */
1939	r = radeon_fence_driver_init(rdev);
1940	if (r)
1941		return r;
1942	/* initialize AGP */
1943	if (rdev->flags & RADEON_IS_AGP) {
1944		r = radeon_agp_init(rdev);
1945		if (r)
1946			radeon_agp_disable(rdev);
1947	}
1948	r = rv770_mc_init(rdev);
1949	if (r)
1950		return r;
1951	/* Memory manager */
1952	r = radeon_bo_init(rdev);
1953	if (r)
1954		return r;
1955
1956	if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
1957		r = r600_init_microcode(rdev);
1958		if (r) {
1959			DRM_ERROR("Failed to load firmware!\n");
1960			return r;
1961		}
1962	}
1963
1964	/* Initialize power management */
1965	radeon_pm_init(rdev);
1966
1967	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
1968	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
1969
1970	rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
1971	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
1972
1973	rv770_uvd_init(rdev);
 
 
 
 
 
1974
1975	rdev->ih.ring_obj = NULL;
1976	r600_ih_ring_init(rdev, 64 * 1024);
1977
1978	r = r600_pcie_gart_init(rdev);
1979	if (r)
1980		return r;
1981
1982	rdev->accel_working = true;
1983	r = rv770_startup(rdev);
1984	if (r) {
1985		dev_err(rdev->dev, "disabling GPU acceleration\n");
1986		r700_cp_fini(rdev);
1987		r600_dma_fini(rdev);
1988		r600_irq_fini(rdev);
1989		radeon_wb_fini(rdev);
1990		radeon_ib_pool_fini(rdev);
1991		radeon_irq_kms_fini(rdev);
1992		rv770_pcie_gart_fini(rdev);
1993		rdev->accel_working = false;
1994	}
1995
1996	return 0;
1997}
1998
1999void rv770_fini(struct radeon_device *rdev)
2000{
2001	radeon_pm_fini(rdev);
2002	r700_cp_fini(rdev);
2003	r600_dma_fini(rdev);
2004	r600_irq_fini(rdev);
2005	radeon_wb_fini(rdev);
2006	radeon_ib_pool_fini(rdev);
2007	radeon_irq_kms_fini(rdev);
2008	uvd_v1_0_fini(rdev);
2009	radeon_uvd_fini(rdev);
2010	rv770_pcie_gart_fini(rdev);
2011	r600_vram_scratch_fini(rdev);
2012	radeon_gem_fini(rdev);
2013	radeon_fence_driver_fini(rdev);
2014	radeon_agp_fini(rdev);
2015	radeon_bo_fini(rdev);
2016	radeon_atombios_fini(rdev);
2017	kfree(rdev->bios);
2018	rdev->bios = NULL;
2019}
2020
2021static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
2022{
2023	u32 link_width_cntl, lanes, speed_cntl, tmp;
2024	u16 link_cntl2;
2025
2026	if (radeon_pcie_gen2 == 0)
2027		return;
2028
2029	if (rdev->flags & RADEON_IS_IGP)
2030		return;
2031
2032	if (!(rdev->flags & RADEON_IS_PCIE))
2033		return;
2034
2035	/* x2 cards have a special sequence */
2036	if (ASIC_IS_X2(rdev))
2037		return;
2038
2039	if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) &&
2040		(rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))
2041		return;
2042
2043	DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
2044
2045	/* advertise upconfig capability */
2046	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2047	link_width_cntl &= ~LC_UPCONFIGURE_DIS;
2048	WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2049	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2050	if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) {
2051		lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT;
2052		link_width_cntl &= ~(LC_LINK_WIDTH_MASK |
2053				     LC_RECONFIG_ARC_MISSING_ESCAPE);
2054		link_width_cntl |= lanes | LC_RECONFIG_NOW |
2055			LC_RENEGOTIATE_EN | LC_UPCONFIGURE_SUPPORT;
2056		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2057	} else {
2058		link_width_cntl |= LC_UPCONFIGURE_DIS;
2059		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2060	}
2061
2062	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2063	if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
2064	    (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
2065
2066		tmp = RREG32(0x541c);
2067		WREG32(0x541c, tmp | 0x8);
2068		WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN);
2069		link_cntl2 = RREG16(0x4088);
2070		link_cntl2 &= ~TARGET_LINK_SPEED_MASK;
2071		link_cntl2 |= 0x2;
2072		WREG16(0x4088, link_cntl2);
2073		WREG32(MM_CFGREGS_CNTL, 0);
2074
2075		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2076		speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
2077		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2078
2079		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2080		speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT;
2081		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2082
2083		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2084		speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
2085		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2086
2087		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
2088		speed_cntl |= LC_GEN2_EN_STRAP;
2089		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
2090
2091	} else {
2092		link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
2093		/* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
2094		if (1)
2095			link_width_cntl |= LC_UPCONFIGURE_DIS;
2096		else
2097			link_width_cntl &= ~LC_UPCONFIGURE_DIS;
2098		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
2099	}
2100}