linux/drivers/gpu/drm/radeon/evergreen.c
<<
>>
Prefs
   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 * Does the actual pageflip (evergreen+).
1408 * During vblank we take the crtc lock and wait for the update_pending
1409 * bit to go high, when it does, we release the lock, and allow the
1410 * double buffered update to take place.
1411 * Returns the current update pending status.
1412 */
1413void evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
1414{
1415        struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
1416        u32 tmp = RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset);
1417        int i;
1418
1419        /* Lock the graphics update lock */
1420        tmp |= EVERGREEN_GRPH_UPDATE_LOCK;
1421        WREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
1422
1423        /* update the scanout addresses */
1424        WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset,
1425               upper_32_bits(crtc_base));
1426        WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
1427               (u32)crtc_base);
1428
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
1434        /* Wait for update_pending to go high. */
1435        for (i = 0; i < rdev->usec_timeout; i++) {
1436                if (RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) & EVERGREEN_GRPH_SURFACE_UPDATE_PENDING)
1437                        break;
1438                udelay(1);
1439        }
1440        DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
1441
1442        /* Unlock the lock, so double-buffering can take place inside vblank */
1443        tmp &= ~EVERGREEN_GRPH_UPDATE_LOCK;
1444        WREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
1445}
1446
1447/**
1448 * evergreen_page_flip_pending - check if page flip is still pending
1449 *
1450 * @rdev: radeon_device pointer
1451 * @crtc_id: crtc to check
1452 *
1453 * Returns the current update pending status.
1454 */
1455bool evergreen_page_flip_pending(struct radeon_device *rdev, int crtc_id)
1456{
1457        struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
1458
1459        /* Return current update_pending status: */
1460        return !!(RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) &
1461                EVERGREEN_GRPH_SURFACE_UPDATE_PENDING);
1462}
1463
1464/* get temperature in millidegrees */
1465int evergreen_get_temp(struct radeon_device *rdev)
1466{
1467        u32 temp, toffset;
1468        int actual_temp = 0;
1469
1470        if (rdev->family == CHIP_JUNIPER) {
1471                toffset = (RREG32(CG_THERMAL_CTRL) & TOFFSET_MASK) >>
1472                        TOFFSET_SHIFT;
1473                temp = (RREG32(CG_TS0_STATUS) & TS0_ADC_DOUT_MASK) >>
1474                        TS0_ADC_DOUT_SHIFT;
1475
1476                if (toffset & 0x100)
1477                        actual_temp = temp / 2 - (0x200 - toffset);
1478                else
1479                        actual_temp = temp / 2 + toffset;
1480
1481                actual_temp = actual_temp * 1000;
1482
1483        } else {
1484                temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
1485                        ASIC_T_SHIFT;
1486
1487                if (temp & 0x400)
1488                        actual_temp = -256;
1489                else if (temp & 0x200)
1490                        actual_temp = 255;
1491                else if (temp & 0x100) {
1492                        actual_temp = temp & 0x1ff;
1493                        actual_temp |= ~0x1ff;
1494                } else
1495                        actual_temp = temp & 0xff;
1496
1497                actual_temp = (actual_temp * 1000) / 2;
1498        }
1499
1500        return actual_temp;
1501}
1502
1503int sumo_get_temp(struct radeon_device *rdev)
1504{
1505        u32 temp = RREG32(CG_THERMAL_STATUS) & 0xff;
1506        int actual_temp = temp - 49;
1507
1508        return actual_temp * 1000;
1509}
1510
1511/**
1512 * sumo_pm_init_profile - Initialize power profiles callback.
1513 *
1514 * @rdev: radeon_device pointer
1515 *
1516 * Initialize the power states used in profile mode
1517 * (sumo, trinity, SI).
1518 * Used for profile mode only.
1519 */
1520void sumo_pm_init_profile(struct radeon_device *rdev)
1521{
1522        int idx;
1523
1524        /* default */
1525        rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
1526        rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
1527        rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
1528        rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0;
1529
1530        /* low,mid sh/mh */
1531        if (rdev->flags & RADEON_IS_MOBILITY)
1532                idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_BATTERY, 0);
1533        else
1534                idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0);
1535
1536        rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = idx;
1537        rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = idx;
1538        rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
1539        rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
1540
1541        rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = idx;
1542        rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = idx;
1543        rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
1544        rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
1545
1546        rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = idx;
1547        rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = idx;
1548        rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;
1549        rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 0;
1550
1551        rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = idx;
1552        rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = idx;
1553        rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;
1554        rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0;
1555
1556        /* high sh/mh */
1557        idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0);
1558        rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = idx;
1559        rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = idx;
1560        rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
1561        rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx =
1562                rdev->pm.power_state[idx].num_clock_modes - 1;
1563
1564        rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = idx;
1565        rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = idx;
1566        rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
1567        rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx =
1568                rdev->pm.power_state[idx].num_clock_modes - 1;
1569}
1570
1571/**
1572 * btc_pm_init_profile - Initialize power profiles callback.
1573 *
1574 * @rdev: radeon_device pointer
1575 *
1576 * Initialize the power states used in profile mode
1577 * (BTC, cayman).
1578 * Used for profile mode only.
1579 */
1580void btc_pm_init_profile(struct radeon_device *rdev)
1581{
1582        int idx;
1583
1584        /* default */
1585        rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
1586        rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
1587        rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
1588        rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 2;
1589        /* starting with BTC, there is one state that is used for both
1590         * MH and SH.  Difference is that we always use the high clock index for
1591         * mclk.
1592         */
1593        if (rdev->flags & RADEON_IS_MOBILITY)
1594                idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_BATTERY, 0);
1595        else
1596                idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0);
1597        /* low sh */
1598        rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = idx;
1599        rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = idx;
1600        rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
1601        rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
1602        /* mid sh */
1603        rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = idx;
1604        rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = idx;
1605        rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;
1606        rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 1;
1607        /* high sh */
1608        rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = idx;
1609        rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = idx;
1610        rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
1611        rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 2;
1612        /* low mh */
1613        rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = idx;
1614        rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = idx;
1615        rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
1616        rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
1617        /* mid mh */
1618        rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = idx;
1619        rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = idx;
1620        rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;
1621        rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 1;
1622        /* high mh */
1623        rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = idx;
1624        rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = idx;
1625        rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
1626        rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 2;
1627}
1628
1629/**
1630 * evergreen_pm_misc - set additional pm hw parameters callback.
1631 *
1632 * @rdev: radeon_device pointer
1633 *
1634 * Set non-clock parameters associated with a power state
1635 * (voltage, etc.) (evergreen+).
1636 */
1637void evergreen_pm_misc(struct radeon_device *rdev)
1638{
1639        int req_ps_idx = rdev->pm.requested_power_state_index;
1640        int req_cm_idx = rdev->pm.requested_clock_mode_index;
1641        struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
1642        struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
1643
1644        if (voltage->type == VOLTAGE_SW) {
1645                /* 0xff0x are flags rather then an actual voltage */
1646                if ((voltage->voltage & 0xff00) == 0xff00)
1647                        return;
1648                if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) {
1649                        radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
1650                        rdev->pm.current_vddc = voltage->voltage;
1651                        DRM_DEBUG("Setting: vddc: %d\n", voltage->voltage);
1652                }
1653
1654                /* starting with BTC, there is one state that is used for both
1655                 * MH and SH.  Difference is that we always use the high clock index for
1656                 * mclk and vddci.
1657                 */
1658                if ((rdev->pm.pm_method == PM_METHOD_PROFILE) &&
1659                    (rdev->family >= CHIP_BARTS) &&
1660                    rdev->pm.active_crtc_count &&
1661                    ((rdev->pm.profile_index == PM_PROFILE_MID_MH_IDX) ||
1662                     (rdev->pm.profile_index == PM_PROFILE_LOW_MH_IDX)))
1663                        voltage = &rdev->pm.power_state[req_ps_idx].
1664                                clock_info[rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx].voltage;
1665
1666                /* 0xff0x are flags rather then an actual voltage */
1667                if ((voltage->vddci & 0xff00) == 0xff00)
1668                        return;
1669                if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) {
1670                        radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI);
1671                        rdev->pm.current_vddci = voltage->vddci;
1672                        DRM_DEBUG("Setting: vddci: %d\n", voltage->vddci);
1673                }
1674        }
1675}
1676
1677/**
1678 * evergreen_pm_prepare - pre-power state change callback.
1679 *
1680 * @rdev: radeon_device pointer
1681 *
1682 * Prepare for a power state change (evergreen+).
1683 */
1684void evergreen_pm_prepare(struct radeon_device *rdev)
1685{
1686        struct drm_device *ddev = rdev->ddev;
1687        struct drm_crtc *crtc;
1688        struct radeon_crtc *radeon_crtc;
1689        u32 tmp;
1690
1691        /* disable any active CRTCs */
1692        list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) {
1693                radeon_crtc = to_radeon_crtc(crtc);
1694                if (radeon_crtc->enabled) {
1695                        tmp = RREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset);
1696                        tmp |= EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
1697                        WREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset, tmp);
1698                }
1699        }
1700}
1701
1702/**
1703 * evergreen_pm_finish - post-power state change callback.
1704 *
1705 * @rdev: radeon_device pointer
1706 *
1707 * Clean up after a power state change (evergreen+).
1708 */
1709void evergreen_pm_finish(struct radeon_device *rdev)
1710{
1711        struct drm_device *ddev = rdev->ddev;
1712        struct drm_crtc *crtc;
1713        struct radeon_crtc *radeon_crtc;
1714        u32 tmp;
1715
1716        /* enable any active CRTCs */
1717        list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) {
1718                radeon_crtc = to_radeon_crtc(crtc);
1719                if (radeon_crtc->enabled) {
1720                        tmp = RREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset);
1721                        tmp &= ~EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
1722                        WREG32(EVERGREEN_CRTC_CONTROL + radeon_crtc->crtc_offset, tmp);
1723                }
1724        }
1725}
1726
1727/**
1728 * evergreen_hpd_sense - hpd sense callback.
1729 *
1730 * @rdev: radeon_device pointer
1731 * @hpd: hpd (hotplug detect) pin
1732 *
1733 * Checks if a digital monitor is connected (evergreen+).
1734 * Returns true if connected, false if not connected.
1735 */
1736bool evergreen_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd)
1737{
1738        bool connected = false;
1739
1740        switch (hpd) {
1741        case RADEON_HPD_1:
1742                if (RREG32(DC_HPD1_INT_STATUS) & DC_HPDx_SENSE)
1743                        connected = true;
1744                break;
1745        case RADEON_HPD_2:
1746                if (RREG32(DC_HPD2_INT_STATUS) & DC_HPDx_SENSE)
1747                        connected = true;
1748                break;
1749        case RADEON_HPD_3:
1750                if (RREG32(DC_HPD3_INT_STATUS) & DC_HPDx_SENSE)
1751                        connected = true;
1752                break;
1753        case RADEON_HPD_4:
1754                if (RREG32(DC_HPD4_INT_STATUS) & DC_HPDx_SENSE)
1755                        connected = true;
1756                break;
1757        case RADEON_HPD_5:
1758                if (RREG32(DC_HPD5_INT_STATUS) & DC_HPDx_SENSE)
1759                        connected = true;
1760                break;
1761        case RADEON_HPD_6:
1762                if (RREG32(DC_HPD6_INT_STATUS) & DC_HPDx_SENSE)
1763                        connected = true;
1764                break;
1765        default:
1766                break;
1767        }
1768
1769        return connected;
1770}
1771
1772/**
1773 * evergreen_hpd_set_polarity - hpd set polarity callback.
1774 *
1775 * @rdev: radeon_device pointer
1776 * @hpd: hpd (hotplug detect) pin
1777 *
1778 * Set the polarity of the hpd pin (evergreen+).
1779 */
1780void evergreen_hpd_set_polarity(struct radeon_device *rdev,
1781                                enum radeon_hpd_id hpd)
1782{
1783        u32 tmp;
1784        bool connected = evergreen_hpd_sense(rdev, hpd);
1785
1786        switch (hpd) {
1787        case RADEON_HPD_1:
1788                tmp = RREG32(DC_HPD1_INT_CONTROL);
1789                if (connected)
1790                        tmp &= ~DC_HPDx_INT_POLARITY;
1791                else
1792                        tmp |= DC_HPDx_INT_POLARITY;
1793                WREG32(DC_HPD1_INT_CONTROL, tmp);
1794                break;
1795        case RADEON_HPD_2:
1796                tmp = RREG32(DC_HPD2_INT_CONTROL);
1797                if (connected)
1798                        tmp &= ~DC_HPDx_INT_POLARITY;
1799                else
1800                        tmp |= DC_HPDx_INT_POLARITY;
1801                WREG32(DC_HPD2_INT_CONTROL, tmp);
1802                break;
1803        case RADEON_HPD_3:
1804                tmp = RREG32(DC_HPD3_INT_CONTROL);
1805                if (connected)
1806                        tmp &= ~DC_HPDx_INT_POLARITY;
1807                else
1808                        tmp |= DC_HPDx_INT_POLARITY;
1809                WREG32(DC_HPD3_INT_CONTROL, tmp);
1810                break;
1811        case RADEON_HPD_4:
1812                tmp = RREG32(DC_HPD4_INT_CONTROL);
1813                if (connected)
1814                        tmp &= ~DC_HPDx_INT_POLARITY;
1815                else
1816                        tmp |= DC_HPDx_INT_POLARITY;
1817                WREG32(DC_HPD4_INT_CONTROL, tmp);
1818                break;
1819        case RADEON_HPD_5:
1820                tmp = RREG32(DC_HPD5_INT_CONTROL);
1821                if (connected)
1822                        tmp &= ~DC_HPDx_INT_POLARITY;
1823                else
1824                        tmp |= DC_HPDx_INT_POLARITY;
1825                WREG32(DC_HPD5_INT_CONTROL, tmp);
1826                        break;
1827        case RADEON_HPD_6:
1828                tmp = RREG32(DC_HPD6_INT_CONTROL);
1829                if (connected)
1830                        tmp &= ~DC_HPDx_INT_POLARITY;
1831                else
1832                        tmp |= DC_HPDx_INT_POLARITY;
1833                WREG32(DC_HPD6_INT_CONTROL, tmp);
1834                break;
1835        default:
1836                break;
1837        }
1838}
1839
1840/**
1841 * evergreen_hpd_init - hpd setup callback.
1842 *
1843 * @rdev: radeon_device pointer
1844 *
1845 * Setup the hpd pins used by the card (evergreen+).
1846 * Enable the pin, set the polarity, and enable the hpd interrupts.
1847 */
1848void evergreen_hpd_init(struct radeon_device *rdev)
1849{
1850        struct drm_device *dev = rdev->ddev;
1851        struct drm_connector *connector;
1852        unsigned enabled = 0;
1853        u32 tmp = DC_HPDx_CONNECTION_TIMER(0x9c4) |
1854                DC_HPDx_RX_INT_TIMER(0xfa) | DC_HPDx_EN;
1855
1856        list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1857                struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1858
1859                if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
1860                    connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
1861                        /* don't try to enable hpd on eDP or LVDS avoid breaking the
1862                         * aux dp channel on imac and help (but not completely fix)
1863                         * https://bugzilla.redhat.com/show_bug.cgi?id=726143
1864                         * also avoid interrupt storms during dpms.
1865                         */
1866                        continue;
1867                }
1868                switch (radeon_connector->hpd.hpd) {
1869                case RADEON_HPD_1:
1870                        WREG32(DC_HPD1_CONTROL, tmp);
1871                        break;
1872                case RADEON_HPD_2:
1873                        WREG32(DC_HPD2_CONTROL, tmp);
1874                        break;
1875                case RADEON_HPD_3:
1876                        WREG32(DC_HPD3_CONTROL, tmp);
1877                        break;
1878                case RADEON_HPD_4:
1879                        WREG32(DC_HPD4_CONTROL, tmp);
1880                        break;
1881                case RADEON_HPD_5:
1882                        WREG32(DC_HPD5_CONTROL, tmp);
1883                        break;
1884                case RADEON_HPD_6:
1885                        WREG32(DC_HPD6_CONTROL, tmp);
1886                        break;
1887                default:
1888                        break;
1889                }
1890                radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);
1891                enabled |= 1 << radeon_connector->hpd.hpd;
1892        }
1893        radeon_irq_kms_enable_hpd(rdev, enabled);
1894}
1895
1896/**
1897 * evergreen_hpd_fini - hpd tear down callback.
1898 *
1899 * @rdev: radeon_device pointer
1900 *
1901 * Tear down the hpd pins used by the card (evergreen+).
1902 * Disable the hpd interrupts.
1903 */
1904void evergreen_hpd_fini(struct radeon_device *rdev)
1905{
1906        struct drm_device *dev = rdev->ddev;
1907        struct drm_connector *connector;
1908        unsigned disabled = 0;
1909
1910        list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1911                struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1912                switch (radeon_connector->hpd.hpd) {
1913                case RADEON_HPD_1:
1914                        WREG32(DC_HPD1_CONTROL, 0);
1915                        break;
1916                case RADEON_HPD_2:
1917                        WREG32(DC_HPD2_CONTROL, 0);
1918                        break;
1919                case RADEON_HPD_3:
1920                        WREG32(DC_HPD3_CONTROL, 0);
1921                        break;
1922                case RADEON_HPD_4:
1923                        WREG32(DC_HPD4_CONTROL, 0);
1924                        break;
1925                case RADEON_HPD_5:
1926                        WREG32(DC_HPD5_CONTROL, 0);
1927                        break;
1928                case RADEON_HPD_6:
1929                        WREG32(DC_HPD6_CONTROL, 0);
1930                        break;
1931                default:
1932                        break;
1933                }
1934                disabled |= 1 << radeon_connector->hpd.hpd;
1935        }
1936        radeon_irq_kms_disable_hpd(rdev, disabled);
1937}
1938
1939/* watermark setup */
1940
1941static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev,
1942                                        struct radeon_crtc *radeon_crtc,
1943                                        struct drm_display_mode *mode,
1944                                        struct drm_display_mode *other_mode)
1945{
1946        u32 tmp, buffer_alloc, i;
1947        u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
1948        /*
1949         * Line Buffer Setup
1950         * There are 3 line buffers, each one shared by 2 display controllers.
1951         * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between
1952         * the display controllers.  The paritioning is done via one of four
1953         * preset allocations specified in bits 2:0:
1954         * first display controller
1955         *  0 - first half of lb (3840 * 2)
1956         *  1 - first 3/4 of lb (5760 * 2)
1957         *  2 - whole lb (7680 * 2), other crtc must be disabled
1958         *  3 - first 1/4 of lb (1920 * 2)
1959         * second display controller
1960         *  4 - second half of lb (3840 * 2)
1961         *  5 - second 3/4 of lb (5760 * 2)
1962         *  6 - whole lb (7680 * 2), other crtc must be disabled
1963         *  7 - last 1/4 of lb (1920 * 2)
1964         */
1965        /* this can get tricky if we have two large displays on a paired group
1966         * of crtcs.  Ideally for multiple large displays we'd assign them to
1967         * non-linked crtcs for maximum line buffer allocation.
1968         */
1969        if (radeon_crtc->base.enabled && mode) {
1970                if (other_mode) {
1971                        tmp = 0; /* 1/2 */
1972                        buffer_alloc = 1;
1973                } else {
1974                        tmp = 2; /* whole */
1975                        buffer_alloc = 2;
1976                }
1977        } else {
1978                tmp = 0;
1979                buffer_alloc = 0;
1980        }
1981
1982        /* second controller of the pair uses second half of the lb */
1983        if (radeon_crtc->crtc_id % 2)
1984                tmp += 4;
1985        WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp);
1986
1987        if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) {
1988                WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
1989                       DMIF_BUFFERS_ALLOCATED(buffer_alloc));
1990                for (i = 0; i < rdev->usec_timeout; i++) {
1991                        if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
1992                            DMIF_BUFFERS_ALLOCATED_COMPLETED)
1993                                break;
1994                        udelay(1);
1995                }
1996        }
1997
1998        if (radeon_crtc->base.enabled && mode) {
1999                switch (tmp) {
2000                case 0:
2001                case 4:
2002                default:
2003                        if (ASIC_IS_DCE5(rdev))
2004                                return 4096 * 2;
2005                        else
2006                                return 3840 * 2;
2007                case 1:
2008                case 5:
2009                        if (ASIC_IS_DCE5(rdev))
2010                                return 6144 * 2;
2011                        else
2012                                return 5760 * 2;
2013                case 2:
2014                case 6:
2015                        if (ASIC_IS_DCE5(rdev))
2016                                return 8192 * 2;
2017                        else
2018                                return 7680 * 2;
2019                case 3:
2020                case 7:
2021                        if (ASIC_IS_DCE5(rdev))
2022                                return 2048 * 2;
2023                        else
2024                                return 1920 * 2;
2025                }
2026        }
2027
2028        /* controller not enabled, so no lb used */
2029        return 0;
2030}
2031
2032u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev)
2033{
2034        u32 tmp = RREG32(MC_SHARED_CHMAP);
2035
2036        switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
2037        case 0:
2038        default:
2039                return 1;
2040        case 1:
2041                return 2;
2042        case 2:
2043                return 4;
2044        case 3:
2045                return 8;
2046        }
2047}
2048
2049struct evergreen_wm_params {
2050        u32 dram_channels; /* number of dram channels */
2051        u32 yclk;          /* bandwidth per dram data pin in kHz */
2052        u32 sclk;          /* engine clock in kHz */
2053        u32 disp_clk;      /* display clock in kHz */
2054        u32 src_width;     /* viewport width */
2055        u32 active_time;   /* active display time in ns */
2056        u32 blank_time;    /* blank time in ns */
2057        bool interlaced;    /* mode is interlaced */
2058        fixed20_12 vsc;    /* vertical scale ratio */
2059        u32 num_heads;     /* number of active crtcs */
2060        u32 bytes_per_pixel; /* bytes per pixel display + overlay */
2061        u32 lb_size;       /* line buffer allocated to pipe */
2062        u32 vtaps;         /* vertical scaler taps */
2063};
2064
2065static u32 evergreen_dram_bandwidth(struct evergreen_wm_params *wm)
2066{
2067        /* Calculate DRAM Bandwidth and the part allocated to display. */
2068        fixed20_12 dram_efficiency; /* 0.7 */
2069        fixed20_12 yclk, dram_channels, bandwidth;
2070        fixed20_12 a;
2071
2072        a.full = dfixed_const(1000);
2073        yclk.full = dfixed_const(wm->yclk);
2074        yclk.full = dfixed_div(yclk, a);
2075        dram_channels.full = dfixed_const(wm->dram_channels * 4);
2076        a.full = dfixed_const(10);
2077        dram_efficiency.full = dfixed_const(7);
2078        dram_efficiency.full = dfixed_div(dram_efficiency, a);
2079        bandwidth.full = dfixed_mul(dram_channels, yclk);
2080        bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
2081
2082        return dfixed_trunc(bandwidth);
2083}
2084
2085static u32 evergreen_dram_bandwidth_for_display(struct evergreen_wm_params *wm)
2086{
2087        /* Calculate DRAM Bandwidth and the part allocated to display. */
2088        fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
2089        fixed20_12 yclk, dram_channels, bandwidth;
2090        fixed20_12 a;
2091
2092        a.full = dfixed_const(1000);
2093        yclk.full = dfixed_const(wm->yclk);
2094        yclk.full = dfixed_div(yclk, a);
2095        dram_channels.full = dfixed_const(wm->dram_channels * 4);
2096        a.full = dfixed_const(10);
2097        disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
2098        disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
2099        bandwidth.full = dfixed_mul(dram_channels, yclk);
2100        bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
2101
2102        return dfixed_trunc(bandwidth);
2103}
2104
2105static u32 evergreen_data_return_bandwidth(struct evergreen_wm_params *wm)
2106{
2107        /* Calculate the display Data return Bandwidth */
2108        fixed20_12 return_efficiency; /* 0.8 */
2109        fixed20_12 sclk, bandwidth;
2110        fixed20_12 a;
2111
2112        a.full = dfixed_const(1000);
2113        sclk.full = dfixed_const(wm->sclk);
2114        sclk.full = dfixed_div(sclk, a);
2115        a.full = dfixed_const(10);
2116        return_efficiency.full = dfixed_const(8);
2117        return_efficiency.full = dfixed_div(return_efficiency, a);
2118        a.full = dfixed_const(32);
2119        bandwidth.full = dfixed_mul(a, sclk);
2120        bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
2121
2122        return dfixed_trunc(bandwidth);
2123}
2124
2125static u32 evergreen_dmif_request_bandwidth(struct evergreen_wm_params *wm)
2126{
2127        /* Calculate the DMIF Request Bandwidth */
2128        fixed20_12 disp_clk_request_efficiency; /* 0.8 */
2129        fixed20_12 disp_clk, bandwidth;
2130        fixed20_12 a;
2131
2132        a.full = dfixed_const(1000);
2133        disp_clk.full = dfixed_const(wm->disp_clk);
2134        disp_clk.full = dfixed_div(disp_clk, a);
2135        a.full = dfixed_const(10);
2136        disp_clk_request_efficiency.full = dfixed_const(8);
2137        disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
2138        a.full = dfixed_const(32);
2139        bandwidth.full = dfixed_mul(a, disp_clk);
2140        bandwidth.full = dfixed_mul(bandwidth, disp_clk_request_efficiency);
2141
2142        return dfixed_trunc(bandwidth);
2143}
2144
2145static u32 evergreen_available_bandwidth(struct evergreen_wm_params *wm)
2146{
2147        /* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
2148        u32 dram_bandwidth = evergreen_dram_bandwidth(wm);
2149        u32 data_return_bandwidth = evergreen_data_return_bandwidth(wm);
2150        u32 dmif_req_bandwidth = evergreen_dmif_request_bandwidth(wm);
2151
2152        return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
2153}
2154
2155static u32 evergreen_average_bandwidth(struct evergreen_wm_params *wm)
2156{
2157        /* Calculate the display mode Average Bandwidth
2158         * DisplayMode should contain the source and destination dimensions,
2159         * timing, etc.
2160         */
2161        fixed20_12 bpp;
2162        fixed20_12 line_time;
2163        fixed20_12 src_width;
2164        fixed20_12 bandwidth;
2165        fixed20_12 a;
2166
2167        a.full = dfixed_const(1000);
2168        line_time.full = dfixed_const(wm->active_time + wm->blank_time);
2169        line_time.full = dfixed_div(line_time, a);
2170        bpp.full = dfixed_const(wm->bytes_per_pixel);
2171        src_width.full = dfixed_const(wm->src_width);
2172        bandwidth.full = dfixed_mul(src_width, bpp);
2173        bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
2174        bandwidth.full = dfixed_div(bandwidth, line_time);
2175
2176        return dfixed_trunc(bandwidth);
2177}
2178
2179static u32 evergreen_latency_watermark(struct evergreen_wm_params *wm)
2180{
2181        /* First calcualte the latency in ns */
2182        u32 mc_latency = 2000; /* 2000 ns. */
2183        u32 available_bandwidth = evergreen_available_bandwidth(wm);
2184        u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
2185        u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
2186        u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
2187        u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
2188                (wm->num_heads * cursor_line_pair_return_time);
2189        u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
2190        u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
2191        fixed20_12 a, b, c;
2192
2193        if (wm->num_heads == 0)
2194                return 0;
2195
2196        a.full = dfixed_const(2);
2197        b.full = dfixed_const(1);
2198        if ((wm->vsc.full > a.full) ||
2199            ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
2200            (wm->vtaps >= 5) ||
2201            ((wm->vsc.full >= a.full) && wm->interlaced))
2202                max_src_lines_per_dst_line = 4;
2203        else
2204                max_src_lines_per_dst_line = 2;
2205
2206        a.full = dfixed_const(available_bandwidth);
2207        b.full = dfixed_const(wm->num_heads);
2208        a.full = dfixed_div(a, b);
2209
2210        b.full = dfixed_const(1000);
2211        c.full = dfixed_const(wm->disp_clk);
2212        b.full = dfixed_div(c, b);
2213        c.full = dfixed_const(wm->bytes_per_pixel);
2214        b.full = dfixed_mul(b, c);
2215
2216        lb_fill_bw = min(dfixed_trunc(a), dfixed_trunc(b));
2217
2218        a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
2219        b.full = dfixed_const(1000);
2220        c.full = dfixed_const(lb_fill_bw);
2221        b.full = dfixed_div(c, b);
2222        a.full = dfixed_div(a, b);
2223        line_fill_time = dfixed_trunc(a);
2224
2225        if (line_fill_time < wm->active_time)
2226                return latency;
2227        else
2228                return latency + (line_fill_time - wm->active_time);
2229
2230}
2231
2232static bool evergreen_average_bandwidth_vs_dram_bandwidth_for_display(struct evergreen_wm_params *wm)
2233{
2234        if (evergreen_average_bandwidth(wm) <=
2235            (evergreen_dram_bandwidth_for_display(wm) / wm->num_heads))
2236                return true;
2237        else
2238                return false;
2239};
2240
2241static bool evergreen_average_bandwidth_vs_available_bandwidth(struct evergreen_wm_params *wm)
2242{
2243        if (evergreen_average_bandwidth(wm) <=
2244            (evergreen_available_bandwidth(wm) / wm->num_heads))
2245                return true;
2246        else
2247                return false;
2248};
2249
2250static bool evergreen_check_latency_hiding(struct evergreen_wm_params *wm)
2251{
2252        u32 lb_partitions = wm->lb_size / wm->src_width;
2253        u32 line_time = wm->active_time + wm->blank_time;
2254        u32 latency_tolerant_lines;
2255        u32 latency_hiding;
2256        fixed20_12 a;
2257
2258        a.full = dfixed_const(1);
2259        if (wm->vsc.full > a.full)
2260                latency_tolerant_lines = 1;
2261        else {
2262                if (lb_partitions <= (wm->vtaps + 1))
2263                        latency_tolerant_lines = 1;
2264                else
2265                        latency_tolerant_lines = 2;
2266        }
2267
2268        latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
2269
2270        if (evergreen_latency_watermark(wm) <= latency_hiding)
2271                return true;
2272        else
2273                return false;
2274}
2275
2276static void evergreen_program_watermarks(struct radeon_device *rdev,
2277                                         struct radeon_crtc *radeon_crtc,
2278                                         u32 lb_size, u32 num_heads)
2279{
2280        struct drm_display_mode *mode = &radeon_crtc->base.mode;
2281        struct evergreen_wm_params wm_low, wm_high;
2282        u32 dram_channels;
2283        u32 pixel_period;
2284        u32 line_time = 0;
2285        u32 latency_watermark_a = 0, latency_watermark_b = 0;
2286        u32 priority_a_mark = 0, priority_b_mark = 0;
2287        u32 priority_a_cnt = PRIORITY_OFF;
2288        u32 priority_b_cnt = PRIORITY_OFF;
2289        u32 pipe_offset = radeon_crtc->crtc_id * 16;
2290        u32 tmp, arb_control3;
2291        fixed20_12 a, b, c;
2292
2293        if (radeon_crtc->base.enabled && num_heads && mode) {
2294                pixel_period = 1000000 / (u32)mode->clock;
2295                line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
2296                priority_a_cnt = 0;
2297                priority_b_cnt = 0;
2298                dram_channels = evergreen_get_number_of_dram_channels(rdev);
2299
2300                /* watermark for high clocks */
2301                if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
2302                        wm_high.yclk =
2303                                radeon_dpm_get_mclk(rdev, false) * 10;
2304                        wm_high.sclk =
2305                                radeon_dpm_get_sclk(rdev, false) * 10;
2306                } else {
2307                        wm_high.yclk = rdev->pm.current_mclk * 10;
2308                        wm_high.sclk = rdev->pm.current_sclk * 10;
2309                }
2310
2311                wm_high.disp_clk = mode->clock;
2312                wm_high.src_width = mode->crtc_hdisplay;
2313                wm_high.active_time = mode->crtc_hdisplay * pixel_period;
2314                wm_high.blank_time = line_time - wm_high.active_time;
2315                wm_high.interlaced = false;
2316                if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2317                        wm_high.interlaced = true;
2318                wm_high.vsc = radeon_crtc->vsc;
2319                wm_high.vtaps = 1;
2320                if (radeon_crtc->rmx_type != RMX_OFF)
2321                        wm_high.vtaps = 2;
2322                wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
2323                wm_high.lb_size = lb_size;
2324                wm_high.dram_channels = dram_channels;
2325                wm_high.num_heads = num_heads;
2326
2327                /* watermark for low clocks */
2328                if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
2329                        wm_low.yclk =
2330                                radeon_dpm_get_mclk(rdev, true) * 10;
2331                        wm_low.sclk =
2332                                radeon_dpm_get_sclk(rdev, true) * 10;
2333                } else {
2334                        wm_low.yclk = rdev->pm.current_mclk * 10;
2335                        wm_low.sclk = rdev->pm.current_sclk * 10;
2336                }
2337
2338                wm_low.disp_clk = mode->clock;
2339                wm_low.src_width = mode->crtc_hdisplay;
2340                wm_low.active_time = mode->crtc_hdisplay * pixel_period;
2341                wm_low.blank_time = line_time - wm_low.active_time;
2342                wm_low.interlaced = false;
2343                if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2344                        wm_low.interlaced = true;
2345                wm_low.vsc = radeon_crtc->vsc;
2346                wm_low.vtaps = 1;
2347                if (radeon_crtc->rmx_type != RMX_OFF)
2348                        wm_low.vtaps = 2;
2349                wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
2350                wm_low.lb_size = lb_size;
2351                wm_low.dram_channels = dram_channels;
2352                wm_low.num_heads = num_heads;
2353
2354                /* set for high clocks */
2355                latency_watermark_a = min(evergreen_latency_watermark(&wm_high), (u32)65535);
2356                /* set for low clocks */
2357                latency_watermark_b = min(evergreen_latency_watermark(&wm_low), (u32)65535);
2358
2359                /* possibly force display priority to high */
2360                /* should really do this at mode validation time... */
2361                if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
2362                    !evergreen_average_bandwidth_vs_available_bandwidth(&wm_high) ||
2363                    !evergreen_check_latency_hiding(&wm_high) ||
2364                    (rdev->disp_priority == 2)) {
2365                        DRM_DEBUG_KMS("force priority a to high\n");
2366                        priority_a_cnt |= PRIORITY_ALWAYS_ON;
2367                }
2368                if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
2369                    !evergreen_average_bandwidth_vs_available_bandwidth(&wm_low) ||
2370                    !evergreen_check_latency_hiding(&wm_low) ||
2371                    (rdev->disp_priority == 2)) {
2372                        DRM_DEBUG_KMS("force priority b to high\n");
2373                        priority_b_cnt |= PRIORITY_ALWAYS_ON;
2374                }
2375
2376                a.full = dfixed_const(1000);
2377                b.full = dfixed_const(mode->clock);
2378                b.full = dfixed_div(b, a);
2379                c.full = dfixed_const(latency_watermark_a);
2380                c.full = dfixed_mul(c, b);
2381                c.full = dfixed_mul(c, radeon_crtc->hsc);
2382                c.full = dfixed_div(c, a);
2383                a.full = dfixed_const(16);
2384                c.full = dfixed_div(c, a);
2385                priority_a_mark = dfixed_trunc(c);
2386                priority_a_cnt |= priority_a_mark & PRIORITY_MARK_MASK;
2387
2388                a.full = dfixed_const(1000);
2389                b.full = dfixed_const(mode->clock);
2390                b.full = dfixed_div(b, a);
2391                c.full = dfixed_const(latency_watermark_b);
2392                c.full = dfixed_mul(c, b);
2393                c.full = dfixed_mul(c, radeon_crtc->hsc);
2394                c.full = dfixed_div(c, a);
2395                a.full = dfixed_const(16);
2396                c.full = dfixed_div(c, a);
2397                priority_b_mark = dfixed_trunc(c);
2398                priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK;
2399        }
2400
2401        /* select wm A */
2402        arb_control3 = RREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset);
2403        tmp = arb_control3;
2404        tmp &= ~LATENCY_WATERMARK_MASK(3);
2405        tmp |= LATENCY_WATERMARK_MASK(1);
2406        WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, tmp);
2407        WREG32(PIPE0_LATENCY_CONTROL + pipe_offset,
2408               (LATENCY_LOW_WATERMARK(latency_watermark_a) |
2409                LATENCY_HIGH_WATERMARK(line_time)));
2410        /* select wm B */
2411        tmp = RREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset);
2412        tmp &= ~LATENCY_WATERMARK_MASK(3);
2413        tmp |= LATENCY_WATERMARK_MASK(2);
2414        WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, tmp);
2415        WREG32(PIPE0_LATENCY_CONTROL + pipe_offset,
2416               (LATENCY_LOW_WATERMARK(latency_watermark_b) |
2417                LATENCY_HIGH_WATERMARK(line_time)));
2418        /* restore original selection */
2419        WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, arb_control3);
2420
2421        /* write the priority marks */
2422        WREG32(PRIORITY_A_CNT + radeon_crtc->crtc_offset, priority_a_cnt);
2423        WREG32(PRIORITY_B_CNT + radeon_crtc->crtc_offset, priority_b_cnt);
2424
2425        /* save values for DPM */
2426        radeon_crtc->line_time = line_time;
2427        radeon_crtc->wm_high = latency_watermark_a;
2428        radeon_crtc->wm_low = latency_watermark_b;
2429}
2430
2431/**
2432 * evergreen_bandwidth_update - update display watermarks callback.
2433 *
2434 * @rdev: radeon_device pointer
2435 *
2436 * Update the display watermarks based on the requested mode(s)
2437 * (evergreen+).
2438 */
2439void evergreen_bandwidth_update(struct radeon_device *rdev)
2440{
2441        struct drm_display_mode *mode0 = NULL;
2442        struct drm_display_mode *mode1 = NULL;
2443        u32 num_heads = 0, lb_size;
2444        int i;
2445
2446        if (!rdev->mode_info.mode_config_initialized)
2447                return;
2448
2449        radeon_update_display_priority(rdev);
2450
2451        for (i = 0; i < rdev->num_crtc; i++) {
2452                if (rdev->mode_info.crtcs[i]->base.enabled)
2453                        num_heads++;
2454        }
2455        for (i = 0; i < rdev->num_crtc; i += 2) {
2456                mode0 = &rdev->mode_info.crtcs[i]->base.mode;
2457                mode1 = &rdev->mode_info.crtcs[i+1]->base.mode;
2458                lb_size = evergreen_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i], mode0, mode1);
2459                evergreen_program_watermarks(rdev, rdev->mode_info.crtcs[i], lb_size, num_heads);
2460                lb_size = evergreen_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i+1], mode1, mode0);
2461                evergreen_program_watermarks(rdev, rdev->mode_info.crtcs[i+1], lb_size, num_heads);
2462        }
2463}
2464
2465/**
2466 * evergreen_mc_wait_for_idle - wait for MC idle callback.
2467 *
2468 * @rdev: radeon_device pointer
2469 *
2470 * Wait for the MC (memory controller) to be idle.
2471 * (evergreen+).
2472 * Returns 0 if the MC is idle, -1 if not.
2473 */
2474int evergreen_mc_wait_for_idle(struct radeon_device *rdev)
2475{
2476        unsigned i;
2477        u32 tmp;
2478
2479        for (i = 0; i < rdev->usec_timeout; i++) {
2480                /* read MC_STATUS */
2481                tmp = RREG32(SRBM_STATUS) & 0x1F00;
2482                if (!tmp)
2483                        return 0;
2484                udelay(1);
2485        }
2486        return -1;
2487}
2488
2489/*
2490 * GART
2491 */
2492void evergreen_pcie_gart_tlb_flush(struct radeon_device *rdev)
2493{
2494        unsigned i;
2495        u32 tmp;
2496
2497        WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
2498
2499        WREG32(VM_CONTEXT0_REQUEST_RESPONSE, REQUEST_TYPE(1));
2500        for (i = 0; i < rdev->usec_timeout; i++) {
2501                /* read MC_STATUS */
2502                tmp = RREG32(VM_CONTEXT0_REQUEST_RESPONSE);
2503                tmp = (tmp & RESPONSE_TYPE_MASK) >> RESPONSE_TYPE_SHIFT;
2504                if (tmp == 2) {
2505                        printk(KERN_WARNING "[drm] r600 flush TLB failed\n");
2506                        return;
2507                }
2508                if (tmp) {
2509                        return;
2510                }
2511                udelay(1);
2512        }
2513}
2514
2515static int evergreen_pcie_gart_enable(struct radeon_device *rdev)
2516{
2517        u32 tmp;
2518        int r;
2519
2520        if (rdev->gart.robj == NULL) {
2521                dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
2522                return -EINVAL;
2523        }
2524        r = radeon_gart_table_vram_pin(rdev);
2525        if (r)
2526                return r;
2527        /* Setup L2 cache */
2528        WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
2529                                ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
2530                                EFFECTIVE_L2_QUEUE_SIZE(7));
2531        WREG32(VM_L2_CNTL2, 0);
2532        WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
2533        /* Setup TLB control */
2534        tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
2535                SYSTEM_ACCESS_MODE_NOT_IN_SYS |
2536                SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
2537                EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
2538        if (rdev->flags & RADEON_IS_IGP) {
2539                WREG32(FUS_MC_VM_MD_L1_TLB0_CNTL, tmp);
2540                WREG32(FUS_MC_VM_MD_L1_TLB1_CNTL, tmp);
2541                WREG32(FUS_MC_VM_MD_L1_TLB2_CNTL, tmp);
2542        } else {
2543                WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
2544                WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
2545                WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
2546                if ((rdev->family == CHIP_JUNIPER) ||
2547                    (rdev->family == CHIP_CYPRESS) ||
2548                    (rdev->family == CHIP_HEMLOCK) ||
2549                    (rdev->family == CHIP_BARTS))
2550                        WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
2551        }
2552        WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
2553        WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
2554        WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
2555        WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
2556        WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
2557        WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
2558        WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
2559        WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
2560                                RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
2561        WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
2562                        (u32)(rdev->dummy_page.addr >> 12));
2563        WREG32(VM_CONTEXT1_CNTL, 0);
2564
2565        evergreen_pcie_gart_tlb_flush(rdev);
2566        DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
2567                 (unsigned)(rdev->mc.gtt_size >> 20),
2568                 (unsigned long long)rdev->gart.table_addr);
2569        rdev->gart.ready = true;
2570        return 0;
2571}
2572
2573static void evergreen_pcie_gart_disable(struct radeon_device *rdev)
2574{
2575        u32 tmp;
2576
2577        /* Disable all tables */
2578        WREG32(VM_CONTEXT0_CNTL, 0);
2579        WREG32(VM_CONTEXT1_CNTL, 0);
2580
2581        /* Setup L2 cache */
2582        WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
2583                                EFFECTIVE_L2_QUEUE_SIZE(7));
2584        WREG32(VM_L2_CNTL2, 0);
2585        WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
2586        /* Setup TLB control */
2587        tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
2588        WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
2589        WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
2590        WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
2591        WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
2592        WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
2593        WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
2594        WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
2595        radeon_gart_table_vram_unpin(rdev);
2596}
2597
2598static void evergreen_pcie_gart_fini(struct radeon_device *rdev)
2599{
2600        evergreen_pcie_gart_disable(rdev);
2601        radeon_gart_table_vram_free(rdev);
2602        radeon_gart_fini(rdev);
2603}
2604
2605
2606static void evergreen_agp_enable(struct radeon_device *rdev)
2607{
2608        u32 tmp;
2609
2610        /* Setup L2 cache */
2611        WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
2612                                ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
2613                                EFFECTIVE_L2_QUEUE_SIZE(7));
2614        WREG32(VM_L2_CNTL2, 0);
2615        WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
2616        /* Setup TLB control */
2617        tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
2618                SYSTEM_ACCESS_MODE_NOT_IN_SYS |
2619                SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
2620                EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
2621        WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
2622        WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
2623        WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
2624        WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
2625        WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
2626        WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
2627        WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
2628        WREG32(VM_CONTEXT0_CNTL, 0);
2629        WREG32(VM_CONTEXT1_CNTL, 0);
2630}
2631
2632void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save)
2633{
2634        u32 crtc_enabled, tmp, frame_count, blackout;
2635        int i, j;
2636
2637        if (!ASIC_IS_NODCE(rdev)) {
2638                save->vga_render_control = RREG32(VGA_RENDER_CONTROL);
2639                save->vga_hdp_control = RREG32(VGA_HDP_CONTROL);
2640
2641                /* disable VGA render */
2642                WREG32(VGA_RENDER_CONTROL, 0);
2643        }
2644        /* blank the display controllers */
2645        for (i = 0; i < rdev->num_crtc; i++) {
2646                crtc_enabled = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]) & EVERGREEN_CRTC_MASTER_EN;
2647                if (crtc_enabled) {
2648                        save->crtc_enabled[i] = true;
2649                        if (ASIC_IS_DCE6(rdev)) {
2650                                tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]);
2651                                if (!(tmp & EVERGREEN_CRTC_BLANK_DATA_EN)) {
2652                                        radeon_wait_for_vblank(rdev, i);
2653                                        WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2654                                        tmp |= EVERGREEN_CRTC_BLANK_DATA_EN;
2655                                        WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
2656                                        WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2657                                }
2658                        } else {
2659                                tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]);
2660                                if (!(tmp & EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE)) {
2661                                        radeon_wait_for_vblank(rdev, i);
2662                                        WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2663                                        tmp |= EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
2664                                        WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp);
2665                                        WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2666                                }
2667                        }
2668                        /* wait for the next frame */
2669                        frame_count = radeon_get_vblank_counter(rdev, i);
2670                        for (j = 0; j < rdev->usec_timeout; j++) {
2671                                if (radeon_get_vblank_counter(rdev, i) != frame_count)
2672                                        break;
2673                                udelay(1);
2674                        }
2675
2676                        /* XXX this is a hack to avoid strange behavior with EFI on certain systems */
2677                        WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2678                        tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]);
2679                        tmp &= ~EVERGREEN_CRTC_MASTER_EN;
2680                        WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp);
2681                        WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2682                        save->crtc_enabled[i] = false;
2683                        /* ***** */
2684                } else {
2685                        save->crtc_enabled[i] = false;
2686                }
2687        }
2688
2689        radeon_mc_wait_for_idle(rdev);
2690
2691        blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
2692        if ((blackout & BLACKOUT_MODE_MASK) != 1) {
2693                /* Block CPU access */
2694                WREG32(BIF_FB_EN, 0);
2695                /* blackout the MC */
2696                blackout &= ~BLACKOUT_MODE_MASK;
2697                WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1);
2698        }
2699        /* wait for the MC to settle */
2700        udelay(100);
2701
2702        /* lock double buffered regs */
2703        for (i = 0; i < rdev->num_crtc; i++) {
2704                if (save->crtc_enabled[i]) {
2705                        tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
2706                        if (!(tmp & EVERGREEN_GRPH_UPDATE_LOCK)) {
2707                                tmp |= EVERGREEN_GRPH_UPDATE_LOCK;
2708                                WREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i], tmp);
2709                        }
2710                        tmp = RREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i]);
2711                        if (!(tmp & 1)) {
2712                                tmp |= 1;
2713                                WREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i], tmp);
2714                        }
2715                }
2716        }
2717}
2718
2719void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save)
2720{
2721        u32 tmp, frame_count;
2722        int i, j;
2723
2724        /* update crtc base addresses */
2725        for (i = 0; i < rdev->num_crtc; i++) {
2726                WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
2727                       upper_32_bits(rdev->mc.vram_start));
2728                WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
2729                       upper_32_bits(rdev->mc.vram_start));
2730                WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + crtc_offsets[i],
2731                       (u32)rdev->mc.vram_start);
2732                WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + crtc_offsets[i],
2733                       (u32)rdev->mc.vram_start);
2734        }
2735
2736        if (!ASIC_IS_NODCE(rdev)) {
2737                WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS_HIGH, upper_32_bits(rdev->mc.vram_start));
2738                WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS, (u32)rdev->mc.vram_start);
2739        }
2740
2741        /* unlock regs and wait for update */
2742        for (i = 0; i < rdev->num_crtc; i++) {
2743                if (save->crtc_enabled[i]) {
2744                        tmp = RREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i]);
2745                        if ((tmp & 0x7) != 3) {
2746                                tmp &= ~0x7;
2747                                tmp |= 0x3;
2748                                WREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i], tmp);
2749                        }
2750                        tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
2751                        if (tmp & EVERGREEN_GRPH_UPDATE_LOCK) {
2752                                tmp &= ~EVERGREEN_GRPH_UPDATE_LOCK;
2753                                WREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i], tmp);
2754                        }
2755                        tmp = RREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i]);
2756                        if (tmp & 1) {
2757                                tmp &= ~1;
2758                                WREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i], tmp);
2759                        }
2760                        for (j = 0; j < rdev->usec_timeout; j++) {
2761                                tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
2762                                if ((tmp & EVERGREEN_GRPH_SURFACE_UPDATE_PENDING) == 0)
2763                                        break;
2764                                udelay(1);
2765                        }
2766                }
2767        }
2768
2769        /* unblackout the MC */
2770        tmp = RREG32(MC_SHARED_BLACKOUT_CNTL);
2771        tmp &= ~BLACKOUT_MODE_MASK;
2772        WREG32(MC_SHARED_BLACKOUT_CNTL, tmp);
2773        /* allow CPU access */
2774        WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
2775
2776        for (i = 0; i < rdev->num_crtc; i++) {
2777                if (save->crtc_enabled[i]) {
2778                        if (ASIC_IS_DCE6(rdev)) {
2779                                tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]);
2780                                tmp &= ~EVERGREEN_CRTC_BLANK_DATA_EN;
2781                                WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2782                                WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
2783                                WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2784                        } else {
2785                                tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]);
2786                                tmp &= ~EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE;
2787                                WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2788                                WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp);
2789                                WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2790                        }
2791                        /* wait for the next frame */
2792                        frame_count = radeon_get_vblank_counter(rdev, i);
2793                        for (j = 0; j < rdev->usec_timeout; j++) {
2794                                if (radeon_get_vblank_counter(rdev, i) != frame_count)
2795                                        break;
2796                                udelay(1);
2797                        }
2798                }
2799        }
2800        if (!ASIC_IS_NODCE(rdev)) {
2801                /* Unlock vga access */
2802                WREG32(VGA_HDP_CONTROL, save->vga_hdp_control);
2803                mdelay(1);
2804                WREG32(VGA_RENDER_CONTROL, save->vga_render_control);
2805        }
2806}
2807
2808void evergreen_mc_program(struct radeon_device *rdev)
2809{
2810        struct evergreen_mc_save save;
2811        u32 tmp;
2812        int i, j;
2813
2814        /* Initialize HDP */
2815        for (i = 0, j = 0; i < 32; i++, j += 0x18) {
2816                WREG32((0x2c14 + j), 0x00000000);
2817                WREG32((0x2c18 + j), 0x00000000);
2818                WREG32((0x2c1c + j), 0x00000000);
2819                WREG32((0x2c20 + j), 0x00000000);
2820                WREG32((0x2c24 + j), 0x00000000);
2821        }
2822        WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
2823
2824        evergreen_mc_stop(rdev, &save);
2825        if (evergreen_mc_wait_for_idle(rdev)) {
2826                dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
2827        }
2828        /* Lockout access through VGA aperture*/
2829        WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
2830        /* Update configuration */
2831        if (rdev->flags & RADEON_IS_AGP) {
2832                if (rdev->mc.vram_start < rdev->mc.gtt_start) {
2833                        /* VRAM before AGP */
2834                        WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
2835                                rdev->mc.vram_start >> 12);
2836                        WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
2837                                rdev->mc.gtt_end >> 12);
2838                } else {
2839                        /* VRAM after AGP */
2840                        WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
2841                                rdev->mc.gtt_start >> 12);
2842                        WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
2843                                rdev->mc.vram_end >> 12);
2844                }
2845        } else {
2846                WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
2847                        rdev->mc.vram_start >> 12);
2848                WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
2849                        rdev->mc.vram_end >> 12);
2850        }
2851        WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
2852        /* llano/ontario only */
2853        if ((rdev->family == CHIP_PALM) ||
2854            (rdev->family == CHIP_SUMO) ||
2855            (rdev->family == CHIP_SUMO2)) {
2856                tmp = RREG32(MC_FUS_VM_FB_OFFSET) & 0x000FFFFF;
2857                tmp |= ((rdev->mc.vram_end >> 20) & 0xF) << 24;
2858                tmp |= ((rdev->mc.vram_start >> 20) & 0xF) << 20;
2859                WREG32(MC_FUS_VM_FB_OFFSET, tmp);
2860        }
2861        tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
2862        tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
2863        WREG32(MC_VM_FB_LOCATION, tmp);
2864        WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
2865        WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
2866        WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
2867        if (rdev->flags & RADEON_IS_AGP) {
2868                WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16);
2869                WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16);
2870                WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
2871        } else {
2872                WREG32(MC_VM_AGP_BASE, 0);
2873                WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
2874                WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
2875        }
2876        if (evergreen_mc_wait_for_idle(rdev)) {
2877                dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
2878        }
2879        evergreen_mc_resume(rdev, &save);
2880        /* we need to own VRAM, so turn off the VGA renderer here
2881         * to stop it overwriting our objects */
2882        rv515_vga_render_disable(rdev);
2883}
2884
2885/*
2886 * CP.
2887 */
2888void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
2889{
2890        struct radeon_ring *ring = &rdev->ring[ib->ring];
2891        u32 next_rptr;
2892
2893        /* set to DX10/11 mode */
2894        radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
2895        radeon_ring_write(ring, 1);
2896
2897        if (ring->rptr_save_reg) {
2898                next_rptr = ring->wptr + 3 + 4;
2899                radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
2900                radeon_ring_write(ring, ((ring->rptr_save_reg - 
2901                                          PACKET3_SET_CONFIG_REG_START) >> 2));
2902                radeon_ring_write(ring, next_rptr);
2903        } else if (rdev->wb.enabled) {
2904                next_rptr = ring->wptr + 5 + 4;
2905                radeon_ring_write(ring, PACKET3(PACKET3_MEM_WRITE, 3));
2906                radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
2907                radeon_ring_write(ring, (upper_32_bits(ring->next_rptr_gpu_addr) & 0xff) | (1 << 18));
2908                radeon_ring_write(ring, next_rptr);
2909                radeon_ring_write(ring, 0);
2910        }
2911
2912        radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
2913        radeon_ring_write(ring,
2914#ifdef __BIG_ENDIAN
2915                          (2 << 0) |
2916#endif
2917                          (ib->gpu_addr & 0xFFFFFFFC));
2918        radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF);
2919        radeon_ring_write(ring, ib->length_dw);
2920}
2921
2922
2923static int evergreen_cp_load_microcode(struct radeon_device *rdev)
2924{
2925        const __be32 *fw_data;
2926        int i;
2927
2928        if (!rdev->me_fw || !rdev->pfp_fw)
2929                return -EINVAL;
2930
2931        r700_cp_stop(rdev);
2932        WREG32(CP_RB_CNTL,
2933#ifdef __BIG_ENDIAN
2934               BUF_SWAP_32BIT |
2935#endif
2936               RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
2937
2938        fw_data = (const __be32 *)rdev->pfp_fw->data;
2939        WREG32(CP_PFP_UCODE_ADDR, 0);
2940        for (i = 0; i < EVERGREEN_PFP_UCODE_SIZE; i++)
2941                WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
2942        WREG32(CP_PFP_UCODE_ADDR, 0);
2943
2944        fw_data = (const __be32 *)rdev->me_fw->data;
2945        WREG32(CP_ME_RAM_WADDR, 0);
2946        for (i = 0; i < EVERGREEN_PM4_UCODE_SIZE; i++)
2947                WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
2948
2949        WREG32(CP_PFP_UCODE_ADDR, 0);
2950        WREG32(CP_ME_RAM_WADDR, 0);
2951        WREG32(CP_ME_RAM_RADDR, 0);
2952        return 0;
2953}
2954
2955static int evergreen_cp_start(struct radeon_device *rdev)
2956{
2957        struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
2958        int r, i;
2959        uint32_t cp_me;
2960
2961        r = radeon_ring_lock(rdev, ring, 7);
2962        if (r) {
2963                DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
2964                return r;
2965        }
2966        radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
2967        radeon_ring_write(ring, 0x1);
2968        radeon_ring_write(ring, 0x0);
2969        radeon_ring_write(ring, rdev->config.evergreen.max_hw_contexts - 1);
2970        radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
2971        radeon_ring_write(ring, 0);
2972        radeon_ring_write(ring, 0);
2973        radeon_ring_unlock_commit(rdev, ring, false);
2974
2975        cp_me = 0xff;
2976        WREG32(CP_ME_CNTL, cp_me);
2977
2978        r = radeon_ring_lock(rdev, ring, evergreen_default_size + 19);
2979        if (r) {
2980                DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
2981                return r;
2982        }
2983
2984        /* setup clear context state */
2985        radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
2986        radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
2987
2988        for (i = 0; i < evergreen_default_size; i++)
2989                radeon_ring_write(ring, evergreen_default_state[i]);
2990
2991        radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
2992        radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
2993
2994        /* set clear context state */
2995        radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
2996        radeon_ring_write(ring, 0);
2997
2998        /* SQ_VTX_BASE_VTX_LOC */
2999        radeon_ring_write(ring, 0xc0026f00);
3000        radeon_ring_write(ring, 0x00000000);
3001        radeon_ring_write(ring, 0x00000000);
3002        radeon_ring_write(ring, 0x00000000);
3003
3004        /* Clear consts */
3005        radeon_ring_write(ring, 0xc0036f00);
3006        radeon_ring_write(ring, 0x00000bc4);
3007        radeon_ring_write(ring, 0xffffffff);
3008        radeon_ring_write(ring, 0xffffffff);
3009        radeon_ring_write(ring, 0xffffffff);
3010
3011        radeon_ring_write(ring, 0xc0026900);
3012        radeon_ring_write(ring, 0x00000316);
3013        radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
3014        radeon_ring_write(ring, 0x00000010); /*  */
3015
3016        radeon_ring_unlock_commit(rdev, ring, false);
3017
3018        return 0;
3019}
3020
3021static int evergreen_cp_resume(struct radeon_device *rdev)
3022{
3023        struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
3024        u32 tmp;
3025        u32 rb_bufsz;
3026        int r;
3027
3028        /* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
3029        WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
3030                                 SOFT_RESET_PA |
3031                                 SOFT_RESET_SH |
3032                                 SOFT_RESET_VGT |
3033                                 SOFT_RESET_SPI |
3034                                 SOFT_RESET_SX));
3035        RREG32(GRBM_SOFT_RESET);
3036        mdelay(15);
3037        WREG32(GRBM_SOFT_RESET, 0);
3038        RREG32(GRBM_SOFT_RESET);
3039
3040        /* Set ring buffer size */
3041        rb_bufsz = order_base_2(ring->ring_size / 8);
3042        tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
3043#ifdef __BIG_ENDIAN
3044        tmp |= BUF_SWAP_32BIT;
3045#endif
3046        WREG32(CP_RB_CNTL, tmp);
3047        WREG32(CP_SEM_WAIT_TIMER, 0x0);
3048        WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
3049
3050        /* Set the write pointer delay */
3051        WREG32(CP_RB_WPTR_DELAY, 0);
3052
3053        /* Initialize the ring buffer's read and write pointers */
3054        WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA);
3055        WREG32(CP_RB_RPTR_WR, 0);
3056        ring->wptr = 0;
3057        WREG32(CP_RB_WPTR, ring->wptr);
3058
3059        /* set the wb address whether it's enabled or not */
3060        WREG32(CP_RB_RPTR_ADDR,
3061               ((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC));
3062        WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
3063        WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
3064
3065        if (rdev->wb.enabled)
3066                WREG32(SCRATCH_UMSK, 0xff);
3067        else {
3068                tmp |= RB_NO_UPDATE;
3069                WREG32(SCRATCH_UMSK, 0);
3070        }
3071
3072        mdelay(1);
3073        WREG32(CP_RB_CNTL, tmp);
3074
3075        WREG32(CP_RB_BASE, ring->gpu_addr >> 8);
3076        WREG32(CP_DEBUG, (1 << 27) | (1 << 28));
3077
3078        evergreen_cp_start(rdev);
3079        ring->ready = true;
3080        r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring);
3081        if (r) {
3082                ring->ready = false;
3083                return r;
3084        }
3085        return 0;
3086}
3087
3088/*
3089 * Core functions
3090 */
3091static void evergreen_gpu_init(struct radeon_device *rdev)
3092{
3093        u32 gb_addr_config;
3094        u32 mc_shared_chmap, mc_arb_ramcfg;
3095        u32 sx_debug_1;
3096        u32 smx_dc_ctl0;
3097        u32 sq_config;
3098        u32 sq_lds_resource_mgmt;
3099        u32 sq_gpr_resource_mgmt_1;
3100        u32 sq_gpr_resource_mgmt_2;
3101        u32 sq_gpr_resource_mgmt_3;
3102        u32 sq_thread_resource_mgmt;
3103        u32 sq_thread_resource_mgmt_2;
3104        u32 sq_stack_resource_mgmt_1;
3105        u32 sq_stack_resource_mgmt_2;
3106        u32 sq_stack_resource_mgmt_3;
3107        u32 vgt_cache_invalidation;
3108        u32 hdp_host_path_cntl, tmp;
3109        u32 disabled_rb_mask;
3110        int i, j, ps_thread_count;
3111
3112        switch (rdev->family) {
3113        case CHIP_CYPRESS:
3114        case CHIP_HEMLOCK:
3115                rdev->config.evergreen.num_ses = 2;
3116                rdev->config.evergreen.max_pipes = 4;
3117                rdev->config.evergreen.max_tile_pipes = 8;
3118                rdev->config.evergreen.max_simds = 10;
3119                rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses;
3120                rdev->config.evergreen.max_gprs = 256;
3121                rdev->config.evergreen.max_threads = 248;
3122                rdev->config.evergreen.max_gs_threads = 32;
3123                rdev->config.evergreen.max_stack_entries = 512;
3124                rdev->config.evergreen.sx_num_of_sets = 4;
3125                rdev->config.evergreen.sx_max_export_size = 256;
3126                rdev->config.evergreen.sx_max_export_pos_size = 64;
3127                rdev->config.evergreen.sx_max_export_smx_size = 192;
3128                rdev->config.evergreen.max_hw_contexts = 8;
3129                rdev->config.evergreen.sq_num_cf_insts = 2;
3130
3131                rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3132                rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3133                rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3134                gb_addr_config = CYPRESS_GB_ADDR_CONFIG_GOLDEN;
3135                break;
3136        case CHIP_JUNIPER:
3137                rdev->config.evergreen.num_ses = 1;
3138                rdev->config.evergreen.max_pipes = 4;
3139                rdev->config.evergreen.max_tile_pipes = 4;
3140                rdev->config.evergreen.max_simds = 10;
3141                rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses;
3142                rdev->config.evergreen.max_gprs = 256;
3143                rdev->config.evergreen.max_threads = 248;
3144                rdev->config.evergreen.max_gs_threads = 32;
3145                rdev->config.evergreen.max_stack_entries = 512;
3146                rdev->config.evergreen.sx_num_of_sets = 4;
3147                rdev->config.evergreen.sx_max_export_size = 256;
3148                rdev->config.evergreen.sx_max_export_pos_size = 64;
3149                rdev->config.evergreen.sx_max_export_smx_size = 192;
3150                rdev->config.evergreen.max_hw_contexts = 8;
3151                rdev->config.evergreen.sq_num_cf_insts = 2;
3152
3153                rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3154                rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3155                rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3156                gb_addr_config = JUNIPER_GB_ADDR_CONFIG_GOLDEN;
3157                break;
3158        case CHIP_REDWOOD:
3159                rdev->config.evergreen.num_ses = 1;
3160                rdev->config.evergreen.max_pipes = 4;
3161                rdev->config.evergreen.max_tile_pipes = 4;
3162                rdev->config.evergreen.max_simds = 5;
3163                rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses;
3164                rdev->config.evergreen.max_gprs = 256;
3165                rdev->config.evergreen.max_threads = 248;
3166                rdev->config.evergreen.max_gs_threads = 32;
3167                rdev->config.evergreen.max_stack_entries = 256;
3168                rdev->config.evergreen.sx_num_of_sets = 4;
3169                rdev->config.evergreen.sx_max_export_size = 256;
3170                rdev->config.evergreen.sx_max_export_pos_size = 64;
3171                rdev->config.evergreen.sx_max_export_smx_size = 192;
3172                rdev->config.evergreen.max_hw_contexts = 8;
3173                rdev->config.evergreen.sq_num_cf_insts = 2;
3174
3175                rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3176                rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3177                rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3178                gb_addr_config = REDWOOD_GB_ADDR_CONFIG_GOLDEN;
3179                break;
3180        case CHIP_CEDAR:
3181        default:
3182                rdev->config.evergreen.num_ses = 1;
3183                rdev->config.evergreen.max_pipes = 2;
3184                rdev->config.evergreen.max_tile_pipes = 2;
3185                rdev->config.evergreen.max_simds = 2;
3186                rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3187                rdev->config.evergreen.max_gprs = 256;
3188                rdev->config.evergreen.max_threads = 192;
3189                rdev->config.evergreen.max_gs_threads = 16;
3190                rdev->config.evergreen.max_stack_entries = 256;
3191                rdev->config.evergreen.sx_num_of_sets = 4;
3192                rdev->config.evergreen.sx_max_export_size = 128;
3193                rdev->config.evergreen.sx_max_export_pos_size = 32;
3194                rdev->config.evergreen.sx_max_export_smx_size = 96;
3195                rdev->config.evergreen.max_hw_contexts = 4;
3196                rdev->config.evergreen.sq_num_cf_insts = 1;
3197
3198                rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3199                rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3200                rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3201                gb_addr_config = CEDAR_GB_ADDR_CONFIG_GOLDEN;
3202                break;
3203        case CHIP_PALM:
3204                rdev->config.evergreen.num_ses = 1;
3205                rdev->config.evergreen.max_pipes = 2;
3206                rdev->config.evergreen.max_tile_pipes = 2;
3207                rdev->config.evergreen.max_simds = 2;
3208                rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3209                rdev->config.evergreen.max_gprs = 256;
3210                rdev->config.evergreen.max_threads = 192;
3211                rdev->config.evergreen.max_gs_threads = 16;
3212                rdev->config.evergreen.max_stack_entries = 256;
3213                rdev->config.evergreen.sx_num_of_sets = 4;
3214                rdev->config.evergreen.sx_max_export_size = 128;
3215                rdev->config.evergreen.sx_max_export_pos_size = 32;
3216                rdev->config.evergreen.sx_max_export_smx_size = 96;
3217                rdev->config.evergreen.max_hw_contexts = 4;
3218                rdev->config.evergreen.sq_num_cf_insts = 1;
3219
3220                rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3221                rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3222                rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3223                gb_addr_config = CEDAR_GB_ADDR_CONFIG_GOLDEN;
3224                break;
3225        case CHIP_SUMO:
3226                rdev->config.evergreen.num_ses = 1;
3227                rdev->config.evergreen.max_pipes = 4;
3228                rdev->config.evergreen.max_tile_pipes = 4;
3229                if (rdev->pdev->device == 0x9648)
3230                        rdev->config.evergreen.max_simds = 3;
3231                else if ((rdev->pdev->device == 0x9647) ||
3232                         (rdev->pdev->device == 0x964a))
3233                        rdev->config.evergreen.max_simds = 4;
3234                else
3235                        rdev->config.evergreen.max_simds = 5;
3236                rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses;
3237                rdev->config.evergreen.max_gprs = 256;
3238                rdev->config.evergreen.max_threads = 248;
3239                rdev->config.evergreen.max_gs_threads = 32;
3240                rdev->config.evergreen.max_stack_entries = 256;
3241                rdev->config.evergreen.sx_num_of_sets = 4;
3242                rdev->config.evergreen.sx_max_export_size = 256;
3243                rdev->config.evergreen.sx_max_export_pos_size = 64;
3244                rdev->config.evergreen.sx_max_export_smx_size = 192;
3245                rdev->config.evergreen.max_hw_contexts = 8;
3246                rdev->config.evergreen.sq_num_cf_insts = 2;
3247
3248                rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3249                rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3250                rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3251                gb_addr_config = SUMO_GB_ADDR_CONFIG_GOLDEN;
3252                break;
3253        case CHIP_SUMO2:
3254                rdev->config.evergreen.num_ses = 1;
3255                rdev->config.evergreen.max_pipes = 4;
3256                rdev->config.evergreen.max_tile_pipes = 4;
3257                rdev->config.evergreen.max_simds = 2;
3258                rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3259                rdev->config.evergreen.max_gprs = 256;
3260                rdev->config.evergreen.max_threads = 248;
3261                rdev->config.evergreen.max_gs_threads = 32;
3262                rdev->config.evergreen.max_stack_entries = 512;
3263                rdev->config.evergreen.sx_num_of_sets = 4;
3264                rdev->config.evergreen.sx_max_export_size = 256;
3265                rdev->config.evergreen.sx_max_export_pos_size = 64;
3266                rdev->config.evergreen.sx_max_export_smx_size = 192;
3267                rdev->config.evergreen.max_hw_contexts = 4;
3268                rdev->config.evergreen.sq_num_cf_insts = 2;
3269
3270                rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3271                rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3272                rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3273                gb_addr_config = SUMO2_GB_ADDR_CONFIG_GOLDEN;
3274                break;
3275        case CHIP_BARTS:
3276                rdev->config.evergreen.num_ses = 2;
3277                rdev->config.evergreen.max_pipes = 4;
3278                rdev->config.evergreen.max_tile_pipes = 8;
3279                rdev->config.evergreen.max_simds = 7;
3280                rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses;
3281                rdev->config.evergreen.max_gprs = 256;
3282                rdev->config.evergreen.max_threads = 248;
3283                rdev->config.evergreen.max_gs_threads = 32;
3284                rdev->config.evergreen.max_stack_entries = 512;
3285                rdev->config.evergreen.sx_num_of_sets = 4;
3286                rdev->config.evergreen.sx_max_export_size = 256;
3287                rdev->config.evergreen.sx_max_export_pos_size = 64;
3288                rdev->config.evergreen.sx_max_export_smx_size = 192;
3289                rdev->config.evergreen.max_hw_contexts = 8;
3290                rdev->config.evergreen.sq_num_cf_insts = 2;
3291
3292                rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3293                rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3294                rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3295                gb_addr_config = BARTS_GB_ADDR_CONFIG_GOLDEN;
3296                break;
3297        case CHIP_TURKS:
3298                rdev->config.evergreen.num_ses = 1;
3299                rdev->config.evergreen.max_pipes = 4;
3300                rdev->config.evergreen.max_tile_pipes = 4;
3301                rdev->config.evergreen.max_simds = 6;
3302                rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses;
3303                rdev->config.evergreen.max_gprs = 256;
3304                rdev->config.evergreen.max_threads = 248;
3305                rdev->config.evergreen.max_gs_threads = 32;
3306                rdev->config.evergreen.max_stack_entries = 256;
3307                rdev->config.evergreen.sx_num_of_sets = 4;
3308                rdev->config.evergreen.sx_max_export_size = 256;
3309                rdev->config.evergreen.sx_max_export_pos_size = 64;
3310                rdev->config.evergreen.sx_max_export_smx_size = 192;
3311                rdev->config.evergreen.max_hw_contexts = 8;
3312                rdev->config.evergreen.sq_num_cf_insts = 2;
3313
3314                rdev->config.evergreen.sc_prim_fifo_size = 0x100;
3315                rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3316                rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3317                gb_addr_config = TURKS_GB_ADDR_CONFIG_GOLDEN;
3318                break;
3319        case CHIP_CAICOS:
3320                rdev->config.evergreen.num_ses = 1;
3321                rdev->config.evergreen.max_pipes = 2;
3322                rdev->config.evergreen.max_tile_pipes = 2;
3323                rdev->config.evergreen.max_simds = 2;
3324                rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
3325                rdev->config.evergreen.max_gprs = 256;
3326                rdev->config.evergreen.max_threads = 192;
3327                rdev->config.evergreen.max_gs_threads = 16;
3328                rdev->config.evergreen.max_stack_entries = 256;
3329                rdev->config.evergreen.sx_num_of_sets = 4;
3330                rdev->config.evergreen.sx_max_export_size = 128;
3331                rdev->config.evergreen.sx_max_export_pos_size = 32;
3332                rdev->config.evergreen.sx_max_export_smx_size = 96;
3333                rdev->config.evergreen.max_hw_contexts = 4;
3334                rdev->config.evergreen.sq_num_cf_insts = 1;
3335
3336                rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3337                rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3338                rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
3339                gb_addr_config = CAICOS_GB_ADDR_CONFIG_GOLDEN;
3340                break;
3341        }
3342
3343        /* Initialize HDP */
3344        for (i = 0, j = 0; i < 32; i++, j += 0x18) {
3345                WREG32((0x2c14 + j), 0x00000000);
3346                WREG32((0x2c18 + j), 0x00000000);
3347                WREG32((0x2c1c + j), 0x00000000);
3348                WREG32((0x2c20 + j), 0x00000000);
3349                WREG32((0x2c24 + j), 0x00000000);
3350        }
3351
3352        WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
3353        WREG32(SRBM_INT_CNTL, 0x1);
3354        WREG32(SRBM_INT_ACK, 0x1);
3355
3356        evergreen_fix_pci_max_read_req_size(rdev);
3357
3358        mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
3359        if ((rdev->family == CHIP_PALM) ||
3360            (rdev->family == CHIP_SUMO) ||
3361            (rdev->family == CHIP_SUMO2))
3362                mc_arb_ramcfg = RREG32(FUS_MC_ARB_RAMCFG);
3363        else
3364                mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
3365
3366        /* setup tiling info dword.  gb_addr_config is not adequate since it does
3367         * not have bank info, so create a custom tiling dword.
3368         * bits 3:0   num_pipes
3369         * bits 7:4   num_banks
3370         * bits 11:8  group_size
3371         * bits 15:12 row_size
3372         */
3373        rdev->config.evergreen.tile_config = 0;
3374        switch (rdev->config.evergreen.max_tile_pipes) {
3375        case 1:
3376        default:
3377                rdev->config.evergreen.tile_config |= (0 << 0);
3378                break;
3379        case 2:
3380                rdev->config.evergreen.tile_config |= (1 << 0);
3381                break;
3382        case 4:
3383                rdev->config.evergreen.tile_config |= (2 << 0);
3384                break;
3385        case 8:
3386                rdev->config.evergreen.tile_config |= (3 << 0);
3387                break;
3388        }
3389        /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */
3390        if (rdev->flags & RADEON_IS_IGP)
3391                rdev->config.evergreen.tile_config |= 1 << 4;
3392        else {
3393                switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
3394                case 0: /* four banks */
3395                        rdev->config.evergreen.tile_config |= 0 << 4;
3396                        break;
3397                case 1: /* eight banks */
3398                        rdev->config.evergreen.tile_config |= 1 << 4;
3399                        break;
3400                case 2: /* sixteen banks */
3401                default:
3402                        rdev->config.evergreen.tile_config |= 2 << 4;
3403                        break;
3404                }
3405        }
3406        rdev->config.evergreen.tile_config |= 0 << 8;
3407        rdev->config.evergreen.tile_config |=
3408                ((gb_addr_config & 0x30000000) >> 28) << 12;
3409
3410        if ((rdev->family >= CHIP_CEDAR) && (rdev->family <= CHIP_HEMLOCK)) {
3411                u32 efuse_straps_4;
3412                u32 efuse_straps_3;
3413
3414                efuse_straps_4 = RREG32_RCU(0x204);
3415                efuse_straps_3 = RREG32_RCU(0x203);
3416                tmp = (((efuse_straps_4 & 0xf) << 4) |
3417                      ((efuse_straps_3 & 0xf0000000) >> 28));
3418        } else {
3419                tmp = 0;
3420                for (i = (rdev->config.evergreen.num_ses - 1); i >= 0; i--) {
3421                        u32 rb_disable_bitmap;
3422
3423                        WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3424                        WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3425                        rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16;
3426                        tmp <<= 4;
3427                        tmp |= rb_disable_bitmap;
3428                }
3429        }
3430        /* enabled rb are just the one not disabled :) */
3431        disabled_rb_mask = tmp;
3432        tmp = 0;
3433        for (i = 0; i < rdev->config.evergreen.max_backends; i++)
3434                tmp |= (1 << i);
3435        /* if all the backends are disabled, fix it up here */
3436        if ((disabled_rb_mask & tmp) == tmp) {
3437                for (i = 0; i < rdev->config.evergreen.max_backends; i++)
3438                        disabled_rb_mask &= ~(1 << i);
3439        }
3440
3441        for (i = 0; i < rdev->config.evergreen.num_ses; i++) {
3442                u32 simd_disable_bitmap;
3443
3444                WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3445                WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
3446                simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
3447                simd_disable_bitmap |= 0xffffffff << rdev->config.evergreen.max_simds;
3448                tmp <<= 16;
3449                tmp |= simd_disable_bitmap;
3450        }
3451        rdev->config.evergreen.active_simds = hweight32(~tmp);
3452
3453        WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
3454        WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
3455
3456        WREG32(GB_ADDR_CONFIG, gb_addr_config);
3457        WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
3458        WREG32(HDP_ADDR_CONFIG, gb_addr_config);
3459        WREG32(DMA_TILING_CONFIG, gb_addr_config);
3460        WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
3461        WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
3462        WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
3463
3464        if ((rdev->config.evergreen.max_backends == 1) &&
3465            (rdev->flags & RADEON_IS_IGP)) {
3466                if ((disabled_rb_mask & 3) == 1) {
3467                        /* RB0 disabled, RB1 enabled */
3468                        tmp = 0x11111111;
3469                } else {
3470                        /* RB1 disabled, RB0 enabled */
3471                        tmp = 0x00000000;
3472                }
3473        } else {
3474                tmp = gb_addr_config & NUM_PIPES_MASK;
3475                tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.evergreen.max_backends,
3476                                                EVERGREEN_MAX_BACKENDS, disabled_rb_mask);
3477        }
3478        WREG32(GB_BACKEND_MAP, tmp);
3479
3480        WREG32(CGTS_SYS_TCC_DISABLE, 0);
3481        WREG32(CGTS_TCC_DISABLE, 0);
3482        WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
3483        WREG32(CGTS_USER_TCC_DISABLE, 0);
3484
3485        /* set HW defaults for 3D engine */
3486        WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
3487                                     ROQ_IB2_START(0x2b)));
3488
3489        WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
3490
3491        WREG32(TA_CNTL_AUX, (DISABLE_CUBE_ANISO |
3492                             SYNC_GRADIENT |
3493                             SYNC_WALKER |
3494                             SYNC_ALIGNER));
3495
3496        sx_debug_1 = RREG32(SX_DEBUG_1);
3497        sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
3498        WREG32(SX_DEBUG_1, sx_debug_1);
3499
3500
3501        smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
3502        smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
3503        smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.evergreen.sx_num_of_sets);
3504        WREG32(SMX_DC_CTL0, smx_dc_ctl0);
3505
3506        if (rdev->family <= CHIP_SUMO2)
3507                WREG32(SMX_SAR_CTL0, 0x00010000);
3508
3509        WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_size / 4) - 1) |
3510                                        POSITION_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_pos_size / 4) - 1) |
3511                                        SMX_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_smx_size / 4) - 1)));
3512
3513        WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.evergreen.sc_prim_fifo_size) |
3514                                 SC_HIZ_TILE_FIFO_SIZE(rdev->config.evergreen.sc_hiz_tile_fifo_size) |
3515                                 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.evergreen.sc_earlyz_tile_fifo_size)));
3516
3517        WREG32(VGT_NUM_INSTANCES, 1);
3518        WREG32(SPI_CONFIG_CNTL, 0);
3519        WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
3520        WREG32(CP_PERFMON_CNTL, 0);
3521
3522        WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.evergreen.sq_num_cf_insts) |
3523                                  FETCH_FIFO_HIWATER(0x4) |
3524                                  DONE_FIFO_HIWATER(0xe0) |
3525                                  ALU_UPDATE_FIFO_HIWATER(0x8)));
3526
3527        sq_config = RREG32(SQ_CONFIG);
3528        sq_config &= ~(PS_PRIO(3) |
3529                       VS_PRIO(3) |
3530                       GS_PRIO(3) |
3531                       ES_PRIO(3));
3532        sq_config |= (VC_ENABLE |
3533                      EXPORT_SRC_C |
3534                      PS_PRIO(0) |
3535                      VS_PRIO(1) |
3536                      GS_PRIO(2) |
3537                      ES_PRIO(3));
3538
3539        switch (rdev->family) {
3540        case CHIP_CEDAR:
3541        case CHIP_PALM:
3542        case CHIP_SUMO:
3543        case CHIP_SUMO2:
3544        case CHIP_CAICOS:
3545                /* no vertex cache */
3546                sq_config &= ~VC_ENABLE;
3547                break;
3548        default:
3549                break;
3550        }
3551
3552        sq_lds_resource_mgmt = RREG32(SQ_LDS_RESOURCE_MGMT);
3553
3554        sq_gpr_resource_mgmt_1 = NUM_PS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2))* 12 / 32);
3555        sq_gpr_resource_mgmt_1 |= NUM_VS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 6 / 32);
3556        sq_gpr_resource_mgmt_1 |= NUM_CLAUSE_TEMP_GPRS(4);
3557        sq_gpr_resource_mgmt_2 = NUM_GS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 4 / 32);
3558        sq_gpr_resource_mgmt_2 |= NUM_ES_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 4 / 32);
3559        sq_gpr_resource_mgmt_3 = NUM_HS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32);
3560        sq_gpr_resource_mgmt_3 |= NUM_LS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32);
3561
3562        switch (rdev->family) {
3563        case CHIP_CEDAR:
3564        case CHIP_PALM:
3565        case CHIP_SUMO:
3566        case CHIP_SUMO2:
3567                ps_thread_count = 96;
3568                break;
3569        default:
3570                ps_thread_count = 128;
3571                break;
3572        }
3573
3574        sq_thread_resource_mgmt = NUM_PS_THREADS(ps_thread_count);
3575        sq_thread_resource_mgmt |= NUM_VS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3576        sq_thread_resource_mgmt |= NUM_GS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3577        sq_thread_resource_mgmt |= NUM_ES_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3578        sq_thread_resource_mgmt_2 = NUM_HS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3579        sq_thread_resource_mgmt_2 |= NUM_LS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
3580
3581        sq_stack_resource_mgmt_1 = NUM_PS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3582        sq_stack_resource_mgmt_1 |= NUM_VS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3583        sq_stack_resource_mgmt_2 = NUM_GS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3584        sq_stack_resource_mgmt_2 |= NUM_ES_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3585        sq_stack_resource_mgmt_3 = NUM_HS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3586        sq_stack_resource_mgmt_3 |= NUM_LS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6);
3587
3588        WREG32(SQ_CONFIG, sq_config);
3589        WREG32(SQ_GPR_RESOURCE_MGMT_1, sq_gpr_resource_mgmt_1);
3590        WREG32(SQ_GPR_RESOURCE_MGMT_2, sq_gpr_resource_mgmt_2);
3591        WREG32(SQ_GPR_RESOURCE_MGMT_3, sq_gpr_resource_mgmt_3);
3592        WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt);
3593        WREG32(SQ_THREAD_RESOURCE_MGMT_2, sq_thread_resource_mgmt_2);
3594        WREG32(SQ_STACK_RESOURCE_MGMT_1, sq_stack_resource_mgmt_1);
3595        WREG32(SQ_STACK_RESOURCE_MGMT_2, sq_stack_resource_mgmt_2);
3596        WREG32(SQ_STACK_RESOURCE_MGMT_3, sq_stack_resource_mgmt_3);
3597        WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0);
3598        WREG32(SQ_LDS_RESOURCE_MGMT, sq_lds_resource_mgmt);
3599
3600        WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
3601                                          FORCE_EOV_MAX_REZ_CNT(255)));
3602
3603        switch (rdev->family) {
3604        case CHIP_CEDAR:
3605        case CHIP_PALM:
3606        case CHIP_SUMO:
3607        case CHIP_SUMO2:
3608        case CHIP_CAICOS:
3609                vgt_cache_invalidation = CACHE_INVALIDATION(TC_ONLY);
3610                break;
3611        default:
3612                vgt_cache_invalidation = CACHE_INVALIDATION(VC_AND_TC);
3613                break;
3614        }
3615        vgt_cache_invalidation |= AUTO_INVLD_EN(ES_AND_GS_AUTO);
3616        WREG32(VGT_CACHE_INVALIDATION, vgt_cache_invalidation);
3617
3618        WREG32(VGT_GS_VERTEX_REUSE, 16);
3619        WREG32(PA_SU_LINE_STIPPLE_VALUE, 0);
3620        WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
3621
3622        WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, 14);
3623        WREG32(VGT_OUT_DEALLOC_CNTL, 16);
3624
3625        WREG32(CB_PERF_CTR0_SEL_0, 0);
3626        WREG32(CB_PERF_CTR0_SEL_1, 0);
3627        WREG32(CB_PERF_CTR1_SEL_0, 0);
3628        WREG32(CB_PERF_CTR1_SEL_1, 0);
3629        WREG32(CB_PERF_CTR2_SEL_0, 0);
3630        WREG32(CB_PERF_CTR2_SEL_1, 0);
3631        WREG32(CB_PERF_CTR3_SEL_0, 0);
3632        WREG32(CB_PERF_CTR3_SEL_1, 0);
3633
3634        /* clear render buffer base addresses */
3635        WREG32(CB_COLOR0_BASE, 0);
3636        WREG32(CB_COLOR1_BASE, 0);
3637        WREG32(CB_COLOR2_BASE, 0);
3638        WREG32(CB_COLOR3_BASE, 0);
3639        WREG32(CB_COLOR4_BASE, 0);
3640        WREG32(CB_COLOR5_BASE, 0);
3641        WREG32(CB_COLOR6_BASE, 0);
3642        WREG32(CB_COLOR7_BASE, 0);
3643        WREG32(CB_COLOR8_BASE, 0);
3644        WREG32(CB_COLOR9_BASE, 0);
3645        WREG32(CB_COLOR10_BASE, 0);
3646        WREG32(CB_COLOR11_BASE, 0);
3647
3648        /* set the shader const cache sizes to 0 */
3649        for (i = SQ_ALU_CONST_BUFFER_SIZE_PS_0; i < 0x28200; i += 4)
3650                WREG32(i, 0);
3651        for (i = SQ_ALU_CONST_BUFFER_SIZE_HS_0; i < 0x29000; i += 4)
3652                WREG32(i, 0);
3653
3654        tmp = RREG32(HDP_MISC_CNTL);
3655        tmp |= HDP_FLUSH_INVALIDATE_CACHE;
3656        WREG32(HDP_MISC_CNTL, tmp);
3657
3658        hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
3659        WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
3660
3661        WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
3662
3663        udelay(50);
3664
3665}
3666
3667int evergreen_mc_init(struct radeon_device *rdev)
3668{
3669        u32 tmp;
3670        int chansize, numchan;
3671
3672        /* Get VRAM informations */
3673        rdev->mc.vram_is_ddr = true;
3674        if ((rdev->family == CHIP_PALM) ||
3675            (rdev->family == CHIP_SUMO) ||
3676            (rdev->family == CHIP_SUMO2))
3677                tmp = RREG32(FUS_MC_ARB_RAMCFG);
3678        else
3679                tmp = RREG32(MC_ARB_RAMCFG);
3680        if (tmp & CHANSIZE_OVERRIDE) {
3681                chansize = 16;
3682        } else if (tmp & CHANSIZE_MASK) {
3683                chansize = 64;
3684        } else {
3685                chansize = 32;
3686        }
3687        tmp = RREG32(MC_SHARED_CHMAP);
3688        switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
3689        case 0:
3690        default:
3691                numchan = 1;
3692                break;
3693        case 1:
3694                numchan = 2;
3695                break;
3696        case 2:
3697                numchan = 4;
3698                break;
3699        case 3:
3700                numchan = 8;
3701                break;
3702        }
3703        rdev->mc.vram_width = numchan * chansize;
3704        /* Could aper size report 0 ? */
3705        rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
3706        rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
3707        /* Setup GPU memory space */
3708        if ((rdev->family == CHIP_PALM) ||
3709            (rdev->family == CHIP_SUMO) ||
3710            (rdev->family == CHIP_SUMO2)) {
3711                /* size in bytes on fusion */
3712                rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
3713                rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
3714        } else {
3715                /* size in MB on evergreen/cayman/tn */
3716                rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
3717                rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
3718        }
3719        rdev->mc.visible_vram_size = rdev->mc.aper_size;
3720        r700_vram_gtt_location(rdev, &rdev->mc);
3721        radeon_update_bandwidth_info(rdev);
3722
3723        return 0;
3724}
3725
3726void evergreen_print_gpu_status_regs(struct radeon_device *rdev)
3727{
3728        dev_info(rdev->dev, "  GRBM_STATUS               = 0x%08X\n",
3729                RREG32(GRBM_STATUS));
3730        dev_info(rdev->dev, "  GRBM_STATUS_SE0           = 0x%08X\n",
3731                RREG32(GRBM_STATUS_SE0));
3732        dev_info(rdev->dev, "  GRBM_STATUS_SE1           = 0x%08X\n",
3733                RREG32(GRBM_STATUS_SE1));
3734        dev_info(rdev->dev, "  SRBM_STATUS               = 0x%08X\n",
3735                RREG32(SRBM_STATUS));
3736        dev_info(rdev->dev, "  SRBM_STATUS2              = 0x%08X\n",
3737                RREG32(SRBM_STATUS2));
3738        dev_info(rdev->dev, "  R_008674_CP_STALLED_STAT1 = 0x%08X\n",
3739                RREG32(CP_STALLED_STAT1));
3740        dev_info(rdev->dev, "  R_008678_CP_STALLED_STAT2 = 0x%08X\n",
3741                RREG32(CP_STALLED_STAT2));
3742        dev_info(rdev->dev, "  R_00867C_CP_BUSY_STAT     = 0x%08X\n",
3743                RREG32(CP_BUSY_STAT));
3744        dev_info(rdev->dev, "  R_008680_CP_STAT          = 0x%08X\n",
3745                RREG32(CP_STAT));
3746        dev_info(rdev->dev, "  R_00D034_DMA_STATUS_REG   = 0x%08X\n",
3747                RREG32(DMA_STATUS_REG));
3748        if (rdev->family >= CHIP_CAYMAN) {
3749                dev_info(rdev->dev, "  R_00D834_DMA_STATUS_REG   = 0x%08X\n",
3750                         RREG32(DMA_STATUS_REG + 0x800));
3751        }
3752}
3753
3754bool evergreen_is_display_hung(struct radeon_device *rdev)
3755{
3756        u32 crtc_hung = 0;
3757        u32 crtc_status[6];
3758        u32 i, j, tmp;
3759
3760        for (i = 0; i < rdev->num_crtc; i++) {
3761                if (RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]) & EVERGREEN_CRTC_MASTER_EN) {
3762                        crtc_status[i] = RREG32(EVERGREEN_CRTC_STATUS_HV_COUNT + crtc_offsets[i]);
3763                        crtc_hung |= (1 << i);
3764                }
3765        }
3766
3767        for (j = 0; j < 10; j++) {
3768                for (i = 0; i < rdev->num_crtc; i++) {
3769                        if (crtc_hung & (1 << i)) {
3770                                tmp = RREG32(EVERGREEN_CRTC_STATUS_HV_COUNT + crtc_offsets[i]);
3771                                if (tmp != crtc_status[i])
3772                                        crtc_hung &= ~(1 << i);
3773                        }
3774                }
3775                if (crtc_hung == 0)
3776                        return false;
3777                udelay(100);
3778        }
3779
3780        return true;
3781}
3782
3783u32 evergreen_gpu_check_soft_reset(struct radeon_device *rdev)
3784{
3785        u32 reset_mask = 0;
3786        u32 tmp;
3787
3788        /* GRBM_STATUS */
3789        tmp = RREG32(GRBM_STATUS);
3790        if (tmp & (PA_BUSY | SC_BUSY |
3791                   SH_BUSY | SX_BUSY |
3792                   TA_BUSY | VGT_BUSY |
3793                   DB_BUSY | CB_BUSY |
3794                   SPI_BUSY | VGT_BUSY_NO_DMA))
3795                reset_mask |= RADEON_RESET_GFX;
3796
3797        if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING |
3798                   CP_BUSY | CP_COHERENCY_BUSY))
3799                reset_mask |= RADEON_RESET_CP;
3800
3801        if (tmp & GRBM_EE_BUSY)
3802                reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
3803
3804        /* DMA_STATUS_REG */
3805        tmp = RREG32(DMA_STATUS_REG);
3806        if (!(tmp & DMA_IDLE))
3807                reset_mask |= RADEON_RESET_DMA;
3808
3809        /* SRBM_STATUS2 */
3810        tmp = RREG32(SRBM_STATUS2);
3811        if (tmp & DMA_BUSY)
3812                reset_mask |= RADEON_RESET_DMA;
3813
3814        /* SRBM_STATUS */
3815        tmp = RREG32(SRBM_STATUS);
3816        if (tmp & (RLC_RQ_PENDING | RLC_BUSY))
3817                reset_mask |= RADEON_RESET_RLC;
3818
3819        if (tmp & IH_BUSY)
3820                reset_mask |= RADEON_RESET_IH;
3821
3822        if (tmp & SEM_BUSY)
3823                reset_mask |= RADEON_RESET_SEM;
3824
3825        if (tmp & GRBM_RQ_PENDING)
3826                reset_mask |= RADEON_RESET_GRBM;
3827
3828        if (tmp & VMC_BUSY)
3829                reset_mask |= RADEON_RESET_VMC;
3830
3831        if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
3832                   MCC_BUSY | MCD_BUSY))
3833                reset_mask |= RADEON_RESET_MC;
3834
3835        if (evergreen_is_display_hung(rdev))
3836                reset_mask |= RADEON_RESET_DISPLAY;
3837
3838        /* VM_L2_STATUS */
3839        tmp = RREG32(VM_L2_STATUS);
3840        if (tmp & L2_BUSY)
3841                reset_mask |= RADEON_RESET_VMC;
3842
3843        /* Skip MC reset as it's mostly likely not hung, just busy */
3844        if (reset_mask & RADEON_RESET_MC) {
3845                DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
3846                reset_mask &= ~RADEON_RESET_MC;
3847        }
3848
3849        return reset_mask;
3850}
3851
3852static void evergreen_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
3853{
3854        struct evergreen_mc_save save;
3855        u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
3856        u32 tmp;
3857
3858        if (reset_mask == 0)
3859                return;
3860
3861        dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
3862
3863        evergreen_print_gpu_status_regs(rdev);
3864
3865        /* Disable CP parsing/prefetching */
3866        WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
3867
3868        if (reset_mask & RADEON_RESET_DMA) {
3869                /* Disable DMA */
3870                tmp = RREG32(DMA_RB_CNTL);
3871                tmp &= ~DMA_RB_ENABLE;
3872                WREG32(DMA_RB_CNTL, tmp);
3873        }
3874
3875        udelay(50);
3876
3877        evergreen_mc_stop(rdev, &save);
3878        if (evergreen_mc_wait_for_idle(rdev)) {
3879                dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
3880        }
3881
3882        if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) {
3883                grbm_soft_reset |= SOFT_RESET_DB |
3884                        SOFT_RESET_CB |
3885                        SOFT_RESET_PA |
3886                        SOFT_RESET_SC |
3887                        SOFT_RESET_SPI |
3888                        SOFT_RESET_SX |
3889                        SOFT_RESET_SH |
3890                        SOFT_RESET_TC |
3891                        SOFT_RESET_TA |
3892                        SOFT_RESET_VC |
3893                        SOFT_RESET_VGT;
3894        }
3895
3896        if (reset_mask & RADEON_RESET_CP) {
3897                grbm_soft_reset |= SOFT_RESET_CP |
3898                        SOFT_RESET_VGT;
3899
3900                srbm_soft_reset |= SOFT_RESET_GRBM;
3901        }
3902
3903        if (reset_mask & RADEON_RESET_DMA)
3904                srbm_soft_reset |= SOFT_RESET_DMA;
3905
3906        if (reset_mask & RADEON_RESET_DISPLAY)
3907                srbm_soft_reset |= SOFT_RESET_DC;
3908
3909        if (reset_mask & RADEON_RESET_RLC)
3910                srbm_soft_reset |= SOFT_RESET_RLC;
3911
3912        if (reset_mask & RADEON_RESET_SEM)
3913                srbm_soft_reset |= SOFT_RESET_SEM;
3914
3915        if (reset_mask & RADEON_RESET_IH)
3916                srbm_soft_reset |= SOFT_RESET_IH;
3917
3918        if (reset_mask & RADEON_RESET_GRBM)
3919                srbm_soft_reset |= SOFT_RESET_GRBM;
3920
3921        if (reset_mask & RADEON_RESET_VMC)
3922                srbm_soft_reset |= SOFT_RESET_VMC;
3923
3924        if (!(rdev->flags & RADEON_IS_IGP)) {
3925                if (reset_mask & RADEON_RESET_MC)
3926                        srbm_soft_reset |= SOFT_RESET_MC;
3927        }
3928
3929        if (grbm_soft_reset) {
3930                tmp = RREG32(GRBM_SOFT_RESET);
3931                tmp |= grbm_soft_reset;
3932                dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
3933                WREG32(GRBM_SOFT_RESET, tmp);
3934                tmp = RREG32(GRBM_SOFT_RESET);
3935
3936                udelay(50);
3937
3938                tmp &= ~grbm_soft_reset;
3939                WREG32(GRBM_SOFT_RESET, tmp);
3940                tmp = RREG32(GRBM_SOFT_RESET);
3941        }
3942
3943        if (srbm_soft_reset) {
3944                tmp = RREG32(SRBM_SOFT_RESET);
3945                tmp |= srbm_soft_reset;
3946                dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
3947                WREG32(SRBM_SOFT_RESET, tmp);
3948                tmp = RREG32(SRBM_SOFT_RESET);
3949
3950                udelay(50);
3951
3952                tmp &= ~srbm_soft_reset;
3953                WREG32(SRBM_SOFT_RESET, tmp);
3954                tmp = RREG32(SRBM_SOFT_RESET);
3955        }
3956
3957        /* Wait a little for things to settle down */
3958        udelay(50);
3959
3960        evergreen_mc_resume(rdev, &save);
3961        udelay(50);
3962
3963        evergreen_print_gpu_status_regs(rdev);
3964}
3965
3966void evergreen_gpu_pci_config_reset(struct radeon_device *rdev)
3967{
3968        struct evergreen_mc_save save;
3969        u32 tmp, i;
3970
3971        dev_info(rdev->dev, "GPU pci config reset\n");
3972
3973        /* disable dpm? */
3974
3975        /* Disable CP parsing/prefetching */
3976        WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
3977        udelay(50);
3978        /* Disable DMA */
3979        tmp = RREG32(DMA_RB_CNTL);
3980        tmp &= ~DMA_RB_ENABLE;
3981        WREG32(DMA_RB_CNTL, tmp);
3982        /* XXX other engines? */
3983
3984        /* halt the rlc */
3985        r600_rlc_stop(rdev);
3986
3987        udelay(50);
3988
3989        /* set mclk/sclk to bypass */
3990        rv770_set_clk_bypass_mode(rdev);
3991        /* disable BM */
3992        pci_clear_master(rdev->pdev);
3993        /* disable mem access */
3994        evergreen_mc_stop(rdev, &save);
3995        if (evergreen_mc_wait_for_idle(rdev)) {
3996                dev_warn(rdev->dev, "Wait for MC idle timed out !\n");
3997        }
3998        /* reset */
3999        radeon_pci_config_reset(rdev);
4000        /* wait for asic to come out of reset */
4001        for (i = 0; i < rdev->usec_timeout; i++) {
4002                if (RREG32(CONFIG_MEMSIZE) != 0xffffffff)
4003                        break;
4004                udelay(1);
4005        }
4006}
4007
4008int evergreen_asic_reset(struct radeon_device *rdev)
4009{
4010        u32 reset_mask;
4011
4012        reset_mask = evergreen_gpu_check_soft_reset(rdev);
4013
4014        if (reset_mask)
4015                r600_set_bios_scratch_engine_hung(rdev, true);
4016
4017        /* try soft reset */
4018        evergreen_gpu_soft_reset(rdev, reset_mask);
4019
4020        reset_mask = evergreen_gpu_check_soft_reset(rdev);
4021
4022        /* try pci config reset */
4023        if (reset_mask && radeon_hard_reset)
4024                evergreen_gpu_pci_config_reset(rdev);
4025
4026        reset_mask = evergreen_gpu_check_soft_reset(rdev);
4027
4028        if (!reset_mask)
4029                r600_set_bios_scratch_engine_hung(rdev, false);
4030
4031        return 0;
4032}
4033
4034/**
4035 * evergreen_gfx_is_lockup - Check if the GFX engine is locked up
4036 *
4037 * @rdev: radeon_device pointer
4038 * @ring: radeon_ring structure holding ring information
4039 *
4040 * Check if the GFX engine is locked up.
4041 * Returns true if the engine appears to be locked up, false if not.
4042 */
4043bool evergreen_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
4044{
4045        u32 reset_mask = evergreen_gpu_check_soft_reset(rdev);
4046
4047        if (!(reset_mask & (RADEON_RESET_GFX |
4048                            RADEON_RESET_COMPUTE |
4049                            RADEON_RESET_CP))) {
4050                radeon_ring_lockup_update(rdev, ring);
4051                return false;
4052        }
4053        return radeon_ring_test_lockup(rdev, ring);
4054}
4055
4056/*
4057 * RLC
4058 */
4059#define RLC_SAVE_RESTORE_LIST_END_MARKER    0x00000000
4060#define RLC_CLEAR_STATE_END_MARKER          0x00000001
4061
4062void sumo_rlc_fini(struct radeon_device *rdev)
4063{
4064        int r;
4065
4066        /* save restore block */
4067        if (rdev->rlc.save_restore_obj) {
4068                r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
4069                if (unlikely(r != 0))
4070                        dev_warn(rdev->dev, "(%d) reserve RLC sr bo failed\n", r);
4071                radeon_bo_unpin(rdev->rlc.save_restore_obj);
4072                radeon_bo_unreserve(rdev->rlc.save_restore_obj);
4073
4074                radeon_bo_unref(&rdev->rlc.save_restore_obj);
4075                rdev->rlc.save_restore_obj = NULL;
4076        }
4077
4078        /* clear state block */
4079        if (rdev->rlc.clear_state_obj) {
4080                r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
4081                if (unlikely(r != 0))
4082                        dev_warn(rdev->dev, "(%d) reserve RLC c bo failed\n", r);
4083                radeon_bo_unpin(rdev->rlc.clear_state_obj);
4084                radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4085
4086                radeon_bo_unref(&rdev->rlc.clear_state_obj);
4087                rdev->rlc.clear_state_obj = NULL;
4088        }
4089
4090        /* clear state block */
4091        if (rdev->rlc.cp_table_obj) {
4092                r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false);
4093                if (unlikely(r != 0))
4094                        dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r);
4095                radeon_bo_unpin(rdev->rlc.cp_table_obj);
4096                radeon_bo_unreserve(rdev->rlc.cp_table_obj);
4097
4098                radeon_bo_unref(&rdev->rlc.cp_table_obj);
4099                rdev->rlc.cp_table_obj = NULL;
4100        }
4101}
4102
4103#define CP_ME_TABLE_SIZE    96
4104
4105int sumo_rlc_init(struct radeon_device *rdev)
4106{
4107        const u32 *src_ptr;
4108        volatile u32 *dst_ptr;
4109        u32 dws, data, i, j, k, reg_num;
4110        u32 reg_list_num, reg_list_hdr_blk_index, reg_list_blk_index = 0;
4111        u64 reg_list_mc_addr;
4112        const struct cs_section_def *cs_data;
4113        int r;
4114
4115        src_ptr = rdev->rlc.reg_list;
4116        dws = rdev->rlc.reg_list_size;
4117        if (rdev->family >= CHIP_BONAIRE) {
4118                dws += (5 * 16) + 48 + 48 + 64;
4119        }
4120        cs_data = rdev->rlc.cs_data;
4121
4122        if (src_ptr) {
4123                /* save restore block */
4124                if (rdev->rlc.save_restore_obj == NULL) {
4125                        r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
4126                                             RADEON_GEM_DOMAIN_VRAM, 0, NULL,
4127                                             NULL, &rdev->rlc.save_restore_obj);
4128                        if (r) {
4129                                dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
4130                                return r;
4131                        }
4132                }
4133
4134                r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
4135                if (unlikely(r != 0)) {
4136                        sumo_rlc_fini(rdev);
4137                        return r;
4138                }
4139                r = radeon_bo_pin(rdev->rlc.save_restore_obj, RADEON_GEM_DOMAIN_VRAM,
4140                                  &rdev->rlc.save_restore_gpu_addr);
4141                if (r) {
4142                        radeon_bo_unreserve(rdev->rlc.save_restore_obj);
4143                        dev_warn(rdev->dev, "(%d) pin RLC sr bo failed\n", r);
4144                        sumo_rlc_fini(rdev);
4145                        return r;
4146                }
4147
4148                r = radeon_bo_kmap(rdev->rlc.save_restore_obj, (void **)&rdev->rlc.sr_ptr);
4149                if (r) {
4150                        dev_warn(rdev->dev, "(%d) map RLC sr bo failed\n", r);
4151                        sumo_rlc_fini(rdev);
4152                        return r;
4153                }
4154                /* write the sr buffer */
4155                dst_ptr = rdev->rlc.sr_ptr;
4156                if (rdev->family >= CHIP_TAHITI) {
4157                        /* SI */
4158                        for (i = 0; i < rdev->rlc.reg_list_size; i++)
4159                                dst_ptr[i] = cpu_to_le32(src_ptr[i]);
4160                } else {
4161                        /* ON/LN/TN */
4162                        /* format:
4163                         * dw0: (reg2 << 16) | reg1
4164                         * dw1: reg1 save space
4165                         * dw2: reg2 save space
4166                         */
4167                        for (i = 0; i < dws; i++) {
4168                                data = src_ptr[i] >> 2;
4169                                i++;
4170                                if (i < dws)
4171                                        data |= (src_ptr[i] >> 2) << 16;
4172                                j = (((i - 1) * 3) / 2);
4173                                dst_ptr[j] = cpu_to_le32(data);
4174                        }
4175                        j = ((i * 3) / 2);
4176                        dst_ptr[j] = cpu_to_le32(RLC_SAVE_RESTORE_LIST_END_MARKER);
4177                }
4178                radeon_bo_kunmap(rdev->rlc.save_restore_obj);
4179                radeon_bo_unreserve(rdev->rlc.save_restore_obj);
4180        }
4181
4182        if (cs_data) {
4183                /* clear state block */
4184                if (rdev->family >= CHIP_BONAIRE) {
4185                        rdev->rlc.clear_state_size = dws = cik_get_csb_size(rdev);
4186                } else if (rdev->family >= CHIP_TAHITI) {
4187                        rdev->rlc.clear_state_size = si_get_csb_size(rdev);
4188                        dws = rdev->rlc.clear_state_size + (256 / 4);
4189                } else {
4190                        reg_list_num = 0;
4191                        dws = 0;
4192                        for (i = 0; cs_data[i].section != NULL; i++) {
4193                                for (j = 0; cs_data[i].section[j].extent != NULL; j++) {
4194                                        reg_list_num++;
4195                                        dws += cs_data[i].section[j].reg_count;
4196                                }
4197                        }
4198                        reg_list_blk_index = (3 * reg_list_num + 2);
4199                        dws += reg_list_blk_index;
4200                        rdev->rlc.clear_state_size = dws;
4201                }
4202
4203                if (rdev->rlc.clear_state_obj == NULL) {
4204                        r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
4205                                             RADEON_GEM_DOMAIN_VRAM, 0, NULL,
4206                                             NULL, &rdev->rlc.clear_state_obj);
4207                        if (r) {
4208                                dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
4209                                sumo_rlc_fini(rdev);
4210                                return r;
4211                        }
4212                }
4213                r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
4214                if (unlikely(r != 0)) {
4215                        sumo_rlc_fini(rdev);
4216                        return r;
4217                }
4218                r = radeon_bo_pin(rdev->rlc.clear_state_obj, RADEON_GEM_DOMAIN_VRAM,
4219                                  &rdev->rlc.clear_state_gpu_addr);
4220                if (r) {
4221                        radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4222                        dev_warn(rdev->dev, "(%d) pin RLC c bo failed\n", r);
4223                        sumo_rlc_fini(rdev);
4224                        return r;
4225                }
4226
4227                r = radeon_bo_kmap(rdev->rlc.clear_state_obj, (void **)&rdev->rlc.cs_ptr);
4228                if (r) {
4229                        dev_warn(rdev->dev, "(%d) map RLC c bo failed\n", r);
4230                        sumo_rlc_fini(rdev);
4231                        return r;
4232                }
4233                /* set up the cs buffer */
4234                dst_ptr = rdev->rlc.cs_ptr;
4235                if (rdev->family >= CHIP_BONAIRE) {
4236                        cik_get_csb_buffer(rdev, dst_ptr);
4237                } else if (rdev->family >= CHIP_TAHITI) {
4238                        reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + 256;
4239                        dst_ptr[0] = cpu_to_le32(upper_32_bits(reg_list_mc_addr));
4240                        dst_ptr[1] = cpu_to_le32(lower_32_bits(reg_list_mc_addr));
4241                        dst_ptr[2] = cpu_to_le32(rdev->rlc.clear_state_size);
4242                        si_get_csb_buffer(rdev, &dst_ptr[(256/4)]);
4243                } else {
4244                        reg_list_hdr_blk_index = 0;
4245                        reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + (reg_list_blk_index * 4);
4246                        data = upper_32_bits(reg_list_mc_addr);
4247                        dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4248                        reg_list_hdr_blk_index++;
4249                        for (i = 0; cs_data[i].section != NULL; i++) {
4250                                for (j = 0; cs_data[i].section[j].extent != NULL; j++) {
4251                                        reg_num = cs_data[i].section[j].reg_count;
4252                                        data = reg_list_mc_addr & 0xffffffff;
4253                                        dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4254                                        reg_list_hdr_blk_index++;
4255
4256                                        data = (cs_data[i].section[j].reg_index * 4) & 0xffffffff;
4257                                        dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4258                                        reg_list_hdr_blk_index++;
4259
4260                                        data = 0x08000000 | (reg_num * 4);
4261                                        dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
4262                                        reg_list_hdr_blk_index++;
4263
4264                                        for (k = 0; k < reg_num; k++) {
4265                                                data = cs_data[i].section[j].extent[k];
4266                                                dst_ptr[reg_list_blk_index + k] = cpu_to_le32(data);
4267                                        }
4268                                        reg_list_mc_addr += reg_num * 4;
4269                                        reg_list_blk_index += reg_num;
4270                                }
4271                        }
4272                        dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(RLC_CLEAR_STATE_END_MARKER);
4273                }
4274                radeon_bo_kunmap(rdev->rlc.clear_state_obj);
4275                radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4276        }
4277
4278        if (rdev->rlc.cp_table_size) {
4279                if (rdev->rlc.cp_table_obj == NULL) {
4280                        r = radeon_bo_create(rdev, rdev->rlc.cp_table_size,
4281                                             PAGE_SIZE, true,
4282                                             RADEON_GEM_DOMAIN_VRAM, 0, NULL,
4283                                             NULL, &rdev->rlc.cp_table_obj);
4284                        if (r) {
4285                                dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r);
4286                                sumo_rlc_fini(rdev);
4287                                return r;
4288                        }
4289                }
4290
4291                r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false);
4292                if (unlikely(r != 0)) {
4293                        dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r);
4294                        sumo_rlc_fini(rdev);
4295                        return r;
4296                }
4297                r = radeon_bo_pin(rdev->rlc.cp_table_obj, RADEON_GEM_DOMAIN_VRAM,
4298                                  &rdev->rlc.cp_table_gpu_addr);
4299                if (r) {
4300                        radeon_bo_unreserve(rdev->rlc.cp_table_obj);
4301                        dev_warn(rdev->dev, "(%d) pin RLC cp_table bo failed\n", r);
4302                        sumo_rlc_fini(rdev);
4303                        return r;
4304                }
4305                r = radeon_bo_kmap(rdev->rlc.cp_table_obj, (void **)&rdev->rlc.cp_table_ptr);
4306                if (r) {
4307                        dev_warn(rdev->dev, "(%d) map RLC cp table bo failed\n", r);
4308                        sumo_rlc_fini(rdev);
4309                        return r;
4310                }
4311
4312                cik_init_cp_pg_table(rdev);
4313
4314                radeon_bo_kunmap(rdev->rlc.cp_table_obj);
4315                radeon_bo_unreserve(rdev->rlc.cp_table_obj);
4316
4317        }
4318
4319        return 0;
4320}
4321
4322static void evergreen_rlc_start(struct radeon_device *rdev)
4323{
4324        u32 mask = RLC_ENABLE;
4325
4326        if (rdev->flags & RADEON_IS_IGP) {
4327                mask |= GFX_POWER_GATING_ENABLE | GFX_POWER_GATING_SRC;
4328        }
4329
4330        WREG32(RLC_CNTL, mask);
4331}
4332
4333int evergreen_rlc_resume(struct radeon_device *rdev)
4334{
4335        u32 i;
4336        const __be32 *fw_data;
4337
4338        if (!rdev->rlc_fw)
4339                return -EINVAL;
4340
4341        r600_rlc_stop(rdev);
4342
4343        WREG32(RLC_HB_CNTL, 0);
4344
4345        if (rdev->flags & RADEON_IS_IGP) {
4346                if (rdev->family == CHIP_ARUBA) {
4347                        u32 always_on_bitmap =
4348                                3 | (3 << (16 * rdev->config.cayman.max_shader_engines));
4349                        /* find out the number of active simds */
4350                        u32 tmp = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
4351                        tmp |= 0xffffffff << rdev->config.cayman.max_simds_per_se;
4352                        tmp = hweight32(~tmp);
4353                        if (tmp == rdev->config.cayman.max_simds_per_se) {
4354                                WREG32(TN_RLC_LB_ALWAYS_ACTIVE_SIMD_MASK, always_on_bitmap);
4355                                WREG32(TN_RLC_LB_PARAMS, 0x00601004);
4356                                WREG32(TN_RLC_LB_INIT_SIMD_MASK, 0xffffffff);
4357                                WREG32(TN_RLC_LB_CNTR_INIT, 0x00000000);
4358                                WREG32(TN_RLC_LB_CNTR_MAX, 0x00002000);
4359                        }
4360                } else {
4361                        WREG32(RLC_HB_WPTR_LSB_ADDR, 0);
4362                        WREG32(RLC_HB_WPTR_MSB_ADDR, 0);
4363                }
4364                WREG32(TN_RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
4365                WREG32(TN_RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8);
4366        } else {
4367                WREG32(RLC_HB_BASE, 0);
4368                WREG32(RLC_HB_RPTR, 0);
4369                WREG32(RLC_HB_WPTR, 0);
4370                WREG32(RLC_HB_WPTR_LSB_ADDR, 0);
4371                WREG32(RLC_HB_WPTR_MSB_ADDR, 0);
4372        }
4373        WREG32(RLC_MC_CNTL, 0);
4374        WREG32(RLC_UCODE_CNTL, 0);
4375
4376        fw_data = (const __be32 *)rdev->rlc_fw->data;
4377        if (rdev->family >= CHIP_ARUBA) {
4378                for (i = 0; i < ARUBA_RLC_UCODE_SIZE; i++) {
4379                        WREG32(RLC_UCODE_ADDR, i);
4380                        WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
4381                }
4382        } else if (rdev->family >= CHIP_CAYMAN) {
4383                for (i = 0; i < CAYMAN_RLC_UCODE_SIZE; i++) {
4384                        WREG32(RLC_UCODE_ADDR, i);
4385                        WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
4386                }
4387        } else {
4388                for (i = 0; i < EVERGREEN_RLC_UCODE_SIZE; i++) {
4389                        WREG32(RLC_UCODE_ADDR, i);
4390                        WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
4391                }
4392        }
4393        WREG32(RLC_UCODE_ADDR, 0);
4394
4395        evergreen_rlc_start(rdev);
4396
4397        return 0;
4398}
4399
4400/* Interrupts */
4401
4402u32 evergreen_get_vblank_counter(struct radeon_device *rdev, int crtc)
4403{
4404        if (crtc >= rdev->num_crtc)
4405                return 0;
4406        else
4407                return RREG32(CRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]);
4408}
4409
4410void evergreen_disable_interrupt_state(struct radeon_device *rdev)
4411{
4412        u32 tmp;
4413
4414        if (rdev->family >= CHIP_CAYMAN) {
4415                cayman_cp_int_cntl_setup(rdev, 0,
4416                                         CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
4417                cayman_cp_int_cntl_setup(rdev, 1, 0);
4418                cayman_cp_int_cntl_setup(rdev, 2, 0);
4419                tmp = RREG32(CAYMAN_DMA1_CNTL) & ~TRAP_ENABLE;
4420                WREG32(CAYMAN_DMA1_CNTL, tmp);
4421        } else
4422                WREG32(CP_INT_CNTL, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
4423        tmp = RREG32(DMA_CNTL) & ~TRAP_ENABLE;
4424        WREG32(DMA_CNTL, tmp);
4425        WREG32(GRBM_INT_CNTL, 0);
4426        WREG32(SRBM_INT_CNTL, 0);
4427        WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
4428        WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
4429        if (rdev->num_crtc >= 4) {
4430                WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
4431                WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
4432        }
4433        if (rdev->num_crtc >= 6) {
4434                WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
4435                WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
4436        }
4437
4438        WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
4439        WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
4440        if (rdev->num_crtc >= 4) {
4441                WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
4442                WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
4443        }
4444        if (rdev->num_crtc >= 6) {
4445                WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
4446                WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
4447        }
4448
4449        /* only one DAC on DCE5 */
4450        if (!ASIC_IS_DCE5(rdev))
4451                WREG32(DACA_AUTODETECT_INT_CONTROL, 0);
4452        WREG32(DACB_AUTODETECT_INT_CONTROL, 0);
4453
4454        tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4455        WREG32(DC_HPD1_INT_CONTROL, tmp);
4456        tmp = RREG32(DC_HPD2_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4457        WREG32(DC_HPD2_INT_CONTROL, tmp);
4458        tmp = RREG32(DC_HPD3_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4459        WREG32(DC_HPD3_INT_CONTROL, tmp);
4460        tmp = RREG32(DC_HPD4_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4461        WREG32(DC_HPD4_INT_CONTROL, tmp);
4462        tmp = RREG32(DC_HPD5_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4463        WREG32(DC_HPD5_INT_CONTROL, tmp);
4464        tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY;
4465        WREG32(DC_HPD6_INT_CONTROL, tmp);
4466
4467}
4468
4469int evergreen_irq_set(struct radeon_device *rdev)
4470{
4471        u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE;
4472        u32 cp_int_cntl1 = 0, cp_int_cntl2 = 0;
4473        u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
4474        u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
4475        u32 grbm_int_cntl = 0;
4476        u32 afmt1 = 0, afmt2 = 0, afmt3 = 0, afmt4 = 0, afmt5 = 0, afmt6 = 0;
4477        u32 dma_cntl, dma_cntl1 = 0;
4478        u32 thermal_int = 0;
4479
4480        if (!rdev->irq.installed) {
4481                WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
4482                return -EINVAL;
4483        }
4484        /* don't enable anything if the ih is disabled */
4485        if (!rdev->ih.enabled) {
4486                r600_disable_interrupts(rdev);
4487                /* force the active interrupt state to all disabled */
4488                evergreen_disable_interrupt_state(rdev);
4489                return 0;
4490        }
4491
4492        hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
4493        hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
4494        hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
4495        hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
4496        hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
4497        hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
4498        if (rdev->family == CHIP_ARUBA)
4499                thermal_int = RREG32(TN_CG_THERMAL_INT_CTRL) &
4500                        ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
4501        else
4502                thermal_int = RREG32(CG_THERMAL_INT) &
4503                        ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
4504
4505        afmt1 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
4506        afmt2 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
4507        afmt3 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
4508        afmt4 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
4509        afmt5 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
4510        afmt6 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
4511
4512        dma_cntl = RREG32(DMA_CNTL) & ~TRAP_ENABLE;
4513
4514        if (rdev->family >= CHIP_CAYMAN) {
4515                /* enable CP interrupts on all rings */
4516                if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
4517                        DRM_DEBUG("evergreen_irq_set: sw int gfx\n");
4518                        cp_int_cntl |= TIME_STAMP_INT_ENABLE;
4519                }
4520                if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP1_INDEX])) {
4521                        DRM_DEBUG("evergreen_irq_set: sw int cp1\n");
4522                        cp_int_cntl1 |= TIME_STAMP_INT_ENABLE;
4523                }
4524                if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_CP2_INDEX])) {
4525                        DRM_DEBUG("evergreen_irq_set: sw int cp2\n");
4526                        cp_int_cntl2 |= TIME_STAMP_INT_ENABLE;
4527                }
4528        } else {
4529                if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
4530                        DRM_DEBUG("evergreen_irq_set: sw int gfx\n");
4531                        cp_int_cntl |= RB_INT_ENABLE;
4532                        cp_int_cntl |= TIME_STAMP_INT_ENABLE;
4533                }
4534        }
4535
4536        if (atomic_read(&rdev->irq.ring_int[R600_RING_TYPE_DMA_INDEX])) {
4537                DRM_DEBUG("r600_irq_set: sw int dma\n");
4538                dma_cntl |= TRAP_ENABLE;
4539        }
4540
4541        if (rdev->family >= CHIP_CAYMAN) {
4542                dma_cntl1 = RREG32(CAYMAN_DMA1_CNTL) & ~TRAP_ENABLE;
4543                if (atomic_read(&rdev->irq.ring_int[CAYMAN_RING_TYPE_DMA1_INDEX])) {
4544                        DRM_DEBUG("r600_irq_set: sw int dma1\n");
4545                        dma_cntl1 |= TRAP_ENABLE;
4546                }
4547        }
4548
4549        if (rdev->irq.dpm_thermal) {
4550                DRM_DEBUG("dpm thermal\n");
4551                thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
4552        }
4553
4554        if (rdev->irq.crtc_vblank_int[0] ||
4555            atomic_read(&rdev->irq.pflip[0])) {
4556                DRM_DEBUG("evergreen_irq_set: vblank 0\n");
4557                crtc1 |= VBLANK_INT_MASK;
4558        }
4559        if (rdev->irq.crtc_vblank_int[1] ||
4560            atomic_read(&rdev->irq.pflip[1])) {
4561                DRM_DEBUG("evergreen_irq_set: vblank 1\n");
4562                crtc2 |= VBLANK_INT_MASK;
4563        }
4564        if (rdev->irq.crtc_vblank_int[2] ||
4565            atomic_read(&rdev->irq.pflip[2])) {
4566                DRM_DEBUG("evergreen_irq_set: vblank 2\n");
4567                crtc3 |= VBLANK_INT_MASK;
4568        }
4569        if (rdev->irq.crtc_vblank_int[3] ||
4570            atomic_read(&rdev->irq.pflip[3])) {
4571                DRM_DEBUG("evergreen_irq_set: vblank 3\n");
4572                crtc4 |= VBLANK_INT_MASK;
4573        }
4574        if (rdev->irq.crtc_vblank_int[4] ||
4575            atomic_read(&rdev->irq.pflip[4])) {
4576                DRM_DEBUG("evergreen_irq_set: vblank 4\n");
4577                crtc5 |= VBLANK_INT_MASK;
4578        }
4579        if (rdev->irq.crtc_vblank_int[5] ||
4580            atomic_read(&rdev->irq.pflip[5])) {
4581                DRM_DEBUG("evergreen_irq_set: vblank 5\n");
4582                crtc6 |= VBLANK_INT_MASK;
4583        }
4584        if (rdev->irq.hpd[0]) {
4585                DRM_DEBUG("evergreen_irq_set: hpd 1\n");
4586                hpd1 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
4587        }
4588        if (rdev->irq.hpd[1]) {
4589                DRM_DEBUG("evergreen_irq_set: hpd 2\n");
4590                hpd2 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
4591        }
4592        if (rdev->irq.hpd[2]) {
4593                DRM_DEBUG("evergreen_irq_set: hpd 3\n");
4594                hpd3 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
4595        }
4596        if (rdev->irq.hpd[3]) {
4597                DRM_DEBUG("evergreen_irq_set: hpd 4\n");
4598                hpd4 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
4599        }
4600        if (rdev->irq.hpd[4]) {
4601                DRM_DEBUG("evergreen_irq_set: hpd 5\n");
4602                hpd5 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
4603        }
4604        if (rdev->irq.hpd[5]) {
4605                DRM_DEBUG("evergreen_irq_set: hpd 6\n");
4606                hpd6 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
4607        }
4608        if (rdev->irq.afmt[0]) {
4609                DRM_DEBUG("evergreen_irq_set: hdmi 0\n");
4610                afmt1 |= AFMT_AZ_FORMAT_WTRIG_MASK;
4611        }
4612        if (rdev->irq.afmt[1]) {
4613                DRM_DEBUG("evergreen_irq_set: hdmi 1\n");
4614                afmt2 |= AFMT_AZ_FORMAT_WTRIG_MASK;
4615        }
4616        if (rdev->irq.afmt[2]) {
4617                DRM_DEBUG("evergreen_irq_set: hdmi 2\n");
4618                afmt3 |= AFMT_AZ_FORMAT_WTRIG_MASK;
4619        }
4620        if (rdev->irq.afmt[3]) {
4621                DRM_DEBUG("evergreen_irq_set: hdmi 3\n");
4622                afmt4 |= AFMT_AZ_FORMAT_WTRIG_MASK;
4623        }
4624        if (rdev->irq.afmt[4]) {
4625                DRM_DEBUG("evergreen_irq_set: hdmi 4\n");
4626                afmt5 |= AFMT_AZ_FORMAT_WTRIG_MASK;
4627        }
4628        if (rdev->irq.afmt[5]) {
4629                DRM_DEBUG("evergreen_irq_set: hdmi 5\n");
4630                afmt6 |= AFMT_AZ_FORMAT_WTRIG_MASK;
4631        }
4632
4633        if (rdev->family >= CHIP_CAYMAN) {
4634                cayman_cp_int_cntl_setup(rdev, 0, cp_int_cntl);
4635                cayman_cp_int_cntl_setup(rdev, 1, cp_int_cntl1);
4636                cayman_cp_int_cntl_setup(rdev, 2, cp_int_cntl2);
4637        } else
4638                WREG32(CP_INT_CNTL, cp_int_cntl);
4639
4640        WREG32(DMA_CNTL, dma_cntl);
4641
4642        if (rdev->family >= CHIP_CAYMAN)
4643                WREG32(CAYMAN_DMA1_CNTL, dma_cntl1);
4644
4645        WREG32(GRBM_INT_CNTL, grbm_int_cntl);
4646
4647        WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
4648        WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2);
4649        if (rdev->num_crtc >= 4) {
4650                WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3);
4651                WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4);
4652        }
4653        if (rdev->num_crtc >= 6) {
4654                WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);
4655                WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
4656        }
4657
4658        WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET,
4659               GRPH_PFLIP_INT_MASK);
4660        WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET,
4661               GRPH_PFLIP_INT_MASK);
4662        if (rdev->num_crtc >= 4) {
4663                WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET,
4664                       GRPH_PFLIP_INT_MASK);
4665                WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET,
4666                       GRPH_PFLIP_INT_MASK);
4667        }
4668        if (rdev->num_crtc >= 6) {
4669                WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET,
4670                       GRPH_PFLIP_INT_MASK);
4671                WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET,
4672                       GRPH_PFLIP_INT_MASK);
4673        }
4674
4675        WREG32(DC_HPD1_INT_CONTROL, hpd1);
4676        WREG32(DC_HPD2_INT_CONTROL, hpd2);
4677        WREG32(DC_HPD3_INT_CONTROL, hpd3);
4678        WREG32(DC_HPD4_INT_CONTROL, hpd4);
4679        WREG32(DC_HPD5_INT_CONTROL, hpd5);
4680        WREG32(DC_HPD6_INT_CONTROL, hpd6);
4681        if (rdev->family == CHIP_ARUBA)
4682                WREG32(TN_CG_THERMAL_INT_CTRL, thermal_int);
4683        else
4684                WREG32(CG_THERMAL_INT, thermal_int);
4685
4686        WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, afmt1);
4687        WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, afmt2);
4688        WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, afmt3);
4689        WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, afmt4);
4690        WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, afmt5);
4691        WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, afmt6);
4692
4693        /* posting read */
4694        RREG32(SRBM_STATUS);
4695
4696        return 0;
4697}
4698
4699static void evergreen_irq_ack(struct radeon_device *rdev)
4700{
4701        u32 tmp;
4702
4703        rdev->irq.stat_regs.evergreen.disp_int = RREG32(DISP_INTERRUPT_STATUS);
4704        rdev->irq.stat_regs.evergreen.disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE);
4705        rdev->irq.stat_regs.evergreen.disp_int_cont2 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE2);
4706        rdev->irq.stat_regs.evergreen.disp_int_cont3 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE3);
4707        rdev->irq.stat_regs.evergreen.disp_int_cont4 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE4);
4708        rdev->irq.stat_regs.evergreen.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);
4709        rdev->irq.stat_regs.evergreen.d1grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET);
4710        rdev->irq.stat_regs.evergreen.d2grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET);
4711        if (rdev->num_crtc >= 4) {
4712                rdev->irq.stat_regs.evergreen.d3grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET);
4713                rdev->irq.stat_regs.evergreen.d4grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET);
4714        }
4715        if (rdev->num_crtc >= 6) {
4716                rdev->irq.stat_regs.evergreen.d5grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET);
4717                rdev->irq.stat_regs.evergreen.d6grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET);
4718        }
4719
4720        rdev->irq.stat_regs.evergreen.afmt_status1 = RREG32(AFMT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET);
4721        rdev->irq.stat_regs.evergreen.afmt_status2 = RREG32(AFMT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET);
4722        rdev->irq.stat_regs.evergreen.afmt_status3 = RREG32(AFMT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET);
4723        rdev->irq.stat_regs.evergreen.afmt_status4 = RREG32(AFMT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET);
4724        rdev->irq.stat_regs.evergreen.afmt_status5 = RREG32(AFMT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET);
4725        rdev->irq.stat_regs.evergreen.afmt_status6 = RREG32(AFMT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET);
4726
4727        if (rdev->irq.stat_regs.evergreen.d1grph_int & GRPH_PFLIP_INT_OCCURRED)
4728                WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4729        if (rdev->irq.stat_regs.evergreen.d2grph_int & GRPH_PFLIP_INT_OCCURRED)
4730                WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4731        if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT)
4732                WREG32(VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);
4733        if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT)
4734                WREG32(VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK);
4735        if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT)
4736                WREG32(VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK);
4737        if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT)
4738                WREG32(VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK);
4739
4740        if (rdev->num_crtc >= 4) {
4741                if (rdev->irq.stat_regs.evergreen.d3grph_int & GRPH_PFLIP_INT_OCCURRED)
4742                        WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4743                if (rdev->irq.stat_regs.evergreen.d4grph_int & GRPH_PFLIP_INT_OCCURRED)
4744                        WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4745                if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)
4746                        WREG32(VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK);
4747                if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)
4748                        WREG32(VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK);
4749                if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)
4750                        WREG32(VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK);
4751                if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)
4752                        WREG32(VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK);
4753        }
4754
4755        if (rdev->num_crtc >= 6) {
4756                if (rdev->irq.stat_regs.evergreen.d5grph_int & GRPH_PFLIP_INT_OCCURRED)
4757                        WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4758                if (rdev->irq.stat_regs.evergreen.d6grph_int & GRPH_PFLIP_INT_OCCURRED)
4759                        WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
4760                if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)
4761                        WREG32(VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK);
4762                if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)
4763                        WREG32(VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK);
4764                if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)
4765                        WREG32(VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK);
4766                if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)
4767                        WREG32(VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK);
4768        }
4769
4770        if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) {
4771                tmp = RREG32(DC_HPD1_INT_CONTROL);
4772                tmp |= DC_HPDx_INT_ACK;
4773                WREG32(DC_HPD1_INT_CONTROL, tmp);
4774        }
4775        if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT) {
4776                tmp = RREG32(DC_HPD2_INT_CONTROL);
4777                tmp |= DC_HPDx_INT_ACK;
4778                WREG32(DC_HPD2_INT_CONTROL, tmp);
4779        }
4780        if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT) {
4781                tmp = RREG32(DC_HPD3_INT_CONTROL);
4782                tmp |= DC_HPDx_INT_ACK;
4783                WREG32(DC_HPD3_INT_CONTROL, tmp);
4784        }
4785        if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT) {
4786                tmp = RREG32(DC_HPD4_INT_CONTROL);
4787                tmp |= DC_HPDx_INT_ACK;
4788                WREG32(DC_HPD4_INT_CONTROL, tmp);
4789        }
4790        if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT) {
4791                tmp = RREG32(DC_HPD5_INT_CONTROL);
4792                tmp |= DC_HPDx_INT_ACK;
4793                WREG32(DC_HPD5_INT_CONTROL, tmp);
4794        }
4795        if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) {
4796                tmp = RREG32(DC_HPD5_INT_CONTROL);
4797                tmp |= DC_HPDx_INT_ACK;
4798                WREG32(DC_HPD6_INT_CONTROL, tmp);
4799        }
4800
4801        if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT) {
4802                tmp = RREG32(DC_HPD1_INT_CONTROL);
4803                tmp |= DC_HPDx_RX_INT_ACK;
4804                WREG32(DC_HPD1_INT_CONTROL, tmp);
4805        }
4806        if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT) {
4807                tmp = RREG32(DC_HPD2_INT_CONTROL);
4808                tmp |= DC_HPDx_RX_INT_ACK;
4809                WREG32(DC_HPD2_INT_CONTROL, tmp);
4810        }
4811        if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT) {
4812                tmp = RREG32(DC_HPD3_INT_CONTROL);
4813                tmp |= DC_HPDx_RX_INT_ACK;
4814                WREG32(DC_HPD3_INT_CONTROL, tmp);
4815        }
4816        if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT) {
4817                tmp = RREG32(DC_HPD4_INT_CONTROL);
4818                tmp |= DC_HPDx_RX_INT_ACK;
4819                WREG32(DC_HPD4_INT_CONTROL, tmp);
4820        }
4821        if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT) {
4822                tmp = RREG32(DC_HPD5_INT_CONTROL);
4823                tmp |= DC_HPDx_RX_INT_ACK;
4824                WREG32(DC_HPD5_INT_CONTROL, tmp);
4825        }
4826        if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) {
4827                tmp = RREG32(DC_HPD5_INT_CONTROL);
4828                tmp |= DC_HPDx_RX_INT_ACK;
4829                WREG32(DC_HPD6_INT_CONTROL, tmp);
4830        }
4831
4832        if (rdev->irq.stat_regs.evergreen.afmt_status1 & AFMT_AZ_FORMAT_WTRIG) {
4833                tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET);
4834                tmp |= AFMT_AZ_FORMAT_WTRIG_ACK;
4835                WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, tmp);
4836        }
4837        if (rdev->irq.stat_regs.evergreen.afmt_status2 & AFMT_AZ_FORMAT_WTRIG) {
4838                tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET);
4839                tmp |= AFMT_AZ_FORMAT_WTRIG_ACK;
4840                WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, tmp);
4841        }
4842        if (rdev->irq.stat_regs.evergreen.afmt_status3 & AFMT_AZ_FORMAT_WTRIG) {
4843                tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET);
4844                tmp |= AFMT_AZ_FORMAT_WTRIG_ACK;
4845                WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, tmp);
4846        }
4847        if (rdev->irq.stat_regs.evergreen.afmt_status4 & AFMT_AZ_FORMAT_WTRIG) {
4848                tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET);
4849                tmp |= AFMT_AZ_FORMAT_WTRIG_ACK;
4850                WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, tmp);
4851        }
4852        if (rdev->irq.stat_regs.evergreen.afmt_status5 & AFMT_AZ_FORMAT_WTRIG) {
4853                tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET);
4854                tmp |= AFMT_AZ_FORMAT_WTRIG_ACK;
4855                WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, tmp);
4856        }
4857        if (rdev->irq.stat_regs.evergreen.afmt_status6 & AFMT_AZ_FORMAT_WTRIG) {
4858                tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);
4859                tmp |= AFMT_AZ_FORMAT_WTRIG_ACK;
4860                WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, tmp);
4861        }
4862}
4863
4864static void evergreen_irq_disable(struct radeon_device *rdev)
4865{
4866        r600_disable_interrupts(rdev);
4867        /* Wait and acknowledge irq */
4868        mdelay(1);
4869        evergreen_irq_ack(rdev);
4870        evergreen_disable_interrupt_state(rdev);
4871}
4872
4873void evergreen_irq_suspend(struct radeon_device *rdev)
4874{
4875        evergreen_irq_disable(rdev);
4876        r600_rlc_stop(rdev);
4877}
4878
4879static u32 evergreen_get_ih_wptr(struct radeon_device *rdev)
4880{
4881        u32 wptr, tmp;
4882
4883        if (rdev->wb.enabled)
4884                wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
4885        else
4886                wptr = RREG32(IH_RB_WPTR);
4887
4888        if (wptr & RB_OVERFLOW) {
4889                wptr &= ~RB_OVERFLOW;
4890                /* When a ring buffer overflow happen start parsing interrupt
4891                 * from the last not overwritten vector (wptr + 16). Hopefully
4892                 * this should allow us to catchup.
4893                 */
4894                dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n",
4895                         wptr, rdev->ih.rptr, (wptr + 16) & rdev->ih.ptr_mask);
4896                rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask;
4897                tmp = RREG32(IH_RB_CNTL);
4898                tmp |= IH_WPTR_OVERFLOW_CLEAR;
4899                WREG32(IH_RB_CNTL, tmp);
4900        }
4901        return (wptr & rdev->ih.ptr_mask);
4902}
4903
4904int evergreen_irq_process(struct radeon_device *rdev)
4905{
4906        u32 wptr;
4907        u32 rptr;
4908        u32 src_id, src_data;
4909        u32 ring_index;
4910        bool queue_hotplug = false;
4911        bool queue_hdmi = false;
4912        bool queue_dp = false;
4913        bool queue_thermal = false;
4914        u32 status, addr;
4915
4916        if (!rdev->ih.enabled || rdev->shutdown)
4917                return IRQ_NONE;
4918
4919        wptr = evergreen_get_ih_wptr(rdev);
4920
4921restart_ih:
4922        /* is somebody else already processing irqs? */
4923        if (atomic_xchg(&rdev->ih.lock, 1))
4924                return IRQ_NONE;
4925
4926        rptr = rdev->ih.rptr;
4927        DRM_DEBUG("evergreen_irq_process start: rptr %d, wptr %d\n", rptr, wptr);
4928
4929        /* Order reading of wptr vs. reading of IH ring data */
4930        rmb();
4931
4932        /* display interrupts */
4933        evergreen_irq_ack(rdev);
4934
4935        while (rptr != wptr) {
4936                /* wptr/rptr are in bytes! */
4937                ring_index = rptr / 4;
4938                src_id =  le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
4939                src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
4940
4941                switch (src_id) {
4942                case 1: /* D1 vblank/vline */
4943                        switch (src_data) {
4944                        case 0: /* D1 vblank */
4945                                if (!(rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT))
4946                                        DRM_DEBUG("IH: D1 vblank - IH event w/o asserted irq bit?\n");
4947
4948                                if (rdev->irq.crtc_vblank_int[0]) {
4949                                        drm_handle_vblank(rdev->ddev, 0);
4950                                        rdev->pm.vblank_sync = true;
4951                                        wake_up(&rdev->irq.vblank_queue);
4952                                }
4953                                if (atomic_read(&rdev->irq.pflip[0]))
4954                                        radeon_crtc_handle_vblank(rdev, 0);
4955                                rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VBLANK_INTERRUPT;
4956                                DRM_DEBUG("IH: D1 vblank\n");
4957
4958                                break;
4959                        case 1: /* D1 vline */
4960                                if (!(rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT))
4961                                        DRM_DEBUG("IH: D1 vline - IH event w/o asserted irq bit?\n");
4962
4963                                rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VLINE_INTERRUPT;
4964                                DRM_DEBUG("IH: D1 vline\n");
4965
4966                                break;
4967                        default:
4968                                DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
4969                                break;
4970                        }
4971                        break;
4972                case 2: /* D2 vblank/vline */
4973                        switch (src_data) {
4974                        case 0: /* D2 vblank */
4975                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT))
4976                                        DRM_DEBUG("IH: D2 vblank - IH event w/o asserted irq bit?\n");
4977
4978                                if (rdev->irq.crtc_vblank_int[1]) {
4979                                        drm_handle_vblank(rdev->ddev, 1);
4980                                        rdev->pm.vblank_sync = true;
4981                                        wake_up(&rdev->irq.vblank_queue);
4982                                }
4983                                if (atomic_read(&rdev->irq.pflip[1]))
4984                                        radeon_crtc_handle_vblank(rdev, 1);
4985                                rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT;
4986                                DRM_DEBUG("IH: D2 vblank\n");
4987
4988                                break;
4989                        case 1: /* D2 vline */
4990                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT))
4991                                        DRM_DEBUG("IH: D2 vline - IH event w/o asserted irq bit?\n");
4992
4993                                rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT;
4994                                DRM_DEBUG("IH: D2 vline\n");
4995
4996                                break;
4997                        default:
4998                                DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
4999                                break;
5000                        }
5001                        break;
5002                case 3: /* D3 vblank/vline */
5003                        switch (src_data) {
5004                        case 0: /* D3 vblank */
5005                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT))
5006                                        DRM_DEBUG("IH: D3 vblank - IH event w/o asserted irq bit?\n");
5007
5008                                if (rdev->irq.crtc_vblank_int[2]) {
5009                                        drm_handle_vblank(rdev->ddev, 2);
5010                                        rdev->pm.vblank_sync = true;
5011                                        wake_up(&rdev->irq.vblank_queue);
5012                                }
5013                                if (atomic_read(&rdev->irq.pflip[2]))
5014                                        radeon_crtc_handle_vblank(rdev, 2);
5015                                rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT;
5016                                DRM_DEBUG("IH: D3 vblank\n");
5017
5018                                break;
5019                        case 1: /* D3 vline */
5020                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT))
5021                                        DRM_DEBUG("IH: D3 vline - IH event w/o asserted irq bit?\n");
5022
5023                                rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT;
5024                                DRM_DEBUG("IH: D3 vline\n");
5025
5026                                break;
5027                        default:
5028                                DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
5029                                break;
5030                        }
5031                        break;
5032                case 4: /* D4 vblank/vline */
5033                        switch (src_data) {
5034                        case 0: /* D4 vblank */
5035                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT))
5036                                        DRM_DEBUG("IH: D4 vblank - IH event w/o asserted irq bit?\n");
5037
5038                                if (rdev->irq.crtc_vblank_int[3]) {
5039                                        drm_handle_vblank(rdev->ddev, 3);
5040                                        rdev->pm.vblank_sync = true;
5041                                        wake_up(&rdev->irq.vblank_queue);
5042                                }
5043                                if (atomic_read(&rdev->irq.pflip[3]))
5044                                        radeon_crtc_handle_vblank(rdev, 3);
5045                                rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT;
5046                                DRM_DEBUG("IH: D4 vblank\n");
5047
5048                                break;
5049                        case 1: /* D4 vline */
5050                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT))
5051                                        DRM_DEBUG("IH: D4 vline - IH event w/o asserted irq bit?\n");
5052
5053                                rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT;
5054                                DRM_DEBUG("IH: D4 vline\n");
5055
5056                                break;
5057                        default:
5058                                DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
5059                                break;
5060                        }
5061                        break;
5062                case 5: /* D5 vblank/vline */
5063                        switch (src_data) {
5064                        case 0: /* D5 vblank */
5065                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT))
5066                                        DRM_DEBUG("IH: D5 vblank - IH event w/o asserted irq bit?\n");
5067
5068                                if (rdev->irq.crtc_vblank_int[4]) {
5069                                        drm_handle_vblank(rdev->ddev, 4);
5070                                        rdev->pm.vblank_sync = true;
5071                                        wake_up(&rdev->irq.vblank_queue);
5072                                }
5073                                if (atomic_read(&rdev->irq.pflip[4]))
5074                                        radeon_crtc_handle_vblank(rdev, 4);
5075                                rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT;
5076                                DRM_DEBUG("IH: D5 vblank\n");
5077
5078                                break;
5079                        case 1: /* D5 vline */
5080                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT))
5081                                        DRM_DEBUG("IH: D5 vline - IH event w/o asserted irq bit?\n");
5082
5083                                rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT;
5084                                DRM_DEBUG("IH: D5 vline\n");
5085
5086                                break;
5087                        default:
5088                                DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
5089                                break;
5090                        }
5091                        break;
5092                case 6: /* D6 vblank/vline */
5093                        switch (src_data) {
5094                        case 0: /* D6 vblank */
5095                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT))
5096                                        DRM_DEBUG("IH: D6 vblank - IH event w/o asserted irq bit?\n");
5097
5098                                if (rdev->irq.crtc_vblank_int[5]) {
5099                                        drm_handle_vblank(rdev->ddev, 5);
5100                                        rdev->pm.vblank_sync = true;
5101                                        wake_up(&rdev->irq.vblank_queue);
5102                                }
5103                                if (atomic_read(&rdev->irq.pflip[5]))
5104                                        radeon_crtc_handle_vblank(rdev, 5);
5105                                rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT;
5106                                DRM_DEBUG("IH: D6 vblank\n");
5107
5108                                break;
5109                        case 1: /* D6 vline */
5110                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT))
5111                                        DRM_DEBUG("IH: D6 vline - IH event w/o asserted irq bit?\n");
5112
5113                                rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT;
5114                                DRM_DEBUG("IH: D6 vline\n");
5115
5116                                break;
5117                        default:
5118                                DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
5119                                break;
5120                        }
5121                        break;
5122                case 8: /* D1 page flip */
5123                case 10: /* D2 page flip */
5124                case 12: /* D3 page flip */
5125                case 14: /* D4 page flip */
5126                case 16: /* D5 page flip */
5127                case 18: /* D6 page flip */
5128                        DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
5129                        if (radeon_use_pflipirq > 0)
5130                                radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
5131                        break;
5132                case 42: /* HPD hotplug */
5133                        switch (src_data) {
5134                        case 0:
5135                                if (!(rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT))
5136                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5137
5138                                rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT;
5139                                queue_hotplug = true;
5140                                DRM_DEBUG("IH: HPD1\n");
5141                                break;
5142                        case 1:
5143                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT))
5144                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5145
5146                                rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_INTERRUPT;
5147                                queue_hotplug = true;
5148                                DRM_DEBUG("IH: HPD2\n");
5149                                break;
5150                        case 2:
5151                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT))
5152                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5153
5154                                rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_INTERRUPT;
5155                                queue_hotplug = true;
5156                                DRM_DEBUG("IH: HPD3\n");
5157                                break;
5158                        case 3:
5159                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT))
5160                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5161
5162                                rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_INTERRUPT;
5163                                queue_hotplug = true;
5164                                DRM_DEBUG("IH: HPD4\n");
5165                                break;
5166                        case 4:
5167                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT))
5168                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5169
5170                                rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_INTERRUPT;
5171                                queue_hotplug = true;
5172                                DRM_DEBUG("IH: HPD5\n");
5173                                break;
5174                        case 5:
5175                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT))
5176                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5177
5178                                rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_INTERRUPT;
5179                                queue_hotplug = true;
5180                                DRM_DEBUG("IH: HPD6\n");
5181                                break;
5182                        case 6:
5183                                if (!(rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT))
5184                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5185
5186                                rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_RX_INTERRUPT;
5187                                queue_dp = true;
5188                                DRM_DEBUG("IH: HPD_RX 1\n");
5189                                break;
5190                        case 7:
5191                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT))
5192                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5193
5194                                rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_RX_INTERRUPT;
5195                                queue_dp = true;
5196                                DRM_DEBUG("IH: HPD_RX 2\n");
5197                                break;
5198                        case 8:
5199                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT))
5200                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5201
5202                                rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_RX_INTERRUPT;
5203                                queue_dp = true;
5204                                DRM_DEBUG("IH: HPD_RX 3\n");
5205                                break;
5206                        case 9:
5207                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT))
5208                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5209
5210                                rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_RX_INTERRUPT;
5211                                queue_dp = true;
5212                                DRM_DEBUG("IH: HPD_RX 4\n");
5213                                break;
5214                        case 10:
5215                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT))
5216                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5217
5218                                rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_RX_INTERRUPT;
5219                                queue_dp = true;
5220                                DRM_DEBUG("IH: HPD_RX 5\n");
5221                                break;
5222                        case 11:
5223                                if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT))
5224                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5225
5226                                rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_RX_INTERRUPT;
5227                                queue_dp = true;
5228                                DRM_DEBUG("IH: HPD_RX 6\n");
5229                                break;
5230                        default:
5231                                DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
5232                                break;
5233                        }
5234                        break;
5235                case 44: /* hdmi */
5236                        switch (src_data) {
5237                        case 0:
5238                                if (!(rdev->irq.stat_regs.evergreen.afmt_status1 & AFMT_AZ_FORMAT_WTRIG))
5239                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5240
5241                                rdev->irq.stat_regs.evergreen.afmt_status1 &= ~AFMT_AZ_FORMAT_WTRIG;
5242                                queue_hdmi = true;
5243                                DRM_DEBUG("IH: HDMI0\n");
5244                                break;
5245                        case 1:
5246                                if (!(rdev->irq.stat_regs.evergreen.afmt_status2 & AFMT_AZ_FORMAT_WTRIG))
5247                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5248
5249                                rdev->irq.stat_regs.evergreen.afmt_status2 &= ~AFMT_AZ_FORMAT_WTRIG;
5250                                queue_hdmi = true;
5251                                DRM_DEBUG("IH: HDMI1\n");
5252                                break;
5253                        case 2:
5254                                if (!(rdev->irq.stat_regs.evergreen.afmt_status3 & AFMT_AZ_FORMAT_WTRIG))
5255                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5256
5257                                rdev->irq.stat_regs.evergreen.afmt_status3 &= ~AFMT_AZ_FORMAT_WTRIG;
5258                                queue_hdmi = true;
5259                                DRM_DEBUG("IH: HDMI2\n");
5260                                break;
5261                        case 3:
5262                                if (!(rdev->irq.stat_regs.evergreen.afmt_status4 & AFMT_AZ_FORMAT_WTRIG))
5263                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5264
5265                                rdev->irq.stat_regs.evergreen.afmt_status4 &= ~AFMT_AZ_FORMAT_WTRIG;
5266                                queue_hdmi = true;
5267                                DRM_DEBUG("IH: HDMI3\n");
5268                                break;
5269                        case 4:
5270                                if (!(rdev->irq.stat_regs.evergreen.afmt_status5 & AFMT_AZ_FORMAT_WTRIG))
5271                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5272
5273                                rdev->irq.stat_regs.evergreen.afmt_status5 &= ~AFMT_AZ_FORMAT_WTRIG;
5274                                queue_hdmi = true;
5275                                DRM_DEBUG("IH: HDMI4\n");
5276                                break;
5277                        case 5:
5278                                if (!(rdev->irq.stat_regs.evergreen.afmt_status6 & AFMT_AZ_FORMAT_WTRIG))
5279                                        DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
5280
5281                                rdev->irq.stat_regs.evergreen.afmt_status6 &= ~AFMT_AZ_FORMAT_WTRIG;
5282                                queue_hdmi = true;
5283                                DRM_DEBUG("IH: HDMI5\n");
5284                                break;
5285                        default:
5286                                DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data);
5287                                break;
5288                        }
5289                case 96:
5290                        DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR));
5291                        WREG32(SRBM_INT_ACK, 0x1);
5292                        break;
5293                case 124: /* UVD */
5294                        DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
5295                        radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
5296                        break;
5297                case 146:
5298                case 147:
5299                        addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR);
5300                        status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS);
5301                        /* reset addr and status */
5302                        WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
5303                        if (addr == 0x0 && status == 0x0)
5304                                break;
5305                        dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data);
5306                        dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
5307                                addr);
5308                        dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
5309                                status);
5310                        cayman_vm_decode_fault(rdev, status, addr);
5311                        break;
5312                case 176: /* CP_INT in ring buffer */
5313                case 177: /* CP_INT in IB1 */
5314                case 178: /* CP_INT in IB2 */
5315                        DRM_DEBUG("IH: CP int: 0x%08x\n", src_data);
5316                        radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
5317                        break;
5318                case 181: /* CP EOP event */
5319                        DRM_DEBUG("IH: CP EOP\n");
5320                        if (rdev->family >= CHIP_CAYMAN) {
5321                                switch (src_data) {
5322                                case 0:
5323                                        radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
5324                                        break;
5325                                case 1:
5326                                        radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
5327                                        break;
5328                                case 2:
5329                                        radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
5330                                        break;
5331                                }
5332                        } else
5333                                radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
5334                        break;
5335                case 224: /* DMA trap event */
5336                        DRM_DEBUG("IH: DMA trap\n");
5337                        radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX);
5338                        break;
5339                case 230: /* thermal low to high */
5340                        DRM_DEBUG("IH: thermal low to high\n");
5341                        rdev->pm.dpm.thermal.high_to_low = false;
5342                        queue_thermal = true;
5343                        break;
5344                case 231: /* thermal high to low */
5345                        DRM_DEBUG("IH: thermal high to low\n");
5346                        rdev->pm.dpm.thermal.high_to_low = true;
5347                        queue_thermal = true;
5348                        break;
5349                case 233: /* GUI IDLE */
5350                        DRM_DEBUG("IH: GUI idle\n");
5351                        break;
5352                case 244: /* DMA trap event */
5353                        if (rdev->family >= CHIP_CAYMAN) {
5354                                DRM_DEBUG("IH: DMA1 trap\n");
5355                                radeon_fence_process(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
5356                        }
5357                        break;
5358                default:
5359                        DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
5360                        break;
5361                }
5362
5363                /* wptr/rptr are in bytes! */
5364                rptr += 16;
5365                rptr &= rdev->ih.ptr_mask;
5366                WREG32(IH_RB_RPTR, rptr);
5367        }
5368        if (queue_dp)
5369                schedule_work(&rdev->dp_work);
5370        if (queue_hotplug)
5371                schedule_work(&rdev->hotplug_work);
5372        if (queue_hdmi)
5373                schedule_work(&rdev->audio_work);
5374        if (queue_thermal && rdev->pm.dpm_enabled)
5375                schedule_work(&rdev->pm.dpm.thermal.work);
5376        rdev->ih.rptr = rptr;
5377        atomic_set(&rdev->ih.lock, 0);
5378
5379        /* make sure wptr hasn't changed while processing */
5380        wptr = evergreen_get_ih_wptr(rdev);
5381        if (wptr != rptr)
5382                goto restart_ih;
5383
5384        return IRQ_HANDLED;
5385}
5386
5387static int evergreen_startup(struct radeon_device *rdev)
5388{
5389        struct radeon_ring *ring;
5390        int r;
5391
5392        /* enable pcie gen2 link */
5393        evergreen_pcie_gen2_enable(rdev);
5394        /* enable aspm */
5395        evergreen_program_aspm(rdev);
5396
5397        /* scratch needs to be initialized before MC */
5398        r = r600_vram_scratch_init(rdev);
5399        if (r)
5400                return r;
5401
5402        evergreen_mc_program(rdev);
5403
5404        if (ASIC_IS_DCE5(rdev) && !rdev->pm.dpm_enabled) {
5405                r = ni_mc_load_microcode(rdev);
5406                if (r) {
5407                        DRM_ERROR("Failed to load MC firmware!\n");
5408                        return r;
5409                }
5410        }
5411
5412        if (rdev->flags & RADEON_IS_AGP) {
5413                evergreen_agp_enable(rdev);
5414        } else {
5415                r = evergreen_pcie_gart_enable(rdev);
5416                if (r)
5417                        return r;
5418        }
5419        evergreen_gpu_init(rdev);
5420
5421        /* allocate rlc buffers */
5422        if (rdev->flags & RADEON_IS_IGP) {
5423                rdev->rlc.reg_list = sumo_rlc_save_restore_register_list;
5424                rdev->rlc.reg_list_size =
5425                        (u32)ARRAY_SIZE(sumo_rlc_save_restore_register_list);
5426                rdev->rlc.cs_data = evergreen_cs_data;
5427                r = sumo_rlc_init(rdev);
5428                if (r) {
5429                        DRM_ERROR("Failed to init rlc BOs!\n");
5430                        return r;
5431                }
5432        }
5433
5434        /* allocate wb buffer */
5435        r = radeon_wb_init(rdev);
5436        if (r)
5437                return r;
5438
5439        r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
5440        if (r) {
5441                dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
5442                return r;
5443        }
5444
5445        r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
5446        if (r) {
5447                dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
5448                return r;
5449        }
5450
5451        r = uvd_v2_2_resume(rdev);
5452        if (!r) {
5453                r = radeon_fence_driver_start_ring(rdev,
5454                                                   R600_RING_TYPE_UVD_INDEX);
5455                if (r)
5456                        dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
5457        }
5458
5459        if (r)
5460                rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
5461
5462        /* Enable IRQ */
5463        if (!rdev->irq.installed) {
5464                r = radeon_irq_kms_init(rdev);
5465                if (r)
5466                        return r;
5467        }
5468
5469        r = r600_irq_init(rdev);
5470        if (r) {
5471                DRM_ERROR("radeon: IH init failed (%d).\n", r);
5472                radeon_irq_kms_fini(rdev);
5473                return r;
5474        }
5475        evergreen_irq_set(rdev);
5476
5477        ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
5478        r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
5479                             RADEON_CP_PACKET2);
5480        if (r)
5481                return r;
5482
5483        ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
5484        r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
5485                             DMA_PACKET(DMA_PACKET_NOP, 0, 0));
5486        if (r)
5487                return r;
5488
5489        r = evergreen_cp_load_microcode(rdev);
5490        if (r)
5491                return r;
5492        r = evergreen_cp_resume(rdev);
5493        if (r)
5494                return r;
5495        r = r600_dma_resume(rdev);
5496        if (r)
5497                return r;
5498
5499        ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
5500        if (ring->ring_size) {
5501                r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
5502                                     RADEON_CP_PACKET2);
5503                if (!r)
5504                        r = uvd_v1_0_init(rdev);
5505
5506                if (r)
5507                        DRM_ERROR("radeon: error initializing UVD (%d).\n", r);
5508        }
5509
5510        r = radeon_ib_pool_init(rdev);
5511        if (r) {
5512                dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
5513                return r;
5514        }
5515
5516        r = radeon_audio_init(rdev);
5517        if (r) {
5518                DRM_ERROR("radeon: audio init failed\n");
5519                return r;
5520        }
5521
5522        return 0;
5523}
5524
5525int evergreen_resume(struct radeon_device *rdev)
5526{
5527        int r;
5528
5529        /* reset the asic, the gfx blocks are often in a bad state
5530         * after the driver is unloaded or after a resume
5531         */
5532        if (radeon_asic_reset(rdev))
5533                dev_warn(rdev->dev, "GPU reset failed !\n");
5534        /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
5535         * posting will perform necessary task to bring back GPU into good
5536         * shape.
5537         */
5538        /* post card */
5539        atom_asic_init(rdev->mode_info.atom_context);
5540
5541        /* init golden registers */
5542        evergreen_init_golden_registers(rdev);
5543
5544        if (rdev->pm.pm_method == PM_METHOD_DPM)
5545                radeon_pm_resume(rdev);
5546
5547        rdev->accel_working = true;
5548        r = evergreen_startup(rdev);
5549        if (r) {
5550                DRM_ERROR("evergreen startup failed on resume\n");
5551                rdev->accel_working = false;
5552                return r;
5553        }
5554
5555        return r;
5556
5557}
5558
5559int evergreen_suspend(struct radeon_device *rdev)
5560{
5561        radeon_pm_suspend(rdev);
5562        radeon_audio_fini(rdev);
5563        uvd_v1_0_fini(rdev);
5564        radeon_uvd_suspend(rdev);
5565        r700_cp_stop(rdev);
5566        r600_dma_stop(rdev);
5567        evergreen_irq_suspend(rdev);
5568        radeon_wb_disable(rdev);
5569        evergreen_pcie_gart_disable(rdev);
5570
5571        return 0;
5572}
5573
5574/* Plan is to move initialization in that function and use
5575 * helper function so that radeon_device_init pretty much
5576 * do nothing more than calling asic specific function. This
5577 * should also allow to remove a bunch of callback function
5578 * like vram_info.
5579 */
5580int evergreen_init(struct radeon_device *rdev)
5581{
5582        int r;
5583
5584        /* Read BIOS */
5585        if (!radeon_get_bios(rdev)) {
5586                if (ASIC_IS_AVIVO(rdev))
5587                        return -EINVAL;
5588        }
5589        /* Must be an ATOMBIOS */
5590        if (!rdev->is_atom_bios) {
5591                dev_err(rdev->dev, "Expecting atombios for evergreen GPU\n");
5592                return -EINVAL;
5593        }
5594        r = radeon_atombios_init(rdev);
5595        if (r)
5596                return r;
5597        /* reset the asic, the gfx blocks are often in a bad state
5598         * after the driver is unloaded or after a resume
5599         */
5600        if (radeon_asic_reset(rdev))
5601                dev_warn(rdev->dev, "GPU reset failed !\n");
5602        /* Post card if necessary */
5603        if (!radeon_card_posted(rdev)) {
5604                if (!rdev->bios) {
5605                        dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
5606                        return -EINVAL;
5607                }
5608                DRM_INFO("GPU not posted. posting now...\n");
5609                atom_asic_init(rdev->mode_info.atom_context);
5610        }
5611        /* init golden registers */
5612        evergreen_init_golden_registers(rdev);
5613        /* Initialize scratch registers */
5614        r600_scratch_init(rdev);
5615        /* Initialize surface registers */
5616        radeon_surface_init(rdev);
5617        /* Initialize clocks */
5618        radeon_get_clock_info(rdev->ddev);
5619        /* Fence driver */
5620        r = radeon_fence_driver_init(rdev);
5621        if (r)
5622                return r;
5623        /* initialize AGP */
5624        if (rdev->flags & RADEON_IS_AGP) {
5625                r = radeon_agp_init(rdev);
5626                if (r)
5627                        radeon_agp_disable(rdev);
5628        }
5629        /* initialize memory controller */
5630        r = evergreen_mc_init(rdev);
5631        if (r)
5632                return r;
5633        /* Memory manager */
5634        r = radeon_bo_init(rdev);
5635        if (r)
5636                return r;
5637
5638        if (ASIC_IS_DCE5(rdev)) {
5639                if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
5640                        r = ni_init_microcode(rdev);
5641                        if (r) {
5642                                DRM_ERROR("Failed to load firmware!\n");
5643                                return r;
5644                        }
5645                }
5646        } else {
5647                if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
5648                        r = r600_init_microcode(rdev);
5649                        if (r) {
5650                                DRM_ERROR("Failed to load firmware!\n");
5651                                return r;
5652                        }
5653                }
5654        }
5655
5656        /* Initialize power management */
5657        radeon_pm_init(rdev);
5658
5659        rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
5660        r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
5661
5662        rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
5663        r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
5664
5665        r = radeon_uvd_init(rdev);
5666        if (!r) {
5667                rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
5668                r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX],
5669                               4096);
5670        }
5671
5672        rdev->ih.ring_obj = NULL;
5673        r600_ih_ring_init(rdev, 64 * 1024);
5674
5675        r = r600_pcie_gart_init(rdev);
5676        if (r)
5677                return r;
5678
5679        rdev->accel_working = true;
5680        r = evergreen_startup(rdev);
5681        if (r) {
5682                dev_err(rdev->dev, "disabling GPU acceleration\n");
5683                r700_cp_fini(rdev);
5684                r600_dma_fini(rdev);
5685                r600_irq_fini(rdev);
5686                if (rdev->flags & RADEON_IS_IGP)
5687                        sumo_rlc_fini(rdev);
5688                radeon_wb_fini(rdev);
5689                radeon_ib_pool_fini(rdev);
5690                radeon_irq_kms_fini(rdev);
5691                evergreen_pcie_gart_fini(rdev);
5692                rdev->accel_working = false;
5693        }
5694
5695        /* Don't start up if the MC ucode is missing on BTC parts.
5696         * The default clocks and voltages before the MC ucode
5697         * is loaded are not suffient for advanced operations.
5698         */
5699        if (ASIC_IS_DCE5(rdev)) {
5700                if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
5701                        DRM_ERROR("radeon: MC ucode required for NI+.\n");
5702                        return -EINVAL;
5703                }
5704        }
5705
5706        return 0;
5707}
5708
5709void evergreen_fini(struct radeon_device *rdev)
5710{
5711        radeon_pm_fini(rdev);
5712        radeon_audio_fini(rdev);
5713        r700_cp_fini(rdev);
5714        r600_dma_fini(rdev);
5715        r600_irq_fini(rdev);
5716        if (rdev->flags & RADEON_IS_IGP)
5717                sumo_rlc_fini(rdev);
5718        radeon_wb_fini(rdev);
5719        radeon_ib_pool_fini(rdev);
5720        radeon_irq_kms_fini(rdev);
5721        uvd_v1_0_fini(rdev);
5722        radeon_uvd_fini(rdev);
5723        evergreen_pcie_gart_fini(rdev);
5724        r600_vram_scratch_fini(rdev);
5725        radeon_gem_fini(rdev);
5726        radeon_fence_driver_fini(rdev);
5727        radeon_agp_fini(rdev);
5728        radeon_bo_fini(rdev);
5729        radeon_atombios_fini(rdev);
5730        kfree(rdev->bios);
5731        rdev->bios = NULL;
5732}
5733
5734void evergreen_pcie_gen2_enable(struct radeon_device *rdev)
5735{
5736        u32 link_width_cntl, speed_cntl;
5737
5738        if (radeon_pcie_gen2 == 0)
5739                return;
5740
5741        if (rdev->flags & RADEON_IS_IGP)
5742                return;
5743
5744        if (!(rdev->flags & RADEON_IS_PCIE))
5745                return;
5746
5747        /* x2 cards have a special sequence */
5748        if (ASIC_IS_X2(rdev))
5749                return;
5750
5751        if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) &&
5752                (rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))
5753                return;
5754
5755        speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5756        if (speed_cntl & LC_CURRENT_DATA_RATE) {
5757                DRM_INFO("PCIE gen 2 link speeds already enabled\n");
5758                return;
5759        }
5760
5761        DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
5762
5763        if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) ||
5764            (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
5765
5766                link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
5767                link_width_cntl &= ~LC_UPCONFIGURE_DIS;
5768                WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
5769
5770                speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5771                speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
5772                WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5773
5774                speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5775                speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT;
5776                WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5777
5778                speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5779                speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
5780                WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5781
5782                speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
5783                speed_cntl |= LC_GEN2_EN_STRAP;
5784                WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
5785
5786        } else {
5787                link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
5788                /* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
5789                if (1)
5790                        link_width_cntl |= LC_UPCONFIGURE_DIS;
5791                else
5792                        link_width_cntl &= ~LC_UPCONFIGURE_DIS;
5793                WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
5794        }
5795}
5796
5797void evergreen_program_aspm(struct radeon_device *rdev)
5798{
5799        u32 data, orig;
5800        u32 pcie_lc_cntl, pcie_lc_cntl_old;
5801        bool disable_l0s, disable_l1 = false, disable_plloff_in_l1 = false;
5802        /* fusion_platform = true
5803         * if the system is a fusion system
5804         * (APU or DGPU in a fusion system).
5805         * todo: check if the system is a fusion platform.
5806         */
5807        bool fusion_platform = false;
5808
5809        if (radeon_aspm == 0)
5810                return;
5811
5812        if (!(rdev->flags & RADEON_IS_PCIE))
5813                return;
5814
5815        switch (rdev->family) {
5816        case CHIP_CYPRESS:
5817        case CHIP_HEMLOCK:
5818        case CHIP_JUNIPER:
5819        case CHIP_REDWOOD:
5820        case CHIP_CEDAR:
5821        case CHIP_SUMO:
5822        case CHIP_SUMO2:
5823        case CHIP_PALM:
5824        case CHIP_ARUBA:
5825                disable_l0s = true;
5826                break;
5827        default:
5828                disable_l0s = false;
5829                break;
5830        }
5831
5832        if (rdev->flags & RADEON_IS_IGP)
5833                fusion_platform = true; /* XXX also dGPUs in a fusion system */
5834
5835        data = orig = RREG32_PIF_PHY0(PB0_PIF_PAIRING);
5836        if (fusion_platform)
5837                data &= ~MULTI_PIF;
5838        else
5839                data |= MULTI_PIF;
5840        if (data != orig)
5841                WREG32_PIF_PHY0(PB0_PIF_PAIRING, data);
5842
5843        data = orig = RREG32_PIF_PHY1(PB1_PIF_PAIRING);
5844        if (fusion_platform)
5845                data &= ~MULTI_PIF;
5846        else
5847                data |= MULTI_PIF;
5848        if (data != orig)
5849                WREG32_PIF_PHY1(PB1_PIF_PAIRING, data);
5850
5851        pcie_lc_cntl = pcie_lc_cntl_old = RREG32_PCIE_PORT(PCIE_LC_CNTL);
5852        pcie_lc_cntl &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
5853        if (!disable_l0s) {
5854                if (rdev->family >= CHIP_BARTS)
5855                        pcie_lc_cntl |= LC_L0S_INACTIVITY(7);
5856                else
5857                        pcie_lc_cntl |= LC_L0S_INACTIVITY(3);
5858        }
5859
5860        if (!disable_l1) {
5861                if (rdev->family >= CHIP_BARTS)
5862                        pcie_lc_cntl |= LC_L1_INACTIVITY(7);
5863                else
5864                        pcie_lc_cntl |= LC_L1_INACTIVITY(8);
5865
5866                if (!disable_plloff_in_l1) {
5867                        data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0);
5868                        data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
5869                        data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
5870                        if (data != orig)
5871                                WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data);
5872
5873                        data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1);
5874                        data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
5875                        data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
5876                        if (data != orig)
5877                                WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data);
5878
5879                        data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0);
5880                        data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
5881                        data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
5882                        if (data != orig)
5883                                WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data);
5884
5885                        data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1);
5886                        data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
5887                        data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
5888                        if (data != orig)
5889                                WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data);
5890
5891                        if (rdev->family >= CHIP_BARTS) {
5892                                data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0);
5893                                data &= ~PLL_RAMP_UP_TIME_0_MASK;
5894                                data |= PLL_RAMP_UP_TIME_0(4);
5895                                if (data != orig)
5896                                        WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data);
5897
5898                                data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1);
5899                                data &= ~PLL_RAMP_UP_TIME_1_MASK;
5900                                data |= PLL_RAMP_UP_TIME_1(4);
5901                                if (data != orig)
5902                                        WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data);
5903
5904                                data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0);
5905                                data &= ~PLL_RAMP_UP_TIME_0_MASK;
5906                                data |= PLL_RAMP_UP_TIME_0(4);
5907                                if (data != orig)
5908                                        WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data);
5909
5910                                data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1);
5911                                data &= ~PLL_RAMP_UP_TIME_1_MASK;
5912                                data |= PLL_RAMP_UP_TIME_1(4);
5913                                if (data != orig)
5914                                        WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data);
5915                        }
5916
5917                        data = orig = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
5918                        data &= ~LC_DYN_LANES_PWR_STATE_MASK;
5919                        data |= LC_DYN_LANES_PWR_STATE(3);
5920                        if (data != orig)
5921                                WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
5922
5923                        if (rdev->family >= CHIP_BARTS) {
5924                                data = orig = RREG32_PIF_PHY0(PB0_PIF_CNTL);
5925                                data &= ~LS2_EXIT_TIME_MASK;
5926                                data |= LS2_EXIT_TIME(1);
5927                                if (data != orig)
5928                                        WREG32_PIF_PHY0(PB0_PIF_CNTL, data);
5929
5930                                data = orig = RREG32_PIF_PHY1(PB1_PIF_CNTL);
5931                                data &= ~LS2_EXIT_TIME_MASK;
5932                                data |= LS2_EXIT_TIME(1);
5933                                if (data != orig)
5934                                        WREG32_PIF_PHY1(PB1_PIF_CNTL, data);
5935                        }
5936                }
5937        }
5938
5939        /* evergreen parts only */
5940        if (rdev->family < CHIP_BARTS)
5941                pcie_lc_cntl |= LC_PMI_TO_L1_DIS;
5942
5943        if (pcie_lc_cntl != pcie_lc_cntl_old)
5944                WREG32_PCIE_PORT(PCIE_LC_CNTL, pcie_lc_cntl);
5945}
5946