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