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