Linux Audio

Check our new training course

Loading...
v6.13.7
   1/*
   2 * Copyright 2010 Advanced Micro Devices, Inc.
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice shall be included in
  12 * all copies or substantial portions of the Software.
  13 *
  14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20 * OTHER DEALINGS IN THE SOFTWARE.
  21 *
  22 * Authors: Alex Deucher
  23 */
  24
  25#include <linux/firmware.h>
  26#include <linux/pci.h>
  27#include <linux/slab.h>
  28
  29#include <drm/drm_edid.h>
  30#include <drm/drm_vblank.h>
 
  31#include <drm/radeon_drm.h>
  32#include <drm/drm_fourcc.h>
  33#include <drm/drm_framebuffer.h>
  34
  35#include "atom.h"
  36#include "avivod.h"
  37#include "cik.h"
  38#include "ni.h"
  39#include "rv770.h"
  40#include "evergreen.h"
  41#include "evergreen_blit_shaders.h"
  42#include "evergreen_reg.h"
  43#include "evergreend.h"
  44#include "radeon.h"
  45#include "radeon_asic.h"
  46#include "radeon_audio.h"
  47#include "radeon_ucode.h"
  48#include "si.h"
  49
  50#define DC_HPDx_CONTROL(x)        (DC_HPD1_CONTROL     + (x * 0xc))
  51#define DC_HPDx_INT_CONTROL(x)    (DC_HPD1_INT_CONTROL + (x * 0xc))
  52#define DC_HPDx_INT_STATUS_REG(x) (DC_HPD1_INT_STATUS  + (x * 0xc))
  53
  54/*
  55 * Indirect registers accessor
  56 */
  57u32 eg_cg_rreg(struct radeon_device *rdev, u32 reg)
  58{
  59	unsigned long flags;
  60	u32 r;
  61
  62	spin_lock_irqsave(&rdev->cg_idx_lock, flags);
  63	WREG32(EVERGREEN_CG_IND_ADDR, ((reg) & 0xffff));
  64	r = RREG32(EVERGREEN_CG_IND_DATA);
  65	spin_unlock_irqrestore(&rdev->cg_idx_lock, flags);
  66	return r;
  67}
  68
  69void eg_cg_wreg(struct radeon_device *rdev, u32 reg, u32 v)
  70{
  71	unsigned long flags;
  72
  73	spin_lock_irqsave(&rdev->cg_idx_lock, flags);
  74	WREG32(EVERGREEN_CG_IND_ADDR, ((reg) & 0xffff));
  75	WREG32(EVERGREEN_CG_IND_DATA, (v));
  76	spin_unlock_irqrestore(&rdev->cg_idx_lock, flags);
  77}
  78
  79u32 eg_pif_phy0_rreg(struct radeon_device *rdev, u32 reg)
  80{
  81	unsigned long flags;
  82	u32 r;
  83
  84	spin_lock_irqsave(&rdev->pif_idx_lock, flags);
  85	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
  86	r = RREG32(EVERGREEN_PIF_PHY0_DATA);
  87	spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
  88	return r;
  89}
  90
  91void eg_pif_phy0_wreg(struct radeon_device *rdev, u32 reg, u32 v)
  92{
  93	unsigned long flags;
  94
  95	spin_lock_irqsave(&rdev->pif_idx_lock, flags);
  96	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
  97	WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
  98	spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
  99}
 100
 101u32 eg_pif_phy1_rreg(struct radeon_device *rdev, u32 reg)
 102{
 103	unsigned long flags;
 104	u32 r;
 105
 106	spin_lock_irqsave(&rdev->pif_idx_lock, flags);
 107	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
 108	r = RREG32(EVERGREEN_PIF_PHY1_DATA);
 109	spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
 110	return r;
 111}
 112
 113void eg_pif_phy1_wreg(struct radeon_device *rdev, u32 reg, u32 v)
 114{
 115	unsigned long flags;
 116
 117	spin_lock_irqsave(&rdev->pif_idx_lock, flags);
 118	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
 119	WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
 120	spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
 121}
 122
 123static const u32 crtc_offsets[6] =
 124{
 125	EVERGREEN_CRTC0_REGISTER_OFFSET,
 126	EVERGREEN_CRTC1_REGISTER_OFFSET,
 127	EVERGREEN_CRTC2_REGISTER_OFFSET,
 128	EVERGREEN_CRTC3_REGISTER_OFFSET,
 129	EVERGREEN_CRTC4_REGISTER_OFFSET,
 130	EVERGREEN_CRTC5_REGISTER_OFFSET
 131};
 132
 133#include "clearstate_evergreen.h"
 134
 135static const u32 sumo_rlc_save_restore_register_list[] =
 136{
 137	0x98fc,
 138	0x9830,
 139	0x9834,
 140	0x9838,
 141	0x9870,
 142	0x9874,
 143	0x8a14,
 144	0x8b24,
 145	0x8bcc,
 146	0x8b10,
 147	0x8d00,
 148	0x8d04,
 149	0x8c00,
 150	0x8c04,
 151	0x8c08,
 152	0x8c0c,
 153	0x8d8c,
 154	0x8c20,
 155	0x8c24,
 156	0x8c28,
 157	0x8c18,
 158	0x8c1c,
 159	0x8cf0,
 160	0x8e2c,
 161	0x8e38,
 162	0x8c30,
 163	0x9508,
 164	0x9688,
 165	0x9608,
 166	0x960c,
 167	0x9610,
 168	0x9614,
 169	0x88c4,
 170	0x88d4,
 171	0xa008,
 172	0x900c,
 173	0x9100,
 174	0x913c,
 175	0x98f8,
 176	0x98f4,
 177	0x9b7c,
 178	0x3f8c,
 179	0x8950,
 180	0x8954,
 181	0x8a18,
 182	0x8b28,
 183	0x9144,
 184	0x9148,
 185	0x914c,
 186	0x3f90,
 187	0x3f94,
 188	0x915c,
 189	0x9160,
 190	0x9178,
 191	0x917c,
 192	0x9180,
 193	0x918c,
 194	0x9190,
 195	0x9194,
 196	0x9198,
 197	0x919c,
 198	0x91a8,
 199	0x91ac,
 200	0x91b0,
 201	0x91b4,
 202	0x91b8,
 203	0x91c4,
 204	0x91c8,
 205	0x91cc,
 206	0x91d0,
 207	0x91d4,
 208	0x91e0,
 209	0x91e4,
 210	0x91ec,
 211	0x91f0,
 212	0x91f4,
 213	0x9200,
 214	0x9204,
 215	0x929c,
 216	0x9150,
 217	0x802c,
 218};
 219
 220static void evergreen_gpu_init(struct radeon_device *rdev);
 221void evergreen_fini(struct radeon_device *rdev);
 222void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
 223void evergreen_program_aspm(struct radeon_device *rdev);
 
 
 
 
 
 
 
 
 
 
 
 224
 225static const u32 evergreen_golden_registers[] =
 226{
 227	0x3f90, 0xffff0000, 0xff000000,
 228	0x9148, 0xffff0000, 0xff000000,
 229	0x3f94, 0xffff0000, 0xff000000,
 230	0x914c, 0xffff0000, 0xff000000,
 231	0x9b7c, 0xffffffff, 0x00000000,
 232	0x8a14, 0xffffffff, 0x00000007,
 233	0x8b10, 0xffffffff, 0x00000000,
 234	0x960c, 0xffffffff, 0x54763210,
 235	0x88c4, 0xffffffff, 0x000000c2,
 236	0x88d4, 0xffffffff, 0x00000010,
 237	0x8974, 0xffffffff, 0x00000000,
 238	0xc78, 0x00000080, 0x00000080,
 239	0x5eb4, 0xffffffff, 0x00000002,
 240	0x5e78, 0xffffffff, 0x001000f0,
 241	0x6104, 0x01000300, 0x00000000,
 242	0x5bc0, 0x00300000, 0x00000000,
 243	0x7030, 0xffffffff, 0x00000011,
 244	0x7c30, 0xffffffff, 0x00000011,
 245	0x10830, 0xffffffff, 0x00000011,
 246	0x11430, 0xffffffff, 0x00000011,
 247	0x12030, 0xffffffff, 0x00000011,
 248	0x12c30, 0xffffffff, 0x00000011,
 249	0xd02c, 0xffffffff, 0x08421000,
 250	0x240c, 0xffffffff, 0x00000380,
 251	0x8b24, 0xffffffff, 0x00ff0fff,
 252	0x28a4c, 0x06000000, 0x06000000,
 253	0x10c, 0x00000001, 0x00000001,
 254	0x8d00, 0xffffffff, 0x100e4848,
 255	0x8d04, 0xffffffff, 0x00164745,
 256	0x8c00, 0xffffffff, 0xe4000003,
 257	0x8c04, 0xffffffff, 0x40600060,
 258	0x8c08, 0xffffffff, 0x001c001c,
 259	0x8cf0, 0xffffffff, 0x08e00620,
 260	0x8c20, 0xffffffff, 0x00800080,
 261	0x8c24, 0xffffffff, 0x00800080,
 262	0x8c18, 0xffffffff, 0x20202078,
 263	0x8c1c, 0xffffffff, 0x00001010,
 264	0x28350, 0xffffffff, 0x00000000,
 265	0xa008, 0xffffffff, 0x00010000,
 266	0x5c4, 0xffffffff, 0x00000001,
 267	0x9508, 0xffffffff, 0x00000002,
 268	0x913c, 0x0000000f, 0x0000000a
 269};
 270
 271static const u32 evergreen_golden_registers2[] =
 272{
 273	0x2f4c, 0xffffffff, 0x00000000,
 274	0x54f4, 0xffffffff, 0x00000000,
 275	0x54f0, 0xffffffff, 0x00000000,
 276	0x5498, 0xffffffff, 0x00000000,
 277	0x549c, 0xffffffff, 0x00000000,
 278	0x5494, 0xffffffff, 0x00000000,
 279	0x53cc, 0xffffffff, 0x00000000,
 280	0x53c8, 0xffffffff, 0x00000000,
 281	0x53c4, 0xffffffff, 0x00000000,
 282	0x53c0, 0xffffffff, 0x00000000,
 283	0x53bc, 0xffffffff, 0x00000000,
 284	0x53b8, 0xffffffff, 0x00000000,
 285	0x53b4, 0xffffffff, 0x00000000,
 286	0x53b0, 0xffffffff, 0x00000000
 287};
 288
 289static const u32 cypress_mgcg_init[] =
 290{
 291	0x802c, 0xffffffff, 0xc0000000,
 292	0x5448, 0xffffffff, 0x00000100,
 293	0x55e4, 0xffffffff, 0x00000100,
 294	0x160c, 0xffffffff, 0x00000100,
 295	0x5644, 0xffffffff, 0x00000100,
 296	0xc164, 0xffffffff, 0x00000100,
 297	0x8a18, 0xffffffff, 0x00000100,
 298	0x897c, 0xffffffff, 0x06000100,
 299	0x8b28, 0xffffffff, 0x00000100,
 300	0x9144, 0xffffffff, 0x00000100,
 301	0x9a60, 0xffffffff, 0x00000100,
 302	0x9868, 0xffffffff, 0x00000100,
 303	0x8d58, 0xffffffff, 0x00000100,
 304	0x9510, 0xffffffff, 0x00000100,
 305	0x949c, 0xffffffff, 0x00000100,
 306	0x9654, 0xffffffff, 0x00000100,
 307	0x9030, 0xffffffff, 0x00000100,
 308	0x9034, 0xffffffff, 0x00000100,
 309	0x9038, 0xffffffff, 0x00000100,
 310	0x903c, 0xffffffff, 0x00000100,
 311	0x9040, 0xffffffff, 0x00000100,
 312	0xa200, 0xffffffff, 0x00000100,
 313	0xa204, 0xffffffff, 0x00000100,
 314	0xa208, 0xffffffff, 0x00000100,
 315	0xa20c, 0xffffffff, 0x00000100,
 316	0x971c, 0xffffffff, 0x00000100,
 317	0x977c, 0xffffffff, 0x00000100,
 318	0x3f80, 0xffffffff, 0x00000100,
 319	0xa210, 0xffffffff, 0x00000100,
 320	0xa214, 0xffffffff, 0x00000100,
 321	0x4d8, 0xffffffff, 0x00000100,
 322	0x9784, 0xffffffff, 0x00000100,
 323	0x9698, 0xffffffff, 0x00000100,
 324	0x4d4, 0xffffffff, 0x00000200,
 325	0x30cc, 0xffffffff, 0x00000100,
 326	0xd0c0, 0xffffffff, 0xff000100,
 327	0x802c, 0xffffffff, 0x40000000,
 328	0x915c, 0xffffffff, 0x00010000,
 329	0x9160, 0xffffffff, 0x00030002,
 330	0x9178, 0xffffffff, 0x00070000,
 331	0x917c, 0xffffffff, 0x00030002,
 332	0x9180, 0xffffffff, 0x00050004,
 333	0x918c, 0xffffffff, 0x00010006,
 334	0x9190, 0xffffffff, 0x00090008,
 335	0x9194, 0xffffffff, 0x00070000,
 336	0x9198, 0xffffffff, 0x00030002,
 337	0x919c, 0xffffffff, 0x00050004,
 338	0x91a8, 0xffffffff, 0x00010006,
 339	0x91ac, 0xffffffff, 0x00090008,
 340	0x91b0, 0xffffffff, 0x00070000,
 341	0x91b4, 0xffffffff, 0x00030002,
 342	0x91b8, 0xffffffff, 0x00050004,
 343	0x91c4, 0xffffffff, 0x00010006,
 344	0x91c8, 0xffffffff, 0x00090008,
 345	0x91cc, 0xffffffff, 0x00070000,
 346	0x91d0, 0xffffffff, 0x00030002,
 347	0x91d4, 0xffffffff, 0x00050004,
 348	0x91e0, 0xffffffff, 0x00010006,
 349	0x91e4, 0xffffffff, 0x00090008,
 350	0x91e8, 0xffffffff, 0x00000000,
 351	0x91ec, 0xffffffff, 0x00070000,
 352	0x91f0, 0xffffffff, 0x00030002,
 353	0x91f4, 0xffffffff, 0x00050004,
 354	0x9200, 0xffffffff, 0x00010006,
 355	0x9204, 0xffffffff, 0x00090008,
 356	0x9208, 0xffffffff, 0x00070000,
 357	0x920c, 0xffffffff, 0x00030002,
 358	0x9210, 0xffffffff, 0x00050004,
 359	0x921c, 0xffffffff, 0x00010006,
 360	0x9220, 0xffffffff, 0x00090008,
 361	0x9224, 0xffffffff, 0x00070000,
 362	0x9228, 0xffffffff, 0x00030002,
 363	0x922c, 0xffffffff, 0x00050004,
 364	0x9238, 0xffffffff, 0x00010006,
 365	0x923c, 0xffffffff, 0x00090008,
 366	0x9240, 0xffffffff, 0x00070000,
 367	0x9244, 0xffffffff, 0x00030002,
 368	0x9248, 0xffffffff, 0x00050004,
 369	0x9254, 0xffffffff, 0x00010006,
 370	0x9258, 0xffffffff, 0x00090008,
 371	0x925c, 0xffffffff, 0x00070000,
 372	0x9260, 0xffffffff, 0x00030002,
 373	0x9264, 0xffffffff, 0x00050004,
 374	0x9270, 0xffffffff, 0x00010006,
 375	0x9274, 0xffffffff, 0x00090008,
 376	0x9278, 0xffffffff, 0x00070000,
 377	0x927c, 0xffffffff, 0x00030002,
 378	0x9280, 0xffffffff, 0x00050004,
 379	0x928c, 0xffffffff, 0x00010006,
 380	0x9290, 0xffffffff, 0x00090008,
 381	0x9294, 0xffffffff, 0x00000000,
 382	0x929c, 0xffffffff, 0x00000001,
 383	0x802c, 0xffffffff, 0x40010000,
 384	0x915c, 0xffffffff, 0x00010000,
 385	0x9160, 0xffffffff, 0x00030002,
 386	0x9178, 0xffffffff, 0x00070000,
 387	0x917c, 0xffffffff, 0x00030002,
 388	0x9180, 0xffffffff, 0x00050004,
 389	0x918c, 0xffffffff, 0x00010006,
 390	0x9190, 0xffffffff, 0x00090008,
 391	0x9194, 0xffffffff, 0x00070000,
 392	0x9198, 0xffffffff, 0x00030002,
 393	0x919c, 0xffffffff, 0x00050004,
 394	0x91a8, 0xffffffff, 0x00010006,
 395	0x91ac, 0xffffffff, 0x00090008,
 396	0x91b0, 0xffffffff, 0x00070000,
 397	0x91b4, 0xffffffff, 0x00030002,
 398	0x91b8, 0xffffffff, 0x00050004,
 399	0x91c4, 0xffffffff, 0x00010006,
 400	0x91c8, 0xffffffff, 0x00090008,
 401	0x91cc, 0xffffffff, 0x00070000,
 402	0x91d0, 0xffffffff, 0x00030002,
 403	0x91d4, 0xffffffff, 0x00050004,
 404	0x91e0, 0xffffffff, 0x00010006,
 405	0x91e4, 0xffffffff, 0x00090008,
 406	0x91e8, 0xffffffff, 0x00000000,
 407	0x91ec, 0xffffffff, 0x00070000,
 408	0x91f0, 0xffffffff, 0x00030002,
 409	0x91f4, 0xffffffff, 0x00050004,
 410	0x9200, 0xffffffff, 0x00010006,
 411	0x9204, 0xffffffff, 0x00090008,
 412	0x9208, 0xffffffff, 0x00070000,
 413	0x920c, 0xffffffff, 0x00030002,
 414	0x9210, 0xffffffff, 0x00050004,
 415	0x921c, 0xffffffff, 0x00010006,
 416	0x9220, 0xffffffff, 0x00090008,
 417	0x9224, 0xffffffff, 0x00070000,
 418	0x9228, 0xffffffff, 0x00030002,
 419	0x922c, 0xffffffff, 0x00050004,
 420	0x9238, 0xffffffff, 0x00010006,
 421	0x923c, 0xffffffff, 0x00090008,
 422	0x9240, 0xffffffff, 0x00070000,
 423	0x9244, 0xffffffff, 0x00030002,
 424	0x9248, 0xffffffff, 0x00050004,
 425	0x9254, 0xffffffff, 0x00010006,
 426	0x9258, 0xffffffff, 0x00090008,
 427	0x925c, 0xffffffff, 0x00070000,
 428	0x9260, 0xffffffff, 0x00030002,
 429	0x9264, 0xffffffff, 0x00050004,
 430	0x9270, 0xffffffff, 0x00010006,
 431	0x9274, 0xffffffff, 0x00090008,
 432	0x9278, 0xffffffff, 0x00070000,
 433	0x927c, 0xffffffff, 0x00030002,
 434	0x9280, 0xffffffff, 0x00050004,
 435	0x928c, 0xffffffff, 0x00010006,
 436	0x9290, 0xffffffff, 0x00090008,
 437	0x9294, 0xffffffff, 0x00000000,
 438	0x929c, 0xffffffff, 0x00000001,
 439	0x802c, 0xffffffff, 0xc0000000
 440};
 441
 442static const u32 redwood_mgcg_init[] =
 443{
 444	0x802c, 0xffffffff, 0xc0000000,
 445	0x5448, 0xffffffff, 0x00000100,
 446	0x55e4, 0xffffffff, 0x00000100,
 447	0x160c, 0xffffffff, 0x00000100,
 448	0x5644, 0xffffffff, 0x00000100,
 449	0xc164, 0xffffffff, 0x00000100,
 450	0x8a18, 0xffffffff, 0x00000100,
 451	0x897c, 0xffffffff, 0x06000100,
 452	0x8b28, 0xffffffff, 0x00000100,
 453	0x9144, 0xffffffff, 0x00000100,
 454	0x9a60, 0xffffffff, 0x00000100,
 455	0x9868, 0xffffffff, 0x00000100,
 456	0x8d58, 0xffffffff, 0x00000100,
 457	0x9510, 0xffffffff, 0x00000100,
 458	0x949c, 0xffffffff, 0x00000100,
 459	0x9654, 0xffffffff, 0x00000100,
 460	0x9030, 0xffffffff, 0x00000100,
 461	0x9034, 0xffffffff, 0x00000100,
 462	0x9038, 0xffffffff, 0x00000100,
 463	0x903c, 0xffffffff, 0x00000100,
 464	0x9040, 0xffffffff, 0x00000100,
 465	0xa200, 0xffffffff, 0x00000100,
 466	0xa204, 0xffffffff, 0x00000100,
 467	0xa208, 0xffffffff, 0x00000100,
 468	0xa20c, 0xffffffff, 0x00000100,
 469	0x971c, 0xffffffff, 0x00000100,
 470	0x977c, 0xffffffff, 0x00000100,
 471	0x3f80, 0xffffffff, 0x00000100,
 472	0xa210, 0xffffffff, 0x00000100,
 473	0xa214, 0xffffffff, 0x00000100,
 474	0x4d8, 0xffffffff, 0x00000100,
 475	0x9784, 0xffffffff, 0x00000100,
 476	0x9698, 0xffffffff, 0x00000100,
 477	0x4d4, 0xffffffff, 0x00000200,
 478	0x30cc, 0xffffffff, 0x00000100,
 479	0xd0c0, 0xffffffff, 0xff000100,
 480	0x802c, 0xffffffff, 0x40000000,
 481	0x915c, 0xffffffff, 0x00010000,
 482	0x9160, 0xffffffff, 0x00030002,
 483	0x9178, 0xffffffff, 0x00070000,
 484	0x917c, 0xffffffff, 0x00030002,
 485	0x9180, 0xffffffff, 0x00050004,
 486	0x918c, 0xffffffff, 0x00010006,
 487	0x9190, 0xffffffff, 0x00090008,
 488	0x9194, 0xffffffff, 0x00070000,
 489	0x9198, 0xffffffff, 0x00030002,
 490	0x919c, 0xffffffff, 0x00050004,
 491	0x91a8, 0xffffffff, 0x00010006,
 492	0x91ac, 0xffffffff, 0x00090008,
 493	0x91b0, 0xffffffff, 0x00070000,
 494	0x91b4, 0xffffffff, 0x00030002,
 495	0x91b8, 0xffffffff, 0x00050004,
 496	0x91c4, 0xffffffff, 0x00010006,
 497	0x91c8, 0xffffffff, 0x00090008,
 498	0x91cc, 0xffffffff, 0x00070000,
 499	0x91d0, 0xffffffff, 0x00030002,
 500	0x91d4, 0xffffffff, 0x00050004,
 501	0x91e0, 0xffffffff, 0x00010006,
 502	0x91e4, 0xffffffff, 0x00090008,
 503	0x91e8, 0xffffffff, 0x00000000,
 504	0x91ec, 0xffffffff, 0x00070000,
 505	0x91f0, 0xffffffff, 0x00030002,
 506	0x91f4, 0xffffffff, 0x00050004,
 507	0x9200, 0xffffffff, 0x00010006,
 508	0x9204, 0xffffffff, 0x00090008,
 509	0x9294, 0xffffffff, 0x00000000,
 510	0x929c, 0xffffffff, 0x00000001,
 511	0x802c, 0xffffffff, 0xc0000000
 512};
 513
 514static const u32 cedar_golden_registers[] =
 515{
 516	0x3f90, 0xffff0000, 0xff000000,
 517	0x9148, 0xffff0000, 0xff000000,
 518	0x3f94, 0xffff0000, 0xff000000,
 519	0x914c, 0xffff0000, 0xff000000,
 520	0x9b7c, 0xffffffff, 0x00000000,
 521	0x8a14, 0xffffffff, 0x00000007,
 522	0x8b10, 0xffffffff, 0x00000000,
 523	0x960c, 0xffffffff, 0x54763210,
 524	0x88c4, 0xffffffff, 0x000000c2,
 525	0x88d4, 0xffffffff, 0x00000000,
 526	0x8974, 0xffffffff, 0x00000000,
 527	0xc78, 0x00000080, 0x00000080,
 528	0x5eb4, 0xffffffff, 0x00000002,
 529	0x5e78, 0xffffffff, 0x001000f0,
 530	0x6104, 0x01000300, 0x00000000,
 531	0x5bc0, 0x00300000, 0x00000000,
 532	0x7030, 0xffffffff, 0x00000011,
 533	0x7c30, 0xffffffff, 0x00000011,
 534	0x10830, 0xffffffff, 0x00000011,
 535	0x11430, 0xffffffff, 0x00000011,
 536	0xd02c, 0xffffffff, 0x08421000,
 537	0x240c, 0xffffffff, 0x00000380,
 538	0x8b24, 0xffffffff, 0x00ff0fff,
 539	0x28a4c, 0x06000000, 0x06000000,
 540	0x10c, 0x00000001, 0x00000001,
 541	0x8d00, 0xffffffff, 0x100e4848,
 542	0x8d04, 0xffffffff, 0x00164745,
 543	0x8c00, 0xffffffff, 0xe4000003,
 544	0x8c04, 0xffffffff, 0x40600060,
 545	0x8c08, 0xffffffff, 0x001c001c,
 546	0x8cf0, 0xffffffff, 0x08e00410,
 547	0x8c20, 0xffffffff, 0x00800080,
 548	0x8c24, 0xffffffff, 0x00800080,
 549	0x8c18, 0xffffffff, 0x20202078,
 550	0x8c1c, 0xffffffff, 0x00001010,
 551	0x28350, 0xffffffff, 0x00000000,
 552	0xa008, 0xffffffff, 0x00010000,
 553	0x5c4, 0xffffffff, 0x00000001,
 554	0x9508, 0xffffffff, 0x00000002
 555};
 556
 557static const u32 cedar_mgcg_init[] =
 558{
 559	0x802c, 0xffffffff, 0xc0000000,
 560	0x5448, 0xffffffff, 0x00000100,
 561	0x55e4, 0xffffffff, 0x00000100,
 562	0x160c, 0xffffffff, 0x00000100,
 563	0x5644, 0xffffffff, 0x00000100,
 564	0xc164, 0xffffffff, 0x00000100,
 565	0x8a18, 0xffffffff, 0x00000100,
 566	0x897c, 0xffffffff, 0x06000100,
 567	0x8b28, 0xffffffff, 0x00000100,
 568	0x9144, 0xffffffff, 0x00000100,
 569	0x9a60, 0xffffffff, 0x00000100,
 570	0x9868, 0xffffffff, 0x00000100,
 571	0x8d58, 0xffffffff, 0x00000100,
 572	0x9510, 0xffffffff, 0x00000100,
 573	0x949c, 0xffffffff, 0x00000100,
 574	0x9654, 0xffffffff, 0x00000100,
 575	0x9030, 0xffffffff, 0x00000100,
 576	0x9034, 0xffffffff, 0x00000100,
 577	0x9038, 0xffffffff, 0x00000100,
 578	0x903c, 0xffffffff, 0x00000100,
 579	0x9040, 0xffffffff, 0x00000100,
 580	0xa200, 0xffffffff, 0x00000100,
 581	0xa204, 0xffffffff, 0x00000100,
 582	0xa208, 0xffffffff, 0x00000100,
 583	0xa20c, 0xffffffff, 0x00000100,
 584	0x971c, 0xffffffff, 0x00000100,
 585	0x977c, 0xffffffff, 0x00000100,
 586	0x3f80, 0xffffffff, 0x00000100,
 587	0xa210, 0xffffffff, 0x00000100,
 588	0xa214, 0xffffffff, 0x00000100,
 589	0x4d8, 0xffffffff, 0x00000100,
 590	0x9784, 0xffffffff, 0x00000100,
 591	0x9698, 0xffffffff, 0x00000100,
 592	0x4d4, 0xffffffff, 0x00000200,
 593	0x30cc, 0xffffffff, 0x00000100,
 594	0xd0c0, 0xffffffff, 0xff000100,
 595	0x802c, 0xffffffff, 0x40000000,
 596	0x915c, 0xffffffff, 0x00010000,
 597	0x9178, 0xffffffff, 0x00050000,
 598	0x917c, 0xffffffff, 0x00030002,
 599	0x918c, 0xffffffff, 0x00010004,
 600	0x9190, 0xffffffff, 0x00070006,
 601	0x9194, 0xffffffff, 0x00050000,
 602	0x9198, 0xffffffff, 0x00030002,
 603	0x91a8, 0xffffffff, 0x00010004,
 604	0x91ac, 0xffffffff, 0x00070006,
 605	0x91e8, 0xffffffff, 0x00000000,
 606	0x9294, 0xffffffff, 0x00000000,
 607	0x929c, 0xffffffff, 0x00000001,
 608	0x802c, 0xffffffff, 0xc0000000
 609};
 610
 611static const u32 juniper_mgcg_init[] =
 612{
 613	0x802c, 0xffffffff, 0xc0000000,
 614	0x5448, 0xffffffff, 0x00000100,
 615	0x55e4, 0xffffffff, 0x00000100,
 616	0x160c, 0xffffffff, 0x00000100,
 617	0x5644, 0xffffffff, 0x00000100,
 618	0xc164, 0xffffffff, 0x00000100,
 619	0x8a18, 0xffffffff, 0x00000100,
 620	0x897c, 0xffffffff, 0x06000100,
 621	0x8b28, 0xffffffff, 0x00000100,
 622	0x9144, 0xffffffff, 0x00000100,
 623	0x9a60, 0xffffffff, 0x00000100,
 624	0x9868, 0xffffffff, 0x00000100,
 625	0x8d58, 0xffffffff, 0x00000100,
 626	0x9510, 0xffffffff, 0x00000100,
 627	0x949c, 0xffffffff, 0x00000100,
 628	0x9654, 0xffffffff, 0x00000100,
 629	0x9030, 0xffffffff, 0x00000100,
 630	0x9034, 0xffffffff, 0x00000100,
 631	0x9038, 0xffffffff, 0x00000100,
 632	0x903c, 0xffffffff, 0x00000100,
 633	0x9040, 0xffffffff, 0x00000100,
 634	0xa200, 0xffffffff, 0x00000100,
 635	0xa204, 0xffffffff, 0x00000100,
 636	0xa208, 0xffffffff, 0x00000100,
 637	0xa20c, 0xffffffff, 0x00000100,
 638	0x971c, 0xffffffff, 0x00000100,
 639	0xd0c0, 0xffffffff, 0xff000100,
 640	0x802c, 0xffffffff, 0x40000000,
 641	0x915c, 0xffffffff, 0x00010000,
 642	0x9160, 0xffffffff, 0x00030002,
 643	0x9178, 0xffffffff, 0x00070000,
 644	0x917c, 0xffffffff, 0x00030002,
 645	0x9180, 0xffffffff, 0x00050004,
 646	0x918c, 0xffffffff, 0x00010006,
 647	0x9190, 0xffffffff, 0x00090008,
 648	0x9194, 0xffffffff, 0x00070000,
 649	0x9198, 0xffffffff, 0x00030002,
 650	0x919c, 0xffffffff, 0x00050004,
 651	0x91a8, 0xffffffff, 0x00010006,
 652	0x91ac, 0xffffffff, 0x00090008,
 653	0x91b0, 0xffffffff, 0x00070000,
 654	0x91b4, 0xffffffff, 0x00030002,
 655	0x91b8, 0xffffffff, 0x00050004,
 656	0x91c4, 0xffffffff, 0x00010006,
 657	0x91c8, 0xffffffff, 0x00090008,
 658	0x91cc, 0xffffffff, 0x00070000,
 659	0x91d0, 0xffffffff, 0x00030002,
 660	0x91d4, 0xffffffff, 0x00050004,
 661	0x91e0, 0xffffffff, 0x00010006,
 662	0x91e4, 0xffffffff, 0x00090008,
 663	0x91e8, 0xffffffff, 0x00000000,
 664	0x91ec, 0xffffffff, 0x00070000,
 665	0x91f0, 0xffffffff, 0x00030002,
 666	0x91f4, 0xffffffff, 0x00050004,
 667	0x9200, 0xffffffff, 0x00010006,
 668	0x9204, 0xffffffff, 0x00090008,
 669	0x9208, 0xffffffff, 0x00070000,
 670	0x920c, 0xffffffff, 0x00030002,
 671	0x9210, 0xffffffff, 0x00050004,
 672	0x921c, 0xffffffff, 0x00010006,
 673	0x9220, 0xffffffff, 0x00090008,
 674	0x9224, 0xffffffff, 0x00070000,
 675	0x9228, 0xffffffff, 0x00030002,
 676	0x922c, 0xffffffff, 0x00050004,
 677	0x9238, 0xffffffff, 0x00010006,
 678	0x923c, 0xffffffff, 0x00090008,
 679	0x9240, 0xffffffff, 0x00070000,
 680	0x9244, 0xffffffff, 0x00030002,
 681	0x9248, 0xffffffff, 0x00050004,
 682	0x9254, 0xffffffff, 0x00010006,
 683	0x9258, 0xffffffff, 0x00090008,
 684	0x925c, 0xffffffff, 0x00070000,
 685	0x9260, 0xffffffff, 0x00030002,
 686	0x9264, 0xffffffff, 0x00050004,
 687	0x9270, 0xffffffff, 0x00010006,
 688	0x9274, 0xffffffff, 0x00090008,
 689	0x9278, 0xffffffff, 0x00070000,
 690	0x927c, 0xffffffff, 0x00030002,
 691	0x9280, 0xffffffff, 0x00050004,
 692	0x928c, 0xffffffff, 0x00010006,
 693	0x9290, 0xffffffff, 0x00090008,
 694	0x9294, 0xffffffff, 0x00000000,
 695	0x929c, 0xffffffff, 0x00000001,
 696	0x802c, 0xffffffff, 0xc0000000,
 697	0x977c, 0xffffffff, 0x00000100,
 698	0x3f80, 0xffffffff, 0x00000100,
 699	0xa210, 0xffffffff, 0x00000100,
 700	0xa214, 0xffffffff, 0x00000100,
 701	0x4d8, 0xffffffff, 0x00000100,
 702	0x9784, 0xffffffff, 0x00000100,
 703	0x9698, 0xffffffff, 0x00000100,
 704	0x4d4, 0xffffffff, 0x00000200,
 705	0x30cc, 0xffffffff, 0x00000100,
 706	0x802c, 0xffffffff, 0xc0000000
 707};
 708
 709static const u32 supersumo_golden_registers[] =
 710{
 711	0x5eb4, 0xffffffff, 0x00000002,
 712	0x5c4, 0xffffffff, 0x00000001,
 713	0x7030, 0xffffffff, 0x00000011,
 714	0x7c30, 0xffffffff, 0x00000011,
 715	0x6104, 0x01000300, 0x00000000,
 716	0x5bc0, 0x00300000, 0x00000000,
 717	0x8c04, 0xffffffff, 0x40600060,
 718	0x8c08, 0xffffffff, 0x001c001c,
 719	0x8c20, 0xffffffff, 0x00800080,
 720	0x8c24, 0xffffffff, 0x00800080,
 721	0x8c18, 0xffffffff, 0x20202078,
 722	0x8c1c, 0xffffffff, 0x00001010,
 723	0x918c, 0xffffffff, 0x00010006,
 724	0x91a8, 0xffffffff, 0x00010006,
 725	0x91c4, 0xffffffff, 0x00010006,
 726	0x91e0, 0xffffffff, 0x00010006,
 727	0x9200, 0xffffffff, 0x00010006,
 728	0x9150, 0xffffffff, 0x6e944040,
 729	0x917c, 0xffffffff, 0x00030002,
 730	0x9180, 0xffffffff, 0x00050004,
 731	0x9198, 0xffffffff, 0x00030002,
 732	0x919c, 0xffffffff, 0x00050004,
 733	0x91b4, 0xffffffff, 0x00030002,
 734	0x91b8, 0xffffffff, 0x00050004,
 735	0x91d0, 0xffffffff, 0x00030002,
 736	0x91d4, 0xffffffff, 0x00050004,
 737	0x91f0, 0xffffffff, 0x00030002,
 738	0x91f4, 0xffffffff, 0x00050004,
 739	0x915c, 0xffffffff, 0x00010000,
 740	0x9160, 0xffffffff, 0x00030002,
 741	0x3f90, 0xffff0000, 0xff000000,
 742	0x9178, 0xffffffff, 0x00070000,
 743	0x9194, 0xffffffff, 0x00070000,
 744	0x91b0, 0xffffffff, 0x00070000,
 745	0x91cc, 0xffffffff, 0x00070000,
 746	0x91ec, 0xffffffff, 0x00070000,
 747	0x9148, 0xffff0000, 0xff000000,
 748	0x9190, 0xffffffff, 0x00090008,
 749	0x91ac, 0xffffffff, 0x00090008,
 750	0x91c8, 0xffffffff, 0x00090008,
 751	0x91e4, 0xffffffff, 0x00090008,
 752	0x9204, 0xffffffff, 0x00090008,
 753	0x3f94, 0xffff0000, 0xff000000,
 754	0x914c, 0xffff0000, 0xff000000,
 755	0x929c, 0xffffffff, 0x00000001,
 756	0x8a18, 0xffffffff, 0x00000100,
 757	0x8b28, 0xffffffff, 0x00000100,
 758	0x9144, 0xffffffff, 0x00000100,
 759	0x5644, 0xffffffff, 0x00000100,
 760	0x9b7c, 0xffffffff, 0x00000000,
 761	0x8030, 0xffffffff, 0x0000100a,
 762	0x8a14, 0xffffffff, 0x00000007,
 763	0x8b24, 0xffffffff, 0x00ff0fff,
 764	0x8b10, 0xffffffff, 0x00000000,
 765	0x28a4c, 0x06000000, 0x06000000,
 766	0x4d8, 0xffffffff, 0x00000100,
 767	0x913c, 0xffff000f, 0x0100000a,
 768	0x960c, 0xffffffff, 0x54763210,
 769	0x88c4, 0xffffffff, 0x000000c2,
 770	0x88d4, 0xffffffff, 0x00000010,
 771	0x8974, 0xffffffff, 0x00000000,
 772	0xc78, 0x00000080, 0x00000080,
 773	0x5e78, 0xffffffff, 0x001000f0,
 774	0xd02c, 0xffffffff, 0x08421000,
 775	0xa008, 0xffffffff, 0x00010000,
 776	0x8d00, 0xffffffff, 0x100e4848,
 777	0x8d04, 0xffffffff, 0x00164745,
 778	0x8c00, 0xffffffff, 0xe4000003,
 779	0x8cf0, 0x1fffffff, 0x08e00620,
 780	0x28350, 0xffffffff, 0x00000000,
 781	0x9508, 0xffffffff, 0x00000002
 782};
 783
 784static const u32 sumo_golden_registers[] =
 785{
 786	0x900c, 0x00ffffff, 0x0017071f,
 787	0x8c18, 0xffffffff, 0x10101060,
 788	0x8c1c, 0xffffffff, 0x00001010,
 789	0x8c30, 0x0000000f, 0x00000005,
 790	0x9688, 0x0000000f, 0x00000007
 791};
 792
 793static const u32 wrestler_golden_registers[] =
 794{
 795	0x5eb4, 0xffffffff, 0x00000002,
 796	0x5c4, 0xffffffff, 0x00000001,
 797	0x7030, 0xffffffff, 0x00000011,
 798	0x7c30, 0xffffffff, 0x00000011,
 799	0x6104, 0x01000300, 0x00000000,
 800	0x5bc0, 0x00300000, 0x00000000,
 801	0x918c, 0xffffffff, 0x00010006,
 802	0x91a8, 0xffffffff, 0x00010006,
 803	0x9150, 0xffffffff, 0x6e944040,
 804	0x917c, 0xffffffff, 0x00030002,
 805	0x9198, 0xffffffff, 0x00030002,
 806	0x915c, 0xffffffff, 0x00010000,
 807	0x3f90, 0xffff0000, 0xff000000,
 808	0x9178, 0xffffffff, 0x00070000,
 809	0x9194, 0xffffffff, 0x00070000,
 810	0x9148, 0xffff0000, 0xff000000,
 811	0x9190, 0xffffffff, 0x00090008,
 812	0x91ac, 0xffffffff, 0x00090008,
 813	0x3f94, 0xffff0000, 0xff000000,
 814	0x914c, 0xffff0000, 0xff000000,
 815	0x929c, 0xffffffff, 0x00000001,
 816	0x8a18, 0xffffffff, 0x00000100,
 817	0x8b28, 0xffffffff, 0x00000100,
 818	0x9144, 0xffffffff, 0x00000100,
 819	0x9b7c, 0xffffffff, 0x00000000,
 820	0x8030, 0xffffffff, 0x0000100a,
 821	0x8a14, 0xffffffff, 0x00000001,
 822	0x8b24, 0xffffffff, 0x00ff0fff,
 823	0x8b10, 0xffffffff, 0x00000000,
 824	0x28a4c, 0x06000000, 0x06000000,
 825	0x4d8, 0xffffffff, 0x00000100,
 826	0x913c, 0xffff000f, 0x0100000a,
 827	0x960c, 0xffffffff, 0x54763210,
 828	0x88c4, 0xffffffff, 0x000000c2,
 829	0x88d4, 0xffffffff, 0x00000010,
 830	0x8974, 0xffffffff, 0x00000000,
 831	0xc78, 0x00000080, 0x00000080,
 832	0x5e78, 0xffffffff, 0x001000f0,
 833	0xd02c, 0xffffffff, 0x08421000,
 834	0xa008, 0xffffffff, 0x00010000,
 835	0x8d00, 0xffffffff, 0x100e4848,
 836	0x8d04, 0xffffffff, 0x00164745,
 837	0x8c00, 0xffffffff, 0xe4000003,
 838	0x8cf0, 0x1fffffff, 0x08e00410,
 839	0x28350, 0xffffffff, 0x00000000,
 840	0x9508, 0xffffffff, 0x00000002,
 841	0x900c, 0xffffffff, 0x0017071f,
 842	0x8c18, 0xffffffff, 0x10101060,
 843	0x8c1c, 0xffffffff, 0x00001010
 844};
 845
 846static const u32 barts_golden_registers[] =
 847{
 848	0x5eb4, 0xffffffff, 0x00000002,
 849	0x5e78, 0x8f311ff1, 0x001000f0,
 850	0x3f90, 0xffff0000, 0xff000000,
 851	0x9148, 0xffff0000, 0xff000000,
 852	0x3f94, 0xffff0000, 0xff000000,
 853	0x914c, 0xffff0000, 0xff000000,
 854	0xc78, 0x00000080, 0x00000080,
 855	0xbd4, 0x70073777, 0x00010001,
 856	0xd02c, 0xbfffff1f, 0x08421000,
 857	0xd0b8, 0x03773777, 0x02011003,
 858	0x5bc0, 0x00200000, 0x50100000,
 859	0x98f8, 0x33773777, 0x02011003,
 860	0x98fc, 0xffffffff, 0x76543210,
 861	0x7030, 0x31000311, 0x00000011,
 862	0x2f48, 0x00000007, 0x02011003,
 863	0x6b28, 0x00000010, 0x00000012,
 864	0x7728, 0x00000010, 0x00000012,
 865	0x10328, 0x00000010, 0x00000012,
 866	0x10f28, 0x00000010, 0x00000012,
 867	0x11b28, 0x00000010, 0x00000012,
 868	0x12728, 0x00000010, 0x00000012,
 869	0x240c, 0x000007ff, 0x00000380,
 870	0x8a14, 0xf000001f, 0x00000007,
 871	0x8b24, 0x3fff3fff, 0x00ff0fff,
 872	0x8b10, 0x0000ff0f, 0x00000000,
 873	0x28a4c, 0x07ffffff, 0x06000000,
 874	0x10c, 0x00000001, 0x00010003,
 875	0xa02c, 0xffffffff, 0x0000009b,
 876	0x913c, 0x0000000f, 0x0100000a,
 877	0x8d00, 0xffff7f7f, 0x100e4848,
 878	0x8d04, 0x00ffffff, 0x00164745,
 879	0x8c00, 0xfffc0003, 0xe4000003,
 880	0x8c04, 0xf8ff00ff, 0x40600060,
 881	0x8c08, 0x00ff00ff, 0x001c001c,
 882	0x8cf0, 0x1fff1fff, 0x08e00620,
 883	0x8c20, 0x0fff0fff, 0x00800080,
 884	0x8c24, 0x0fff0fff, 0x00800080,
 885	0x8c18, 0xffffffff, 0x20202078,
 886	0x8c1c, 0x0000ffff, 0x00001010,
 887	0x28350, 0x00000f01, 0x00000000,
 888	0x9508, 0x3700001f, 0x00000002,
 889	0x960c, 0xffffffff, 0x54763210,
 890	0x88c4, 0x001f3ae3, 0x000000c2,
 891	0x88d4, 0x0000001f, 0x00000010,
 892	0x8974, 0xffffffff, 0x00000000
 893};
 894
 895static const u32 turks_golden_registers[] =
 896{
 897	0x5eb4, 0xffffffff, 0x00000002,
 898	0x5e78, 0x8f311ff1, 0x001000f0,
 899	0x8c8, 0x00003000, 0x00001070,
 900	0x8cc, 0x000fffff, 0x00040035,
 901	0x3f90, 0xffff0000, 0xfff00000,
 902	0x9148, 0xffff0000, 0xfff00000,
 903	0x3f94, 0xffff0000, 0xfff00000,
 904	0x914c, 0xffff0000, 0xfff00000,
 905	0xc78, 0x00000080, 0x00000080,
 906	0xbd4, 0x00073007, 0x00010002,
 907	0xd02c, 0xbfffff1f, 0x08421000,
 908	0xd0b8, 0x03773777, 0x02010002,
 909	0x5bc0, 0x00200000, 0x50100000,
 910	0x98f8, 0x33773777, 0x00010002,
 911	0x98fc, 0xffffffff, 0x33221100,
 912	0x7030, 0x31000311, 0x00000011,
 913	0x2f48, 0x33773777, 0x00010002,
 914	0x6b28, 0x00000010, 0x00000012,
 915	0x7728, 0x00000010, 0x00000012,
 916	0x10328, 0x00000010, 0x00000012,
 917	0x10f28, 0x00000010, 0x00000012,
 918	0x11b28, 0x00000010, 0x00000012,
 919	0x12728, 0x00000010, 0x00000012,
 920	0x240c, 0x000007ff, 0x00000380,
 921	0x8a14, 0xf000001f, 0x00000007,
 922	0x8b24, 0x3fff3fff, 0x00ff0fff,
 923	0x8b10, 0x0000ff0f, 0x00000000,
 924	0x28a4c, 0x07ffffff, 0x06000000,
 925	0x10c, 0x00000001, 0x00010003,
 926	0xa02c, 0xffffffff, 0x0000009b,
 927	0x913c, 0x0000000f, 0x0100000a,
 928	0x8d00, 0xffff7f7f, 0x100e4848,
 929	0x8d04, 0x00ffffff, 0x00164745,
 930	0x8c00, 0xfffc0003, 0xe4000003,
 931	0x8c04, 0xf8ff00ff, 0x40600060,
 932	0x8c08, 0x00ff00ff, 0x001c001c,
 933	0x8cf0, 0x1fff1fff, 0x08e00410,
 934	0x8c20, 0x0fff0fff, 0x00800080,
 935	0x8c24, 0x0fff0fff, 0x00800080,
 936	0x8c18, 0xffffffff, 0x20202078,
 937	0x8c1c, 0x0000ffff, 0x00001010,
 938	0x28350, 0x00000f01, 0x00000000,
 939	0x9508, 0x3700001f, 0x00000002,
 940	0x960c, 0xffffffff, 0x54763210,
 941	0x88c4, 0x001f3ae3, 0x000000c2,
 942	0x88d4, 0x0000001f, 0x00000010,
 943	0x8974, 0xffffffff, 0x00000000
 944};
 945
 946static const u32 caicos_golden_registers[] =
 947{
 948	0x5eb4, 0xffffffff, 0x00000002,
 949	0x5e78, 0x8f311ff1, 0x001000f0,
 950	0x8c8, 0x00003420, 0x00001450,
 951	0x8cc, 0x000fffff, 0x00040035,
 952	0x3f90, 0xffff0000, 0xfffc0000,
 953	0x9148, 0xffff0000, 0xfffc0000,
 954	0x3f94, 0xffff0000, 0xfffc0000,
 955	0x914c, 0xffff0000, 0xfffc0000,
 956	0xc78, 0x00000080, 0x00000080,
 957	0xbd4, 0x00073007, 0x00010001,
 958	0xd02c, 0xbfffff1f, 0x08421000,
 959	0xd0b8, 0x03773777, 0x02010001,
 960	0x5bc0, 0x00200000, 0x50100000,
 961	0x98f8, 0x33773777, 0x02010001,
 962	0x98fc, 0xffffffff, 0x33221100,
 963	0x7030, 0x31000311, 0x00000011,
 964	0x2f48, 0x33773777, 0x02010001,
 965	0x6b28, 0x00000010, 0x00000012,
 966	0x7728, 0x00000010, 0x00000012,
 967	0x10328, 0x00000010, 0x00000012,
 968	0x10f28, 0x00000010, 0x00000012,
 969	0x11b28, 0x00000010, 0x00000012,
 970	0x12728, 0x00000010, 0x00000012,
 971	0x240c, 0x000007ff, 0x00000380,
 972	0x8a14, 0xf000001f, 0x00000001,
 973	0x8b24, 0x3fff3fff, 0x00ff0fff,
 974	0x8b10, 0x0000ff0f, 0x00000000,
 975	0x28a4c, 0x07ffffff, 0x06000000,
 976	0x10c, 0x00000001, 0x00010003,
 977	0xa02c, 0xffffffff, 0x0000009b,
 978	0x913c, 0x0000000f, 0x0100000a,
 979	0x8d00, 0xffff7f7f, 0x100e4848,
 980	0x8d04, 0x00ffffff, 0x00164745,
 981	0x8c00, 0xfffc0003, 0xe4000003,
 982	0x8c04, 0xf8ff00ff, 0x40600060,
 983	0x8c08, 0x00ff00ff, 0x001c001c,
 984	0x8cf0, 0x1fff1fff, 0x08e00410,
 985	0x8c20, 0x0fff0fff, 0x00800080,
 986	0x8c24, 0x0fff0fff, 0x00800080,
 987	0x8c18, 0xffffffff, 0x20202078,
 988	0x8c1c, 0x0000ffff, 0x00001010,
 989	0x28350, 0x00000f01, 0x00000000,
 990	0x9508, 0x3700001f, 0x00000002,
 991	0x960c, 0xffffffff, 0x54763210,
 992	0x88c4, 0x001f3ae3, 0x000000c2,
 993	0x88d4, 0x0000001f, 0x00000010,
 994	0x8974, 0xffffffff, 0x00000000
 995};
 996
 997static void evergreen_init_golden_registers(struct radeon_device *rdev)
 998{
 999	switch (rdev->family) {
1000	case CHIP_CYPRESS:
1001	case CHIP_HEMLOCK:
1002		radeon_program_register_sequence(rdev,
1003						 evergreen_golden_registers,
1004						 (const u32)ARRAY_SIZE(evergreen_golden_registers));
1005		radeon_program_register_sequence(rdev,
1006						 evergreen_golden_registers2,
1007						 (const u32)ARRAY_SIZE(evergreen_golden_registers2));
1008		radeon_program_register_sequence(rdev,
1009						 cypress_mgcg_init,
1010						 (const u32)ARRAY_SIZE(cypress_mgcg_init));
1011		break;
1012	case CHIP_JUNIPER:
1013		radeon_program_register_sequence(rdev,
1014						 evergreen_golden_registers,
1015						 (const u32)ARRAY_SIZE(evergreen_golden_registers));
1016		radeon_program_register_sequence(rdev,
1017						 evergreen_golden_registers2,
1018						 (const u32)ARRAY_SIZE(evergreen_golden_registers2));
1019		radeon_program_register_sequence(rdev,
1020						 juniper_mgcg_init,
1021						 (const u32)ARRAY_SIZE(juniper_mgcg_init));
1022		break;
1023	case CHIP_REDWOOD:
1024		radeon_program_register_sequence(rdev,
1025						 evergreen_golden_registers,
1026						 (const u32)ARRAY_SIZE(evergreen_golden_registers));
1027		radeon_program_register_sequence(rdev,
1028						 evergreen_golden_registers2,
1029						 (const u32)ARRAY_SIZE(evergreen_golden_registers2));
1030		radeon_program_register_sequence(rdev,
1031						 redwood_mgcg_init,
1032						 (const u32)ARRAY_SIZE(redwood_mgcg_init));
1033		break;
1034	case CHIP_CEDAR:
1035		radeon_program_register_sequence(rdev,
1036						 cedar_golden_registers,
1037						 (const u32)ARRAY_SIZE(cedar_golden_registers));
1038		radeon_program_register_sequence(rdev,
1039						 evergreen_golden_registers2,
1040						 (const u32)ARRAY_SIZE(evergreen_golden_registers2));
1041		radeon_program_register_sequence(rdev,
1042						 cedar_mgcg_init,
1043						 (const u32)ARRAY_SIZE(cedar_mgcg_init));
1044		break;
1045	case CHIP_PALM:
1046		radeon_program_register_sequence(rdev,
1047						 wrestler_golden_registers,
1048						 (const u32)ARRAY_SIZE(wrestler_golden_registers));
1049		break;
1050	case CHIP_SUMO:
1051		radeon_program_register_sequence(rdev,
1052						 supersumo_golden_registers,
1053						 (const u32)ARRAY_SIZE(supersumo_golden_registers));
1054		break;
1055	case CHIP_SUMO2:
1056		radeon_program_register_sequence(rdev,
1057						 supersumo_golden_registers,
1058						 (const u32)ARRAY_SIZE(supersumo_golden_registers));
1059		radeon_program_register_sequence(rdev,
1060						 sumo_golden_registers,
1061						 (const u32)ARRAY_SIZE(sumo_golden_registers));
1062		break;
1063	case CHIP_BARTS:
1064		radeon_program_register_sequence(rdev,
1065						 barts_golden_registers,
1066						 (const u32)ARRAY_SIZE(barts_golden_registers));
1067		break;
1068	case CHIP_TURKS:
1069		radeon_program_register_sequence(rdev,
1070						 turks_golden_registers,
1071						 (const u32)ARRAY_SIZE(turks_golden_registers));
1072		break;
1073	case CHIP_CAICOS:
1074		radeon_program_register_sequence(rdev,
1075						 caicos_golden_registers,
1076						 (const u32)ARRAY_SIZE(caicos_golden_registers));
1077		break;
1078	default:
1079		break;
1080	}
1081}
1082
1083/**
1084 * evergreen_get_allowed_info_register - fetch the register for the info ioctl
1085 *
1086 * @rdev: radeon_device pointer
1087 * @reg: register offset in bytes
1088 * @val: register value
1089 *
1090 * Returns 0 for success or -EINVAL for an invalid register
1091 *
1092 */
1093int evergreen_get_allowed_info_register(struct radeon_device *rdev,
1094					u32 reg, u32 *val)
1095{
1096	switch (reg) {
1097	case GRBM_STATUS:
1098	case GRBM_STATUS_SE0:
1099	case GRBM_STATUS_SE1:
1100	case SRBM_STATUS:
1101	case SRBM_STATUS2:
1102	case DMA_STATUS_REG:
1103	case UVD_STATUS:
1104		*val = RREG32(reg);
1105		return 0;
1106	default:
1107		return -EINVAL;
1108	}
1109}
1110
1111void evergreen_tiling_fields(unsigned tiling_flags, unsigned *bankw,
1112			     unsigned *bankh, unsigned *mtaspect,
1113			     unsigned *tile_split)
1114{
1115	*bankw = (tiling_flags >> RADEON_TILING_EG_BANKW_SHIFT) & RADEON_TILING_EG_BANKW_MASK;
1116	*bankh = (tiling_flags >> RADEON_TILING_EG_BANKH_SHIFT) & RADEON_TILING_EG_BANKH_MASK;
1117	*mtaspect = (tiling_flags >> RADEON_TILING_EG_MACRO_TILE_ASPECT_SHIFT) & RADEON_TILING_EG_MACRO_TILE_ASPECT_MASK;
1118	*tile_split = (tiling_flags >> RADEON_TILING_EG_TILE_SPLIT_SHIFT) & RADEON_TILING_EG_TILE_SPLIT_MASK;
1119	switch (*bankw) {
1120	default:
1121	case 1: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_1; break;
1122	case 2: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_2; break;
1123	case 4: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_4; break;
1124	case 8: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_8; break;
1125	}
1126	switch (*bankh) {
1127	default:
1128	case 1: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_1; break;
1129	case 2: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_2; break;
1130	case 4: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_4; break;
1131	case 8: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_8; break;
1132	}
1133	switch (*mtaspect) {
1134	default:
1135	case 1: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_1; break;
1136	case 2: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_2; break;
1137	case 4: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_4; break;
1138	case 8: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_8; break;
1139	}
1140}
1141
1142static int sumo_set_uvd_clock(struct radeon_device *rdev, u32 clock,
1143			      u32 cntl_reg, u32 status_reg)
1144{
1145	int r, i;
1146	struct atom_clock_dividers dividers;
1147
1148	r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
1149					   clock, false, &dividers);
1150	if (r)
1151		return r;
1152
1153	WREG32_P(cntl_reg, dividers.post_div, ~(DCLK_DIR_CNTL_EN|DCLK_DIVIDER_MASK));
1154
1155	for (i = 0; i < 100; i++) {
1156		if (RREG32(status_reg) & DCLK_STATUS)
1157			break;
1158		mdelay(10);
1159	}
1160	if (i == 100)
1161		return -ETIMEDOUT;
1162
1163	return 0;
1164}
1165
1166int sumo_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
1167{
1168	int r = 0;
1169	u32 cg_scratch = RREG32(CG_SCRATCH1);
1170
1171	r = sumo_set_uvd_clock(rdev, vclk, CG_VCLK_CNTL, CG_VCLK_STATUS);
1172	if (r)
1173		goto done;
1174	cg_scratch &= 0xffff0000;
1175	cg_scratch |= vclk / 100; /* Mhz */
1176
1177	r = sumo_set_uvd_clock(rdev, dclk, CG_DCLK_CNTL, CG_DCLK_STATUS);
1178	if (r)
1179		goto done;
1180	cg_scratch &= 0x0000ffff;
1181	cg_scratch |= (dclk / 100) << 16; /* Mhz */
1182
1183done:
1184	WREG32(CG_SCRATCH1, cg_scratch);
1185
1186	return r;
1187}
1188
1189int evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
1190{
1191	/* start off with something large */
1192	unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
1193	int r;
1194
1195	/* bypass vclk and dclk with bclk */
1196	WREG32_P(CG_UPLL_FUNC_CNTL_2,
1197		VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
1198		~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
1199
1200	/* put PLL in bypass mode */
1201	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
1202
1203	if (!vclk || !dclk) {
1204		/* keep the Bypass mode, put PLL to sleep */
1205		WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
1206		return 0;
1207	}
1208
1209	r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 125000, 250000,
1210					  16384, 0x03FFFFFF, 0, 128, 5,
1211					  &fb_div, &vclk_div, &dclk_div);
1212	if (r)
1213		return r;
1214
1215	/* set VCO_MODE to 1 */
1216	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK);
1217
1218	/* toggle UPLL_SLEEP to 1 then back to 0 */
1219	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
1220	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK);
1221
1222	/* deassert UPLL_RESET */
1223	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
1224
1225	mdelay(1);
1226
1227	r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
1228	if (r)
1229		return r;
1230
1231	/* assert UPLL_RESET again */
1232	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
1233
1234	/* disable spread spectrum. */
1235	WREG32_P(CG_UPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
1236
1237	/* set feedback divider */
1238	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div), ~UPLL_FB_DIV_MASK);
1239
1240	/* set ref divider to 0 */
1241	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_REF_DIV_MASK);
1242
1243	if (fb_div < 307200)
1244		WREG32_P(CG_UPLL_FUNC_CNTL_4, 0, ~UPLL_SPARE_ISPARE9);
1245	else
1246		WREG32_P(CG_UPLL_FUNC_CNTL_4, UPLL_SPARE_ISPARE9, ~UPLL_SPARE_ISPARE9);
1247
1248	/* set PDIV_A and PDIV_B */
1249	WREG32_P(CG_UPLL_FUNC_CNTL_2,
1250		UPLL_PDIV_A(vclk_div) | UPLL_PDIV_B(dclk_div),
1251		~(UPLL_PDIV_A_MASK | UPLL_PDIV_B_MASK));
1252
1253	/* give the PLL some time to settle */
1254	mdelay(15);
1255
1256	/* deassert PLL_RESET */
1257	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
1258
1259	mdelay(15);
1260
1261	/* switch from bypass mode to normal mode */
1262	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
1263
1264	r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
1265	if (r)
1266		return r;
1267
1268	/* switch VCLK and DCLK selection */
1269	WREG32_P(CG_UPLL_FUNC_CNTL_2,
1270		VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
1271		~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
1272
1273	mdelay(100);
1274
1275	return 0;
1276}
1277
1278void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev)
1279{
1280	int readrq;
1281	u16 v;
1282
1283	readrq = pcie_get_readrq(rdev->pdev);
1284	v = ffs(readrq) - 8;
1285	/* if bios or OS sets MAX_READ_REQUEST_SIZE to an invalid value, fix it
1286	 * to avoid hangs or perfomance issues
1287	 */
1288	if ((v == 0) || (v == 6) || (v == 7))
1289		pcie_set_readrq(rdev->pdev, 512);
1290}
1291
1292void dce4_program_fmt(struct drm_encoder *encoder)
1293{
1294	struct drm_device *dev = encoder->dev;
1295	struct radeon_device *rdev = dev->dev_private;
1296	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1297	struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
1298	struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
1299	int bpc = 0;
1300	u32 tmp = 0;
1301	enum radeon_connector_dither dither = RADEON_FMT_DITHER_DISABLE;
1302
1303	if (connector) {
1304		struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1305		bpc = radeon_get_monitor_bpc(connector);
1306		dither = radeon_connector->dither;
1307	}
1308
1309	/* LVDS/eDP FMT is set up by atom */
1310	if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
1311		return;
1312
1313	/* not needed for analog */
1314	if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1) ||
1315	    (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2))
1316		return;
1317
1318	if (bpc == 0)
1319		return;
1320
1321	switch (bpc) {
1322	case 6:
1323		if (dither == RADEON_FMT_DITHER_ENABLE)
1324			/* XXX sort out optimal dither settings */
1325			tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
1326				FMT_SPATIAL_DITHER_EN);
1327		else
1328			tmp |= FMT_TRUNCATE_EN;
1329		break;
1330	case 8:
1331		if (dither == RADEON_FMT_DITHER_ENABLE)
1332			/* XXX sort out optimal dither settings */
1333			tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
1334				FMT_RGB_RANDOM_ENABLE |
1335				FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH);
1336		else
1337			tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH);
1338		break;
1339	case 10:
1340	default:
1341		/* not needed */
1342		break;
1343	}
1344
1345	WREG32(FMT_BIT_DEPTH_CONTROL + radeon_crtc->crtc_offset, tmp);
1346}
1347
1348static bool dce4_is_in_vblank(struct radeon_device *rdev, int crtc)
1349{
1350	if (RREG32(EVERGREEN_CRTC_STATUS + crtc_offsets[crtc]) & EVERGREEN_CRTC_V_BLANK)
1351		return true;
1352	else
1353		return false;
1354}
1355
1356static bool dce4_is_counter_moving(struct radeon_device *rdev, int crtc)
1357{
1358	u32 pos1, pos2;
1359
1360	pos1 = RREG32(EVERGREEN_CRTC_STATUS_POSITION + crtc_offsets[crtc]);
1361	pos2 = RREG32(EVERGREEN_CRTC_STATUS_POSITION + crtc_offsets[crtc]);
1362
1363	if (pos1 != pos2)
1364		return true;
1365	else
1366		return false;
1367}
1368
1369/**
1370 * dce4_wait_for_vblank - vblank wait asic callback.
1371 *
1372 * @rdev: radeon_device pointer
1373 * @crtc: crtc to wait for vblank on
1374 *
1375 * Wait for vblank on the requested crtc (evergreen+).
1376 */
1377void dce4_wait_for_vblank(struct radeon_device *rdev, int crtc)
1378{
1379	unsigned i = 0;
1380
1381	if (crtc >= rdev->num_crtc)
1382		return;
1383
1384	if (!(RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[crtc]) & EVERGREEN_CRTC_MASTER_EN))
1385		return;
1386
1387	/* depending on when we hit vblank, we may be close to active; if so,
1388	 * wait for another frame.
1389	 */
1390	while (dce4_is_in_vblank(rdev, crtc)) {
1391		if (i++ % 100 == 0) {
1392			if (!dce4_is_counter_moving(rdev, crtc))
1393				break;
1394		}
1395	}
1396
1397	while (!dce4_is_in_vblank(rdev, crtc)) {
1398		if (i++ % 100 == 0) {
1399			if (!dce4_is_counter_moving(rdev, crtc))
1400				break;
1401		}
1402	}
1403}
1404
1405/**
1406 * evergreen_page_flip - pageflip callback.
1407 *
1408 * @rdev: radeon_device pointer
1409 * @crtc_id: crtc to cleanup pageflip on
1410 * @crtc_base: new address of the crtc (GPU MC address)
1411 * @async: asynchronous flip
1412 *
1413 * Triggers the actual pageflip by updating the primary
1414 * surface base address (evergreen+).
1415 */
1416void evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base,
1417			 bool async)
1418{
1419	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
1420	struct drm_framebuffer *fb = radeon_crtc->base.primary->fb;
1421
1422	/* flip at hsync for async, default is vsync */
1423	WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset,
1424	       async ? EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
1425	/* update pitch */
1426	WREG32(EVERGREEN_GRPH_PITCH + radeon_crtc->crtc_offset,
1427	       fb->pitches[0] / fb->format->cpp[0]);
1428	/* update the scanout addresses */
1429	WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset,
1430	       upper_32_bits(crtc_base));
1431	WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
1432	       (u32)crtc_base);
1433	/* post the write */
1434	RREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset);
1435}
1436
1437/**
1438 * evergreen_page_flip_pending - check if page flip is still pending
1439 *
1440 * @rdev: radeon_device pointer
1441 * @crtc_id: crtc to check
1442 *
1443 * Returns the current update pending status.
1444 */
1445bool evergreen_page_flip_pending(struct radeon_device *rdev, int crtc_id)
1446{
1447	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
1448
1449	/* Return current update_pending status: */
1450	return !!(RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) &
1451		EVERGREEN_GRPH_SURFACE_UPDATE_PENDING);
1452}
1453
1454/* get temperature in millidegrees */
1455int evergreen_get_temp(struct radeon_device *rdev)
1456{
1457	u32 temp, toffset;
1458	int actual_temp = 0;
1459
1460	if (rdev->family == CHIP_JUNIPER) {
1461		toffset = (RREG32(CG_THERMAL_CTRL) & TOFFSET_MASK) >>
1462			TOFFSET_SHIFT;
1463		temp = (RREG32(CG_TS0_STATUS) & TS0_ADC_DOUT_MASK) >>
1464			TS0_ADC_DOUT_SHIFT;
1465
1466		if (toffset & 0x100)
1467			actual_temp = temp / 2 - (0x200 - toffset);
1468		else
1469			actual_temp = temp / 2 + toffset;
1470
1471		actual_temp = actual_temp * 1000;
1472
1473	} else {
1474		temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
1475			ASIC_T_SHIFT;
1476
1477		if (temp & 0x400)
1478			actual_temp = -256;
1479		else if (temp & 0x200)
1480			actual_temp = 255;
1481		else if (temp & 0x100) {
1482			actual_temp = temp & 0x1ff;
1483			actual_temp |= ~0x1ff;
1484		} else
1485			actual_temp = temp & 0xff;
1486
1487		actual_temp = (actual_temp * 1000) / 2;
1488	}
1489
1490	return actual_temp;
1491}
1492
1493int sumo_get_temp(struct radeon_device *rdev)
1494{
1495	u32 temp = RREG32(CG_THERMAL_STATUS) & 0xff;
1496	int actual_temp = temp - 49;
1497
1498	return actual_temp * 1000;
1499}
1500
1501/**
1502 * sumo_pm_init_profile - Initialize power profiles callback.
1503 *
1504 * @rdev: radeon_device pointer
1505 *
1506 * Initialize the power states used in profile mode
1507 * (sumo, trinity, SI).
1508 * Used for profile mode only.
1509 */
1510void sumo_pm_init_profile(struct radeon_device *rdev)
1511{
1512	int idx;
1513
1514	/* default */
1515	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
1516	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
1517	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
1518	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0;
1519
1520	/* low,mid sh/mh */
1521	if (rdev->flags & RADEON_IS_MOBILITY)
1522		idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_BATTERY, 0);
1523	else
1524		idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0);
1525
1526	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = idx;
1527	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = idx;
1528	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
1529	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
1530
1531	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = idx;
1532	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = idx;
1533	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
1534	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
1535
1536	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = idx;
1537	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = idx;
1538	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;
1539	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 0;
1540
1541	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = idx;
1542	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = idx;
1543	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;
1544	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0;
1545
1546	/* high sh/mh */
1547	idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0);
1548	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = idx;
1549	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = idx;
1550	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
1551	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx =
1552		rdev->pm.power_state[idx].num_clock_modes - 1;
1553
1554	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = idx;
1555	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = idx;
1556	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
1557	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx =
1558		rdev->pm.power_state[idx].num_clock_modes - 1;
1559}
1560
1561/**
1562 * btc_pm_init_profile - Initialize power profiles callback.
1563 *
1564 * @rdev: radeon_device pointer
1565 *
1566 * Initialize the power states used in profile mode
1567 * (BTC, cayman).
1568 * Used for profile mode only.
1569 */
1570void btc_pm_init_profile(struct radeon_device *rdev)
1571{
1572	int idx;
1573
1574	/* default */
1575	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
1576	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
1577	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
1578	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 2;
1579	/* starting with BTC, there is one state that is used for both
1580	 * MH and SH.  Difference is that we always use the high clock index for
1581	 * mclk.
1582	 */
1583	if (rdev->flags & RADEON_IS_MOBILITY)
1584		idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_BATTERY, 0);
1585	else
1586		idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0);
1587	/* low sh */
1588	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = idx;
1589	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = idx;
1590	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
1591	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
1592	/* mid sh */
1593	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = idx;
1594	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = idx;
1595	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;
1596	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 1;
1597	/* high sh */
1598	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = idx;
1599	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = idx;
1600	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
1601	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 2;
1602	/* low mh */
1603	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = idx;
1604	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = idx;
1605	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
1606	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
1607	/* mid mh */
1608	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = idx;
1609	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = idx;
1610	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;
1611	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 1;
1612	/* high mh */
1613	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = idx;
1614	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = idx;
1615	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
1616	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 2;
1617}
1618
1619/**
1620 * evergreen_pm_misc - set additional pm hw parameters callback.
1621 *
1622 * @rdev: radeon_device pointer
1623 *
1624 * Set non-clock parameters associated with a power state
1625 * (voltage, etc.) (evergreen+).
1626 */
1627void evergreen_pm_misc(struct radeon_device *rdev)
1628{
1629	int req_ps_idx = rdev->pm.requested_power_state_index;
1630	int req_cm_idx = rdev->pm.requested_clock_mode_index;
1631	struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
1632	struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
1633
1634	if (voltage->type == VOLTAGE_SW) {
1635		/* 0xff0x are flags rather then an actual voltage */
1636		if ((voltage->voltage & 0xff00) == 0xff00)
1637			return;
1638		if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) {
1639			radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
1640			rdev->pm.current_vddc = voltage->voltage;
1641			DRM_DEBUG("Setting: vddc: %d\n", voltage->voltage);
1642		}
1643
1644		/* starting with BTC, there is one state that is used for both
1645		 * MH and SH.  Difference is that we always use the high clock index for
1646		 * mclk and vddci.
1647		 */
1648		if ((rdev->pm.pm_method == PM_METHOD_PROFILE) &&
1649		    (rdev->family >= CHIP_BARTS) &&
1650		    rdev->pm.active_crtc_count &&
1651		    ((rdev->pm.profile_index == PM_PROFILE_MID_MH_IDX) ||
1652		     (rdev->pm.profile_index == PM_PROFILE_LOW_MH_IDX)))
1653			voltage = &rdev->pm.power_state[req_ps_idx].
1654				clock_info[rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx].voltage;
1655
1656		/* 0xff0x are flags rather then an actual voltage */
1657		if ((voltage->vddci & 0xff00) == 0xff00)
1658			return;
1659		if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) {
1660			radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI);
1661			rdev->pm.current_vddci = voltage->vddci;
1662			DRM_DEBUG("Setting: vddci: %d\n", voltage->vddci);
1663		}
1664	}
1665}
1666
1667/**
1668 * evergreen_pm_prepare - pre-power state change callback.
1669 *
1670 * @rdev: radeon_device pointer
1671 *
1672 * Prepare for a power state change (evergreen+).
1673 */
1674void evergreen_pm_prepare(struct radeon_device *rdev)
1675{
1676	struct drm_device *ddev = rdev_to_drm(rdev);
1677	struct drm_crtc *crtc;
1678	struct radeon_crtc *radeon_crtc;
1679	u32 tmp;
1680
1681	/* disable any active CRTCs */
1682	list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) {
1683		radeon_crtc = to_radeon_crtc(crtc);
1684		if (radeon_crtc->enabled) {
1685			tmp = RREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset);
1686			tmp |= EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
1687			WREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset, tmp);
1688		}
1689	}
1690}
1691
1692/**
1693 * evergreen_pm_finish - post-power state change callback.
1694 *
1695 * @rdev: radeon_device pointer
1696 *
1697 * Clean up after a power state change (evergreen+).
1698 */
1699void evergreen_pm_finish(struct radeon_device *rdev)
1700{
1701	struct drm_device *ddev = rdev_to_drm(rdev);
1702	struct drm_crtc *crtc;
1703	struct radeon_crtc *radeon_crtc;
1704	u32 tmp;
1705
1706	/* enable any active CRTCs */
1707	list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) {
1708		radeon_crtc = to_radeon_crtc(crtc);
1709		if (radeon_crtc->enabled) {
1710			tmp = RREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset);
1711			tmp &= ~EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
1712			WREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset, tmp);
1713		}
1714	}
1715}
1716
1717/**
1718 * evergreen_hpd_sense - hpd sense callback.
1719 *
1720 * @rdev: radeon_device pointer
1721 * @hpd: hpd (hotplug detect) pin
1722 *
1723 * Checks if a digital monitor is connected (evergreen+).
1724 * Returns true if connected, false if not connected.
1725 */
1726bool evergreen_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd)
1727{
1728	if (hpd == RADEON_HPD_NONE)
1729		return false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1730
1731	return !!(RREG32(DC_HPDx_INT_STATUS_REG(hpd)) & DC_HPDx_SENSE);
1732}
1733
1734/**
1735 * evergreen_hpd_set_polarity - hpd set polarity callback.
1736 *
1737 * @rdev: radeon_device pointer
1738 * @hpd: hpd (hotplug detect) pin
1739 *
1740 * Set the polarity of the hpd pin (evergreen+).
1741 */
1742void evergreen_hpd_set_polarity(struct radeon_device *rdev,
1743				enum radeon_hpd_id hpd)
1744{
 
1745	bool connected = evergreen_hpd_sense(rdev, hpd);
1746
1747	if (hpd == RADEON_HPD_NONE)
1748		return;
1749
1750	if (connected)
1751		WREG32_AND(DC_HPDx_INT_CONTROL(hpd), ~DC_HPDx_INT_POLARITY);
1752	else
1753		WREG32_OR(DC_HPDx_INT_CONTROL(hpd), DC_HPDx_INT_POLARITY);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1754}
1755
1756/**
1757 * evergreen_hpd_init - hpd setup callback.
1758 *
1759 * @rdev: radeon_device pointer
1760 *
1761 * Setup the hpd pins used by the card (evergreen+).
1762 * Enable the pin, set the polarity, and enable the hpd interrupts.
1763 */
1764void evergreen_hpd_init(struct radeon_device *rdev)
1765{
1766	struct drm_device *dev = rdev_to_drm(rdev);
1767	struct drm_connector *connector;
1768	unsigned enabled = 0;
1769	u32 tmp = DC_HPDx_CONNECTION_TIMER(0x9c4) |
1770		DC_HPDx_RX_INT_TIMER(0xfa) | DC_HPDx_EN;
1771
1772	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1773		enum radeon_hpd_id hpd =
1774			to_radeon_connector(connector)->hpd.hpd;
1775
1776		if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
1777		    connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
1778			/* don't try to enable hpd on eDP or LVDS avoid breaking the
1779			 * aux dp channel on imac and help (but not completely fix)
1780			 * https://bugzilla.redhat.com/show_bug.cgi?id=726143
1781			 * also avoid interrupt storms during dpms.
1782			 */
1783			continue;
1784		}
1785
1786		if (hpd == RADEON_HPD_NONE)
1787			continue;
1788
1789		WREG32(DC_HPDx_CONTROL(hpd), tmp);
1790		enabled |= 1 << hpd;
1791
1792		radeon_hpd_set_polarity(rdev, hpd);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1793	}
1794	radeon_irq_kms_enable_hpd(rdev, enabled);
1795}
1796
1797/**
1798 * evergreen_hpd_fini - hpd tear down callback.
1799 *
1800 * @rdev: radeon_device pointer
1801 *
1802 * Tear down the hpd pins used by the card (evergreen+).
1803 * Disable the hpd interrupts.
1804 */
1805void evergreen_hpd_fini(struct radeon_device *rdev)
1806{
1807	struct drm_device *dev = rdev_to_drm(rdev);
1808	struct drm_connector *connector;
1809	unsigned disabled = 0;
1810
1811	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1812		enum radeon_hpd_id hpd =
1813			to_radeon_connector(connector)->hpd.hpd;
1814
1815		if (hpd == RADEON_HPD_NONE)
1816			continue;
1817
1818		WREG32(DC_HPDx_CONTROL(hpd), 0);
1819		disabled |= 1 << hpd;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1820	}
1821	radeon_irq_kms_disable_hpd(rdev, disabled);
1822}
1823
1824/* watermark setup */
1825
1826static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev,
1827					struct radeon_crtc *radeon_crtc,
1828					struct drm_display_mode *mode,
1829					struct drm_display_mode *other_mode)
1830{
1831	u32 tmp, buffer_alloc, i;
1832	u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
1833	/*
1834	 * Line Buffer Setup
1835	 * There are 3 line buffers, each one shared by 2 display controllers.
1836	 * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between
1837	 * the display controllers.  The paritioning is done via one of four
1838	 * preset allocations specified in bits 2:0:
1839	 * first display controller
1840	 *  0 - first half of lb (3840 * 2)
1841	 *  1 - first 3/4 of lb (5760 * 2)
1842	 *  2 - whole lb (7680 * 2), other crtc must be disabled
1843	 *  3 - first 1/4 of lb (1920 * 2)
1844	 * second display controller
1845	 *  4 - second half of lb (3840 * 2)
1846	 *  5 - second 3/4 of lb (5760 * 2)
1847	 *  6 - whole lb (7680 * 2), other crtc must be disabled
1848	 *  7 - last 1/4 of lb (1920 * 2)
1849	 */
1850	/* this can get tricky if we have two large displays on a paired group
1851	 * of crtcs.  Ideally for multiple large displays we'd assign them to
1852	 * non-linked crtcs for maximum line buffer allocation.
1853	 */
1854	if (radeon_crtc->base.enabled && mode) {
1855		if (other_mode) {
1856			tmp = 0; /* 1/2 */
1857			buffer_alloc = 1;
1858		} else {
1859			tmp = 2; /* whole */
1860			buffer_alloc = 2;
1861		}
1862	} else {
1863		tmp = 0;
1864		buffer_alloc = 0;
1865	}
1866
1867	/* second controller of the pair uses second half of the lb */
1868	if (radeon_crtc->crtc_id % 2)
1869		tmp += 4;
1870	WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp);
1871
1872	if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) {
1873		WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
1874		       DMIF_BUFFERS_ALLOCATED(buffer_alloc));
1875		for (i = 0; i < rdev->usec_timeout; i++) {
1876			if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
1877			    DMIF_BUFFERS_ALLOCATED_COMPLETED)
1878				break;
1879			udelay(1);
1880		}
1881	}
1882
1883	if (radeon_crtc->base.enabled && mode) {
1884		switch (tmp) {
1885		case 0:
1886		case 4:
1887		default:
1888			if (ASIC_IS_DCE5(rdev))
1889				return 4096 * 2;
1890			else
1891				return 3840 * 2;
1892		case 1:
1893		case 5:
1894			if (ASIC_IS_DCE5(rdev))
1895				return 6144 * 2;
1896			else
1897				return 5760 * 2;
1898		case 2:
1899		case 6:
1900			if (ASIC_IS_DCE5(rdev))
1901				return 8192 * 2;
1902			else
1903				return 7680 * 2;
1904		case 3:
1905		case 7:
1906			if (ASIC_IS_DCE5(rdev))
1907				return 2048 * 2;
1908			else
1909				return 1920 * 2;
1910		}
1911	}
1912
1913	/* controller not enabled, so no lb used */
1914	return 0;
1915}
1916
1917u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev)
1918{
1919	u32 tmp = RREG32(MC_SHARED_CHMAP);
1920
1921	switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
1922	case 0:
1923	default:
1924		return 1;
1925	case 1:
1926		return 2;
1927	case 2:
1928		return 4;
1929	case 3:
1930		return 8;
1931	}
1932}
1933
1934struct evergreen_wm_params {
1935	u32 dram_channels; /* number of dram channels */
1936	u32 yclk;          /* bandwidth per dram data pin in kHz */
1937	u32 sclk;          /* engine clock in kHz */
1938	u32 disp_clk;      /* display clock in kHz */
1939	u32 src_width;     /* viewport width */
1940	u32 active_time;   /* active display time in ns */
1941	u32 blank_time;    /* blank time in ns */
1942	bool interlaced;    /* mode is interlaced */
1943	fixed20_12 vsc;    /* vertical scale ratio */
1944	u32 num_heads;     /* number of active crtcs */
1945	u32 bytes_per_pixel; /* bytes per pixel display + overlay */
1946	u32 lb_size;       /* line buffer allocated to pipe */
1947	u32 vtaps;         /* vertical scaler taps */
1948};
1949
1950static u32 evergreen_dram_bandwidth(struct evergreen_wm_params *wm)
1951{
1952	/* Calculate DRAM Bandwidth and the part allocated to display. */
1953	fixed20_12 dram_efficiency; /* 0.7 */
1954	fixed20_12 yclk, dram_channels, bandwidth;
1955	fixed20_12 a;
1956
1957	a.full = dfixed_const(1000);
1958	yclk.full = dfixed_const(wm->yclk);
1959	yclk.full = dfixed_div(yclk, a);
1960	dram_channels.full = dfixed_const(wm->dram_channels * 4);
1961	a.full = dfixed_const(10);
1962	dram_efficiency.full = dfixed_const(7);
1963	dram_efficiency.full = dfixed_div(dram_efficiency, a);
1964	bandwidth.full = dfixed_mul(dram_channels, yclk);
1965	bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
1966
1967	return dfixed_trunc(bandwidth);
1968}
1969
1970static u32 evergreen_dram_bandwidth_for_display(struct evergreen_wm_params *wm)
1971{
1972	/* Calculate DRAM Bandwidth and the part allocated to display. */
1973	fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
1974	fixed20_12 yclk, dram_channels, bandwidth;
1975	fixed20_12 a;
1976
1977	a.full = dfixed_const(1000);
1978	yclk.full = dfixed_const(wm->yclk);
1979	yclk.full = dfixed_div(yclk, a);
1980	dram_channels.full = dfixed_const(wm->dram_channels * 4);
1981	a.full = dfixed_const(10);
1982	disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
1983	disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
1984	bandwidth.full = dfixed_mul(dram_channels, yclk);
1985	bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
1986
1987	return dfixed_trunc(bandwidth);
1988}
1989
1990static u32 evergreen_data_return_bandwidth(struct evergreen_wm_params *wm)
1991{
1992	/* Calculate the display Data return Bandwidth */
1993	fixed20_12 return_efficiency; /* 0.8 */
1994	fixed20_12 sclk, bandwidth;
1995	fixed20_12 a;
1996
1997	a.full = dfixed_const(1000);
1998	sclk.full = dfixed_const(wm->sclk);
1999	sclk.full = dfixed_div(sclk, a);
2000	a.full = dfixed_const(10);
2001	return_efficiency.full = dfixed_const(8);
2002	return_efficiency.full = dfixed_div(return_efficiency, a);
2003	a.full = dfixed_const(32);
2004	bandwidth.full = dfixed_mul(a, sclk);
2005	bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
2006
2007	return dfixed_trunc(bandwidth);
2008}
2009
2010static u32 evergreen_dmif_request_bandwidth(struct evergreen_wm_params *wm)
2011{
2012	/* Calculate the DMIF Request Bandwidth */
2013	fixed20_12 disp_clk_request_efficiency; /* 0.8 */
2014	fixed20_12 disp_clk, bandwidth;
2015	fixed20_12 a;
2016
2017	a.full = dfixed_const(1000);
2018	disp_clk.full = dfixed_const(wm->disp_clk);
2019	disp_clk.full = dfixed_div(disp_clk, a);
2020	a.full = dfixed_const(10);
2021	disp_clk_request_efficiency.full = dfixed_const(8);
2022	disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
2023	a.full = dfixed_const(32);
2024	bandwidth.full = dfixed_mul(a, disp_clk);
2025	bandwidth.full = dfixed_mul(bandwidth, disp_clk_request_efficiency);
2026
2027	return dfixed_trunc(bandwidth);
2028}
2029
2030static u32 evergreen_available_bandwidth(struct evergreen_wm_params *wm)
2031{
2032	/* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
2033	u32 dram_bandwidth = evergreen_dram_bandwidth(wm);
2034	u32 data_return_bandwidth = evergreen_data_return_bandwidth(wm);
2035	u32 dmif_req_bandwidth = evergreen_dmif_request_bandwidth(wm);
2036
2037	return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
2038}
2039
2040static u32 evergreen_average_bandwidth(struct evergreen_wm_params *wm)
2041{
2042	/* Calculate the display mode Average Bandwidth
2043	 * DisplayMode should contain the source and destination dimensions,
2044	 * timing, etc.
2045	 */
2046	fixed20_12 bpp;
2047	fixed20_12 line_time;
2048	fixed20_12 src_width;
2049	fixed20_12 bandwidth;
2050	fixed20_12 a;
2051
2052	a.full = dfixed_const(1000);
2053	line_time.full = dfixed_const(wm->active_time + wm->blank_time);
2054	line_time.full = dfixed_div(line_time, a);
2055	bpp.full = dfixed_const(wm->bytes_per_pixel);
2056	src_width.full = dfixed_const(wm->src_width);
2057	bandwidth.full = dfixed_mul(src_width, bpp);
2058	bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
2059	bandwidth.full = dfixed_div(bandwidth, line_time);
2060
2061	return dfixed_trunc(bandwidth);
2062}
2063
2064static u32 evergreen_latency_watermark(struct evergreen_wm_params *wm)
2065{
2066	/* First calcualte the latency in ns */
2067	u32 mc_latency = 2000; /* 2000 ns. */
2068	u32 available_bandwidth = evergreen_available_bandwidth(wm);
2069	u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
2070	u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
2071	u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
2072	u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
2073		(wm->num_heads * cursor_line_pair_return_time);
2074	u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
2075	u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
2076	fixed20_12 a, b, c;
2077
2078	if (wm->num_heads == 0)
2079		return 0;
2080
2081	a.full = dfixed_const(2);
2082	b.full = dfixed_const(1);
2083	if ((wm->vsc.full > a.full) ||
2084	    ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
2085	    (wm->vtaps >= 5) ||
2086	    ((wm->vsc.full >= a.full) && wm->interlaced))
2087		max_src_lines_per_dst_line = 4;
2088	else
2089		max_src_lines_per_dst_line = 2;
2090
2091	a.full = dfixed_const(available_bandwidth);
2092	b.full = dfixed_const(wm->num_heads);
2093	a.full = dfixed_div(a, b);
2094
2095	lb_fill_bw = min(dfixed_trunc(a), wm->disp_clk * wm->bytes_per_pixel / 1000);
 
 
 
 
 
 
2096
2097	a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
2098	b.full = dfixed_const(1000);
2099	c.full = dfixed_const(lb_fill_bw);
2100	b.full = dfixed_div(c, b);
2101	a.full = dfixed_div(a, b);
2102	line_fill_time = dfixed_trunc(a);
2103
2104	if (line_fill_time < wm->active_time)
2105		return latency;
2106	else
2107		return latency + (line_fill_time - wm->active_time);
2108
2109}
2110
2111static bool evergreen_average_bandwidth_vs_dram_bandwidth_for_display(struct evergreen_wm_params *wm)
2112{
2113	if (evergreen_average_bandwidth(wm) <=
2114	    (evergreen_dram_bandwidth_for_display(wm) / wm->num_heads))
2115		return true;
2116	else
2117		return false;
2118};
2119
2120static bool evergreen_average_bandwidth_vs_available_bandwidth(struct evergreen_wm_params *wm)
2121{
2122	if (evergreen_average_bandwidth(wm) <=
2123	    (evergreen_available_bandwidth(wm) / wm->num_heads))
2124		return true;
2125	else
2126		return false;
2127};
2128
2129static bool evergreen_check_latency_hiding(struct evergreen_wm_params *wm)
2130{
2131	u32 lb_partitions = wm->lb_size / wm->src_width;
2132	u32 line_time = wm->active_time + wm->blank_time;
2133	u32 latency_tolerant_lines;
2134	u32 latency_hiding;
2135	fixed20_12 a;
2136
2137	a.full = dfixed_const(1);
2138	if (wm->vsc.full > a.full)
2139		latency_tolerant_lines = 1;
2140	else {
2141		if (lb_partitions <= (wm->vtaps + 1))
2142			latency_tolerant_lines = 1;
2143		else
2144			latency_tolerant_lines = 2;
2145	}
2146
2147	latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
2148
2149	if (evergreen_latency_watermark(wm) <= latency_hiding)
2150		return true;
2151	else
2152		return false;
2153}
2154
2155static void evergreen_program_watermarks(struct radeon_device *rdev,
2156					 struct radeon_crtc *radeon_crtc,
2157					 u32 lb_size, u32 num_heads)
2158{
2159	struct drm_display_mode *mode = &radeon_crtc->base.mode;
2160	struct evergreen_wm_params wm_low, wm_high;
2161	u32 dram_channels;
2162	u32 active_time;
2163	u32 line_time = 0;
2164	u32 latency_watermark_a = 0, latency_watermark_b = 0;
2165	u32 priority_a_mark = 0, priority_b_mark = 0;
2166	u32 priority_a_cnt = PRIORITY_OFF;
2167	u32 priority_b_cnt = PRIORITY_OFF;
2168	u32 pipe_offset = radeon_crtc->crtc_id * 16;
2169	u32 tmp, arb_control3;
2170	fixed20_12 a, b, c;
2171
2172	if (radeon_crtc->base.enabled && num_heads && mode) {
2173		active_time = (u32) div_u64((u64)mode->crtc_hdisplay * 1000000,
2174					    (u32)mode->clock);
2175		line_time = (u32) div_u64((u64)mode->crtc_htotal * 1000000,
2176					  (u32)mode->clock);
2177		line_time = min(line_time, (u32)65535);
2178		priority_a_cnt = 0;
2179		priority_b_cnt = 0;
2180		dram_channels = evergreen_get_number_of_dram_channels(rdev);
2181
2182		/* watermark for high clocks */
2183		if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
2184			wm_high.yclk =
2185				radeon_dpm_get_mclk(rdev, false) * 10;
2186			wm_high.sclk =
2187				radeon_dpm_get_sclk(rdev, false) * 10;
2188		} else {
2189			wm_high.yclk = rdev->pm.current_mclk * 10;
2190			wm_high.sclk = rdev->pm.current_sclk * 10;
2191		}
2192
2193		wm_high.disp_clk = mode->clock;
2194		wm_high.src_width = mode->crtc_hdisplay;
2195		wm_high.active_time = active_time;
2196		wm_high.blank_time = line_time - wm_high.active_time;
2197		wm_high.interlaced = false;
2198		if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2199			wm_high.interlaced = true;
2200		wm_high.vsc = radeon_crtc->vsc;
2201		wm_high.vtaps = 1;
2202		if (radeon_crtc->rmx_type != RMX_OFF)
2203			wm_high.vtaps = 2;
2204		wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
2205		wm_high.lb_size = lb_size;
2206		wm_high.dram_channels = dram_channels;
2207		wm_high.num_heads = num_heads;
2208
2209		/* watermark for low clocks */
2210		if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
2211			wm_low.yclk =
2212				radeon_dpm_get_mclk(rdev, true) * 10;
2213			wm_low.sclk =
2214				radeon_dpm_get_sclk(rdev, true) * 10;
2215		} else {
2216			wm_low.yclk = rdev->pm.current_mclk * 10;
2217			wm_low.sclk = rdev->pm.current_sclk * 10;
2218		}
2219
2220		wm_low.disp_clk = mode->clock;
2221		wm_low.src_width = mode->crtc_hdisplay;
2222		wm_low.active_time = active_time;
2223		wm_low.blank_time = line_time - wm_low.active_time;
2224		wm_low.interlaced = false;
2225		if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2226			wm_low.interlaced = true;
2227		wm_low.vsc = radeon_crtc->vsc;
2228		wm_low.vtaps = 1;
2229		if (radeon_crtc->rmx_type != RMX_OFF)
2230			wm_low.vtaps = 2;
2231		wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
2232		wm_low.lb_size = lb_size;
2233		wm_low.dram_channels = dram_channels;
2234		wm_low.num_heads = num_heads;
2235
2236		/* set for high clocks */
2237		latency_watermark_a = min(evergreen_latency_watermark(&wm_high), (u32)65535);
2238		/* set for low clocks */
2239		latency_watermark_b = min(evergreen_latency_watermark(&wm_low), (u32)65535);
2240
2241		/* possibly force display priority to high */
2242		/* should really do this at mode validation time... */
2243		if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
2244		    !evergreen_average_bandwidth_vs_available_bandwidth(&wm_high) ||
2245		    !evergreen_check_latency_hiding(&wm_high) ||
2246		    (rdev->disp_priority == 2)) {
2247			DRM_DEBUG_KMS("force priority a to high\n");
2248			priority_a_cnt |= PRIORITY_ALWAYS_ON;
2249		}
2250		if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
2251		    !evergreen_average_bandwidth_vs_available_bandwidth(&wm_low) ||
2252		    !evergreen_check_latency_hiding(&wm_low) ||
2253		    (rdev->disp_priority == 2)) {
2254			DRM_DEBUG_KMS("force priority b to high\n");
2255			priority_b_cnt |= PRIORITY_ALWAYS_ON;
2256		}
2257
2258		a.full = dfixed_const(1000);
2259		b.full = dfixed_const(mode->clock);
2260		b.full = dfixed_div(b, a);
2261		c.full = dfixed_const(latency_watermark_a);
2262		c.full = dfixed_mul(c, b);
2263		c.full = dfixed_mul(c, radeon_crtc->hsc);
2264		c.full = dfixed_div(c, a);
2265		a.full = dfixed_const(16);
2266		c.full = dfixed_div(c, a);
2267		priority_a_mark = dfixed_trunc(c);
2268		priority_a_cnt |= priority_a_mark & PRIORITY_MARK_MASK;
2269
2270		a.full = dfixed_const(1000);
2271		b.full = dfixed_const(mode->clock);
2272		b.full = dfixed_div(b, a);
2273		c.full = dfixed_const(latency_watermark_b);
2274		c.full = dfixed_mul(c, b);
2275		c.full = dfixed_mul(c, radeon_crtc->hsc);
2276		c.full = dfixed_div(c, a);
2277		a.full = dfixed_const(16);
2278		c.full = dfixed_div(c, a);
2279		priority_b_mark = dfixed_trunc(c);
2280		priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK;
2281
2282		/* Save number of lines the linebuffer leads before the scanout */
2283		radeon_crtc->lb_vblank_lead_lines = DIV_ROUND_UP(lb_size, mode->crtc_hdisplay);
2284	}
2285
2286	/* select wm A */
2287	arb_control3 = RREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset);
2288	tmp = arb_control3;
2289	tmp &= ~LATENCY_WATERMARK_MASK(3);
2290	tmp |= LATENCY_WATERMARK_MASK(1);
2291	WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, tmp);
2292	WREG32(PIPE0_LATENCY_CONTROL + pipe_offset,
2293	       (LATENCY_LOW_WATERMARK(latency_watermark_a) |
2294		LATENCY_HIGH_WATERMARK(line_time)));
2295	/* select wm B */
2296	tmp = RREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset);
2297	tmp &= ~LATENCY_WATERMARK_MASK(3);
2298	tmp |= LATENCY_WATERMARK_MASK(2);
2299	WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, tmp);
2300	WREG32(PIPE0_LATENCY_CONTROL + pipe_offset,
2301	       (LATENCY_LOW_WATERMARK(latency_watermark_b) |
2302		LATENCY_HIGH_WATERMARK(line_time)));
2303	/* restore original selection */
2304	WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, arb_control3);
2305
2306	/* write the priority marks */
2307	WREG32(PRIORITY_A_CNT + radeon_crtc->crtc_offset, priority_a_cnt);
2308	WREG32(PRIORITY_B_CNT + radeon_crtc->crtc_offset, priority_b_cnt);
2309
2310	/* save values for DPM */
2311	radeon_crtc->line_time = line_time;
2312	radeon_crtc->wm_high = latency_watermark_a;
2313	radeon_crtc->wm_low = latency_watermark_b;
2314}
2315
2316/**
2317 * evergreen_bandwidth_update - update display watermarks callback.
2318 *
2319 * @rdev: radeon_device pointer
2320 *
2321 * Update the display watermarks based on the requested mode(s)
2322 * (evergreen+).
2323 */
2324void evergreen_bandwidth_update(struct radeon_device *rdev)
2325{
2326	struct drm_display_mode *mode0 = NULL;
2327	struct drm_display_mode *mode1 = NULL;
2328	u32 num_heads = 0, lb_size;
2329	int i;
2330
2331	if (!rdev->mode_info.mode_config_initialized)
2332		return;
2333
2334	radeon_update_display_priority(rdev);
2335
2336	for (i = 0; i < rdev->num_crtc; i++) {
2337		if (rdev->mode_info.crtcs[i]->base.enabled)
2338			num_heads++;
2339	}
2340	for (i = 0; i < rdev->num_crtc; i += 2) {
2341		mode0 = &rdev->mode_info.crtcs[i]->base.mode;
2342		mode1 = &rdev->mode_info.crtcs[i+1]->base.mode;
2343		lb_size = evergreen_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i], mode0, mode1);
2344		evergreen_program_watermarks(rdev, rdev->mode_info.crtcs[i], lb_size, num_heads);
2345		lb_size = evergreen_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i+1], mode1, mode0);
2346		evergreen_program_watermarks(rdev, rdev->mode_info.crtcs[i+1], lb_size, num_heads);
2347	}
2348}
2349
2350/**
2351 * evergreen_mc_wait_for_idle - wait for MC idle callback.
2352 *
2353 * @rdev: radeon_device pointer
2354 *
2355 * Wait for the MC (memory controller) to be idle.
2356 * (evergreen+).
2357 * Returns 0 if the MC is idle, -1 if not.
2358 */
2359int evergreen_mc_wait_for_idle(struct radeon_device *rdev)
2360{
2361	unsigned i;
2362	u32 tmp;
2363
2364	for (i = 0; i < rdev->usec_timeout; i++) {
2365		/* read MC_STATUS */
2366		tmp = RREG32(SRBM_STATUS) & 0x1F00;
2367		if (!tmp)
2368			return 0;
2369		udelay(1);
2370	}
2371	return -1;
2372}
2373
2374/*
2375 * GART
2376 */
2377void evergreen_pcie_gart_tlb_flush(struct radeon_device *rdev)
2378{
2379	unsigned i;
2380	u32 tmp;
2381
2382	WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
2383
2384	WREG32(VM_CONTEXT0_REQUEST_RESPONSE, REQUEST_TYPE(1));
2385	for (i = 0; i < rdev->usec_timeout; i++) {
2386		/* read MC_STATUS */
2387		tmp = RREG32(VM_CONTEXT0_REQUEST_RESPONSE);
2388		tmp = (tmp & RESPONSE_TYPE_MASK) >> RESPONSE_TYPE_SHIFT;
2389		if (tmp == 2) {
2390			pr_warn("[drm] r600 flush TLB failed\n");
2391			return;
2392		}
2393		if (tmp) {
2394			return;
2395		}
2396		udelay(1);
2397	}
2398}
2399
2400static int evergreen_pcie_gart_enable(struct radeon_device *rdev)
2401{
2402	u32 tmp;
2403	int r;
2404
2405	if (rdev->gart.robj == NULL) {
2406		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
2407		return -EINVAL;
2408	}
2409	r = radeon_gart_table_vram_pin(rdev);
2410	if (r)
2411		return r;
2412	/* Setup L2 cache */
2413	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
2414				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
2415				EFFECTIVE_L2_QUEUE_SIZE(7));
2416	WREG32(VM_L2_CNTL2, 0);
2417	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
2418	/* Setup TLB control */
2419	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
2420		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
2421		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
2422		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
2423	if (rdev->flags & RADEON_IS_IGP) {
2424		WREG32(FUS_MC_VM_MD_L1_TLB0_CNTL, tmp);
2425		WREG32(FUS_MC_VM_MD_L1_TLB1_CNTL, tmp);
2426		WREG32(FUS_MC_VM_MD_L1_TLB2_CNTL, tmp);
2427	} else {
2428		WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
2429		WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
2430		WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
2431		if ((rdev->family == CHIP_JUNIPER) ||
2432		    (rdev->family == CHIP_CYPRESS) ||
2433		    (rdev->family == CHIP_HEMLOCK) ||
2434		    (rdev->family == CHIP_BARTS))
2435			WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
2436	}
2437	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
2438	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
2439	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
2440	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
2441	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
2442	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
2443	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
2444	WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
2445				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
2446	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
2447			(u32)(rdev->dummy_page.addr >> 12));
2448	WREG32(VM_CONTEXT1_CNTL, 0);
2449
2450	evergreen_pcie_gart_tlb_flush(rdev);
2451	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
2452		 (unsigned)(rdev->mc.gtt_size >> 20),
2453		 (unsigned long long)rdev->gart.table_addr);
2454	rdev->gart.ready = true;
2455	return 0;
2456}
2457
2458static void evergreen_pcie_gart_disable(struct radeon_device *rdev)
2459{
2460	u32 tmp;
2461
2462	/* Disable all tables */
2463	WREG32(VM_CONTEXT0_CNTL, 0);
2464	WREG32(VM_CONTEXT1_CNTL, 0);
2465
2466	/* Setup L2 cache */
2467	WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
2468				EFFECTIVE_L2_QUEUE_SIZE(7));
2469	WREG32(VM_L2_CNTL2, 0);
2470	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
2471	/* Setup TLB control */
2472	tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
2473	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
2474	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
2475	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
2476	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
2477	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
2478	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
2479	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
2480	radeon_gart_table_vram_unpin(rdev);
2481}
2482
2483static void evergreen_pcie_gart_fini(struct radeon_device *rdev)
2484{
2485	evergreen_pcie_gart_disable(rdev);
2486	radeon_gart_table_vram_free(rdev);
2487	radeon_gart_fini(rdev);
2488}
2489
2490
2491static void evergreen_agp_enable(struct radeon_device *rdev)
2492{
2493	u32 tmp;
2494
2495	/* Setup L2 cache */
2496	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
2497				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
2498				EFFECTIVE_L2_QUEUE_SIZE(7));
2499	WREG32(VM_L2_CNTL2, 0);
2500	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
2501	/* Setup TLB control */
2502	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
2503		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
2504		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
2505		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
2506	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
2507	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
2508	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
2509	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
2510	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
2511	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
2512	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
2513	WREG32(VM_CONTEXT0_CNTL, 0);
2514	WREG32(VM_CONTEXT1_CNTL, 0);
2515}
2516
2517static const unsigned ni_dig_offsets[] = {
 
2518	NI_DIG0_REGISTER_OFFSET,
2519	NI_DIG1_REGISTER_OFFSET,
2520	NI_DIG2_REGISTER_OFFSET,
2521	NI_DIG3_REGISTER_OFFSET,
2522	NI_DIG4_REGISTER_OFFSET,
2523	NI_DIG5_REGISTER_OFFSET
2524};
2525
2526static const unsigned ni_tx_offsets[] = {
 
2527	NI_DCIO_UNIPHY0_UNIPHY_TX_CONTROL1,
2528	NI_DCIO_UNIPHY1_UNIPHY_TX_CONTROL1,
2529	NI_DCIO_UNIPHY2_UNIPHY_TX_CONTROL1,
2530	NI_DCIO_UNIPHY3_UNIPHY_TX_CONTROL1,
2531	NI_DCIO_UNIPHY4_UNIPHY_TX_CONTROL1,
2532	NI_DCIO_UNIPHY5_UNIPHY_TX_CONTROL1
2533};
2534
2535static const unsigned evergreen_dp_offsets[] = {
 
2536	EVERGREEN_DP0_REGISTER_OFFSET,
2537	EVERGREEN_DP1_REGISTER_OFFSET,
2538	EVERGREEN_DP2_REGISTER_OFFSET,
2539	EVERGREEN_DP3_REGISTER_OFFSET,
2540	EVERGREEN_DP4_REGISTER_OFFSET,
2541	EVERGREEN_DP5_REGISTER_OFFSET
2542};
2543
2544static const unsigned evergreen_disp_int_status[] = {
2545	DISP_INTERRUPT_STATUS,
2546	DISP_INTERRUPT_STATUS_CONTINUE,
2547	DISP_INTERRUPT_STATUS_CONTINUE2,
2548	DISP_INTERRUPT_STATUS_CONTINUE3,
2549	DISP_INTERRUPT_STATUS_CONTINUE4,
2550	DISP_INTERRUPT_STATUS_CONTINUE5
2551};
2552
2553/*
2554 * Assumption is that EVERGREEN_CRTC_MASTER_EN enable for requested crtc
2555 * We go from crtc to connector and it is not relible  since it
2556 * should be an opposite direction .If crtc is enable then
2557 * find the dig_fe which selects this crtc and insure that it enable.
2558 * if such dig_fe is found then find dig_be which selects found dig_be and
2559 * insure that it enable and in DP_SST mode.
2560 * if UNIPHY_PLL_CONTROL1.enable then we should disconnect timing
2561 * from dp symbols clocks .
2562 */
2563static bool evergreen_is_dp_sst_stream_enabled(struct radeon_device *rdev,
2564					       unsigned crtc_id, unsigned *ret_dig_fe)
2565{
2566	unsigned i;
2567	unsigned dig_fe;
2568	unsigned dig_be;
2569	unsigned dig_en_be;
2570	unsigned uniphy_pll;
2571	unsigned digs_fe_selected;
2572	unsigned dig_be_mode;
2573	unsigned dig_fe_mask;
2574	bool is_enabled = false;
2575	bool found_crtc = false;
2576
2577	/* loop through all running dig_fe to find selected crtc */
2578	for (i = 0; i < ARRAY_SIZE(ni_dig_offsets); i++) {
2579		dig_fe = RREG32(NI_DIG_FE_CNTL + ni_dig_offsets[i]);
2580		if (dig_fe & NI_DIG_FE_CNTL_SYMCLK_FE_ON &&
2581		    crtc_id == NI_DIG_FE_CNTL_SOURCE_SELECT(dig_fe)) {
2582			/* found running pipe */
2583			found_crtc = true;
2584			dig_fe_mask = 1 << i;
2585			dig_fe = i;
2586			break;
2587		}
2588	}
2589
2590	if (found_crtc) {
2591		/* loop through all running dig_be to find selected dig_fe */
2592		for (i = 0; i < ARRAY_SIZE(ni_dig_offsets); i++) {
2593			dig_be = RREG32(NI_DIG_BE_CNTL + ni_dig_offsets[i]);
2594			/* if dig_fe_selected by dig_be? */
2595			digs_fe_selected = NI_DIG_BE_CNTL_FE_SOURCE_SELECT(dig_be);
2596			dig_be_mode = NI_DIG_FE_CNTL_MODE(dig_be);
2597			if (dig_fe_mask &  digs_fe_selected &&
2598			    /* if dig_be in sst mode? */
2599			    dig_be_mode == NI_DIG_BE_DPSST) {
2600				dig_en_be = RREG32(NI_DIG_BE_EN_CNTL +
2601						   ni_dig_offsets[i]);
2602				uniphy_pll = RREG32(NI_DCIO_UNIPHY0_PLL_CONTROL1 +
2603						    ni_tx_offsets[i]);
2604				/* dig_be enable and tx is running */
2605				if (dig_en_be & NI_DIG_BE_EN_CNTL_ENABLE &&
2606				    dig_en_be & NI_DIG_BE_EN_CNTL_SYMBCLK_ON &&
2607				    uniphy_pll & NI_DCIO_UNIPHY0_PLL_CONTROL1_ENABLE) {
2608					is_enabled = true;
2609					*ret_dig_fe = dig_fe;
2610					break;
2611				}
2612			}
2613		}
2614	}
2615
2616	return is_enabled;
2617}
2618
2619/*
2620 * Blank dig when in dp sst mode
2621 * Dig ignores crtc timing
2622 */
2623static void evergreen_blank_dp_output(struct radeon_device *rdev,
2624				      unsigned dig_fe)
2625{
2626	unsigned stream_ctrl;
2627	unsigned fifo_ctrl;
2628	unsigned counter = 0;
2629
2630	if (dig_fe >= ARRAY_SIZE(evergreen_dp_offsets)) {
2631		DRM_ERROR("invalid dig_fe %d\n", dig_fe);
2632		return;
2633	}
2634
2635	stream_ctrl = RREG32(EVERGREEN_DP_VID_STREAM_CNTL +
2636			     evergreen_dp_offsets[dig_fe]);
2637	if (!(stream_ctrl & EVERGREEN_DP_VID_STREAM_CNTL_ENABLE)) {
2638		DRM_ERROR("dig %d , should be enable\n", dig_fe);
2639		return;
2640	}
2641
2642	stream_ctrl &= ~EVERGREEN_DP_VID_STREAM_CNTL_ENABLE;
2643	WREG32(EVERGREEN_DP_VID_STREAM_CNTL +
2644	       evergreen_dp_offsets[dig_fe], stream_ctrl);
2645
2646	stream_ctrl = RREG32(EVERGREEN_DP_VID_STREAM_CNTL +
2647			     evergreen_dp_offsets[dig_fe]);
2648	while (counter < 32 && stream_ctrl & EVERGREEN_DP_VID_STREAM_STATUS) {
2649		msleep(1);
2650		counter++;
2651		stream_ctrl = RREG32(EVERGREEN_DP_VID_STREAM_CNTL +
2652				     evergreen_dp_offsets[dig_fe]);
2653	}
2654	if (counter >= 32)
2655		DRM_ERROR("counter exceeds %d\n", counter);
2656
2657	fifo_ctrl = RREG32(EVERGREEN_DP_STEER_FIFO + evergreen_dp_offsets[dig_fe]);
2658	fifo_ctrl |= EVERGREEN_DP_STEER_FIFO_RESET;
2659	WREG32(EVERGREEN_DP_STEER_FIFO + evergreen_dp_offsets[dig_fe], fifo_ctrl);
2660
2661}
2662
2663void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save)
2664{
2665	u32 crtc_enabled, tmp, frame_count, blackout;
2666	int i, j;
2667	unsigned dig_fe;
2668
2669	if (!ASIC_IS_NODCE(rdev)) {
2670		save->vga_render_control = RREG32(VGA_RENDER_CONTROL);
2671		save->vga_hdp_control = RREG32(VGA_HDP_CONTROL);
2672
2673		/* disable VGA render */
2674		WREG32(VGA_RENDER_CONTROL, 0);
2675	}
2676	/* blank the display controllers */
2677	for (i = 0; i < rdev->num_crtc; i++) {
2678		crtc_enabled = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]) & EVERGREEN_CRTC_MASTER_EN;
2679		if (crtc_enabled) {
2680			save->crtc_enabled[i] = true;
2681			if (ASIC_IS_DCE6(rdev)) {
2682				tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]);
2683				if (!(tmp & EVERGREEN_CRTC_BLANK_DATA_EN)) {
2684					radeon_wait_for_vblank(rdev, i);
2685					WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2686					tmp |= EVERGREEN_CRTC_BLANK_DATA_EN;
2687					WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
2688					WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2689				}
2690			} else {
2691				tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]);
2692				if (!(tmp & EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE)) {
2693					radeon_wait_for_vblank(rdev, i);
2694					WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2695					tmp |= EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
2696					WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp);
2697					WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2698				}
2699			}
2700			/* wait for the next frame */
2701			frame_count = radeon_get_vblank_counter(rdev, i);
2702			for (j = 0; j < rdev->usec_timeout; j++) {
2703				if (radeon_get_vblank_counter(rdev, i) != frame_count)
2704					break;
2705				udelay(1);
2706			}
2707			/*we should disable dig if it drives dp sst*/
2708			/*but we are in radeon_device_init and the topology is unknown*/
2709			/*and it is available after radeon_modeset_init*/
2710			/*the following method radeon_atom_encoder_dpms_dig*/
2711			/*does the job if we initialize it properly*/
2712			/*for now we do it this manually*/
2713			/**/
2714			if (ASIC_IS_DCE5(rdev) &&
2715			    evergreen_is_dp_sst_stream_enabled(rdev, i, &dig_fe))
2716				evergreen_blank_dp_output(rdev, dig_fe);
2717			/*we could remove 6 lines below*/
2718			/* XXX this is a hack to avoid strange behavior with EFI on certain systems */
2719			WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2720			tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]);
2721			tmp &= ~EVERGREEN_CRTC_MASTER_EN;
2722			WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp);
2723			WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2724			save->crtc_enabled[i] = false;
2725			/* ***** */
2726		} else {
2727			save->crtc_enabled[i] = false;
2728		}
2729	}
2730
2731	radeon_mc_wait_for_idle(rdev);
2732
2733	blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
2734	if ((blackout & BLACKOUT_MODE_MASK) != 1) {
2735		/* Block CPU access */
2736		WREG32(BIF_FB_EN, 0);
2737		/* blackout the MC */
2738		blackout &= ~BLACKOUT_MODE_MASK;
2739		WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1);
2740	}
2741	/* wait for the MC to settle */
2742	udelay(100);
2743
2744	/* lock double buffered regs */
2745	for (i = 0; i < rdev->num_crtc; i++) {
2746		if (save->crtc_enabled[i]) {
2747			tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
2748			if (!(tmp & EVERGREEN_GRPH_UPDATE_LOCK)) {
2749				tmp |= EVERGREEN_GRPH_UPDATE_LOCK;
2750				WREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i], tmp);
2751			}
2752			tmp = RREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i]);
2753			if (!(tmp & 1)) {
2754				tmp |= 1;
2755				WREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i], tmp);
2756			}
2757		}
2758	}
2759}
2760
2761void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save)
2762{
2763	u32 tmp, frame_count;
2764	int i, j;
2765
2766	/* update crtc base addresses */
2767	for (i = 0; i < rdev->num_crtc; i++) {
2768		WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
2769		       upper_32_bits(rdev->mc.vram_start));
2770		WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
2771		       upper_32_bits(rdev->mc.vram_start));
2772		WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + crtc_offsets[i],
2773		       (u32)rdev->mc.vram_start);
2774		WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + crtc_offsets[i],
2775		       (u32)rdev->mc.vram_start);
2776	}
2777
2778	if (!ASIC_IS_NODCE(rdev)) {
2779		WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS_HIGH, upper_32_bits(rdev->mc.vram_start));
2780		WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS, (u32)rdev->mc.vram_start);
2781	}
2782
2783	/* unlock regs and wait for update */
2784	for (i = 0; i < rdev->num_crtc; i++) {
2785		if (save->crtc_enabled[i]) {
2786			tmp = RREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i]);
2787			if ((tmp & 0x7) != 0) {
2788				tmp &= ~0x7;
 
2789				WREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i], tmp);
2790			}
2791			tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
2792			if (tmp & EVERGREEN_GRPH_UPDATE_LOCK) {
2793				tmp &= ~EVERGREEN_GRPH_UPDATE_LOCK;
2794				WREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i], tmp);
2795			}
2796			tmp = RREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i]);
2797			if (tmp & 1) {
2798				tmp &= ~1;
2799				WREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i], tmp);
2800			}
2801			for (j = 0; j < rdev->usec_timeout; j++) {
2802				tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
2803				if ((tmp & EVERGREEN_GRPH_SURFACE_UPDATE_PENDING) == 0)
2804					break;
2805				udelay(1);
2806			}
2807		}
2808	}
2809
2810	/* unblackout the MC */
2811	tmp = RREG32(MC_SHARED_BLACKOUT_CNTL);
2812	tmp &= ~BLACKOUT_MODE_MASK;
2813	WREG32(MC_SHARED_BLACKOUT_CNTL, tmp);
2814	/* allow CPU access */
2815	WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
2816
2817	for (i = 0; i < rdev->num_crtc; i++) {
2818		if (save->crtc_enabled[i]) {
2819			if (ASIC_IS_DCE6(rdev)) {
2820				tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]);
2821				tmp &= ~EVERGREEN_CRTC_BLANK_DATA_EN;
2822				WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2823				WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
2824				WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2825			} else {
2826				tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]);
2827				tmp &= ~EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
2828				WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2829				WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp);
2830				WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2831			}
2832			/* wait for the next frame */
2833			frame_count = radeon_get_vblank_counter(rdev, i);
2834			for (j = 0; j < rdev->usec_timeout; j++) {
2835				if (radeon_get_vblank_counter(rdev, i) != frame_count)
2836					break;
2837				udelay(1);
2838			}
2839		}
2840	}
2841	if (!ASIC_IS_NODCE(rdev)) {
2842		/* Unlock vga access */
2843		WREG32(VGA_HDP_CONTROL, save->vga_hdp_control);
2844		mdelay(1);
2845		WREG32(VGA_RENDER_CONTROL, save->vga_render_control);
2846	}
2847}
2848
2849void evergreen_mc_program(struct radeon_device *rdev)
2850{
2851	struct evergreen_mc_save save;
2852	u32 tmp;
2853	int i, j;
2854
2855	/* Initialize HDP */
2856	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
2857		WREG32((0x2c14 + j), 0x00000000);
2858		WREG32((0x2c18 + j), 0x00000000);
2859		WREG32((0x2c1c + j), 0x00000000);
2860		WREG32((0x2c20 + j), 0x00000000);
2861		WREG32((0x2c24 + j), 0x00000000);
2862	}
2863	WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
2864
2865	evergreen_mc_stop(rdev, &save);
2866	if (evergreen_mc_wait_for_idle(rdev)) {
2867		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
2868	}
2869	/* Lockout access through VGA aperture*/
2870	WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
2871	/* Update configuration */
2872	if (rdev->flags & RADEON_IS_AGP) {
2873		if (rdev->mc.vram_start < rdev->mc.gtt_start) {
2874			/* VRAM before AGP */
2875			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
2876				rdev->mc.vram_start >> 12);
2877			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
2878				rdev->mc.gtt_end >> 12);
2879		} else {
2880			/* VRAM after AGP */
2881			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
2882				rdev->mc.gtt_start >> 12);
2883			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
2884				rdev->mc.vram_end >> 12);
2885		}
2886	} else {
2887		WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
2888			rdev->mc.vram_start >> 12);
2889		WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
2890			rdev->mc.vram_end >> 12);
2891	}
2892	WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
2893	/* llano/ontario only */
2894	if ((rdev->family == CHIP_PALM) ||
2895	    (rdev->family == CHIP_SUMO) ||
2896	    (rdev->family == CHIP_SUMO2)) {
2897		tmp = RREG32(MC_FUS_VM_FB_OFFSET) & 0x000FFFFF;
2898		tmp |= ((rdev->mc.vram_end >> 20) & 0xF) << 24;
2899		tmp |= ((rdev->mc.vram_start >> 20) & 0xF) << 20;
2900		WREG32(MC_FUS_VM_FB_OFFSET, tmp);
2901	}
2902	tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
2903	tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
2904	WREG32(MC_VM_FB_LOCATION, tmp);
2905	WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
2906	WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
2907	WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
2908	if (rdev->flags & RADEON_IS_AGP) {
2909		WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16);
2910		WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16);
2911		WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
2912	} else {
2913		WREG32(MC_VM_AGP_BASE, 0);
2914		WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
2915		WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
2916	}
2917	if (evergreen_mc_wait_for_idle(rdev)) {
2918		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
2919	}
2920	evergreen_mc_resume(rdev, &save);
2921	/* we need to own VRAM, so turn off the VGA renderer here
2922	 * to stop it overwriting our objects */
2923	rv515_vga_render_disable(rdev);
2924}
2925
2926/*
2927 * CP.
2928 */
2929void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
2930{
2931	struct radeon_ring *ring = &rdev->ring[ib->ring];
2932	u32 next_rptr;
2933
2934	/* set to DX10/11 mode */
2935	radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
2936	radeon_ring_write(ring, 1);
2937
2938	if (ring->rptr_save_reg) {
2939		next_rptr = ring->wptr + 3 + 4;
2940		radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
2941		radeon_ring_write(ring, ((ring->rptr_save_reg - 
2942					  PACKET3_SET_CONFIG_REG_START) >> 2));
2943		radeon_ring_write(ring, next_rptr);
2944	} else if (rdev->wb.enabled) {
2945		next_rptr = ring->wptr + 5 + 4;
2946		radeon_ring_write(ring, PACKET3(PACKET3_MEM_WRITE, 3));
2947		radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
2948		radeon_ring_write(ring, (upper_32_bits(ring->next_rptr_gpu_addr) & 0xff) | (1 << 18));
2949		radeon_ring_write(ring, next_rptr);
2950		radeon_ring_write(ring, 0);
2951	}
2952
2953	radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
2954	radeon_ring_write(ring,
2955#ifdef __BIG_ENDIAN
2956			  (2 << 0) |
2957#endif
2958			  (ib->gpu_addr & 0xFFFFFFFC));
2959	radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF);
2960	radeon_ring_write(ring, ib->length_dw);
2961}
2962
2963
2964static int evergreen_cp_load_microcode(struct radeon_device *rdev)
2965{
2966	const __be32 *fw_data;
2967	int i;
2968
2969	if (!rdev->me_fw || !rdev->pfp_fw)
2970		return -EINVAL;
2971
2972	r700_cp_stop(rdev);
2973	WREG32(CP_RB_CNTL,
2974#ifdef __BIG_ENDIAN
2975	       BUF_SWAP_32BIT |
2976#endif
2977	       RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
2978
2979	fw_data = (const __be32 *)rdev->pfp_fw->data;
2980	WREG32(CP_PFP_UCODE_ADDR, 0);
2981	for (i = 0; i < EVERGREEN_PFP_UCODE_SIZE; i++)
2982		WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
2983	WREG32(CP_PFP_UCODE_ADDR, 0);
2984
2985	fw_data = (const __be32 *)rdev->me_fw->data;
2986	WREG32(CP_ME_RAM_WADDR, 0);
2987	for (i = 0; i < EVERGREEN_PM4_UCODE_SIZE; i++)
2988		WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
2989
2990	WREG32(CP_PFP_UCODE_ADDR, 0);
2991	WREG32(CP_ME_RAM_WADDR, 0);
2992	WREG32(CP_ME_RAM_RADDR, 0);
2993	return 0;
2994}
2995
2996static int evergreen_cp_start(struct radeon_device *rdev)
2997{
2998	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2999	int r, i;
3000	uint32_t cp_me;
3001
3002	r = radeon_ring_lock(rdev, ring, 7);
3003	if (r) {
3004		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
3005		return r;
3006	}
3007	radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
3008	radeon_ring_write(ring, 0x1);
3009	radeon_ring_write(ring, 0x0);
3010	radeon_ring_write(ring, rdev->config.evergreen.max_hw_contexts - 1);
3011	radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
3012	radeon_ring_write(ring, 0);
3013	radeon_ring_write(ring, 0);
3014	radeon_ring_unlock_commit(rdev, ring, false);
3015
3016	cp_me = 0xff;
3017	WREG32(CP_ME_CNTL, cp_me);
3018
3019	r = radeon_ring_lock(rdev, ring, evergreen_default_size + 19);
3020	if (r) {
3021		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
3022		return r;
3023	}
3024
3025	/* setup clear context state */
3026	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
3027	radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
3028
3029	for (i = 0; i < evergreen_default_size; i++)
3030		radeon_ring_write(ring, evergreen_default_state[i]);
3031
3032	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
3033	radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
3034
3035	/* set clear context state */
3036	radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
3037	radeon_ring_write(ring, 0);
3038
3039	/* SQ_VTX_BASE_VTX_LOC */
3040	radeon_ring_write(ring, 0xc0026f00);
3041	radeon_ring_write(ring, 0x00000000);
3042	radeon_ring_write(ring, 0x00000000);
3043	radeon_ring_write(ring, 0x00000000);
3044
3045	/* Clear consts */
3046	radeon_ring_write(ring, 0xc0036f00);
3047	radeon_ring_write(ring, 0x00000bc4);
3048	radeon_ring_write(ring, 0xffffffff);
3049	radeon_ring_write(ring, 0xffffffff);
3050	radeon_ring_write(ring, 0xffffffff);
3051
3052	radeon_ring_write(ring, 0xc0026900);
3053	radeon_ring_write(ring, 0x00000316);
3054	radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
3055	radeon_ring_write(ring, 0x00000010); /*  */
3056
3057	radeon_ring_unlock_commit(rdev, ring, false);
3058
3059	return 0;
3060}
3061
3062static int evergreen_cp_resume(struct radeon_device *rdev)
3063{
3064	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
3065	u32 tmp;
3066	u32 rb_bufsz;
3067	int r;
3068
3069	/* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
3070	WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
3071				 SOFT_RESET_PA |
3072				 SOFT_RESET_SH |
3073				 SOFT_RESET_VGT |
3074				 SOFT_RESET_SPI |
3075				 SOFT_RESET_SX));
3076	RREG32(GRBM_SOFT_RESET);
3077	mdelay(15);
3078	WREG32(GRBM_SOFT_RESET, 0);
3079	RREG32(GRBM_SOFT_RESET);
3080
3081	/* Set ring buffer size */
3082	rb_bufsz = order_base_2(ring->ring_size / 8);
3083	tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
3084#ifdef __BIG_ENDIAN
3085	tmp |= BUF_SWAP_32BIT;
3086#endif
3087	WREG32(CP_RB_CNTL, tmp);
3088	WREG32(CP_SEM_WAIT_TIMER, 0x0);
3089	WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
3090
3091	/* Set the write pointer delay */
3092	WREG32(CP_RB_WPTR_DELAY, 0);
3093
3094	/* Initialize the ring buffer's read and write pointers */
3095	WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA);
3096	WREG32(CP_RB_RPTR_WR, 0);
3097	ring->wptr = 0;
3098	WREG32(CP_RB_WPTR, ring->wptr);
3099
3100	/* set the wb address whether it's enabled or not */
3101	WREG32(CP_RB_RPTR_ADDR,
3102	       ((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC));
3103	WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
3104	WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
3105
3106	if (rdev->wb.enabled)
3107		WREG32(SCRATCH_UMSK, 0xff);
3108	else {
3109		tmp |= RB_NO_UPDATE;
3110		WREG32(SCRATCH_UMSK, 0);
3111	}
3112
3113	mdelay(1);
3114	WREG32(CP_RB_CNTL, tmp);
3115
3116	WREG32(CP_RB_BASE, ring->gpu_addr >> 8);
3117	WREG32(CP_DEBUG, (1 << 27) | (1 << 28));
3118
3119	evergreen_cp_start(rdev);
3120	ring->ready = true;
3121	r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring);
3122	if (r) {
3123		ring->ready = false;
3124		return r;
3125	}
3126	return 0;
3127}
3128
3129/*
3130 * Core functions
3131 */
3132static void evergreen_gpu_init(struct radeon_device *rdev)
3133{
3134	u32 gb_addr_config;
3135	u32 mc_arb_ramcfg;
3136	u32 sx_debug_1;
3137	u32 smx_dc_ctl0;
3138	u32 sq_config;
3139	u32 sq_lds_resource_mgmt;
3140	u32 sq_gpr_resource_mgmt_1;
3141	u32 sq_gpr_resource_mgmt_2;
3142	u32 sq_gpr_resource_mgmt_3;
3143	u32 sq_thread_resource_mgmt;
3144	u32 sq_thread_resource_mgmt_2;
3145	u32 sq_stack_resource_mgmt_1;
3146	u32 sq_stack_resource_mgmt_2;
3147	u32 sq_stack_resource_mgmt_3;
3148	u32 vgt_cache_invalidation;
3149	u32 hdp_host_path_cntl, tmp;
3150	u32 disabled_rb_mask;
3151	int i, j, ps_thread_count;
3152
3153	switch (rdev->family) {
3154	case CHIP_CYPRESS:
3155	case CHIP_HEMLOCK:
3156		rdev->config.evergreen.num_ses = 2;
3157		rdev->config.evergreen.max_pipes = 4;
3158		rdev->config.evergreen.max_tile_pipes = 8;
3159		rdev->config.evergreen.max_simds = 10;
3160		rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses;
3161		rdev->config.evergreen.max_gprs = 256;
3162		rdev->config.evergreen.max_threads = 248;
3163		rdev->config.evergreen.max_gs_threads = 32;
3164		rdev->config.evergreen.max_stack_entries = 512;
3165		rdev->config.evergreen.sx_num_of_sets = 4;
3166		rdev->config.evergreen.sx_max_export_size = 256;
3167		rdev->config.evergreen.sx_max_export_pos_size = 64;
3168		rdev->config.evergreen.sx_max_export_smx_size = 192;
3169		rdev->config.evergreen.max_hw_contexts = 8;
3170		rdev->config.evergreen.sq_num_cf_insts = 2;
3171
3172		rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3173		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3174		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3175		gb_addr_config = CYPRESS_GB_ADDR_CONFIG_GOLDEN;
3176		break;
3177	case CHIP_JUNIPER:
3178		rdev->config.evergreen.num_ses = 1;
3179		rdev->config.evergreen.max_pipes = 4;
3180		rdev->config.evergreen.max_tile_pipes = 4;
3181		rdev->config.evergreen.max_simds = 10;
3182		rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses;
3183		rdev->config.evergreen.max_gprs = 256;
3184		rdev->config.evergreen.max_threads = 248;
3185		rdev->config.evergreen.max_gs_threads = 32;
3186		rdev->config.evergreen.max_stack_entries = 512;
3187		rdev->config.evergreen.sx_num_of_sets = 4;
3188		rdev->config.evergreen.sx_max_export_size = 256;
3189		rdev->config.evergreen.sx_max_export_pos_size = 64;
3190		rdev->config.evergreen.sx_max_export_smx_size = 192;
3191		rdev->config.evergreen.max_hw_contexts = 8;
3192		rdev->config.evergreen.sq_num_cf_insts = 2;
3193
3194		rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3195		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3196		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3197		gb_addr_config = JUNIPER_GB_ADDR_CONFIG_GOLDEN;
3198		break;
3199	case CHIP_REDWOOD:
3200		rdev->config.evergreen.num_ses = 1;
3201		rdev->config.evergreen.max_pipes = 4;
3202		rdev->config.evergreen.max_tile_pipes = 4;
3203		rdev->config.evergreen.max_simds = 5;
3204		rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses;
3205		rdev->config.evergreen.max_gprs = 256;
3206		rdev->config.evergreen.max_threads = 248;
3207		rdev->config.evergreen.max_gs_threads = 32;
3208		rdev->config.evergreen.max_stack_entries = 256;
3209		rdev->config.evergreen.sx_num_of_sets = 4;
3210		rdev->config.evergreen.sx_max_export_size = 256;
3211		rdev->config.evergreen.sx_max_export_pos_size = 64;
3212		rdev->config.evergreen.sx_max_export_smx_size = 192;
3213		rdev->config.evergreen.max_hw_contexts = 8;
3214		rdev->config.evergreen.sq_num_cf_insts = 2;
3215
3216		rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3217		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3218		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3219		gb_addr_config = REDWOOD_GB_ADDR_CONFIG_GOLDEN;
3220		break;
3221	case CHIP_CEDAR:
3222	default:
3223		rdev->config.evergreen.num_ses = 1;
3224		rdev->config.evergreen.max_pipes = 2;
3225		rdev->config.evergreen.max_tile_pipes = 2;
3226		rdev->config.evergreen.max_simds = 2;
3227		rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3228		rdev->config.evergreen.max_gprs = 256;
3229		rdev->config.evergreen.max_threads = 192;
3230		rdev->config.evergreen.max_gs_threads = 16;
3231		rdev->config.evergreen.max_stack_entries = 256;
3232		rdev->config.evergreen.sx_num_of_sets = 4;
3233		rdev->config.evergreen.sx_max_export_size = 128;
3234		rdev->config.evergreen.sx_max_export_pos_size = 32;
3235		rdev->config.evergreen.sx_max_export_smx_size = 96;
3236		rdev->config.evergreen.max_hw_contexts = 4;
3237		rdev->config.evergreen.sq_num_cf_insts = 1;
3238
3239		rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3240		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3241		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3242		gb_addr_config = CEDAR_GB_ADDR_CONFIG_GOLDEN;
3243		break;
3244	case CHIP_PALM:
3245		rdev->config.evergreen.num_ses = 1;
3246		rdev->config.evergreen.max_pipes = 2;
3247		rdev->config.evergreen.max_tile_pipes = 2;
3248		rdev->config.evergreen.max_simds = 2;
3249		rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3250		rdev->config.evergreen.max_gprs = 256;
3251		rdev->config.evergreen.max_threads = 192;
3252		rdev->config.evergreen.max_gs_threads = 16;
3253		rdev->config.evergreen.max_stack_entries = 256;
3254		rdev->config.evergreen.sx_num_of_sets = 4;
3255		rdev->config.evergreen.sx_max_export_size = 128;
3256		rdev->config.evergreen.sx_max_export_pos_size = 32;
3257		rdev->config.evergreen.sx_max_export_smx_size = 96;
3258		rdev->config.evergreen.max_hw_contexts = 4;
3259		rdev->config.evergreen.sq_num_cf_insts = 1;
3260
3261		rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3262		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3263		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3264		gb_addr_config = CEDAR_GB_ADDR_CONFIG_GOLDEN;
3265		break;
3266	case CHIP_SUMO:
3267		rdev->config.evergreen.num_ses = 1;
3268		rdev->config.evergreen.max_pipes = 4;
3269		rdev->config.evergreen.max_tile_pipes = 4;
3270		if (rdev->pdev->device == 0x9648)
3271			rdev->config.evergreen.max_simds = 3;
3272		else if ((rdev->pdev->device == 0x9647) ||
3273			 (rdev->pdev->device == 0x964a))
3274			rdev->config.evergreen.max_simds = 4;
3275		else
3276			rdev->config.evergreen.max_simds = 5;
3277		rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses;
3278		rdev->config.evergreen.max_gprs = 256;
3279		rdev->config.evergreen.max_threads = 248;
3280		rdev->config.evergreen.max_gs_threads = 32;
3281		rdev->config.evergreen.max_stack_entries = 256;
3282		rdev->config.evergreen.sx_num_of_sets = 4;
3283		rdev->config.evergreen.sx_max_export_size = 256;
3284		rdev->config.evergreen.sx_max_export_pos_size = 64;
3285		rdev->config.evergreen.sx_max_export_smx_size = 192;
3286		rdev->config.evergreen.max_hw_contexts = 8;
3287		rdev->config.evergreen.sq_num_cf_insts = 2;
3288
3289		rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3290		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3291		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3292		gb_addr_config = SUMO_GB_ADDR_CONFIG_GOLDEN;
3293		break;
3294	case CHIP_SUMO2:
3295		rdev->config.evergreen.num_ses = 1;
3296		rdev->config.evergreen.max_pipes = 4;
3297		rdev->config.evergreen.max_tile_pipes = 4;
3298		rdev->config.evergreen.max_simds = 2;
3299		rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3300		rdev->config.evergreen.max_gprs = 256;
3301		rdev->config.evergreen.max_threads = 248;
3302		rdev->config.evergreen.max_gs_threads = 32;
3303		rdev->config.evergreen.max_stack_entries = 512;
3304		rdev->config.evergreen.sx_num_of_sets = 4;
3305		rdev->config.evergreen.sx_max_export_size = 256;
3306		rdev->config.evergreen.sx_max_export_pos_size = 64;
3307		rdev->config.evergreen.sx_max_export_smx_size = 192;
3308		rdev->config.evergreen.max_hw_contexts = 4;
3309		rdev->config.evergreen.sq_num_cf_insts = 2;
3310
3311		rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3312		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3313		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3314		gb_addr_config = SUMO2_GB_ADDR_CONFIG_GOLDEN;
3315		break;
3316	case CHIP_BARTS:
3317		rdev->config.evergreen.num_ses = 2;
3318		rdev->config.evergreen.max_pipes = 4;
3319		rdev->config.evergreen.max_tile_pipes = 8;
3320		rdev->config.evergreen.max_simds = 7;
3321		rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses;
3322		rdev->config.evergreen.max_gprs = 256;
3323		rdev->config.evergreen.max_threads = 248;
3324		rdev->config.evergreen.max_gs_threads = 32;
3325		rdev->config.evergreen.max_stack_entries = 512;
3326		rdev->config.evergreen.sx_num_of_sets = 4;
3327		rdev->config.evergreen.sx_max_export_size = 256;
3328		rdev->config.evergreen.sx_max_export_pos_size = 64;
3329		rdev->config.evergreen.sx_max_export_smx_size = 192;
3330		rdev->config.evergreen.max_hw_contexts = 8;
3331		rdev->config.evergreen.sq_num_cf_insts = 2;
3332
3333		rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3334		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3335		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3336		gb_addr_config = BARTS_GB_ADDR_CONFIG_GOLDEN;
3337		break;
3338	case CHIP_TURKS:
3339		rdev->config.evergreen.num_ses = 1;
3340		rdev->config.evergreen.max_pipes = 4;
3341		rdev->config.evergreen.max_tile_pipes = 4;
3342		rdev->config.evergreen.max_simds = 6;
3343		rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses;
3344		rdev->config.evergreen.max_gprs = 256;
3345		rdev->config.evergreen.max_threads = 248;
3346		rdev->config.evergreen.max_gs_threads = 32;
3347		rdev->config.evergreen.max_stack_entries = 256;
3348		rdev->config.evergreen.sx_num_of_sets = 4;
3349		rdev->config.evergreen.sx_max_export_size = 256;
3350		rdev->config.evergreen.sx_max_export_pos_size = 64;
3351		rdev->config.evergreen.sx_max_export_smx_size = 192;
3352		rdev->config.evergreen.max_hw_contexts = 8;
3353		rdev->config.evergreen.sq_num_cf_insts = 2;
3354
3355		rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3356		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3357		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3358		gb_addr_config = TURKS_GB_ADDR_CONFIG_GOLDEN;
3359		break;
3360	case CHIP_CAICOS:
3361		rdev->config.evergreen.num_ses = 1;
3362		rdev->config.evergreen.max_pipes = 2;
3363		rdev->config.evergreen.max_tile_pipes = 2;
3364		rdev->config.evergreen.max_simds = 2;
3365		rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3366		rdev->config.evergreen.max_gprs = 256;
3367		rdev->config.evergreen.max_threads = 192;
3368		rdev->config.evergreen.max_gs_threads = 16;
3369		rdev->config.evergreen.max_stack_entries = 256;
3370		rdev->config.evergreen.sx_num_of_sets = 4;
3371		rdev->config.evergreen.sx_max_export_size = 128;
3372		rdev->config.evergreen.sx_max_export_pos_size = 32;
3373		rdev->config.evergreen.sx_max_export_smx_size = 96;
3374		rdev->config.evergreen.max_hw_contexts = 4;
3375		rdev->config.evergreen.sq_num_cf_insts = 1;
3376
3377		rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3378		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3379		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3380		gb_addr_config = CAICOS_GB_ADDR_CONFIG_GOLDEN;
3381		break;
3382	}
3383
3384	/* Initialize HDP */
3385	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
3386		WREG32((0x2c14 + j), 0x00000000);
3387		WREG32((0x2c18 + j), 0x00000000);
3388		WREG32((0x2c1c + j), 0x00000000);
3389		WREG32((0x2c20 + j), 0x00000000);
3390		WREG32((0x2c24 + j), 0x00000000);
3391	}
3392
3393	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
3394	WREG32(SRBM_INT_CNTL, 0x1);
3395	WREG32(SRBM_INT_ACK, 0x1);
3396
3397	evergreen_fix_pci_max_read_req_size(rdev);
3398
3399	RREG32(MC_SHARED_CHMAP);
3400	if ((rdev->family == CHIP_PALM) ||
3401	    (rdev->family == CHIP_SUMO) ||
3402	    (rdev->family == CHIP_SUMO2))
3403		mc_arb_ramcfg = RREG32(FUS_MC_ARB_RAMCFG);
3404	else
3405		mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
3406
3407	/* setup tiling info dword.  gb_addr_config is not adequate since it does
3408	 * not have bank info, so create a custom tiling dword.
3409	 * bits 3:0   num_pipes
3410	 * bits 7:4   num_banks
3411	 * bits 11:8  group_size
3412	 * bits 15:12 row_size
3413	 */
3414	rdev->config.evergreen.tile_config = 0;
3415	switch (rdev->config.evergreen.max_tile_pipes) {
3416	case 1:
3417	default:
3418		rdev->config.evergreen.tile_config |= (0 << 0);
3419		break;
3420	case 2:
3421		rdev->config.evergreen.tile_config |= (1 << 0);
3422		break;
3423	case 4:
3424		rdev->config.evergreen.tile_config |= (2 << 0);
3425		break;
3426	case 8:
3427		rdev->config.evergreen.tile_config |= (3 << 0);
3428		break;
3429	}
3430	/* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */
3431	if (rdev->flags & RADEON_IS_IGP)
3432		rdev->config.evergreen.tile_config |= 1 << 4;
3433	else {
3434		switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
3435		case 0: /* four banks */
3436			rdev->config.evergreen.tile_config |= 0 << 4;
3437			break;
3438		case 1: /* eight banks */
3439			rdev->config.evergreen.tile_config |= 1 << 4;
3440			break;
3441		case 2: /* sixteen banks */
3442		default:
3443			rdev->config.evergreen.tile_config |= 2 << 4;
3444			break;
3445		}
3446	}
3447	rdev->config.evergreen.tile_config |= 0 << 8;
3448	rdev->config.evergreen.tile_config |=
3449		((gb_addr_config & 0x30000000) >> 28) << 12;
3450
3451	if ((rdev->family >= CHIP_CEDAR) && (rdev->family <= CHIP_HEMLOCK)) {
3452		u32 efuse_straps_4;
3453		u32 efuse_straps_3;
3454
3455		efuse_straps_4 = RREG32_RCU(0x204);
3456		efuse_straps_3 = RREG32_RCU(0x203);
3457		tmp = (((efuse_straps_4 & 0xf) << 4) |
3458		      ((efuse_straps_3 & 0xf0000000) >> 28));
3459	} else {
3460		tmp = 0;
3461		for (i = (rdev->config.evergreen.num_ses - 1); i >= 0; i--) {
3462			u32 rb_disable_bitmap;
3463
3464			WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3465			WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3466			rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16;
3467			tmp <<= 4;
3468			tmp |= rb_disable_bitmap;
3469		}
3470	}
3471	/* enabled rb are just the one not disabled :) */
3472	disabled_rb_mask = tmp;
3473	tmp = 0;
3474	for (i = 0; i < rdev->config.evergreen.max_backends; i++)
3475		tmp |= (1 << i);
3476	/* if all the backends are disabled, fix it up here */
3477	if ((disabled_rb_mask & tmp) == tmp) {
3478		for (i = 0; i < rdev->config.evergreen.max_backends; i++)
3479			disabled_rb_mask &= ~(1 << i);
3480	}
3481
3482	for (i = 0; i < rdev->config.evergreen.num_ses; i++) {
3483		u32 simd_disable_bitmap;
3484
3485		WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3486		WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3487		simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
3488		simd_disable_bitmap |= 0xffffffff << rdev->config.evergreen.max_simds;
3489		tmp <<= 16;
3490		tmp |= simd_disable_bitmap;
3491	}
3492	rdev->config.evergreen.active_simds = hweight32(~tmp);
3493
3494	WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
3495	WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
3496
3497	WREG32(GB_ADDR_CONFIG, gb_addr_config);
3498	WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
3499	WREG32(HDP_ADDR_CONFIG, gb_addr_config);
3500	WREG32(DMA_TILING_CONFIG, gb_addr_config);
3501	WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
3502	WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
3503	WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
3504
3505	if ((rdev->config.evergreen.max_backends == 1) &&
3506	    (rdev->flags & RADEON_IS_IGP)) {
3507		if ((disabled_rb_mask & 3) == 1) {
3508			/* RB0 disabled, RB1 enabled */
3509			tmp = 0x11111111;
3510		} else {
3511			/* RB1 disabled, RB0 enabled */
3512			tmp = 0x00000000;
3513		}
3514	} else {
3515		tmp = gb_addr_config & NUM_PIPES_MASK;
3516		tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.evergreen.max_backends,
3517						EVERGREEN_MAX_BACKENDS, disabled_rb_mask);
3518	}
3519	rdev->config.evergreen.backend_map = tmp;
3520	WREG32(GB_BACKEND_MAP, tmp);
3521
3522	WREG32(CGTS_SYS_TCC_DISABLE, 0);
3523	WREG32(CGTS_TCC_DISABLE, 0);
3524	WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
3525	WREG32(CGTS_USER_TCC_DISABLE, 0);
3526
3527	/* set HW defaults for 3D engine */
3528	WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
3529				     ROQ_IB2_START(0x2b)));
3530
3531	WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
3532
3533	WREG32(TA_CNTL_AUX, (DISABLE_CUBE_ANISO |
3534			     SYNC_GRADIENT |
3535			     SYNC_WALKER |
3536			     SYNC_ALIGNER));
3537
3538	sx_debug_1 = RREG32(SX_DEBUG_1);
3539	sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
3540	WREG32(SX_DEBUG_1, sx_debug_1);
3541
3542
3543	smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
3544	smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
3545	smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.evergreen.sx_num_of_sets);
3546	WREG32(SMX_DC_CTL0, smx_dc_ctl0);
3547
3548	if (rdev->family <= CHIP_SUMO2)
3549		WREG32(SMX_SAR_CTL0, 0x00010000);
3550
3551	WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_size / 4) - 1) |
3552					POSITION_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_pos_size / 4) - 1) |
3553					SMX_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_smx_size / 4) - 1)));
3554
3555	WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.evergreen.sc_prim_fifo_size) |
3556				 SC_HIZ_TILE_FIFO_SIZE(rdev->config.evergreen.sc_hiz_tile_fifo_size) |
3557				 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.evergreen.sc_earlyz_tile_fifo_size)));
3558
3559	WREG32(VGT_NUM_INSTANCES, 1);
3560	WREG32(SPI_CONFIG_CNTL, 0);
3561	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
3562	WREG32(CP_PERFMON_CNTL, 0);
3563
3564	WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.evergreen.sq_num_cf_insts) |
3565				  FETCH_FIFO_HIWATER(0x4) |
3566				  DONE_FIFO_HIWATER(0xe0) |
3567				  ALU_UPDATE_FIFO_HIWATER(0x8)));
3568
3569	sq_config = RREG32(SQ_CONFIG);
3570	sq_config &= ~(PS_PRIO(3) |
3571		       VS_PRIO(3) |
3572		       GS_PRIO(3) |
3573		       ES_PRIO(3));
3574	sq_config |= (VC_ENABLE |
3575		      EXPORT_SRC_C |
3576		      PS_PRIO(0) |
3577		      VS_PRIO(1) |
3578		      GS_PRIO(2) |
3579		      ES_PRIO(3));
3580
3581	switch (rdev->family) {
3582	case CHIP_CEDAR:
3583	case CHIP_PALM:
3584	case CHIP_SUMO:
3585	case CHIP_SUMO2:
3586	case CHIP_CAICOS:
3587		/* no vertex cache */
3588		sq_config &= ~VC_ENABLE;
3589		break;
3590	default:
3591		break;
3592	}
3593
3594	sq_lds_resource_mgmt = RREG32(SQ_LDS_RESOURCE_MGMT);
3595
3596	sq_gpr_resource_mgmt_1 = NUM_PS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 12 / 32);
3597	sq_gpr_resource_mgmt_1 |= NUM_VS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 6 / 32);
3598	sq_gpr_resource_mgmt_1 |= NUM_CLAUSE_TEMP_GPRS(4);
3599	sq_gpr_resource_mgmt_2 = NUM_GS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 4 / 32);
3600	sq_gpr_resource_mgmt_2 |= NUM_ES_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 4 / 32);
3601	sq_gpr_resource_mgmt_3 = NUM_HS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32);
3602	sq_gpr_resource_mgmt_3 |= NUM_LS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32);
3603
3604	switch (rdev->family) {
3605	case CHIP_CEDAR:
3606	case CHIP_PALM:
3607	case CHIP_SUMO:
3608	case CHIP_SUMO2:
3609		ps_thread_count = 96;
3610		break;
3611	default:
3612		ps_thread_count = 128;
3613		break;
3614	}
3615
3616	sq_thread_resource_mgmt = NUM_PS_THREADS(ps_thread_count);
3617	sq_thread_resource_mgmt |= NUM_VS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3618	sq_thread_resource_mgmt |= NUM_GS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3619	sq_thread_resource_mgmt |= NUM_ES_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3620	sq_thread_resource_mgmt_2 = NUM_HS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3621	sq_thread_resource_mgmt_2 |= NUM_LS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3622
3623	sq_stack_resource_mgmt_1 = NUM_PS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3624	sq_stack_resource_mgmt_1 |= NUM_VS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3625	sq_stack_resource_mgmt_2 = NUM_GS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3626	sq_stack_resource_mgmt_2 |= NUM_ES_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3627	sq_stack_resource_mgmt_3 = NUM_HS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3628	sq_stack_resource_mgmt_3 |= NUM_LS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3629
3630	WREG32(SQ_CONFIG, sq_config);
3631	WREG32(SQ_GPR_RESOURCE_MGMT_1, sq_gpr_resource_mgmt_1);
3632	WREG32(SQ_GPR_RESOURCE_MGMT_2, sq_gpr_resource_mgmt_2);
3633	WREG32(SQ_GPR_RESOURCE_MGMT_3, sq_gpr_resource_mgmt_3);
3634	WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt);
3635	WREG32(SQ_THREAD_RESOURCE_MGMT_2, sq_thread_resource_mgmt_2);
3636	WREG32(SQ_STACK_RESOURCE_MGMT_1, sq_stack_resource_mgmt_1);
3637	WREG32(SQ_STACK_RESOURCE_MGMT_2, sq_stack_resource_mgmt_2);
3638	WREG32(SQ_STACK_RESOURCE_MGMT_3, sq_stack_resource_mgmt_3);
3639	WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0);
3640	WREG32(SQ_LDS_RESOURCE_MGMT, sq_lds_resource_mgmt);
3641
3642	WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
3643					  FORCE_EOV_MAX_REZ_CNT(255)));
3644
3645	switch (rdev->family) {
3646	case CHIP_CEDAR:
3647	case CHIP_PALM:
3648	case CHIP_SUMO:
3649	case CHIP_SUMO2:
3650	case CHIP_CAICOS:
3651		vgt_cache_invalidation = CACHE_INVALIDATION(TC_ONLY);
3652		break;
3653	default:
3654		vgt_cache_invalidation = CACHE_INVALIDATION(VC_AND_TC);
3655		break;
3656	}
3657	vgt_cache_invalidation |= AUTO_INVLD_EN(ES_AND_GS_AUTO);
3658	WREG32(VGT_CACHE_INVALIDATION, vgt_cache_invalidation);
3659
3660	WREG32(VGT_GS_VERTEX_REUSE, 16);
3661	WREG32(PA_SU_LINE_STIPPLE_VALUE, 0);
3662	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
3663
3664	WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, 14);
3665	WREG32(VGT_OUT_DEALLOC_CNTL, 16);
3666
3667	WREG32(CB_PERF_CTR0_SEL_0, 0);
3668	WREG32(CB_PERF_CTR0_SEL_1, 0);
3669	WREG32(CB_PERF_CTR1_SEL_0, 0);
3670	WREG32(CB_PERF_CTR1_SEL_1, 0);
3671	WREG32(CB_PERF_CTR2_SEL_0, 0);
3672	WREG32(CB_PERF_CTR2_SEL_1, 0);
3673	WREG32(CB_PERF_CTR3_SEL_0, 0);
3674	WREG32(CB_PERF_CTR3_SEL_1, 0);
3675
3676	/* clear render buffer base addresses */
3677	WREG32(CB_COLOR0_BASE, 0);
3678	WREG32(CB_COLOR1_BASE, 0);
3679	WREG32(CB_COLOR2_BASE, 0);
3680	WREG32(CB_COLOR3_BASE, 0);
3681	WREG32(CB_COLOR4_BASE, 0);
3682	WREG32(CB_COLOR5_BASE, 0);
3683	WREG32(CB_COLOR6_BASE, 0);
3684	WREG32(CB_COLOR7_BASE, 0);
3685	WREG32(CB_COLOR8_BASE, 0);
3686	WREG32(CB_COLOR9_BASE, 0);
3687	WREG32(CB_COLOR10_BASE, 0);
3688	WREG32(CB_COLOR11_BASE, 0);
3689
3690	/* set the shader const cache sizes to 0 */
3691	for (i = SQ_ALU_CONST_BUFFER_SIZE_PS_0; i < 0x28200; i += 4)
3692		WREG32(i, 0);
3693	for (i = SQ_ALU_CONST_BUFFER_SIZE_HS_0; i < 0x29000; i += 4)
3694		WREG32(i, 0);
3695
3696	tmp = RREG32(HDP_MISC_CNTL);
3697	tmp |= HDP_FLUSH_INVALIDATE_CACHE;
3698	WREG32(HDP_MISC_CNTL, tmp);
3699
3700	hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
3701	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
3702
3703	WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
3704
3705	udelay(50);
3706
3707}
3708
3709int evergreen_mc_init(struct radeon_device *rdev)
3710{
3711	u32 tmp;
3712	int chansize, numchan;
3713
3714	/* Get VRAM informations */
3715	rdev->mc.vram_is_ddr = true;
3716	if ((rdev->family == CHIP_PALM) ||
3717	    (rdev->family == CHIP_SUMO) ||
3718	    (rdev->family == CHIP_SUMO2))
3719		tmp = RREG32(FUS_MC_ARB_RAMCFG);
3720	else
3721		tmp = RREG32(MC_ARB_RAMCFG);
3722	if (tmp & CHANSIZE_OVERRIDE) {
3723		chansize = 16;
3724	} else if (tmp & CHANSIZE_MASK) {
3725		chansize = 64;
3726	} else {
3727		chansize = 32;
3728	}
3729	tmp = RREG32(MC_SHARED_CHMAP);
3730	switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
3731	case 0:
3732	default:
3733		numchan = 1;
3734		break;
3735	case 1:
3736		numchan = 2;
3737		break;
3738	case 2:
3739		numchan = 4;
3740		break;
3741	case 3:
3742		numchan = 8;
3743		break;
3744	}
3745	rdev->mc.vram_width = numchan * chansize;
3746	/* Could aper size report 0 ? */
3747	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
3748	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
3749	/* Setup GPU memory space */
3750	if ((rdev->family == CHIP_PALM) ||
3751	    (rdev->family == CHIP_SUMO) ||
3752	    (rdev->family == CHIP_SUMO2)) {
3753		/* size in bytes on fusion */
3754		rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
3755		rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
3756	} else {
3757		/* size in MB on evergreen/cayman/tn */
3758		rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
3759		rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
3760	}
3761	rdev->mc.visible_vram_size = rdev->mc.aper_size;
3762	r700_vram_gtt_location(rdev, &rdev->mc);
3763	radeon_update_bandwidth_info(rdev);
3764
3765	return 0;
3766}
3767
3768void evergreen_print_gpu_status_regs(struct radeon_device *rdev)
3769{
3770	dev_info(rdev->dev, "  GRBM_STATUS               = 0x%08X\n",
3771		RREG32(GRBM_STATUS));
3772	dev_info(rdev->dev, "  GRBM_STATUS_SE0           = 0x%08X\n",
3773		RREG32(GRBM_STATUS_SE0));
3774	dev_info(rdev->dev, "  GRBM_STATUS_SE1           = 0x%08X\n",
3775		RREG32(GRBM_STATUS_SE1));
3776	dev_info(rdev->dev, "  SRBM_STATUS               = 0x%08X\n",
3777		RREG32(SRBM_STATUS));
3778	dev_info(rdev->dev, "  SRBM_STATUS2              = 0x%08X\n",
3779		RREG32(SRBM_STATUS2));
3780	dev_info(rdev->dev, "  R_008674_CP_STALLED_STAT1 = 0x%08X\n",
3781		RREG32(CP_STALLED_STAT1));
3782	dev_info(rdev->dev, "  R_008678_CP_STALLED_STAT2 = 0x%08X\n",
3783		RREG32(CP_STALLED_STAT2));
3784	dev_info(rdev->dev, "  R_00867C_CP_BUSY_STAT     = 0x%08X\n",
3785		RREG32(CP_BUSY_STAT));
3786	dev_info(rdev->dev, "  R_008680_CP_STAT          = 0x%08X\n",
3787		RREG32(CP_STAT));
3788	dev_info(rdev->dev, "  R_00D034_DMA_STATUS_REG   = 0x%08X\n",
3789		RREG32(DMA_STATUS_REG));
3790	if (rdev->family >= CHIP_CAYMAN) {
3791		dev_info(rdev->dev, "  R_00D834_DMA_STATUS_REG   = 0x%08X\n",
3792			 RREG32(DMA_STATUS_REG + 0x800));
3793	}
3794}
3795
3796bool evergreen_is_display_hung(struct radeon_device *rdev)
3797{
3798	u32 crtc_hung = 0;
3799	u32 crtc_status[6];
3800	u32 i, j, tmp;
3801
3802	for (i = 0; i < rdev->num_crtc; i++) {
3803		if (RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]) & EVERGREEN_CRTC_MASTER_EN) {
3804			crtc_status[i] = RREG32(EVERGREEN_CRTC_STATUS_HV_COUNT + crtc_offsets[i]);
3805			crtc_hung |= (1 << i);
3806		}
3807	}
3808
3809	for (j = 0; j < 10; j++) {
3810		for (i = 0; i < rdev->num_crtc; i++) {
3811			if (crtc_hung & (1 << i)) {
3812				tmp = RREG32(EVERGREEN_CRTC_STATUS_HV_COUNT + crtc_offsets[i]);
3813				if (tmp != crtc_status[i])
3814					crtc_hung &= ~(1 << i);
3815			}
3816		}
3817		if (crtc_hung == 0)
3818			return false;
3819		udelay(100);
3820	}
3821
3822	return true;
3823}
3824
3825u32 evergreen_gpu_check_soft_reset(struct radeon_device *rdev)
3826{
3827	u32 reset_mask = 0;
3828	u32 tmp;
3829
3830	/* GRBM_STATUS */
3831	tmp = RREG32(GRBM_STATUS);
3832	if (tmp & (PA_BUSY | SC_BUSY |
3833		   SH_BUSY | SX_BUSY |
3834		   TA_BUSY | VGT_BUSY |
3835		   DB_BUSY | CB_BUSY |
3836		   SPI_BUSY | VGT_BUSY_NO_DMA))
3837		reset_mask |= RADEON_RESET_GFX;
3838
3839	if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING |
3840		   CP_BUSY | CP_COHERENCY_BUSY))
3841		reset_mask |= RADEON_RESET_CP;
3842
3843	if (tmp & GRBM_EE_BUSY)
3844		reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
3845
3846	/* DMA_STATUS_REG */
3847	tmp = RREG32(DMA_STATUS_REG);
3848	if (!(tmp & DMA_IDLE))
3849		reset_mask |= RADEON_RESET_DMA;
3850
3851	/* SRBM_STATUS2 */
3852	tmp = RREG32(SRBM_STATUS2);
3853	if (tmp & DMA_BUSY)
3854		reset_mask |= RADEON_RESET_DMA;
3855
3856	/* SRBM_STATUS */
3857	tmp = RREG32(SRBM_STATUS);
3858	if (tmp & (RLC_RQ_PENDING | RLC_BUSY))
3859		reset_mask |= RADEON_RESET_RLC;
3860
3861	if (tmp & IH_BUSY)
3862		reset_mask |= RADEON_RESET_IH;
3863
3864	if (tmp & SEM_BUSY)
3865		reset_mask |= RADEON_RESET_SEM;
3866
3867	if (tmp & GRBM_RQ_PENDING)
3868		reset_mask |= RADEON_RESET_GRBM;
3869
3870	if (tmp & VMC_BUSY)
3871		reset_mask |= RADEON_RESET_VMC;
3872
3873	if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
3874		   MCC_BUSY | MCD_BUSY))
3875		reset_mask |= RADEON_RESET_MC;
3876
3877	if (evergreen_is_display_hung(rdev))
3878		reset_mask |= RADEON_RESET_DISPLAY;
3879
3880	/* VM_L2_STATUS */
3881	tmp = RREG32(VM_L2_STATUS);
3882	if (tmp & L2_BUSY)
3883		reset_mask |= RADEON_RESET_VMC;
3884
3885	/* Skip MC reset as it's mostly likely not hung, just busy */
3886	if (reset_mask & RADEON_RESET_MC) {
3887		DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
3888		reset_mask &= ~RADEON_RESET_MC;
3889	}
3890
3891	return reset_mask;
3892}
3893
3894static void evergreen_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
3895{
3896	struct evergreen_mc_save save;
3897	u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
3898	u32 tmp;
3899
3900	if (reset_mask == 0)
3901		return;
3902
3903	dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
3904
3905	evergreen_print_gpu_status_regs(rdev);
3906
3907	/* Disable CP parsing/prefetching */
3908	WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
3909
3910	if (reset_mask & RADEON_RESET_DMA) {
3911		/* Disable DMA */
3912		tmp = RREG32(DMA_RB_CNTL);
3913		tmp &= ~DMA_RB_ENABLE;
3914		WREG32(DMA_RB_CNTL, tmp);
3915	}
3916
3917	udelay(50);
3918
3919	evergreen_mc_stop(rdev, &save);
3920	if (evergreen_mc_wait_for_idle(rdev)) {
3921		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
3922	}
3923
3924	if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) {
3925		grbm_soft_reset |= SOFT_RESET_DB |
3926			SOFT_RESET_CB |
3927			SOFT_RESET_PA |
3928			SOFT_RESET_SC |
3929			SOFT_RESET_SPI |
3930			SOFT_RESET_SX |
3931			SOFT_RESET_SH |
3932			SOFT_RESET_TC |
3933			SOFT_RESET_TA |
3934			SOFT_RESET_VC |
3935			SOFT_RESET_VGT;
3936	}
3937
3938	if (reset_mask & RADEON_RESET_CP) {
3939		grbm_soft_reset |= SOFT_RESET_CP |
3940			SOFT_RESET_VGT;
3941
3942		srbm_soft_reset |= SOFT_RESET_GRBM;
3943	}
3944
3945	if (reset_mask & RADEON_RESET_DMA)
3946		srbm_soft_reset |= SOFT_RESET_DMA;
3947
3948	if (reset_mask & RADEON_RESET_DISPLAY)
3949		srbm_soft_reset |= SOFT_RESET_DC;
3950
3951	if (reset_mask & RADEON_RESET_RLC)
3952		srbm_soft_reset |= SOFT_RESET_RLC;
3953
3954	if (reset_mask & RADEON_RESET_SEM)
3955		srbm_soft_reset |= SOFT_RESET_SEM;
3956
3957	if (reset_mask & RADEON_RESET_IH)
3958		srbm_soft_reset |= SOFT_RESET_IH;
3959
3960	if (reset_mask & RADEON_RESET_GRBM)
3961		srbm_soft_reset |= SOFT_RESET_GRBM;
3962
3963	if (reset_mask & RADEON_RESET_VMC)
3964		srbm_soft_reset |= SOFT_RESET_VMC;
3965
3966	if (!(rdev->flags & RADEON_IS_IGP)) {
3967		if (reset_mask & RADEON_RESET_MC)
3968			srbm_soft_reset |= SOFT_RESET_MC;
3969	}
3970
3971	if (grbm_soft_reset) {
3972		tmp = RREG32(GRBM_SOFT_RESET);
3973		tmp |= grbm_soft_reset;
3974		dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
3975		WREG32(GRBM_SOFT_RESET, tmp);
3976		tmp = RREG32(GRBM_SOFT_RESET);
3977
3978		udelay(50);
3979
3980		tmp &= ~grbm_soft_reset;
3981		WREG32(GRBM_SOFT_RESET, tmp);
3982		tmp = RREG32(GRBM_SOFT_RESET);
3983	}
3984
3985	if (srbm_soft_reset) {
3986		tmp = RREG32(SRBM_SOFT_RESET);
3987		tmp |= srbm_soft_reset;
3988		dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
3989		WREG32(SRBM_SOFT_RESET, tmp);
3990		tmp = RREG32(SRBM_SOFT_RESET);
3991
3992		udelay(50);
3993
3994		tmp &= ~srbm_soft_reset;
3995		WREG32(SRBM_SOFT_RESET, tmp);
3996		tmp = RREG32(SRBM_SOFT_RESET);
3997	}
3998
3999	/* Wait a little for things to settle down */
4000	udelay(50);
4001
4002	evergreen_mc_resume(rdev, &save);
4003	udelay(50);
4004
4005	evergreen_print_gpu_status_regs(rdev);
4006}
4007
4008void evergreen_gpu_pci_config_reset(struct radeon_device *rdev)
4009{
4010	struct evergreen_mc_save save;
4011	u32 tmp, i;
4012
4013	dev_info(rdev->dev, "GPU pci config reset\n");
4014
4015	/* disable dpm? */
4016
4017	/* Disable CP parsing/prefetching */
4018	WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
4019	udelay(50);
4020	/* Disable DMA */
4021	tmp = RREG32(DMA_RB_CNTL);
4022	tmp &= ~DMA_RB_ENABLE;
4023	WREG32(DMA_RB_CNTL, tmp);
4024	/* XXX other engines? */
4025
4026	/* halt the rlc */
4027	r600_rlc_stop(rdev);
4028
4029	udelay(50);
4030
4031	/* set mclk/sclk to bypass */
4032	rv770_set_clk_bypass_mode(rdev);
4033	/* disable BM */
4034	pci_clear_master(rdev->pdev);
4035	/* disable mem access */
4036	evergreen_mc_stop(rdev, &save);
4037	if (evergreen_mc_wait_for_idle(rdev)) {
4038		dev_warn(rdev->dev, "Wait for MC idle timed out !\n");
4039	}
4040	/* reset */
4041	radeon_pci_config_reset(rdev);
4042	/* wait for asic to come out of reset */
4043	for (i = 0; i < rdev->usec_timeout; i++) {
4044		if (RREG32(CONFIG_MEMSIZE) != 0xffffffff)
4045			break;
4046		udelay(1);
4047	}
4048}
4049
4050int evergreen_asic_reset(struct radeon_device *rdev, bool hard)
4051{
4052	u32 reset_mask;
4053
4054	if (hard) {
4055		evergreen_gpu_pci_config_reset(rdev);
4056		return 0;
4057	}
4058
4059	reset_mask = evergreen_gpu_check_soft_reset(rdev);
4060
4061	if (reset_mask)
4062		r600_set_bios_scratch_engine_hung(rdev, true);
4063
4064	/* try soft reset */
4065	evergreen_gpu_soft_reset(rdev, reset_mask);
4066
4067	reset_mask = evergreen_gpu_check_soft_reset(rdev);
4068
4069	/* try pci config reset */
4070	if (reset_mask && radeon_hard_reset)
4071		evergreen_gpu_pci_config_reset(rdev);
4072
4073	reset_mask = evergreen_gpu_check_soft_reset(rdev);
4074
4075	if (!reset_mask)
4076		r600_set_bios_scratch_engine_hung(rdev, false);
4077
4078	return 0;
4079}
4080
4081/**
4082 * evergreen_gfx_is_lockup - Check if the GFX engine is locked up
4083 *
4084 * @rdev: radeon_device pointer
4085 * @ring: radeon_ring structure holding ring information
4086 *
4087 * Check if the GFX engine is locked up.
4088 * Returns true if the engine appears to be locked up, false if not.
4089 */
4090bool evergreen_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
4091{
4092	u32 reset_mask = evergreen_gpu_check_soft_reset(rdev);
4093
4094	if (!(reset_mask & (RADEON_RESET_GFX |
4095			    RADEON_RESET_COMPUTE |
4096			    RADEON_RESET_CP))) {
4097		radeon_ring_lockup_update(rdev, ring);
4098		return false;
4099	}
4100	return radeon_ring_test_lockup(rdev, ring);
4101}
4102
4103/*
4104 * RLC
4105 */
4106#define RLC_SAVE_RESTORE_LIST_END_MARKER    0x00000000
4107#define RLC_CLEAR_STATE_END_MARKER          0x00000001
4108
4109void sumo_rlc_fini(struct radeon_device *rdev)
4110{
4111	int r;
4112
4113	/* save restore block */
4114	if (rdev->rlc.save_restore_obj) {
4115		r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
4116		if (unlikely(r != 0))
4117			dev_warn(rdev->dev, "(%d) reserve RLC sr bo failed\n", r);
4118		radeon_bo_unpin(rdev->rlc.save_restore_obj);
4119		radeon_bo_unreserve(rdev->rlc.save_restore_obj);
4120
4121		radeon_bo_unref(&rdev->rlc.save_restore_obj);
4122		rdev->rlc.save_restore_obj = NULL;
4123	}
4124
4125	/* clear state block */
4126	if (rdev->rlc.clear_state_obj) {
4127		r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
4128		if (unlikely(r != 0))
4129			dev_warn(rdev->dev, "(%d) reserve RLC c bo failed\n", r);
4130		radeon_bo_unpin(rdev->rlc.clear_state_obj);
4131		radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4132
4133		radeon_bo_unref(&rdev->rlc.clear_state_obj);
4134		rdev->rlc.clear_state_obj = NULL;
4135	}
4136
4137	/* clear state block */
4138	if (rdev->rlc.cp_table_obj) {
4139		r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false);
4140		if (unlikely(r != 0))
4141			dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r);
4142		radeon_bo_unpin(rdev->rlc.cp_table_obj);
4143		radeon_bo_unreserve(rdev->rlc.cp_table_obj);
4144
4145		radeon_bo_unref(&rdev->rlc.cp_table_obj);
4146		rdev->rlc.cp_table_obj = NULL;
4147	}
4148}
4149
4150#define CP_ME_TABLE_SIZE    96
4151
4152int sumo_rlc_init(struct radeon_device *rdev)
4153{
4154	const u32 *src_ptr;
4155	volatile u32 *dst_ptr;
4156	u32 dws, data, i, j, k, reg_num;
4157	u32 reg_list_num, reg_list_hdr_blk_index, reg_list_blk_index = 0;
4158	u64 reg_list_mc_addr;
4159	const struct cs_section_def *cs_data;
4160	int r;
4161
4162	src_ptr = rdev->rlc.reg_list;
4163	dws = rdev->rlc.reg_list_size;
4164	if (rdev->family >= CHIP_BONAIRE) {
4165		dws += (5 * 16) + 48 + 48 + 64;
4166	}
4167	cs_data = rdev->rlc.cs_data;
4168
4169	if (src_ptr) {
4170		/* save restore block */
4171		if (rdev->rlc.save_restore_obj == NULL) {
4172			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
4173					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
4174					     NULL, &rdev->rlc.save_restore_obj);
4175			if (r) {
4176				dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
4177				return r;
4178			}
4179		}
4180
4181		r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
4182		if (unlikely(r != 0)) {
4183			sumo_rlc_fini(rdev);
4184			return r;
4185		}
4186		r = radeon_bo_pin(rdev->rlc.save_restore_obj, RADEON_GEM_DOMAIN_VRAM,
4187				  &rdev->rlc.save_restore_gpu_addr);
4188		if (r) {
4189			radeon_bo_unreserve(rdev->rlc.save_restore_obj);
4190			dev_warn(rdev->dev, "(%d) pin RLC sr bo failed\n", r);
4191			sumo_rlc_fini(rdev);
4192			return r;
4193		}
4194
4195		r = radeon_bo_kmap(rdev->rlc.save_restore_obj, (void **)&rdev->rlc.sr_ptr);
4196		if (r) {
4197			dev_warn(rdev->dev, "(%d) map RLC sr bo failed\n", r);
4198			sumo_rlc_fini(rdev);
4199			return r;
4200		}
4201		/* write the sr buffer */
4202		dst_ptr = rdev->rlc.sr_ptr;
4203		if (rdev->family >= CHIP_TAHITI) {
4204			/* SI */
4205			for (i = 0; i < rdev->rlc.reg_list_size; i++)
4206				dst_ptr[i] = cpu_to_le32(src_ptr[i]);
4207		} else {
4208			/* ON/LN/TN */
4209			/* format:
4210			 * dw0: (reg2 << 16) | reg1
4211			 * dw1: reg1 save space
4212			 * dw2: reg2 save space
4213			 */
4214			for (i = 0; i < dws; i++) {
4215				data = src_ptr[i] >> 2;
4216				i++;
4217				if (i < dws)
4218					data |= (src_ptr[i] >> 2) << 16;
4219				j = (((i - 1) * 3) / 2);
4220				dst_ptr[j] = cpu_to_le32(data);
4221			}
4222			j = ((i * 3) / 2);
4223			dst_ptr[j] = cpu_to_le32(RLC_SAVE_RESTORE_LIST_END_MARKER);
4224		}
4225		radeon_bo_kunmap(rdev->rlc.save_restore_obj);
4226		radeon_bo_unreserve(rdev->rlc.save_restore_obj);
4227	}
4228
4229	if (cs_data) {
4230		/* clear state block */
4231		if (rdev->family >= CHIP_BONAIRE) {
4232			rdev->rlc.clear_state_size = dws = cik_get_csb_size(rdev);
4233		} else if (rdev->family >= CHIP_TAHITI) {
4234			rdev->rlc.clear_state_size = si_get_csb_size(rdev);
4235			dws = rdev->rlc.clear_state_size + (256 / 4);
4236		} else {
4237			reg_list_num = 0;
4238			dws = 0;
4239			for (i = 0; cs_data[i].section != NULL; i++) {
4240				for (j = 0; cs_data[i].section[j].extent != NULL; j++) {
4241					reg_list_num++;
4242					dws += cs_data[i].section[j].reg_count;
4243				}
4244			}
4245			reg_list_blk_index = (3 * reg_list_num + 2);
4246			dws += reg_list_blk_index;
4247			rdev->rlc.clear_state_size = dws;
4248		}
4249
4250		if (rdev->rlc.clear_state_obj == NULL) {
4251			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
4252					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
4253					     NULL, &rdev->rlc.clear_state_obj);
4254			if (r) {
4255				dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
4256				sumo_rlc_fini(rdev);
4257				return r;
4258			}
4259		}
4260		r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
4261		if (unlikely(r != 0)) {
4262			sumo_rlc_fini(rdev);
4263			return r;
4264		}
4265		r = radeon_bo_pin(rdev->rlc.clear_state_obj, RADEON_GEM_DOMAIN_VRAM,
4266				  &rdev->rlc.clear_state_gpu_addr);
4267		if (r) {
4268			radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4269			dev_warn(rdev->dev, "(%d) pin RLC c bo failed\n", r);
4270			sumo_rlc_fini(rdev);
4271			return r;
4272		}
4273
4274		r = radeon_bo_kmap(rdev->rlc.clear_state_obj, (void **)&rdev->rlc.cs_ptr);
4275		if (r) {
4276			dev_warn(rdev->dev, "(%d) map RLC c bo failed\n", r);
4277			sumo_rlc_fini(rdev);
4278			return r;
4279		}
4280		/* set up the cs buffer */
4281		dst_ptr = rdev->rlc.cs_ptr;
4282		if (rdev->family >= CHIP_BONAIRE) {
4283			cik_get_csb_buffer(rdev, dst_ptr);
4284		} else if (rdev->family >= CHIP_TAHITI) {
4285			reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + 256;
4286			dst_ptr[0] = cpu_to_le32(upper_32_bits(reg_list_mc_addr));
4287			dst_ptr[1] = cpu_to_le32(lower_32_bits(reg_list_mc_addr));
4288			dst_ptr[2] = cpu_to_le32(rdev->rlc.clear_state_size);
4289			si_get_csb_buffer(rdev, &dst_ptr[(256/4)]);
4290		} else {
4291			reg_list_hdr_blk_index = 0;
4292			reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + (reg_list_blk_index * 4);
4293			data = upper_32_bits(reg_list_mc_addr);
4294			dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4295			reg_list_hdr_blk_index++;
4296			for (i = 0; cs_data[i].section != NULL; i++) {
4297				for (j = 0; cs_data[i].section[j].extent != NULL; j++) {
4298					reg_num = cs_data[i].section[j].reg_count;
4299					data = reg_list_mc_addr & 0xffffffff;
4300					dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4301					reg_list_hdr_blk_index++;
4302
4303					data = (cs_data[i].section[j].reg_index * 4) & 0xffffffff;
4304					dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4305					reg_list_hdr_blk_index++;
4306
4307					data = 0x08000000 | (reg_num * 4);
4308					dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4309					reg_list_hdr_blk_index++;
4310
4311					for (k = 0; k < reg_num; k++) {
4312						data = cs_data[i].section[j].extent[k];
4313						dst_ptr[reg_list_blk_index + k] = cpu_to_le32(data);
4314					}
4315					reg_list_mc_addr += reg_num * 4;
4316					reg_list_blk_index += reg_num;
4317				}
4318			}
4319			dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(RLC_CLEAR_STATE_END_MARKER);
4320		}
4321		radeon_bo_kunmap(rdev->rlc.clear_state_obj);
4322		radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4323	}
4324
4325	if (rdev->rlc.cp_table_size) {
4326		if (rdev->rlc.cp_table_obj == NULL) {
4327			r = radeon_bo_create(rdev, rdev->rlc.cp_table_size,
4328					     PAGE_SIZE, true,
4329					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
4330					     NULL, &rdev->rlc.cp_table_obj);
4331			if (r) {
4332				dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r);
4333				sumo_rlc_fini(rdev);
4334				return r;
4335			}
4336		}
4337
4338		r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false);
4339		if (unlikely(r != 0)) {
4340			dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r);
4341			sumo_rlc_fini(rdev);
4342			return r;
4343		}
4344		r = radeon_bo_pin(rdev->rlc.cp_table_obj, RADEON_GEM_DOMAIN_VRAM,
4345				  &rdev->rlc.cp_table_gpu_addr);
4346		if (r) {
4347			radeon_bo_unreserve(rdev->rlc.cp_table_obj);
4348			dev_warn(rdev->dev, "(%d) pin RLC cp_table bo failed\n", r);
4349			sumo_rlc_fini(rdev);
4350			return r;
4351		}
4352		r = radeon_bo_kmap(rdev->rlc.cp_table_obj, (void **)&rdev->rlc.cp_table_ptr);
4353		if (r) {
4354			dev_warn(rdev->dev, "(%d) map RLC cp table bo failed\n", r);
4355			sumo_rlc_fini(rdev);
4356			return r;
4357		}
4358
4359		cik_init_cp_pg_table(rdev);
4360
4361		radeon_bo_kunmap(rdev->rlc.cp_table_obj);
4362		radeon_bo_unreserve(rdev->rlc.cp_table_obj);
4363
4364	}
4365
4366	return 0;
4367}
4368
4369static void evergreen_rlc_start(struct radeon_device *rdev)
4370{
4371	u32 mask = RLC_ENABLE;
4372
4373	if (rdev->flags & RADEON_IS_IGP) {
4374		mask |= GFX_POWER_GATING_ENABLE | GFX_POWER_GATING_SRC;
4375	}
4376
4377	WREG32(RLC_CNTL, mask);
4378}
4379
4380int evergreen_rlc_resume(struct radeon_device *rdev)
4381{
4382	u32 i;
4383	const __be32 *fw_data;
4384
4385	if (!rdev->rlc_fw)
4386		return -EINVAL;
4387
4388	r600_rlc_stop(rdev);
4389
4390	WREG32(RLC_HB_CNTL, 0);
4391
4392	if (rdev->flags & RADEON_IS_IGP) {
4393		if (rdev->family == CHIP_ARUBA) {
4394			u32 always_on_bitmap =
4395				3 | (3 << (16 * rdev->config.cayman.max_shader_engines));
4396			/* find out the number of active simds */
4397			u32 tmp = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
4398			tmp |= 0xffffffff << rdev->config.cayman.max_simds_per_se;
4399			tmp = hweight32(~tmp);
4400			if (tmp == rdev->config.cayman.max_simds_per_se) {
4401				WREG32(TN_RLC_LB_ALWAYS_ACTIVE_SIMD_MASK, always_on_bitmap);
4402				WREG32(TN_RLC_LB_PARAMS, 0x00601004);
4403				WREG32(TN_RLC_LB_INIT_SIMD_MASK, 0xffffffff);
4404				WREG32(TN_RLC_LB_CNTR_INIT, 0x00000000);
4405				WREG32(TN_RLC_LB_CNTR_MAX, 0x00002000);
4406			}
4407		} else {
4408			WREG32(RLC_HB_WPTR_LSB_ADDR, 0);
4409			WREG32(RLC_HB_WPTR_MSB_ADDR, 0);
4410		}
4411		WREG32(TN_RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
4412		WREG32(TN_RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8);
4413	} else {
4414		WREG32(RLC_HB_BASE, 0);
4415		WREG32(RLC_HB_RPTR, 0);
4416		WREG32(RLC_HB_WPTR, 0);
4417		WREG32(RLC_HB_WPTR_LSB_ADDR, 0);
4418		WREG32(RLC_HB_WPTR_MSB_ADDR, 0);
4419	}
4420	WREG32(RLC_MC_CNTL, 0);
4421	WREG32(RLC_UCODE_CNTL, 0);
4422
4423	fw_data = (const __be32 *)rdev->rlc_fw->data;
4424	if (rdev->family >= CHIP_ARUBA) {
4425		for (i = 0; i < ARUBA_RLC_UCODE_SIZE; i++) {
4426			WREG32(RLC_UCODE_ADDR, i);
4427			WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
4428		}
4429	} else if (rdev->family >= CHIP_CAYMAN) {
4430		for (i = 0; i < CAYMAN_RLC_UCODE_SIZE; i++) {
4431			WREG32(RLC_UCODE_ADDR, i);
4432			WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
4433		}
4434	} else {
4435		for (i = 0; i < EVERGREEN_RLC_UCODE_SIZE; i++) {
4436			WREG32(RLC_UCODE_ADDR, i);
4437			WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
4438		}
4439	}
4440	WREG32(RLC_UCODE_ADDR, 0);
4441
4442	evergreen_rlc_start(rdev);
4443
4444	return 0;
4445}
4446
4447/* Interrupts */
4448
4449u32 evergreen_get_vblank_counter(struct radeon_device *rdev, int crtc)
4450{
4451	if (crtc >= rdev->num_crtc)
4452		return 0;
4453	else
4454		return RREG32(CRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]);
4455}
4456
4457void evergreen_disable_interrupt_state(struct radeon_device *rdev)
4458{
4459	int i;
4460	u32 tmp;
4461
4462	if (rdev->family >= CHIP_CAYMAN) {
4463		cayman_cp_int_cntl_setup(rdev, 0,
4464					 CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
4465		cayman_cp_int_cntl_setup(rdev, 1, 0);
4466		cayman_cp_int_cntl_setup(rdev, 2, 0);
4467		tmp = RREG32(CAYMAN_DMA1_CNTL) & ~TRAP_ENABLE;
4468		WREG32(CAYMAN_DMA1_CNTL, tmp);
4469	} else
4470		WREG32(CP_INT_CNTL, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
4471	tmp = RREG32(DMA_CNTL) & ~TRAP_ENABLE;
4472	WREG32(DMA_CNTL, tmp);
4473	WREG32(GRBM_INT_CNTL, 0);
4474	WREG32(SRBM_INT_CNTL, 0);
4475	for (i = 0; i < rdev->num_crtc; i++)
4476		WREG32(INT_MASK + crtc_offsets[i], 0);
4477	for (i = 0; i < rdev->num_crtc; i++)
4478		WREG32(GRPH_INT_CONTROL + crtc_offsets[i], 0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4479
4480	/* only one DAC on DCE5 */
4481	if (!ASIC_IS_DCE5(rdev))
4482		WREG32(DACA_AUTODETECT_INT_CONTROL, 0);
4483	WREG32(DACB_AUTODETECT_INT_CONTROL, 0);
4484
4485	for (i = 0; i < 6; i++)
4486		WREG32_AND(DC_HPDx_INT_CONTROL(i), DC_HPDx_INT_POLARITY);
 
 
 
 
 
 
 
 
 
 
 
4487}
4488
4489/* Note that the order we write back regs here is important */
4490int evergreen_irq_set(struct radeon_device *rdev)
4491{
4492	int i;
4493	u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE;
4494	u32 cp_int_cntl1 = 0, cp_int_cntl2 = 0;
 
 
4495	u32 grbm_int_cntl = 0;
 
4496	u32 dma_cntl, dma_cntl1 = 0;
4497	u32 thermal_int = 0;
4498
4499	if (!rdev->irq.installed) {
4500		WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
4501		return -EINVAL;
4502	}
4503	/* don't enable anything if the ih is disabled */
4504	if (!rdev->ih.enabled) {
4505		r600_disable_interrupts(rdev);
4506		/* force the active interrupt state to all disabled */
4507		evergreen_disable_interrupt_state(rdev);
4508		return 0;
4509	}
4510
 
 
 
 
 
 
4511	if (rdev->family == CHIP_ARUBA)
4512		thermal_int = RREG32(TN_CG_THERMAL_INT_CTRL) &
4513			~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
4514	else
4515		thermal_int = RREG32(CG_THERMAL_INT) &
4516			~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
4517
 
 
 
 
 
 
 
4518	dma_cntl = RREG32(DMA_CNTL) & ~TRAP_ENABLE;
4519
4520	if (rdev->family >= CHIP_CAYMAN) {
4521		/* enable CP interrupts on all rings */
4522		if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
4523			DRM_DEBUG("evergreen_irq_set: sw int gfx\n");
4524			cp_int_cntl |= TIME_STAMP_INT_ENABLE;
4525		}
4526		if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP1_INDEX])) {
4527			DRM_DEBUG("evergreen_irq_set: sw int cp1\n");
4528			cp_int_cntl1 |= TIME_STAMP_INT_ENABLE;
4529		}
4530		if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP2_INDEX])) {
4531			DRM_DEBUG("evergreen_irq_set: sw int cp2\n");
4532			cp_int_cntl2 |= TIME_STAMP_INT_ENABLE;
4533		}
4534	} else {
4535		if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
4536			DRM_DEBUG("evergreen_irq_set: sw int gfx\n");
4537			cp_int_cntl |= RB_INT_ENABLE;
4538			cp_int_cntl |= TIME_STAMP_INT_ENABLE;
4539		}
4540	}
4541
4542	if (atomic_read(&rdev->irq.ring_int[R600_RING_TYPE_DMA_INDEX])) {
4543		DRM_DEBUG("r600_irq_set: sw int dma\n");
4544		dma_cntl |= TRAP_ENABLE;
4545	}
4546
4547	if (rdev->family >= CHIP_CAYMAN) {
4548		dma_cntl1 = RREG32(CAYMAN_DMA1_CNTL) & ~TRAP_ENABLE;
4549		if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_DMA1_INDEX])) {
4550			DRM_DEBUG("r600_irq_set: sw int dma1\n");
4551			dma_cntl1 |= TRAP_ENABLE;
4552		}
4553	}
4554
4555	if (rdev->irq.dpm_thermal) {
4556		DRM_DEBUG("dpm thermal\n");
4557		thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
4558	}
4559
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4560	if (rdev->family >= CHIP_CAYMAN) {
4561		cayman_cp_int_cntl_setup(rdev, 0, cp_int_cntl);
4562		cayman_cp_int_cntl_setup(rdev, 1, cp_int_cntl1);
4563		cayman_cp_int_cntl_setup(rdev, 2, cp_int_cntl2);
4564	} else
4565		WREG32(CP_INT_CNTL, cp_int_cntl);
4566
4567	WREG32(DMA_CNTL, dma_cntl);
4568
4569	if (rdev->family >= CHIP_CAYMAN)
4570		WREG32(CAYMAN_DMA1_CNTL, dma_cntl1);
4571
4572	WREG32(GRBM_INT_CNTL, grbm_int_cntl);
4573
4574	for (i = 0; i < rdev->num_crtc; i++) {
4575		radeon_irq_kms_set_irq_n_enabled(
4576		    rdev, INT_MASK + crtc_offsets[i],
4577		    VBLANK_INT_MASK,
4578		    rdev->irq.crtc_vblank_int[i] ||
4579		    atomic_read(&rdev->irq.pflip[i]), "vblank", i);
4580	}
4581
4582	for (i = 0; i < rdev->num_crtc; i++)
4583		WREG32(GRPH_INT_CONTROL + crtc_offsets[i], GRPH_PFLIP_INT_MASK);
4584
4585	for (i = 0; i < 6; i++) {
4586		radeon_irq_kms_set_irq_n_enabled(
4587		    rdev, DC_HPDx_INT_CONTROL(i),
4588		    DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN,
4589		    rdev->irq.hpd[i], "HPD", i);
4590	}
4591
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4592	if (rdev->family == CHIP_ARUBA)
4593		WREG32(TN_CG_THERMAL_INT_CTRL, thermal_int);
4594	else
4595		WREG32(CG_THERMAL_INT, thermal_int);
4596
4597	for (i = 0; i < 6; i++) {
4598		radeon_irq_kms_set_irq_n_enabled(
4599		    rdev, AFMT_AUDIO_PACKET_CONTROL + crtc_offsets[i],
4600		    AFMT_AZ_FORMAT_WTRIG_MASK,
4601		    rdev->irq.afmt[i], "HDMI", i);
4602	}
4603
4604	/* posting read */
4605	RREG32(SRBM_STATUS);
4606
4607	return 0;
4608}
4609
4610/* Note that the order we write back regs here is important */
4611static void evergreen_irq_ack(struct radeon_device *rdev)
4612{
4613	int i, j;
4614	u32 *grph_int = rdev->irq.stat_regs.evergreen.grph_int;
4615	u32 *disp_int = rdev->irq.stat_regs.evergreen.disp_int;
4616	u32 *afmt_status = rdev->irq.stat_regs.evergreen.afmt_status;
4617
4618	for (i = 0; i < 6; i++) {
4619		disp_int[i] = RREG32(evergreen_disp_int_status[i]);
4620		afmt_status[i] = RREG32(AFMT_STATUS + crtc_offsets[i]);
4621		if (i < rdev->num_crtc)
4622			grph_int[i] = RREG32(GRPH_INT_STATUS + crtc_offsets[i]);
4623	}
4624
4625	/* We write back each interrupt register in pairs of two */
4626	for (i = 0; i < rdev->num_crtc; i += 2) {
4627		for (j = i; j < (i + 2); j++) {
4628			if (grph_int[j] & GRPH_PFLIP_INT_OCCURRED)
4629				WREG32(GRPH_INT_STATUS + crtc_offsets[j],
4630				       GRPH_PFLIP_INT_CLEAR);
4631		}
4632
4633		for (j = i; j < (i + 2); j++) {
4634			if (disp_int[j] & LB_D1_VBLANK_INTERRUPT)
4635				WREG32(VBLANK_STATUS + crtc_offsets[j],
4636				       VBLANK_ACK);
4637			if (disp_int[j] & LB_D1_VLINE_INTERRUPT)
4638				WREG32(VLINE_STATUS + crtc_offsets[j],
4639				       VLINE_ACK);
4640		}
4641	}
4642
4643	for (i = 0; i < 6; i++) {
4644		if (disp_int[i] & DC_HPD1_INTERRUPT)
4645			WREG32_OR(DC_HPDx_INT_CONTROL(i), DC_HPDx_INT_ACK);
4646	}
4647
4648	for (i = 0; i < 6; i++) {
4649		if (disp_int[i] & DC_HPD1_RX_INTERRUPT)
4650			WREG32_OR(DC_HPDx_INT_CONTROL(i), DC_HPDx_RX_INT_ACK);
4651	}
4652
4653	for (i = 0; i < 6; i++) {
4654		if (afmt_status[i] & AFMT_AZ_FORMAT_WTRIG)
4655			WREG32_OR(AFMT_AUDIO_PACKET_CONTROL + crtc_offsets[i],
4656				  AFMT_AZ_FORMAT_WTRIG_ACK);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4657	}
4658}
4659
4660static void evergreen_irq_disable(struct radeon_device *rdev)
4661{
4662	r600_disable_interrupts(rdev);
4663	/* Wait and acknowledge irq */
4664	mdelay(1);
4665	evergreen_irq_ack(rdev);
4666	evergreen_disable_interrupt_state(rdev);
4667}
4668
4669void evergreen_irq_suspend(struct radeon_device *rdev)
4670{
4671	evergreen_irq_disable(rdev);
4672	r600_rlc_stop(rdev);
4673}
4674
4675static u32 evergreen_get_ih_wptr(struct radeon_device *rdev)
4676{
4677	u32 wptr, tmp;
4678
4679	if (rdev->wb.enabled)
4680		wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
4681	else
4682		wptr = RREG32(IH_RB_WPTR);
4683
4684	if (wptr & RB_OVERFLOW) {
4685		wptr &= ~RB_OVERFLOW;
4686		/* When a ring buffer overflow happen start parsing interrupt
4687		 * from the last not overwritten vector (wptr + 16). Hopefully
4688		 * this should allow us to catchup.
4689		 */
4690		dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n",
4691			 wptr, rdev->ih.rptr, (wptr + 16) & rdev->ih.ptr_mask);
4692		rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask;
4693		tmp = RREG32(IH_RB_CNTL);
4694		tmp |= IH_WPTR_OVERFLOW_CLEAR;
4695		WREG32(IH_RB_CNTL, tmp);
4696	}
4697	return (wptr & rdev->ih.ptr_mask);
4698}
4699
4700int evergreen_irq_process(struct radeon_device *rdev)
4701{
4702	u32 *disp_int = rdev->irq.stat_regs.evergreen.disp_int;
4703	u32 *afmt_status = rdev->irq.stat_regs.evergreen.afmt_status;
4704	u32 crtc_idx, hpd_idx, afmt_idx;
4705	u32 mask;
4706	u32 wptr;
4707	u32 rptr;
4708	u32 src_id, src_data;
4709	u32 ring_index;
4710	bool queue_hotplug = false;
4711	bool queue_hdmi = false;
4712	bool queue_dp = false;
4713	bool queue_thermal = false;
4714	u32 status, addr;
4715	const char *event_name;
4716
4717	if (!rdev->ih.enabled || rdev->shutdown)
4718		return IRQ_NONE;
4719
4720	wptr = evergreen_get_ih_wptr(rdev);
4721
4722restart_ih:
4723	/* is somebody else already processing irqs? */
4724	if (atomic_xchg(&rdev->ih.lock, 1))
4725		return IRQ_NONE;
4726
4727	rptr = rdev->ih.rptr;
4728	DRM_DEBUG("evergreen_irq_process start: rptr %d, wptr %d\n", rptr, wptr);
4729
4730	/* Order reading of wptr vs. reading of IH ring data */
4731	rmb();
4732
4733	/* display interrupts */
4734	evergreen_irq_ack(rdev);
4735
4736	while (rptr != wptr) {
4737		/* wptr/rptr are in bytes! */
4738		ring_index = rptr / 4;
4739		src_id =  le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
4740		src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
4741
4742		switch (src_id) {
4743		case 1: /* D1 vblank/vline */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4744		case 2: /* D2 vblank/vline */
4745		case 3: /* D3 vblank/vline */
4746		case 4: /* D4 vblank/vline */
4747		case 5: /* D5 vblank/vline */
4748		case 6: /* D6 vblank/vline */
4749			crtc_idx = src_id - 1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4750
4751			if (src_data == 0) { /* vblank */
4752				mask = LB_D1_VBLANK_INTERRUPT;
4753				event_name = "vblank";
 
 
 
 
 
 
 
 
4754
4755				if (rdev->irq.crtc_vblank_int[crtc_idx]) {
4756					drm_handle_vblank(rdev_to_drm(rdev), crtc_idx);
4757					rdev->pm.vblank_sync = true;
4758					wake_up(&rdev->irq.vblank_queue);
4759				}
4760				if (atomic_read(&rdev->irq.pflip[crtc_idx])) {
4761					radeon_crtc_handle_vblank(rdev,
4762								  crtc_idx);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4763				}
 
 
 
 
 
 
 
 
 
 
 
 
4764
4765			} else if (src_data == 1) { /* vline */
4766				mask = LB_D1_VLINE_INTERRUPT;
4767				event_name = "vline";
4768			} else {
4769				DRM_DEBUG("Unhandled interrupt: %d %d\n",
4770					  src_id, src_data);
4771				break;
4772			}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4773
4774			if (!(disp_int[crtc_idx] & mask)) {
4775				DRM_DEBUG("IH: D%d %s - IH event w/o asserted irq bit?\n",
4776					  crtc_idx + 1, event_name);
 
 
 
 
4777			}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4778
4779			disp_int[crtc_idx] &= ~mask;
4780			DRM_DEBUG("IH: D%d %s\n", crtc_idx + 1, event_name);
4781
 
 
 
 
 
4782			break;
4783		case 8: /* D1 page flip */
4784		case 10: /* D2 page flip */
4785		case 12: /* D3 page flip */
4786		case 14: /* D4 page flip */
4787		case 16: /* D5 page flip */
4788		case 18: /* D6 page flip */
4789			DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
4790			if (radeon_use_pflipirq > 0)
4791				radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
4792			break;
4793		case 42: /* HPD hotplug */
4794			if (src_data <= 5) {
4795				hpd_idx = src_data;
4796				mask = DC_HPD1_INTERRUPT;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4797				queue_hotplug = true;
4798				event_name = "HPD";
 
 
 
 
4799
4800			} else if (src_data <= 11) {
4801				hpd_idx = src_data - 6;
4802				mask = DC_HPD1_RX_INTERRUPT;
 
 
 
 
 
 
4803				queue_dp = true;
4804				event_name = "HPD_RX";
 
 
 
 
4805
4806			} else {
4807				DRM_DEBUG("Unhandled interrupt: %d %d\n",
4808					  src_id, src_data);
4809				break;
4810			}
 
 
 
 
 
 
 
 
 
 
4811
4812			if (!(disp_int[hpd_idx] & mask))
4813				DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
 
 
 
 
 
4814
4815			disp_int[hpd_idx] &= ~mask;
4816			DRM_DEBUG("IH: %s%d\n", event_name, hpd_idx + 1);
 
 
 
 
 
4817
 
 
 
 
 
 
 
 
4818			break;
4819		case 44: /* hdmi */
4820			afmt_idx = src_data;
4821			if (afmt_idx > 5) {
4822				DRM_ERROR("Unhandled interrupt: %d %d\n",
4823					  src_id, src_data);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4824				break;
4825			}
4826
4827			if (!(afmt_status[afmt_idx] & AFMT_AZ_FORMAT_WTRIG))
4828				DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
4829
4830			afmt_status[afmt_idx] &= ~AFMT_AZ_FORMAT_WTRIG;
4831			queue_hdmi = true;
4832			DRM_DEBUG("IH: HDMI%d\n", afmt_idx + 1);
4833			break;
4834		case 96:
4835			DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR));
4836			WREG32(SRBM_INT_ACK, 0x1);
4837			break;
4838		case 124: /* UVD */
4839			DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
4840			radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
4841			break;
4842		case 146:
4843		case 147:
4844			addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR);
4845			status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS);
4846			/* reset addr and status */
4847			WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
4848			if (addr == 0x0 && status == 0x0)
4849				break;
4850			dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data);
4851			dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
4852				addr);
4853			dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
4854				status);
4855			cayman_vm_decode_fault(rdev, status, addr);
4856			break;
4857		case 176: /* CP_INT in ring buffer */
4858		case 177: /* CP_INT in IB1 */
4859		case 178: /* CP_INT in IB2 */
4860			DRM_DEBUG("IH: CP int: 0x%08x\n", src_data);
4861			radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
4862			break;
4863		case 181: /* CP EOP event */
4864			DRM_DEBUG("IH: CP EOP\n");
4865			if (rdev->family >= CHIP_CAYMAN) {
4866				switch (src_data) {
4867				case 0:
4868					radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
4869					break;
4870				case 1:
4871					radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
4872					break;
4873				case 2:
4874					radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
4875					break;
4876				}
4877			} else
4878				radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
4879			break;
4880		case 224: /* DMA trap event */
4881			DRM_DEBUG("IH: DMA trap\n");
4882			radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX);
4883			break;
4884		case 230: /* thermal low to high */
4885			DRM_DEBUG("IH: thermal low to high\n");
4886			rdev->pm.dpm.thermal.high_to_low = false;
4887			queue_thermal = true;
4888			break;
4889		case 231: /* thermal high to low */
4890			DRM_DEBUG("IH: thermal high to low\n");
4891			rdev->pm.dpm.thermal.high_to_low = true;
4892			queue_thermal = true;
4893			break;
4894		case 233: /* GUI IDLE */
4895			DRM_DEBUG("IH: GUI idle\n");
4896			break;
4897		case 244: /* DMA trap event */
4898			if (rdev->family >= CHIP_CAYMAN) {
4899				DRM_DEBUG("IH: DMA1 trap\n");
4900				radeon_fence_process(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
4901			}
4902			break;
4903		default:
4904			DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
4905			break;
4906		}
4907
4908		/* wptr/rptr are in bytes! */
4909		rptr += 16;
4910		rptr &= rdev->ih.ptr_mask;
4911		WREG32(IH_RB_RPTR, rptr);
4912	}
4913	if (queue_dp)
4914		schedule_work(&rdev->dp_work);
4915	if (queue_hotplug)
4916		schedule_delayed_work(&rdev->hotplug_work, 0);
4917	if (queue_hdmi)
4918		schedule_work(&rdev->audio_work);
4919	if (queue_thermal && rdev->pm.dpm_enabled)
4920		schedule_work(&rdev->pm.dpm.thermal.work);
4921	rdev->ih.rptr = rptr;
4922	atomic_set(&rdev->ih.lock, 0);
4923
4924	/* make sure wptr hasn't changed while processing */
4925	wptr = evergreen_get_ih_wptr(rdev);
4926	if (wptr != rptr)
4927		goto restart_ih;
4928
4929	return IRQ_HANDLED;
4930}
4931
4932static void evergreen_uvd_init(struct radeon_device *rdev)
4933{
4934	int r;
4935
4936	if (!rdev->has_uvd)
4937		return;
4938
4939	r = radeon_uvd_init(rdev);
4940	if (r) {
4941		dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
4942		/*
4943		 * At this point rdev->uvd.vcpu_bo is NULL which trickles down
4944		 * to early fails uvd_v2_2_resume() and thus nothing happens
4945		 * there. So it is pointless to try to go through that code
4946		 * hence why we disable uvd here.
4947		 */
4948		rdev->has_uvd = false;
4949		return;
4950	}
4951	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
4952	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
4953}
4954
4955static void evergreen_uvd_start(struct radeon_device *rdev)
4956{
4957	int r;
4958
4959	if (!rdev->has_uvd)
4960		return;
4961
4962	r = uvd_v2_2_resume(rdev);
4963	if (r) {
4964		dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
4965		goto error;
4966	}
4967	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
4968	if (r) {
4969		dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
4970		goto error;
4971	}
4972	return;
4973
4974error:
4975	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
4976}
4977
4978static void evergreen_uvd_resume(struct radeon_device *rdev)
4979{
4980	struct radeon_ring *ring;
4981	int r;
4982
4983	if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
4984		return;
4985
4986	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
4987	r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0));
4988	if (r) {
4989		dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
4990		return;
4991	}
4992	r = uvd_v1_0_init(rdev);
4993	if (r) {
4994		dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
4995		return;
4996	}
4997}
4998
4999static int evergreen_startup(struct radeon_device *rdev)
5000{
5001	struct radeon_ring *ring;
5002	int r;
5003
5004	/* enable pcie gen2 link */
5005	evergreen_pcie_gen2_enable(rdev);
5006	/* enable aspm */
5007	evergreen_program_aspm(rdev);
5008
5009	/* scratch needs to be initialized before MC */
5010	r = r600_vram_scratch_init(rdev);
5011	if (r)
5012		return r;
5013
5014	evergreen_mc_program(rdev);
5015
5016	if (ASIC_IS_DCE5(rdev) && !rdev->pm.dpm_enabled) {
5017		r = ni_mc_load_microcode(rdev);
5018		if (r) {
5019			DRM_ERROR("Failed to load MC firmware!\n");
5020			return r;
5021		}
5022	}
5023
5024	if (rdev->flags & RADEON_IS_AGP) {
5025		evergreen_agp_enable(rdev);
5026	} else {
5027		r = evergreen_pcie_gart_enable(rdev);
5028		if (r)
5029			return r;
5030	}
5031	evergreen_gpu_init(rdev);
5032
5033	/* allocate rlc buffers */
5034	if (rdev->flags & RADEON_IS_IGP) {
5035		rdev->rlc.reg_list = sumo_rlc_save_restore_register_list;
5036		rdev->rlc.reg_list_size =
5037			(u32)ARRAY_SIZE(sumo_rlc_save_restore_register_list);
5038		rdev->rlc.cs_data = evergreen_cs_data;
5039		r = sumo_rlc_init(rdev);
5040		if (r) {
5041			DRM_ERROR("Failed to init rlc BOs!\n");
5042			return r;
5043		}
5044	}
5045
5046	/* allocate wb buffer */
5047	r = radeon_wb_init(rdev);
5048	if (r)
5049		return r;
5050
5051	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
5052	if (r) {
5053		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
5054		return r;
5055	}
5056
5057	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
5058	if (r) {
5059		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
5060		return r;
5061	}
5062
5063	evergreen_uvd_start(rdev);
 
 
 
 
 
 
 
 
 
5064
5065	/* Enable IRQ */
5066	if (!rdev->irq.installed) {
5067		r = radeon_irq_kms_init(rdev);
5068		if (r)
5069			return r;
5070	}
5071
5072	r = r600_irq_init(rdev);
5073	if (r) {
5074		DRM_ERROR("radeon: IH init failed (%d).\n", r);
5075		radeon_irq_kms_fini(rdev);
5076		return r;
5077	}
5078	evergreen_irq_set(rdev);
5079
5080	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
5081	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
5082			     RADEON_CP_PACKET2);
5083	if (r)
5084		return r;
5085
5086	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
5087	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
5088			     DMA_PACKET(DMA_PACKET_NOP, 0, 0));
5089	if (r)
5090		return r;
5091
5092	r = evergreen_cp_load_microcode(rdev);
5093	if (r)
5094		return r;
5095	r = evergreen_cp_resume(rdev);
5096	if (r)
5097		return r;
5098	r = r600_dma_resume(rdev);
5099	if (r)
5100		return r;
5101
5102	evergreen_uvd_resume(rdev);
 
 
 
 
 
 
 
 
 
5103
5104	r = radeon_ib_pool_init(rdev);
5105	if (r) {
5106		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
5107		return r;
5108	}
5109
5110	r = radeon_audio_init(rdev);
5111	if (r) {
5112		DRM_ERROR("radeon: audio init failed\n");
5113		return r;
5114	}
5115
5116	return 0;
5117}
5118
5119int evergreen_resume(struct radeon_device *rdev)
5120{
5121	int r;
5122
5123	/* reset the asic, the gfx blocks are often in a bad state
5124	 * after the driver is unloaded or after a resume
5125	 */
5126	if (radeon_asic_reset(rdev))
5127		dev_warn(rdev->dev, "GPU reset failed !\n");
5128	/* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
5129	 * posting will perform necessary task to bring back GPU into good
5130	 * shape.
5131	 */
5132	/* post card */
5133	atom_asic_init(rdev->mode_info.atom_context);
5134
5135	/* init golden registers */
5136	evergreen_init_golden_registers(rdev);
5137
5138	if (rdev->pm.pm_method == PM_METHOD_DPM)
5139		radeon_pm_resume(rdev);
5140
5141	rdev->accel_working = true;
5142	r = evergreen_startup(rdev);
5143	if (r) {
5144		DRM_ERROR("evergreen startup failed on resume\n");
5145		rdev->accel_working = false;
5146		return r;
5147	}
5148
5149	return r;
5150
5151}
5152
5153int evergreen_suspend(struct radeon_device *rdev)
5154{
5155	radeon_pm_suspend(rdev);
5156	radeon_audio_fini(rdev);
5157	if (rdev->has_uvd) {
5158		radeon_uvd_suspend(rdev);
5159		uvd_v1_0_fini(rdev);
5160	}
5161	r700_cp_stop(rdev);
5162	r600_dma_stop(rdev);
5163	evergreen_irq_suspend(rdev);
5164	radeon_wb_disable(rdev);
5165	evergreen_pcie_gart_disable(rdev);
5166
5167	return 0;
5168}
5169
5170/* Plan is to move initialization in that function and use
5171 * helper function so that radeon_device_init pretty much
5172 * do nothing more than calling asic specific function. This
5173 * should also allow to remove a bunch of callback function
5174 * like vram_info.
5175 */
5176int evergreen_init(struct radeon_device *rdev)
5177{
5178	int r;
5179
5180	/* Read BIOS */
5181	if (!radeon_get_bios(rdev)) {
5182		if (ASIC_IS_AVIVO(rdev))
5183			return -EINVAL;
5184	}
5185	/* Must be an ATOMBIOS */
5186	if (!rdev->is_atom_bios) {
5187		dev_err(rdev->dev, "Expecting atombios for evergreen GPU\n");
5188		return -EINVAL;
5189	}
5190	r = radeon_atombios_init(rdev);
5191	if (r)
5192		return r;
5193	/* reset the asic, the gfx blocks are often in a bad state
5194	 * after the driver is unloaded or after a resume
5195	 */
5196	if (radeon_asic_reset(rdev))
5197		dev_warn(rdev->dev, "GPU reset failed !\n");
5198	/* Post card if necessary */
5199	if (!radeon_card_posted(rdev)) {
5200		if (!rdev->bios) {
5201			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
5202			return -EINVAL;
5203		}
5204		DRM_INFO("GPU not posted. posting now...\n");
5205		atom_asic_init(rdev->mode_info.atom_context);
5206	}
5207	/* init golden registers */
5208	evergreen_init_golden_registers(rdev);
5209	/* Initialize scratch registers */
5210	r600_scratch_init(rdev);
5211	/* Initialize surface registers */
5212	radeon_surface_init(rdev);
5213	/* Initialize clocks */
5214	radeon_get_clock_info(rdev_to_drm(rdev));
5215	/* Fence driver */
5216	radeon_fence_driver_init(rdev);
 
 
5217	/* initialize AGP */
5218	if (rdev->flags & RADEON_IS_AGP) {
5219		r = radeon_agp_init(rdev);
5220		if (r)
5221			radeon_agp_disable(rdev);
5222	}
5223	/* initialize memory controller */
5224	r = evergreen_mc_init(rdev);
5225	if (r)
5226		return r;
5227	/* Memory manager */
5228	r = radeon_bo_init(rdev);
5229	if (r)
5230		return r;
5231
5232	if (ASIC_IS_DCE5(rdev)) {
5233		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
5234			r = ni_init_microcode(rdev);
5235			if (r) {
5236				DRM_ERROR("Failed to load firmware!\n");
5237				return r;
5238			}
5239		}
5240	} else {
5241		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
5242			r = r600_init_microcode(rdev);
5243			if (r) {
5244				DRM_ERROR("Failed to load firmware!\n");
5245				return r;
5246			}
5247		}
5248	}
5249
5250	/* Initialize power management */
5251	radeon_pm_init(rdev);
5252
5253	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
5254	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
5255
5256	rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
5257	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
5258
5259	evergreen_uvd_init(rdev);
 
 
 
 
 
5260
5261	rdev->ih.ring_obj = NULL;
5262	r600_ih_ring_init(rdev, 64 * 1024);
5263
5264	r = r600_pcie_gart_init(rdev);
5265	if (r)
5266		return r;
5267
5268	rdev->accel_working = true;
5269	r = evergreen_startup(rdev);
5270	if (r) {
5271		dev_err(rdev->dev, "disabling GPU acceleration\n");
5272		r700_cp_fini(rdev);
5273		r600_dma_fini(rdev);
5274		r600_irq_fini(rdev);
5275		if (rdev->flags & RADEON_IS_IGP)
5276			sumo_rlc_fini(rdev);
5277		radeon_wb_fini(rdev);
5278		radeon_ib_pool_fini(rdev);
5279		radeon_irq_kms_fini(rdev);
5280		evergreen_pcie_gart_fini(rdev);
5281		rdev->accel_working = false;
5282	}
5283
5284	/* Don't start up if the MC ucode is missing on BTC parts.
5285	 * The default clocks and voltages before the MC ucode
5286	 * is loaded are not suffient for advanced operations.
5287	 */
5288	if (ASIC_IS_DCE5(rdev)) {
5289		if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
5290			DRM_ERROR("radeon: MC ucode required for NI+.\n");
5291			return -EINVAL;
5292		}
5293	}
5294
5295	return 0;
5296}
5297
5298void evergreen_fini(struct radeon_device *rdev)
5299{
5300	radeon_pm_fini(rdev);
5301	radeon_audio_fini(rdev);
5302	r700_cp_fini(rdev);
5303	r600_dma_fini(rdev);
5304	r600_irq_fini(rdev);
5305	if (rdev->flags & RADEON_IS_IGP)
5306		sumo_rlc_fini(rdev);
5307	radeon_wb_fini(rdev);
5308	radeon_ib_pool_fini(rdev);
5309	radeon_irq_kms_fini(rdev);
5310	uvd_v1_0_fini(rdev);
5311	radeon_uvd_fini(rdev);
5312	evergreen_pcie_gart_fini(rdev);
5313	r600_vram_scratch_fini(rdev);
5314	radeon_gem_fini(rdev);
5315	radeon_fence_driver_fini(rdev);
5316	radeon_agp_fini(rdev);
5317	radeon_bo_fini(rdev);
5318	radeon_atombios_fini(rdev);
5319	kfree(rdev->bios);
5320	rdev->bios = NULL;
5321}
5322
5323void evergreen_pcie_gen2_enable(struct radeon_device *rdev)
5324{
5325	u32 link_width_cntl, speed_cntl;
5326
5327	if (radeon_pcie_gen2 == 0)
5328		return;
5329
5330	if (rdev->flags & RADEON_IS_IGP)
5331		return;
5332
5333	if (!(rdev->flags & RADEON_IS_PCIE))
5334		return;
5335
5336	/* x2 cards have a special sequence */
5337	if (ASIC_IS_X2(rdev))
5338		return;
5339
5340	if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) &&
5341		(rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))
5342		return;
5343
5344	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5345	if (speed_cntl & LC_CURRENT_DATA_RATE) {
5346		DRM_INFO("PCIE gen 2 link speeds already enabled\n");
5347		return;
5348	}
5349
5350	DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
5351
5352	if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) ||
5353	    (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
5354
5355		link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
5356		link_width_cntl &= ~LC_UPCONFIGURE_DIS;
5357		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
5358
5359		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5360		speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
5361		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5362
5363		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5364		speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT;
5365		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5366
5367		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5368		speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
5369		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5370
5371		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5372		speed_cntl |= LC_GEN2_EN_STRAP;
5373		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5374
5375	} else {
5376		link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
5377		/* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
5378		if (1)
5379			link_width_cntl |= LC_UPCONFIGURE_DIS;
5380		else
5381			link_width_cntl &= ~LC_UPCONFIGURE_DIS;
5382		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
5383	}
5384}
5385
5386void evergreen_program_aspm(struct radeon_device *rdev)
5387{
5388	u32 data, orig;
5389	u32 pcie_lc_cntl, pcie_lc_cntl_old;
5390	bool disable_l0s, disable_l1 = false, disable_plloff_in_l1 = false;
5391	/* fusion_platform = true
5392	 * if the system is a fusion system
5393	 * (APU or DGPU in a fusion system).
5394	 * todo: check if the system is a fusion platform.
5395	 */
5396	bool fusion_platform = false;
5397
5398	if (radeon_aspm == 0)
5399		return;
5400
5401	if (!(rdev->flags & RADEON_IS_PCIE))
5402		return;
5403
5404	switch (rdev->family) {
5405	case CHIP_CYPRESS:
5406	case CHIP_HEMLOCK:
5407	case CHIP_JUNIPER:
5408	case CHIP_REDWOOD:
5409	case CHIP_CEDAR:
5410	case CHIP_SUMO:
5411	case CHIP_SUMO2:
5412	case CHIP_PALM:
5413	case CHIP_ARUBA:
5414		disable_l0s = true;
5415		break;
5416	default:
5417		disable_l0s = false;
5418		break;
5419	}
5420
5421	if (rdev->flags & RADEON_IS_IGP)
5422		fusion_platform = true; /* XXX also dGPUs in a fusion system */
5423
5424	data = orig = RREG32_PIF_PHY0(PB0_PIF_PAIRING);
5425	if (fusion_platform)
5426		data &= ~MULTI_PIF;
5427	else
5428		data |= MULTI_PIF;
5429	if (data != orig)
5430		WREG32_PIF_PHY0(PB0_PIF_PAIRING, data);
5431
5432	data = orig = RREG32_PIF_PHY1(PB1_PIF_PAIRING);
5433	if (fusion_platform)
5434		data &= ~MULTI_PIF;
5435	else
5436		data |= MULTI_PIF;
5437	if (data != orig)
5438		WREG32_PIF_PHY1(PB1_PIF_PAIRING, data);
5439
5440	pcie_lc_cntl = pcie_lc_cntl_old = RREG32_PCIE_PORT(PCIE_LC_CNTL);
5441	pcie_lc_cntl &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
5442	if (!disable_l0s) {
5443		if (rdev->family >= CHIP_BARTS)
5444			pcie_lc_cntl |= LC_L0S_INACTIVITY(7);
5445		else
5446			pcie_lc_cntl |= LC_L0S_INACTIVITY(3);
5447	}
5448
5449	if (!disable_l1) {
5450		if (rdev->family >= CHIP_BARTS)
5451			pcie_lc_cntl |= LC_L1_INACTIVITY(7);
5452		else
5453			pcie_lc_cntl |= LC_L1_INACTIVITY(8);
5454
5455		if (!disable_plloff_in_l1) {
5456			data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0);
5457			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
5458			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
5459			if (data != orig)
5460				WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data);
5461
5462			data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1);
5463			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
5464			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
5465			if (data != orig)
5466				WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data);
5467
5468			data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0);
5469			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
5470			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
5471			if (data != orig)
5472				WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data);
5473
5474			data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1);
5475			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
5476			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
5477			if (data != orig)
5478				WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data);
5479
5480			if (rdev->family >= CHIP_BARTS) {
5481				data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0);
5482				data &= ~PLL_RAMP_UP_TIME_0_MASK;
5483				data |= PLL_RAMP_UP_TIME_0(4);
5484				if (data != orig)
5485					WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data);
5486
5487				data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1);
5488				data &= ~PLL_RAMP_UP_TIME_1_MASK;
5489				data |= PLL_RAMP_UP_TIME_1(4);
5490				if (data != orig)
5491					WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data);
5492
5493				data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0);
5494				data &= ~PLL_RAMP_UP_TIME_0_MASK;
5495				data |= PLL_RAMP_UP_TIME_0(4);
5496				if (data != orig)
5497					WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data);
5498
5499				data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1);
5500				data &= ~PLL_RAMP_UP_TIME_1_MASK;
5501				data |= PLL_RAMP_UP_TIME_1(4);
5502				if (data != orig)
5503					WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data);
5504			}
5505
5506			data = orig = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
5507			data &= ~LC_DYN_LANES_PWR_STATE_MASK;
5508			data |= LC_DYN_LANES_PWR_STATE(3);
5509			if (data != orig)
5510				WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
5511
5512			if (rdev->family >= CHIP_BARTS) {
5513				data = orig = RREG32_PIF_PHY0(PB0_PIF_CNTL);
5514				data &= ~LS2_EXIT_TIME_MASK;
5515				data |= LS2_EXIT_TIME(1);
5516				if (data != orig)
5517					WREG32_PIF_PHY0(PB0_PIF_CNTL, data);
5518
5519				data = orig = RREG32_PIF_PHY1(PB1_PIF_CNTL);
5520				data &= ~LS2_EXIT_TIME_MASK;
5521				data |= LS2_EXIT_TIME(1);
5522				if (data != orig)
5523					WREG32_PIF_PHY1(PB1_PIF_CNTL, data);
5524			}
5525		}
5526	}
5527
5528	/* evergreen parts only */
5529	if (rdev->family < CHIP_BARTS)
5530		pcie_lc_cntl |= LC_PMI_TO_L1_DIS;
5531
5532	if (pcie_lc_cntl != pcie_lc_cntl_old)
5533		WREG32_PCIE_PORT(PCIE_LC_CNTL, pcie_lc_cntl);
5534}
v4.6
   1/*
   2 * Copyright 2010 Advanced Micro Devices, Inc.
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice shall be included in
  12 * all copies or substantial portions of the Software.
  13 *
  14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20 * OTHER DEALINGS IN THE SOFTWARE.
  21 *
  22 * Authors: Alex Deucher
  23 */
 
  24#include <linux/firmware.h>
 
  25#include <linux/slab.h>
  26#include <drm/drmP.h>
  27#include "radeon.h"
  28#include "radeon_asic.h"
  29#include "radeon_audio.h"
  30#include <drm/radeon_drm.h>
  31#include "evergreend.h"
 
 
  32#include "atom.h"
  33#include "avivod.h"
 
 
 
 
 
  34#include "evergreen_reg.h"
  35#include "evergreen_blit_shaders.h"
 
 
 
  36#include "radeon_ucode.h"
 
 
 
 
 
  37
  38/*
  39 * Indirect registers accessor
  40 */
  41u32 eg_cg_rreg(struct radeon_device *rdev, u32 reg)
  42{
  43	unsigned long flags;
  44	u32 r;
  45
  46	spin_lock_irqsave(&rdev->cg_idx_lock, flags);
  47	WREG32(EVERGREEN_CG_IND_ADDR, ((reg) & 0xffff));
  48	r = RREG32(EVERGREEN_CG_IND_DATA);
  49	spin_unlock_irqrestore(&rdev->cg_idx_lock, flags);
  50	return r;
  51}
  52
  53void eg_cg_wreg(struct radeon_device *rdev, u32 reg, u32 v)
  54{
  55	unsigned long flags;
  56
  57	spin_lock_irqsave(&rdev->cg_idx_lock, flags);
  58	WREG32(EVERGREEN_CG_IND_ADDR, ((reg) & 0xffff));
  59	WREG32(EVERGREEN_CG_IND_DATA, (v));
  60	spin_unlock_irqrestore(&rdev->cg_idx_lock, flags);
  61}
  62
  63u32 eg_pif_phy0_rreg(struct radeon_device *rdev, u32 reg)
  64{
  65	unsigned long flags;
  66	u32 r;
  67
  68	spin_lock_irqsave(&rdev->pif_idx_lock, flags);
  69	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
  70	r = RREG32(EVERGREEN_PIF_PHY0_DATA);
  71	spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
  72	return r;
  73}
  74
  75void eg_pif_phy0_wreg(struct radeon_device *rdev, u32 reg, u32 v)
  76{
  77	unsigned long flags;
  78
  79	spin_lock_irqsave(&rdev->pif_idx_lock, flags);
  80	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
  81	WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
  82	spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
  83}
  84
  85u32 eg_pif_phy1_rreg(struct radeon_device *rdev, u32 reg)
  86{
  87	unsigned long flags;
  88	u32 r;
  89
  90	spin_lock_irqsave(&rdev->pif_idx_lock, flags);
  91	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
  92	r = RREG32(EVERGREEN_PIF_PHY1_DATA);
  93	spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
  94	return r;
  95}
  96
  97void eg_pif_phy1_wreg(struct radeon_device *rdev, u32 reg, u32 v)
  98{
  99	unsigned long flags;
 100
 101	spin_lock_irqsave(&rdev->pif_idx_lock, flags);
 102	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
 103	WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
 104	spin_unlock_irqrestore(&rdev->pif_idx_lock, flags);
 105}
 106
 107static const u32 crtc_offsets[6] =
 108{
 109	EVERGREEN_CRTC0_REGISTER_OFFSET,
 110	EVERGREEN_CRTC1_REGISTER_OFFSET,
 111	EVERGREEN_CRTC2_REGISTER_OFFSET,
 112	EVERGREEN_CRTC3_REGISTER_OFFSET,
 113	EVERGREEN_CRTC4_REGISTER_OFFSET,
 114	EVERGREEN_CRTC5_REGISTER_OFFSET
 115};
 116
 117#include "clearstate_evergreen.h"
 118
 119static const u32 sumo_rlc_save_restore_register_list[] =
 120{
 121	0x98fc,
 122	0x9830,
 123	0x9834,
 124	0x9838,
 125	0x9870,
 126	0x9874,
 127	0x8a14,
 128	0x8b24,
 129	0x8bcc,
 130	0x8b10,
 131	0x8d00,
 132	0x8d04,
 133	0x8c00,
 134	0x8c04,
 135	0x8c08,
 136	0x8c0c,
 137	0x8d8c,
 138	0x8c20,
 139	0x8c24,
 140	0x8c28,
 141	0x8c18,
 142	0x8c1c,
 143	0x8cf0,
 144	0x8e2c,
 145	0x8e38,
 146	0x8c30,
 147	0x9508,
 148	0x9688,
 149	0x9608,
 150	0x960c,
 151	0x9610,
 152	0x9614,
 153	0x88c4,
 154	0x88d4,
 155	0xa008,
 156	0x900c,
 157	0x9100,
 158	0x913c,
 159	0x98f8,
 160	0x98f4,
 161	0x9b7c,
 162	0x3f8c,
 163	0x8950,
 164	0x8954,
 165	0x8a18,
 166	0x8b28,
 167	0x9144,
 168	0x9148,
 169	0x914c,
 170	0x3f90,
 171	0x3f94,
 172	0x915c,
 173	0x9160,
 174	0x9178,
 175	0x917c,
 176	0x9180,
 177	0x918c,
 178	0x9190,
 179	0x9194,
 180	0x9198,
 181	0x919c,
 182	0x91a8,
 183	0x91ac,
 184	0x91b0,
 185	0x91b4,
 186	0x91b8,
 187	0x91c4,
 188	0x91c8,
 189	0x91cc,
 190	0x91d0,
 191	0x91d4,
 192	0x91e0,
 193	0x91e4,
 194	0x91ec,
 195	0x91f0,
 196	0x91f4,
 197	0x9200,
 198	0x9204,
 199	0x929c,
 200	0x9150,
 201	0x802c,
 202};
 203
 204static void evergreen_gpu_init(struct radeon_device *rdev);
 205void evergreen_fini(struct radeon_device *rdev);
 206void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
 207void evergreen_program_aspm(struct radeon_device *rdev);
 208extern void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
 209				     int ring, u32 cp_int_cntl);
 210extern void cayman_vm_decode_fault(struct radeon_device *rdev,
 211				   u32 status, u32 addr);
 212void cik_init_cp_pg_table(struct radeon_device *rdev);
 213
 214extern u32 si_get_csb_size(struct radeon_device *rdev);
 215extern void si_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer);
 216extern u32 cik_get_csb_size(struct radeon_device *rdev);
 217extern void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer);
 218extern void rv770_set_clk_bypass_mode(struct radeon_device *rdev);
 219
 220static const u32 evergreen_golden_registers[] =
 221{
 222	0x3f90, 0xffff0000, 0xff000000,
 223	0x9148, 0xffff0000, 0xff000000,
 224	0x3f94, 0xffff0000, 0xff000000,
 225	0x914c, 0xffff0000, 0xff000000,
 226	0x9b7c, 0xffffffff, 0x00000000,
 227	0x8a14, 0xffffffff, 0x00000007,
 228	0x8b10, 0xffffffff, 0x00000000,
 229	0x960c, 0xffffffff, 0x54763210,
 230	0x88c4, 0xffffffff, 0x000000c2,
 231	0x88d4, 0xffffffff, 0x00000010,
 232	0x8974, 0xffffffff, 0x00000000,
 233	0xc78, 0x00000080, 0x00000080,
 234	0x5eb4, 0xffffffff, 0x00000002,
 235	0x5e78, 0xffffffff, 0x001000f0,
 236	0x6104, 0x01000300, 0x00000000,
 237	0x5bc0, 0x00300000, 0x00000000,
 238	0x7030, 0xffffffff, 0x00000011,
 239	0x7c30, 0xffffffff, 0x00000011,
 240	0x10830, 0xffffffff, 0x00000011,
 241	0x11430, 0xffffffff, 0x00000011,
 242	0x12030, 0xffffffff, 0x00000011,
 243	0x12c30, 0xffffffff, 0x00000011,
 244	0xd02c, 0xffffffff, 0x08421000,
 245	0x240c, 0xffffffff, 0x00000380,
 246	0x8b24, 0xffffffff, 0x00ff0fff,
 247	0x28a4c, 0x06000000, 0x06000000,
 248	0x10c, 0x00000001, 0x00000001,
 249	0x8d00, 0xffffffff, 0x100e4848,
 250	0x8d04, 0xffffffff, 0x00164745,
 251	0x8c00, 0xffffffff, 0xe4000003,
 252	0x8c04, 0xffffffff, 0x40600060,
 253	0x8c08, 0xffffffff, 0x001c001c,
 254	0x8cf0, 0xffffffff, 0x08e00620,
 255	0x8c20, 0xffffffff, 0x00800080,
 256	0x8c24, 0xffffffff, 0x00800080,
 257	0x8c18, 0xffffffff, 0x20202078,
 258	0x8c1c, 0xffffffff, 0x00001010,
 259	0x28350, 0xffffffff, 0x00000000,
 260	0xa008, 0xffffffff, 0x00010000,
 261	0x5c4, 0xffffffff, 0x00000001,
 262	0x9508, 0xffffffff, 0x00000002,
 263	0x913c, 0x0000000f, 0x0000000a
 264};
 265
 266static const u32 evergreen_golden_registers2[] =
 267{
 268	0x2f4c, 0xffffffff, 0x00000000,
 269	0x54f4, 0xffffffff, 0x00000000,
 270	0x54f0, 0xffffffff, 0x00000000,
 271	0x5498, 0xffffffff, 0x00000000,
 272	0x549c, 0xffffffff, 0x00000000,
 273	0x5494, 0xffffffff, 0x00000000,
 274	0x53cc, 0xffffffff, 0x00000000,
 275	0x53c8, 0xffffffff, 0x00000000,
 276	0x53c4, 0xffffffff, 0x00000000,
 277	0x53c0, 0xffffffff, 0x00000000,
 278	0x53bc, 0xffffffff, 0x00000000,
 279	0x53b8, 0xffffffff, 0x00000000,
 280	0x53b4, 0xffffffff, 0x00000000,
 281	0x53b0, 0xffffffff, 0x00000000
 282};
 283
 284static const u32 cypress_mgcg_init[] =
 285{
 286	0x802c, 0xffffffff, 0xc0000000,
 287	0x5448, 0xffffffff, 0x00000100,
 288	0x55e4, 0xffffffff, 0x00000100,
 289	0x160c, 0xffffffff, 0x00000100,
 290	0x5644, 0xffffffff, 0x00000100,
 291	0xc164, 0xffffffff, 0x00000100,
 292	0x8a18, 0xffffffff, 0x00000100,
 293	0x897c, 0xffffffff, 0x06000100,
 294	0x8b28, 0xffffffff, 0x00000100,
 295	0x9144, 0xffffffff, 0x00000100,
 296	0x9a60, 0xffffffff, 0x00000100,
 297	0x9868, 0xffffffff, 0x00000100,
 298	0x8d58, 0xffffffff, 0x00000100,
 299	0x9510, 0xffffffff, 0x00000100,
 300	0x949c, 0xffffffff, 0x00000100,
 301	0x9654, 0xffffffff, 0x00000100,
 302	0x9030, 0xffffffff, 0x00000100,
 303	0x9034, 0xffffffff, 0x00000100,
 304	0x9038, 0xffffffff, 0x00000100,
 305	0x903c, 0xffffffff, 0x00000100,
 306	0x9040, 0xffffffff, 0x00000100,
 307	0xa200, 0xffffffff, 0x00000100,
 308	0xa204, 0xffffffff, 0x00000100,
 309	0xa208, 0xffffffff, 0x00000100,
 310	0xa20c, 0xffffffff, 0x00000100,
 311	0x971c, 0xffffffff, 0x00000100,
 312	0x977c, 0xffffffff, 0x00000100,
 313	0x3f80, 0xffffffff, 0x00000100,
 314	0xa210, 0xffffffff, 0x00000100,
 315	0xa214, 0xffffffff, 0x00000100,
 316	0x4d8, 0xffffffff, 0x00000100,
 317	0x9784, 0xffffffff, 0x00000100,
 318	0x9698, 0xffffffff, 0x00000100,
 319	0x4d4, 0xffffffff, 0x00000200,
 320	0x30cc, 0xffffffff, 0x00000100,
 321	0xd0c0, 0xffffffff, 0xff000100,
 322	0x802c, 0xffffffff, 0x40000000,
 323	0x915c, 0xffffffff, 0x00010000,
 324	0x9160, 0xffffffff, 0x00030002,
 325	0x9178, 0xffffffff, 0x00070000,
 326	0x917c, 0xffffffff, 0x00030002,
 327	0x9180, 0xffffffff, 0x00050004,
 328	0x918c, 0xffffffff, 0x00010006,
 329	0x9190, 0xffffffff, 0x00090008,
 330	0x9194, 0xffffffff, 0x00070000,
 331	0x9198, 0xffffffff, 0x00030002,
 332	0x919c, 0xffffffff, 0x00050004,
 333	0x91a8, 0xffffffff, 0x00010006,
 334	0x91ac, 0xffffffff, 0x00090008,
 335	0x91b0, 0xffffffff, 0x00070000,
 336	0x91b4, 0xffffffff, 0x00030002,
 337	0x91b8, 0xffffffff, 0x00050004,
 338	0x91c4, 0xffffffff, 0x00010006,
 339	0x91c8, 0xffffffff, 0x00090008,
 340	0x91cc, 0xffffffff, 0x00070000,
 341	0x91d0, 0xffffffff, 0x00030002,
 342	0x91d4, 0xffffffff, 0x00050004,
 343	0x91e0, 0xffffffff, 0x00010006,
 344	0x91e4, 0xffffffff, 0x00090008,
 345	0x91e8, 0xffffffff, 0x00000000,
 346	0x91ec, 0xffffffff, 0x00070000,
 347	0x91f0, 0xffffffff, 0x00030002,
 348	0x91f4, 0xffffffff, 0x00050004,
 349	0x9200, 0xffffffff, 0x00010006,
 350	0x9204, 0xffffffff, 0x00090008,
 351	0x9208, 0xffffffff, 0x00070000,
 352	0x920c, 0xffffffff, 0x00030002,
 353	0x9210, 0xffffffff, 0x00050004,
 354	0x921c, 0xffffffff, 0x00010006,
 355	0x9220, 0xffffffff, 0x00090008,
 356	0x9224, 0xffffffff, 0x00070000,
 357	0x9228, 0xffffffff, 0x00030002,
 358	0x922c, 0xffffffff, 0x00050004,
 359	0x9238, 0xffffffff, 0x00010006,
 360	0x923c, 0xffffffff, 0x00090008,
 361	0x9240, 0xffffffff, 0x00070000,
 362	0x9244, 0xffffffff, 0x00030002,
 363	0x9248, 0xffffffff, 0x00050004,
 364	0x9254, 0xffffffff, 0x00010006,
 365	0x9258, 0xffffffff, 0x00090008,
 366	0x925c, 0xffffffff, 0x00070000,
 367	0x9260, 0xffffffff, 0x00030002,
 368	0x9264, 0xffffffff, 0x00050004,
 369	0x9270, 0xffffffff, 0x00010006,
 370	0x9274, 0xffffffff, 0x00090008,
 371	0x9278, 0xffffffff, 0x00070000,
 372	0x927c, 0xffffffff, 0x00030002,
 373	0x9280, 0xffffffff, 0x00050004,
 374	0x928c, 0xffffffff, 0x00010006,
 375	0x9290, 0xffffffff, 0x00090008,
 376	0x9294, 0xffffffff, 0x00000000,
 377	0x929c, 0xffffffff, 0x00000001,
 378	0x802c, 0xffffffff, 0x40010000,
 379	0x915c, 0xffffffff, 0x00010000,
 380	0x9160, 0xffffffff, 0x00030002,
 381	0x9178, 0xffffffff, 0x00070000,
 382	0x917c, 0xffffffff, 0x00030002,
 383	0x9180, 0xffffffff, 0x00050004,
 384	0x918c, 0xffffffff, 0x00010006,
 385	0x9190, 0xffffffff, 0x00090008,
 386	0x9194, 0xffffffff, 0x00070000,
 387	0x9198, 0xffffffff, 0x00030002,
 388	0x919c, 0xffffffff, 0x00050004,
 389	0x91a8, 0xffffffff, 0x00010006,
 390	0x91ac, 0xffffffff, 0x00090008,
 391	0x91b0, 0xffffffff, 0x00070000,
 392	0x91b4, 0xffffffff, 0x00030002,
 393	0x91b8, 0xffffffff, 0x00050004,
 394	0x91c4, 0xffffffff, 0x00010006,
 395	0x91c8, 0xffffffff, 0x00090008,
 396	0x91cc, 0xffffffff, 0x00070000,
 397	0x91d0, 0xffffffff, 0x00030002,
 398	0x91d4, 0xffffffff, 0x00050004,
 399	0x91e0, 0xffffffff, 0x00010006,
 400	0x91e4, 0xffffffff, 0x00090008,
 401	0x91e8, 0xffffffff, 0x00000000,
 402	0x91ec, 0xffffffff, 0x00070000,
 403	0x91f0, 0xffffffff, 0x00030002,
 404	0x91f4, 0xffffffff, 0x00050004,
 405	0x9200, 0xffffffff, 0x00010006,
 406	0x9204, 0xffffffff, 0x00090008,
 407	0x9208, 0xffffffff, 0x00070000,
 408	0x920c, 0xffffffff, 0x00030002,
 409	0x9210, 0xffffffff, 0x00050004,
 410	0x921c, 0xffffffff, 0x00010006,
 411	0x9220, 0xffffffff, 0x00090008,
 412	0x9224, 0xffffffff, 0x00070000,
 413	0x9228, 0xffffffff, 0x00030002,
 414	0x922c, 0xffffffff, 0x00050004,
 415	0x9238, 0xffffffff, 0x00010006,
 416	0x923c, 0xffffffff, 0x00090008,
 417	0x9240, 0xffffffff, 0x00070000,
 418	0x9244, 0xffffffff, 0x00030002,
 419	0x9248, 0xffffffff, 0x00050004,
 420	0x9254, 0xffffffff, 0x00010006,
 421	0x9258, 0xffffffff, 0x00090008,
 422	0x925c, 0xffffffff, 0x00070000,
 423	0x9260, 0xffffffff, 0x00030002,
 424	0x9264, 0xffffffff, 0x00050004,
 425	0x9270, 0xffffffff, 0x00010006,
 426	0x9274, 0xffffffff, 0x00090008,
 427	0x9278, 0xffffffff, 0x00070000,
 428	0x927c, 0xffffffff, 0x00030002,
 429	0x9280, 0xffffffff, 0x00050004,
 430	0x928c, 0xffffffff, 0x00010006,
 431	0x9290, 0xffffffff, 0x00090008,
 432	0x9294, 0xffffffff, 0x00000000,
 433	0x929c, 0xffffffff, 0x00000001,
 434	0x802c, 0xffffffff, 0xc0000000
 435};
 436
 437static const u32 redwood_mgcg_init[] =
 438{
 439	0x802c, 0xffffffff, 0xc0000000,
 440	0x5448, 0xffffffff, 0x00000100,
 441	0x55e4, 0xffffffff, 0x00000100,
 442	0x160c, 0xffffffff, 0x00000100,
 443	0x5644, 0xffffffff, 0x00000100,
 444	0xc164, 0xffffffff, 0x00000100,
 445	0x8a18, 0xffffffff, 0x00000100,
 446	0x897c, 0xffffffff, 0x06000100,
 447	0x8b28, 0xffffffff, 0x00000100,
 448	0x9144, 0xffffffff, 0x00000100,
 449	0x9a60, 0xffffffff, 0x00000100,
 450	0x9868, 0xffffffff, 0x00000100,
 451	0x8d58, 0xffffffff, 0x00000100,
 452	0x9510, 0xffffffff, 0x00000100,
 453	0x949c, 0xffffffff, 0x00000100,
 454	0x9654, 0xffffffff, 0x00000100,
 455	0x9030, 0xffffffff, 0x00000100,
 456	0x9034, 0xffffffff, 0x00000100,
 457	0x9038, 0xffffffff, 0x00000100,
 458	0x903c, 0xffffffff, 0x00000100,
 459	0x9040, 0xffffffff, 0x00000100,
 460	0xa200, 0xffffffff, 0x00000100,
 461	0xa204, 0xffffffff, 0x00000100,
 462	0xa208, 0xffffffff, 0x00000100,
 463	0xa20c, 0xffffffff, 0x00000100,
 464	0x971c, 0xffffffff, 0x00000100,
 465	0x977c, 0xffffffff, 0x00000100,
 466	0x3f80, 0xffffffff, 0x00000100,
 467	0xa210, 0xffffffff, 0x00000100,
 468	0xa214, 0xffffffff, 0x00000100,
 469	0x4d8, 0xffffffff, 0x00000100,
 470	0x9784, 0xffffffff, 0x00000100,
 471	0x9698, 0xffffffff, 0x00000100,
 472	0x4d4, 0xffffffff, 0x00000200,
 473	0x30cc, 0xffffffff, 0x00000100,
 474	0xd0c0, 0xffffffff, 0xff000100,
 475	0x802c, 0xffffffff, 0x40000000,
 476	0x915c, 0xffffffff, 0x00010000,
 477	0x9160, 0xffffffff, 0x00030002,
 478	0x9178, 0xffffffff, 0x00070000,
 479	0x917c, 0xffffffff, 0x00030002,
 480	0x9180, 0xffffffff, 0x00050004,
 481	0x918c, 0xffffffff, 0x00010006,
 482	0x9190, 0xffffffff, 0x00090008,
 483	0x9194, 0xffffffff, 0x00070000,
 484	0x9198, 0xffffffff, 0x00030002,
 485	0x919c, 0xffffffff, 0x00050004,
 486	0x91a8, 0xffffffff, 0x00010006,
 487	0x91ac, 0xffffffff, 0x00090008,
 488	0x91b0, 0xffffffff, 0x00070000,
 489	0x91b4, 0xffffffff, 0x00030002,
 490	0x91b8, 0xffffffff, 0x00050004,
 491	0x91c4, 0xffffffff, 0x00010006,
 492	0x91c8, 0xffffffff, 0x00090008,
 493	0x91cc, 0xffffffff, 0x00070000,
 494	0x91d0, 0xffffffff, 0x00030002,
 495	0x91d4, 0xffffffff, 0x00050004,
 496	0x91e0, 0xffffffff, 0x00010006,
 497	0x91e4, 0xffffffff, 0x00090008,
 498	0x91e8, 0xffffffff, 0x00000000,
 499	0x91ec, 0xffffffff, 0x00070000,
 500	0x91f0, 0xffffffff, 0x00030002,
 501	0x91f4, 0xffffffff, 0x00050004,
 502	0x9200, 0xffffffff, 0x00010006,
 503	0x9204, 0xffffffff, 0x00090008,
 504	0x9294, 0xffffffff, 0x00000000,
 505	0x929c, 0xffffffff, 0x00000001,
 506	0x802c, 0xffffffff, 0xc0000000
 507};
 508
 509static const u32 cedar_golden_registers[] =
 510{
 511	0x3f90, 0xffff0000, 0xff000000,
 512	0x9148, 0xffff0000, 0xff000000,
 513	0x3f94, 0xffff0000, 0xff000000,
 514	0x914c, 0xffff0000, 0xff000000,
 515	0x9b7c, 0xffffffff, 0x00000000,
 516	0x8a14, 0xffffffff, 0x00000007,
 517	0x8b10, 0xffffffff, 0x00000000,
 518	0x960c, 0xffffffff, 0x54763210,
 519	0x88c4, 0xffffffff, 0x000000c2,
 520	0x88d4, 0xffffffff, 0x00000000,
 521	0x8974, 0xffffffff, 0x00000000,
 522	0xc78, 0x00000080, 0x00000080,
 523	0x5eb4, 0xffffffff, 0x00000002,
 524	0x5e78, 0xffffffff, 0x001000f0,
 525	0x6104, 0x01000300, 0x00000000,
 526	0x5bc0, 0x00300000, 0x00000000,
 527	0x7030, 0xffffffff, 0x00000011,
 528	0x7c30, 0xffffffff, 0x00000011,
 529	0x10830, 0xffffffff, 0x00000011,
 530	0x11430, 0xffffffff, 0x00000011,
 531	0xd02c, 0xffffffff, 0x08421000,
 532	0x240c, 0xffffffff, 0x00000380,
 533	0x8b24, 0xffffffff, 0x00ff0fff,
 534	0x28a4c, 0x06000000, 0x06000000,
 535	0x10c, 0x00000001, 0x00000001,
 536	0x8d00, 0xffffffff, 0x100e4848,
 537	0x8d04, 0xffffffff, 0x00164745,
 538	0x8c00, 0xffffffff, 0xe4000003,
 539	0x8c04, 0xffffffff, 0x40600060,
 540	0x8c08, 0xffffffff, 0x001c001c,
 541	0x8cf0, 0xffffffff, 0x08e00410,
 542	0x8c20, 0xffffffff, 0x00800080,
 543	0x8c24, 0xffffffff, 0x00800080,
 544	0x8c18, 0xffffffff, 0x20202078,
 545	0x8c1c, 0xffffffff, 0x00001010,
 546	0x28350, 0xffffffff, 0x00000000,
 547	0xa008, 0xffffffff, 0x00010000,
 548	0x5c4, 0xffffffff, 0x00000001,
 549	0x9508, 0xffffffff, 0x00000002
 550};
 551
 552static const u32 cedar_mgcg_init[] =
 553{
 554	0x802c, 0xffffffff, 0xc0000000,
 555	0x5448, 0xffffffff, 0x00000100,
 556	0x55e4, 0xffffffff, 0x00000100,
 557	0x160c, 0xffffffff, 0x00000100,
 558	0x5644, 0xffffffff, 0x00000100,
 559	0xc164, 0xffffffff, 0x00000100,
 560	0x8a18, 0xffffffff, 0x00000100,
 561	0x897c, 0xffffffff, 0x06000100,
 562	0x8b28, 0xffffffff, 0x00000100,
 563	0x9144, 0xffffffff, 0x00000100,
 564	0x9a60, 0xffffffff, 0x00000100,
 565	0x9868, 0xffffffff, 0x00000100,
 566	0x8d58, 0xffffffff, 0x00000100,
 567	0x9510, 0xffffffff, 0x00000100,
 568	0x949c, 0xffffffff, 0x00000100,
 569	0x9654, 0xffffffff, 0x00000100,
 570	0x9030, 0xffffffff, 0x00000100,
 571	0x9034, 0xffffffff, 0x00000100,
 572	0x9038, 0xffffffff, 0x00000100,
 573	0x903c, 0xffffffff, 0x00000100,
 574	0x9040, 0xffffffff, 0x00000100,
 575	0xa200, 0xffffffff, 0x00000100,
 576	0xa204, 0xffffffff, 0x00000100,
 577	0xa208, 0xffffffff, 0x00000100,
 578	0xa20c, 0xffffffff, 0x00000100,
 579	0x971c, 0xffffffff, 0x00000100,
 580	0x977c, 0xffffffff, 0x00000100,
 581	0x3f80, 0xffffffff, 0x00000100,
 582	0xa210, 0xffffffff, 0x00000100,
 583	0xa214, 0xffffffff, 0x00000100,
 584	0x4d8, 0xffffffff, 0x00000100,
 585	0x9784, 0xffffffff, 0x00000100,
 586	0x9698, 0xffffffff, 0x00000100,
 587	0x4d4, 0xffffffff, 0x00000200,
 588	0x30cc, 0xffffffff, 0x00000100,
 589	0xd0c0, 0xffffffff, 0xff000100,
 590	0x802c, 0xffffffff, 0x40000000,
 591	0x915c, 0xffffffff, 0x00010000,
 592	0x9178, 0xffffffff, 0x00050000,
 593	0x917c, 0xffffffff, 0x00030002,
 594	0x918c, 0xffffffff, 0x00010004,
 595	0x9190, 0xffffffff, 0x00070006,
 596	0x9194, 0xffffffff, 0x00050000,
 597	0x9198, 0xffffffff, 0x00030002,
 598	0x91a8, 0xffffffff, 0x00010004,
 599	0x91ac, 0xffffffff, 0x00070006,
 600	0x91e8, 0xffffffff, 0x00000000,
 601	0x9294, 0xffffffff, 0x00000000,
 602	0x929c, 0xffffffff, 0x00000001,
 603	0x802c, 0xffffffff, 0xc0000000
 604};
 605
 606static const u32 juniper_mgcg_init[] =
 607{
 608	0x802c, 0xffffffff, 0xc0000000,
 609	0x5448, 0xffffffff, 0x00000100,
 610	0x55e4, 0xffffffff, 0x00000100,
 611	0x160c, 0xffffffff, 0x00000100,
 612	0x5644, 0xffffffff, 0x00000100,
 613	0xc164, 0xffffffff, 0x00000100,
 614	0x8a18, 0xffffffff, 0x00000100,
 615	0x897c, 0xffffffff, 0x06000100,
 616	0x8b28, 0xffffffff, 0x00000100,
 617	0x9144, 0xffffffff, 0x00000100,
 618	0x9a60, 0xffffffff, 0x00000100,
 619	0x9868, 0xffffffff, 0x00000100,
 620	0x8d58, 0xffffffff, 0x00000100,
 621	0x9510, 0xffffffff, 0x00000100,
 622	0x949c, 0xffffffff, 0x00000100,
 623	0x9654, 0xffffffff, 0x00000100,
 624	0x9030, 0xffffffff, 0x00000100,
 625	0x9034, 0xffffffff, 0x00000100,
 626	0x9038, 0xffffffff, 0x00000100,
 627	0x903c, 0xffffffff, 0x00000100,
 628	0x9040, 0xffffffff, 0x00000100,
 629	0xa200, 0xffffffff, 0x00000100,
 630	0xa204, 0xffffffff, 0x00000100,
 631	0xa208, 0xffffffff, 0x00000100,
 632	0xa20c, 0xffffffff, 0x00000100,
 633	0x971c, 0xffffffff, 0x00000100,
 634	0xd0c0, 0xffffffff, 0xff000100,
 635	0x802c, 0xffffffff, 0x40000000,
 636	0x915c, 0xffffffff, 0x00010000,
 637	0x9160, 0xffffffff, 0x00030002,
 638	0x9178, 0xffffffff, 0x00070000,
 639	0x917c, 0xffffffff, 0x00030002,
 640	0x9180, 0xffffffff, 0x00050004,
 641	0x918c, 0xffffffff, 0x00010006,
 642	0x9190, 0xffffffff, 0x00090008,
 643	0x9194, 0xffffffff, 0x00070000,
 644	0x9198, 0xffffffff, 0x00030002,
 645	0x919c, 0xffffffff, 0x00050004,
 646	0x91a8, 0xffffffff, 0x00010006,
 647	0x91ac, 0xffffffff, 0x00090008,
 648	0x91b0, 0xffffffff, 0x00070000,
 649	0x91b4, 0xffffffff, 0x00030002,
 650	0x91b8, 0xffffffff, 0x00050004,
 651	0x91c4, 0xffffffff, 0x00010006,
 652	0x91c8, 0xffffffff, 0x00090008,
 653	0x91cc, 0xffffffff, 0x00070000,
 654	0x91d0, 0xffffffff, 0x00030002,
 655	0x91d4, 0xffffffff, 0x00050004,
 656	0x91e0, 0xffffffff, 0x00010006,
 657	0x91e4, 0xffffffff, 0x00090008,
 658	0x91e8, 0xffffffff, 0x00000000,
 659	0x91ec, 0xffffffff, 0x00070000,
 660	0x91f0, 0xffffffff, 0x00030002,
 661	0x91f4, 0xffffffff, 0x00050004,
 662	0x9200, 0xffffffff, 0x00010006,
 663	0x9204, 0xffffffff, 0x00090008,
 664	0x9208, 0xffffffff, 0x00070000,
 665	0x920c, 0xffffffff, 0x00030002,
 666	0x9210, 0xffffffff, 0x00050004,
 667	0x921c, 0xffffffff, 0x00010006,
 668	0x9220, 0xffffffff, 0x00090008,
 669	0x9224, 0xffffffff, 0x00070000,
 670	0x9228, 0xffffffff, 0x00030002,
 671	0x922c, 0xffffffff, 0x00050004,
 672	0x9238, 0xffffffff, 0x00010006,
 673	0x923c, 0xffffffff, 0x00090008,
 674	0x9240, 0xffffffff, 0x00070000,
 675	0x9244, 0xffffffff, 0x00030002,
 676	0x9248, 0xffffffff, 0x00050004,
 677	0x9254, 0xffffffff, 0x00010006,
 678	0x9258, 0xffffffff, 0x00090008,
 679	0x925c, 0xffffffff, 0x00070000,
 680	0x9260, 0xffffffff, 0x00030002,
 681	0x9264, 0xffffffff, 0x00050004,
 682	0x9270, 0xffffffff, 0x00010006,
 683	0x9274, 0xffffffff, 0x00090008,
 684	0x9278, 0xffffffff, 0x00070000,
 685	0x927c, 0xffffffff, 0x00030002,
 686	0x9280, 0xffffffff, 0x00050004,
 687	0x928c, 0xffffffff, 0x00010006,
 688	0x9290, 0xffffffff, 0x00090008,
 689	0x9294, 0xffffffff, 0x00000000,
 690	0x929c, 0xffffffff, 0x00000001,
 691	0x802c, 0xffffffff, 0xc0000000,
 692	0x977c, 0xffffffff, 0x00000100,
 693	0x3f80, 0xffffffff, 0x00000100,
 694	0xa210, 0xffffffff, 0x00000100,
 695	0xa214, 0xffffffff, 0x00000100,
 696	0x4d8, 0xffffffff, 0x00000100,
 697	0x9784, 0xffffffff, 0x00000100,
 698	0x9698, 0xffffffff, 0x00000100,
 699	0x4d4, 0xffffffff, 0x00000200,
 700	0x30cc, 0xffffffff, 0x00000100,
 701	0x802c, 0xffffffff, 0xc0000000
 702};
 703
 704static const u32 supersumo_golden_registers[] =
 705{
 706	0x5eb4, 0xffffffff, 0x00000002,
 707	0x5c4, 0xffffffff, 0x00000001,
 708	0x7030, 0xffffffff, 0x00000011,
 709	0x7c30, 0xffffffff, 0x00000011,
 710	0x6104, 0x01000300, 0x00000000,
 711	0x5bc0, 0x00300000, 0x00000000,
 712	0x8c04, 0xffffffff, 0x40600060,
 713	0x8c08, 0xffffffff, 0x001c001c,
 714	0x8c20, 0xffffffff, 0x00800080,
 715	0x8c24, 0xffffffff, 0x00800080,
 716	0x8c18, 0xffffffff, 0x20202078,
 717	0x8c1c, 0xffffffff, 0x00001010,
 718	0x918c, 0xffffffff, 0x00010006,
 719	0x91a8, 0xffffffff, 0x00010006,
 720	0x91c4, 0xffffffff, 0x00010006,
 721	0x91e0, 0xffffffff, 0x00010006,
 722	0x9200, 0xffffffff, 0x00010006,
 723	0x9150, 0xffffffff, 0x6e944040,
 724	0x917c, 0xffffffff, 0x00030002,
 725	0x9180, 0xffffffff, 0x00050004,
 726	0x9198, 0xffffffff, 0x00030002,
 727	0x919c, 0xffffffff, 0x00050004,
 728	0x91b4, 0xffffffff, 0x00030002,
 729	0x91b8, 0xffffffff, 0x00050004,
 730	0x91d0, 0xffffffff, 0x00030002,
 731	0x91d4, 0xffffffff, 0x00050004,
 732	0x91f0, 0xffffffff, 0x00030002,
 733	0x91f4, 0xffffffff, 0x00050004,
 734	0x915c, 0xffffffff, 0x00010000,
 735	0x9160, 0xffffffff, 0x00030002,
 736	0x3f90, 0xffff0000, 0xff000000,
 737	0x9178, 0xffffffff, 0x00070000,
 738	0x9194, 0xffffffff, 0x00070000,
 739	0x91b0, 0xffffffff, 0x00070000,
 740	0x91cc, 0xffffffff, 0x00070000,
 741	0x91ec, 0xffffffff, 0x00070000,
 742	0x9148, 0xffff0000, 0xff000000,
 743	0x9190, 0xffffffff, 0x00090008,
 744	0x91ac, 0xffffffff, 0x00090008,
 745	0x91c8, 0xffffffff, 0x00090008,
 746	0x91e4, 0xffffffff, 0x00090008,
 747	0x9204, 0xffffffff, 0x00090008,
 748	0x3f94, 0xffff0000, 0xff000000,
 749	0x914c, 0xffff0000, 0xff000000,
 750	0x929c, 0xffffffff, 0x00000001,
 751	0x8a18, 0xffffffff, 0x00000100,
 752	0x8b28, 0xffffffff, 0x00000100,
 753	0x9144, 0xffffffff, 0x00000100,
 754	0x5644, 0xffffffff, 0x00000100,
 755	0x9b7c, 0xffffffff, 0x00000000,
 756	0x8030, 0xffffffff, 0x0000100a,
 757	0x8a14, 0xffffffff, 0x00000007,
 758	0x8b24, 0xffffffff, 0x00ff0fff,
 759	0x8b10, 0xffffffff, 0x00000000,
 760	0x28a4c, 0x06000000, 0x06000000,
 761	0x4d8, 0xffffffff, 0x00000100,
 762	0x913c, 0xffff000f, 0x0100000a,
 763	0x960c, 0xffffffff, 0x54763210,
 764	0x88c4, 0xffffffff, 0x000000c2,
 765	0x88d4, 0xffffffff, 0x00000010,
 766	0x8974, 0xffffffff, 0x00000000,
 767	0xc78, 0x00000080, 0x00000080,
 768	0x5e78, 0xffffffff, 0x001000f0,
 769	0xd02c, 0xffffffff, 0x08421000,
 770	0xa008, 0xffffffff, 0x00010000,
 771	0x8d00, 0xffffffff, 0x100e4848,
 772	0x8d04, 0xffffffff, 0x00164745,
 773	0x8c00, 0xffffffff, 0xe4000003,
 774	0x8cf0, 0x1fffffff, 0x08e00620,
 775	0x28350, 0xffffffff, 0x00000000,
 776	0x9508, 0xffffffff, 0x00000002
 777};
 778
 779static const u32 sumo_golden_registers[] =
 780{
 781	0x900c, 0x00ffffff, 0x0017071f,
 782	0x8c18, 0xffffffff, 0x10101060,
 783	0x8c1c, 0xffffffff, 0x00001010,
 784	0x8c30, 0x0000000f, 0x00000005,
 785	0x9688, 0x0000000f, 0x00000007
 786};
 787
 788static const u32 wrestler_golden_registers[] =
 789{
 790	0x5eb4, 0xffffffff, 0x00000002,
 791	0x5c4, 0xffffffff, 0x00000001,
 792	0x7030, 0xffffffff, 0x00000011,
 793	0x7c30, 0xffffffff, 0x00000011,
 794	0x6104, 0x01000300, 0x00000000,
 795	0x5bc0, 0x00300000, 0x00000000,
 796	0x918c, 0xffffffff, 0x00010006,
 797	0x91a8, 0xffffffff, 0x00010006,
 798	0x9150, 0xffffffff, 0x6e944040,
 799	0x917c, 0xffffffff, 0x00030002,
 800	0x9198, 0xffffffff, 0x00030002,
 801	0x915c, 0xffffffff, 0x00010000,
 802	0x3f90, 0xffff0000, 0xff000000,
 803	0x9178, 0xffffffff, 0x00070000,
 804	0x9194, 0xffffffff, 0x00070000,
 805	0x9148, 0xffff0000, 0xff000000,
 806	0x9190, 0xffffffff, 0x00090008,
 807	0x91ac, 0xffffffff, 0x00090008,
 808	0x3f94, 0xffff0000, 0xff000000,
 809	0x914c, 0xffff0000, 0xff000000,
 810	0x929c, 0xffffffff, 0x00000001,
 811	0x8a18, 0xffffffff, 0x00000100,
 812	0x8b28, 0xffffffff, 0x00000100,
 813	0x9144, 0xffffffff, 0x00000100,
 814	0x9b7c, 0xffffffff, 0x00000000,
 815	0x8030, 0xffffffff, 0x0000100a,
 816	0x8a14, 0xffffffff, 0x00000001,
 817	0x8b24, 0xffffffff, 0x00ff0fff,
 818	0x8b10, 0xffffffff, 0x00000000,
 819	0x28a4c, 0x06000000, 0x06000000,
 820	0x4d8, 0xffffffff, 0x00000100,
 821	0x913c, 0xffff000f, 0x0100000a,
 822	0x960c, 0xffffffff, 0x54763210,
 823	0x88c4, 0xffffffff, 0x000000c2,
 824	0x88d4, 0xffffffff, 0x00000010,
 825	0x8974, 0xffffffff, 0x00000000,
 826	0xc78, 0x00000080, 0x00000080,
 827	0x5e78, 0xffffffff, 0x001000f0,
 828	0xd02c, 0xffffffff, 0x08421000,
 829	0xa008, 0xffffffff, 0x00010000,
 830	0x8d00, 0xffffffff, 0x100e4848,
 831	0x8d04, 0xffffffff, 0x00164745,
 832	0x8c00, 0xffffffff, 0xe4000003,
 833	0x8cf0, 0x1fffffff, 0x08e00410,
 834	0x28350, 0xffffffff, 0x00000000,
 835	0x9508, 0xffffffff, 0x00000002,
 836	0x900c, 0xffffffff, 0x0017071f,
 837	0x8c18, 0xffffffff, 0x10101060,
 838	0x8c1c, 0xffffffff, 0x00001010
 839};
 840
 841static const u32 barts_golden_registers[] =
 842{
 843	0x5eb4, 0xffffffff, 0x00000002,
 844	0x5e78, 0x8f311ff1, 0x001000f0,
 845	0x3f90, 0xffff0000, 0xff000000,
 846	0x9148, 0xffff0000, 0xff000000,
 847	0x3f94, 0xffff0000, 0xff000000,
 848	0x914c, 0xffff0000, 0xff000000,
 849	0xc78, 0x00000080, 0x00000080,
 850	0xbd4, 0x70073777, 0x00010001,
 851	0xd02c, 0xbfffff1f, 0x08421000,
 852	0xd0b8, 0x03773777, 0x02011003,
 853	0x5bc0, 0x00200000, 0x50100000,
 854	0x98f8, 0x33773777, 0x02011003,
 855	0x98fc, 0xffffffff, 0x76543210,
 856	0x7030, 0x31000311, 0x00000011,
 857	0x2f48, 0x00000007, 0x02011003,
 858	0x6b28, 0x00000010, 0x00000012,
 859	0x7728, 0x00000010, 0x00000012,
 860	0x10328, 0x00000010, 0x00000012,
 861	0x10f28, 0x00000010, 0x00000012,
 862	0x11b28, 0x00000010, 0x00000012,
 863	0x12728, 0x00000010, 0x00000012,
 864	0x240c, 0x000007ff, 0x00000380,
 865	0x8a14, 0xf000001f, 0x00000007,
 866	0x8b24, 0x3fff3fff, 0x00ff0fff,
 867	0x8b10, 0x0000ff0f, 0x00000000,
 868	0x28a4c, 0x07ffffff, 0x06000000,
 869	0x10c, 0x00000001, 0x00010003,
 870	0xa02c, 0xffffffff, 0x0000009b,
 871	0x913c, 0x0000000f, 0x0100000a,
 872	0x8d00, 0xffff7f7f, 0x100e4848,
 873	0x8d04, 0x00ffffff, 0x00164745,
 874	0x8c00, 0xfffc0003, 0xe4000003,
 875	0x8c04, 0xf8ff00ff, 0x40600060,
 876	0x8c08, 0x00ff00ff, 0x001c001c,
 877	0x8cf0, 0x1fff1fff, 0x08e00620,
 878	0x8c20, 0x0fff0fff, 0x00800080,
 879	0x8c24, 0x0fff0fff, 0x00800080,
 880	0x8c18, 0xffffffff, 0x20202078,
 881	0x8c1c, 0x0000ffff, 0x00001010,
 882	0x28350, 0x00000f01, 0x00000000,
 883	0x9508, 0x3700001f, 0x00000002,
 884	0x960c, 0xffffffff, 0x54763210,
 885	0x88c4, 0x001f3ae3, 0x000000c2,
 886	0x88d4, 0x0000001f, 0x00000010,
 887	0x8974, 0xffffffff, 0x00000000
 888};
 889
 890static const u32 turks_golden_registers[] =
 891{
 892	0x5eb4, 0xffffffff, 0x00000002,
 893	0x5e78, 0x8f311ff1, 0x001000f0,
 894	0x8c8, 0x00003000, 0x00001070,
 895	0x8cc, 0x000fffff, 0x00040035,
 896	0x3f90, 0xffff0000, 0xfff00000,
 897	0x9148, 0xffff0000, 0xfff00000,
 898	0x3f94, 0xffff0000, 0xfff00000,
 899	0x914c, 0xffff0000, 0xfff00000,
 900	0xc78, 0x00000080, 0x00000080,
 901	0xbd4, 0x00073007, 0x00010002,
 902	0xd02c, 0xbfffff1f, 0x08421000,
 903	0xd0b8, 0x03773777, 0x02010002,
 904	0x5bc0, 0x00200000, 0x50100000,
 905	0x98f8, 0x33773777, 0x00010002,
 906	0x98fc, 0xffffffff, 0x33221100,
 907	0x7030, 0x31000311, 0x00000011,
 908	0x2f48, 0x33773777, 0x00010002,
 909	0x6b28, 0x00000010, 0x00000012,
 910	0x7728, 0x00000010, 0x00000012,
 911	0x10328, 0x00000010, 0x00000012,
 912	0x10f28, 0x00000010, 0x00000012,
 913	0x11b28, 0x00000010, 0x00000012,
 914	0x12728, 0x00000010, 0x00000012,
 915	0x240c, 0x000007ff, 0x00000380,
 916	0x8a14, 0xf000001f, 0x00000007,
 917	0x8b24, 0x3fff3fff, 0x00ff0fff,
 918	0x8b10, 0x0000ff0f, 0x00000000,
 919	0x28a4c, 0x07ffffff, 0x06000000,
 920	0x10c, 0x00000001, 0x00010003,
 921	0xa02c, 0xffffffff, 0x0000009b,
 922	0x913c, 0x0000000f, 0x0100000a,
 923	0x8d00, 0xffff7f7f, 0x100e4848,
 924	0x8d04, 0x00ffffff, 0x00164745,
 925	0x8c00, 0xfffc0003, 0xe4000003,
 926	0x8c04, 0xf8ff00ff, 0x40600060,
 927	0x8c08, 0x00ff00ff, 0x001c001c,
 928	0x8cf0, 0x1fff1fff, 0x08e00410,
 929	0x8c20, 0x0fff0fff, 0x00800080,
 930	0x8c24, 0x0fff0fff, 0x00800080,
 931	0x8c18, 0xffffffff, 0x20202078,
 932	0x8c1c, 0x0000ffff, 0x00001010,
 933	0x28350, 0x00000f01, 0x00000000,
 934	0x9508, 0x3700001f, 0x00000002,
 935	0x960c, 0xffffffff, 0x54763210,
 936	0x88c4, 0x001f3ae3, 0x000000c2,
 937	0x88d4, 0x0000001f, 0x00000010,
 938	0x8974, 0xffffffff, 0x00000000
 939};
 940
 941static const u32 caicos_golden_registers[] =
 942{
 943	0x5eb4, 0xffffffff, 0x00000002,
 944	0x5e78, 0x8f311ff1, 0x001000f0,
 945	0x8c8, 0x00003420, 0x00001450,
 946	0x8cc, 0x000fffff, 0x00040035,
 947	0x3f90, 0xffff0000, 0xfffc0000,
 948	0x9148, 0xffff0000, 0xfffc0000,
 949	0x3f94, 0xffff0000, 0xfffc0000,
 950	0x914c, 0xffff0000, 0xfffc0000,
 951	0xc78, 0x00000080, 0x00000080,
 952	0xbd4, 0x00073007, 0x00010001,
 953	0xd02c, 0xbfffff1f, 0x08421000,
 954	0xd0b8, 0x03773777, 0x02010001,
 955	0x5bc0, 0x00200000, 0x50100000,
 956	0x98f8, 0x33773777, 0x02010001,
 957	0x98fc, 0xffffffff, 0x33221100,
 958	0x7030, 0x31000311, 0x00000011,
 959	0x2f48, 0x33773777, 0x02010001,
 960	0x6b28, 0x00000010, 0x00000012,
 961	0x7728, 0x00000010, 0x00000012,
 962	0x10328, 0x00000010, 0x00000012,
 963	0x10f28, 0x00000010, 0x00000012,
 964	0x11b28, 0x00000010, 0x00000012,
 965	0x12728, 0x00000010, 0x00000012,
 966	0x240c, 0x000007ff, 0x00000380,
 967	0x8a14, 0xf000001f, 0x00000001,
 968	0x8b24, 0x3fff3fff, 0x00ff0fff,
 969	0x8b10, 0x0000ff0f, 0x00000000,
 970	0x28a4c, 0x07ffffff, 0x06000000,
 971	0x10c, 0x00000001, 0x00010003,
 972	0xa02c, 0xffffffff, 0x0000009b,
 973	0x913c, 0x0000000f, 0x0100000a,
 974	0x8d00, 0xffff7f7f, 0x100e4848,
 975	0x8d04, 0x00ffffff, 0x00164745,
 976	0x8c00, 0xfffc0003, 0xe4000003,
 977	0x8c04, 0xf8ff00ff, 0x40600060,
 978	0x8c08, 0x00ff00ff, 0x001c001c,
 979	0x8cf0, 0x1fff1fff, 0x08e00410,
 980	0x8c20, 0x0fff0fff, 0x00800080,
 981	0x8c24, 0x0fff0fff, 0x00800080,
 982	0x8c18, 0xffffffff, 0x20202078,
 983	0x8c1c, 0x0000ffff, 0x00001010,
 984	0x28350, 0x00000f01, 0x00000000,
 985	0x9508, 0x3700001f, 0x00000002,
 986	0x960c, 0xffffffff, 0x54763210,
 987	0x88c4, 0x001f3ae3, 0x000000c2,
 988	0x88d4, 0x0000001f, 0x00000010,
 989	0x8974, 0xffffffff, 0x00000000
 990};
 991
 992static void evergreen_init_golden_registers(struct radeon_device *rdev)
 993{
 994	switch (rdev->family) {
 995	case CHIP_CYPRESS:
 996	case CHIP_HEMLOCK:
 997		radeon_program_register_sequence(rdev,
 998						 evergreen_golden_registers,
 999						 (const u32)ARRAY_SIZE(evergreen_golden_registers));
1000		radeon_program_register_sequence(rdev,
1001						 evergreen_golden_registers2,
1002						 (const u32)ARRAY_SIZE(evergreen_golden_registers2));
1003		radeon_program_register_sequence(rdev,
1004						 cypress_mgcg_init,
1005						 (const u32)ARRAY_SIZE(cypress_mgcg_init));
1006		break;
1007	case CHIP_JUNIPER:
1008		radeon_program_register_sequence(rdev,
1009						 evergreen_golden_registers,
1010						 (const u32)ARRAY_SIZE(evergreen_golden_registers));
1011		radeon_program_register_sequence(rdev,
1012						 evergreen_golden_registers2,
1013						 (const u32)ARRAY_SIZE(evergreen_golden_registers2));
1014		radeon_program_register_sequence(rdev,
1015						 juniper_mgcg_init,
1016						 (const u32)ARRAY_SIZE(juniper_mgcg_init));
1017		break;
1018	case CHIP_REDWOOD:
1019		radeon_program_register_sequence(rdev,
1020						 evergreen_golden_registers,
1021						 (const u32)ARRAY_SIZE(evergreen_golden_registers));
1022		radeon_program_register_sequence(rdev,
1023						 evergreen_golden_registers2,
1024						 (const u32)ARRAY_SIZE(evergreen_golden_registers2));
1025		radeon_program_register_sequence(rdev,
1026						 redwood_mgcg_init,
1027						 (const u32)ARRAY_SIZE(redwood_mgcg_init));
1028		break;
1029	case CHIP_CEDAR:
1030		radeon_program_register_sequence(rdev,
1031						 cedar_golden_registers,
1032						 (const u32)ARRAY_SIZE(cedar_golden_registers));
1033		radeon_program_register_sequence(rdev,
1034						 evergreen_golden_registers2,
1035						 (const u32)ARRAY_SIZE(evergreen_golden_registers2));
1036		radeon_program_register_sequence(rdev,
1037						 cedar_mgcg_init,
1038						 (const u32)ARRAY_SIZE(cedar_mgcg_init));
1039		break;
1040	case CHIP_PALM:
1041		radeon_program_register_sequence(rdev,
1042						 wrestler_golden_registers,
1043						 (const u32)ARRAY_SIZE(wrestler_golden_registers));
1044		break;
1045	case CHIP_SUMO:
1046		radeon_program_register_sequence(rdev,
1047						 supersumo_golden_registers,
1048						 (const u32)ARRAY_SIZE(supersumo_golden_registers));
1049		break;
1050	case CHIP_SUMO2:
1051		radeon_program_register_sequence(rdev,
1052						 supersumo_golden_registers,
1053						 (const u32)ARRAY_SIZE(supersumo_golden_registers));
1054		radeon_program_register_sequence(rdev,
1055						 sumo_golden_registers,
1056						 (const u32)ARRAY_SIZE(sumo_golden_registers));
1057		break;
1058	case CHIP_BARTS:
1059		radeon_program_register_sequence(rdev,
1060						 barts_golden_registers,
1061						 (const u32)ARRAY_SIZE(barts_golden_registers));
1062		break;
1063	case CHIP_TURKS:
1064		radeon_program_register_sequence(rdev,
1065						 turks_golden_registers,
1066						 (const u32)ARRAY_SIZE(turks_golden_registers));
1067		break;
1068	case CHIP_CAICOS:
1069		radeon_program_register_sequence(rdev,
1070						 caicos_golden_registers,
1071						 (const u32)ARRAY_SIZE(caicos_golden_registers));
1072		break;
1073	default:
1074		break;
1075	}
1076}
1077
1078/**
1079 * evergreen_get_allowed_info_register - fetch the register for the info ioctl
1080 *
1081 * @rdev: radeon_device pointer
1082 * @reg: register offset in bytes
1083 * @val: register value
1084 *
1085 * Returns 0 for success or -EINVAL for an invalid register
1086 *
1087 */
1088int evergreen_get_allowed_info_register(struct radeon_device *rdev,
1089					u32 reg, u32 *val)
1090{
1091	switch (reg) {
1092	case GRBM_STATUS:
1093	case GRBM_STATUS_SE0:
1094	case GRBM_STATUS_SE1:
1095	case SRBM_STATUS:
1096	case SRBM_STATUS2:
1097	case DMA_STATUS_REG:
1098	case UVD_STATUS:
1099		*val = RREG32(reg);
1100		return 0;
1101	default:
1102		return -EINVAL;
1103	}
1104}
1105
1106void evergreen_tiling_fields(unsigned tiling_flags, unsigned *bankw,
1107			     unsigned *bankh, unsigned *mtaspect,
1108			     unsigned *tile_split)
1109{
1110	*bankw = (tiling_flags >> RADEON_TILING_EG_BANKW_SHIFT) & RADEON_TILING_EG_BANKW_MASK;
1111	*bankh = (tiling_flags >> RADEON_TILING_EG_BANKH_SHIFT) & RADEON_TILING_EG_BANKH_MASK;
1112	*mtaspect = (tiling_flags >> RADEON_TILING_EG_MACRO_TILE_ASPECT_SHIFT) & RADEON_TILING_EG_MACRO_TILE_ASPECT_MASK;
1113	*tile_split = (tiling_flags >> RADEON_TILING_EG_TILE_SPLIT_SHIFT) & RADEON_TILING_EG_TILE_SPLIT_MASK;
1114	switch (*bankw) {
1115	default:
1116	case 1: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_1; break;
1117	case 2: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_2; break;
1118	case 4: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_4; break;
1119	case 8: *bankw = EVERGREEN_ADDR_SURF_BANK_WIDTH_8; break;
1120	}
1121	switch (*bankh) {
1122	default:
1123	case 1: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_1; break;
1124	case 2: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_2; break;
1125	case 4: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_4; break;
1126	case 8: *bankh = EVERGREEN_ADDR_SURF_BANK_HEIGHT_8; break;
1127	}
1128	switch (*mtaspect) {
1129	default:
1130	case 1: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_1; break;
1131	case 2: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_2; break;
1132	case 4: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_4; break;
1133	case 8: *mtaspect = EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_8; break;
1134	}
1135}
1136
1137static int sumo_set_uvd_clock(struct radeon_device *rdev, u32 clock,
1138			      u32 cntl_reg, u32 status_reg)
1139{
1140	int r, i;
1141	struct atom_clock_dividers dividers;
1142
1143	r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
1144					   clock, false, &dividers);
1145	if (r)
1146		return r;
1147
1148	WREG32_P(cntl_reg, dividers.post_div, ~(DCLK_DIR_CNTL_EN|DCLK_DIVIDER_MASK));
1149
1150	for (i = 0; i < 100; i++) {
1151		if (RREG32(status_reg) & DCLK_STATUS)
1152			break;
1153		mdelay(10);
1154	}
1155	if (i == 100)
1156		return -ETIMEDOUT;
1157
1158	return 0;
1159}
1160
1161int sumo_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
1162{
1163	int r = 0;
1164	u32 cg_scratch = RREG32(CG_SCRATCH1);
1165
1166	r = sumo_set_uvd_clock(rdev, vclk, CG_VCLK_CNTL, CG_VCLK_STATUS);
1167	if (r)
1168		goto done;
1169	cg_scratch &= 0xffff0000;
1170	cg_scratch |= vclk / 100; /* Mhz */
1171
1172	r = sumo_set_uvd_clock(rdev, dclk, CG_DCLK_CNTL, CG_DCLK_STATUS);
1173	if (r)
1174		goto done;
1175	cg_scratch &= 0x0000ffff;
1176	cg_scratch |= (dclk / 100) << 16; /* Mhz */
1177
1178done:
1179	WREG32(CG_SCRATCH1, cg_scratch);
1180
1181	return r;
1182}
1183
1184int evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
1185{
1186	/* start off with something large */
1187	unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
1188	int r;
1189
1190	/* bypass vclk and dclk with bclk */
1191	WREG32_P(CG_UPLL_FUNC_CNTL_2,
1192		VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
1193		~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
1194
1195	/* put PLL in bypass mode */
1196	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
1197
1198	if (!vclk || !dclk) {
1199		/* keep the Bypass mode, put PLL to sleep */
1200		WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
1201		return 0;
1202	}
1203
1204	r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 125000, 250000,
1205					  16384, 0x03FFFFFF, 0, 128, 5,
1206					  &fb_div, &vclk_div, &dclk_div);
1207	if (r)
1208		return r;
1209
1210	/* set VCO_MODE to 1 */
1211	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK);
1212
1213	/* toggle UPLL_SLEEP to 1 then back to 0 */
1214	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
1215	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK);
1216
1217	/* deassert UPLL_RESET */
1218	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
1219
1220	mdelay(1);
1221
1222	r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
1223	if (r)
1224		return r;
1225
1226	/* assert UPLL_RESET again */
1227	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
1228
1229	/* disable spread spectrum. */
1230	WREG32_P(CG_UPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
1231
1232	/* set feedback divider */
1233	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div), ~UPLL_FB_DIV_MASK);
1234
1235	/* set ref divider to 0 */
1236	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_REF_DIV_MASK);
1237
1238	if (fb_div < 307200)
1239		WREG32_P(CG_UPLL_FUNC_CNTL_4, 0, ~UPLL_SPARE_ISPARE9);
1240	else
1241		WREG32_P(CG_UPLL_FUNC_CNTL_4, UPLL_SPARE_ISPARE9, ~UPLL_SPARE_ISPARE9);
1242
1243	/* set PDIV_A and PDIV_B */
1244	WREG32_P(CG_UPLL_FUNC_CNTL_2,
1245		UPLL_PDIV_A(vclk_div) | UPLL_PDIV_B(dclk_div),
1246		~(UPLL_PDIV_A_MASK | UPLL_PDIV_B_MASK));
1247
1248	/* give the PLL some time to settle */
1249	mdelay(15);
1250
1251	/* deassert PLL_RESET */
1252	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
1253
1254	mdelay(15);
1255
1256	/* switch from bypass mode to normal mode */
1257	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
1258
1259	r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
1260	if (r)
1261		return r;
1262
1263	/* switch VCLK and DCLK selection */
1264	WREG32_P(CG_UPLL_FUNC_CNTL_2,
1265		VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
1266		~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
1267
1268	mdelay(100);
1269
1270	return 0;
1271}
1272
1273void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev)
1274{
1275	int readrq;
1276	u16 v;
1277
1278	readrq = pcie_get_readrq(rdev->pdev);
1279	v = ffs(readrq) - 8;
1280	/* if bios or OS sets MAX_READ_REQUEST_SIZE to an invalid value, fix it
1281	 * to avoid hangs or perfomance issues
1282	 */
1283	if ((v == 0) || (v == 6) || (v == 7))
1284		pcie_set_readrq(rdev->pdev, 512);
1285}
1286
1287void dce4_program_fmt(struct drm_encoder *encoder)
1288{
1289	struct drm_device *dev = encoder->dev;
1290	struct radeon_device *rdev = dev->dev_private;
1291	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1292	struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
1293	struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
1294	int bpc = 0;
1295	u32 tmp = 0;
1296	enum radeon_connector_dither dither = RADEON_FMT_DITHER_DISABLE;
1297
1298	if (connector) {
1299		struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1300		bpc = radeon_get_monitor_bpc(connector);
1301		dither = radeon_connector->dither;
1302	}
1303
1304	/* LVDS/eDP FMT is set up by atom */
1305	if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
1306		return;
1307
1308	/* not needed for analog */
1309	if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1) ||
1310	    (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2))
1311		return;
1312
1313	if (bpc == 0)
1314		return;
1315
1316	switch (bpc) {
1317	case 6:
1318		if (dither == RADEON_FMT_DITHER_ENABLE)
1319			/* XXX sort out optimal dither settings */
1320			tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
1321				FMT_SPATIAL_DITHER_EN);
1322		else
1323			tmp |= FMT_TRUNCATE_EN;
1324		break;
1325	case 8:
1326		if (dither == RADEON_FMT_DITHER_ENABLE)
1327			/* XXX sort out optimal dither settings */
1328			tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
1329				FMT_RGB_RANDOM_ENABLE |
1330				FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH);
1331		else
1332			tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH);
1333		break;
1334	case 10:
1335	default:
1336		/* not needed */
1337		break;
1338	}
1339
1340	WREG32(FMT_BIT_DEPTH_CONTROL + radeon_crtc->crtc_offset, tmp);
1341}
1342
1343static bool dce4_is_in_vblank(struct radeon_device *rdev, int crtc)
1344{
1345	if (RREG32(EVERGREEN_CRTC_STATUS + crtc_offsets[crtc]) & EVERGREEN_CRTC_V_BLANK)
1346		return true;
1347	else
1348		return false;
1349}
1350
1351static bool dce4_is_counter_moving(struct radeon_device *rdev, int crtc)
1352{
1353	u32 pos1, pos2;
1354
1355	pos1 = RREG32(EVERGREEN_CRTC_STATUS_POSITION + crtc_offsets[crtc]);
1356	pos2 = RREG32(EVERGREEN_CRTC_STATUS_POSITION + crtc_offsets[crtc]);
1357
1358	if (pos1 != pos2)
1359		return true;
1360	else
1361		return false;
1362}
1363
1364/**
1365 * dce4_wait_for_vblank - vblank wait asic callback.
1366 *
1367 * @rdev: radeon_device pointer
1368 * @crtc: crtc to wait for vblank on
1369 *
1370 * Wait for vblank on the requested crtc (evergreen+).
1371 */
1372void dce4_wait_for_vblank(struct radeon_device *rdev, int crtc)
1373{
1374	unsigned i = 0;
1375
1376	if (crtc >= rdev->num_crtc)
1377		return;
1378
1379	if (!(RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[crtc]) & EVERGREEN_CRTC_MASTER_EN))
1380		return;
1381
1382	/* depending on when we hit vblank, we may be close to active; if so,
1383	 * wait for another frame.
1384	 */
1385	while (dce4_is_in_vblank(rdev, crtc)) {
1386		if (i++ % 100 == 0) {
1387			if (!dce4_is_counter_moving(rdev, crtc))
1388				break;
1389		}
1390	}
1391
1392	while (!dce4_is_in_vblank(rdev, crtc)) {
1393		if (i++ % 100 == 0) {
1394			if (!dce4_is_counter_moving(rdev, crtc))
1395				break;
1396		}
1397	}
1398}
1399
1400/**
1401 * evergreen_page_flip - pageflip callback.
1402 *
1403 * @rdev: radeon_device pointer
1404 * @crtc_id: crtc to cleanup pageflip on
1405 * @crtc_base: new address of the crtc (GPU MC address)
 
1406 *
1407 * Triggers the actual pageflip by updating the primary
1408 * surface base address (evergreen+).
1409 */
1410void evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
 
1411{
1412	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
 
1413
 
 
 
 
 
 
1414	/* update the scanout addresses */
1415	WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset,
1416	       upper_32_bits(crtc_base));
1417	WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
1418	       (u32)crtc_base);
1419	/* post the write */
1420	RREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset);
1421}
1422
1423/**
1424 * evergreen_page_flip_pending - check if page flip is still pending
1425 *
1426 * @rdev: radeon_device pointer
1427 * @crtc_id: crtc to check
1428 *
1429 * Returns the current update pending status.
1430 */
1431bool evergreen_page_flip_pending(struct radeon_device *rdev, int crtc_id)
1432{
1433	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
1434
1435	/* Return current update_pending status: */
1436	return !!(RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) &
1437		EVERGREEN_GRPH_SURFACE_UPDATE_PENDING);
1438}
1439
1440/* get temperature in millidegrees */
1441int evergreen_get_temp(struct radeon_device *rdev)
1442{
1443	u32 temp, toffset;
1444	int actual_temp = 0;
1445
1446	if (rdev->family == CHIP_JUNIPER) {
1447		toffset = (RREG32(CG_THERMAL_CTRL) & TOFFSET_MASK) >>
1448			TOFFSET_SHIFT;
1449		temp = (RREG32(CG_TS0_STATUS) & TS0_ADC_DOUT_MASK) >>
1450			TS0_ADC_DOUT_SHIFT;
1451
1452		if (toffset & 0x100)
1453			actual_temp = temp / 2 - (0x200 - toffset);
1454		else
1455			actual_temp = temp / 2 + toffset;
1456
1457		actual_temp = actual_temp * 1000;
1458
1459	} else {
1460		temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
1461			ASIC_T_SHIFT;
1462
1463		if (temp & 0x400)
1464			actual_temp = -256;
1465		else if (temp & 0x200)
1466			actual_temp = 255;
1467		else if (temp & 0x100) {
1468			actual_temp = temp & 0x1ff;
1469			actual_temp |= ~0x1ff;
1470		} else
1471			actual_temp = temp & 0xff;
1472
1473		actual_temp = (actual_temp * 1000) / 2;
1474	}
1475
1476	return actual_temp;
1477}
1478
1479int sumo_get_temp(struct radeon_device *rdev)
1480{
1481	u32 temp = RREG32(CG_THERMAL_STATUS) & 0xff;
1482	int actual_temp = temp - 49;
1483
1484	return actual_temp * 1000;
1485}
1486
1487/**
1488 * sumo_pm_init_profile - Initialize power profiles callback.
1489 *
1490 * @rdev: radeon_device pointer
1491 *
1492 * Initialize the power states used in profile mode
1493 * (sumo, trinity, SI).
1494 * Used for profile mode only.
1495 */
1496void sumo_pm_init_profile(struct radeon_device *rdev)
1497{
1498	int idx;
1499
1500	/* default */
1501	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
1502	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
1503	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
1504	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0;
1505
1506	/* low,mid sh/mh */
1507	if (rdev->flags & RADEON_IS_MOBILITY)
1508		idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_BATTERY, 0);
1509	else
1510		idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0);
1511
1512	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = idx;
1513	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = idx;
1514	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
1515	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
1516
1517	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = idx;
1518	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = idx;
1519	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
1520	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
1521
1522	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = idx;
1523	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = idx;
1524	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;
1525	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 0;
1526
1527	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = idx;
1528	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = idx;
1529	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;
1530	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0;
1531
1532	/* high sh/mh */
1533	idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0);
1534	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = idx;
1535	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = idx;
1536	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
1537	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx =
1538		rdev->pm.power_state[idx].num_clock_modes - 1;
1539
1540	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = idx;
1541	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = idx;
1542	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
1543	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx =
1544		rdev->pm.power_state[idx].num_clock_modes - 1;
1545}
1546
1547/**
1548 * btc_pm_init_profile - Initialize power profiles callback.
1549 *
1550 * @rdev: radeon_device pointer
1551 *
1552 * Initialize the power states used in profile mode
1553 * (BTC, cayman).
1554 * Used for profile mode only.
1555 */
1556void btc_pm_init_profile(struct radeon_device *rdev)
1557{
1558	int idx;
1559
1560	/* default */
1561	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
1562	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
1563	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
1564	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 2;
1565	/* starting with BTC, there is one state that is used for both
1566	 * MH and SH.  Difference is that we always use the high clock index for
1567	 * mclk.
1568	 */
1569	if (rdev->flags & RADEON_IS_MOBILITY)
1570		idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_BATTERY, 0);
1571	else
1572		idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0);
1573	/* low sh */
1574	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = idx;
1575	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = idx;
1576	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
1577	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
1578	/* mid sh */
1579	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = idx;
1580	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = idx;
1581	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;
1582	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 1;
1583	/* high sh */
1584	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = idx;
1585	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = idx;
1586	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
1587	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 2;
1588	/* low mh */
1589	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = idx;
1590	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = idx;
1591	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
1592	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
1593	/* mid mh */
1594	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = idx;
1595	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = idx;
1596	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;
1597	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 1;
1598	/* high mh */
1599	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = idx;
1600	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = idx;
1601	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
1602	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 2;
1603}
1604
1605/**
1606 * evergreen_pm_misc - set additional pm hw parameters callback.
1607 *
1608 * @rdev: radeon_device pointer
1609 *
1610 * Set non-clock parameters associated with a power state
1611 * (voltage, etc.) (evergreen+).
1612 */
1613void evergreen_pm_misc(struct radeon_device *rdev)
1614{
1615	int req_ps_idx = rdev->pm.requested_power_state_index;
1616	int req_cm_idx = rdev->pm.requested_clock_mode_index;
1617	struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
1618	struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
1619
1620	if (voltage->type == VOLTAGE_SW) {
1621		/* 0xff0x are flags rather then an actual voltage */
1622		if ((voltage->voltage & 0xff00) == 0xff00)
1623			return;
1624		if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) {
1625			radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
1626			rdev->pm.current_vddc = voltage->voltage;
1627			DRM_DEBUG("Setting: vddc: %d\n", voltage->voltage);
1628		}
1629
1630		/* starting with BTC, there is one state that is used for both
1631		 * MH and SH.  Difference is that we always use the high clock index for
1632		 * mclk and vddci.
1633		 */
1634		if ((rdev->pm.pm_method == PM_METHOD_PROFILE) &&
1635		    (rdev->family >= CHIP_BARTS) &&
1636		    rdev->pm.active_crtc_count &&
1637		    ((rdev->pm.profile_index == PM_PROFILE_MID_MH_IDX) ||
1638		     (rdev->pm.profile_index == PM_PROFILE_LOW_MH_IDX)))
1639			voltage = &rdev->pm.power_state[req_ps_idx].
1640				clock_info[rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx].voltage;
1641
1642		/* 0xff0x are flags rather then an actual voltage */
1643		if ((voltage->vddci & 0xff00) == 0xff00)
1644			return;
1645		if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) {
1646			radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI);
1647			rdev->pm.current_vddci = voltage->vddci;
1648			DRM_DEBUG("Setting: vddci: %d\n", voltage->vddci);
1649		}
1650	}
1651}
1652
1653/**
1654 * evergreen_pm_prepare - pre-power state change callback.
1655 *
1656 * @rdev: radeon_device pointer
1657 *
1658 * Prepare for a power state change (evergreen+).
1659 */
1660void evergreen_pm_prepare(struct radeon_device *rdev)
1661{
1662	struct drm_device *ddev = rdev->ddev;
1663	struct drm_crtc *crtc;
1664	struct radeon_crtc *radeon_crtc;
1665	u32 tmp;
1666
1667	/* disable any active CRTCs */
1668	list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) {
1669		radeon_crtc = to_radeon_crtc(crtc);
1670		if (radeon_crtc->enabled) {
1671			tmp = RREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset);
1672			tmp |= EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
1673			WREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset, tmp);
1674		}
1675	}
1676}
1677
1678/**
1679 * evergreen_pm_finish - post-power state change callback.
1680 *
1681 * @rdev: radeon_device pointer
1682 *
1683 * Clean up after a power state change (evergreen+).
1684 */
1685void evergreen_pm_finish(struct radeon_device *rdev)
1686{
1687	struct drm_device *ddev = rdev->ddev;
1688	struct drm_crtc *crtc;
1689	struct radeon_crtc *radeon_crtc;
1690	u32 tmp;
1691
1692	/* enable any active CRTCs */
1693	list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) {
1694		radeon_crtc = to_radeon_crtc(crtc);
1695		if (radeon_crtc->enabled) {
1696			tmp = RREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset);
1697			tmp &= ~EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
1698			WREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset, tmp);
1699		}
1700	}
1701}
1702
1703/**
1704 * evergreen_hpd_sense - hpd sense callback.
1705 *
1706 * @rdev: radeon_device pointer
1707 * @hpd: hpd (hotplug detect) pin
1708 *
1709 * Checks if a digital monitor is connected (evergreen+).
1710 * Returns true if connected, false if not connected.
1711 */
1712bool evergreen_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd)
1713{
1714	bool connected = false;
1715
1716	switch (hpd) {
1717	case RADEON_HPD_1:
1718		if (RREG32(DC_HPD1_INT_STATUS) & DC_HPDx_SENSE)
1719			connected = true;
1720		break;
1721	case RADEON_HPD_2:
1722		if (RREG32(DC_HPD2_INT_STATUS) & DC_HPDx_SENSE)
1723			connected = true;
1724		break;
1725	case RADEON_HPD_3:
1726		if (RREG32(DC_HPD3_INT_STATUS) & DC_HPDx_SENSE)
1727			connected = true;
1728		break;
1729	case RADEON_HPD_4:
1730		if (RREG32(DC_HPD4_INT_STATUS) & DC_HPDx_SENSE)
1731			connected = true;
1732		break;
1733	case RADEON_HPD_5:
1734		if (RREG32(DC_HPD5_INT_STATUS) & DC_HPDx_SENSE)
1735			connected = true;
1736		break;
1737	case RADEON_HPD_6:
1738		if (RREG32(DC_HPD6_INT_STATUS) & DC_HPDx_SENSE)
1739			connected = true;
1740		break;
1741	default:
1742		break;
1743	}
1744
1745	return connected;
1746}
1747
1748/**
1749 * evergreen_hpd_set_polarity - hpd set polarity callback.
1750 *
1751 * @rdev: radeon_device pointer
1752 * @hpd: hpd (hotplug detect) pin
1753 *
1754 * Set the polarity of the hpd pin (evergreen+).
1755 */
1756void evergreen_hpd_set_polarity(struct radeon_device *rdev,
1757				enum radeon_hpd_id hpd)
1758{
1759	u32 tmp;
1760	bool connected = evergreen_hpd_sense(rdev, hpd);
1761
1762	switch (hpd) {
1763	case RADEON_HPD_1:
1764		tmp = RREG32(DC_HPD1_INT_CONTROL);
1765		if (connected)
1766			tmp &= ~DC_HPDx_INT_POLARITY;
1767		else
1768			tmp |= DC_HPDx_INT_POLARITY;
1769		WREG32(DC_HPD1_INT_CONTROL, tmp);
1770		break;
1771	case RADEON_HPD_2:
1772		tmp = RREG32(DC_HPD2_INT_CONTROL);
1773		if (connected)
1774			tmp &= ~DC_HPDx_INT_POLARITY;
1775		else
1776			tmp |= DC_HPDx_INT_POLARITY;
1777		WREG32(DC_HPD2_INT_CONTROL, tmp);
1778		break;
1779	case RADEON_HPD_3:
1780		tmp = RREG32(DC_HPD3_INT_CONTROL);
1781		if (connected)
1782			tmp &= ~DC_HPDx_INT_POLARITY;
1783		else
1784			tmp |= DC_HPDx_INT_POLARITY;
1785		WREG32(DC_HPD3_INT_CONTROL, tmp);
1786		break;
1787	case RADEON_HPD_4:
1788		tmp = RREG32(DC_HPD4_INT_CONTROL);
1789		if (connected)
1790			tmp &= ~DC_HPDx_INT_POLARITY;
1791		else
1792			tmp |= DC_HPDx_INT_POLARITY;
1793		WREG32(DC_HPD4_INT_CONTROL, tmp);
1794		break;
1795	case RADEON_HPD_5:
1796		tmp = RREG32(DC_HPD5_INT_CONTROL);
1797		if (connected)
1798			tmp &= ~DC_HPDx_INT_POLARITY;
1799		else
1800			tmp |= DC_HPDx_INT_POLARITY;
1801		WREG32(DC_HPD5_INT_CONTROL, tmp);
1802			break;
1803	case RADEON_HPD_6:
1804		tmp = RREG32(DC_HPD6_INT_CONTROL);
1805		if (connected)
1806			tmp &= ~DC_HPDx_INT_POLARITY;
1807		else
1808			tmp |= DC_HPDx_INT_POLARITY;
1809		WREG32(DC_HPD6_INT_CONTROL, tmp);
1810		break;
1811	default:
1812		break;
1813	}
1814}
1815
1816/**
1817 * evergreen_hpd_init - hpd setup callback.
1818 *
1819 * @rdev: radeon_device pointer
1820 *
1821 * Setup the hpd pins used by the card (evergreen+).
1822 * Enable the pin, set the polarity, and enable the hpd interrupts.
1823 */
1824void evergreen_hpd_init(struct radeon_device *rdev)
1825{
1826	struct drm_device *dev = rdev->ddev;
1827	struct drm_connector *connector;
1828	unsigned enabled = 0;
1829	u32 tmp = DC_HPDx_CONNECTION_TIMER(0x9c4) |
1830		DC_HPDx_RX_INT_TIMER(0xfa) | DC_HPDx_EN;
1831
1832	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1833		struct radeon_connector *radeon_connector = to_radeon_connector(connector);
 
1834
1835		if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
1836		    connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
1837			/* don't try to enable hpd on eDP or LVDS avoid breaking the
1838			 * aux dp channel on imac and help (but not completely fix)
1839			 * https://bugzilla.redhat.com/show_bug.cgi?id=726143
1840			 * also avoid interrupt storms during dpms.
1841			 */
1842			continue;
1843		}
1844		switch (radeon_connector->hpd.hpd) {
1845		case RADEON_HPD_1:
1846			WREG32(DC_HPD1_CONTROL, tmp);
1847			break;
1848		case RADEON_HPD_2:
1849			WREG32(DC_HPD2_CONTROL, tmp);
1850			break;
1851		case RADEON_HPD_3:
1852			WREG32(DC_HPD3_CONTROL, tmp);
1853			break;
1854		case RADEON_HPD_4:
1855			WREG32(DC_HPD4_CONTROL, tmp);
1856			break;
1857		case RADEON_HPD_5:
1858			WREG32(DC_HPD5_CONTROL, tmp);
1859			break;
1860		case RADEON_HPD_6:
1861			WREG32(DC_HPD6_CONTROL, tmp);
1862			break;
1863		default:
1864			break;
1865		}
1866		radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);
1867		enabled |= 1 << radeon_connector->hpd.hpd;
1868	}
1869	radeon_irq_kms_enable_hpd(rdev, enabled);
1870}
1871
1872/**
1873 * evergreen_hpd_fini - hpd tear down callback.
1874 *
1875 * @rdev: radeon_device pointer
1876 *
1877 * Tear down the hpd pins used by the card (evergreen+).
1878 * Disable the hpd interrupts.
1879 */
1880void evergreen_hpd_fini(struct radeon_device *rdev)
1881{
1882	struct drm_device *dev = rdev->ddev;
1883	struct drm_connector *connector;
1884	unsigned disabled = 0;
1885
1886	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1887		struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1888		switch (radeon_connector->hpd.hpd) {
1889		case RADEON_HPD_1:
1890			WREG32(DC_HPD1_CONTROL, 0);
1891			break;
1892		case RADEON_HPD_2:
1893			WREG32(DC_HPD2_CONTROL, 0);
1894			break;
1895		case RADEON_HPD_3:
1896			WREG32(DC_HPD3_CONTROL, 0);
1897			break;
1898		case RADEON_HPD_4:
1899			WREG32(DC_HPD4_CONTROL, 0);
1900			break;
1901		case RADEON_HPD_5:
1902			WREG32(DC_HPD5_CONTROL, 0);
1903			break;
1904		case RADEON_HPD_6:
1905			WREG32(DC_HPD6_CONTROL, 0);
1906			break;
1907		default:
1908			break;
1909		}
1910		disabled |= 1 << radeon_connector->hpd.hpd;
1911	}
1912	radeon_irq_kms_disable_hpd(rdev, disabled);
1913}
1914
1915/* watermark setup */
1916
1917static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev,
1918					struct radeon_crtc *radeon_crtc,
1919					struct drm_display_mode *mode,
1920					struct drm_display_mode *other_mode)
1921{
1922	u32 tmp, buffer_alloc, i;
1923	u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
1924	/*
1925	 * Line Buffer Setup
1926	 * There are 3 line buffers, each one shared by 2 display controllers.
1927	 * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between
1928	 * the display controllers.  The paritioning is done via one of four
1929	 * preset allocations specified in bits 2:0:
1930	 * first display controller
1931	 *  0 - first half of lb (3840 * 2)
1932	 *  1 - first 3/4 of lb (5760 * 2)
1933	 *  2 - whole lb (7680 * 2), other crtc must be disabled
1934	 *  3 - first 1/4 of lb (1920 * 2)
1935	 * second display controller
1936	 *  4 - second half of lb (3840 * 2)
1937	 *  5 - second 3/4 of lb (5760 * 2)
1938	 *  6 - whole lb (7680 * 2), other crtc must be disabled
1939	 *  7 - last 1/4 of lb (1920 * 2)
1940	 */
1941	/* this can get tricky if we have two large displays on a paired group
1942	 * of crtcs.  Ideally for multiple large displays we'd assign them to
1943	 * non-linked crtcs for maximum line buffer allocation.
1944	 */
1945	if (radeon_crtc->base.enabled && mode) {
1946		if (other_mode) {
1947			tmp = 0; /* 1/2 */
1948			buffer_alloc = 1;
1949		} else {
1950			tmp = 2; /* whole */
1951			buffer_alloc = 2;
1952		}
1953	} else {
1954		tmp = 0;
1955		buffer_alloc = 0;
1956	}
1957
1958	/* second controller of the pair uses second half of the lb */
1959	if (radeon_crtc->crtc_id % 2)
1960		tmp += 4;
1961	WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp);
1962
1963	if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) {
1964		WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
1965		       DMIF_BUFFERS_ALLOCATED(buffer_alloc));
1966		for (i = 0; i < rdev->usec_timeout; i++) {
1967			if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
1968			    DMIF_BUFFERS_ALLOCATED_COMPLETED)
1969				break;
1970			udelay(1);
1971		}
1972	}
1973
1974	if (radeon_crtc->base.enabled && mode) {
1975		switch (tmp) {
1976		case 0:
1977		case 4:
1978		default:
1979			if (ASIC_IS_DCE5(rdev))
1980				return 4096 * 2;
1981			else
1982				return 3840 * 2;
1983		case 1:
1984		case 5:
1985			if (ASIC_IS_DCE5(rdev))
1986				return 6144 * 2;
1987			else
1988				return 5760 * 2;
1989		case 2:
1990		case 6:
1991			if (ASIC_IS_DCE5(rdev))
1992				return 8192 * 2;
1993			else
1994				return 7680 * 2;
1995		case 3:
1996		case 7:
1997			if (ASIC_IS_DCE5(rdev))
1998				return 2048 * 2;
1999			else
2000				return 1920 * 2;
2001		}
2002	}
2003
2004	/* controller not enabled, so no lb used */
2005	return 0;
2006}
2007
2008u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev)
2009{
2010	u32 tmp = RREG32(MC_SHARED_CHMAP);
2011
2012	switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
2013	case 0:
2014	default:
2015		return 1;
2016	case 1:
2017		return 2;
2018	case 2:
2019		return 4;
2020	case 3:
2021		return 8;
2022	}
2023}
2024
2025struct evergreen_wm_params {
2026	u32 dram_channels; /* number of dram channels */
2027	u32 yclk;          /* bandwidth per dram data pin in kHz */
2028	u32 sclk;          /* engine clock in kHz */
2029	u32 disp_clk;      /* display clock in kHz */
2030	u32 src_width;     /* viewport width */
2031	u32 active_time;   /* active display time in ns */
2032	u32 blank_time;    /* blank time in ns */
2033	bool interlaced;    /* mode is interlaced */
2034	fixed20_12 vsc;    /* vertical scale ratio */
2035	u32 num_heads;     /* number of active crtcs */
2036	u32 bytes_per_pixel; /* bytes per pixel display + overlay */
2037	u32 lb_size;       /* line buffer allocated to pipe */
2038	u32 vtaps;         /* vertical scaler taps */
2039};
2040
2041static u32 evergreen_dram_bandwidth(struct evergreen_wm_params *wm)
2042{
2043	/* Calculate DRAM Bandwidth and the part allocated to display. */
2044	fixed20_12 dram_efficiency; /* 0.7 */
2045	fixed20_12 yclk, dram_channels, bandwidth;
2046	fixed20_12 a;
2047
2048	a.full = dfixed_const(1000);
2049	yclk.full = dfixed_const(wm->yclk);
2050	yclk.full = dfixed_div(yclk, a);
2051	dram_channels.full = dfixed_const(wm->dram_channels * 4);
2052	a.full = dfixed_const(10);
2053	dram_efficiency.full = dfixed_const(7);
2054	dram_efficiency.full = dfixed_div(dram_efficiency, a);
2055	bandwidth.full = dfixed_mul(dram_channels, yclk);
2056	bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
2057
2058	return dfixed_trunc(bandwidth);
2059}
2060
2061static u32 evergreen_dram_bandwidth_for_display(struct evergreen_wm_params *wm)
2062{
2063	/* Calculate DRAM Bandwidth and the part allocated to display. */
2064	fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
2065	fixed20_12 yclk, dram_channels, bandwidth;
2066	fixed20_12 a;
2067
2068	a.full = dfixed_const(1000);
2069	yclk.full = dfixed_const(wm->yclk);
2070	yclk.full = dfixed_div(yclk, a);
2071	dram_channels.full = dfixed_const(wm->dram_channels * 4);
2072	a.full = dfixed_const(10);
2073	disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
2074	disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
2075	bandwidth.full = dfixed_mul(dram_channels, yclk);
2076	bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
2077
2078	return dfixed_trunc(bandwidth);
2079}
2080
2081static u32 evergreen_data_return_bandwidth(struct evergreen_wm_params *wm)
2082{
2083	/* Calculate the display Data return Bandwidth */
2084	fixed20_12 return_efficiency; /* 0.8 */
2085	fixed20_12 sclk, bandwidth;
2086	fixed20_12 a;
2087
2088	a.full = dfixed_const(1000);
2089	sclk.full = dfixed_const(wm->sclk);
2090	sclk.full = dfixed_div(sclk, a);
2091	a.full = dfixed_const(10);
2092	return_efficiency.full = dfixed_const(8);
2093	return_efficiency.full = dfixed_div(return_efficiency, a);
2094	a.full = dfixed_const(32);
2095	bandwidth.full = dfixed_mul(a, sclk);
2096	bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
2097
2098	return dfixed_trunc(bandwidth);
2099}
2100
2101static u32 evergreen_dmif_request_bandwidth(struct evergreen_wm_params *wm)
2102{
2103	/* Calculate the DMIF Request Bandwidth */
2104	fixed20_12 disp_clk_request_efficiency; /* 0.8 */
2105	fixed20_12 disp_clk, bandwidth;
2106	fixed20_12 a;
2107
2108	a.full = dfixed_const(1000);
2109	disp_clk.full = dfixed_const(wm->disp_clk);
2110	disp_clk.full = dfixed_div(disp_clk, a);
2111	a.full = dfixed_const(10);
2112	disp_clk_request_efficiency.full = dfixed_const(8);
2113	disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
2114	a.full = dfixed_const(32);
2115	bandwidth.full = dfixed_mul(a, disp_clk);
2116	bandwidth.full = dfixed_mul(bandwidth, disp_clk_request_efficiency);
2117
2118	return dfixed_trunc(bandwidth);
2119}
2120
2121static u32 evergreen_available_bandwidth(struct evergreen_wm_params *wm)
2122{
2123	/* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
2124	u32 dram_bandwidth = evergreen_dram_bandwidth(wm);
2125	u32 data_return_bandwidth = evergreen_data_return_bandwidth(wm);
2126	u32 dmif_req_bandwidth = evergreen_dmif_request_bandwidth(wm);
2127
2128	return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
2129}
2130
2131static u32 evergreen_average_bandwidth(struct evergreen_wm_params *wm)
2132{
2133	/* Calculate the display mode Average Bandwidth
2134	 * DisplayMode should contain the source and destination dimensions,
2135	 * timing, etc.
2136	 */
2137	fixed20_12 bpp;
2138	fixed20_12 line_time;
2139	fixed20_12 src_width;
2140	fixed20_12 bandwidth;
2141	fixed20_12 a;
2142
2143	a.full = dfixed_const(1000);
2144	line_time.full = dfixed_const(wm->active_time + wm->blank_time);
2145	line_time.full = dfixed_div(line_time, a);
2146	bpp.full = dfixed_const(wm->bytes_per_pixel);
2147	src_width.full = dfixed_const(wm->src_width);
2148	bandwidth.full = dfixed_mul(src_width, bpp);
2149	bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
2150	bandwidth.full = dfixed_div(bandwidth, line_time);
2151
2152	return dfixed_trunc(bandwidth);
2153}
2154
2155static u32 evergreen_latency_watermark(struct evergreen_wm_params *wm)
2156{
2157	/* First calcualte the latency in ns */
2158	u32 mc_latency = 2000; /* 2000 ns. */
2159	u32 available_bandwidth = evergreen_available_bandwidth(wm);
2160	u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
2161	u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
2162	u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
2163	u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
2164		(wm->num_heads * cursor_line_pair_return_time);
2165	u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
2166	u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
2167	fixed20_12 a, b, c;
2168
2169	if (wm->num_heads == 0)
2170		return 0;
2171
2172	a.full = dfixed_const(2);
2173	b.full = dfixed_const(1);
2174	if ((wm->vsc.full > a.full) ||
2175	    ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
2176	    (wm->vtaps >= 5) ||
2177	    ((wm->vsc.full >= a.full) && wm->interlaced))
2178		max_src_lines_per_dst_line = 4;
2179	else
2180		max_src_lines_per_dst_line = 2;
2181
2182	a.full = dfixed_const(available_bandwidth);
2183	b.full = dfixed_const(wm->num_heads);
2184	a.full = dfixed_div(a, b);
2185
2186	b.full = dfixed_const(1000);
2187	c.full = dfixed_const(wm->disp_clk);
2188	b.full = dfixed_div(c, b);
2189	c.full = dfixed_const(wm->bytes_per_pixel);
2190	b.full = dfixed_mul(b, c);
2191
2192	lb_fill_bw = min(dfixed_trunc(a), dfixed_trunc(b));
2193
2194	a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
2195	b.full = dfixed_const(1000);
2196	c.full = dfixed_const(lb_fill_bw);
2197	b.full = dfixed_div(c, b);
2198	a.full = dfixed_div(a, b);
2199	line_fill_time = dfixed_trunc(a);
2200
2201	if (line_fill_time < wm->active_time)
2202		return latency;
2203	else
2204		return latency + (line_fill_time - wm->active_time);
2205
2206}
2207
2208static bool evergreen_average_bandwidth_vs_dram_bandwidth_for_display(struct evergreen_wm_params *wm)
2209{
2210	if (evergreen_average_bandwidth(wm) <=
2211	    (evergreen_dram_bandwidth_for_display(wm) / wm->num_heads))
2212		return true;
2213	else
2214		return false;
2215};
2216
2217static bool evergreen_average_bandwidth_vs_available_bandwidth(struct evergreen_wm_params *wm)
2218{
2219	if (evergreen_average_bandwidth(wm) <=
2220	    (evergreen_available_bandwidth(wm) / wm->num_heads))
2221		return true;
2222	else
2223		return false;
2224};
2225
2226static bool evergreen_check_latency_hiding(struct evergreen_wm_params *wm)
2227{
2228	u32 lb_partitions = wm->lb_size / wm->src_width;
2229	u32 line_time = wm->active_time + wm->blank_time;
2230	u32 latency_tolerant_lines;
2231	u32 latency_hiding;
2232	fixed20_12 a;
2233
2234	a.full = dfixed_const(1);
2235	if (wm->vsc.full > a.full)
2236		latency_tolerant_lines = 1;
2237	else {
2238		if (lb_partitions <= (wm->vtaps + 1))
2239			latency_tolerant_lines = 1;
2240		else
2241			latency_tolerant_lines = 2;
2242	}
2243
2244	latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
2245
2246	if (evergreen_latency_watermark(wm) <= latency_hiding)
2247		return true;
2248	else
2249		return false;
2250}
2251
2252static void evergreen_program_watermarks(struct radeon_device *rdev,
2253					 struct radeon_crtc *radeon_crtc,
2254					 u32 lb_size, u32 num_heads)
2255{
2256	struct drm_display_mode *mode = &radeon_crtc->base.mode;
2257	struct evergreen_wm_params wm_low, wm_high;
2258	u32 dram_channels;
2259	u32 pixel_period;
2260	u32 line_time = 0;
2261	u32 latency_watermark_a = 0, latency_watermark_b = 0;
2262	u32 priority_a_mark = 0, priority_b_mark = 0;
2263	u32 priority_a_cnt = PRIORITY_OFF;
2264	u32 priority_b_cnt = PRIORITY_OFF;
2265	u32 pipe_offset = radeon_crtc->crtc_id * 16;
2266	u32 tmp, arb_control3;
2267	fixed20_12 a, b, c;
2268
2269	if (radeon_crtc->base.enabled && num_heads && mode) {
2270		pixel_period = 1000000 / (u32)mode->clock;
2271		line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
 
 
 
2272		priority_a_cnt = 0;
2273		priority_b_cnt = 0;
2274		dram_channels = evergreen_get_number_of_dram_channels(rdev);
2275
2276		/* watermark for high clocks */
2277		if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
2278			wm_high.yclk =
2279				radeon_dpm_get_mclk(rdev, false) * 10;
2280			wm_high.sclk =
2281				radeon_dpm_get_sclk(rdev, false) * 10;
2282		} else {
2283			wm_high.yclk = rdev->pm.current_mclk * 10;
2284			wm_high.sclk = rdev->pm.current_sclk * 10;
2285		}
2286
2287		wm_high.disp_clk = mode->clock;
2288		wm_high.src_width = mode->crtc_hdisplay;
2289		wm_high.active_time = mode->crtc_hdisplay * pixel_period;
2290		wm_high.blank_time = line_time - wm_high.active_time;
2291		wm_high.interlaced = false;
2292		if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2293			wm_high.interlaced = true;
2294		wm_high.vsc = radeon_crtc->vsc;
2295		wm_high.vtaps = 1;
2296		if (radeon_crtc->rmx_type != RMX_OFF)
2297			wm_high.vtaps = 2;
2298		wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
2299		wm_high.lb_size = lb_size;
2300		wm_high.dram_channels = dram_channels;
2301		wm_high.num_heads = num_heads;
2302
2303		/* watermark for low clocks */
2304		if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
2305			wm_low.yclk =
2306				radeon_dpm_get_mclk(rdev, true) * 10;
2307			wm_low.sclk =
2308				radeon_dpm_get_sclk(rdev, true) * 10;
2309		} else {
2310			wm_low.yclk = rdev->pm.current_mclk * 10;
2311			wm_low.sclk = rdev->pm.current_sclk * 10;
2312		}
2313
2314		wm_low.disp_clk = mode->clock;
2315		wm_low.src_width = mode->crtc_hdisplay;
2316		wm_low.active_time = mode->crtc_hdisplay * pixel_period;
2317		wm_low.blank_time = line_time - wm_low.active_time;
2318		wm_low.interlaced = false;
2319		if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2320			wm_low.interlaced = true;
2321		wm_low.vsc = radeon_crtc->vsc;
2322		wm_low.vtaps = 1;
2323		if (radeon_crtc->rmx_type != RMX_OFF)
2324			wm_low.vtaps = 2;
2325		wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
2326		wm_low.lb_size = lb_size;
2327		wm_low.dram_channels = dram_channels;
2328		wm_low.num_heads = num_heads;
2329
2330		/* set for high clocks */
2331		latency_watermark_a = min(evergreen_latency_watermark(&wm_high), (u32)65535);
2332		/* set for low clocks */
2333		latency_watermark_b = min(evergreen_latency_watermark(&wm_low), (u32)65535);
2334
2335		/* possibly force display priority to high */
2336		/* should really do this at mode validation time... */
2337		if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
2338		    !evergreen_average_bandwidth_vs_available_bandwidth(&wm_high) ||
2339		    !evergreen_check_latency_hiding(&wm_high) ||
2340		    (rdev->disp_priority == 2)) {
2341			DRM_DEBUG_KMS("force priority a to high\n");
2342			priority_a_cnt |= PRIORITY_ALWAYS_ON;
2343		}
2344		if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
2345		    !evergreen_average_bandwidth_vs_available_bandwidth(&wm_low) ||
2346		    !evergreen_check_latency_hiding(&wm_low) ||
2347		    (rdev->disp_priority == 2)) {
2348			DRM_DEBUG_KMS("force priority b to high\n");
2349			priority_b_cnt |= PRIORITY_ALWAYS_ON;
2350		}
2351
2352		a.full = dfixed_const(1000);
2353		b.full = dfixed_const(mode->clock);
2354		b.full = dfixed_div(b, a);
2355		c.full = dfixed_const(latency_watermark_a);
2356		c.full = dfixed_mul(c, b);
2357		c.full = dfixed_mul(c, radeon_crtc->hsc);
2358		c.full = dfixed_div(c, a);
2359		a.full = dfixed_const(16);
2360		c.full = dfixed_div(c, a);
2361		priority_a_mark = dfixed_trunc(c);
2362		priority_a_cnt |= priority_a_mark & PRIORITY_MARK_MASK;
2363
2364		a.full = dfixed_const(1000);
2365		b.full = dfixed_const(mode->clock);
2366		b.full = dfixed_div(b, a);
2367		c.full = dfixed_const(latency_watermark_b);
2368		c.full = dfixed_mul(c, b);
2369		c.full = dfixed_mul(c, radeon_crtc->hsc);
2370		c.full = dfixed_div(c, a);
2371		a.full = dfixed_const(16);
2372		c.full = dfixed_div(c, a);
2373		priority_b_mark = dfixed_trunc(c);
2374		priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK;
2375
2376		/* Save number of lines the linebuffer leads before the scanout */
2377		radeon_crtc->lb_vblank_lead_lines = DIV_ROUND_UP(lb_size, mode->crtc_hdisplay);
2378	}
2379
2380	/* select wm A */
2381	arb_control3 = RREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset);
2382	tmp = arb_control3;
2383	tmp &= ~LATENCY_WATERMARK_MASK(3);
2384	tmp |= LATENCY_WATERMARK_MASK(1);
2385	WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, tmp);
2386	WREG32(PIPE0_LATENCY_CONTROL + pipe_offset,
2387	       (LATENCY_LOW_WATERMARK(latency_watermark_a) |
2388		LATENCY_HIGH_WATERMARK(line_time)));
2389	/* select wm B */
2390	tmp = RREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset);
2391	tmp &= ~LATENCY_WATERMARK_MASK(3);
2392	tmp |= LATENCY_WATERMARK_MASK(2);
2393	WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, tmp);
2394	WREG32(PIPE0_LATENCY_CONTROL + pipe_offset,
2395	       (LATENCY_LOW_WATERMARK(latency_watermark_b) |
2396		LATENCY_HIGH_WATERMARK(line_time)));
2397	/* restore original selection */
2398	WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, arb_control3);
2399
2400	/* write the priority marks */
2401	WREG32(PRIORITY_A_CNT + radeon_crtc->crtc_offset, priority_a_cnt);
2402	WREG32(PRIORITY_B_CNT + radeon_crtc->crtc_offset, priority_b_cnt);
2403
2404	/* save values for DPM */
2405	radeon_crtc->line_time = line_time;
2406	radeon_crtc->wm_high = latency_watermark_a;
2407	radeon_crtc->wm_low = latency_watermark_b;
2408}
2409
2410/**
2411 * evergreen_bandwidth_update - update display watermarks callback.
2412 *
2413 * @rdev: radeon_device pointer
2414 *
2415 * Update the display watermarks based on the requested mode(s)
2416 * (evergreen+).
2417 */
2418void evergreen_bandwidth_update(struct radeon_device *rdev)
2419{
2420	struct drm_display_mode *mode0 = NULL;
2421	struct drm_display_mode *mode1 = NULL;
2422	u32 num_heads = 0, lb_size;
2423	int i;
2424
2425	if (!rdev->mode_info.mode_config_initialized)
2426		return;
2427
2428	radeon_update_display_priority(rdev);
2429
2430	for (i = 0; i < rdev->num_crtc; i++) {
2431		if (rdev->mode_info.crtcs[i]->base.enabled)
2432			num_heads++;
2433	}
2434	for (i = 0; i < rdev->num_crtc; i += 2) {
2435		mode0 = &rdev->mode_info.crtcs[i]->base.mode;
2436		mode1 = &rdev->mode_info.crtcs[i+1]->base.mode;
2437		lb_size = evergreen_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i], mode0, mode1);
2438		evergreen_program_watermarks(rdev, rdev->mode_info.crtcs[i], lb_size, num_heads);
2439		lb_size = evergreen_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i+1], mode1, mode0);
2440		evergreen_program_watermarks(rdev, rdev->mode_info.crtcs[i+1], lb_size, num_heads);
2441	}
2442}
2443
2444/**
2445 * evergreen_mc_wait_for_idle - wait for MC idle callback.
2446 *
2447 * @rdev: radeon_device pointer
2448 *
2449 * Wait for the MC (memory controller) to be idle.
2450 * (evergreen+).
2451 * Returns 0 if the MC is idle, -1 if not.
2452 */
2453int evergreen_mc_wait_for_idle(struct radeon_device *rdev)
2454{
2455	unsigned i;
2456	u32 tmp;
2457
2458	for (i = 0; i < rdev->usec_timeout; i++) {
2459		/* read MC_STATUS */
2460		tmp = RREG32(SRBM_STATUS) & 0x1F00;
2461		if (!tmp)
2462			return 0;
2463		udelay(1);
2464	}
2465	return -1;
2466}
2467
2468/*
2469 * GART
2470 */
2471void evergreen_pcie_gart_tlb_flush(struct radeon_device *rdev)
2472{
2473	unsigned i;
2474	u32 tmp;
2475
2476	WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
2477
2478	WREG32(VM_CONTEXT0_REQUEST_RESPONSE, REQUEST_TYPE(1));
2479	for (i = 0; i < rdev->usec_timeout; i++) {
2480		/* read MC_STATUS */
2481		tmp = RREG32(VM_CONTEXT0_REQUEST_RESPONSE);
2482		tmp = (tmp & RESPONSE_TYPE_MASK) >> RESPONSE_TYPE_SHIFT;
2483		if (tmp == 2) {
2484			printk(KERN_WARNING "[drm] r600 flush TLB failed\n");
2485			return;
2486		}
2487		if (tmp) {
2488			return;
2489		}
2490		udelay(1);
2491	}
2492}
2493
2494static int evergreen_pcie_gart_enable(struct radeon_device *rdev)
2495{
2496	u32 tmp;
2497	int r;
2498
2499	if (rdev->gart.robj == NULL) {
2500		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
2501		return -EINVAL;
2502	}
2503	r = radeon_gart_table_vram_pin(rdev);
2504	if (r)
2505		return r;
2506	/* Setup L2 cache */
2507	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
2508				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
2509				EFFECTIVE_L2_QUEUE_SIZE(7));
2510	WREG32(VM_L2_CNTL2, 0);
2511	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
2512	/* Setup TLB control */
2513	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
2514		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
2515		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
2516		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
2517	if (rdev->flags & RADEON_IS_IGP) {
2518		WREG32(FUS_MC_VM_MD_L1_TLB0_CNTL, tmp);
2519		WREG32(FUS_MC_VM_MD_L1_TLB1_CNTL, tmp);
2520		WREG32(FUS_MC_VM_MD_L1_TLB2_CNTL, tmp);
2521	} else {
2522		WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
2523		WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
2524		WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
2525		if ((rdev->family == CHIP_JUNIPER) ||
2526		    (rdev->family == CHIP_CYPRESS) ||
2527		    (rdev->family == CHIP_HEMLOCK) ||
2528		    (rdev->family == CHIP_BARTS))
2529			WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
2530	}
2531	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
2532	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
2533	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
2534	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
2535	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
2536	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
2537	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
2538	WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
2539				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
2540	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
2541			(u32)(rdev->dummy_page.addr >> 12));
2542	WREG32(VM_CONTEXT1_CNTL, 0);
2543
2544	evergreen_pcie_gart_tlb_flush(rdev);
2545	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
2546		 (unsigned)(rdev->mc.gtt_size >> 20),
2547		 (unsigned long long)rdev->gart.table_addr);
2548	rdev->gart.ready = true;
2549	return 0;
2550}
2551
2552static void evergreen_pcie_gart_disable(struct radeon_device *rdev)
2553{
2554	u32 tmp;
2555
2556	/* Disable all tables */
2557	WREG32(VM_CONTEXT0_CNTL, 0);
2558	WREG32(VM_CONTEXT1_CNTL, 0);
2559
2560	/* Setup L2 cache */
2561	WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
2562				EFFECTIVE_L2_QUEUE_SIZE(7));
2563	WREG32(VM_L2_CNTL2, 0);
2564	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
2565	/* Setup TLB control */
2566	tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
2567	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
2568	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
2569	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
2570	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
2571	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
2572	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
2573	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
2574	radeon_gart_table_vram_unpin(rdev);
2575}
2576
2577static void evergreen_pcie_gart_fini(struct radeon_device *rdev)
2578{
2579	evergreen_pcie_gart_disable(rdev);
2580	radeon_gart_table_vram_free(rdev);
2581	radeon_gart_fini(rdev);
2582}
2583
2584
2585static void evergreen_agp_enable(struct radeon_device *rdev)
2586{
2587	u32 tmp;
2588
2589	/* Setup L2 cache */
2590	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
2591				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
2592				EFFECTIVE_L2_QUEUE_SIZE(7));
2593	WREG32(VM_L2_CNTL2, 0);
2594	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
2595	/* Setup TLB control */
2596	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
2597		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
2598		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
2599		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
2600	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
2601	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
2602	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
2603	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
2604	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
2605	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
2606	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
2607	WREG32(VM_CONTEXT0_CNTL, 0);
2608	WREG32(VM_CONTEXT1_CNTL, 0);
2609}
2610
2611static const unsigned ni_dig_offsets[] =
2612{
2613	NI_DIG0_REGISTER_OFFSET,
2614	NI_DIG1_REGISTER_OFFSET,
2615	NI_DIG2_REGISTER_OFFSET,
2616	NI_DIG3_REGISTER_OFFSET,
2617	NI_DIG4_REGISTER_OFFSET,
2618	NI_DIG5_REGISTER_OFFSET
2619};
2620
2621static const unsigned ni_tx_offsets[] =
2622{
2623	NI_DCIO_UNIPHY0_UNIPHY_TX_CONTROL1,
2624	NI_DCIO_UNIPHY1_UNIPHY_TX_CONTROL1,
2625	NI_DCIO_UNIPHY2_UNIPHY_TX_CONTROL1,
2626	NI_DCIO_UNIPHY3_UNIPHY_TX_CONTROL1,
2627	NI_DCIO_UNIPHY4_UNIPHY_TX_CONTROL1,
2628	NI_DCIO_UNIPHY5_UNIPHY_TX_CONTROL1
2629};
2630
2631static const unsigned evergreen_dp_offsets[] =
2632{
2633	EVERGREEN_DP0_REGISTER_OFFSET,
2634	EVERGREEN_DP1_REGISTER_OFFSET,
2635	EVERGREEN_DP2_REGISTER_OFFSET,
2636	EVERGREEN_DP3_REGISTER_OFFSET,
2637	EVERGREEN_DP4_REGISTER_OFFSET,
2638	EVERGREEN_DP5_REGISTER_OFFSET
2639};
2640
 
 
 
 
 
 
 
 
2641
2642/*
2643 * Assumption is that EVERGREEN_CRTC_MASTER_EN enable for requested crtc
2644 * We go from crtc to connector and it is not relible  since it
2645 * should be an opposite direction .If crtc is enable then
2646 * find the dig_fe which selects this crtc and insure that it enable.
2647 * if such dig_fe is found then find dig_be which selects found dig_be and
2648 * insure that it enable and in DP_SST mode.
2649 * if UNIPHY_PLL_CONTROL1.enable then we should disconnect timing
2650 * from dp symbols clocks .
2651 */
2652static bool evergreen_is_dp_sst_stream_enabled(struct radeon_device *rdev,
2653					       unsigned crtc_id, unsigned *ret_dig_fe)
2654{
2655	unsigned i;
2656	unsigned dig_fe;
2657	unsigned dig_be;
2658	unsigned dig_en_be;
2659	unsigned uniphy_pll;
2660	unsigned digs_fe_selected;
2661	unsigned dig_be_mode;
2662	unsigned dig_fe_mask;
2663	bool is_enabled = false;
2664	bool found_crtc = false;
2665
2666	/* loop through all running dig_fe to find selected crtc */
2667	for (i = 0; i < ARRAY_SIZE(ni_dig_offsets); i++) {
2668		dig_fe = RREG32(NI_DIG_FE_CNTL + ni_dig_offsets[i]);
2669		if (dig_fe & NI_DIG_FE_CNTL_SYMCLK_FE_ON &&
2670		    crtc_id == NI_DIG_FE_CNTL_SOURCE_SELECT(dig_fe)) {
2671			/* found running pipe */
2672			found_crtc = true;
2673			dig_fe_mask = 1 << i;
2674			dig_fe = i;
2675			break;
2676		}
2677	}
2678
2679	if (found_crtc) {
2680		/* loop through all running dig_be to find selected dig_fe */
2681		for (i = 0; i < ARRAY_SIZE(ni_dig_offsets); i++) {
2682			dig_be = RREG32(NI_DIG_BE_CNTL + ni_dig_offsets[i]);
2683			/* if dig_fe_selected by dig_be? */
2684			digs_fe_selected = NI_DIG_BE_CNTL_FE_SOURCE_SELECT(dig_be);
2685			dig_be_mode = NI_DIG_FE_CNTL_MODE(dig_be);
2686			if (dig_fe_mask &  digs_fe_selected &&
2687			    /* if dig_be in sst mode? */
2688			    dig_be_mode == NI_DIG_BE_DPSST) {
2689				dig_en_be = RREG32(NI_DIG_BE_EN_CNTL +
2690						   ni_dig_offsets[i]);
2691				uniphy_pll = RREG32(NI_DCIO_UNIPHY0_PLL_CONTROL1 +
2692						    ni_tx_offsets[i]);
2693				/* dig_be enable and tx is running */
2694				if (dig_en_be & NI_DIG_BE_EN_CNTL_ENABLE &&
2695				    dig_en_be & NI_DIG_BE_EN_CNTL_SYMBCLK_ON &&
2696				    uniphy_pll & NI_DCIO_UNIPHY0_PLL_CONTROL1_ENABLE) {
2697					is_enabled = true;
2698					*ret_dig_fe = dig_fe;
2699					break;
2700				}
2701			}
2702		}
2703	}
2704
2705	return is_enabled;
2706}
2707
2708/*
2709 * Blank dig when in dp sst mode
2710 * Dig ignores crtc timing
2711 */
2712static void evergreen_blank_dp_output(struct radeon_device *rdev,
2713				      unsigned dig_fe)
2714{
2715	unsigned stream_ctrl;
2716	unsigned fifo_ctrl;
2717	unsigned counter = 0;
2718
2719	if (dig_fe >= ARRAY_SIZE(evergreen_dp_offsets)) {
2720		DRM_ERROR("invalid dig_fe %d\n", dig_fe);
2721		return;
2722	}
2723
2724	stream_ctrl = RREG32(EVERGREEN_DP_VID_STREAM_CNTL +
2725			     evergreen_dp_offsets[dig_fe]);
2726	if (!(stream_ctrl & EVERGREEN_DP_VID_STREAM_CNTL_ENABLE)) {
2727		DRM_ERROR("dig %d , should be enable\n", dig_fe);
2728		return;
2729	}
2730
2731	stream_ctrl &=~EVERGREEN_DP_VID_STREAM_CNTL_ENABLE;
2732	WREG32(EVERGREEN_DP_VID_STREAM_CNTL +
2733	       evergreen_dp_offsets[dig_fe], stream_ctrl);
2734
2735	stream_ctrl = RREG32(EVERGREEN_DP_VID_STREAM_CNTL +
2736			     evergreen_dp_offsets[dig_fe]);
2737	while (counter < 32 && stream_ctrl & EVERGREEN_DP_VID_STREAM_STATUS) {
2738		msleep(1);
2739		counter++;
2740		stream_ctrl = RREG32(EVERGREEN_DP_VID_STREAM_CNTL +
2741				     evergreen_dp_offsets[dig_fe]);
2742	}
2743	if (counter >= 32 )
2744		DRM_ERROR("counter exceeds %d\n", counter);
2745
2746	fifo_ctrl = RREG32(EVERGREEN_DP_STEER_FIFO + evergreen_dp_offsets[dig_fe]);
2747	fifo_ctrl |= EVERGREEN_DP_STEER_FIFO_RESET;
2748	WREG32(EVERGREEN_DP_STEER_FIFO + evergreen_dp_offsets[dig_fe], fifo_ctrl);
2749
2750}
2751
2752void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save)
2753{
2754	u32 crtc_enabled, tmp, frame_count, blackout;
2755	int i, j;
2756	unsigned dig_fe;
2757
2758	if (!ASIC_IS_NODCE(rdev)) {
2759		save->vga_render_control = RREG32(VGA_RENDER_CONTROL);
2760		save->vga_hdp_control = RREG32(VGA_HDP_CONTROL);
2761
2762		/* disable VGA render */
2763		WREG32(VGA_RENDER_CONTROL, 0);
2764	}
2765	/* blank the display controllers */
2766	for (i = 0; i < rdev->num_crtc; i++) {
2767		crtc_enabled = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]) & EVERGREEN_CRTC_MASTER_EN;
2768		if (crtc_enabled) {
2769			save->crtc_enabled[i] = true;
2770			if (ASIC_IS_DCE6(rdev)) {
2771				tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]);
2772				if (!(tmp & EVERGREEN_CRTC_BLANK_DATA_EN)) {
2773					radeon_wait_for_vblank(rdev, i);
2774					WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2775					tmp |= EVERGREEN_CRTC_BLANK_DATA_EN;
2776					WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
2777					WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2778				}
2779			} else {
2780				tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]);
2781				if (!(tmp & EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE)) {
2782					radeon_wait_for_vblank(rdev, i);
2783					WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2784					tmp |= EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
2785					WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp);
2786					WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2787				}
2788			}
2789			/* wait for the next frame */
2790			frame_count = radeon_get_vblank_counter(rdev, i);
2791			for (j = 0; j < rdev->usec_timeout; j++) {
2792				if (radeon_get_vblank_counter(rdev, i) != frame_count)
2793					break;
2794				udelay(1);
2795			}
2796			/*we should disable dig if it drives dp sst*/
2797			/*but we are in radeon_device_init and the topology is unknown*/
2798			/*and it is available after radeon_modeset_init*/
2799			/*the following method radeon_atom_encoder_dpms_dig*/
2800			/*does the job if we initialize it properly*/
2801			/*for now we do it this manually*/
2802			/**/
2803			if (ASIC_IS_DCE5(rdev) &&
2804			    evergreen_is_dp_sst_stream_enabled(rdev, i ,&dig_fe))
2805				evergreen_blank_dp_output(rdev, dig_fe);
2806			/*we could remove 6 lines below*/
2807			/* XXX this is a hack to avoid strange behavior with EFI on certain systems */
2808			WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2809			tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]);
2810			tmp &= ~EVERGREEN_CRTC_MASTER_EN;
2811			WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp);
2812			WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2813			save->crtc_enabled[i] = false;
2814			/* ***** */
2815		} else {
2816			save->crtc_enabled[i] = false;
2817		}
2818	}
2819
2820	radeon_mc_wait_for_idle(rdev);
2821
2822	blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
2823	if ((blackout & BLACKOUT_MODE_MASK) != 1) {
2824		/* Block CPU access */
2825		WREG32(BIF_FB_EN, 0);
2826		/* blackout the MC */
2827		blackout &= ~BLACKOUT_MODE_MASK;
2828		WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1);
2829	}
2830	/* wait for the MC to settle */
2831	udelay(100);
2832
2833	/* lock double buffered regs */
2834	for (i = 0; i < rdev->num_crtc; i++) {
2835		if (save->crtc_enabled[i]) {
2836			tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
2837			if (!(tmp & EVERGREEN_GRPH_UPDATE_LOCK)) {
2838				tmp |= EVERGREEN_GRPH_UPDATE_LOCK;
2839				WREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i], tmp);
2840			}
2841			tmp = RREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i]);
2842			if (!(tmp & 1)) {
2843				tmp |= 1;
2844				WREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i], tmp);
2845			}
2846		}
2847	}
2848}
2849
2850void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save)
2851{
2852	u32 tmp, frame_count;
2853	int i, j;
2854
2855	/* update crtc base addresses */
2856	for (i = 0; i < rdev->num_crtc; i++) {
2857		WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
2858		       upper_32_bits(rdev->mc.vram_start));
2859		WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
2860		       upper_32_bits(rdev->mc.vram_start));
2861		WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + crtc_offsets[i],
2862		       (u32)rdev->mc.vram_start);
2863		WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + crtc_offsets[i],
2864		       (u32)rdev->mc.vram_start);
2865	}
2866
2867	if (!ASIC_IS_NODCE(rdev)) {
2868		WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS_HIGH, upper_32_bits(rdev->mc.vram_start));
2869		WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS, (u32)rdev->mc.vram_start);
2870	}
2871
2872	/* unlock regs and wait for update */
2873	for (i = 0; i < rdev->num_crtc; i++) {
2874		if (save->crtc_enabled[i]) {
2875			tmp = RREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i]);
2876			if ((tmp & 0x7) != 3) {
2877				tmp &= ~0x7;
2878				tmp |= 0x3;
2879				WREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i], tmp);
2880			}
2881			tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
2882			if (tmp & EVERGREEN_GRPH_UPDATE_LOCK) {
2883				tmp &= ~EVERGREEN_GRPH_UPDATE_LOCK;
2884				WREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i], tmp);
2885			}
2886			tmp = RREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i]);
2887			if (tmp & 1) {
2888				tmp &= ~1;
2889				WREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i], tmp);
2890			}
2891			for (j = 0; j < rdev->usec_timeout; j++) {
2892				tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
2893				if ((tmp & EVERGREEN_GRPH_SURFACE_UPDATE_PENDING) == 0)
2894					break;
2895				udelay(1);
2896			}
2897		}
2898	}
2899
2900	/* unblackout the MC */
2901	tmp = RREG32(MC_SHARED_BLACKOUT_CNTL);
2902	tmp &= ~BLACKOUT_MODE_MASK;
2903	WREG32(MC_SHARED_BLACKOUT_CNTL, tmp);
2904	/* allow CPU access */
2905	WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
2906
2907	for (i = 0; i < rdev->num_crtc; i++) {
2908		if (save->crtc_enabled[i]) {
2909			if (ASIC_IS_DCE6(rdev)) {
2910				tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]);
2911				tmp &= ~EVERGREEN_CRTC_BLANK_DATA_EN;
2912				WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2913				WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
2914				WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2915			} else {
2916				tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]);
2917				tmp &= ~EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
2918				WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2919				WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp);
2920				WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2921			}
2922			/* wait for the next frame */
2923			frame_count = radeon_get_vblank_counter(rdev, i);
2924			for (j = 0; j < rdev->usec_timeout; j++) {
2925				if (radeon_get_vblank_counter(rdev, i) != frame_count)
2926					break;
2927				udelay(1);
2928			}
2929		}
2930	}
2931	if (!ASIC_IS_NODCE(rdev)) {
2932		/* Unlock vga access */
2933		WREG32(VGA_HDP_CONTROL, save->vga_hdp_control);
2934		mdelay(1);
2935		WREG32(VGA_RENDER_CONTROL, save->vga_render_control);
2936	}
2937}
2938
2939void evergreen_mc_program(struct radeon_device *rdev)
2940{
2941	struct evergreen_mc_save save;
2942	u32 tmp;
2943	int i, j;
2944
2945	/* Initialize HDP */
2946	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
2947		WREG32((0x2c14 + j), 0x00000000);
2948		WREG32((0x2c18 + j), 0x00000000);
2949		WREG32((0x2c1c + j), 0x00000000);
2950		WREG32((0x2c20 + j), 0x00000000);
2951		WREG32((0x2c24 + j), 0x00000000);
2952	}
2953	WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
2954
2955	evergreen_mc_stop(rdev, &save);
2956	if (evergreen_mc_wait_for_idle(rdev)) {
2957		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
2958	}
2959	/* Lockout access through VGA aperture*/
2960	WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
2961	/* Update configuration */
2962	if (rdev->flags & RADEON_IS_AGP) {
2963		if (rdev->mc.vram_start < rdev->mc.gtt_start) {
2964			/* VRAM before AGP */
2965			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
2966				rdev->mc.vram_start >> 12);
2967			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
2968				rdev->mc.gtt_end >> 12);
2969		} else {
2970			/* VRAM after AGP */
2971			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
2972				rdev->mc.gtt_start >> 12);
2973			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
2974				rdev->mc.vram_end >> 12);
2975		}
2976	} else {
2977		WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
2978			rdev->mc.vram_start >> 12);
2979		WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
2980			rdev->mc.vram_end >> 12);
2981	}
2982	WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
2983	/* llano/ontario only */
2984	if ((rdev->family == CHIP_PALM) ||
2985	    (rdev->family == CHIP_SUMO) ||
2986	    (rdev->family == CHIP_SUMO2)) {
2987		tmp = RREG32(MC_FUS_VM_FB_OFFSET) & 0x000FFFFF;
2988		tmp |= ((rdev->mc.vram_end >> 20) & 0xF) << 24;
2989		tmp |= ((rdev->mc.vram_start >> 20) & 0xF) << 20;
2990		WREG32(MC_FUS_VM_FB_OFFSET, tmp);
2991	}
2992	tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
2993	tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
2994	WREG32(MC_VM_FB_LOCATION, tmp);
2995	WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
2996	WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
2997	WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
2998	if (rdev->flags & RADEON_IS_AGP) {
2999		WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16);
3000		WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16);
3001		WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
3002	} else {
3003		WREG32(MC_VM_AGP_BASE, 0);
3004		WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
3005		WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
3006	}
3007	if (evergreen_mc_wait_for_idle(rdev)) {
3008		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
3009	}
3010	evergreen_mc_resume(rdev, &save);
3011	/* we need to own VRAM, so turn off the VGA renderer here
3012	 * to stop it overwriting our objects */
3013	rv515_vga_render_disable(rdev);
3014}
3015
3016/*
3017 * CP.
3018 */
3019void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
3020{
3021	struct radeon_ring *ring = &rdev->ring[ib->ring];
3022	u32 next_rptr;
3023
3024	/* set to DX10/11 mode */
3025	radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
3026	radeon_ring_write(ring, 1);
3027
3028	if (ring->rptr_save_reg) {
3029		next_rptr = ring->wptr + 3 + 4;
3030		radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
3031		radeon_ring_write(ring, ((ring->rptr_save_reg - 
3032					  PACKET3_SET_CONFIG_REG_START) >> 2));
3033		radeon_ring_write(ring, next_rptr);
3034	} else if (rdev->wb.enabled) {
3035		next_rptr = ring->wptr + 5 + 4;
3036		radeon_ring_write(ring, PACKET3(PACKET3_MEM_WRITE, 3));
3037		radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
3038		radeon_ring_write(ring, (upper_32_bits(ring->next_rptr_gpu_addr) & 0xff) | (1 << 18));
3039		radeon_ring_write(ring, next_rptr);
3040		radeon_ring_write(ring, 0);
3041	}
3042
3043	radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
3044	radeon_ring_write(ring,
3045#ifdef __BIG_ENDIAN
3046			  (2 << 0) |
3047#endif
3048			  (ib->gpu_addr & 0xFFFFFFFC));
3049	radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF);
3050	radeon_ring_write(ring, ib->length_dw);
3051}
3052
3053
3054static int evergreen_cp_load_microcode(struct radeon_device *rdev)
3055{
3056	const __be32 *fw_data;
3057	int i;
3058
3059	if (!rdev->me_fw || !rdev->pfp_fw)
3060		return -EINVAL;
3061
3062	r700_cp_stop(rdev);
3063	WREG32(CP_RB_CNTL,
3064#ifdef __BIG_ENDIAN
3065	       BUF_SWAP_32BIT |
3066#endif
3067	       RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
3068
3069	fw_data = (const __be32 *)rdev->pfp_fw->data;
3070	WREG32(CP_PFP_UCODE_ADDR, 0);
3071	for (i = 0; i < EVERGREEN_PFP_UCODE_SIZE; i++)
3072		WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
3073	WREG32(CP_PFP_UCODE_ADDR, 0);
3074
3075	fw_data = (const __be32 *)rdev->me_fw->data;
3076	WREG32(CP_ME_RAM_WADDR, 0);
3077	for (i = 0; i < EVERGREEN_PM4_UCODE_SIZE; i++)
3078		WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
3079
3080	WREG32(CP_PFP_UCODE_ADDR, 0);
3081	WREG32(CP_ME_RAM_WADDR, 0);
3082	WREG32(CP_ME_RAM_RADDR, 0);
3083	return 0;
3084}
3085
3086static int evergreen_cp_start(struct radeon_device *rdev)
3087{
3088	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
3089	int r, i;
3090	uint32_t cp_me;
3091
3092	r = radeon_ring_lock(rdev, ring, 7);
3093	if (r) {
3094		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
3095		return r;
3096	}
3097	radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
3098	radeon_ring_write(ring, 0x1);
3099	radeon_ring_write(ring, 0x0);
3100	radeon_ring_write(ring, rdev->config.evergreen.max_hw_contexts - 1);
3101	radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
3102	radeon_ring_write(ring, 0);
3103	radeon_ring_write(ring, 0);
3104	radeon_ring_unlock_commit(rdev, ring, false);
3105
3106	cp_me = 0xff;
3107	WREG32(CP_ME_CNTL, cp_me);
3108
3109	r = radeon_ring_lock(rdev, ring, evergreen_default_size + 19);
3110	if (r) {
3111		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
3112		return r;
3113	}
3114
3115	/* setup clear context state */
3116	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
3117	radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
3118
3119	for (i = 0; i < evergreen_default_size; i++)
3120		radeon_ring_write(ring, evergreen_default_state[i]);
3121
3122	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
3123	radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
3124
3125	/* set clear context state */
3126	radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
3127	radeon_ring_write(ring, 0);
3128
3129	/* SQ_VTX_BASE_VTX_LOC */
3130	radeon_ring_write(ring, 0xc0026f00);
3131	radeon_ring_write(ring, 0x00000000);
3132	radeon_ring_write(ring, 0x00000000);
3133	radeon_ring_write(ring, 0x00000000);
3134
3135	/* Clear consts */
3136	radeon_ring_write(ring, 0xc0036f00);
3137	radeon_ring_write(ring, 0x00000bc4);
3138	radeon_ring_write(ring, 0xffffffff);
3139	radeon_ring_write(ring, 0xffffffff);
3140	radeon_ring_write(ring, 0xffffffff);
3141
3142	radeon_ring_write(ring, 0xc0026900);
3143	radeon_ring_write(ring, 0x00000316);
3144	radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
3145	radeon_ring_write(ring, 0x00000010); /*  */
3146
3147	radeon_ring_unlock_commit(rdev, ring, false);
3148
3149	return 0;
3150}
3151
3152static int evergreen_cp_resume(struct radeon_device *rdev)
3153{
3154	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
3155	u32 tmp;
3156	u32 rb_bufsz;
3157	int r;
3158
3159	/* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
3160	WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
3161				 SOFT_RESET_PA |
3162				 SOFT_RESET_SH |
3163				 SOFT_RESET_VGT |
3164				 SOFT_RESET_SPI |
3165				 SOFT_RESET_SX));
3166	RREG32(GRBM_SOFT_RESET);
3167	mdelay(15);
3168	WREG32(GRBM_SOFT_RESET, 0);
3169	RREG32(GRBM_SOFT_RESET);
3170
3171	/* Set ring buffer size */
3172	rb_bufsz = order_base_2(ring->ring_size / 8);
3173	tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
3174#ifdef __BIG_ENDIAN
3175	tmp |= BUF_SWAP_32BIT;
3176#endif
3177	WREG32(CP_RB_CNTL, tmp);
3178	WREG32(CP_SEM_WAIT_TIMER, 0x0);
3179	WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
3180
3181	/* Set the write pointer delay */
3182	WREG32(CP_RB_WPTR_DELAY, 0);
3183
3184	/* Initialize the ring buffer's read and write pointers */
3185	WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA);
3186	WREG32(CP_RB_RPTR_WR, 0);
3187	ring->wptr = 0;
3188	WREG32(CP_RB_WPTR, ring->wptr);
3189
3190	/* set the wb address whether it's enabled or not */
3191	WREG32(CP_RB_RPTR_ADDR,
3192	       ((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC));
3193	WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
3194	WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
3195
3196	if (rdev->wb.enabled)
3197		WREG32(SCRATCH_UMSK, 0xff);
3198	else {
3199		tmp |= RB_NO_UPDATE;
3200		WREG32(SCRATCH_UMSK, 0);
3201	}
3202
3203	mdelay(1);
3204	WREG32(CP_RB_CNTL, tmp);
3205
3206	WREG32(CP_RB_BASE, ring->gpu_addr >> 8);
3207	WREG32(CP_DEBUG, (1 << 27) | (1 << 28));
3208
3209	evergreen_cp_start(rdev);
3210	ring->ready = true;
3211	r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring);
3212	if (r) {
3213		ring->ready = false;
3214		return r;
3215	}
3216	return 0;
3217}
3218
3219/*
3220 * Core functions
3221 */
3222static void evergreen_gpu_init(struct radeon_device *rdev)
3223{
3224	u32 gb_addr_config;
3225	u32 mc_shared_chmap, mc_arb_ramcfg;
3226	u32 sx_debug_1;
3227	u32 smx_dc_ctl0;
3228	u32 sq_config;
3229	u32 sq_lds_resource_mgmt;
3230	u32 sq_gpr_resource_mgmt_1;
3231	u32 sq_gpr_resource_mgmt_2;
3232	u32 sq_gpr_resource_mgmt_3;
3233	u32 sq_thread_resource_mgmt;
3234	u32 sq_thread_resource_mgmt_2;
3235	u32 sq_stack_resource_mgmt_1;
3236	u32 sq_stack_resource_mgmt_2;
3237	u32 sq_stack_resource_mgmt_3;
3238	u32 vgt_cache_invalidation;
3239	u32 hdp_host_path_cntl, tmp;
3240	u32 disabled_rb_mask;
3241	int i, j, ps_thread_count;
3242
3243	switch (rdev->family) {
3244	case CHIP_CYPRESS:
3245	case CHIP_HEMLOCK:
3246		rdev->config.evergreen.num_ses = 2;
3247		rdev->config.evergreen.max_pipes = 4;
3248		rdev->config.evergreen.max_tile_pipes = 8;
3249		rdev->config.evergreen.max_simds = 10;
3250		rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses;
3251		rdev->config.evergreen.max_gprs = 256;
3252		rdev->config.evergreen.max_threads = 248;
3253		rdev->config.evergreen.max_gs_threads = 32;
3254		rdev->config.evergreen.max_stack_entries = 512;
3255		rdev->config.evergreen.sx_num_of_sets = 4;
3256		rdev->config.evergreen.sx_max_export_size = 256;
3257		rdev->config.evergreen.sx_max_export_pos_size = 64;
3258		rdev->config.evergreen.sx_max_export_smx_size = 192;
3259		rdev->config.evergreen.max_hw_contexts = 8;
3260		rdev->config.evergreen.sq_num_cf_insts = 2;
3261
3262		rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3263		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3264		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3265		gb_addr_config = CYPRESS_GB_ADDR_CONFIG_GOLDEN;
3266		break;
3267	case CHIP_JUNIPER:
3268		rdev->config.evergreen.num_ses = 1;
3269		rdev->config.evergreen.max_pipes = 4;
3270		rdev->config.evergreen.max_tile_pipes = 4;
3271		rdev->config.evergreen.max_simds = 10;
3272		rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses;
3273		rdev->config.evergreen.max_gprs = 256;
3274		rdev->config.evergreen.max_threads = 248;
3275		rdev->config.evergreen.max_gs_threads = 32;
3276		rdev->config.evergreen.max_stack_entries = 512;
3277		rdev->config.evergreen.sx_num_of_sets = 4;
3278		rdev->config.evergreen.sx_max_export_size = 256;
3279		rdev->config.evergreen.sx_max_export_pos_size = 64;
3280		rdev->config.evergreen.sx_max_export_smx_size = 192;
3281		rdev->config.evergreen.max_hw_contexts = 8;
3282		rdev->config.evergreen.sq_num_cf_insts = 2;
3283
3284		rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3285		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3286		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3287		gb_addr_config = JUNIPER_GB_ADDR_CONFIG_GOLDEN;
3288		break;
3289	case CHIP_REDWOOD:
3290		rdev->config.evergreen.num_ses = 1;
3291		rdev->config.evergreen.max_pipes = 4;
3292		rdev->config.evergreen.max_tile_pipes = 4;
3293		rdev->config.evergreen.max_simds = 5;
3294		rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses;
3295		rdev->config.evergreen.max_gprs = 256;
3296		rdev->config.evergreen.max_threads = 248;
3297		rdev->config.evergreen.max_gs_threads = 32;
3298		rdev->config.evergreen.max_stack_entries = 256;
3299		rdev->config.evergreen.sx_num_of_sets = 4;
3300		rdev->config.evergreen.sx_max_export_size = 256;
3301		rdev->config.evergreen.sx_max_export_pos_size = 64;
3302		rdev->config.evergreen.sx_max_export_smx_size = 192;
3303		rdev->config.evergreen.max_hw_contexts = 8;
3304		rdev->config.evergreen.sq_num_cf_insts = 2;
3305
3306		rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3307		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3308		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3309		gb_addr_config = REDWOOD_GB_ADDR_CONFIG_GOLDEN;
3310		break;
3311	case CHIP_CEDAR:
3312	default:
3313		rdev->config.evergreen.num_ses = 1;
3314		rdev->config.evergreen.max_pipes = 2;
3315		rdev->config.evergreen.max_tile_pipes = 2;
3316		rdev->config.evergreen.max_simds = 2;
3317		rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3318		rdev->config.evergreen.max_gprs = 256;
3319		rdev->config.evergreen.max_threads = 192;
3320		rdev->config.evergreen.max_gs_threads = 16;
3321		rdev->config.evergreen.max_stack_entries = 256;
3322		rdev->config.evergreen.sx_num_of_sets = 4;
3323		rdev->config.evergreen.sx_max_export_size = 128;
3324		rdev->config.evergreen.sx_max_export_pos_size = 32;
3325		rdev->config.evergreen.sx_max_export_smx_size = 96;
3326		rdev->config.evergreen.max_hw_contexts = 4;
3327		rdev->config.evergreen.sq_num_cf_insts = 1;
3328
3329		rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3330		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3331		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3332		gb_addr_config = CEDAR_GB_ADDR_CONFIG_GOLDEN;
3333		break;
3334	case CHIP_PALM:
3335		rdev->config.evergreen.num_ses = 1;
3336		rdev->config.evergreen.max_pipes = 2;
3337		rdev->config.evergreen.max_tile_pipes = 2;
3338		rdev->config.evergreen.max_simds = 2;
3339		rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3340		rdev->config.evergreen.max_gprs = 256;
3341		rdev->config.evergreen.max_threads = 192;
3342		rdev->config.evergreen.max_gs_threads = 16;
3343		rdev->config.evergreen.max_stack_entries = 256;
3344		rdev->config.evergreen.sx_num_of_sets = 4;
3345		rdev->config.evergreen.sx_max_export_size = 128;
3346		rdev->config.evergreen.sx_max_export_pos_size = 32;
3347		rdev->config.evergreen.sx_max_export_smx_size = 96;
3348		rdev->config.evergreen.max_hw_contexts = 4;
3349		rdev->config.evergreen.sq_num_cf_insts = 1;
3350
3351		rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3352		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3353		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3354		gb_addr_config = CEDAR_GB_ADDR_CONFIG_GOLDEN;
3355		break;
3356	case CHIP_SUMO:
3357		rdev->config.evergreen.num_ses = 1;
3358		rdev->config.evergreen.max_pipes = 4;
3359		rdev->config.evergreen.max_tile_pipes = 4;
3360		if (rdev->pdev->device == 0x9648)
3361			rdev->config.evergreen.max_simds = 3;
3362		else if ((rdev->pdev->device == 0x9647) ||
3363			 (rdev->pdev->device == 0x964a))
3364			rdev->config.evergreen.max_simds = 4;
3365		else
3366			rdev->config.evergreen.max_simds = 5;
3367		rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses;
3368		rdev->config.evergreen.max_gprs = 256;
3369		rdev->config.evergreen.max_threads = 248;
3370		rdev->config.evergreen.max_gs_threads = 32;
3371		rdev->config.evergreen.max_stack_entries = 256;
3372		rdev->config.evergreen.sx_num_of_sets = 4;
3373		rdev->config.evergreen.sx_max_export_size = 256;
3374		rdev->config.evergreen.sx_max_export_pos_size = 64;
3375		rdev->config.evergreen.sx_max_export_smx_size = 192;
3376		rdev->config.evergreen.max_hw_contexts = 8;
3377		rdev->config.evergreen.sq_num_cf_insts = 2;
3378
3379		rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3380		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3381		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3382		gb_addr_config = SUMO_GB_ADDR_CONFIG_GOLDEN;
3383		break;
3384	case CHIP_SUMO2:
3385		rdev->config.evergreen.num_ses = 1;
3386		rdev->config.evergreen.max_pipes = 4;
3387		rdev->config.evergreen.max_tile_pipes = 4;
3388		rdev->config.evergreen.max_simds = 2;
3389		rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3390		rdev->config.evergreen.max_gprs = 256;
3391		rdev->config.evergreen.max_threads = 248;
3392		rdev->config.evergreen.max_gs_threads = 32;
3393		rdev->config.evergreen.max_stack_entries = 512;
3394		rdev->config.evergreen.sx_num_of_sets = 4;
3395		rdev->config.evergreen.sx_max_export_size = 256;
3396		rdev->config.evergreen.sx_max_export_pos_size = 64;
3397		rdev->config.evergreen.sx_max_export_smx_size = 192;
3398		rdev->config.evergreen.max_hw_contexts = 4;
3399		rdev->config.evergreen.sq_num_cf_insts = 2;
3400
3401		rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3402		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3403		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3404		gb_addr_config = SUMO2_GB_ADDR_CONFIG_GOLDEN;
3405		break;
3406	case CHIP_BARTS:
3407		rdev->config.evergreen.num_ses = 2;
3408		rdev->config.evergreen.max_pipes = 4;
3409		rdev->config.evergreen.max_tile_pipes = 8;
3410		rdev->config.evergreen.max_simds = 7;
3411		rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses;
3412		rdev->config.evergreen.max_gprs = 256;
3413		rdev->config.evergreen.max_threads = 248;
3414		rdev->config.evergreen.max_gs_threads = 32;
3415		rdev->config.evergreen.max_stack_entries = 512;
3416		rdev->config.evergreen.sx_num_of_sets = 4;
3417		rdev->config.evergreen.sx_max_export_size = 256;
3418		rdev->config.evergreen.sx_max_export_pos_size = 64;
3419		rdev->config.evergreen.sx_max_export_smx_size = 192;
3420		rdev->config.evergreen.max_hw_contexts = 8;
3421		rdev->config.evergreen.sq_num_cf_insts = 2;
3422
3423		rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3424		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3425		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3426		gb_addr_config = BARTS_GB_ADDR_CONFIG_GOLDEN;
3427		break;
3428	case CHIP_TURKS:
3429		rdev->config.evergreen.num_ses = 1;
3430		rdev->config.evergreen.max_pipes = 4;
3431		rdev->config.evergreen.max_tile_pipes = 4;
3432		rdev->config.evergreen.max_simds = 6;
3433		rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses;
3434		rdev->config.evergreen.max_gprs = 256;
3435		rdev->config.evergreen.max_threads = 248;
3436		rdev->config.evergreen.max_gs_threads = 32;
3437		rdev->config.evergreen.max_stack_entries = 256;
3438		rdev->config.evergreen.sx_num_of_sets = 4;
3439		rdev->config.evergreen.sx_max_export_size = 256;
3440		rdev->config.evergreen.sx_max_export_pos_size = 64;
3441		rdev->config.evergreen.sx_max_export_smx_size = 192;
3442		rdev->config.evergreen.max_hw_contexts = 8;
3443		rdev->config.evergreen.sq_num_cf_insts = 2;
3444
3445		rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3446		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3447		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3448		gb_addr_config = TURKS_GB_ADDR_CONFIG_GOLDEN;
3449		break;
3450	case CHIP_CAICOS:
3451		rdev->config.evergreen.num_ses = 1;
3452		rdev->config.evergreen.max_pipes = 2;
3453		rdev->config.evergreen.max_tile_pipes = 2;
3454		rdev->config.evergreen.max_simds = 2;
3455		rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3456		rdev->config.evergreen.max_gprs = 256;
3457		rdev->config.evergreen.max_threads = 192;
3458		rdev->config.evergreen.max_gs_threads = 16;
3459		rdev->config.evergreen.max_stack_entries = 256;
3460		rdev->config.evergreen.sx_num_of_sets = 4;
3461		rdev->config.evergreen.sx_max_export_size = 128;
3462		rdev->config.evergreen.sx_max_export_pos_size = 32;
3463		rdev->config.evergreen.sx_max_export_smx_size = 96;
3464		rdev->config.evergreen.max_hw_contexts = 4;
3465		rdev->config.evergreen.sq_num_cf_insts = 1;
3466
3467		rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3468		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3469		rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3470		gb_addr_config = CAICOS_GB_ADDR_CONFIG_GOLDEN;
3471		break;
3472	}
3473
3474	/* Initialize HDP */
3475	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
3476		WREG32((0x2c14 + j), 0x00000000);
3477		WREG32((0x2c18 + j), 0x00000000);
3478		WREG32((0x2c1c + j), 0x00000000);
3479		WREG32((0x2c20 + j), 0x00000000);
3480		WREG32((0x2c24 + j), 0x00000000);
3481	}
3482
3483	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
3484	WREG32(SRBM_INT_CNTL, 0x1);
3485	WREG32(SRBM_INT_ACK, 0x1);
3486
3487	evergreen_fix_pci_max_read_req_size(rdev);
3488
3489	mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
3490	if ((rdev->family == CHIP_PALM) ||
3491	    (rdev->family == CHIP_SUMO) ||
3492	    (rdev->family == CHIP_SUMO2))
3493		mc_arb_ramcfg = RREG32(FUS_MC_ARB_RAMCFG);
3494	else
3495		mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
3496
3497	/* setup tiling info dword.  gb_addr_config is not adequate since it does
3498	 * not have bank info, so create a custom tiling dword.
3499	 * bits 3:0   num_pipes
3500	 * bits 7:4   num_banks
3501	 * bits 11:8  group_size
3502	 * bits 15:12 row_size
3503	 */
3504	rdev->config.evergreen.tile_config = 0;
3505	switch (rdev->config.evergreen.max_tile_pipes) {
3506	case 1:
3507	default:
3508		rdev->config.evergreen.tile_config |= (0 << 0);
3509		break;
3510	case 2:
3511		rdev->config.evergreen.tile_config |= (1 << 0);
3512		break;
3513	case 4:
3514		rdev->config.evergreen.tile_config |= (2 << 0);
3515		break;
3516	case 8:
3517		rdev->config.evergreen.tile_config |= (3 << 0);
3518		break;
3519	}
3520	/* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */
3521	if (rdev->flags & RADEON_IS_IGP)
3522		rdev->config.evergreen.tile_config |= 1 << 4;
3523	else {
3524		switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
3525		case 0: /* four banks */
3526			rdev->config.evergreen.tile_config |= 0 << 4;
3527			break;
3528		case 1: /* eight banks */
3529			rdev->config.evergreen.tile_config |= 1 << 4;
3530			break;
3531		case 2: /* sixteen banks */
3532		default:
3533			rdev->config.evergreen.tile_config |= 2 << 4;
3534			break;
3535		}
3536	}
3537	rdev->config.evergreen.tile_config |= 0 << 8;
3538	rdev->config.evergreen.tile_config |=
3539		((gb_addr_config & 0x30000000) >> 28) << 12;
3540
3541	if ((rdev->family >= CHIP_CEDAR) && (rdev->family <= CHIP_HEMLOCK)) {
3542		u32 efuse_straps_4;
3543		u32 efuse_straps_3;
3544
3545		efuse_straps_4 = RREG32_RCU(0x204);
3546		efuse_straps_3 = RREG32_RCU(0x203);
3547		tmp = (((efuse_straps_4 & 0xf) << 4) |
3548		      ((efuse_straps_3 & 0xf0000000) >> 28));
3549	} else {
3550		tmp = 0;
3551		for (i = (rdev->config.evergreen.num_ses - 1); i >= 0; i--) {
3552			u32 rb_disable_bitmap;
3553
3554			WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3555			WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3556			rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16;
3557			tmp <<= 4;
3558			tmp |= rb_disable_bitmap;
3559		}
3560	}
3561	/* enabled rb are just the one not disabled :) */
3562	disabled_rb_mask = tmp;
3563	tmp = 0;
3564	for (i = 0; i < rdev->config.evergreen.max_backends; i++)
3565		tmp |= (1 << i);
3566	/* if all the backends are disabled, fix it up here */
3567	if ((disabled_rb_mask & tmp) == tmp) {
3568		for (i = 0; i < rdev->config.evergreen.max_backends; i++)
3569			disabled_rb_mask &= ~(1 << i);
3570	}
3571
3572	for (i = 0; i < rdev->config.evergreen.num_ses; i++) {
3573		u32 simd_disable_bitmap;
3574
3575		WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3576		WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3577		simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
3578		simd_disable_bitmap |= 0xffffffff << rdev->config.evergreen.max_simds;
3579		tmp <<= 16;
3580		tmp |= simd_disable_bitmap;
3581	}
3582	rdev->config.evergreen.active_simds = hweight32(~tmp);
3583
3584	WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
3585	WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
3586
3587	WREG32(GB_ADDR_CONFIG, gb_addr_config);
3588	WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
3589	WREG32(HDP_ADDR_CONFIG, gb_addr_config);
3590	WREG32(DMA_TILING_CONFIG, gb_addr_config);
3591	WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
3592	WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
3593	WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
3594
3595	if ((rdev->config.evergreen.max_backends == 1) &&
3596	    (rdev->flags & RADEON_IS_IGP)) {
3597		if ((disabled_rb_mask & 3) == 1) {
3598			/* RB0 disabled, RB1 enabled */
3599			tmp = 0x11111111;
3600		} else {
3601			/* RB1 disabled, RB0 enabled */
3602			tmp = 0x00000000;
3603		}
3604	} else {
3605		tmp = gb_addr_config & NUM_PIPES_MASK;
3606		tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.evergreen.max_backends,
3607						EVERGREEN_MAX_BACKENDS, disabled_rb_mask);
3608	}
 
3609	WREG32(GB_BACKEND_MAP, tmp);
3610
3611	WREG32(CGTS_SYS_TCC_DISABLE, 0);
3612	WREG32(CGTS_TCC_DISABLE, 0);
3613	WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
3614	WREG32(CGTS_USER_TCC_DISABLE, 0);
3615
3616	/* set HW defaults for 3D engine */
3617	WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
3618				     ROQ_IB2_START(0x2b)));
3619
3620	WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
3621
3622	WREG32(TA_CNTL_AUX, (DISABLE_CUBE_ANISO |
3623			     SYNC_GRADIENT |
3624			     SYNC_WALKER |
3625			     SYNC_ALIGNER));
3626
3627	sx_debug_1 = RREG32(SX_DEBUG_1);
3628	sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
3629	WREG32(SX_DEBUG_1, sx_debug_1);
3630
3631
3632	smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
3633	smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
3634	smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.evergreen.sx_num_of_sets);
3635	WREG32(SMX_DC_CTL0, smx_dc_ctl0);
3636
3637	if (rdev->family <= CHIP_SUMO2)
3638		WREG32(SMX_SAR_CTL0, 0x00010000);
3639
3640	WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_size / 4) - 1) |
3641					POSITION_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_pos_size / 4) - 1) |
3642					SMX_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_smx_size / 4) - 1)));
3643
3644	WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.evergreen.sc_prim_fifo_size) |
3645				 SC_HIZ_TILE_FIFO_SIZE(rdev->config.evergreen.sc_hiz_tile_fifo_size) |
3646				 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.evergreen.sc_earlyz_tile_fifo_size)));
3647
3648	WREG32(VGT_NUM_INSTANCES, 1);
3649	WREG32(SPI_CONFIG_CNTL, 0);
3650	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
3651	WREG32(CP_PERFMON_CNTL, 0);
3652
3653	WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.evergreen.sq_num_cf_insts) |
3654				  FETCH_FIFO_HIWATER(0x4) |
3655				  DONE_FIFO_HIWATER(0xe0) |
3656				  ALU_UPDATE_FIFO_HIWATER(0x8)));
3657
3658	sq_config = RREG32(SQ_CONFIG);
3659	sq_config &= ~(PS_PRIO(3) |
3660		       VS_PRIO(3) |
3661		       GS_PRIO(3) |
3662		       ES_PRIO(3));
3663	sq_config |= (VC_ENABLE |
3664		      EXPORT_SRC_C |
3665		      PS_PRIO(0) |
3666		      VS_PRIO(1) |
3667		      GS_PRIO(2) |
3668		      ES_PRIO(3));
3669
3670	switch (rdev->family) {
3671	case CHIP_CEDAR:
3672	case CHIP_PALM:
3673	case CHIP_SUMO:
3674	case CHIP_SUMO2:
3675	case CHIP_CAICOS:
3676		/* no vertex cache */
3677		sq_config &= ~VC_ENABLE;
3678		break;
3679	default:
3680		break;
3681	}
3682
3683	sq_lds_resource_mgmt = RREG32(SQ_LDS_RESOURCE_MGMT);
3684
3685	sq_gpr_resource_mgmt_1 = NUM_PS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2))* 12 / 32);
3686	sq_gpr_resource_mgmt_1 |= NUM_VS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 6 / 32);
3687	sq_gpr_resource_mgmt_1 |= NUM_CLAUSE_TEMP_GPRS(4);
3688	sq_gpr_resource_mgmt_2 = NUM_GS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 4 / 32);
3689	sq_gpr_resource_mgmt_2 |= NUM_ES_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 4 / 32);
3690	sq_gpr_resource_mgmt_3 = NUM_HS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32);
3691	sq_gpr_resource_mgmt_3 |= NUM_LS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32);
3692
3693	switch (rdev->family) {
3694	case CHIP_CEDAR:
3695	case CHIP_PALM:
3696	case CHIP_SUMO:
3697	case CHIP_SUMO2:
3698		ps_thread_count = 96;
3699		break;
3700	default:
3701		ps_thread_count = 128;
3702		break;
3703	}
3704
3705	sq_thread_resource_mgmt = NUM_PS_THREADS(ps_thread_count);
3706	sq_thread_resource_mgmt |= NUM_VS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3707	sq_thread_resource_mgmt |= NUM_GS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3708	sq_thread_resource_mgmt |= NUM_ES_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3709	sq_thread_resource_mgmt_2 = NUM_HS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3710	sq_thread_resource_mgmt_2 |= NUM_LS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3711
3712	sq_stack_resource_mgmt_1 = NUM_PS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3713	sq_stack_resource_mgmt_1 |= NUM_VS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3714	sq_stack_resource_mgmt_2 = NUM_GS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3715	sq_stack_resource_mgmt_2 |= NUM_ES_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3716	sq_stack_resource_mgmt_3 = NUM_HS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3717	sq_stack_resource_mgmt_3 |= NUM_LS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3718
3719	WREG32(SQ_CONFIG, sq_config);
3720	WREG32(SQ_GPR_RESOURCE_MGMT_1, sq_gpr_resource_mgmt_1);
3721	WREG32(SQ_GPR_RESOURCE_MGMT_2, sq_gpr_resource_mgmt_2);
3722	WREG32(SQ_GPR_RESOURCE_MGMT_3, sq_gpr_resource_mgmt_3);
3723	WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt);
3724	WREG32(SQ_THREAD_RESOURCE_MGMT_2, sq_thread_resource_mgmt_2);
3725	WREG32(SQ_STACK_RESOURCE_MGMT_1, sq_stack_resource_mgmt_1);
3726	WREG32(SQ_STACK_RESOURCE_MGMT_2, sq_stack_resource_mgmt_2);
3727	WREG32(SQ_STACK_RESOURCE_MGMT_3, sq_stack_resource_mgmt_3);
3728	WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0);
3729	WREG32(SQ_LDS_RESOURCE_MGMT, sq_lds_resource_mgmt);
3730
3731	WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
3732					  FORCE_EOV_MAX_REZ_CNT(255)));
3733
3734	switch (rdev->family) {
3735	case CHIP_CEDAR:
3736	case CHIP_PALM:
3737	case CHIP_SUMO:
3738	case CHIP_SUMO2:
3739	case CHIP_CAICOS:
3740		vgt_cache_invalidation = CACHE_INVALIDATION(TC_ONLY);
3741		break;
3742	default:
3743		vgt_cache_invalidation = CACHE_INVALIDATION(VC_AND_TC);
3744		break;
3745	}
3746	vgt_cache_invalidation |= AUTO_INVLD_EN(ES_AND_GS_AUTO);
3747	WREG32(VGT_CACHE_INVALIDATION, vgt_cache_invalidation);
3748
3749	WREG32(VGT_GS_VERTEX_REUSE, 16);
3750	WREG32(PA_SU_LINE_STIPPLE_VALUE, 0);
3751	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
3752
3753	WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, 14);
3754	WREG32(VGT_OUT_DEALLOC_CNTL, 16);
3755
3756	WREG32(CB_PERF_CTR0_SEL_0, 0);
3757	WREG32(CB_PERF_CTR0_SEL_1, 0);
3758	WREG32(CB_PERF_CTR1_SEL_0, 0);
3759	WREG32(CB_PERF_CTR1_SEL_1, 0);
3760	WREG32(CB_PERF_CTR2_SEL_0, 0);
3761	WREG32(CB_PERF_CTR2_SEL_1, 0);
3762	WREG32(CB_PERF_CTR3_SEL_0, 0);
3763	WREG32(CB_PERF_CTR3_SEL_1, 0);
3764
3765	/* clear render buffer base addresses */
3766	WREG32(CB_COLOR0_BASE, 0);
3767	WREG32(CB_COLOR1_BASE, 0);
3768	WREG32(CB_COLOR2_BASE, 0);
3769	WREG32(CB_COLOR3_BASE, 0);
3770	WREG32(CB_COLOR4_BASE, 0);
3771	WREG32(CB_COLOR5_BASE, 0);
3772	WREG32(CB_COLOR6_BASE, 0);
3773	WREG32(CB_COLOR7_BASE, 0);
3774	WREG32(CB_COLOR8_BASE, 0);
3775	WREG32(CB_COLOR9_BASE, 0);
3776	WREG32(CB_COLOR10_BASE, 0);
3777	WREG32(CB_COLOR11_BASE, 0);
3778
3779	/* set the shader const cache sizes to 0 */
3780	for (i = SQ_ALU_CONST_BUFFER_SIZE_PS_0; i < 0x28200; i += 4)
3781		WREG32(i, 0);
3782	for (i = SQ_ALU_CONST_BUFFER_SIZE_HS_0; i < 0x29000; i += 4)
3783		WREG32(i, 0);
3784
3785	tmp = RREG32(HDP_MISC_CNTL);
3786	tmp |= HDP_FLUSH_INVALIDATE_CACHE;
3787	WREG32(HDP_MISC_CNTL, tmp);
3788
3789	hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
3790	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
3791
3792	WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
3793
3794	udelay(50);
3795
3796}
3797
3798int evergreen_mc_init(struct radeon_device *rdev)
3799{
3800	u32 tmp;
3801	int chansize, numchan;
3802
3803	/* Get VRAM informations */
3804	rdev->mc.vram_is_ddr = true;
3805	if ((rdev->family == CHIP_PALM) ||
3806	    (rdev->family == CHIP_SUMO) ||
3807	    (rdev->family == CHIP_SUMO2))
3808		tmp = RREG32(FUS_MC_ARB_RAMCFG);
3809	else
3810		tmp = RREG32(MC_ARB_RAMCFG);
3811	if (tmp & CHANSIZE_OVERRIDE) {
3812		chansize = 16;
3813	} else if (tmp & CHANSIZE_MASK) {
3814		chansize = 64;
3815	} else {
3816		chansize = 32;
3817	}
3818	tmp = RREG32(MC_SHARED_CHMAP);
3819	switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
3820	case 0:
3821	default:
3822		numchan = 1;
3823		break;
3824	case 1:
3825		numchan = 2;
3826		break;
3827	case 2:
3828		numchan = 4;
3829		break;
3830	case 3:
3831		numchan = 8;
3832		break;
3833	}
3834	rdev->mc.vram_width = numchan * chansize;
3835	/* Could aper size report 0 ? */
3836	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
3837	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
3838	/* Setup GPU memory space */
3839	if ((rdev->family == CHIP_PALM) ||
3840	    (rdev->family == CHIP_SUMO) ||
3841	    (rdev->family == CHIP_SUMO2)) {
3842		/* size in bytes on fusion */
3843		rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
3844		rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
3845	} else {
3846		/* size in MB on evergreen/cayman/tn */
3847		rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
3848		rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
3849	}
3850	rdev->mc.visible_vram_size = rdev->mc.aper_size;
3851	r700_vram_gtt_location(rdev, &rdev->mc);
3852	radeon_update_bandwidth_info(rdev);
3853
3854	return 0;
3855}
3856
3857void evergreen_print_gpu_status_regs(struct radeon_device *rdev)
3858{
3859	dev_info(rdev->dev, "  GRBM_STATUS               = 0x%08X\n",
3860		RREG32(GRBM_STATUS));
3861	dev_info(rdev->dev, "  GRBM_STATUS_SE0           = 0x%08X\n",
3862		RREG32(GRBM_STATUS_SE0));
3863	dev_info(rdev->dev, "  GRBM_STATUS_SE1           = 0x%08X\n",
3864		RREG32(GRBM_STATUS_SE1));
3865	dev_info(rdev->dev, "  SRBM_STATUS               = 0x%08X\n",
3866		RREG32(SRBM_STATUS));
3867	dev_info(rdev->dev, "  SRBM_STATUS2              = 0x%08X\n",
3868		RREG32(SRBM_STATUS2));
3869	dev_info(rdev->dev, "  R_008674_CP_STALLED_STAT1 = 0x%08X\n",
3870		RREG32(CP_STALLED_STAT1));
3871	dev_info(rdev->dev, "  R_008678_CP_STALLED_STAT2 = 0x%08X\n",
3872		RREG32(CP_STALLED_STAT2));
3873	dev_info(rdev->dev, "  R_00867C_CP_BUSY_STAT     = 0x%08X\n",
3874		RREG32(CP_BUSY_STAT));
3875	dev_info(rdev->dev, "  R_008680_CP_STAT          = 0x%08X\n",
3876		RREG32(CP_STAT));
3877	dev_info(rdev->dev, "  R_00D034_DMA_STATUS_REG   = 0x%08X\n",
3878		RREG32(DMA_STATUS_REG));
3879	if (rdev->family >= CHIP_CAYMAN) {
3880		dev_info(rdev->dev, "  R_00D834_DMA_STATUS_REG   = 0x%08X\n",
3881			 RREG32(DMA_STATUS_REG + 0x800));
3882	}
3883}
3884
3885bool evergreen_is_display_hung(struct radeon_device *rdev)
3886{
3887	u32 crtc_hung = 0;
3888	u32 crtc_status[6];
3889	u32 i, j, tmp;
3890
3891	for (i = 0; i < rdev->num_crtc; i++) {
3892		if (RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]) & EVERGREEN_CRTC_MASTER_EN) {
3893			crtc_status[i] = RREG32(EVERGREEN_CRTC_STATUS_HV_COUNT + crtc_offsets[i]);
3894			crtc_hung |= (1 << i);
3895		}
3896	}
3897
3898	for (j = 0; j < 10; j++) {
3899		for (i = 0; i < rdev->num_crtc; i++) {
3900			if (crtc_hung & (1 << i)) {
3901				tmp = RREG32(EVERGREEN_CRTC_STATUS_HV_COUNT + crtc_offsets[i]);
3902				if (tmp != crtc_status[i])
3903					crtc_hung &= ~(1 << i);
3904			}
3905		}
3906		if (crtc_hung == 0)
3907			return false;
3908		udelay(100);
3909	}
3910
3911	return true;
3912}
3913
3914u32 evergreen_gpu_check_soft_reset(struct radeon_device *rdev)
3915{
3916	u32 reset_mask = 0;
3917	u32 tmp;
3918
3919	/* GRBM_STATUS */
3920	tmp = RREG32(GRBM_STATUS);
3921	if (tmp & (PA_BUSY | SC_BUSY |
3922		   SH_BUSY | SX_BUSY |
3923		   TA_BUSY | VGT_BUSY |
3924		   DB_BUSY | CB_BUSY |
3925		   SPI_BUSY | VGT_BUSY_NO_DMA))
3926		reset_mask |= RADEON_RESET_GFX;
3927
3928	if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING |
3929		   CP_BUSY | CP_COHERENCY_BUSY))
3930		reset_mask |= RADEON_RESET_CP;
3931
3932	if (tmp & GRBM_EE_BUSY)
3933		reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
3934
3935	/* DMA_STATUS_REG */
3936	tmp = RREG32(DMA_STATUS_REG);
3937	if (!(tmp & DMA_IDLE))
3938		reset_mask |= RADEON_RESET_DMA;
3939
3940	/* SRBM_STATUS2 */
3941	tmp = RREG32(SRBM_STATUS2);
3942	if (tmp & DMA_BUSY)
3943		reset_mask |= RADEON_RESET_DMA;
3944
3945	/* SRBM_STATUS */
3946	tmp = RREG32(SRBM_STATUS);
3947	if (tmp & (RLC_RQ_PENDING | RLC_BUSY))
3948		reset_mask |= RADEON_RESET_RLC;
3949
3950	if (tmp & IH_BUSY)
3951		reset_mask |= RADEON_RESET_IH;
3952
3953	if (tmp & SEM_BUSY)
3954		reset_mask |= RADEON_RESET_SEM;
3955
3956	if (tmp & GRBM_RQ_PENDING)
3957		reset_mask |= RADEON_RESET_GRBM;
3958
3959	if (tmp & VMC_BUSY)
3960		reset_mask |= RADEON_RESET_VMC;
3961
3962	if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
3963		   MCC_BUSY | MCD_BUSY))
3964		reset_mask |= RADEON_RESET_MC;
3965
3966	if (evergreen_is_display_hung(rdev))
3967		reset_mask |= RADEON_RESET_DISPLAY;
3968
3969	/* VM_L2_STATUS */
3970	tmp = RREG32(VM_L2_STATUS);
3971	if (tmp & L2_BUSY)
3972		reset_mask |= RADEON_RESET_VMC;
3973
3974	/* Skip MC reset as it's mostly likely not hung, just busy */
3975	if (reset_mask & RADEON_RESET_MC) {
3976		DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
3977		reset_mask &= ~RADEON_RESET_MC;
3978	}
3979
3980	return reset_mask;
3981}
3982
3983static void evergreen_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
3984{
3985	struct evergreen_mc_save save;
3986	u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
3987	u32 tmp;
3988
3989	if (reset_mask == 0)
3990		return;
3991
3992	dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
3993
3994	evergreen_print_gpu_status_regs(rdev);
3995
3996	/* Disable CP parsing/prefetching */
3997	WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
3998
3999	if (reset_mask & RADEON_RESET_DMA) {
4000		/* Disable DMA */
4001		tmp = RREG32(DMA_RB_CNTL);
4002		tmp &= ~DMA_RB_ENABLE;
4003		WREG32(DMA_RB_CNTL, tmp);
4004	}
4005
4006	udelay(50);
4007
4008	evergreen_mc_stop(rdev, &save);
4009	if (evergreen_mc_wait_for_idle(rdev)) {
4010		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
4011	}
4012
4013	if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) {
4014		grbm_soft_reset |= SOFT_RESET_DB |
4015			SOFT_RESET_CB |
4016			SOFT_RESET_PA |
4017			SOFT_RESET_SC |
4018			SOFT_RESET_SPI |
4019			SOFT_RESET_SX |
4020			SOFT_RESET_SH |
4021			SOFT_RESET_TC |
4022			SOFT_RESET_TA |
4023			SOFT_RESET_VC |
4024			SOFT_RESET_VGT;
4025	}
4026
4027	if (reset_mask & RADEON_RESET_CP) {
4028		grbm_soft_reset |= SOFT_RESET_CP |
4029			SOFT_RESET_VGT;
4030
4031		srbm_soft_reset |= SOFT_RESET_GRBM;
4032	}
4033
4034	if (reset_mask & RADEON_RESET_DMA)
4035		srbm_soft_reset |= SOFT_RESET_DMA;
4036
4037	if (reset_mask & RADEON_RESET_DISPLAY)
4038		srbm_soft_reset |= SOFT_RESET_DC;
4039
4040	if (reset_mask & RADEON_RESET_RLC)
4041		srbm_soft_reset |= SOFT_RESET_RLC;
4042
4043	if (reset_mask & RADEON_RESET_SEM)
4044		srbm_soft_reset |= SOFT_RESET_SEM;
4045
4046	if (reset_mask & RADEON_RESET_IH)
4047		srbm_soft_reset |= SOFT_RESET_IH;
4048
4049	if (reset_mask & RADEON_RESET_GRBM)
4050		srbm_soft_reset |= SOFT_RESET_GRBM;
4051
4052	if (reset_mask & RADEON_RESET_VMC)
4053		srbm_soft_reset |= SOFT_RESET_VMC;
4054
4055	if (!(rdev->flags & RADEON_IS_IGP)) {
4056		if (reset_mask & RADEON_RESET_MC)
4057			srbm_soft_reset |= SOFT_RESET_MC;
4058	}
4059
4060	if (grbm_soft_reset) {
4061		tmp = RREG32(GRBM_SOFT_RESET);
4062		tmp |= grbm_soft_reset;
4063		dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
4064		WREG32(GRBM_SOFT_RESET, tmp);
4065		tmp = RREG32(GRBM_SOFT_RESET);
4066
4067		udelay(50);
4068
4069		tmp &= ~grbm_soft_reset;
4070		WREG32(GRBM_SOFT_RESET, tmp);
4071		tmp = RREG32(GRBM_SOFT_RESET);
4072	}
4073
4074	if (srbm_soft_reset) {
4075		tmp = RREG32(SRBM_SOFT_RESET);
4076		tmp |= srbm_soft_reset;
4077		dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
4078		WREG32(SRBM_SOFT_RESET, tmp);
4079		tmp = RREG32(SRBM_SOFT_RESET);
4080
4081		udelay(50);
4082
4083		tmp &= ~srbm_soft_reset;
4084		WREG32(SRBM_SOFT_RESET, tmp);
4085		tmp = RREG32(SRBM_SOFT_RESET);
4086	}
4087
4088	/* Wait a little for things to settle down */
4089	udelay(50);
4090
4091	evergreen_mc_resume(rdev, &save);
4092	udelay(50);
4093
4094	evergreen_print_gpu_status_regs(rdev);
4095}
4096
4097void evergreen_gpu_pci_config_reset(struct radeon_device *rdev)
4098{
4099	struct evergreen_mc_save save;
4100	u32 tmp, i;
4101
4102	dev_info(rdev->dev, "GPU pci config reset\n");
4103
4104	/* disable dpm? */
4105
4106	/* Disable CP parsing/prefetching */
4107	WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
4108	udelay(50);
4109	/* Disable DMA */
4110	tmp = RREG32(DMA_RB_CNTL);
4111	tmp &= ~DMA_RB_ENABLE;
4112	WREG32(DMA_RB_CNTL, tmp);
4113	/* XXX other engines? */
4114
4115	/* halt the rlc */
4116	r600_rlc_stop(rdev);
4117
4118	udelay(50);
4119
4120	/* set mclk/sclk to bypass */
4121	rv770_set_clk_bypass_mode(rdev);
4122	/* disable BM */
4123	pci_clear_master(rdev->pdev);
4124	/* disable mem access */
4125	evergreen_mc_stop(rdev, &save);
4126	if (evergreen_mc_wait_for_idle(rdev)) {
4127		dev_warn(rdev->dev, "Wait for MC idle timed out !\n");
4128	}
4129	/* reset */
4130	radeon_pci_config_reset(rdev);
4131	/* wait for asic to come out of reset */
4132	for (i = 0; i < rdev->usec_timeout; i++) {
4133		if (RREG32(CONFIG_MEMSIZE) != 0xffffffff)
4134			break;
4135		udelay(1);
4136	}
4137}
4138
4139int evergreen_asic_reset(struct radeon_device *rdev)
4140{
4141	u32 reset_mask;
4142
 
 
 
 
 
4143	reset_mask = evergreen_gpu_check_soft_reset(rdev);
4144
4145	if (reset_mask)
4146		r600_set_bios_scratch_engine_hung(rdev, true);
4147
4148	/* try soft reset */
4149	evergreen_gpu_soft_reset(rdev, reset_mask);
4150
4151	reset_mask = evergreen_gpu_check_soft_reset(rdev);
4152
4153	/* try pci config reset */
4154	if (reset_mask && radeon_hard_reset)
4155		evergreen_gpu_pci_config_reset(rdev);
4156
4157	reset_mask = evergreen_gpu_check_soft_reset(rdev);
4158
4159	if (!reset_mask)
4160		r600_set_bios_scratch_engine_hung(rdev, false);
4161
4162	return 0;
4163}
4164
4165/**
4166 * evergreen_gfx_is_lockup - Check if the GFX engine is locked up
4167 *
4168 * @rdev: radeon_device pointer
4169 * @ring: radeon_ring structure holding ring information
4170 *
4171 * Check if the GFX engine is locked up.
4172 * Returns true if the engine appears to be locked up, false if not.
4173 */
4174bool evergreen_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
4175{
4176	u32 reset_mask = evergreen_gpu_check_soft_reset(rdev);
4177
4178	if (!(reset_mask & (RADEON_RESET_GFX |
4179			    RADEON_RESET_COMPUTE |
4180			    RADEON_RESET_CP))) {
4181		radeon_ring_lockup_update(rdev, ring);
4182		return false;
4183	}
4184	return radeon_ring_test_lockup(rdev, ring);
4185}
4186
4187/*
4188 * RLC
4189 */
4190#define RLC_SAVE_RESTORE_LIST_END_MARKER    0x00000000
4191#define RLC_CLEAR_STATE_END_MARKER          0x00000001
4192
4193void sumo_rlc_fini(struct radeon_device *rdev)
4194{
4195	int r;
4196
4197	/* save restore block */
4198	if (rdev->rlc.save_restore_obj) {
4199		r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
4200		if (unlikely(r != 0))
4201			dev_warn(rdev->dev, "(%d) reserve RLC sr bo failed\n", r);
4202		radeon_bo_unpin(rdev->rlc.save_restore_obj);
4203		radeon_bo_unreserve(rdev->rlc.save_restore_obj);
4204
4205		radeon_bo_unref(&rdev->rlc.save_restore_obj);
4206		rdev->rlc.save_restore_obj = NULL;
4207	}
4208
4209	/* clear state block */
4210	if (rdev->rlc.clear_state_obj) {
4211		r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
4212		if (unlikely(r != 0))
4213			dev_warn(rdev->dev, "(%d) reserve RLC c bo failed\n", r);
4214		radeon_bo_unpin(rdev->rlc.clear_state_obj);
4215		radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4216
4217		radeon_bo_unref(&rdev->rlc.clear_state_obj);
4218		rdev->rlc.clear_state_obj = NULL;
4219	}
4220
4221	/* clear state block */
4222	if (rdev->rlc.cp_table_obj) {
4223		r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false);
4224		if (unlikely(r != 0))
4225			dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r);
4226		radeon_bo_unpin(rdev->rlc.cp_table_obj);
4227		radeon_bo_unreserve(rdev->rlc.cp_table_obj);
4228
4229		radeon_bo_unref(&rdev->rlc.cp_table_obj);
4230		rdev->rlc.cp_table_obj = NULL;
4231	}
4232}
4233
4234#define CP_ME_TABLE_SIZE    96
4235
4236int sumo_rlc_init(struct radeon_device *rdev)
4237{
4238	const u32 *src_ptr;
4239	volatile u32 *dst_ptr;
4240	u32 dws, data, i, j, k, reg_num;
4241	u32 reg_list_num, reg_list_hdr_blk_index, reg_list_blk_index = 0;
4242	u64 reg_list_mc_addr;
4243	const struct cs_section_def *cs_data;
4244	int r;
4245
4246	src_ptr = rdev->rlc.reg_list;
4247	dws = rdev->rlc.reg_list_size;
4248	if (rdev->family >= CHIP_BONAIRE) {
4249		dws += (5 * 16) + 48 + 48 + 64;
4250	}
4251	cs_data = rdev->rlc.cs_data;
4252
4253	if (src_ptr) {
4254		/* save restore block */
4255		if (rdev->rlc.save_restore_obj == NULL) {
4256			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
4257					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
4258					     NULL, &rdev->rlc.save_restore_obj);
4259			if (r) {
4260				dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
4261				return r;
4262			}
4263		}
4264
4265		r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
4266		if (unlikely(r != 0)) {
4267			sumo_rlc_fini(rdev);
4268			return r;
4269		}
4270		r = radeon_bo_pin(rdev->rlc.save_restore_obj, RADEON_GEM_DOMAIN_VRAM,
4271				  &rdev->rlc.save_restore_gpu_addr);
4272		if (r) {
4273			radeon_bo_unreserve(rdev->rlc.save_restore_obj);
4274			dev_warn(rdev->dev, "(%d) pin RLC sr bo failed\n", r);
4275			sumo_rlc_fini(rdev);
4276			return r;
4277		}
4278
4279		r = radeon_bo_kmap(rdev->rlc.save_restore_obj, (void **)&rdev->rlc.sr_ptr);
4280		if (r) {
4281			dev_warn(rdev->dev, "(%d) map RLC sr bo failed\n", r);
4282			sumo_rlc_fini(rdev);
4283			return r;
4284		}
4285		/* write the sr buffer */
4286		dst_ptr = rdev->rlc.sr_ptr;
4287		if (rdev->family >= CHIP_TAHITI) {
4288			/* SI */
4289			for (i = 0; i < rdev->rlc.reg_list_size; i++)
4290				dst_ptr[i] = cpu_to_le32(src_ptr[i]);
4291		} else {
4292			/* ON/LN/TN */
4293			/* format:
4294			 * dw0: (reg2 << 16) | reg1
4295			 * dw1: reg1 save space
4296			 * dw2: reg2 save space
4297			 */
4298			for (i = 0; i < dws; i++) {
4299				data = src_ptr[i] >> 2;
4300				i++;
4301				if (i < dws)
4302					data |= (src_ptr[i] >> 2) << 16;
4303				j = (((i - 1) * 3) / 2);
4304				dst_ptr[j] = cpu_to_le32(data);
4305			}
4306			j = ((i * 3) / 2);
4307			dst_ptr[j] = cpu_to_le32(RLC_SAVE_RESTORE_LIST_END_MARKER);
4308		}
4309		radeon_bo_kunmap(rdev->rlc.save_restore_obj);
4310		radeon_bo_unreserve(rdev->rlc.save_restore_obj);
4311	}
4312
4313	if (cs_data) {
4314		/* clear state block */
4315		if (rdev->family >= CHIP_BONAIRE) {
4316			rdev->rlc.clear_state_size = dws = cik_get_csb_size(rdev);
4317		} else if (rdev->family >= CHIP_TAHITI) {
4318			rdev->rlc.clear_state_size = si_get_csb_size(rdev);
4319			dws = rdev->rlc.clear_state_size + (256 / 4);
4320		} else {
4321			reg_list_num = 0;
4322			dws = 0;
4323			for (i = 0; cs_data[i].section != NULL; i++) {
4324				for (j = 0; cs_data[i].section[j].extent != NULL; j++) {
4325					reg_list_num++;
4326					dws += cs_data[i].section[j].reg_count;
4327				}
4328			}
4329			reg_list_blk_index = (3 * reg_list_num + 2);
4330			dws += reg_list_blk_index;
4331			rdev->rlc.clear_state_size = dws;
4332		}
4333
4334		if (rdev->rlc.clear_state_obj == NULL) {
4335			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
4336					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
4337					     NULL, &rdev->rlc.clear_state_obj);
4338			if (r) {
4339				dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
4340				sumo_rlc_fini(rdev);
4341				return r;
4342			}
4343		}
4344		r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
4345		if (unlikely(r != 0)) {
4346			sumo_rlc_fini(rdev);
4347			return r;
4348		}
4349		r = radeon_bo_pin(rdev->rlc.clear_state_obj, RADEON_GEM_DOMAIN_VRAM,
4350				  &rdev->rlc.clear_state_gpu_addr);
4351		if (r) {
4352			radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4353			dev_warn(rdev->dev, "(%d) pin RLC c bo failed\n", r);
4354			sumo_rlc_fini(rdev);
4355			return r;
4356		}
4357
4358		r = radeon_bo_kmap(rdev->rlc.clear_state_obj, (void **)&rdev->rlc.cs_ptr);
4359		if (r) {
4360			dev_warn(rdev->dev, "(%d) map RLC c bo failed\n", r);
4361			sumo_rlc_fini(rdev);
4362			return r;
4363		}
4364		/* set up the cs buffer */
4365		dst_ptr = rdev->rlc.cs_ptr;
4366		if (rdev->family >= CHIP_BONAIRE) {
4367			cik_get_csb_buffer(rdev, dst_ptr);
4368		} else if (rdev->family >= CHIP_TAHITI) {
4369			reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + 256;
4370			dst_ptr[0] = cpu_to_le32(upper_32_bits(reg_list_mc_addr));
4371			dst_ptr[1] = cpu_to_le32(lower_32_bits(reg_list_mc_addr));
4372			dst_ptr[2] = cpu_to_le32(rdev->rlc.clear_state_size);
4373			si_get_csb_buffer(rdev, &dst_ptr[(256/4)]);
4374		} else {
4375			reg_list_hdr_blk_index = 0;
4376			reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + (reg_list_blk_index * 4);
4377			data = upper_32_bits(reg_list_mc_addr);
4378			dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4379			reg_list_hdr_blk_index++;
4380			for (i = 0; cs_data[i].section != NULL; i++) {
4381				for (j = 0; cs_data[i].section[j].extent != NULL; j++) {
4382					reg_num = cs_data[i].section[j].reg_count;
4383					data = reg_list_mc_addr & 0xffffffff;
4384					dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4385					reg_list_hdr_blk_index++;
4386
4387					data = (cs_data[i].section[j].reg_index * 4) & 0xffffffff;
4388					dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4389					reg_list_hdr_blk_index++;
4390
4391					data = 0x08000000 | (reg_num * 4);
4392					dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4393					reg_list_hdr_blk_index++;
4394
4395					for (k = 0; k < reg_num; k++) {
4396						data = cs_data[i].section[j].extent[k];
4397						dst_ptr[reg_list_blk_index + k] = cpu_to_le32(data);
4398					}
4399					reg_list_mc_addr += reg_num * 4;
4400					reg_list_blk_index += reg_num;
4401				}
4402			}
4403			dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(RLC_CLEAR_STATE_END_MARKER);
4404		}
4405		radeon_bo_kunmap(rdev->rlc.clear_state_obj);
4406		radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4407	}
4408
4409	if (rdev->rlc.cp_table_size) {
4410		if (rdev->rlc.cp_table_obj == NULL) {
4411			r = radeon_bo_create(rdev, rdev->rlc.cp_table_size,
4412					     PAGE_SIZE, true,
4413					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
4414					     NULL, &rdev->rlc.cp_table_obj);
4415			if (r) {
4416				dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r);
4417				sumo_rlc_fini(rdev);
4418				return r;
4419			}
4420		}
4421
4422		r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false);
4423		if (unlikely(r != 0)) {
4424			dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r);
4425			sumo_rlc_fini(rdev);
4426			return r;
4427		}
4428		r = radeon_bo_pin(rdev->rlc.cp_table_obj, RADEON_GEM_DOMAIN_VRAM,
4429				  &rdev->rlc.cp_table_gpu_addr);
4430		if (r) {
4431			radeon_bo_unreserve(rdev->rlc.cp_table_obj);
4432			dev_warn(rdev->dev, "(%d) pin RLC cp_table bo failed\n", r);
4433			sumo_rlc_fini(rdev);
4434			return r;
4435		}
4436		r = radeon_bo_kmap(rdev->rlc.cp_table_obj, (void **)&rdev->rlc.cp_table_ptr);
4437		if (r) {
4438			dev_warn(rdev->dev, "(%d) map RLC cp table bo failed\n", r);
4439			sumo_rlc_fini(rdev);
4440			return r;
4441		}
4442
4443		cik_init_cp_pg_table(rdev);
4444
4445		radeon_bo_kunmap(rdev->rlc.cp_table_obj);
4446		radeon_bo_unreserve(rdev->rlc.cp_table_obj);
4447
4448	}
4449
4450	return 0;
4451}
4452
4453static void evergreen_rlc_start(struct radeon_device *rdev)
4454{
4455	u32 mask = RLC_ENABLE;
4456
4457	if (rdev->flags & RADEON_IS_IGP) {
4458		mask |= GFX_POWER_GATING_ENABLE | GFX_POWER_GATING_SRC;
4459	}
4460
4461	WREG32(RLC_CNTL, mask);
4462}
4463
4464int evergreen_rlc_resume(struct radeon_device *rdev)
4465{
4466	u32 i;
4467	const __be32 *fw_data;
4468
4469	if (!rdev->rlc_fw)
4470		return -EINVAL;
4471
4472	r600_rlc_stop(rdev);
4473
4474	WREG32(RLC_HB_CNTL, 0);
4475
4476	if (rdev->flags & RADEON_IS_IGP) {
4477		if (rdev->family == CHIP_ARUBA) {
4478			u32 always_on_bitmap =
4479				3 | (3 << (16 * rdev->config.cayman.max_shader_engines));
4480			/* find out the number of active simds */
4481			u32 tmp = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
4482			tmp |= 0xffffffff << rdev->config.cayman.max_simds_per_se;
4483			tmp = hweight32(~tmp);
4484			if (tmp == rdev->config.cayman.max_simds_per_se) {
4485				WREG32(TN_RLC_LB_ALWAYS_ACTIVE_SIMD_MASK, always_on_bitmap);
4486				WREG32(TN_RLC_LB_PARAMS, 0x00601004);
4487				WREG32(TN_RLC_LB_INIT_SIMD_MASK, 0xffffffff);
4488				WREG32(TN_RLC_LB_CNTR_INIT, 0x00000000);
4489				WREG32(TN_RLC_LB_CNTR_MAX, 0x00002000);
4490			}
4491		} else {
4492			WREG32(RLC_HB_WPTR_LSB_ADDR, 0);
4493			WREG32(RLC_HB_WPTR_MSB_ADDR, 0);
4494		}
4495		WREG32(TN_RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
4496		WREG32(TN_RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8);
4497	} else {
4498		WREG32(RLC_HB_BASE, 0);
4499		WREG32(RLC_HB_RPTR, 0);
4500		WREG32(RLC_HB_WPTR, 0);
4501		WREG32(RLC_HB_WPTR_LSB_ADDR, 0);
4502		WREG32(RLC_HB_WPTR_MSB_ADDR, 0);
4503	}
4504	WREG32(RLC_MC_CNTL, 0);
4505	WREG32(RLC_UCODE_CNTL, 0);
4506
4507	fw_data = (const __be32 *)rdev->rlc_fw->data;
4508	if (rdev->family >= CHIP_ARUBA) {
4509		for (i = 0; i < ARUBA_RLC_UCODE_SIZE; i++) {
4510			WREG32(RLC_UCODE_ADDR, i);
4511			WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
4512		}
4513	} else if (rdev->family >= CHIP_CAYMAN) {
4514		for (i = 0; i < CAYMAN_RLC_UCODE_SIZE; i++) {
4515			WREG32(RLC_UCODE_ADDR, i);
4516			WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
4517		}
4518	} else {
4519		for (i = 0; i < EVERGREEN_RLC_UCODE_SIZE; i++) {
4520			WREG32(RLC_UCODE_ADDR, i);
4521			WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
4522		}
4523	}
4524	WREG32(RLC_UCODE_ADDR, 0);
4525
4526	evergreen_rlc_start(rdev);
4527
4528	return 0;
4529}
4530
4531/* Interrupts */
4532
4533u32 evergreen_get_vblank_counter(struct radeon_device *rdev, int crtc)
4534{
4535	if (crtc >= rdev->num_crtc)
4536		return 0;
4537	else
4538		return RREG32(CRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]);
4539}
4540
4541void evergreen_disable_interrupt_state(struct radeon_device *rdev)
4542{
 
4543	u32 tmp;
4544
4545	if (rdev->family >= CHIP_CAYMAN) {
4546		cayman_cp_int_cntl_setup(rdev, 0,
4547					 CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
4548		cayman_cp_int_cntl_setup(rdev, 1, 0);
4549		cayman_cp_int_cntl_setup(rdev, 2, 0);
4550		tmp = RREG32(CAYMAN_DMA1_CNTL) & ~TRAP_ENABLE;
4551		WREG32(CAYMAN_DMA1_CNTL, tmp);
4552	} else
4553		WREG32(CP_INT_CNTL, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
4554	tmp = RREG32(DMA_CNTL) & ~TRAP_ENABLE;
4555	WREG32(DMA_CNTL, tmp);
4556	WREG32(GRBM_INT_CNTL, 0);
4557	WREG32(SRBM_INT_CNTL, 0);
4558	WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
4559	WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
4560	if (rdev->num_crtc >= 4) {
4561		WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
4562		WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
4563	}
4564	if (rdev->num_crtc >= 6) {
4565		WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
4566		WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
4567	}
4568
4569	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
4570	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
4571	if (rdev->num_crtc >= 4) {
4572		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
4573		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
4574	}
4575	if (rdev->num_crtc >= 6) {
4576		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
4577		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
4578	}
4579
4580	/* only one DAC on DCE5 */
4581	if (!ASIC_IS_DCE5(rdev))
4582		WREG32(DACA_AUTODETECT_INT_CONTROL, 0);
4583	WREG32(DACB_AUTODETECT_INT_CONTROL, 0);
4584
4585	tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4586	WREG32(DC_HPD1_INT_CONTROL, tmp);
4587	tmp = RREG32(DC_HPD2_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4588	WREG32(DC_HPD2_INT_CONTROL, tmp);
4589	tmp = RREG32(DC_HPD3_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4590	WREG32(DC_HPD3_INT_CONTROL, tmp);
4591	tmp = RREG32(DC_HPD4_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4592	WREG32(DC_HPD4_INT_CONTROL, tmp);
4593	tmp = RREG32(DC_HPD5_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4594	WREG32(DC_HPD5_INT_CONTROL, tmp);
4595	tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4596	WREG32(DC_HPD6_INT_CONTROL, tmp);
4597
4598}
4599
 
4600int evergreen_irq_set(struct radeon_device *rdev)
4601{
 
4602	u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE;
4603	u32 cp_int_cntl1 = 0, cp_int_cntl2 = 0;
4604	u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
4605	u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
4606	u32 grbm_int_cntl = 0;
4607	u32 afmt1 = 0, afmt2 = 0, afmt3 = 0, afmt4 = 0, afmt5 = 0, afmt6 = 0;
4608	u32 dma_cntl, dma_cntl1 = 0;
4609	u32 thermal_int = 0;
4610
4611	if (!rdev->irq.installed) {
4612		WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
4613		return -EINVAL;
4614	}
4615	/* don't enable anything if the ih is disabled */
4616	if (!rdev->ih.enabled) {
4617		r600_disable_interrupts(rdev);
4618		/* force the active interrupt state to all disabled */
4619		evergreen_disable_interrupt_state(rdev);
4620		return 0;
4621	}
4622
4623	hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
4624	hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
4625	hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
4626	hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
4627	hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
4628	hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
4629	if (rdev->family == CHIP_ARUBA)
4630		thermal_int = RREG32(TN_CG_THERMAL_INT_CTRL) &
4631			~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
4632	else
4633		thermal_int = RREG32(CG_THERMAL_INT) &
4634			~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
4635
4636	afmt1 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
4637	afmt2 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
4638	afmt3 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
4639	afmt4 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
4640	afmt5 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
4641	afmt6 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
4642
4643	dma_cntl = RREG32(DMA_CNTL) & ~TRAP_ENABLE;
4644
4645	if (rdev->family >= CHIP_CAYMAN) {
4646		/* enable CP interrupts on all rings */
4647		if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
4648			DRM_DEBUG("evergreen_irq_set: sw int gfx\n");
4649			cp_int_cntl |= TIME_STAMP_INT_ENABLE;
4650		}
4651		if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP1_INDEX])) {
4652			DRM_DEBUG("evergreen_irq_set: sw int cp1\n");
4653			cp_int_cntl1 |= TIME_STAMP_INT_ENABLE;
4654		}
4655		if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP2_INDEX])) {
4656			DRM_DEBUG("evergreen_irq_set: sw int cp2\n");
4657			cp_int_cntl2 |= TIME_STAMP_INT_ENABLE;
4658		}
4659	} else {
4660		if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
4661			DRM_DEBUG("evergreen_irq_set: sw int gfx\n");
4662			cp_int_cntl |= RB_INT_ENABLE;
4663			cp_int_cntl |= TIME_STAMP_INT_ENABLE;
4664		}
4665	}
4666
4667	if (atomic_read(&rdev->irq.ring_int[R600_RING_TYPE_DMA_INDEX])) {
4668		DRM_DEBUG("r600_irq_set: sw int dma\n");
4669		dma_cntl |= TRAP_ENABLE;
4670	}
4671
4672	if (rdev->family >= CHIP_CAYMAN) {
4673		dma_cntl1 = RREG32(CAYMAN_DMA1_CNTL) & ~TRAP_ENABLE;
4674		if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_DMA1_INDEX])) {
4675			DRM_DEBUG("r600_irq_set: sw int dma1\n");
4676			dma_cntl1 |= TRAP_ENABLE;
4677		}
4678	}
4679
4680	if (rdev->irq.dpm_thermal) {
4681		DRM_DEBUG("dpm thermal\n");
4682		thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
4683	}
4684
4685	if (rdev->irq.crtc_vblank_int[0] ||
4686	    atomic_read(&rdev->irq.pflip[0])) {
4687		DRM_DEBUG("evergreen_irq_set: vblank 0\n");
4688		crtc1 |= VBLANK_INT_MASK;
4689	}
4690	if (rdev->irq.crtc_vblank_int[1] ||
4691	    atomic_read(&rdev->irq.pflip[1])) {
4692		DRM_DEBUG("evergreen_irq_set: vblank 1\n");
4693		crtc2 |= VBLANK_INT_MASK;
4694	}
4695	if (rdev->irq.crtc_vblank_int[2] ||
4696	    atomic_read(&rdev->irq.pflip[2])) {
4697		DRM_DEBUG("evergreen_irq_set: vblank 2\n");
4698		crtc3 |= VBLANK_INT_MASK;
4699	}
4700	if (rdev->irq.crtc_vblank_int[3] ||
4701	    atomic_read(&rdev->irq.pflip[3])) {
4702		DRM_DEBUG("evergreen_irq_set: vblank 3\n");
4703		crtc4 |= VBLANK_INT_MASK;
4704	}
4705	if (rdev->irq.crtc_vblank_int[4] ||
4706	    atomic_read(&rdev->irq.pflip[4])) {
4707		DRM_DEBUG("evergreen_irq_set: vblank 4\n");
4708		crtc5 |= VBLANK_INT_MASK;
4709	}
4710	if (rdev->irq.crtc_vblank_int[5] ||
4711	    atomic_read(&rdev->irq.pflip[5])) {
4712		DRM_DEBUG("evergreen_irq_set: vblank 5\n");
4713		crtc6 |= VBLANK_INT_MASK;
4714	}
4715	if (rdev->irq.hpd[0]) {
4716		DRM_DEBUG("evergreen_irq_set: hpd 1\n");
4717		hpd1 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
4718	}
4719	if (rdev->irq.hpd[1]) {
4720		DRM_DEBUG("evergreen_irq_set: hpd 2\n");
4721		hpd2 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
4722	}
4723	if (rdev->irq.hpd[2]) {
4724		DRM_DEBUG("evergreen_irq_set: hpd 3\n");
4725		hpd3 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
4726	}
4727	if (rdev->irq.hpd[3]) {
4728		DRM_DEBUG("evergreen_irq_set: hpd 4\n");
4729		hpd4 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
4730	}
4731	if (rdev->irq.hpd[4]) {
4732		DRM_DEBUG("evergreen_irq_set: hpd 5\n");
4733		hpd5 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
4734	}
4735	if (rdev->irq.hpd[5]) {
4736		DRM_DEBUG("evergreen_irq_set: hpd 6\n");
4737		hpd6 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
4738	}
4739	if (rdev->irq.afmt[0]) {
4740		DRM_DEBUG("evergreen_irq_set: hdmi 0\n");
4741		afmt1 |= AFMT_AZ_FORMAT_WTRIG_MASK;
4742	}
4743	if (rdev->irq.afmt[1]) {
4744		DRM_DEBUG("evergreen_irq_set: hdmi 1\n");
4745		afmt2 |= AFMT_AZ_FORMAT_WTRIG_MASK;
4746	}
4747	if (rdev->irq.afmt[2]) {
4748		DRM_DEBUG("evergreen_irq_set: hdmi 2\n");
4749		afmt3 |= AFMT_AZ_FORMAT_WTRIG_MASK;
4750	}
4751	if (rdev->irq.afmt[3]) {
4752		DRM_DEBUG("evergreen_irq_set: hdmi 3\n");
4753		afmt4 |= AFMT_AZ_FORMAT_WTRIG_MASK;
4754	}
4755	if (rdev->irq.afmt[4]) {
4756		DRM_DEBUG("evergreen_irq_set: hdmi 4\n");
4757		afmt5 |= AFMT_AZ_FORMAT_WTRIG_MASK;
4758	}
4759	if (rdev->irq.afmt[5]) {
4760		DRM_DEBUG("evergreen_irq_set: hdmi 5\n");
4761		afmt6 |= AFMT_AZ_FORMAT_WTRIG_MASK;
4762	}
4763
4764	if (rdev->family >= CHIP_CAYMAN) {
4765		cayman_cp_int_cntl_setup(rdev, 0, cp_int_cntl);
4766		cayman_cp_int_cntl_setup(rdev, 1, cp_int_cntl1);
4767		cayman_cp_int_cntl_setup(rdev, 2, cp_int_cntl2);
4768	} else
4769		WREG32(CP_INT_CNTL, cp_int_cntl);
4770
4771	WREG32(DMA_CNTL, dma_cntl);
4772
4773	if (rdev->family >= CHIP_CAYMAN)
4774		WREG32(CAYMAN_DMA1_CNTL, dma_cntl1);
4775
4776	WREG32(GRBM_INT_CNTL, grbm_int_cntl);
4777
4778	WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
4779	WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2);
4780	if (rdev->num_crtc >= 4) {
4781		WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3);
4782		WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4);
4783	}
4784	if (rdev->num_crtc >= 6) {
4785		WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);
4786		WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
4787	}
4788
4789	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET,
4790	       GRPH_PFLIP_INT_MASK);
4791	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET,
4792	       GRPH_PFLIP_INT_MASK);
4793	if (rdev->num_crtc >= 4) {
4794		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET,
4795		       GRPH_PFLIP_INT_MASK);
4796		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET,
4797		       GRPH_PFLIP_INT_MASK);
4798	}
4799	if (rdev->num_crtc >= 6) {
4800		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET,
4801		       GRPH_PFLIP_INT_MASK);
4802		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET,
4803		       GRPH_PFLIP_INT_MASK);
4804	}
4805
4806	WREG32(DC_HPD1_INT_CONTROL, hpd1);
4807	WREG32(DC_HPD2_INT_CONTROL, hpd2);
4808	WREG32(DC_HPD3_INT_CONTROL, hpd3);
4809	WREG32(DC_HPD4_INT_CONTROL, hpd4);
4810	WREG32(DC_HPD5_INT_CONTROL, hpd5);
4811	WREG32(DC_HPD6_INT_CONTROL, hpd6);
4812	if (rdev->family == CHIP_ARUBA)
4813		WREG32(TN_CG_THERMAL_INT_CTRL, thermal_int);
4814	else
4815		WREG32(CG_THERMAL_INT, thermal_int);
4816
4817	WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, afmt1);
4818	WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, afmt2);
4819	WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, afmt3);
4820	WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, afmt4);
4821	WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, afmt5);
4822	WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, afmt6);
4823
4824	/* posting read */
4825	RREG32(SRBM_STATUS);
4826
4827	return 0;
4828}
4829
 
4830static void evergreen_irq_ack(struct radeon_device *rdev)
4831{
4832	u32 tmp;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4833
4834	rdev->irq.stat_regs.evergreen.disp_int = RREG32(DISP_INTERRUPT_STATUS);
4835	rdev->irq.stat_regs.evergreen.disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE);
4836	rdev->irq.stat_regs.evergreen.disp_int_cont2 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE2);
4837	rdev->irq.stat_regs.evergreen.disp_int_cont3 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE3);
4838	rdev->irq.stat_regs.evergreen.disp_int_cont4 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE4);
4839	rdev->irq.stat_regs.evergreen.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);
4840	rdev->irq.stat_regs.evergreen.d1grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET);
4841	rdev->irq.stat_regs.evergreen.d2grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET);
4842	if (rdev->num_crtc >= 4) {
4843		rdev->irq.stat_regs.evergreen.d3grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET);
4844		rdev->irq.stat_regs.evergreen.d4grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET);
4845	}
4846	if (rdev->num_crtc >= 6) {
4847		rdev->irq.stat_regs.evergreen.d5grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET);
4848		rdev->irq.stat_regs.evergreen.d6grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET);
4849	}
4850
4851	rdev->irq.stat_regs.evergreen.afmt_status1 = RREG32(AFMT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET);
4852	rdev->irq.stat_regs.evergreen.afmt_status2 = RREG32(AFMT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET);
4853	rdev->irq.stat_regs.evergreen.afmt_status3 = RREG32(AFMT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET);
4854	rdev->irq.stat_regs.evergreen.afmt_status4 = RREG32(AFMT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET);
4855	rdev->irq.stat_regs.evergreen.afmt_status5 = RREG32(AFMT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET);
4856	rdev->irq.stat_regs.evergreen.afmt_status6 = RREG32(AFMT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET);
4857
4858	if (rdev->irq.stat_regs.evergreen.d1grph_int & GRPH_PFLIP_INT_OCCURRED)
4859		WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4860	if (rdev->irq.stat_regs.evergreen.d2grph_int & GRPH_PFLIP_INT_OCCURRED)
4861		WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4862	if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT)
4863		WREG32(VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);
4864	if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT)
4865		WREG32(VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK);
4866	if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT)
4867		WREG32(VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK);
4868	if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT)
4869		WREG32(VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK);
4870
4871	if (rdev->num_crtc >= 4) {
4872		if (rdev->irq.stat_regs.evergreen.d3grph_int & GRPH_PFLIP_INT_OCCURRED)
4873			WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4874		if (rdev->irq.stat_regs.evergreen.d4grph_int & GRPH_PFLIP_INT_OCCURRED)
4875			WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4876		if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)
4877			WREG32(VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK);
4878		if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)
4879			WREG32(VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK);
4880		if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)
4881			WREG32(VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK);
4882		if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)
4883			WREG32(VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK);
4884	}
4885
4886	if (rdev->num_crtc >= 6) {
4887		if (rdev->irq.stat_regs.evergreen.d5grph_int & GRPH_PFLIP_INT_OCCURRED)
4888			WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4889		if (rdev->irq.stat_regs.evergreen.d6grph_int & GRPH_PFLIP_INT_OCCURRED)
4890			WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4891		if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)
4892			WREG32(VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK);
4893		if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)
4894			WREG32(VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK);
4895		if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)
4896			WREG32(VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK);
4897		if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)
4898			WREG32(VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK);
4899	}
4900
4901	if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) {
4902		tmp = RREG32(DC_HPD1_INT_CONTROL);
4903		tmp |= DC_HPDx_INT_ACK;
4904		WREG32(DC_HPD1_INT_CONTROL, tmp);
4905	}
4906	if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT) {
4907		tmp = RREG32(DC_HPD2_INT_CONTROL);
4908		tmp |= DC_HPDx_INT_ACK;
4909		WREG32(DC_HPD2_INT_CONTROL, tmp);
4910	}
4911	if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT) {
4912		tmp = RREG32(DC_HPD3_INT_CONTROL);
4913		tmp |= DC_HPDx_INT_ACK;
4914		WREG32(DC_HPD3_INT_CONTROL, tmp);
4915	}
4916	if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT) {
4917		tmp = RREG32(DC_HPD4_INT_CONTROL);
4918		tmp |= DC_HPDx_INT_ACK;
4919		WREG32(DC_HPD4_INT_CONTROL, tmp);
4920	}
4921	if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT) {
4922		tmp = RREG32(DC_HPD5_INT_CONTROL);
4923		tmp |= DC_HPDx_INT_ACK;
4924		WREG32(DC_HPD5_INT_CONTROL, tmp);
4925	}
4926	if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) {
4927		tmp = RREG32(DC_HPD5_INT_CONTROL);
4928		tmp |= DC_HPDx_INT_ACK;
4929		WREG32(DC_HPD6_INT_CONTROL, tmp);
4930	}
4931
4932	if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT) {
4933		tmp = RREG32(DC_HPD1_INT_CONTROL);
4934		tmp |= DC_HPDx_RX_INT_ACK;
4935		WREG32(DC_HPD1_INT_CONTROL, tmp);
4936	}
4937	if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT) {
4938		tmp = RREG32(DC_HPD2_INT_CONTROL);
4939		tmp |= DC_HPDx_RX_INT_ACK;
4940		WREG32(DC_HPD2_INT_CONTROL, tmp);
4941	}
4942	if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT) {
4943		tmp = RREG32(DC_HPD3_INT_CONTROL);
4944		tmp |= DC_HPDx_RX_INT_ACK;
4945		WREG32(DC_HPD3_INT_CONTROL, tmp);
4946	}
4947	if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT) {
4948		tmp = RREG32(DC_HPD4_INT_CONTROL);
4949		tmp |= DC_HPDx_RX_INT_ACK;
4950		WREG32(DC_HPD4_INT_CONTROL, tmp);
4951	}
4952	if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT) {
4953		tmp = RREG32(DC_HPD5_INT_CONTROL);
4954		tmp |= DC_HPDx_RX_INT_ACK;
4955		WREG32(DC_HPD5_INT_CONTROL, tmp);
4956	}
4957	if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) {
4958		tmp = RREG32(DC_HPD5_INT_CONTROL);
4959		tmp |= DC_HPDx_RX_INT_ACK;
4960		WREG32(DC_HPD6_INT_CONTROL, tmp);
4961	}
4962
4963	if (rdev->irq.stat_regs.evergreen.afmt_status1 & AFMT_AZ_FORMAT_WTRIG) {
4964		tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET);
4965		tmp |= AFMT_AZ_FORMAT_WTRIG_ACK;
4966		WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, tmp);
4967	}
4968	if (rdev->irq.stat_regs.evergreen.afmt_status2 & AFMT_AZ_FORMAT_WTRIG) {
4969		tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET);
4970		tmp |= AFMT_AZ_FORMAT_WTRIG_ACK;
4971		WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, tmp);
4972	}
4973	if (rdev->irq.stat_regs.evergreen.afmt_status3 & AFMT_AZ_FORMAT_WTRIG) {
4974		tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET);
4975		tmp |= AFMT_AZ_FORMAT_WTRIG_ACK;
4976		WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, tmp);
4977	}
4978	if (rdev->irq.stat_regs.evergreen.afmt_status4 & AFMT_AZ_FORMAT_WTRIG) {
4979		tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET);
4980		tmp |= AFMT_AZ_FORMAT_WTRIG_ACK;
4981		WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, tmp);
4982	}
4983	if (rdev->irq.stat_regs.evergreen.afmt_status5 & AFMT_AZ_FORMAT_WTRIG) {
4984		tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET);
4985		tmp |= AFMT_AZ_FORMAT_WTRIG_ACK;
4986		WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, tmp);
4987	}
4988	if (rdev->irq.stat_regs.evergreen.afmt_status6 & AFMT_AZ_FORMAT_WTRIG) {
4989		tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);
4990		tmp |= AFMT_AZ_FORMAT_WTRIG_ACK;
4991		WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, tmp);
4992	}
4993}
4994
4995static void evergreen_irq_disable(struct radeon_device *rdev)
4996{
4997	r600_disable_interrupts(rdev);
4998	/* Wait and acknowledge irq */
4999	mdelay(1);
5000	evergreen_irq_ack(rdev);
5001	evergreen_disable_interrupt_state(rdev);
5002}
5003
5004void evergreen_irq_suspend(struct radeon_device *rdev)
5005{
5006	evergreen_irq_disable(rdev);
5007	r600_rlc_stop(rdev);
5008}
5009
5010static u32 evergreen_get_ih_wptr(struct radeon_device *rdev)
5011{
5012	u32 wptr, tmp;
5013
5014	if (rdev->wb.enabled)
5015		wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
5016	else
5017		wptr = RREG32(IH_RB_WPTR);
5018
5019	if (wptr & RB_OVERFLOW) {
5020		wptr &= ~RB_OVERFLOW;
5021		/* When a ring buffer overflow happen start parsing interrupt
5022		 * from the last not overwritten vector (wptr + 16). Hopefully
5023		 * this should allow us to catchup.
5024		 */
5025		dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n",
5026			 wptr, rdev->ih.rptr, (wptr + 16) & rdev->ih.ptr_mask);
5027		rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask;
5028		tmp = RREG32(IH_RB_CNTL);
5029		tmp |= IH_WPTR_OVERFLOW_CLEAR;
5030		WREG32(IH_RB_CNTL, tmp);
5031	}
5032	return (wptr & rdev->ih.ptr_mask);
5033}
5034
5035int evergreen_irq_process(struct radeon_device *rdev)
5036{
 
 
 
 
5037	u32 wptr;
5038	u32 rptr;
5039	u32 src_id, src_data;
5040	u32 ring_index;
5041	bool queue_hotplug = false;
5042	bool queue_hdmi = false;
5043	bool queue_dp = false;
5044	bool queue_thermal = false;
5045	u32 status, addr;
 
5046
5047	if (!rdev->ih.enabled || rdev->shutdown)
5048		return IRQ_NONE;
5049
5050	wptr = evergreen_get_ih_wptr(rdev);
5051
5052restart_ih:
5053	/* is somebody else already processing irqs? */
5054	if (atomic_xchg(&rdev->ih.lock, 1))
5055		return IRQ_NONE;
5056
5057	rptr = rdev->ih.rptr;
5058	DRM_DEBUG("evergreen_irq_process start: rptr %d, wptr %d\n", rptr, wptr);
5059
5060	/* Order reading of wptr vs. reading of IH ring data */
5061	rmb();
5062
5063	/* display interrupts */
5064	evergreen_irq_ack(rdev);
5065
5066	while (rptr != wptr) {
5067		/* wptr/rptr are in bytes! */
5068		ring_index = rptr / 4;
5069		src_id =  le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
5070		src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
5071
5072		switch (src_id) {
5073		case 1: /* D1 vblank/vline */
5074			switch (src_data) {
5075			case 0: /* D1 vblank */
5076				if (!(rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT))
5077					DRM_DEBUG("IH: D1 vblank - IH event w/o asserted irq bit?\n");
5078
5079				if (rdev->irq.crtc_vblank_int[0]) {
5080					drm_handle_vblank(rdev->ddev, 0);
5081					rdev->pm.vblank_sync = true;
5082					wake_up(&rdev->irq.vblank_queue);
5083				}
5084				if (atomic_read(&rdev->irq.pflip[0]))
5085					radeon_crtc_handle_vblank(rdev, 0);
5086				rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VBLANK_INTERRUPT;
5087				DRM_DEBUG("IH: D1 vblank\n");
5088
5089				break;
5090			case 1: /* D1 vline */
5091				if (!(rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT))
5092					DRM_DEBUG("IH: D1 vline - IH event w/o asserted irq bit?\n");
5093
5094				rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VLINE_INTERRUPT;
5095				DRM_DEBUG("IH: D1 vline\n");
5096
5097				break;
5098			default:
5099				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
5100				break;
5101			}
5102			break;
5103		case 2: /* D2 vblank/vline */
5104			switch (src_data) {
5105			case 0: /* D2 vblank */
5106				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT))
5107					DRM_DEBUG("IH: D2 vblank - IH event w/o asserted irq bit?\n");
5108
5109				if (rdev->irq.crtc_vblank_int[1]) {
5110					drm_handle_vblank(rdev->ddev, 1);
5111					rdev->pm.vblank_sync = true;
5112					wake_up(&rdev->irq.vblank_queue);
5113				}
5114				if (atomic_read(&rdev->irq.pflip[1]))
5115					radeon_crtc_handle_vblank(rdev, 1);
5116				rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT;
5117				DRM_DEBUG("IH: D2 vblank\n");
5118
5119				break;
5120			case 1: /* D2 vline */
5121				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT))
5122					DRM_DEBUG("IH: D2 vline - IH event w/o asserted irq bit?\n");
5123
5124				rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT;
5125				DRM_DEBUG("IH: D2 vline\n");
5126
5127				break;
5128			default:
5129				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
5130				break;
5131			}
5132			break;
5133		case 3: /* D3 vblank/vline */
5134			switch (src_data) {
5135			case 0: /* D3 vblank */
5136				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT))
5137					DRM_DEBUG("IH: D3 vblank - IH event w/o asserted irq bit?\n");
5138
5139				if (rdev->irq.crtc_vblank_int[2]) {
5140					drm_handle_vblank(rdev->ddev, 2);
5141					rdev->pm.vblank_sync = true;
5142					wake_up(&rdev->irq.vblank_queue);
5143				}
5144				if (atomic_read(&rdev->irq.pflip[2]))
5145					radeon_crtc_handle_vblank(rdev, 2);
5146				rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT;
5147				DRM_DEBUG("IH: D3 vblank\n");
5148
5149				break;
5150			case 1: /* D3 vline */
5151				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT))
5152					DRM_DEBUG("IH: D3 vline - IH event w/o asserted irq bit?\n");
5153
5154				rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT;
5155				DRM_DEBUG("IH: D3 vline\n");
5156
5157				break;
5158			default:
5159				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
5160				break;
5161			}
5162			break;
5163		case 4: /* D4 vblank/vline */
5164			switch (src_data) {
5165			case 0: /* D4 vblank */
5166				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT))
5167					DRM_DEBUG("IH: D4 vblank - IH event w/o asserted irq bit?\n");
5168
5169				if (rdev->irq.crtc_vblank_int[3]) {
5170					drm_handle_vblank(rdev->ddev, 3);
5171					rdev->pm.vblank_sync = true;
5172					wake_up(&rdev->irq.vblank_queue);
5173				}
5174				if (atomic_read(&rdev->irq.pflip[3]))
5175					radeon_crtc_handle_vblank(rdev, 3);
5176				rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT;
5177				DRM_DEBUG("IH: D4 vblank\n");
5178
5179				break;
5180			case 1: /* D4 vline */
5181				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT))
5182					DRM_DEBUG("IH: D4 vline - IH event w/o asserted irq bit?\n");
5183
5184				rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT;
5185				DRM_DEBUG("IH: D4 vline\n");
5186
5187				break;
5188			default:
5189				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
 
 
 
5190				break;
5191			}
5192			break;
5193		case 5: /* D5 vblank/vline */
5194			switch (src_data) {
5195			case 0: /* D5 vblank */
5196				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT))
5197					DRM_DEBUG("IH: D5 vblank - IH event w/o asserted irq bit?\n");
5198
5199				if (rdev->irq.crtc_vblank_int[4]) {
5200					drm_handle_vblank(rdev->ddev, 4);
5201					rdev->pm.vblank_sync = true;
5202					wake_up(&rdev->irq.vblank_queue);
5203				}
5204				if (atomic_read(&rdev->irq.pflip[4]))
5205					radeon_crtc_handle_vblank(rdev, 4);
5206				rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT;
5207				DRM_DEBUG("IH: D5 vblank\n");
5208
5209				break;
5210			case 1: /* D5 vline */
5211				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT))
5212					DRM_DEBUG("IH: D5 vline - IH event w/o asserted irq bit?\n");
5213
5214				rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT;
5215				DRM_DEBUG("IH: D5 vline\n");
5216
5217				break;
5218			default:
5219				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
5220				break;
5221			}
5222			break;
5223		case 6: /* D6 vblank/vline */
5224			switch (src_data) {
5225			case 0: /* D6 vblank */
5226				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT))
5227					DRM_DEBUG("IH: D6 vblank - IH event w/o asserted irq bit?\n");
5228
5229				if (rdev->irq.crtc_vblank_int[5]) {
5230					drm_handle_vblank(rdev->ddev, 5);
5231					rdev->pm.vblank_sync = true;
5232					wake_up(&rdev->irq.vblank_queue);
5233				}
5234				if (atomic_read(&rdev->irq.pflip[5]))
5235					radeon_crtc_handle_vblank(rdev, 5);
5236				rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT;
5237				DRM_DEBUG("IH: D6 vblank\n");
5238
5239				break;
5240			case 1: /* D6 vline */
5241				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT))
5242					DRM_DEBUG("IH: D6 vline - IH event w/o asserted irq bit?\n");
5243
5244				rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT;
5245				DRM_DEBUG("IH: D6 vline\n");
5246
5247				break;
5248			default:
5249				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
5250				break;
5251			}
5252			break;
5253		case 8: /* D1 page flip */
5254		case 10: /* D2 page flip */
5255		case 12: /* D3 page flip */
5256		case 14: /* D4 page flip */
5257		case 16: /* D5 page flip */
5258		case 18: /* D6 page flip */
5259			DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
5260			if (radeon_use_pflipirq > 0)
5261				radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
5262			break;
5263		case 42: /* HPD hotplug */
5264			switch (src_data) {
5265			case 0:
5266				if (!(rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT))
5267					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5268
5269				rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT;
5270				queue_hotplug = true;
5271				DRM_DEBUG("IH: HPD1\n");
5272				break;
5273			case 1:
5274				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT))
5275					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5276
5277				rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_INTERRUPT;
5278				queue_hotplug = true;
5279				DRM_DEBUG("IH: HPD2\n");
5280				break;
5281			case 2:
5282				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT))
5283					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5284
5285				rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_INTERRUPT;
5286				queue_hotplug = true;
5287				DRM_DEBUG("IH: HPD3\n");
5288				break;
5289			case 3:
5290				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT))
5291					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5292
5293				rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_INTERRUPT;
5294				queue_hotplug = true;
5295				DRM_DEBUG("IH: HPD4\n");
5296				break;
5297			case 4:
5298				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT))
5299					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5300
5301				rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_INTERRUPT;
5302				queue_hotplug = true;
5303				DRM_DEBUG("IH: HPD5\n");
5304				break;
5305			case 5:
5306				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT))
5307					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5308
5309				rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_INTERRUPT;
5310				queue_hotplug = true;
5311				DRM_DEBUG("IH: HPD6\n");
5312				break;
5313			case 6:
5314				if (!(rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT))
5315					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5316
5317				rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_RX_INTERRUPT;
5318				queue_dp = true;
5319				DRM_DEBUG("IH: HPD_RX 1\n");
5320				break;
5321			case 7:
5322				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT))
5323					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5324
5325				rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_RX_INTERRUPT;
5326				queue_dp = true;
5327				DRM_DEBUG("IH: HPD_RX 2\n");
5328				break;
5329			case 8:
5330				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT))
5331					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5332
5333				rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_RX_INTERRUPT;
5334				queue_dp = true;
5335				DRM_DEBUG("IH: HPD_RX 3\n");
5336				break;
5337			case 9:
5338				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT))
5339					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5340
5341				rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_RX_INTERRUPT;
5342				queue_dp = true;
5343				DRM_DEBUG("IH: HPD_RX 4\n");
5344				break;
5345			case 10:
5346				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT))
5347					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5348
5349				rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_RX_INTERRUPT;
5350				queue_dp = true;
5351				DRM_DEBUG("IH: HPD_RX 5\n");
5352				break;
5353			case 11:
5354				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT))
5355					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5356
5357				rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_RX_INTERRUPT;
5358				queue_dp = true;
5359				DRM_DEBUG("IH: HPD_RX 6\n");
5360				break;
5361			default:
5362				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
5363				break;
5364			}
5365			break;
5366		case 44: /* hdmi */
5367			switch (src_data) {
5368			case 0:
5369				if (!(rdev->irq.stat_regs.evergreen.afmt_status1 & AFMT_AZ_FORMAT_WTRIG))
5370					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5371
5372				rdev->irq.stat_regs.evergreen.afmt_status1 &= ~AFMT_AZ_FORMAT_WTRIG;
5373				queue_hdmi = true;
5374				DRM_DEBUG("IH: HDMI0\n");
5375				break;
5376			case 1:
5377				if (!(rdev->irq.stat_regs.evergreen.afmt_status2 & AFMT_AZ_FORMAT_WTRIG))
5378					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5379
5380				rdev->irq.stat_regs.evergreen.afmt_status2 &= ~AFMT_AZ_FORMAT_WTRIG;
5381				queue_hdmi = true;
5382				DRM_DEBUG("IH: HDMI1\n");
5383				break;
5384			case 2:
5385				if (!(rdev->irq.stat_regs.evergreen.afmt_status3 & AFMT_AZ_FORMAT_WTRIG))
5386					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5387
5388				rdev->irq.stat_regs.evergreen.afmt_status3 &= ~AFMT_AZ_FORMAT_WTRIG;
5389				queue_hdmi = true;
5390				DRM_DEBUG("IH: HDMI2\n");
5391				break;
5392			case 3:
5393				if (!(rdev->irq.stat_regs.evergreen.afmt_status4 & AFMT_AZ_FORMAT_WTRIG))
5394					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5395
5396				rdev->irq.stat_regs.evergreen.afmt_status4 &= ~AFMT_AZ_FORMAT_WTRIG;
5397				queue_hdmi = true;
5398				DRM_DEBUG("IH: HDMI3\n");
5399				break;
5400			case 4:
5401				if (!(rdev->irq.stat_regs.evergreen.afmt_status5 & AFMT_AZ_FORMAT_WTRIG))
5402					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5403
5404				rdev->irq.stat_regs.evergreen.afmt_status5 &= ~AFMT_AZ_FORMAT_WTRIG;
5405				queue_hdmi = true;
5406				DRM_DEBUG("IH: HDMI4\n");
5407				break;
5408			case 5:
5409				if (!(rdev->irq.stat_regs.evergreen.afmt_status6 & AFMT_AZ_FORMAT_WTRIG))
5410					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5411
5412				rdev->irq.stat_regs.evergreen.afmt_status6 &= ~AFMT_AZ_FORMAT_WTRIG;
5413				queue_hdmi = true;
5414				DRM_DEBUG("IH: HDMI5\n");
5415				break;
5416			default:
5417				DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data);
5418				break;
5419			}
 
 
 
 
 
 
 
 
5420		case 96:
5421			DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR));
5422			WREG32(SRBM_INT_ACK, 0x1);
5423			break;
5424		case 124: /* UVD */
5425			DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
5426			radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
5427			break;
5428		case 146:
5429		case 147:
5430			addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR);
5431			status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS);
5432			/* reset addr and status */
5433			WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
5434			if (addr == 0x0 && status == 0x0)
5435				break;
5436			dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data);
5437			dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
5438				addr);
5439			dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
5440				status);
5441			cayman_vm_decode_fault(rdev, status, addr);
5442			break;
5443		case 176: /* CP_INT in ring buffer */
5444		case 177: /* CP_INT in IB1 */
5445		case 178: /* CP_INT in IB2 */
5446			DRM_DEBUG("IH: CP int: 0x%08x\n", src_data);
5447			radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
5448			break;
5449		case 181: /* CP EOP event */
5450			DRM_DEBUG("IH: CP EOP\n");
5451			if (rdev->family >= CHIP_CAYMAN) {
5452				switch (src_data) {
5453				case 0:
5454					radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
5455					break;
5456				case 1:
5457					radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
5458					break;
5459				case 2:
5460					radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
5461					break;
5462				}
5463			} else
5464				radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
5465			break;
5466		case 224: /* DMA trap event */
5467			DRM_DEBUG("IH: DMA trap\n");
5468			radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX);
5469			break;
5470		case 230: /* thermal low to high */
5471			DRM_DEBUG("IH: thermal low to high\n");
5472			rdev->pm.dpm.thermal.high_to_low = false;
5473			queue_thermal = true;
5474			break;
5475		case 231: /* thermal high to low */
5476			DRM_DEBUG("IH: thermal high to low\n");
5477			rdev->pm.dpm.thermal.high_to_low = true;
5478			queue_thermal = true;
5479			break;
5480		case 233: /* GUI IDLE */
5481			DRM_DEBUG("IH: GUI idle\n");
5482			break;
5483		case 244: /* DMA trap event */
5484			if (rdev->family >= CHIP_CAYMAN) {
5485				DRM_DEBUG("IH: DMA1 trap\n");
5486				radeon_fence_process(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
5487			}
5488			break;
5489		default:
5490			DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
5491			break;
5492		}
5493
5494		/* wptr/rptr are in bytes! */
5495		rptr += 16;
5496		rptr &= rdev->ih.ptr_mask;
5497		WREG32(IH_RB_RPTR, rptr);
5498	}
5499	if (queue_dp)
5500		schedule_work(&rdev->dp_work);
5501	if (queue_hotplug)
5502		schedule_delayed_work(&rdev->hotplug_work, 0);
5503	if (queue_hdmi)
5504		schedule_work(&rdev->audio_work);
5505	if (queue_thermal && rdev->pm.dpm_enabled)
5506		schedule_work(&rdev->pm.dpm.thermal.work);
5507	rdev->ih.rptr = rptr;
5508	atomic_set(&rdev->ih.lock, 0);
5509
5510	/* make sure wptr hasn't changed while processing */
5511	wptr = evergreen_get_ih_wptr(rdev);
5512	if (wptr != rptr)
5513		goto restart_ih;
5514
5515	return IRQ_HANDLED;
5516}
5517
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5518static int evergreen_startup(struct radeon_device *rdev)
5519{
5520	struct radeon_ring *ring;
5521	int r;
5522
5523	/* enable pcie gen2 link */
5524	evergreen_pcie_gen2_enable(rdev);
5525	/* enable aspm */
5526	evergreen_program_aspm(rdev);
5527
5528	/* scratch needs to be initialized before MC */
5529	r = r600_vram_scratch_init(rdev);
5530	if (r)
5531		return r;
5532
5533	evergreen_mc_program(rdev);
5534
5535	if (ASIC_IS_DCE5(rdev) && !rdev->pm.dpm_enabled) {
5536		r = ni_mc_load_microcode(rdev);
5537		if (r) {
5538			DRM_ERROR("Failed to load MC firmware!\n");
5539			return r;
5540		}
5541	}
5542
5543	if (rdev->flags & RADEON_IS_AGP) {
5544		evergreen_agp_enable(rdev);
5545	} else {
5546		r = evergreen_pcie_gart_enable(rdev);
5547		if (r)
5548			return r;
5549	}
5550	evergreen_gpu_init(rdev);
5551
5552	/* allocate rlc buffers */
5553	if (rdev->flags & RADEON_IS_IGP) {
5554		rdev->rlc.reg_list = sumo_rlc_save_restore_register_list;
5555		rdev->rlc.reg_list_size =
5556			(u32)ARRAY_SIZE(sumo_rlc_save_restore_register_list);
5557		rdev->rlc.cs_data = evergreen_cs_data;
5558		r = sumo_rlc_init(rdev);
5559		if (r) {
5560			DRM_ERROR("Failed to init rlc BOs!\n");
5561			return r;
5562		}
5563	}
5564
5565	/* allocate wb buffer */
5566	r = radeon_wb_init(rdev);
5567	if (r)
5568		return r;
5569
5570	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
5571	if (r) {
5572		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
5573		return r;
5574	}
5575
5576	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
5577	if (r) {
5578		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
5579		return r;
5580	}
5581
5582	r = uvd_v2_2_resume(rdev);
5583	if (!r) {
5584		r = radeon_fence_driver_start_ring(rdev,
5585						   R600_RING_TYPE_UVD_INDEX);
5586		if (r)
5587			dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
5588	}
5589
5590	if (r)
5591		rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
5592
5593	/* Enable IRQ */
5594	if (!rdev->irq.installed) {
5595		r = radeon_irq_kms_init(rdev);
5596		if (r)
5597			return r;
5598	}
5599
5600	r = r600_irq_init(rdev);
5601	if (r) {
5602		DRM_ERROR("radeon: IH init failed (%d).\n", r);
5603		radeon_irq_kms_fini(rdev);
5604		return r;
5605	}
5606	evergreen_irq_set(rdev);
5607
5608	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
5609	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
5610			     RADEON_CP_PACKET2);
5611	if (r)
5612		return r;
5613
5614	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
5615	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
5616			     DMA_PACKET(DMA_PACKET_NOP, 0, 0));
5617	if (r)
5618		return r;
5619
5620	r = evergreen_cp_load_microcode(rdev);
5621	if (r)
5622		return r;
5623	r = evergreen_cp_resume(rdev);
5624	if (r)
5625		return r;
5626	r = r600_dma_resume(rdev);
5627	if (r)
5628		return r;
5629
5630	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
5631	if (ring->ring_size) {
5632		r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
5633				     RADEON_CP_PACKET2);
5634		if (!r)
5635			r = uvd_v1_0_init(rdev);
5636
5637		if (r)
5638			DRM_ERROR("radeon: error initializing UVD (%d).\n", r);
5639	}
5640
5641	r = radeon_ib_pool_init(rdev);
5642	if (r) {
5643		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
5644		return r;
5645	}
5646
5647	r = radeon_audio_init(rdev);
5648	if (r) {
5649		DRM_ERROR("radeon: audio init failed\n");
5650		return r;
5651	}
5652
5653	return 0;
5654}
5655
5656int evergreen_resume(struct radeon_device *rdev)
5657{
5658	int r;
5659
5660	/* reset the asic, the gfx blocks are often in a bad state
5661	 * after the driver is unloaded or after a resume
5662	 */
5663	if (radeon_asic_reset(rdev))
5664		dev_warn(rdev->dev, "GPU reset failed !\n");
5665	/* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
5666	 * posting will perform necessary task to bring back GPU into good
5667	 * shape.
5668	 */
5669	/* post card */
5670	atom_asic_init(rdev->mode_info.atom_context);
5671
5672	/* init golden registers */
5673	evergreen_init_golden_registers(rdev);
5674
5675	if (rdev->pm.pm_method == PM_METHOD_DPM)
5676		radeon_pm_resume(rdev);
5677
5678	rdev->accel_working = true;
5679	r = evergreen_startup(rdev);
5680	if (r) {
5681		DRM_ERROR("evergreen startup failed on resume\n");
5682		rdev->accel_working = false;
5683		return r;
5684	}
5685
5686	return r;
5687
5688}
5689
5690int evergreen_suspend(struct radeon_device *rdev)
5691{
5692	radeon_pm_suspend(rdev);
5693	radeon_audio_fini(rdev);
5694	uvd_v1_0_fini(rdev);
5695	radeon_uvd_suspend(rdev);
 
 
5696	r700_cp_stop(rdev);
5697	r600_dma_stop(rdev);
5698	evergreen_irq_suspend(rdev);
5699	radeon_wb_disable(rdev);
5700	evergreen_pcie_gart_disable(rdev);
5701
5702	return 0;
5703}
5704
5705/* Plan is to move initialization in that function and use
5706 * helper function so that radeon_device_init pretty much
5707 * do nothing more than calling asic specific function. This
5708 * should also allow to remove a bunch of callback function
5709 * like vram_info.
5710 */
5711int evergreen_init(struct radeon_device *rdev)
5712{
5713	int r;
5714
5715	/* Read BIOS */
5716	if (!radeon_get_bios(rdev)) {
5717		if (ASIC_IS_AVIVO(rdev))
5718			return -EINVAL;
5719	}
5720	/* Must be an ATOMBIOS */
5721	if (!rdev->is_atom_bios) {
5722		dev_err(rdev->dev, "Expecting atombios for evergreen GPU\n");
5723		return -EINVAL;
5724	}
5725	r = radeon_atombios_init(rdev);
5726	if (r)
5727		return r;
5728	/* reset the asic, the gfx blocks are often in a bad state
5729	 * after the driver is unloaded or after a resume
5730	 */
5731	if (radeon_asic_reset(rdev))
5732		dev_warn(rdev->dev, "GPU reset failed !\n");
5733	/* Post card if necessary */
5734	if (!radeon_card_posted(rdev)) {
5735		if (!rdev->bios) {
5736			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
5737			return -EINVAL;
5738		}
5739		DRM_INFO("GPU not posted. posting now...\n");
5740		atom_asic_init(rdev->mode_info.atom_context);
5741	}
5742	/* init golden registers */
5743	evergreen_init_golden_registers(rdev);
5744	/* Initialize scratch registers */
5745	r600_scratch_init(rdev);
5746	/* Initialize surface registers */
5747	radeon_surface_init(rdev);
5748	/* Initialize clocks */
5749	radeon_get_clock_info(rdev->ddev);
5750	/* Fence driver */
5751	r = radeon_fence_driver_init(rdev);
5752	if (r)
5753		return r;
5754	/* initialize AGP */
5755	if (rdev->flags & RADEON_IS_AGP) {
5756		r = radeon_agp_init(rdev);
5757		if (r)
5758			radeon_agp_disable(rdev);
5759	}
5760	/* initialize memory controller */
5761	r = evergreen_mc_init(rdev);
5762	if (r)
5763		return r;
5764	/* Memory manager */
5765	r = radeon_bo_init(rdev);
5766	if (r)
5767		return r;
5768
5769	if (ASIC_IS_DCE5(rdev)) {
5770		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
5771			r = ni_init_microcode(rdev);
5772			if (r) {
5773				DRM_ERROR("Failed to load firmware!\n");
5774				return r;
5775			}
5776		}
5777	} else {
5778		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
5779			r = r600_init_microcode(rdev);
5780			if (r) {
5781				DRM_ERROR("Failed to load firmware!\n");
5782				return r;
5783			}
5784		}
5785	}
5786
5787	/* Initialize power management */
5788	radeon_pm_init(rdev);
5789
5790	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
5791	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
5792
5793	rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
5794	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
5795
5796	r = radeon_uvd_init(rdev);
5797	if (!r) {
5798		rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
5799		r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX],
5800			       4096);
5801	}
5802
5803	rdev->ih.ring_obj = NULL;
5804	r600_ih_ring_init(rdev, 64 * 1024);
5805
5806	r = r600_pcie_gart_init(rdev);
5807	if (r)
5808		return r;
5809
5810	rdev->accel_working = true;
5811	r = evergreen_startup(rdev);
5812	if (r) {
5813		dev_err(rdev->dev, "disabling GPU acceleration\n");
5814		r700_cp_fini(rdev);
5815		r600_dma_fini(rdev);
5816		r600_irq_fini(rdev);
5817		if (rdev->flags & RADEON_IS_IGP)
5818			sumo_rlc_fini(rdev);
5819		radeon_wb_fini(rdev);
5820		radeon_ib_pool_fini(rdev);
5821		radeon_irq_kms_fini(rdev);
5822		evergreen_pcie_gart_fini(rdev);
5823		rdev->accel_working = false;
5824	}
5825
5826	/* Don't start up if the MC ucode is missing on BTC parts.
5827	 * The default clocks and voltages before the MC ucode
5828	 * is loaded are not suffient for advanced operations.
5829	 */
5830	if (ASIC_IS_DCE5(rdev)) {
5831		if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
5832			DRM_ERROR("radeon: MC ucode required for NI+.\n");
5833			return -EINVAL;
5834		}
5835	}
5836
5837	return 0;
5838}
5839
5840void evergreen_fini(struct radeon_device *rdev)
5841{
5842	radeon_pm_fini(rdev);
5843	radeon_audio_fini(rdev);
5844	r700_cp_fini(rdev);
5845	r600_dma_fini(rdev);
5846	r600_irq_fini(rdev);
5847	if (rdev->flags & RADEON_IS_IGP)
5848		sumo_rlc_fini(rdev);
5849	radeon_wb_fini(rdev);
5850	radeon_ib_pool_fini(rdev);
5851	radeon_irq_kms_fini(rdev);
5852	uvd_v1_0_fini(rdev);
5853	radeon_uvd_fini(rdev);
5854	evergreen_pcie_gart_fini(rdev);
5855	r600_vram_scratch_fini(rdev);
5856	radeon_gem_fini(rdev);
5857	radeon_fence_driver_fini(rdev);
5858	radeon_agp_fini(rdev);
5859	radeon_bo_fini(rdev);
5860	radeon_atombios_fini(rdev);
5861	kfree(rdev->bios);
5862	rdev->bios = NULL;
5863}
5864
5865void evergreen_pcie_gen2_enable(struct radeon_device *rdev)
5866{
5867	u32 link_width_cntl, speed_cntl;
5868
5869	if (radeon_pcie_gen2 == 0)
5870		return;
5871
5872	if (rdev->flags & RADEON_IS_IGP)
5873		return;
5874
5875	if (!(rdev->flags & RADEON_IS_PCIE))
5876		return;
5877
5878	/* x2 cards have a special sequence */
5879	if (ASIC_IS_X2(rdev))
5880		return;
5881
5882	if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) &&
5883		(rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))
5884		return;
5885
5886	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5887	if (speed_cntl & LC_CURRENT_DATA_RATE) {
5888		DRM_INFO("PCIE gen 2 link speeds already enabled\n");
5889		return;
5890	}
5891
5892	DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
5893
5894	if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) ||
5895	    (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
5896
5897		link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
5898		link_width_cntl &= ~LC_UPCONFIGURE_DIS;
5899		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
5900
5901		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5902		speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
5903		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5904
5905		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5906		speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT;
5907		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5908
5909		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5910		speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
5911		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5912
5913		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5914		speed_cntl |= LC_GEN2_EN_STRAP;
5915		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5916
5917	} else {
5918		link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
5919		/* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
5920		if (1)
5921			link_width_cntl |= LC_UPCONFIGURE_DIS;
5922		else
5923			link_width_cntl &= ~LC_UPCONFIGURE_DIS;
5924		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
5925	}
5926}
5927
5928void evergreen_program_aspm(struct radeon_device *rdev)
5929{
5930	u32 data, orig;
5931	u32 pcie_lc_cntl, pcie_lc_cntl_old;
5932	bool disable_l0s, disable_l1 = false, disable_plloff_in_l1 = false;
5933	/* fusion_platform = true
5934	 * if the system is a fusion system
5935	 * (APU or DGPU in a fusion system).
5936	 * todo: check if the system is a fusion platform.
5937	 */
5938	bool fusion_platform = false;
5939
5940	if (radeon_aspm == 0)
5941		return;
5942
5943	if (!(rdev->flags & RADEON_IS_PCIE))
5944		return;
5945
5946	switch (rdev->family) {
5947	case CHIP_CYPRESS:
5948	case CHIP_HEMLOCK:
5949	case CHIP_JUNIPER:
5950	case CHIP_REDWOOD:
5951	case CHIP_CEDAR:
5952	case CHIP_SUMO:
5953	case CHIP_SUMO2:
5954	case CHIP_PALM:
5955	case CHIP_ARUBA:
5956		disable_l0s = true;
5957		break;
5958	default:
5959		disable_l0s = false;
5960		break;
5961	}
5962
5963	if (rdev->flags & RADEON_IS_IGP)
5964		fusion_platform = true; /* XXX also dGPUs in a fusion system */
5965
5966	data = orig = RREG32_PIF_PHY0(PB0_PIF_PAIRING);
5967	if (fusion_platform)
5968		data &= ~MULTI_PIF;
5969	else
5970		data |= MULTI_PIF;
5971	if (data != orig)
5972		WREG32_PIF_PHY0(PB0_PIF_PAIRING, data);
5973
5974	data = orig = RREG32_PIF_PHY1(PB1_PIF_PAIRING);
5975	if (fusion_platform)
5976		data &= ~MULTI_PIF;
5977	else
5978		data |= MULTI_PIF;
5979	if (data != orig)
5980		WREG32_PIF_PHY1(PB1_PIF_PAIRING, data);
5981
5982	pcie_lc_cntl = pcie_lc_cntl_old = RREG32_PCIE_PORT(PCIE_LC_CNTL);
5983	pcie_lc_cntl &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
5984	if (!disable_l0s) {
5985		if (rdev->family >= CHIP_BARTS)
5986			pcie_lc_cntl |= LC_L0S_INACTIVITY(7);
5987		else
5988			pcie_lc_cntl |= LC_L0S_INACTIVITY(3);
5989	}
5990
5991	if (!disable_l1) {
5992		if (rdev->family >= CHIP_BARTS)
5993			pcie_lc_cntl |= LC_L1_INACTIVITY(7);
5994		else
5995			pcie_lc_cntl |= LC_L1_INACTIVITY(8);
5996
5997		if (!disable_plloff_in_l1) {
5998			data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0);
5999			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
6000			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
6001			if (data != orig)
6002				WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data);
6003
6004			data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1);
6005			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
6006			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
6007			if (data != orig)
6008				WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data);
6009
6010			data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0);
6011			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
6012			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
6013			if (data != orig)
6014				WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data);
6015
6016			data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1);
6017			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
6018			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
6019			if (data != orig)
6020				WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data);
6021
6022			if (rdev->family >= CHIP_BARTS) {
6023				data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0);
6024				data &= ~PLL_RAMP_UP_TIME_0_MASK;
6025				data |= PLL_RAMP_UP_TIME_0(4);
6026				if (data != orig)
6027					WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data);
6028
6029				data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1);
6030				data &= ~PLL_RAMP_UP_TIME_1_MASK;
6031				data |= PLL_RAMP_UP_TIME_1(4);
6032				if (data != orig)
6033					WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data);
6034
6035				data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0);
6036				data &= ~PLL_RAMP_UP_TIME_0_MASK;
6037				data |= PLL_RAMP_UP_TIME_0(4);
6038				if (data != orig)
6039					WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data);
6040
6041				data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1);
6042				data &= ~PLL_RAMP_UP_TIME_1_MASK;
6043				data |= PLL_RAMP_UP_TIME_1(4);
6044				if (data != orig)
6045					WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data);
6046			}
6047
6048			data = orig = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
6049			data &= ~LC_DYN_LANES_PWR_STATE_MASK;
6050			data |= LC_DYN_LANES_PWR_STATE(3);
6051			if (data != orig)
6052				WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
6053
6054			if (rdev->family >= CHIP_BARTS) {
6055				data = orig = RREG32_PIF_PHY0(PB0_PIF_CNTL);
6056				data &= ~LS2_EXIT_TIME_MASK;
6057				data |= LS2_EXIT_TIME(1);
6058				if (data != orig)
6059					WREG32_PIF_PHY0(PB0_PIF_CNTL, data);
6060
6061				data = orig = RREG32_PIF_PHY1(PB1_PIF_CNTL);
6062				data &= ~LS2_EXIT_TIME_MASK;
6063				data |= LS2_EXIT_TIME(1);
6064				if (data != orig)
6065					WREG32_PIF_PHY1(PB1_PIF_CNTL, data);
6066			}
6067		}
6068	}
6069
6070	/* evergreen parts only */
6071	if (rdev->family < CHIP_BARTS)
6072		pcie_lc_cntl |= LC_PMI_TO_L1_DIS;
6073
6074	if (pcie_lc_cntl != pcie_lc_cntl_old)
6075		WREG32_PCIE_PORT(PCIE_LC_CNTL, pcie_lc_cntl);
6076}