cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

evergreen.c (164848B)


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