Home | History | Annotate | Line # | Download | only in radeon
      1  1.3  riastrad /*	$NetBSD: radeon_ni.c,v 1.3 2021/12/18 23:45:43 riastradh 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.3  riastrad 
     27  1.1  riastrad #include <sys/cdefs.h>
     28  1.3  riastrad __KERNEL_RCSID(0, "$NetBSD: radeon_ni.c,v 1.3 2021/12/18 23:45:43 riastradh Exp $");
     29  1.1  riastrad 
     30  1.1  riastrad #include <linux/firmware.h>
     31  1.3  riastrad #include <linux/module.h>
     32  1.3  riastrad #include <linux/pci.h>
     33  1.1  riastrad #include <linux/slab.h>
     34  1.3  riastrad 
     35  1.3  riastrad #include <drm/radeon_drm.h>
     36  1.3  riastrad 
     37  1.3  riastrad #include "atom.h"
     38  1.3  riastrad #include "cayman_blit_shaders.h"
     39  1.3  riastrad #include "clearstate_cayman.h"
     40  1.3  riastrad #include "ni_reg.h"
     41  1.3  riastrad #include "nid.h"
     42  1.1  riastrad #include "radeon.h"
     43  1.1  riastrad #include "radeon_asic.h"
     44  1.1  riastrad #include "radeon_audio.h"
     45  1.1  riastrad #include "radeon_ucode.h"
     46  1.1  riastrad 
     47  1.2  riastrad #include <linux/nbsd-namespace.h>
     48  1.2  riastrad 
     49  1.1  riastrad /*
     50  1.1  riastrad  * Indirect registers accessor
     51  1.1  riastrad  */
     52  1.1  riastrad u32 tn_smc_rreg(struct radeon_device *rdev, u32 reg)
     53  1.1  riastrad {
     54  1.1  riastrad 	unsigned long flags;
     55  1.1  riastrad 	u32 r;
     56  1.1  riastrad 
     57  1.1  riastrad 	spin_lock_irqsave(&rdev->smc_idx_lock, flags);
     58  1.1  riastrad 	WREG32(TN_SMC_IND_INDEX_0, (reg));
     59  1.1  riastrad 	r = RREG32(TN_SMC_IND_DATA_0);
     60  1.1  riastrad 	spin_unlock_irqrestore(&rdev->smc_idx_lock, flags);
     61  1.1  riastrad 	return r;
     62  1.1  riastrad }
     63  1.1  riastrad 
     64  1.1  riastrad void tn_smc_wreg(struct radeon_device *rdev, u32 reg, u32 v)
     65  1.1  riastrad {
     66  1.1  riastrad 	unsigned long flags;
     67  1.1  riastrad 
     68  1.1  riastrad 	spin_lock_irqsave(&rdev->smc_idx_lock, flags);
     69  1.1  riastrad 	WREG32(TN_SMC_IND_INDEX_0, (reg));
     70  1.1  riastrad 	WREG32(TN_SMC_IND_DATA_0, (v));
     71  1.1  riastrad 	spin_unlock_irqrestore(&rdev->smc_idx_lock, flags);
     72  1.1  riastrad }
     73  1.1  riastrad 
     74  1.1  riastrad static const u32 tn_rlc_save_restore_register_list[] =
     75  1.1  riastrad {
     76  1.1  riastrad 	0x98fc,
     77  1.1  riastrad 	0x98f0,
     78  1.1  riastrad 	0x9834,
     79  1.1  riastrad 	0x9838,
     80  1.1  riastrad 	0x9870,
     81  1.1  riastrad 	0x9874,
     82  1.1  riastrad 	0x8a14,
     83  1.1  riastrad 	0x8b24,
     84  1.1  riastrad 	0x8bcc,
     85  1.1  riastrad 	0x8b10,
     86  1.1  riastrad 	0x8c30,
     87  1.1  riastrad 	0x8d00,
     88  1.1  riastrad 	0x8d04,
     89  1.1  riastrad 	0x8c00,
     90  1.1  riastrad 	0x8c04,
     91  1.1  riastrad 	0x8c10,
     92  1.1  riastrad 	0x8c14,
     93  1.1  riastrad 	0x8d8c,
     94  1.1  riastrad 	0x8cf0,
     95  1.1  riastrad 	0x8e38,
     96  1.1  riastrad 	0x9508,
     97  1.1  riastrad 	0x9688,
     98  1.1  riastrad 	0x9608,
     99  1.1  riastrad 	0x960c,
    100  1.1  riastrad 	0x9610,
    101  1.1  riastrad 	0x9614,
    102  1.1  riastrad 	0x88c4,
    103  1.1  riastrad 	0x8978,
    104  1.1  riastrad 	0x88d4,
    105  1.1  riastrad 	0x900c,
    106  1.1  riastrad 	0x9100,
    107  1.1  riastrad 	0x913c,
    108  1.1  riastrad 	0x90e8,
    109  1.1  riastrad 	0x9354,
    110  1.1  riastrad 	0xa008,
    111  1.1  riastrad 	0x98f8,
    112  1.1  riastrad 	0x9148,
    113  1.1  riastrad 	0x914c,
    114  1.1  riastrad 	0x3f94,
    115  1.1  riastrad 	0x98f4,
    116  1.1  riastrad 	0x9b7c,
    117  1.1  riastrad 	0x3f8c,
    118  1.1  riastrad 	0x8950,
    119  1.1  riastrad 	0x8954,
    120  1.1  riastrad 	0x8a18,
    121  1.1  riastrad 	0x8b28,
    122  1.1  riastrad 	0x9144,
    123  1.1  riastrad 	0x3f90,
    124  1.1  riastrad 	0x915c,
    125  1.1  riastrad 	0x9160,
    126  1.1  riastrad 	0x9178,
    127  1.1  riastrad 	0x917c,
    128  1.1  riastrad 	0x9180,
    129  1.1  riastrad 	0x918c,
    130  1.1  riastrad 	0x9190,
    131  1.1  riastrad 	0x9194,
    132  1.1  riastrad 	0x9198,
    133  1.1  riastrad 	0x919c,
    134  1.1  riastrad 	0x91a8,
    135  1.1  riastrad 	0x91ac,
    136  1.1  riastrad 	0x91b0,
    137  1.1  riastrad 	0x91b4,
    138  1.1  riastrad 	0x91b8,
    139  1.1  riastrad 	0x91c4,
    140  1.1  riastrad 	0x91c8,
    141  1.1  riastrad 	0x91cc,
    142  1.1  riastrad 	0x91d0,
    143  1.1  riastrad 	0x91d4,
    144  1.1  riastrad 	0x91e0,
    145  1.1  riastrad 	0x91e4,
    146  1.1  riastrad 	0x91ec,
    147  1.1  riastrad 	0x91f0,
    148  1.1  riastrad 	0x91f4,
    149  1.1  riastrad 	0x9200,
    150  1.1  riastrad 	0x9204,
    151  1.1  riastrad 	0x929c,
    152  1.1  riastrad 	0x8030,
    153  1.1  riastrad 	0x9150,
    154  1.1  riastrad 	0x9a60,
    155  1.1  riastrad 	0x920c,
    156  1.1  riastrad 	0x9210,
    157  1.1  riastrad 	0x9228,
    158  1.1  riastrad 	0x922c,
    159  1.1  riastrad 	0x9244,
    160  1.1  riastrad 	0x9248,
    161  1.1  riastrad 	0x91e8,
    162  1.1  riastrad 	0x9294,
    163  1.1  riastrad 	0x9208,
    164  1.1  riastrad 	0x9224,
    165  1.1  riastrad 	0x9240,
    166  1.1  riastrad 	0x9220,
    167  1.1  riastrad 	0x923c,
    168  1.1  riastrad 	0x9258,
    169  1.1  riastrad 	0x9744,
    170  1.1  riastrad 	0xa200,
    171  1.1  riastrad 	0xa204,
    172  1.1  riastrad 	0xa208,
    173  1.1  riastrad 	0xa20c,
    174  1.1  riastrad 	0x8d58,
    175  1.1  riastrad 	0x9030,
    176  1.1  riastrad 	0x9034,
    177  1.1  riastrad 	0x9038,
    178  1.1  riastrad 	0x903c,
    179  1.1  riastrad 	0x9040,
    180  1.1  riastrad 	0x9654,
    181  1.1  riastrad 	0x897c,
    182  1.1  riastrad 	0xa210,
    183  1.1  riastrad 	0xa214,
    184  1.1  riastrad 	0x9868,
    185  1.1  riastrad 	0xa02c,
    186  1.1  riastrad 	0x9664,
    187  1.1  riastrad 	0x9698,
    188  1.1  riastrad 	0x949c,
    189  1.1  riastrad 	0x8e10,
    190  1.1  riastrad 	0x8e18,
    191  1.1  riastrad 	0x8c50,
    192  1.1  riastrad 	0x8c58,
    193  1.1  riastrad 	0x8c60,
    194  1.1  riastrad 	0x8c68,
    195  1.1  riastrad 	0x89b4,
    196  1.1  riastrad 	0x9830,
    197  1.1  riastrad 	0x802c,
    198  1.1  riastrad };
    199  1.1  riastrad 
    200  1.1  riastrad extern bool evergreen_is_display_hung(struct radeon_device *rdev);
    201  1.1  riastrad extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
    202  1.1  riastrad extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
    203  1.1  riastrad extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
    204  1.1  riastrad extern int evergreen_mc_wait_for_idle(struct radeon_device *rdev);
    205  1.1  riastrad extern void evergreen_mc_program(struct radeon_device *rdev);
    206  1.1  riastrad extern void evergreen_irq_suspend(struct radeon_device *rdev);
    207  1.1  riastrad extern int evergreen_mc_init(struct radeon_device *rdev);
    208  1.1  riastrad extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
    209  1.1  riastrad extern void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
    210  1.1  riastrad extern void evergreen_program_aspm(struct radeon_device *rdev);
    211  1.1  riastrad extern void sumo_rlc_fini(struct radeon_device *rdev);
    212  1.1  riastrad extern int sumo_rlc_init(struct radeon_device *rdev);
    213  1.1  riastrad extern void evergreen_gpu_pci_config_reset(struct radeon_device *rdev);
    214  1.1  riastrad 
    215  1.1  riastrad /* Firmware Names */
    216  1.1  riastrad MODULE_FIRMWARE("radeon/BARTS_pfp.bin");
    217  1.1  riastrad MODULE_FIRMWARE("radeon/BARTS_me.bin");
    218  1.1  riastrad MODULE_FIRMWARE("radeon/BARTS_mc.bin");
    219  1.1  riastrad MODULE_FIRMWARE("radeon/BARTS_smc.bin");
    220  1.1  riastrad MODULE_FIRMWARE("radeon/BTC_rlc.bin");
    221  1.1  riastrad MODULE_FIRMWARE("radeon/TURKS_pfp.bin");
    222  1.1  riastrad MODULE_FIRMWARE("radeon/TURKS_me.bin");
    223  1.1  riastrad MODULE_FIRMWARE("radeon/TURKS_mc.bin");
    224  1.1  riastrad MODULE_FIRMWARE("radeon/TURKS_smc.bin");
    225  1.1  riastrad MODULE_FIRMWARE("radeon/CAICOS_pfp.bin");
    226  1.1  riastrad MODULE_FIRMWARE("radeon/CAICOS_me.bin");
    227  1.1  riastrad MODULE_FIRMWARE("radeon/CAICOS_mc.bin");
    228  1.1  riastrad MODULE_FIRMWARE("radeon/CAICOS_smc.bin");
    229  1.1  riastrad MODULE_FIRMWARE("radeon/CAYMAN_pfp.bin");
    230  1.1  riastrad MODULE_FIRMWARE("radeon/CAYMAN_me.bin");
    231  1.1  riastrad MODULE_FIRMWARE("radeon/CAYMAN_mc.bin");
    232  1.1  riastrad MODULE_FIRMWARE("radeon/CAYMAN_rlc.bin");
    233  1.1  riastrad MODULE_FIRMWARE("radeon/CAYMAN_smc.bin");
    234  1.1  riastrad MODULE_FIRMWARE("radeon/ARUBA_pfp.bin");
    235  1.1  riastrad MODULE_FIRMWARE("radeon/ARUBA_me.bin");
    236  1.1  riastrad MODULE_FIRMWARE("radeon/ARUBA_rlc.bin");
    237  1.1  riastrad 
    238  1.1  riastrad 
    239  1.1  riastrad static const u32 cayman_golden_registers2[] =
    240  1.1  riastrad {
    241  1.1  riastrad 	0x3e5c, 0xffffffff, 0x00000000,
    242  1.1  riastrad 	0x3e48, 0xffffffff, 0x00000000,
    243  1.1  riastrad 	0x3e4c, 0xffffffff, 0x00000000,
    244  1.1  riastrad 	0x3e64, 0xffffffff, 0x00000000,
    245  1.1  riastrad 	0x3e50, 0xffffffff, 0x00000000,
    246  1.1  riastrad 	0x3e60, 0xffffffff, 0x00000000
    247  1.1  riastrad };
    248  1.1  riastrad 
    249  1.1  riastrad static const u32 cayman_golden_registers[] =
    250  1.1  riastrad {
    251  1.1  riastrad 	0x5eb4, 0xffffffff, 0x00000002,
    252  1.1  riastrad 	0x5e78, 0x8f311ff1, 0x001000f0,
    253  1.1  riastrad 	0x3f90, 0xffff0000, 0xff000000,
    254  1.1  riastrad 	0x9148, 0xffff0000, 0xff000000,
    255  1.1  riastrad 	0x3f94, 0xffff0000, 0xff000000,
    256  1.1  riastrad 	0x914c, 0xffff0000, 0xff000000,
    257  1.1  riastrad 	0xc78, 0x00000080, 0x00000080,
    258  1.1  riastrad 	0xbd4, 0x70073777, 0x00011003,
    259  1.1  riastrad 	0xd02c, 0xbfffff1f, 0x08421000,
    260  1.1  riastrad 	0xd0b8, 0x73773777, 0x02011003,
    261  1.1  riastrad 	0x5bc0, 0x00200000, 0x50100000,
    262  1.1  riastrad 	0x98f8, 0x33773777, 0x02011003,
    263  1.1  riastrad 	0x98fc, 0xffffffff, 0x76541032,
    264  1.1  riastrad 	0x7030, 0x31000311, 0x00000011,
    265  1.1  riastrad 	0x2f48, 0x33773777, 0x42010001,
    266  1.1  riastrad 	0x6b28, 0x00000010, 0x00000012,
    267  1.1  riastrad 	0x7728, 0x00000010, 0x00000012,
    268  1.1  riastrad 	0x10328, 0x00000010, 0x00000012,
    269  1.1  riastrad 	0x10f28, 0x00000010, 0x00000012,
    270  1.1  riastrad 	0x11b28, 0x00000010, 0x00000012,
    271  1.1  riastrad 	0x12728, 0x00000010, 0x00000012,
    272  1.1  riastrad 	0x240c, 0x000007ff, 0x00000000,
    273  1.1  riastrad 	0x8a14, 0xf000001f, 0x00000007,
    274  1.1  riastrad 	0x8b24, 0x3fff3fff, 0x00ff0fff,
    275  1.1  riastrad 	0x8b10, 0x0000ff0f, 0x00000000,
    276  1.1  riastrad 	0x28a4c, 0x07ffffff, 0x06000000,
    277  1.1  riastrad 	0x10c, 0x00000001, 0x00010003,
    278  1.1  riastrad 	0xa02c, 0xffffffff, 0x0000009b,
    279  1.1  riastrad 	0x913c, 0x0000010f, 0x01000100,
    280  1.1  riastrad 	0x8c04, 0xf8ff00ff, 0x40600060,
    281  1.1  riastrad 	0x28350, 0x00000f01, 0x00000000,
    282  1.1  riastrad 	0x9508, 0x3700001f, 0x00000002,
    283  1.1  riastrad 	0x960c, 0xffffffff, 0x54763210,
    284  1.1  riastrad 	0x88c4, 0x001f3ae3, 0x00000082,
    285  1.1  riastrad 	0x88d0, 0xffffffff, 0x0f40df40,
    286  1.1  riastrad 	0x88d4, 0x0000001f, 0x00000010,
    287  1.1  riastrad 	0x8974, 0xffffffff, 0x00000000
    288  1.1  riastrad };
    289  1.1  riastrad 
    290  1.1  riastrad static const u32 dvst_golden_registers2[] =
    291  1.1  riastrad {
    292  1.1  riastrad 	0x8f8, 0xffffffff, 0,
    293  1.1  riastrad 	0x8fc, 0x00380000, 0,
    294  1.1  riastrad 	0x8f8, 0xffffffff, 1,
    295  1.1  riastrad 	0x8fc, 0x0e000000, 0
    296  1.1  riastrad };
    297  1.1  riastrad 
    298  1.1  riastrad static const u32 dvst_golden_registers[] =
    299  1.1  riastrad {
    300  1.1  riastrad 	0x690, 0x3fff3fff, 0x20c00033,
    301  1.1  riastrad 	0x918c, 0x0fff0fff, 0x00010006,
    302  1.1  riastrad 	0x91a8, 0x0fff0fff, 0x00010006,
    303  1.1  riastrad 	0x9150, 0xffffdfff, 0x6e944040,
    304  1.1  riastrad 	0x917c, 0x0fff0fff, 0x00030002,
    305  1.1  riastrad 	0x9198, 0x0fff0fff, 0x00030002,
    306  1.1  riastrad 	0x915c, 0x0fff0fff, 0x00010000,
    307  1.1  riastrad 	0x3f90, 0xffff0001, 0xff000000,
    308  1.1  riastrad 	0x9178, 0x0fff0fff, 0x00070000,
    309  1.1  riastrad 	0x9194, 0x0fff0fff, 0x00070000,
    310  1.1  riastrad 	0x9148, 0xffff0001, 0xff000000,
    311  1.1  riastrad 	0x9190, 0x0fff0fff, 0x00090008,
    312  1.1  riastrad 	0x91ac, 0x0fff0fff, 0x00090008,
    313  1.1  riastrad 	0x3f94, 0xffff0000, 0xff000000,
    314  1.1  riastrad 	0x914c, 0xffff0000, 0xff000000,
    315  1.1  riastrad 	0x929c, 0x00000fff, 0x00000001,
    316  1.1  riastrad 	0x55e4, 0xff607fff, 0xfc000100,
    317  1.1  riastrad 	0x8a18, 0xff000fff, 0x00000100,
    318  1.1  riastrad 	0x8b28, 0xff000fff, 0x00000100,
    319  1.1  riastrad 	0x9144, 0xfffc0fff, 0x00000100,
    320  1.1  riastrad 	0x6ed8, 0x00010101, 0x00010000,
    321  1.1  riastrad 	0x9830, 0xffffffff, 0x00000000,
    322  1.1  riastrad 	0x9834, 0xf00fffff, 0x00000400,
    323  1.1  riastrad 	0x9838, 0xfffffffe, 0x00000000,
    324  1.1  riastrad 	0xd0c0, 0xff000fff, 0x00000100,
    325  1.1  riastrad 	0xd02c, 0xbfffff1f, 0x08421000,
    326  1.1  riastrad 	0xd0b8, 0x73773777, 0x12010001,
    327  1.1  riastrad 	0x5bb0, 0x000000f0, 0x00000070,
    328  1.1  riastrad 	0x98f8, 0x73773777, 0x12010001,
    329  1.1  riastrad 	0x98fc, 0xffffffff, 0x00000010,
    330  1.1  riastrad 	0x9b7c, 0x00ff0000, 0x00fc0000,
    331  1.1  riastrad 	0x8030, 0x00001f0f, 0x0000100a,
    332  1.1  riastrad 	0x2f48, 0x73773777, 0x12010001,
    333  1.1  riastrad 	0x2408, 0x00030000, 0x000c007f,
    334  1.1  riastrad 	0x8a14, 0xf000003f, 0x00000007,
    335  1.1  riastrad 	0x8b24, 0x3fff3fff, 0x00ff0fff,
    336  1.1  riastrad 	0x8b10, 0x0000ff0f, 0x00000000,
    337  1.1  riastrad 	0x28a4c, 0x07ffffff, 0x06000000,
    338  1.1  riastrad 	0x4d8, 0x00000fff, 0x00000100,
    339  1.1  riastrad 	0xa008, 0xffffffff, 0x00010000,
    340  1.1  riastrad 	0x913c, 0xffff03ff, 0x01000100,
    341  1.1  riastrad 	0x8c00, 0x000000ff, 0x00000003,
    342  1.1  riastrad 	0x8c04, 0xf8ff00ff, 0x40600060,
    343  1.1  riastrad 	0x8cf0, 0x1fff1fff, 0x08e00410,
    344  1.1  riastrad 	0x28350, 0x00000f01, 0x00000000,
    345  1.1  riastrad 	0x9508, 0xf700071f, 0x00000002,
    346  1.1  riastrad 	0x960c, 0xffffffff, 0x54763210,
    347  1.1  riastrad 	0x20ef8, 0x01ff01ff, 0x00000002,
    348  1.1  riastrad 	0x20e98, 0xfffffbff, 0x00200000,
    349  1.1  riastrad 	0x2015c, 0xffffffff, 0x00000f40,
    350  1.1  riastrad 	0x88c4, 0x001f3ae3, 0x00000082,
    351  1.1  riastrad 	0x8978, 0x3fffffff, 0x04050140,
    352  1.1  riastrad 	0x88d4, 0x0000001f, 0x00000010,
    353  1.1  riastrad 	0x8974, 0xffffffff, 0x00000000
    354  1.1  riastrad };
    355  1.1  riastrad 
    356  1.1  riastrad static const u32 scrapper_golden_registers[] =
    357  1.1  riastrad {
    358  1.1  riastrad 	0x690, 0x3fff3fff, 0x20c00033,
    359  1.1  riastrad 	0x918c, 0x0fff0fff, 0x00010006,
    360  1.1  riastrad 	0x918c, 0x0fff0fff, 0x00010006,
    361  1.1  riastrad 	0x91a8, 0x0fff0fff, 0x00010006,
    362  1.1  riastrad 	0x91a8, 0x0fff0fff, 0x00010006,
    363  1.1  riastrad 	0x9150, 0xffffdfff, 0x6e944040,
    364  1.1  riastrad 	0x9150, 0xffffdfff, 0x6e944040,
    365  1.1  riastrad 	0x917c, 0x0fff0fff, 0x00030002,
    366  1.1  riastrad 	0x917c, 0x0fff0fff, 0x00030002,
    367  1.1  riastrad 	0x9198, 0x0fff0fff, 0x00030002,
    368  1.1  riastrad 	0x9198, 0x0fff0fff, 0x00030002,
    369  1.1  riastrad 	0x915c, 0x0fff0fff, 0x00010000,
    370  1.1  riastrad 	0x915c, 0x0fff0fff, 0x00010000,
    371  1.1  riastrad 	0x3f90, 0xffff0001, 0xff000000,
    372  1.1  riastrad 	0x3f90, 0xffff0001, 0xff000000,
    373  1.1  riastrad 	0x9178, 0x0fff0fff, 0x00070000,
    374  1.1  riastrad 	0x9178, 0x0fff0fff, 0x00070000,
    375  1.1  riastrad 	0x9194, 0x0fff0fff, 0x00070000,
    376  1.1  riastrad 	0x9194, 0x0fff0fff, 0x00070000,
    377  1.1  riastrad 	0x9148, 0xffff0001, 0xff000000,
    378  1.1  riastrad 	0x9148, 0xffff0001, 0xff000000,
    379  1.1  riastrad 	0x9190, 0x0fff0fff, 0x00090008,
    380  1.1  riastrad 	0x9190, 0x0fff0fff, 0x00090008,
    381  1.1  riastrad 	0x91ac, 0x0fff0fff, 0x00090008,
    382  1.1  riastrad 	0x91ac, 0x0fff0fff, 0x00090008,
    383  1.1  riastrad 	0x3f94, 0xffff0000, 0xff000000,
    384  1.1  riastrad 	0x3f94, 0xffff0000, 0xff000000,
    385  1.1  riastrad 	0x914c, 0xffff0000, 0xff000000,
    386  1.1  riastrad 	0x914c, 0xffff0000, 0xff000000,
    387  1.1  riastrad 	0x929c, 0x00000fff, 0x00000001,
    388  1.1  riastrad 	0x929c, 0x00000fff, 0x00000001,
    389  1.1  riastrad 	0x55e4, 0xff607fff, 0xfc000100,
    390  1.1  riastrad 	0x8a18, 0xff000fff, 0x00000100,
    391  1.1  riastrad 	0x8a18, 0xff000fff, 0x00000100,
    392  1.1  riastrad 	0x8b28, 0xff000fff, 0x00000100,
    393  1.1  riastrad 	0x8b28, 0xff000fff, 0x00000100,
    394  1.1  riastrad 	0x9144, 0xfffc0fff, 0x00000100,
    395  1.1  riastrad 	0x9144, 0xfffc0fff, 0x00000100,
    396  1.1  riastrad 	0x6ed8, 0x00010101, 0x00010000,
    397  1.1  riastrad 	0x9830, 0xffffffff, 0x00000000,
    398  1.1  riastrad 	0x9830, 0xffffffff, 0x00000000,
    399  1.1  riastrad 	0x9834, 0xf00fffff, 0x00000400,
    400  1.1  riastrad 	0x9834, 0xf00fffff, 0x00000400,
    401  1.1  riastrad 	0x9838, 0xfffffffe, 0x00000000,
    402  1.1  riastrad 	0x9838, 0xfffffffe, 0x00000000,
    403  1.1  riastrad 	0xd0c0, 0xff000fff, 0x00000100,
    404  1.1  riastrad 	0xd02c, 0xbfffff1f, 0x08421000,
    405  1.1  riastrad 	0xd02c, 0xbfffff1f, 0x08421000,
    406  1.1  riastrad 	0xd0b8, 0x73773777, 0x12010001,
    407  1.1  riastrad 	0xd0b8, 0x73773777, 0x12010001,
    408  1.1  riastrad 	0x5bb0, 0x000000f0, 0x00000070,
    409  1.1  riastrad 	0x98f8, 0x73773777, 0x12010001,
    410  1.1  riastrad 	0x98f8, 0x73773777, 0x12010001,
    411  1.1  riastrad 	0x98fc, 0xffffffff, 0x00000010,
    412  1.1  riastrad 	0x98fc, 0xffffffff, 0x00000010,
    413  1.1  riastrad 	0x9b7c, 0x00ff0000, 0x00fc0000,
    414  1.1  riastrad 	0x9b7c, 0x00ff0000, 0x00fc0000,
    415  1.1  riastrad 	0x8030, 0x00001f0f, 0x0000100a,
    416  1.1  riastrad 	0x8030, 0x00001f0f, 0x0000100a,
    417  1.1  riastrad 	0x2f48, 0x73773777, 0x12010001,
    418  1.1  riastrad 	0x2f48, 0x73773777, 0x12010001,
    419  1.1  riastrad 	0x2408, 0x00030000, 0x000c007f,
    420  1.1  riastrad 	0x8a14, 0xf000003f, 0x00000007,
    421  1.1  riastrad 	0x8a14, 0xf000003f, 0x00000007,
    422  1.1  riastrad 	0x8b24, 0x3fff3fff, 0x00ff0fff,
    423  1.1  riastrad 	0x8b24, 0x3fff3fff, 0x00ff0fff,
    424  1.1  riastrad 	0x8b10, 0x0000ff0f, 0x00000000,
    425  1.1  riastrad 	0x8b10, 0x0000ff0f, 0x00000000,
    426  1.1  riastrad 	0x28a4c, 0x07ffffff, 0x06000000,
    427  1.1  riastrad 	0x28a4c, 0x07ffffff, 0x06000000,
    428  1.1  riastrad 	0x4d8, 0x00000fff, 0x00000100,
    429  1.1  riastrad 	0x4d8, 0x00000fff, 0x00000100,
    430  1.1  riastrad 	0xa008, 0xffffffff, 0x00010000,
    431  1.1  riastrad 	0xa008, 0xffffffff, 0x00010000,
    432  1.1  riastrad 	0x913c, 0xffff03ff, 0x01000100,
    433  1.1  riastrad 	0x913c, 0xffff03ff, 0x01000100,
    434  1.1  riastrad 	0x90e8, 0x001fffff, 0x010400c0,
    435  1.1  riastrad 	0x8c00, 0x000000ff, 0x00000003,
    436  1.1  riastrad 	0x8c00, 0x000000ff, 0x00000003,
    437  1.1  riastrad 	0x8c04, 0xf8ff00ff, 0x40600060,
    438  1.1  riastrad 	0x8c04, 0xf8ff00ff, 0x40600060,
    439  1.1  riastrad 	0x8c30, 0x0000000f, 0x00040005,
    440  1.1  riastrad 	0x8cf0, 0x1fff1fff, 0x08e00410,
    441  1.1  riastrad 	0x8cf0, 0x1fff1fff, 0x08e00410,
    442  1.1  riastrad 	0x900c, 0x00ffffff, 0x0017071f,
    443  1.1  riastrad 	0x28350, 0x00000f01, 0x00000000,
    444  1.1  riastrad 	0x28350, 0x00000f01, 0x00000000,
    445  1.1  riastrad 	0x9508, 0xf700071f, 0x00000002,
    446  1.1  riastrad 	0x9508, 0xf700071f, 0x00000002,
    447  1.1  riastrad 	0x9688, 0x00300000, 0x0017000f,
    448  1.1  riastrad 	0x960c, 0xffffffff, 0x54763210,
    449  1.1  riastrad 	0x960c, 0xffffffff, 0x54763210,
    450  1.1  riastrad 	0x20ef8, 0x01ff01ff, 0x00000002,
    451  1.1  riastrad 	0x20e98, 0xfffffbff, 0x00200000,
    452  1.1  riastrad 	0x2015c, 0xffffffff, 0x00000f40,
    453  1.1  riastrad 	0x88c4, 0x001f3ae3, 0x00000082,
    454  1.1  riastrad 	0x88c4, 0x001f3ae3, 0x00000082,
    455  1.1  riastrad 	0x8978, 0x3fffffff, 0x04050140,
    456  1.1  riastrad 	0x8978, 0x3fffffff, 0x04050140,
    457  1.1  riastrad 	0x88d4, 0x0000001f, 0x00000010,
    458  1.1  riastrad 	0x88d4, 0x0000001f, 0x00000010,
    459  1.1  riastrad 	0x8974, 0xffffffff, 0x00000000,
    460  1.1  riastrad 	0x8974, 0xffffffff, 0x00000000
    461  1.1  riastrad };
    462  1.1  riastrad 
    463  1.1  riastrad static void ni_init_golden_registers(struct radeon_device *rdev)
    464  1.1  riastrad {
    465  1.1  riastrad 	switch (rdev->family) {
    466  1.1  riastrad 	case CHIP_CAYMAN:
    467  1.1  riastrad 		radeon_program_register_sequence(rdev,
    468  1.1  riastrad 						 cayman_golden_registers,
    469  1.1  riastrad 						 (const u32)ARRAY_SIZE(cayman_golden_registers));
    470  1.1  riastrad 		radeon_program_register_sequence(rdev,
    471  1.1  riastrad 						 cayman_golden_registers2,
    472  1.1  riastrad 						 (const u32)ARRAY_SIZE(cayman_golden_registers2));
    473  1.1  riastrad 		break;
    474  1.1  riastrad 	case CHIP_ARUBA:
    475  1.1  riastrad 		if ((rdev->pdev->device == 0x9900) ||
    476  1.1  riastrad 		    (rdev->pdev->device == 0x9901) ||
    477  1.1  riastrad 		    (rdev->pdev->device == 0x9903) ||
    478  1.1  riastrad 		    (rdev->pdev->device == 0x9904) ||
    479  1.1  riastrad 		    (rdev->pdev->device == 0x9905) ||
    480  1.1  riastrad 		    (rdev->pdev->device == 0x9906) ||
    481  1.1  riastrad 		    (rdev->pdev->device == 0x9907) ||
    482  1.1  riastrad 		    (rdev->pdev->device == 0x9908) ||
    483  1.1  riastrad 		    (rdev->pdev->device == 0x9909) ||
    484  1.1  riastrad 		    (rdev->pdev->device == 0x990A) ||
    485  1.1  riastrad 		    (rdev->pdev->device == 0x990B) ||
    486  1.1  riastrad 		    (rdev->pdev->device == 0x990C) ||
    487  1.1  riastrad 		    (rdev->pdev->device == 0x990D) ||
    488  1.1  riastrad 		    (rdev->pdev->device == 0x990E) ||
    489  1.1  riastrad 		    (rdev->pdev->device == 0x990F) ||
    490  1.1  riastrad 		    (rdev->pdev->device == 0x9910) ||
    491  1.1  riastrad 		    (rdev->pdev->device == 0x9913) ||
    492  1.1  riastrad 		    (rdev->pdev->device == 0x9917) ||
    493  1.1  riastrad 		    (rdev->pdev->device == 0x9918)) {
    494  1.1  riastrad 			radeon_program_register_sequence(rdev,
    495  1.1  riastrad 							 dvst_golden_registers,
    496  1.1  riastrad 							 (const u32)ARRAY_SIZE(dvst_golden_registers));
    497  1.1  riastrad 			radeon_program_register_sequence(rdev,
    498  1.1  riastrad 							 dvst_golden_registers2,
    499  1.1  riastrad 							 (const u32)ARRAY_SIZE(dvst_golden_registers2));
    500  1.1  riastrad 		} else {
    501  1.1  riastrad 			radeon_program_register_sequence(rdev,
    502  1.1  riastrad 							 scrapper_golden_registers,
    503  1.1  riastrad 							 (const u32)ARRAY_SIZE(scrapper_golden_registers));
    504  1.1  riastrad 			radeon_program_register_sequence(rdev,
    505  1.1  riastrad 							 dvst_golden_registers2,
    506  1.1  riastrad 							 (const u32)ARRAY_SIZE(dvst_golden_registers2));
    507  1.1  riastrad 		}
    508  1.1  riastrad 		break;
    509  1.1  riastrad 	default:
    510  1.1  riastrad 		break;
    511  1.1  riastrad 	}
    512  1.1  riastrad }
    513  1.1  riastrad 
    514  1.1  riastrad #define BTC_IO_MC_REGS_SIZE 29
    515  1.1  riastrad 
    516  1.1  riastrad static const u32 barts_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
    517  1.1  riastrad 	{0x00000077, 0xff010100},
    518  1.1  riastrad 	{0x00000078, 0x00000000},
    519  1.1  riastrad 	{0x00000079, 0x00001434},
    520  1.1  riastrad 	{0x0000007a, 0xcc08ec08},
    521  1.1  riastrad 	{0x0000007b, 0x00040000},
    522  1.1  riastrad 	{0x0000007c, 0x000080c0},
    523  1.1  riastrad 	{0x0000007d, 0x09000000},
    524  1.1  riastrad 	{0x0000007e, 0x00210404},
    525  1.1  riastrad 	{0x00000081, 0x08a8e800},
    526  1.1  riastrad 	{0x00000082, 0x00030444},
    527  1.1  riastrad 	{0x00000083, 0x00000000},
    528  1.1  riastrad 	{0x00000085, 0x00000001},
    529  1.1  riastrad 	{0x00000086, 0x00000002},
    530  1.1  riastrad 	{0x00000087, 0x48490000},
    531  1.1  riastrad 	{0x00000088, 0x20244647},
    532  1.1  riastrad 	{0x00000089, 0x00000005},
    533  1.1  riastrad 	{0x0000008b, 0x66030000},
    534  1.1  riastrad 	{0x0000008c, 0x00006603},
    535  1.1  riastrad 	{0x0000008d, 0x00000100},
    536  1.1  riastrad 	{0x0000008f, 0x00001c0a},
    537  1.1  riastrad 	{0x00000090, 0xff000001},
    538  1.1  riastrad 	{0x00000094, 0x00101101},
    539  1.1  riastrad 	{0x00000095, 0x00000fff},
    540  1.1  riastrad 	{0x00000096, 0x00116fff},
    541  1.1  riastrad 	{0x00000097, 0x60010000},
    542  1.1  riastrad 	{0x00000098, 0x10010000},
    543  1.1  riastrad 	{0x00000099, 0x00006000},
    544  1.1  riastrad 	{0x0000009a, 0x00001000},
    545  1.1  riastrad 	{0x0000009f, 0x00946a00}
    546  1.1  riastrad };
    547  1.1  riastrad 
    548  1.1  riastrad static const u32 turks_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
    549  1.1  riastrad 	{0x00000077, 0xff010100},
    550  1.1  riastrad 	{0x00000078, 0x00000000},
    551  1.1  riastrad 	{0x00000079, 0x00001434},
    552  1.1  riastrad 	{0x0000007a, 0xcc08ec08},
    553  1.1  riastrad 	{0x0000007b, 0x00040000},
    554  1.1  riastrad 	{0x0000007c, 0x000080c0},
    555  1.1  riastrad 	{0x0000007d, 0x09000000},
    556  1.1  riastrad 	{0x0000007e, 0x00210404},
    557  1.1  riastrad 	{0x00000081, 0x08a8e800},
    558  1.1  riastrad 	{0x00000082, 0x00030444},
    559  1.1  riastrad 	{0x00000083, 0x00000000},
    560  1.1  riastrad 	{0x00000085, 0x00000001},
    561  1.1  riastrad 	{0x00000086, 0x00000002},
    562  1.1  riastrad 	{0x00000087, 0x48490000},
    563  1.1  riastrad 	{0x00000088, 0x20244647},
    564  1.1  riastrad 	{0x00000089, 0x00000005},
    565  1.1  riastrad 	{0x0000008b, 0x66030000},
    566  1.1  riastrad 	{0x0000008c, 0x00006603},
    567  1.1  riastrad 	{0x0000008d, 0x00000100},
    568  1.1  riastrad 	{0x0000008f, 0x00001c0a},
    569  1.1  riastrad 	{0x00000090, 0xff000001},
    570  1.1  riastrad 	{0x00000094, 0x00101101},
    571  1.1  riastrad 	{0x00000095, 0x00000fff},
    572  1.1  riastrad 	{0x00000096, 0x00116fff},
    573  1.1  riastrad 	{0x00000097, 0x60010000},
    574  1.1  riastrad 	{0x00000098, 0x10010000},
    575  1.1  riastrad 	{0x00000099, 0x00006000},
    576  1.1  riastrad 	{0x0000009a, 0x00001000},
    577  1.1  riastrad 	{0x0000009f, 0x00936a00}
    578  1.1  riastrad };
    579  1.1  riastrad 
    580  1.1  riastrad static const u32 caicos_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
    581  1.1  riastrad 	{0x00000077, 0xff010100},
    582  1.1  riastrad 	{0x00000078, 0x00000000},
    583  1.1  riastrad 	{0x00000079, 0x00001434},
    584  1.1  riastrad 	{0x0000007a, 0xcc08ec08},
    585  1.1  riastrad 	{0x0000007b, 0x00040000},
    586  1.1  riastrad 	{0x0000007c, 0x000080c0},
    587  1.1  riastrad 	{0x0000007d, 0x09000000},
    588  1.1  riastrad 	{0x0000007e, 0x00210404},
    589  1.1  riastrad 	{0x00000081, 0x08a8e800},
    590  1.1  riastrad 	{0x00000082, 0x00030444},
    591  1.1  riastrad 	{0x00000083, 0x00000000},
    592  1.1  riastrad 	{0x00000085, 0x00000001},
    593  1.1  riastrad 	{0x00000086, 0x00000002},
    594  1.1  riastrad 	{0x00000087, 0x48490000},
    595  1.1  riastrad 	{0x00000088, 0x20244647},
    596  1.1  riastrad 	{0x00000089, 0x00000005},
    597  1.1  riastrad 	{0x0000008b, 0x66030000},
    598  1.1  riastrad 	{0x0000008c, 0x00006603},
    599  1.1  riastrad 	{0x0000008d, 0x00000100},
    600  1.1  riastrad 	{0x0000008f, 0x00001c0a},
    601  1.1  riastrad 	{0x00000090, 0xff000001},
    602  1.1  riastrad 	{0x00000094, 0x00101101},
    603  1.1  riastrad 	{0x00000095, 0x00000fff},
    604  1.1  riastrad 	{0x00000096, 0x00116fff},
    605  1.1  riastrad 	{0x00000097, 0x60010000},
    606  1.1  riastrad 	{0x00000098, 0x10010000},
    607  1.1  riastrad 	{0x00000099, 0x00006000},
    608  1.1  riastrad 	{0x0000009a, 0x00001000},
    609  1.1  riastrad 	{0x0000009f, 0x00916a00}
    610  1.1  riastrad };
    611  1.1  riastrad 
    612  1.1  riastrad static const u32 cayman_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
    613  1.1  riastrad 	{0x00000077, 0xff010100},
    614  1.1  riastrad 	{0x00000078, 0x00000000},
    615  1.1  riastrad 	{0x00000079, 0x00001434},
    616  1.1  riastrad 	{0x0000007a, 0xcc08ec08},
    617  1.1  riastrad 	{0x0000007b, 0x00040000},
    618  1.1  riastrad 	{0x0000007c, 0x000080c0},
    619  1.1  riastrad 	{0x0000007d, 0x09000000},
    620  1.1  riastrad 	{0x0000007e, 0x00210404},
    621  1.1  riastrad 	{0x00000081, 0x08a8e800},
    622  1.1  riastrad 	{0x00000082, 0x00030444},
    623  1.1  riastrad 	{0x00000083, 0x00000000},
    624  1.1  riastrad 	{0x00000085, 0x00000001},
    625  1.1  riastrad 	{0x00000086, 0x00000002},
    626  1.1  riastrad 	{0x00000087, 0x48490000},
    627  1.1  riastrad 	{0x00000088, 0x20244647},
    628  1.1  riastrad 	{0x00000089, 0x00000005},
    629  1.1  riastrad 	{0x0000008b, 0x66030000},
    630  1.1  riastrad 	{0x0000008c, 0x00006603},
    631  1.1  riastrad 	{0x0000008d, 0x00000100},
    632  1.1  riastrad 	{0x0000008f, 0x00001c0a},
    633  1.1  riastrad 	{0x00000090, 0xff000001},
    634  1.1  riastrad 	{0x00000094, 0x00101101},
    635  1.1  riastrad 	{0x00000095, 0x00000fff},
    636  1.1  riastrad 	{0x00000096, 0x00116fff},
    637  1.1  riastrad 	{0x00000097, 0x60010000},
    638  1.1  riastrad 	{0x00000098, 0x10010000},
    639  1.1  riastrad 	{0x00000099, 0x00006000},
    640  1.1  riastrad 	{0x0000009a, 0x00001000},
    641  1.1  riastrad 	{0x0000009f, 0x00976b00}
    642  1.1  riastrad };
    643  1.1  riastrad 
    644  1.1  riastrad int ni_mc_load_microcode(struct radeon_device *rdev)
    645  1.1  riastrad {
    646  1.1  riastrad 	const __be32 *fw_data;
    647  1.1  riastrad 	u32 mem_type, running, blackout = 0;
    648  1.1  riastrad 	const u32 *io_mc_regs;
    649  1.1  riastrad 	int i, ucode_size, regs_size;
    650  1.1  riastrad 
    651  1.1  riastrad 	if (!rdev->mc_fw)
    652  1.1  riastrad 		return -EINVAL;
    653  1.1  riastrad 
    654  1.1  riastrad 	switch (rdev->family) {
    655  1.1  riastrad 	case CHIP_BARTS:
    656  1.1  riastrad 		io_mc_regs = &barts_io_mc_regs[0][0];
    657  1.1  riastrad 		ucode_size = BTC_MC_UCODE_SIZE;
    658  1.1  riastrad 		regs_size = BTC_IO_MC_REGS_SIZE;
    659  1.1  riastrad 		break;
    660  1.1  riastrad 	case CHIP_TURKS:
    661  1.1  riastrad 		io_mc_regs = &turks_io_mc_regs[0][0];
    662  1.1  riastrad 		ucode_size = BTC_MC_UCODE_SIZE;
    663  1.1  riastrad 		regs_size = BTC_IO_MC_REGS_SIZE;
    664  1.1  riastrad 		break;
    665  1.1  riastrad 	case CHIP_CAICOS:
    666  1.1  riastrad 	default:
    667  1.1  riastrad 		io_mc_regs = &caicos_io_mc_regs[0][0];
    668  1.1  riastrad 		ucode_size = BTC_MC_UCODE_SIZE;
    669  1.1  riastrad 		regs_size = BTC_IO_MC_REGS_SIZE;
    670  1.1  riastrad 		break;
    671  1.1  riastrad 	case CHIP_CAYMAN:
    672  1.1  riastrad 		io_mc_regs = &cayman_io_mc_regs[0][0];
    673  1.1  riastrad 		ucode_size = CAYMAN_MC_UCODE_SIZE;
    674  1.1  riastrad 		regs_size = BTC_IO_MC_REGS_SIZE;
    675  1.1  riastrad 		break;
    676  1.1  riastrad 	}
    677  1.1  riastrad 
    678  1.1  riastrad 	mem_type = (RREG32(MC_SEQ_MISC0) & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT;
    679  1.1  riastrad 	running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
    680  1.1  riastrad 
    681  1.1  riastrad 	if ((mem_type == MC_SEQ_MISC0_GDDR5_VALUE) && (running == 0)) {
    682  1.1  riastrad 		if (running) {
    683  1.1  riastrad 			blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
    684  1.1  riastrad 			WREG32(MC_SHARED_BLACKOUT_CNTL, 1);
    685  1.1  riastrad 		}
    686  1.1  riastrad 
    687  1.1  riastrad 		/* reset the engine and set to writable */
    688  1.1  riastrad 		WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
    689  1.1  riastrad 		WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
    690  1.1  riastrad 
    691  1.1  riastrad 		/* load mc io regs */
    692  1.1  riastrad 		for (i = 0; i < regs_size; i++) {
    693  1.1  riastrad 			WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
    694  1.1  riastrad 			WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
    695  1.1  riastrad 		}
    696  1.1  riastrad 		/* load the MC ucode */
    697  1.1  riastrad 		fw_data = (const __be32 *)rdev->mc_fw->data;
    698  1.1  riastrad 		for (i = 0; i < ucode_size; i++)
    699  1.1  riastrad 			WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
    700  1.1  riastrad 
    701  1.1  riastrad 		/* put the engine back into the active state */
    702  1.1  riastrad 		WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
    703  1.1  riastrad 		WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
    704  1.1  riastrad 		WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
    705  1.1  riastrad 
    706  1.1  riastrad 		/* wait for training to complete */
    707  1.1  riastrad 		for (i = 0; i < rdev->usec_timeout; i++) {
    708  1.1  riastrad 			if (RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD)
    709  1.1  riastrad 				break;
    710  1.1  riastrad 			udelay(1);
    711  1.1  riastrad 		}
    712  1.1  riastrad 
    713  1.1  riastrad 		if (running)
    714  1.1  riastrad 			WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
    715  1.1  riastrad 	}
    716  1.1  riastrad 
    717  1.1  riastrad 	return 0;
    718  1.1  riastrad }
    719  1.1  riastrad 
    720  1.1  riastrad int ni_init_microcode(struct radeon_device *rdev)
    721  1.1  riastrad {
    722  1.1  riastrad 	const char *chip_name;
    723  1.1  riastrad 	const char *rlc_chip_name;
    724  1.1  riastrad 	size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size;
    725  1.1  riastrad 	size_t smc_req_size = 0;
    726  1.1  riastrad 	char fw_name[30];
    727  1.1  riastrad 	int err;
    728  1.1  riastrad 
    729  1.1  riastrad 	DRM_DEBUG("\n");
    730  1.1  riastrad 
    731  1.1  riastrad 	switch (rdev->family) {
    732  1.1  riastrad 	case CHIP_BARTS:
    733  1.1  riastrad 		chip_name = "BARTS";
    734  1.1  riastrad 		rlc_chip_name = "BTC";
    735  1.1  riastrad 		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
    736  1.1  riastrad 		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
    737  1.1  riastrad 		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
    738  1.1  riastrad 		mc_req_size = BTC_MC_UCODE_SIZE * 4;
    739  1.1  riastrad 		smc_req_size = ALIGN(BARTS_SMC_UCODE_SIZE, 4);
    740  1.1  riastrad 		break;
    741  1.1  riastrad 	case CHIP_TURKS:
    742  1.1  riastrad 		chip_name = "TURKS";
    743  1.1  riastrad 		rlc_chip_name = "BTC";
    744  1.1  riastrad 		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
    745  1.1  riastrad 		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
    746  1.1  riastrad 		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
    747  1.1  riastrad 		mc_req_size = BTC_MC_UCODE_SIZE * 4;
    748  1.1  riastrad 		smc_req_size = ALIGN(TURKS_SMC_UCODE_SIZE, 4);
    749  1.1  riastrad 		break;
    750  1.1  riastrad 	case CHIP_CAICOS:
    751  1.1  riastrad 		chip_name = "CAICOS";
    752  1.1  riastrad 		rlc_chip_name = "BTC";
    753  1.1  riastrad 		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
    754  1.1  riastrad 		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
    755  1.1  riastrad 		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
    756  1.1  riastrad 		mc_req_size = BTC_MC_UCODE_SIZE * 4;
    757  1.1  riastrad 		smc_req_size = ALIGN(CAICOS_SMC_UCODE_SIZE, 4);
    758  1.1  riastrad 		break;
    759  1.1  riastrad 	case CHIP_CAYMAN:
    760  1.1  riastrad 		chip_name = "CAYMAN";
    761  1.1  riastrad 		rlc_chip_name = "CAYMAN";
    762  1.1  riastrad 		pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
    763  1.1  riastrad 		me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
    764  1.1  riastrad 		rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4;
    765  1.1  riastrad 		mc_req_size = CAYMAN_MC_UCODE_SIZE * 4;
    766  1.1  riastrad 		smc_req_size = ALIGN(CAYMAN_SMC_UCODE_SIZE, 4);
    767  1.1  riastrad 		break;
    768  1.1  riastrad 	case CHIP_ARUBA:
    769  1.1  riastrad 		chip_name = "ARUBA";
    770  1.1  riastrad 		rlc_chip_name = "ARUBA";
    771  1.1  riastrad 		/* pfp/me same size as CAYMAN */
    772  1.1  riastrad 		pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
    773  1.1  riastrad 		me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
    774  1.1  riastrad 		rlc_req_size = ARUBA_RLC_UCODE_SIZE * 4;
    775  1.1  riastrad 		mc_req_size = 0;
    776  1.1  riastrad 		break;
    777  1.1  riastrad 	default: BUG();
    778  1.1  riastrad 	}
    779  1.1  riastrad 
    780  1.1  riastrad 	DRM_INFO("Loading %s Microcode\n", chip_name);
    781  1.1  riastrad 
    782  1.1  riastrad 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
    783  1.1  riastrad 	err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
    784  1.1  riastrad 	if (err)
    785  1.1  riastrad 		goto out;
    786  1.1  riastrad 	if (rdev->pfp_fw->size != pfp_req_size) {
    787  1.3  riastrad 		pr_err("ni_cp: Bogus length %zu in firmware \"%s\"\n",
    788  1.1  riastrad 		       rdev->pfp_fw->size, fw_name);
    789  1.1  riastrad 		err = -EINVAL;
    790  1.1  riastrad 		goto out;
    791  1.1  riastrad 	}
    792  1.1  riastrad 
    793  1.1  riastrad 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
    794  1.1  riastrad 	err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
    795  1.1  riastrad 	if (err)
    796  1.1  riastrad 		goto out;
    797  1.1  riastrad 	if (rdev->me_fw->size != me_req_size) {
    798  1.3  riastrad 		pr_err("ni_cp: Bogus length %zu in firmware \"%s\"\n",
    799  1.1  riastrad 		       rdev->me_fw->size, fw_name);
    800  1.1  riastrad 		err = -EINVAL;
    801  1.1  riastrad 	}
    802  1.1  riastrad 
    803  1.1  riastrad 	snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
    804  1.1  riastrad 	err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
    805  1.1  riastrad 	if (err)
    806  1.1  riastrad 		goto out;
    807  1.1  riastrad 	if (rdev->rlc_fw->size != rlc_req_size) {
    808  1.3  riastrad 		pr_err("ni_rlc: Bogus length %zu in firmware \"%s\"\n",
    809  1.1  riastrad 		       rdev->rlc_fw->size, fw_name);
    810  1.1  riastrad 		err = -EINVAL;
    811  1.1  riastrad 	}
    812  1.1  riastrad 
    813  1.1  riastrad 	/* no MC ucode on TN */
    814  1.1  riastrad 	if (!(rdev->flags & RADEON_IS_IGP)) {
    815  1.1  riastrad 		snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
    816  1.1  riastrad 		err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
    817  1.1  riastrad 		if (err)
    818  1.1  riastrad 			goto out;
    819  1.1  riastrad 		if (rdev->mc_fw->size != mc_req_size) {
    820  1.3  riastrad 			pr_err("ni_mc: Bogus length %zu in firmware \"%s\"\n",
    821  1.1  riastrad 			       rdev->mc_fw->size, fw_name);
    822  1.1  riastrad 			err = -EINVAL;
    823  1.1  riastrad 		}
    824  1.1  riastrad 	}
    825  1.1  riastrad 
    826  1.1  riastrad 	if ((rdev->family >= CHIP_BARTS) && (rdev->family <= CHIP_CAYMAN)) {
    827  1.1  riastrad 		snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
    828  1.1  riastrad 		err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
    829  1.1  riastrad 		if (err) {
    830  1.3  riastrad 			pr_err("smc: error loading firmware \"%s\"\n", fw_name);
    831  1.1  riastrad 			release_firmware(rdev->smc_fw);
    832  1.1  riastrad 			rdev->smc_fw = NULL;
    833  1.1  riastrad 			err = 0;
    834  1.1  riastrad 		} else if (rdev->smc_fw->size != smc_req_size) {
    835  1.3  riastrad 			pr_err("ni_mc: Bogus length %zu in firmware \"%s\"\n",
    836  1.1  riastrad 			       rdev->mc_fw->size, fw_name);
    837  1.1  riastrad 			err = -EINVAL;
    838  1.1  riastrad 		}
    839  1.1  riastrad 	}
    840  1.1  riastrad 
    841  1.1  riastrad out:
    842  1.1  riastrad 	if (err) {
    843  1.1  riastrad 		if (err != -EINVAL)
    844  1.3  riastrad 			pr_err("ni_cp: Failed to load firmware \"%s\"\n",
    845  1.1  riastrad 			       fw_name);
    846  1.1  riastrad 		release_firmware(rdev->pfp_fw);
    847  1.1  riastrad 		rdev->pfp_fw = NULL;
    848  1.1  riastrad 		release_firmware(rdev->me_fw);
    849  1.1  riastrad 		rdev->me_fw = NULL;
    850  1.1  riastrad 		release_firmware(rdev->rlc_fw);
    851  1.1  riastrad 		rdev->rlc_fw = NULL;
    852  1.1  riastrad 		release_firmware(rdev->mc_fw);
    853  1.1  riastrad 		rdev->mc_fw = NULL;
    854  1.1  riastrad 	}
    855  1.1  riastrad 	return err;
    856  1.1  riastrad }
    857  1.1  riastrad 
    858  1.1  riastrad /**
    859  1.1  riastrad  * cayman_get_allowed_info_register - fetch the register for the info ioctl
    860  1.1  riastrad  *
    861  1.1  riastrad  * @rdev: radeon_device pointer
    862  1.1  riastrad  * @reg: register offset in bytes
    863  1.1  riastrad  * @val: register value
    864  1.1  riastrad  *
    865  1.1  riastrad  * Returns 0 for success or -EINVAL for an invalid register
    866  1.1  riastrad  *
    867  1.1  riastrad  */
    868  1.1  riastrad int cayman_get_allowed_info_register(struct radeon_device *rdev,
    869  1.1  riastrad 				     u32 reg, u32 *val)
    870  1.1  riastrad {
    871  1.1  riastrad 	switch (reg) {
    872  1.1  riastrad 	case GRBM_STATUS:
    873  1.1  riastrad 	case GRBM_STATUS_SE0:
    874  1.1  riastrad 	case GRBM_STATUS_SE1:
    875  1.1  riastrad 	case SRBM_STATUS:
    876  1.1  riastrad 	case SRBM_STATUS2:
    877  1.1  riastrad 	case (DMA_STATUS_REG + DMA0_REGISTER_OFFSET):
    878  1.1  riastrad 	case (DMA_STATUS_REG + DMA1_REGISTER_OFFSET):
    879  1.1  riastrad 	case UVD_STATUS:
    880  1.1  riastrad 		*val = RREG32(reg);
    881  1.1  riastrad 		return 0;
    882  1.1  riastrad 	default:
    883  1.1  riastrad 		return -EINVAL;
    884  1.1  riastrad 	}
    885  1.1  riastrad }
    886  1.1  riastrad 
    887  1.1  riastrad int tn_get_temp(struct radeon_device *rdev)
    888  1.1  riastrad {
    889  1.1  riastrad 	u32 temp = RREG32_SMC(TN_CURRENT_GNB_TEMP) & 0x7ff;
    890  1.1  riastrad 	int actual_temp = (temp / 8) - 49;
    891  1.1  riastrad 
    892  1.1  riastrad 	return actual_temp * 1000;
    893  1.1  riastrad }
    894  1.1  riastrad 
    895  1.1  riastrad /*
    896  1.1  riastrad  * Core functions
    897  1.1  riastrad  */
    898  1.1  riastrad static void cayman_gpu_init(struct radeon_device *rdev)
    899  1.1  riastrad {
    900  1.1  riastrad 	u32 gb_addr_config = 0;
    901  1.1  riastrad 	u32 mc_shared_chmap __unused, mc_arb_ramcfg;
    902  1.1  riastrad 	u32 cgts_tcc_disable;
    903  1.1  riastrad 	u32 sx_debug_1;
    904  1.1  riastrad 	u32 smx_dc_ctl0;
    905  1.1  riastrad 	u32 cgts_sm_ctrl_reg;
    906  1.1  riastrad 	u32 hdp_host_path_cntl;
    907  1.1  riastrad 	u32 tmp;
    908  1.1  riastrad 	u32 disabled_rb_mask;
    909  1.1  riastrad 	int i, j;
    910  1.1  riastrad 
    911  1.1  riastrad 	switch (rdev->family) {
    912  1.1  riastrad 	case CHIP_CAYMAN:
    913  1.1  riastrad 		rdev->config.cayman.max_shader_engines = 2;
    914  1.1  riastrad 		rdev->config.cayman.max_pipes_per_simd = 4;
    915  1.1  riastrad 		rdev->config.cayman.max_tile_pipes = 8;
    916  1.1  riastrad 		rdev->config.cayman.max_simds_per_se = 12;
    917  1.1  riastrad 		rdev->config.cayman.max_backends_per_se = 4;
    918  1.1  riastrad 		rdev->config.cayman.max_texture_channel_caches = 8;
    919  1.1  riastrad 		rdev->config.cayman.max_gprs = 256;
    920  1.1  riastrad 		rdev->config.cayman.max_threads = 256;
    921  1.1  riastrad 		rdev->config.cayman.max_gs_threads = 32;
    922  1.1  riastrad 		rdev->config.cayman.max_stack_entries = 512;
    923  1.1  riastrad 		rdev->config.cayman.sx_num_of_sets = 8;
    924  1.1  riastrad 		rdev->config.cayman.sx_max_export_size = 256;
    925  1.1  riastrad 		rdev->config.cayman.sx_max_export_pos_size = 64;
    926  1.1  riastrad 		rdev->config.cayman.sx_max_export_smx_size = 192;
    927  1.1  riastrad 		rdev->config.cayman.max_hw_contexts = 8;
    928  1.1  riastrad 		rdev->config.cayman.sq_num_cf_insts = 2;
    929  1.1  riastrad 
    930  1.1  riastrad 		rdev->config.cayman.sc_prim_fifo_size = 0x100;
    931  1.1  riastrad 		rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
    932  1.1  riastrad 		rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
    933  1.1  riastrad 		gb_addr_config = CAYMAN_GB_ADDR_CONFIG_GOLDEN;
    934  1.1  riastrad 		break;
    935  1.1  riastrad 	case CHIP_ARUBA:
    936  1.1  riastrad 	default:
    937  1.1  riastrad 		rdev->config.cayman.max_shader_engines = 1;
    938  1.1  riastrad 		rdev->config.cayman.max_pipes_per_simd = 4;
    939  1.1  riastrad 		rdev->config.cayman.max_tile_pipes = 2;
    940  1.1  riastrad 		if ((rdev->pdev->device == 0x9900) ||
    941  1.1  riastrad 		    (rdev->pdev->device == 0x9901) ||
    942  1.1  riastrad 		    (rdev->pdev->device == 0x9905) ||
    943  1.1  riastrad 		    (rdev->pdev->device == 0x9906) ||
    944  1.1  riastrad 		    (rdev->pdev->device == 0x9907) ||
    945  1.1  riastrad 		    (rdev->pdev->device == 0x9908) ||
    946  1.1  riastrad 		    (rdev->pdev->device == 0x9909) ||
    947  1.1  riastrad 		    (rdev->pdev->device == 0x990B) ||
    948  1.1  riastrad 		    (rdev->pdev->device == 0x990C) ||
    949  1.1  riastrad 		    (rdev->pdev->device == 0x990F) ||
    950  1.1  riastrad 		    (rdev->pdev->device == 0x9910) ||
    951  1.1  riastrad 		    (rdev->pdev->device == 0x9917) ||
    952  1.1  riastrad 		    (rdev->pdev->device == 0x9999) ||
    953  1.1  riastrad 		    (rdev->pdev->device == 0x999C)) {
    954  1.1  riastrad 			rdev->config.cayman.max_simds_per_se = 6;
    955  1.1  riastrad 			rdev->config.cayman.max_backends_per_se = 2;
    956  1.1  riastrad 			rdev->config.cayman.max_hw_contexts = 8;
    957  1.1  riastrad 			rdev->config.cayman.sx_max_export_size = 256;
    958  1.1  riastrad 			rdev->config.cayman.sx_max_export_pos_size = 64;
    959  1.1  riastrad 			rdev->config.cayman.sx_max_export_smx_size = 192;
    960  1.1  riastrad 		} else if ((rdev->pdev->device == 0x9903) ||
    961  1.1  riastrad 			   (rdev->pdev->device == 0x9904) ||
    962  1.1  riastrad 			   (rdev->pdev->device == 0x990A) ||
    963  1.1  riastrad 			   (rdev->pdev->device == 0x990D) ||
    964  1.1  riastrad 			   (rdev->pdev->device == 0x990E) ||
    965  1.1  riastrad 			   (rdev->pdev->device == 0x9913) ||
    966  1.1  riastrad 			   (rdev->pdev->device == 0x9918) ||
    967  1.1  riastrad 			   (rdev->pdev->device == 0x999D)) {
    968  1.1  riastrad 			rdev->config.cayman.max_simds_per_se = 4;
    969  1.1  riastrad 			rdev->config.cayman.max_backends_per_se = 2;
    970  1.1  riastrad 			rdev->config.cayman.max_hw_contexts = 8;
    971  1.1  riastrad 			rdev->config.cayman.sx_max_export_size = 256;
    972  1.1  riastrad 			rdev->config.cayman.sx_max_export_pos_size = 64;
    973  1.1  riastrad 			rdev->config.cayman.sx_max_export_smx_size = 192;
    974  1.1  riastrad 		} else if ((rdev->pdev->device == 0x9919) ||
    975  1.1  riastrad 			   (rdev->pdev->device == 0x9990) ||
    976  1.1  riastrad 			   (rdev->pdev->device == 0x9991) ||
    977  1.1  riastrad 			   (rdev->pdev->device == 0x9994) ||
    978  1.1  riastrad 			   (rdev->pdev->device == 0x9995) ||
    979  1.1  riastrad 			   (rdev->pdev->device == 0x9996) ||
    980  1.1  riastrad 			   (rdev->pdev->device == 0x999A) ||
    981  1.1  riastrad 			   (rdev->pdev->device == 0x99A0)) {
    982  1.1  riastrad 			rdev->config.cayman.max_simds_per_se = 3;
    983  1.1  riastrad 			rdev->config.cayman.max_backends_per_se = 1;
    984  1.1  riastrad 			rdev->config.cayman.max_hw_contexts = 4;
    985  1.1  riastrad 			rdev->config.cayman.sx_max_export_size = 128;
    986  1.1  riastrad 			rdev->config.cayman.sx_max_export_pos_size = 32;
    987  1.1  riastrad 			rdev->config.cayman.sx_max_export_smx_size = 96;
    988  1.1  riastrad 		} else {
    989  1.1  riastrad 			rdev->config.cayman.max_simds_per_se = 2;
    990  1.1  riastrad 			rdev->config.cayman.max_backends_per_se = 1;
    991  1.1  riastrad 			rdev->config.cayman.max_hw_contexts = 4;
    992  1.1  riastrad 			rdev->config.cayman.sx_max_export_size = 128;
    993  1.1  riastrad 			rdev->config.cayman.sx_max_export_pos_size = 32;
    994  1.1  riastrad 			rdev->config.cayman.sx_max_export_smx_size = 96;
    995  1.1  riastrad 		}
    996  1.1  riastrad 		rdev->config.cayman.max_texture_channel_caches = 2;
    997  1.1  riastrad 		rdev->config.cayman.max_gprs = 256;
    998  1.1  riastrad 		rdev->config.cayman.max_threads = 256;
    999  1.1  riastrad 		rdev->config.cayman.max_gs_threads = 32;
   1000  1.1  riastrad 		rdev->config.cayman.max_stack_entries = 512;
   1001  1.1  riastrad 		rdev->config.cayman.sx_num_of_sets = 8;
   1002  1.1  riastrad 		rdev->config.cayman.sq_num_cf_insts = 2;
   1003  1.1  riastrad 
   1004  1.1  riastrad 		rdev->config.cayman.sc_prim_fifo_size = 0x40;
   1005  1.1  riastrad 		rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
   1006  1.1  riastrad 		rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
   1007  1.1  riastrad 		gb_addr_config = ARUBA_GB_ADDR_CONFIG_GOLDEN;
   1008  1.1  riastrad 		break;
   1009  1.1  riastrad 	}
   1010  1.1  riastrad 
   1011  1.1  riastrad 	/* Initialize HDP */
   1012  1.1  riastrad 	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
   1013  1.1  riastrad 		WREG32((0x2c14 + j), 0x00000000);
   1014  1.1  riastrad 		WREG32((0x2c18 + j), 0x00000000);
   1015  1.1  riastrad 		WREG32((0x2c1c + j), 0x00000000);
   1016  1.1  riastrad 		WREG32((0x2c20 + j), 0x00000000);
   1017  1.1  riastrad 		WREG32((0x2c24 + j), 0x00000000);
   1018  1.1  riastrad 	}
   1019  1.1  riastrad 
   1020  1.1  riastrad 	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
   1021  1.1  riastrad 	WREG32(SRBM_INT_CNTL, 0x1);
   1022  1.1  riastrad 	WREG32(SRBM_INT_ACK, 0x1);
   1023  1.1  riastrad 
   1024  1.1  riastrad 	evergreen_fix_pci_max_read_req_size(rdev);
   1025  1.1  riastrad 
   1026  1.1  riastrad 	mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
   1027  1.1  riastrad 	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
   1028  1.1  riastrad 
   1029  1.1  riastrad 	tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
   1030  1.1  riastrad 	rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
   1031  1.1  riastrad 	if (rdev->config.cayman.mem_row_size_in_kb > 4)
   1032  1.1  riastrad 		rdev->config.cayman.mem_row_size_in_kb = 4;
   1033  1.1  riastrad 	/* XXX use MC settings? */
   1034  1.1  riastrad 	rdev->config.cayman.shader_engine_tile_size = 32;
   1035  1.1  riastrad 	rdev->config.cayman.num_gpus = 1;
   1036  1.1  riastrad 	rdev->config.cayman.multi_gpu_tile_size = 64;
   1037  1.1  riastrad 
   1038  1.1  riastrad 	tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT;
   1039  1.1  riastrad 	rdev->config.cayman.num_tile_pipes = (1 << tmp);
   1040  1.1  riastrad 	tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT;
   1041  1.1  riastrad 	rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
   1042  1.1  riastrad 	tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT;
   1043  1.1  riastrad 	rdev->config.cayman.num_shader_engines = tmp + 1;
   1044  1.1  riastrad 	tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT;
   1045  1.1  riastrad 	rdev->config.cayman.num_gpus = tmp + 1;
   1046  1.1  riastrad 	tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT;
   1047  1.1  riastrad 	rdev->config.cayman.multi_gpu_tile_size = 1 << tmp;
   1048  1.1  riastrad 	tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT;
   1049  1.1  riastrad 	rdev->config.cayman.mem_row_size_in_kb = 1 << tmp;
   1050  1.1  riastrad 
   1051  1.1  riastrad 
   1052  1.1  riastrad 	/* setup tiling info dword.  gb_addr_config is not adequate since it does
   1053  1.1  riastrad 	 * not have bank info, so create a custom tiling dword.
   1054  1.1  riastrad 	 * bits 3:0   num_pipes
   1055  1.1  riastrad 	 * bits 7:4   num_banks
   1056  1.1  riastrad 	 * bits 11:8  group_size
   1057  1.1  riastrad 	 * bits 15:12 row_size
   1058  1.1  riastrad 	 */
   1059  1.1  riastrad 	rdev->config.cayman.tile_config = 0;
   1060  1.1  riastrad 	switch (rdev->config.cayman.num_tile_pipes) {
   1061  1.1  riastrad 	case 1:
   1062  1.1  riastrad 	default:
   1063  1.1  riastrad 		rdev->config.cayman.tile_config |= (0 << 0);
   1064  1.1  riastrad 		break;
   1065  1.1  riastrad 	case 2:
   1066  1.1  riastrad 		rdev->config.cayman.tile_config |= (1 << 0);
   1067  1.1  riastrad 		break;
   1068  1.1  riastrad 	case 4:
   1069  1.1  riastrad 		rdev->config.cayman.tile_config |= (2 << 0);
   1070  1.1  riastrad 		break;
   1071  1.1  riastrad 	case 8:
   1072  1.1  riastrad 		rdev->config.cayman.tile_config |= (3 << 0);
   1073  1.1  riastrad 		break;
   1074  1.1  riastrad 	}
   1075  1.1  riastrad 
   1076  1.1  riastrad 	/* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */
   1077  1.1  riastrad 	if (rdev->flags & RADEON_IS_IGP)
   1078  1.1  riastrad 		rdev->config.cayman.tile_config |= 1 << 4;
   1079  1.1  riastrad 	else {
   1080  1.1  riastrad 		switch ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) {
   1081  1.1  riastrad 		case 0: /* four banks */
   1082  1.1  riastrad 			rdev->config.cayman.tile_config |= 0 << 4;
   1083  1.1  riastrad 			break;
   1084  1.1  riastrad 		case 1: /* eight banks */
   1085  1.1  riastrad 			rdev->config.cayman.tile_config |= 1 << 4;
   1086  1.1  riastrad 			break;
   1087  1.1  riastrad 		case 2: /* sixteen banks */
   1088  1.1  riastrad 		default:
   1089  1.1  riastrad 			rdev->config.cayman.tile_config |= 2 << 4;
   1090  1.1  riastrad 			break;
   1091  1.1  riastrad 		}
   1092  1.1  riastrad 	}
   1093  1.1  riastrad 	rdev->config.cayman.tile_config |=
   1094  1.1  riastrad 		((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
   1095  1.1  riastrad 	rdev->config.cayman.tile_config |=
   1096  1.1  riastrad 		((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
   1097  1.1  riastrad 
   1098  1.1  riastrad 	tmp = 0;
   1099  1.1  riastrad 	for (i = (rdev->config.cayman.max_shader_engines - 1); i >= 0; i--) {
   1100  1.1  riastrad 		u32 rb_disable_bitmap;
   1101  1.1  riastrad 
   1102  1.1  riastrad 		WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
   1103  1.1  riastrad 		WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
   1104  1.1  riastrad 		rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16;
   1105  1.1  riastrad 		tmp <<= 4;
   1106  1.1  riastrad 		tmp |= rb_disable_bitmap;
   1107  1.1  riastrad 	}
   1108  1.1  riastrad 	/* enabled rb are just the one not disabled :) */
   1109  1.1  riastrad 	disabled_rb_mask = tmp;
   1110  1.1  riastrad 	tmp = 0;
   1111  1.1  riastrad 	for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
   1112  1.1  riastrad 		tmp |= (1 << i);
   1113  1.1  riastrad 	/* if all the backends are disabled, fix it up here */
   1114  1.1  riastrad 	if ((disabled_rb_mask & tmp) == tmp) {
   1115  1.1  riastrad 		for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
   1116  1.1  riastrad 			disabled_rb_mask &= ~(1 << i);
   1117  1.1  riastrad 	}
   1118  1.1  riastrad 
   1119  1.1  riastrad 	for (i = 0; i < rdev->config.cayman.max_shader_engines; i++) {
   1120  1.1  riastrad 		u32 simd_disable_bitmap;
   1121  1.1  riastrad 
   1122  1.1  riastrad 		WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
   1123  1.1  riastrad 		WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
   1124  1.1  riastrad 		simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
   1125  1.1  riastrad 		simd_disable_bitmap |= 0xffffffff << rdev->config.cayman.max_simds_per_se;
   1126  1.1  riastrad 		tmp <<= 16;
   1127  1.1  riastrad 		tmp |= simd_disable_bitmap;
   1128  1.1  riastrad 	}
   1129  1.1  riastrad 	rdev->config.cayman.active_simds = hweight32(~tmp);
   1130  1.1  riastrad 
   1131  1.1  riastrad 	WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
   1132  1.1  riastrad 	WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
   1133  1.1  riastrad 
   1134  1.1  riastrad 	WREG32(GB_ADDR_CONFIG, gb_addr_config);
   1135  1.1  riastrad 	WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
   1136  1.1  riastrad 	if (ASIC_IS_DCE6(rdev))
   1137  1.1  riastrad 		WREG32(DMIF_ADDR_CALC, gb_addr_config);
   1138  1.1  riastrad 	WREG32(HDP_ADDR_CONFIG, gb_addr_config);
   1139  1.1  riastrad 	WREG32(DMA_TILING_CONFIG + DMA0_REGISTER_OFFSET, gb_addr_config);
   1140  1.1  riastrad 	WREG32(DMA_TILING_CONFIG + DMA1_REGISTER_OFFSET, gb_addr_config);
   1141  1.1  riastrad 	WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
   1142  1.1  riastrad 	WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
   1143  1.1  riastrad 	WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
   1144  1.1  riastrad 
   1145  1.1  riastrad 	if ((rdev->config.cayman.max_backends_per_se == 1) &&
   1146  1.1  riastrad 	    (rdev->flags & RADEON_IS_IGP)) {
   1147  1.1  riastrad 		if ((disabled_rb_mask & 3) == 2) {
   1148  1.1  riastrad 			/* RB1 disabled, RB0 enabled */
   1149  1.1  riastrad 			tmp = 0x00000000;
   1150  1.1  riastrad 		} else {
   1151  1.1  riastrad 			/* RB0 disabled, RB1 enabled */
   1152  1.1  riastrad 			tmp = 0x11111111;
   1153  1.1  riastrad 		}
   1154  1.1  riastrad 	} else {
   1155  1.1  riastrad 		tmp = gb_addr_config & NUM_PIPES_MASK;
   1156  1.1  riastrad 		tmp = r6xx_remap_render_backend(rdev, tmp,
   1157  1.1  riastrad 						rdev->config.cayman.max_backends_per_se *
   1158  1.1  riastrad 						rdev->config.cayman.max_shader_engines,
   1159  1.1  riastrad 						CAYMAN_MAX_BACKENDS, disabled_rb_mask);
   1160  1.1  riastrad 	}
   1161  1.3  riastrad 	rdev->config.cayman.backend_map = tmp;
   1162  1.1  riastrad 	WREG32(GB_BACKEND_MAP, tmp);
   1163  1.1  riastrad 
   1164  1.1  riastrad 	cgts_tcc_disable = 0xffff0000;
   1165  1.1  riastrad 	for (i = 0; i < rdev->config.cayman.max_texture_channel_caches; i++)
   1166  1.1  riastrad 		cgts_tcc_disable &= ~(1 << (16 + i));
   1167  1.1  riastrad 	WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable);
   1168  1.1  riastrad 	WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable);
   1169  1.1  riastrad 	WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable);
   1170  1.1  riastrad 	WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable);
   1171  1.1  riastrad 
   1172  1.1  riastrad 	/* reprogram the shader complex */
   1173  1.1  riastrad 	cgts_sm_ctrl_reg = RREG32(CGTS_SM_CTRL_REG);
   1174  1.1  riastrad 	for (i = 0; i < 16; i++)
   1175  1.1  riastrad 		WREG32(CGTS_SM_CTRL_REG, OVERRIDE);
   1176  1.1  riastrad 	WREG32(CGTS_SM_CTRL_REG, cgts_sm_ctrl_reg);
   1177  1.1  riastrad 
   1178  1.1  riastrad 	/* set HW defaults for 3D engine */
   1179  1.1  riastrad 	WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
   1180  1.1  riastrad 
   1181  1.1  riastrad 	sx_debug_1 = RREG32(SX_DEBUG_1);
   1182  1.1  riastrad 	sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
   1183  1.1  riastrad 	WREG32(SX_DEBUG_1, sx_debug_1);
   1184  1.1  riastrad 
   1185  1.1  riastrad 	smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
   1186  1.1  riastrad 	smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
   1187  1.1  riastrad 	smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.cayman.sx_num_of_sets);
   1188  1.1  riastrad 	WREG32(SMX_DC_CTL0, smx_dc_ctl0);
   1189  1.1  riastrad 
   1190  1.1  riastrad 	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4) | CRC_SIMD_ID_WADDR_DISABLE);
   1191  1.1  riastrad 
   1192  1.1  riastrad 	/* need to be explicitly zero-ed */
   1193  1.1  riastrad 	WREG32(VGT_OFFCHIP_LDS_BASE, 0);
   1194  1.1  riastrad 	WREG32(SQ_LSTMP_RING_BASE, 0);
   1195  1.1  riastrad 	WREG32(SQ_HSTMP_RING_BASE, 0);
   1196  1.1  riastrad 	WREG32(SQ_ESTMP_RING_BASE, 0);
   1197  1.1  riastrad 	WREG32(SQ_GSTMP_RING_BASE, 0);
   1198  1.1  riastrad 	WREG32(SQ_VSTMP_RING_BASE, 0);
   1199  1.1  riastrad 	WREG32(SQ_PSTMP_RING_BASE, 0);
   1200  1.1  riastrad 
   1201  1.1  riastrad 	WREG32(TA_CNTL_AUX, DISABLE_CUBE_ANISO);
   1202  1.1  riastrad 
   1203  1.1  riastrad 	WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.cayman.sx_max_export_size / 4) - 1) |
   1204  1.1  riastrad 					POSITION_BUFFER_SIZE((rdev->config.cayman.sx_max_export_pos_size / 4) - 1) |
   1205  1.1  riastrad 					SMX_BUFFER_SIZE((rdev->config.cayman.sx_max_export_smx_size / 4) - 1)));
   1206  1.1  riastrad 
   1207  1.1  riastrad 	WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.cayman.sc_prim_fifo_size) |
   1208  1.1  riastrad 				 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_hiz_tile_fifo_size) |
   1209  1.1  riastrad 				 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_earlyz_tile_fifo_size)));
   1210  1.1  riastrad 
   1211  1.1  riastrad 
   1212  1.1  riastrad 	WREG32(VGT_NUM_INSTANCES, 1);
   1213  1.1  riastrad 
   1214  1.1  riastrad 	WREG32(CP_PERFMON_CNTL, 0);
   1215  1.1  riastrad 
   1216  1.1  riastrad 	WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.cayman.sq_num_cf_insts) |
   1217  1.1  riastrad 				  FETCH_FIFO_HIWATER(0x4) |
   1218  1.1  riastrad 				  DONE_FIFO_HIWATER(0xe0) |
   1219  1.1  riastrad 				  ALU_UPDATE_FIFO_HIWATER(0x8)));
   1220  1.1  riastrad 
   1221  1.1  riastrad 	WREG32(SQ_GPR_RESOURCE_MGMT_1, NUM_CLAUSE_TEMP_GPRS(4));
   1222  1.1  riastrad 	WREG32(SQ_CONFIG, (VC_ENABLE |
   1223  1.1  riastrad 			   EXPORT_SRC_C |
   1224  1.1  riastrad 			   GFX_PRIO(0) |
   1225  1.1  riastrad 			   CS1_PRIO(0) |
   1226  1.1  riastrad 			   CS2_PRIO(1)));
   1227  1.1  riastrad 	WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, DYN_GPR_ENABLE);
   1228  1.1  riastrad 
   1229  1.1  riastrad 	WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
   1230  1.1  riastrad 					  FORCE_EOV_MAX_REZ_CNT(255)));
   1231  1.1  riastrad 
   1232  1.1  riastrad 	WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
   1233  1.1  riastrad 	       AUTO_INVLD_EN(ES_AND_GS_AUTO));
   1234  1.1  riastrad 
   1235  1.1  riastrad 	WREG32(VGT_GS_VERTEX_REUSE, 16);
   1236  1.1  riastrad 	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
   1237  1.1  riastrad 
   1238  1.1  riastrad 	WREG32(CB_PERF_CTR0_SEL_0, 0);
   1239  1.1  riastrad 	WREG32(CB_PERF_CTR0_SEL_1, 0);
   1240  1.1  riastrad 	WREG32(CB_PERF_CTR1_SEL_0, 0);
   1241  1.1  riastrad 	WREG32(CB_PERF_CTR1_SEL_1, 0);
   1242  1.1  riastrad 	WREG32(CB_PERF_CTR2_SEL_0, 0);
   1243  1.1  riastrad 	WREG32(CB_PERF_CTR2_SEL_1, 0);
   1244  1.1  riastrad 	WREG32(CB_PERF_CTR3_SEL_0, 0);
   1245  1.1  riastrad 	WREG32(CB_PERF_CTR3_SEL_1, 0);
   1246  1.1  riastrad 
   1247  1.1  riastrad 	tmp = RREG32(HDP_MISC_CNTL);
   1248  1.1  riastrad 	tmp |= HDP_FLUSH_INVALIDATE_CACHE;
   1249  1.1  riastrad 	WREG32(HDP_MISC_CNTL, tmp);
   1250  1.1  riastrad 
   1251  1.1  riastrad 	hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
   1252  1.1  riastrad 	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
   1253  1.1  riastrad 
   1254  1.1  riastrad 	WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
   1255  1.1  riastrad 
   1256  1.1  riastrad 	udelay(50);
   1257  1.1  riastrad 
   1258  1.1  riastrad 	/* set clockgating golden values on TN */
   1259  1.1  riastrad 	if (rdev->family == CHIP_ARUBA) {
   1260  1.1  riastrad 		tmp = RREG32_CG(CG_CGTT_LOCAL_0);
   1261  1.1  riastrad 		tmp &= ~0x00380000;
   1262  1.1  riastrad 		WREG32_CG(CG_CGTT_LOCAL_0, tmp);
   1263  1.3  riastrad 		tmp = RREG32_CG(CG_CGTT_LOCAL_1);
   1264  1.1  riastrad 		tmp &= ~0x0e000000;
   1265  1.1  riastrad 		WREG32_CG(CG_CGTT_LOCAL_1, tmp);
   1266  1.1  riastrad 	}
   1267  1.1  riastrad }
   1268  1.1  riastrad 
   1269  1.1  riastrad /*
   1270  1.1  riastrad  * GART
   1271  1.1  riastrad  */
   1272  1.1  riastrad void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev)
   1273  1.1  riastrad {
   1274  1.1  riastrad 	/* flush hdp cache */
   1275  1.1  riastrad 	WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
   1276  1.1  riastrad 
   1277  1.1  riastrad 	/* bits 0-7 are the VM contexts0-7 */
   1278  1.1  riastrad 	WREG32(VM_INVALIDATE_REQUEST, 1);
   1279  1.1  riastrad }
   1280  1.1  riastrad 
   1281  1.1  riastrad static int cayman_pcie_gart_enable(struct radeon_device *rdev)
   1282  1.1  riastrad {
   1283  1.1  riastrad 	int i, r;
   1284  1.1  riastrad 
   1285  1.1  riastrad 	if (rdev->gart.robj == NULL) {
   1286  1.1  riastrad 		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
   1287  1.1  riastrad 		return -EINVAL;
   1288  1.1  riastrad 	}
   1289  1.1  riastrad 	r = radeon_gart_table_vram_pin(rdev);
   1290  1.1  riastrad 	if (r)
   1291  1.1  riastrad 		return r;
   1292  1.1  riastrad 	/* Setup TLB control */
   1293  1.1  riastrad 	WREG32(MC_VM_MX_L1_TLB_CNTL,
   1294  1.1  riastrad 	       (0xA << 7) |
   1295  1.1  riastrad 	       ENABLE_L1_TLB |
   1296  1.1  riastrad 	       ENABLE_L1_FRAGMENT_PROCESSING |
   1297  1.1  riastrad 	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
   1298  1.1  riastrad 	       ENABLE_ADVANCED_DRIVER_MODEL |
   1299  1.1  riastrad 	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
   1300  1.1  riastrad 	/* Setup L2 cache */
   1301  1.1  riastrad 	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
   1302  1.1  riastrad 	       ENABLE_L2_FRAGMENT_PROCESSING |
   1303  1.1  riastrad 	       ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
   1304  1.1  riastrad 	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
   1305  1.1  riastrad 	       EFFECTIVE_L2_QUEUE_SIZE(7) |
   1306  1.1  riastrad 	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
   1307  1.1  riastrad 	WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
   1308  1.1  riastrad 	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
   1309  1.1  riastrad 	       BANK_SELECT(6) |
   1310  1.1  riastrad 	       L2_CACHE_BIGK_FRAGMENT_SIZE(6));
   1311  1.1  riastrad 	/* setup context0 */
   1312  1.1  riastrad 	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
   1313  1.1  riastrad 	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
   1314  1.1  riastrad 	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
   1315  1.1  riastrad 	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
   1316  1.1  riastrad 			(u32)(rdev->dummy_page.addr >> 12));
   1317  1.1  riastrad 	WREG32(VM_CONTEXT0_CNTL2, 0);
   1318  1.1  riastrad 	WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
   1319  1.1  riastrad 				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
   1320  1.1  riastrad 
   1321  1.1  riastrad 	WREG32(0x15D4, 0);
   1322  1.1  riastrad 	WREG32(0x15D8, 0);
   1323  1.1  riastrad 	WREG32(0x15DC, 0);
   1324  1.1  riastrad 
   1325  1.1  riastrad 	/* empty context1-7 */
   1326  1.1  riastrad 	/* Assign the pt base to something valid for now; the pts used for
   1327  1.1  riastrad 	 * the VMs are determined by the application and setup and assigned
   1328  1.1  riastrad 	 * on the fly in the vm part of radeon_gart.c
   1329  1.1  riastrad 	 */
   1330  1.1  riastrad 	for (i = 1; i < 8; i++) {
   1331  1.1  riastrad 		WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (i << 2), 0);
   1332  1.1  riastrad 		WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (i << 2),
   1333  1.1  riastrad 			rdev->vm_manager.max_pfn - 1);
   1334  1.1  riastrad 		WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
   1335  1.1  riastrad 		       rdev->vm_manager.saved_table_addr[i]);
   1336  1.1  riastrad 	}
   1337  1.1  riastrad 
   1338  1.1  riastrad 	/* enable context1-7 */
   1339  1.1  riastrad 	WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
   1340  1.1  riastrad 	       (u32)(rdev->dummy_page.addr >> 12));
   1341  1.1  riastrad 	WREG32(VM_CONTEXT1_CNTL2, 4);
   1342  1.1  riastrad 	WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
   1343  1.1  riastrad 				PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) |
   1344  1.1  riastrad 				RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
   1345  1.1  riastrad 				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
   1346  1.1  riastrad 				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
   1347  1.1  riastrad 				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
   1348  1.1  riastrad 				PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
   1349  1.1  riastrad 				PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
   1350  1.1  riastrad 				VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
   1351  1.1  riastrad 				VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
   1352  1.1  riastrad 				READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
   1353  1.1  riastrad 				READ_PROTECTION_FAULT_ENABLE_DEFAULT |
   1354  1.1  riastrad 				WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
   1355  1.1  riastrad 				WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
   1356  1.1  riastrad 
   1357  1.1  riastrad 	cayman_pcie_gart_tlb_flush(rdev);
   1358  1.1  riastrad 	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
   1359  1.1  riastrad 		 (unsigned)(rdev->mc.gtt_size >> 20),
   1360  1.1  riastrad 		 (unsigned long long)rdev->gart.table_addr);
   1361  1.1  riastrad 	rdev->gart.ready = true;
   1362  1.1  riastrad 	return 0;
   1363  1.1  riastrad }
   1364  1.1  riastrad 
   1365  1.1  riastrad static void cayman_pcie_gart_disable(struct radeon_device *rdev)
   1366  1.1  riastrad {
   1367  1.1  riastrad 	unsigned i;
   1368  1.1  riastrad 
   1369  1.1  riastrad 	for (i = 1; i < 8; ++i) {
   1370  1.1  riastrad 		rdev->vm_manager.saved_table_addr[i] = RREG32(
   1371  1.1  riastrad 			VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2));
   1372  1.1  riastrad 	}
   1373  1.1  riastrad 
   1374  1.1  riastrad 	/* Disable all tables */
   1375  1.1  riastrad 	WREG32(VM_CONTEXT0_CNTL, 0);
   1376  1.1  riastrad 	WREG32(VM_CONTEXT1_CNTL, 0);
   1377  1.1  riastrad 	/* Setup TLB control */
   1378  1.1  riastrad 	WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING |
   1379  1.1  riastrad 	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
   1380  1.1  riastrad 	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
   1381  1.1  riastrad 	/* Setup L2 cache */
   1382  1.1  riastrad 	WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
   1383  1.1  riastrad 	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
   1384  1.1  riastrad 	       EFFECTIVE_L2_QUEUE_SIZE(7) |
   1385  1.1  riastrad 	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
   1386  1.1  riastrad 	WREG32(VM_L2_CNTL2, 0);
   1387  1.1  riastrad 	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
   1388  1.1  riastrad 	       L2_CACHE_BIGK_FRAGMENT_SIZE(6));
   1389  1.1  riastrad 	radeon_gart_table_vram_unpin(rdev);
   1390  1.1  riastrad }
   1391  1.1  riastrad 
   1392  1.1  riastrad static void cayman_pcie_gart_fini(struct radeon_device *rdev)
   1393  1.1  riastrad {
   1394  1.1  riastrad 	cayman_pcie_gart_disable(rdev);
   1395  1.1  riastrad 	radeon_gart_table_vram_free(rdev);
   1396  1.1  riastrad 	radeon_gart_fini(rdev);
   1397  1.1  riastrad }
   1398  1.1  riastrad 
   1399  1.1  riastrad void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
   1400  1.1  riastrad 			      int ring, u32 cp_int_cntl)
   1401  1.1  riastrad {
   1402  1.1  riastrad 	WREG32(SRBM_GFX_CNTL, RINGID(ring));
   1403  1.1  riastrad 	WREG32(CP_INT_CNTL, cp_int_cntl);
   1404  1.1  riastrad }
   1405  1.1  riastrad 
   1406  1.1  riastrad /*
   1407  1.1  riastrad  * CP.
   1408  1.1  riastrad  */
   1409  1.1  riastrad void cayman_fence_ring_emit(struct radeon_device *rdev,
   1410  1.1  riastrad 			    struct radeon_fence *fence)
   1411  1.1  riastrad {
   1412  1.1  riastrad 	struct radeon_ring *ring = &rdev->ring[fence->ring];
   1413  1.1  riastrad 	u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
   1414  1.1  riastrad 	u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
   1415  1.1  riastrad 		PACKET3_SH_ACTION_ENA;
   1416  1.1  riastrad 
   1417  1.1  riastrad 	/* flush read cache over gart for this vmid */
   1418  1.1  riastrad 	radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
   1419  1.1  riastrad 	radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
   1420  1.1  riastrad 	radeon_ring_write(ring, 0xFFFFFFFF);
   1421  1.1  riastrad 	radeon_ring_write(ring, 0);
   1422  1.1  riastrad 	radeon_ring_write(ring, 10); /* poll interval */
   1423  1.1  riastrad 	/* EVENT_WRITE_EOP - flush caches, send int */
   1424  1.1  riastrad 	radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
   1425  1.1  riastrad 	radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
   1426  1.1  riastrad 	radeon_ring_write(ring, lower_32_bits(addr));
   1427  1.1  riastrad 	radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
   1428  1.1  riastrad 	radeon_ring_write(ring, fence->seq);
   1429  1.1  riastrad 	radeon_ring_write(ring, 0);
   1430  1.1  riastrad }
   1431  1.1  riastrad 
   1432  1.1  riastrad void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
   1433  1.1  riastrad {
   1434  1.1  riastrad 	struct radeon_ring *ring = &rdev->ring[ib->ring];
   1435  1.1  riastrad 	unsigned vm_id = ib->vm ? ib->vm->ids[ib->ring].id : 0;
   1436  1.1  riastrad 	u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
   1437  1.1  riastrad 		PACKET3_SH_ACTION_ENA;
   1438  1.1  riastrad 
   1439  1.1  riastrad 	/* set to DX10/11 mode */
   1440  1.1  riastrad 	radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
   1441  1.1  riastrad 	radeon_ring_write(ring, 1);
   1442  1.1  riastrad 
   1443  1.1  riastrad 	if (ring->rptr_save_reg) {
   1444  1.1  riastrad 		uint32_t next_rptr = ring->wptr + 3 + 4 + 8;
   1445  1.1  riastrad 		radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
   1446  1.1  riastrad 		radeon_ring_write(ring, ((ring->rptr_save_reg -
   1447  1.1  riastrad 					  PACKET3_SET_CONFIG_REG_START) >> 2));
   1448  1.1  riastrad 		radeon_ring_write(ring, next_rptr);
   1449  1.1  riastrad 	}
   1450  1.1  riastrad 
   1451  1.1  riastrad 	radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
   1452  1.1  riastrad 	radeon_ring_write(ring,
   1453  1.1  riastrad #ifdef __BIG_ENDIAN
   1454  1.1  riastrad 			  (2 << 0) |
   1455  1.1  riastrad #endif
   1456  1.1  riastrad 			  (ib->gpu_addr & 0xFFFFFFFC));
   1457  1.1  riastrad 	radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF);
   1458  1.1  riastrad 	radeon_ring_write(ring, ib->length_dw | (vm_id << 24));
   1459  1.1  riastrad 
   1460  1.1  riastrad 	/* flush read cache over gart for this vmid */
   1461  1.1  riastrad 	radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
   1462  1.1  riastrad 	radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
   1463  1.1  riastrad 	radeon_ring_write(ring, 0xFFFFFFFF);
   1464  1.1  riastrad 	radeon_ring_write(ring, 0);
   1465  1.1  riastrad 	radeon_ring_write(ring, (vm_id << 24) | 10); /* poll interval */
   1466  1.1  riastrad }
   1467  1.1  riastrad 
   1468  1.1  riastrad static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
   1469  1.1  riastrad {
   1470  1.1  riastrad 	if (enable)
   1471  1.1  riastrad 		WREG32(CP_ME_CNTL, 0);
   1472  1.1  riastrad 	else {
   1473  1.1  riastrad 		if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
   1474  1.1  riastrad 			radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
   1475  1.1  riastrad 		WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
   1476  1.1  riastrad 		WREG32(SCRATCH_UMSK, 0);
   1477  1.1  riastrad 		rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
   1478  1.1  riastrad 	}
   1479  1.1  riastrad }
   1480  1.1  riastrad 
   1481  1.1  riastrad u32 cayman_gfx_get_rptr(struct radeon_device *rdev,
   1482  1.1  riastrad 			struct radeon_ring *ring)
   1483  1.1  riastrad {
   1484  1.1  riastrad 	u32 rptr;
   1485  1.1  riastrad 
   1486  1.1  riastrad 	if (rdev->wb.enabled)
   1487  1.1  riastrad 		rptr = rdev->wb.wb[ring->rptr_offs/4];
   1488  1.1  riastrad 	else {
   1489  1.1  riastrad 		if (ring->idx == RADEON_RING_TYPE_GFX_INDEX)
   1490  1.1  riastrad 			rptr = RREG32(CP_RB0_RPTR);
   1491  1.1  riastrad 		else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX)
   1492  1.1  riastrad 			rptr = RREG32(CP_RB1_RPTR);
   1493  1.1  riastrad 		else
   1494  1.1  riastrad 			rptr = RREG32(CP_RB2_RPTR);
   1495  1.1  riastrad 	}
   1496  1.1  riastrad 
   1497  1.1  riastrad 	return rptr;
   1498  1.1  riastrad }
   1499  1.1  riastrad 
   1500  1.1  riastrad u32 cayman_gfx_get_wptr(struct radeon_device *rdev,
   1501  1.1  riastrad 			struct radeon_ring *ring)
   1502  1.1  riastrad {
   1503  1.1  riastrad 	u32 wptr;
   1504  1.1  riastrad 
   1505  1.1  riastrad 	if (ring->idx == RADEON_RING_TYPE_GFX_INDEX)
   1506  1.1  riastrad 		wptr = RREG32(CP_RB0_WPTR);
   1507  1.1  riastrad 	else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX)
   1508  1.1  riastrad 		wptr = RREG32(CP_RB1_WPTR);
   1509  1.1  riastrad 	else
   1510  1.1  riastrad 		wptr = RREG32(CP_RB2_WPTR);
   1511  1.1  riastrad 
   1512  1.1  riastrad 	return wptr;
   1513  1.1  riastrad }
   1514  1.1  riastrad 
   1515  1.1  riastrad void cayman_gfx_set_wptr(struct radeon_device *rdev,
   1516  1.1  riastrad 			 struct radeon_ring *ring)
   1517  1.1  riastrad {
   1518  1.1  riastrad 	if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) {
   1519  1.1  riastrad 		WREG32(CP_RB0_WPTR, ring->wptr);
   1520  1.1  riastrad 		(void)RREG32(CP_RB0_WPTR);
   1521  1.1  riastrad 	} else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) {
   1522  1.1  riastrad 		WREG32(CP_RB1_WPTR, ring->wptr);
   1523  1.1  riastrad 		(void)RREG32(CP_RB1_WPTR);
   1524  1.1  riastrad 	} else {
   1525  1.1  riastrad 		WREG32(CP_RB2_WPTR, ring->wptr);
   1526  1.1  riastrad 		(void)RREG32(CP_RB2_WPTR);
   1527  1.1  riastrad 	}
   1528  1.1  riastrad }
   1529  1.1  riastrad 
   1530  1.1  riastrad static int cayman_cp_load_microcode(struct radeon_device *rdev)
   1531  1.1  riastrad {
   1532  1.1  riastrad 	const __be32 *fw_data;
   1533  1.1  riastrad 	int i;
   1534  1.1  riastrad 
   1535  1.1  riastrad 	if (!rdev->me_fw || !rdev->pfp_fw)
   1536  1.1  riastrad 		return -EINVAL;
   1537  1.1  riastrad 
   1538  1.1  riastrad 	cayman_cp_enable(rdev, false);
   1539  1.1  riastrad 
   1540  1.1  riastrad 	fw_data = (const __be32 *)rdev->pfp_fw->data;
   1541  1.1  riastrad 	WREG32(CP_PFP_UCODE_ADDR, 0);
   1542  1.1  riastrad 	for (i = 0; i < CAYMAN_PFP_UCODE_SIZE; i++)
   1543  1.1  riastrad 		WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
   1544  1.1  riastrad 	WREG32(CP_PFP_UCODE_ADDR, 0);
   1545  1.1  riastrad 
   1546  1.1  riastrad 	fw_data = (const __be32 *)rdev->me_fw->data;
   1547  1.1  riastrad 	WREG32(CP_ME_RAM_WADDR, 0);
   1548  1.1  riastrad 	for (i = 0; i < CAYMAN_PM4_UCODE_SIZE; i++)
   1549  1.1  riastrad 		WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
   1550  1.1  riastrad 
   1551  1.1  riastrad 	WREG32(CP_PFP_UCODE_ADDR, 0);
   1552  1.1  riastrad 	WREG32(CP_ME_RAM_WADDR, 0);
   1553  1.1  riastrad 	WREG32(CP_ME_RAM_RADDR, 0);
   1554  1.1  riastrad 	return 0;
   1555  1.1  riastrad }
   1556  1.1  riastrad 
   1557  1.1  riastrad static int cayman_cp_start(struct radeon_device *rdev)
   1558  1.1  riastrad {
   1559  1.1  riastrad 	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
   1560  1.1  riastrad 	int r, i;
   1561  1.1  riastrad 
   1562  1.1  riastrad 	r = radeon_ring_lock(rdev, ring, 7);
   1563  1.1  riastrad 	if (r) {
   1564  1.1  riastrad 		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
   1565  1.1  riastrad 		return r;
   1566  1.1  riastrad 	}
   1567  1.1  riastrad 	radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
   1568  1.1  riastrad 	radeon_ring_write(ring, 0x1);
   1569  1.1  riastrad 	radeon_ring_write(ring, 0x0);
   1570  1.1  riastrad 	radeon_ring_write(ring, rdev->config.cayman.max_hw_contexts - 1);
   1571  1.1  riastrad 	radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
   1572  1.1  riastrad 	radeon_ring_write(ring, 0);
   1573  1.1  riastrad 	radeon_ring_write(ring, 0);
   1574  1.1  riastrad 	radeon_ring_unlock_commit(rdev, ring, false);
   1575  1.1  riastrad 
   1576  1.1  riastrad 	cayman_cp_enable(rdev, true);
   1577  1.1  riastrad 
   1578  1.1  riastrad 	r = radeon_ring_lock(rdev, ring, cayman_default_size + 19);
   1579  1.1  riastrad 	if (r) {
   1580  1.1  riastrad 		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
   1581  1.1  riastrad 		return r;
   1582  1.1  riastrad 	}
   1583  1.1  riastrad 
   1584  1.1  riastrad 	/* setup clear context state */
   1585  1.1  riastrad 	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
   1586  1.1  riastrad 	radeon_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
   1587  1.1  riastrad 
   1588  1.1  riastrad 	for (i = 0; i < cayman_default_size; i++)
   1589  1.1  riastrad 		radeon_ring_write(ring, cayman_default_state[i]);
   1590  1.1  riastrad 
   1591  1.1  riastrad 	radeon_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
   1592  1.1  riastrad 	radeon_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
   1593  1.1  riastrad 
   1594  1.1  riastrad 	/* set clear context state */
   1595  1.1  riastrad 	radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
   1596  1.1  riastrad 	radeon_ring_write(ring, 0);
   1597  1.1  riastrad 
   1598  1.1  riastrad 	/* SQ_VTX_BASE_VTX_LOC */
   1599  1.1  riastrad 	radeon_ring_write(ring, 0xc0026f00);
   1600  1.1  riastrad 	radeon_ring_write(ring, 0x00000000);
   1601  1.1  riastrad 	radeon_ring_write(ring, 0x00000000);
   1602  1.1  riastrad 	radeon_ring_write(ring, 0x00000000);
   1603  1.1  riastrad 
   1604  1.1  riastrad 	/* Clear consts */
   1605  1.1  riastrad 	radeon_ring_write(ring, 0xc0036f00);
   1606  1.1  riastrad 	radeon_ring_write(ring, 0x00000bc4);
   1607  1.1  riastrad 	radeon_ring_write(ring, 0xffffffff);
   1608  1.1  riastrad 	radeon_ring_write(ring, 0xffffffff);
   1609  1.1  riastrad 	radeon_ring_write(ring, 0xffffffff);
   1610  1.1  riastrad 
   1611  1.1  riastrad 	radeon_ring_write(ring, 0xc0026900);
   1612  1.1  riastrad 	radeon_ring_write(ring, 0x00000316);
   1613  1.1  riastrad 	radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
   1614  1.1  riastrad 	radeon_ring_write(ring, 0x00000010); /*  */
   1615  1.1  riastrad 
   1616  1.1  riastrad 	radeon_ring_unlock_commit(rdev, ring, false);
   1617  1.1  riastrad 
   1618  1.1  riastrad 	/* XXX init other rings */
   1619  1.1  riastrad 
   1620  1.1  riastrad 	return 0;
   1621  1.1  riastrad }
   1622  1.1  riastrad 
   1623  1.1  riastrad static void cayman_cp_fini(struct radeon_device *rdev)
   1624  1.1  riastrad {
   1625  1.1  riastrad 	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
   1626  1.1  riastrad 	cayman_cp_enable(rdev, false);
   1627  1.1  riastrad 	radeon_ring_fini(rdev, ring);
   1628  1.1  riastrad 	radeon_scratch_free(rdev, ring->rptr_save_reg);
   1629  1.1  riastrad }
   1630  1.1  riastrad 
   1631  1.1  riastrad static int cayman_cp_resume(struct radeon_device *rdev)
   1632  1.1  riastrad {
   1633  1.1  riastrad 	static const int ridx[] = {
   1634  1.1  riastrad 		RADEON_RING_TYPE_GFX_INDEX,
   1635  1.1  riastrad 		CAYMAN_RING_TYPE_CP1_INDEX,
   1636  1.1  riastrad 		CAYMAN_RING_TYPE_CP2_INDEX
   1637  1.1  riastrad 	};
   1638  1.1  riastrad 	static const unsigned cp_rb_cntl[] = {
   1639  1.1  riastrad 		CP_RB0_CNTL,
   1640  1.1  riastrad 		CP_RB1_CNTL,
   1641  1.1  riastrad 		CP_RB2_CNTL,
   1642  1.1  riastrad 	};
   1643  1.1  riastrad 	static const unsigned cp_rb_rptr_addr[] = {
   1644  1.1  riastrad 		CP_RB0_RPTR_ADDR,
   1645  1.1  riastrad 		CP_RB1_RPTR_ADDR,
   1646  1.1  riastrad 		CP_RB2_RPTR_ADDR
   1647  1.1  riastrad 	};
   1648  1.1  riastrad 	static const unsigned cp_rb_rptr_addr_hi[] = {
   1649  1.1  riastrad 		CP_RB0_RPTR_ADDR_HI,
   1650  1.1  riastrad 		CP_RB1_RPTR_ADDR_HI,
   1651  1.1  riastrad 		CP_RB2_RPTR_ADDR_HI
   1652  1.1  riastrad 	};
   1653  1.1  riastrad 	static const unsigned cp_rb_base[] = {
   1654  1.1  riastrad 		CP_RB0_BASE,
   1655  1.1  riastrad 		CP_RB1_BASE,
   1656  1.1  riastrad 		CP_RB2_BASE
   1657  1.1  riastrad 	};
   1658  1.1  riastrad 	static const unsigned cp_rb_rptr[] = {
   1659  1.1  riastrad 		CP_RB0_RPTR,
   1660  1.1  riastrad 		CP_RB1_RPTR,
   1661  1.1  riastrad 		CP_RB2_RPTR
   1662  1.1  riastrad 	};
   1663  1.1  riastrad 	static const unsigned cp_rb_wptr[] = {
   1664  1.1  riastrad 		CP_RB0_WPTR,
   1665  1.1  riastrad 		CP_RB1_WPTR,
   1666  1.1  riastrad 		CP_RB2_WPTR
   1667  1.1  riastrad 	};
   1668  1.1  riastrad 	struct radeon_ring *ring;
   1669  1.1  riastrad 	int i, r;
   1670  1.1  riastrad 
   1671  1.1  riastrad 	/* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
   1672  1.1  riastrad 	WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
   1673  1.1  riastrad 				 SOFT_RESET_PA |
   1674  1.1  riastrad 				 SOFT_RESET_SH |
   1675  1.1  riastrad 				 SOFT_RESET_VGT |
   1676  1.1  riastrad 				 SOFT_RESET_SPI |
   1677  1.1  riastrad 				 SOFT_RESET_SX));
   1678  1.1  riastrad 	RREG32(GRBM_SOFT_RESET);
   1679  1.1  riastrad 	mdelay(15);
   1680  1.1  riastrad 	WREG32(GRBM_SOFT_RESET, 0);
   1681  1.1  riastrad 	RREG32(GRBM_SOFT_RESET);
   1682  1.1  riastrad 
   1683  1.1  riastrad 	WREG32(CP_SEM_WAIT_TIMER, 0x0);
   1684  1.1  riastrad 	WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
   1685  1.1  riastrad 
   1686  1.1  riastrad 	/* Set the write pointer delay */
   1687  1.1  riastrad 	WREG32(CP_RB_WPTR_DELAY, 0);
   1688  1.1  riastrad 
   1689  1.1  riastrad 	WREG32(CP_DEBUG, (1 << 27));
   1690  1.1  riastrad 
   1691  1.1  riastrad 	/* set the wb address whether it's enabled or not */
   1692  1.1  riastrad 	WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
   1693  1.1  riastrad 	WREG32(SCRATCH_UMSK, 0xff);
   1694  1.1  riastrad 
   1695  1.1  riastrad 	for (i = 0; i < 3; ++i) {
   1696  1.1  riastrad 		uint32_t rb_cntl;
   1697  1.1  riastrad 		uint64_t addr;
   1698  1.1  riastrad 
   1699  1.1  riastrad 		/* Set ring buffer size */
   1700  1.1  riastrad 		ring = &rdev->ring[ridx[i]];
   1701  1.1  riastrad 		rb_cntl = order_base_2(ring->ring_size / 8);
   1702  1.1  riastrad 		rb_cntl |= order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8;
   1703  1.1  riastrad #ifdef __BIG_ENDIAN
   1704  1.1  riastrad 		rb_cntl |= BUF_SWAP_32BIT;
   1705  1.1  riastrad #endif
   1706  1.1  riastrad 		WREG32(cp_rb_cntl[i], rb_cntl);
   1707  1.1  riastrad 
   1708  1.1  riastrad 		/* set the wb address whether it's enabled or not */
   1709  1.1  riastrad 		addr = rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET;
   1710  1.1  riastrad 		WREG32(cp_rb_rptr_addr[i], addr & 0xFFFFFFFC);
   1711  1.1  riastrad 		WREG32(cp_rb_rptr_addr_hi[i], upper_32_bits(addr) & 0xFF);
   1712  1.1  riastrad 	}
   1713  1.1  riastrad 
   1714  1.1  riastrad 	/* set the rb base addr, this causes an internal reset of ALL rings */
   1715  1.1  riastrad 	for (i = 0; i < 3; ++i) {
   1716  1.1  riastrad 		ring = &rdev->ring[ridx[i]];
   1717  1.1  riastrad 		WREG32(cp_rb_base[i], ring->gpu_addr >> 8);
   1718  1.1  riastrad 	}
   1719  1.1  riastrad 
   1720  1.1  riastrad 	for (i = 0; i < 3; ++i) {
   1721  1.1  riastrad 		/* Initialize the ring buffer's read and write pointers */
   1722  1.1  riastrad 		ring = &rdev->ring[ridx[i]];
   1723  1.1  riastrad 		WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA);
   1724  1.1  riastrad 
   1725  1.1  riastrad 		ring->wptr = 0;
   1726  1.1  riastrad 		WREG32(cp_rb_rptr[i], 0);
   1727  1.1  riastrad 		WREG32(cp_rb_wptr[i], ring->wptr);
   1728  1.1  riastrad 
   1729  1.1  riastrad 		mdelay(1);
   1730  1.1  riastrad 		WREG32_P(cp_rb_cntl[i], 0, ~RB_RPTR_WR_ENA);
   1731  1.1  riastrad 	}
   1732  1.1  riastrad 
   1733  1.1  riastrad 	/* start the rings */
   1734  1.1  riastrad 	cayman_cp_start(rdev);
   1735  1.1  riastrad 	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = true;
   1736  1.1  riastrad 	rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
   1737  1.1  riastrad 	rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
   1738  1.1  riastrad 	/* this only test cp0 */
   1739  1.1  riastrad 	r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);
   1740  1.1  riastrad 	if (r) {
   1741  1.1  riastrad 		rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
   1742  1.1  riastrad 		rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
   1743  1.1  riastrad 		rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
   1744  1.1  riastrad 		return r;
   1745  1.1  riastrad 	}
   1746  1.1  riastrad 
   1747  1.1  riastrad 	if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
   1748  1.1  riastrad 		radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
   1749  1.1  riastrad 
   1750  1.1  riastrad 	return 0;
   1751  1.1  riastrad }
   1752  1.1  riastrad 
   1753  1.1  riastrad u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev)
   1754  1.1  riastrad {
   1755  1.1  riastrad 	u32 reset_mask = 0;
   1756  1.1  riastrad 	u32 tmp;
   1757  1.1  riastrad 
   1758  1.1  riastrad 	/* GRBM_STATUS */
   1759  1.1  riastrad 	tmp = RREG32(GRBM_STATUS);
   1760  1.1  riastrad 	if (tmp & (PA_BUSY | SC_BUSY |
   1761  1.1  riastrad 		   SH_BUSY | SX_BUSY |
   1762  1.1  riastrad 		   TA_BUSY | VGT_BUSY |
   1763  1.1  riastrad 		   DB_BUSY | CB_BUSY |
   1764  1.1  riastrad 		   GDS_BUSY | SPI_BUSY |
   1765  1.1  riastrad 		   IA_BUSY | IA_BUSY_NO_DMA))
   1766  1.1  riastrad 		reset_mask |= RADEON_RESET_GFX;
   1767  1.1  riastrad 
   1768  1.1  riastrad 	if (tmp & (CF_RQ_PENDING | PF_RQ_PENDING |
   1769  1.1  riastrad 		   CP_BUSY | CP_COHERENCY_BUSY))
   1770  1.1  riastrad 		reset_mask |= RADEON_RESET_CP;
   1771  1.1  riastrad 
   1772  1.1  riastrad 	if (tmp & GRBM_EE_BUSY)
   1773  1.1  riastrad 		reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
   1774  1.1  riastrad 
   1775  1.1  riastrad 	/* DMA_STATUS_REG 0 */
   1776  1.1  riastrad 	tmp = RREG32(DMA_STATUS_REG + DMA0_REGISTER_OFFSET);
   1777  1.1  riastrad 	if (!(tmp & DMA_IDLE))
   1778  1.1  riastrad 		reset_mask |= RADEON_RESET_DMA;
   1779  1.1  riastrad 
   1780  1.1  riastrad 	/* DMA_STATUS_REG 1 */
   1781  1.1  riastrad 	tmp = RREG32(DMA_STATUS_REG + DMA1_REGISTER_OFFSET);
   1782  1.1  riastrad 	if (!(tmp & DMA_IDLE))
   1783  1.1  riastrad 		reset_mask |= RADEON_RESET_DMA1;
   1784  1.1  riastrad 
   1785  1.1  riastrad 	/* SRBM_STATUS2 */
   1786  1.1  riastrad 	tmp = RREG32(SRBM_STATUS2);
   1787  1.1  riastrad 	if (tmp & DMA_BUSY)
   1788  1.1  riastrad 		reset_mask |= RADEON_RESET_DMA;
   1789  1.1  riastrad 
   1790  1.1  riastrad 	if (tmp & DMA1_BUSY)
   1791  1.1  riastrad 		reset_mask |= RADEON_RESET_DMA1;
   1792  1.1  riastrad 
   1793  1.1  riastrad 	/* SRBM_STATUS */
   1794  1.1  riastrad 	tmp = RREG32(SRBM_STATUS);
   1795  1.1  riastrad 	if (tmp & (RLC_RQ_PENDING | RLC_BUSY))
   1796  1.1  riastrad 		reset_mask |= RADEON_RESET_RLC;
   1797  1.1  riastrad 
   1798  1.1  riastrad 	if (tmp & IH_BUSY)
   1799  1.1  riastrad 		reset_mask |= RADEON_RESET_IH;
   1800  1.1  riastrad 
   1801  1.1  riastrad 	if (tmp & SEM_BUSY)
   1802  1.1  riastrad 		reset_mask |= RADEON_RESET_SEM;
   1803  1.1  riastrad 
   1804  1.1  riastrad 	if (tmp & GRBM_RQ_PENDING)
   1805  1.1  riastrad 		reset_mask |= RADEON_RESET_GRBM;
   1806  1.1  riastrad 
   1807  1.1  riastrad 	if (tmp & VMC_BUSY)
   1808  1.1  riastrad 		reset_mask |= RADEON_RESET_VMC;
   1809  1.1  riastrad 
   1810  1.1  riastrad 	if (tmp & (MCB_BUSY | MCB_NON_DISPLAY_BUSY |
   1811  1.1  riastrad 		   MCC_BUSY | MCD_BUSY))
   1812  1.1  riastrad 		reset_mask |= RADEON_RESET_MC;
   1813  1.1  riastrad 
   1814  1.1  riastrad 	if (evergreen_is_display_hung(rdev))
   1815  1.1  riastrad 		reset_mask |= RADEON_RESET_DISPLAY;
   1816  1.1  riastrad 
   1817  1.1  riastrad 	/* VM_L2_STATUS */
   1818  1.1  riastrad 	tmp = RREG32(VM_L2_STATUS);
   1819  1.1  riastrad 	if (tmp & L2_BUSY)
   1820  1.1  riastrad 		reset_mask |= RADEON_RESET_VMC;
   1821  1.1  riastrad 
   1822  1.1  riastrad 	/* Skip MC reset as it's mostly likely not hung, just busy */
   1823  1.1  riastrad 	if (reset_mask & RADEON_RESET_MC) {
   1824  1.1  riastrad 		DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
   1825  1.1  riastrad 		reset_mask &= ~RADEON_RESET_MC;
   1826  1.1  riastrad 	}
   1827  1.1  riastrad 
   1828  1.1  riastrad 	return reset_mask;
   1829  1.1  riastrad }
   1830  1.1  riastrad 
   1831  1.1  riastrad static void cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
   1832  1.1  riastrad {
   1833  1.1  riastrad 	struct evergreen_mc_save save;
   1834  1.1  riastrad 	u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
   1835  1.1  riastrad 	u32 tmp;
   1836  1.1  riastrad 
   1837  1.1  riastrad 	if (reset_mask == 0)
   1838  1.1  riastrad 		return;
   1839  1.1  riastrad 
   1840  1.1  riastrad 	dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
   1841  1.1  riastrad 
   1842  1.1  riastrad 	evergreen_print_gpu_status_regs(rdev);
   1843  1.1  riastrad 	dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_ADDR   0x%08X\n",
   1844  1.1  riastrad 		 RREG32(0x14F8));
   1845  1.1  riastrad 	dev_info(rdev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_STATUS 0x%08X\n",
   1846  1.1  riastrad 		 RREG32(0x14D8));
   1847  1.1  riastrad 	dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
   1848  1.1  riastrad 		 RREG32(0x14FC));
   1849  1.1  riastrad 	dev_info(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
   1850  1.1  riastrad 		 RREG32(0x14DC));
   1851  1.1  riastrad 
   1852  1.1  riastrad 	/* Disable CP parsing/prefetching */
   1853  1.1  riastrad 	WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
   1854  1.1  riastrad 
   1855  1.1  riastrad 	if (reset_mask & RADEON_RESET_DMA) {
   1856  1.1  riastrad 		/* dma0 */
   1857  1.1  riastrad 		tmp = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
   1858  1.1  riastrad 		tmp &= ~DMA_RB_ENABLE;
   1859  1.1  riastrad 		WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, tmp);
   1860  1.1  riastrad 	}
   1861  1.1  riastrad 
   1862  1.1  riastrad 	if (reset_mask & RADEON_RESET_DMA1) {
   1863  1.1  riastrad 		/* dma1 */
   1864  1.1  riastrad 		tmp = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
   1865  1.1  riastrad 		tmp &= ~DMA_RB_ENABLE;
   1866  1.1  riastrad 		WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, tmp);
   1867  1.1  riastrad 	}
   1868  1.1  riastrad 
   1869  1.1  riastrad 	udelay(50);
   1870  1.1  riastrad 
   1871  1.1  riastrad 	evergreen_mc_stop(rdev, &save);
   1872  1.1  riastrad 	if (evergreen_mc_wait_for_idle(rdev)) {
   1873  1.1  riastrad 		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
   1874  1.1  riastrad 	}
   1875  1.1  riastrad 
   1876  1.1  riastrad 	if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) {
   1877  1.1  riastrad 		grbm_soft_reset = SOFT_RESET_CB |
   1878  1.1  riastrad 			SOFT_RESET_DB |
   1879  1.1  riastrad 			SOFT_RESET_GDS |
   1880  1.1  riastrad 			SOFT_RESET_PA |
   1881  1.1  riastrad 			SOFT_RESET_SC |
   1882  1.1  riastrad 			SOFT_RESET_SPI |
   1883  1.1  riastrad 			SOFT_RESET_SH |
   1884  1.1  riastrad 			SOFT_RESET_SX |
   1885  1.1  riastrad 			SOFT_RESET_TC |
   1886  1.1  riastrad 			SOFT_RESET_TA |
   1887  1.1  riastrad 			SOFT_RESET_VGT |
   1888  1.1  riastrad 			SOFT_RESET_IA;
   1889  1.1  riastrad 	}
   1890  1.1  riastrad 
   1891  1.1  riastrad 	if (reset_mask & RADEON_RESET_CP) {
   1892  1.1  riastrad 		grbm_soft_reset |= SOFT_RESET_CP | SOFT_RESET_VGT;
   1893  1.1  riastrad 
   1894  1.1  riastrad 		srbm_soft_reset |= SOFT_RESET_GRBM;
   1895  1.1  riastrad 	}
   1896  1.1  riastrad 
   1897  1.1  riastrad 	if (reset_mask & RADEON_RESET_DMA)
   1898  1.1  riastrad 		srbm_soft_reset |= SOFT_RESET_DMA;
   1899  1.1  riastrad 
   1900  1.1  riastrad 	if (reset_mask & RADEON_RESET_DMA1)
   1901  1.1  riastrad 		srbm_soft_reset |= SOFT_RESET_DMA1;
   1902  1.1  riastrad 
   1903  1.1  riastrad 	if (reset_mask & RADEON_RESET_DISPLAY)
   1904  1.1  riastrad 		srbm_soft_reset |= SOFT_RESET_DC;
   1905  1.1  riastrad 
   1906  1.1  riastrad 	if (reset_mask & RADEON_RESET_RLC)
   1907  1.1  riastrad 		srbm_soft_reset |= SOFT_RESET_RLC;
   1908  1.1  riastrad 
   1909  1.1  riastrad 	if (reset_mask & RADEON_RESET_SEM)
   1910  1.1  riastrad 		srbm_soft_reset |= SOFT_RESET_SEM;
   1911  1.1  riastrad 
   1912  1.1  riastrad 	if (reset_mask & RADEON_RESET_IH)
   1913  1.1  riastrad 		srbm_soft_reset |= SOFT_RESET_IH;
   1914  1.1  riastrad 
   1915  1.1  riastrad 	if (reset_mask & RADEON_RESET_GRBM)
   1916  1.1  riastrad 		srbm_soft_reset |= SOFT_RESET_GRBM;
   1917  1.1  riastrad 
   1918  1.1  riastrad 	if (reset_mask & RADEON_RESET_VMC)
   1919  1.1  riastrad 		srbm_soft_reset |= SOFT_RESET_VMC;
   1920  1.1  riastrad 
   1921  1.1  riastrad 	if (!(rdev->flags & RADEON_IS_IGP)) {
   1922  1.1  riastrad 		if (reset_mask & RADEON_RESET_MC)
   1923  1.1  riastrad 			srbm_soft_reset |= SOFT_RESET_MC;
   1924  1.1  riastrad 	}
   1925  1.1  riastrad 
   1926  1.1  riastrad 	if (grbm_soft_reset) {
   1927  1.1  riastrad 		tmp = RREG32(GRBM_SOFT_RESET);
   1928  1.1  riastrad 		tmp |= grbm_soft_reset;
   1929  1.1  riastrad 		dev_info(rdev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
   1930  1.1  riastrad 		WREG32(GRBM_SOFT_RESET, tmp);
   1931  1.1  riastrad 		tmp = RREG32(GRBM_SOFT_RESET);
   1932  1.1  riastrad 
   1933  1.1  riastrad 		udelay(50);
   1934  1.1  riastrad 
   1935  1.1  riastrad 		tmp &= ~grbm_soft_reset;
   1936  1.1  riastrad 		WREG32(GRBM_SOFT_RESET, tmp);
   1937  1.1  riastrad 		tmp = RREG32(GRBM_SOFT_RESET);
   1938  1.1  riastrad 	}
   1939  1.1  riastrad 
   1940  1.1  riastrad 	if (srbm_soft_reset) {
   1941  1.1  riastrad 		tmp = RREG32(SRBM_SOFT_RESET);
   1942  1.1  riastrad 		tmp |= srbm_soft_reset;
   1943  1.1  riastrad 		dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
   1944  1.1  riastrad 		WREG32(SRBM_SOFT_RESET, tmp);
   1945  1.1  riastrad 		tmp = RREG32(SRBM_SOFT_RESET);
   1946  1.1  riastrad 
   1947  1.1  riastrad 		udelay(50);
   1948  1.1  riastrad 
   1949  1.1  riastrad 		tmp &= ~srbm_soft_reset;
   1950  1.1  riastrad 		WREG32(SRBM_SOFT_RESET, tmp);
   1951  1.1  riastrad 		tmp = RREG32(SRBM_SOFT_RESET);
   1952  1.1  riastrad 	}
   1953  1.1  riastrad 
   1954  1.1  riastrad 	/* Wait a little for things to settle down */
   1955  1.1  riastrad 	udelay(50);
   1956  1.1  riastrad 
   1957  1.1  riastrad 	evergreen_mc_resume(rdev, &save);
   1958  1.1  riastrad 	udelay(50);
   1959  1.1  riastrad 
   1960  1.1  riastrad 	evergreen_print_gpu_status_regs(rdev);
   1961  1.1  riastrad }
   1962  1.1  riastrad 
   1963  1.3  riastrad int cayman_asic_reset(struct radeon_device *rdev, bool hard)
   1964  1.1  riastrad {
   1965  1.1  riastrad 	u32 reset_mask;
   1966  1.1  riastrad 
   1967  1.3  riastrad 	if (hard) {
   1968  1.3  riastrad 		evergreen_gpu_pci_config_reset(rdev);
   1969  1.3  riastrad 		return 0;
   1970  1.3  riastrad 	}
   1971  1.3  riastrad 
   1972  1.1  riastrad 	reset_mask = cayman_gpu_check_soft_reset(rdev);
   1973  1.1  riastrad 
   1974  1.1  riastrad 	if (reset_mask)
   1975  1.1  riastrad 		r600_set_bios_scratch_engine_hung(rdev, true);
   1976  1.1  riastrad 
   1977  1.1  riastrad 	cayman_gpu_soft_reset(rdev, reset_mask);
   1978  1.1  riastrad 
   1979  1.1  riastrad 	reset_mask = cayman_gpu_check_soft_reset(rdev);
   1980  1.1  riastrad 
   1981  1.1  riastrad 	if (reset_mask)
   1982  1.1  riastrad 		evergreen_gpu_pci_config_reset(rdev);
   1983  1.1  riastrad 
   1984  1.1  riastrad 	r600_set_bios_scratch_engine_hung(rdev, false);
   1985  1.1  riastrad 
   1986  1.1  riastrad 	return 0;
   1987  1.1  riastrad }
   1988  1.1  riastrad 
   1989  1.1  riastrad /**
   1990  1.1  riastrad  * cayman_gfx_is_lockup - Check if the GFX engine is locked up
   1991  1.1  riastrad  *
   1992  1.1  riastrad  * @rdev: radeon_device pointer
   1993  1.1  riastrad  * @ring: radeon_ring structure holding ring information
   1994  1.1  riastrad  *
   1995  1.1  riastrad  * Check if the GFX engine is locked up.
   1996  1.1  riastrad  * Returns true if the engine appears to be locked up, false if not.
   1997  1.1  riastrad  */
   1998  1.1  riastrad bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
   1999  1.1  riastrad {
   2000  1.1  riastrad 	u32 reset_mask = cayman_gpu_check_soft_reset(rdev);
   2001  1.1  riastrad 
   2002  1.1  riastrad 	if (!(reset_mask & (RADEON_RESET_GFX |
   2003  1.1  riastrad 			    RADEON_RESET_COMPUTE |
   2004  1.1  riastrad 			    RADEON_RESET_CP))) {
   2005  1.1  riastrad 		radeon_ring_lockup_update(rdev, ring);
   2006  1.1  riastrad 		return false;
   2007  1.1  riastrad 	}
   2008  1.1  riastrad 	return radeon_ring_test_lockup(rdev, ring);
   2009  1.1  riastrad }
   2010  1.1  riastrad 
   2011  1.3  riastrad static void cayman_uvd_init(struct radeon_device *rdev)
   2012  1.3  riastrad {
   2013  1.3  riastrad 	int r;
   2014  1.3  riastrad 
   2015  1.3  riastrad 	if (!rdev->has_uvd)
   2016  1.3  riastrad 		return;
   2017  1.3  riastrad 
   2018  1.3  riastrad 	r = radeon_uvd_init(rdev);
   2019  1.3  riastrad 	if (r) {
   2020  1.3  riastrad 		dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
   2021  1.3  riastrad 		/*
   2022  1.3  riastrad 		 * At this point rdev->uvd.vcpu_bo is NULL which trickles down
   2023  1.3  riastrad 		 * to early fails uvd_v2_2_resume() and thus nothing happens
   2024  1.3  riastrad 		 * there. So it is pointless to try to go through that code
   2025  1.3  riastrad 		 * hence why we disable uvd here.
   2026  1.3  riastrad 		 */
   2027  1.3  riastrad 		rdev->has_uvd = false;
   2028  1.3  riastrad 		return;
   2029  1.3  riastrad 	}
   2030  1.3  riastrad 	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
   2031  1.3  riastrad 	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
   2032  1.3  riastrad }
   2033  1.3  riastrad 
   2034  1.3  riastrad static void cayman_uvd_start(struct radeon_device *rdev)
   2035  1.3  riastrad {
   2036  1.3  riastrad 	int r;
   2037  1.3  riastrad 
   2038  1.3  riastrad 	if (!rdev->has_uvd)
   2039  1.3  riastrad 		return;
   2040  1.3  riastrad 
   2041  1.3  riastrad 	r = uvd_v2_2_resume(rdev);
   2042  1.3  riastrad 	if (r) {
   2043  1.3  riastrad 		dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
   2044  1.3  riastrad 		goto error;
   2045  1.3  riastrad 	}
   2046  1.3  riastrad 	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
   2047  1.3  riastrad 	if (r) {
   2048  1.3  riastrad 		dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
   2049  1.3  riastrad 		goto error;
   2050  1.3  riastrad 	}
   2051  1.3  riastrad 	return;
   2052  1.3  riastrad 
   2053  1.3  riastrad error:
   2054  1.3  riastrad 	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
   2055  1.3  riastrad }
   2056  1.3  riastrad 
   2057  1.3  riastrad static void cayman_uvd_resume(struct radeon_device *rdev)
   2058  1.3  riastrad {
   2059  1.3  riastrad 	struct radeon_ring *ring;
   2060  1.3  riastrad 	int r;
   2061  1.3  riastrad 
   2062  1.3  riastrad 	if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
   2063  1.3  riastrad 		return;
   2064  1.3  riastrad 
   2065  1.3  riastrad 	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
   2066  1.3  riastrad 	r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0));
   2067  1.3  riastrad 	if (r) {
   2068  1.3  riastrad 		dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
   2069  1.3  riastrad 		return;
   2070  1.3  riastrad 	}
   2071  1.3  riastrad 	r = uvd_v1_0_init(rdev);
   2072  1.3  riastrad 	if (r) {
   2073  1.3  riastrad 		dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
   2074  1.3  riastrad 		return;
   2075  1.3  riastrad 	}
   2076  1.3  riastrad }
   2077  1.3  riastrad 
   2078  1.3  riastrad static void cayman_vce_init(struct radeon_device *rdev)
   2079  1.3  riastrad {
   2080  1.3  riastrad 	int r;
   2081  1.3  riastrad 
   2082  1.3  riastrad 	/* Only set for CHIP_ARUBA */
   2083  1.3  riastrad 	if (!rdev->has_vce)
   2084  1.3  riastrad 		return;
   2085  1.3  riastrad 
   2086  1.3  riastrad 	r = radeon_vce_init(rdev);
   2087  1.3  riastrad 	if (r) {
   2088  1.3  riastrad 		dev_err(rdev->dev, "failed VCE (%d) init.\n", r);
   2089  1.3  riastrad 		/*
   2090  1.3  riastrad 		 * At this point rdev->vce.vcpu_bo is NULL which trickles down
   2091  1.3  riastrad 		 * to early fails cayman_vce_start() and thus nothing happens
   2092  1.3  riastrad 		 * there. So it is pointless to try to go through that code
   2093  1.3  riastrad 		 * hence why we disable vce here.
   2094  1.3  riastrad 		 */
   2095  1.3  riastrad 		rdev->has_vce = false;
   2096  1.3  riastrad 		return;
   2097  1.3  riastrad 	}
   2098  1.3  riastrad 	rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_obj = NULL;
   2099  1.3  riastrad 	r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE1_INDEX], 4096);
   2100  1.3  riastrad 	rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_obj = NULL;
   2101  1.3  riastrad 	r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE2_INDEX], 4096);
   2102  1.3  riastrad }
   2103  1.3  riastrad 
   2104  1.3  riastrad static void cayman_vce_start(struct radeon_device *rdev)
   2105  1.3  riastrad {
   2106  1.3  riastrad 	int r;
   2107  1.3  riastrad 
   2108  1.3  riastrad 	if (!rdev->has_vce)
   2109  1.3  riastrad 		return;
   2110  1.3  riastrad 
   2111  1.3  riastrad 	r = radeon_vce_resume(rdev);
   2112  1.3  riastrad 	if (r) {
   2113  1.3  riastrad 		dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
   2114  1.3  riastrad 		goto error;
   2115  1.3  riastrad 	}
   2116  1.3  riastrad 	r = vce_v1_0_resume(rdev);
   2117  1.3  riastrad 	if (r) {
   2118  1.3  riastrad 		dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
   2119  1.3  riastrad 		goto error;
   2120  1.3  riastrad 	}
   2121  1.3  riastrad 	r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE1_INDEX);
   2122  1.3  riastrad 	if (r) {
   2123  1.3  riastrad 		dev_err(rdev->dev, "failed initializing VCE1 fences (%d).\n", r);
   2124  1.3  riastrad 		goto error;
   2125  1.3  riastrad 	}
   2126  1.3  riastrad 	r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE2_INDEX);
   2127  1.3  riastrad 	if (r) {
   2128  1.3  riastrad 		dev_err(rdev->dev, "failed initializing VCE2 fences (%d).\n", r);
   2129  1.3  riastrad 		goto error;
   2130  1.3  riastrad 	}
   2131  1.3  riastrad 	return;
   2132  1.3  riastrad 
   2133  1.3  riastrad error:
   2134  1.3  riastrad 	rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
   2135  1.3  riastrad 	rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
   2136  1.3  riastrad }
   2137  1.3  riastrad 
   2138  1.3  riastrad static void cayman_vce_resume(struct radeon_device *rdev)
   2139  1.3  riastrad {
   2140  1.3  riastrad 	struct radeon_ring *ring;
   2141  1.3  riastrad 	int r;
   2142  1.3  riastrad 
   2143  1.3  riastrad 	if (!rdev->has_vce || !rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size)
   2144  1.3  riastrad 		return;
   2145  1.3  riastrad 
   2146  1.3  riastrad 	ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
   2147  1.3  riastrad 	r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0);
   2148  1.3  riastrad 	if (r) {
   2149  1.3  riastrad 		dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
   2150  1.3  riastrad 		return;
   2151  1.3  riastrad 	}
   2152  1.3  riastrad 	ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
   2153  1.3  riastrad 	r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0);
   2154  1.3  riastrad 	if (r) {
   2155  1.3  riastrad 		dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
   2156  1.3  riastrad 		return;
   2157  1.3  riastrad 	}
   2158  1.3  riastrad 	r = vce_v1_0_init(rdev);
   2159  1.3  riastrad 	if (r) {
   2160  1.3  riastrad 		dev_err(rdev->dev, "failed initializing VCE (%d).\n", r);
   2161  1.3  riastrad 		return;
   2162  1.3  riastrad 	}
   2163  1.3  riastrad }
   2164  1.3  riastrad 
   2165  1.1  riastrad static int cayman_startup(struct radeon_device *rdev)
   2166  1.1  riastrad {
   2167  1.1  riastrad 	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
   2168  1.1  riastrad 	int r;
   2169  1.1  riastrad 
   2170  1.1  riastrad 	/* enable pcie gen2 link */
   2171  1.1  riastrad 	evergreen_pcie_gen2_enable(rdev);
   2172  1.1  riastrad 	/* enable aspm */
   2173  1.1  riastrad 	evergreen_program_aspm(rdev);
   2174  1.1  riastrad 
   2175  1.1  riastrad 	/* scratch needs to be initialized before MC */
   2176  1.1  riastrad 	r = r600_vram_scratch_init(rdev);
   2177  1.1  riastrad 	if (r)
   2178  1.1  riastrad 		return r;
   2179  1.1  riastrad 
   2180  1.1  riastrad 	evergreen_mc_program(rdev);
   2181  1.1  riastrad 
   2182  1.1  riastrad 	if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) {
   2183  1.1  riastrad 		r = ni_mc_load_microcode(rdev);
   2184  1.1  riastrad 		if (r) {
   2185  1.1  riastrad 			DRM_ERROR("Failed to load MC firmware!\n");
   2186  1.1  riastrad 			return r;
   2187  1.1  riastrad 		}
   2188  1.1  riastrad 	}
   2189  1.1  riastrad 
   2190  1.1  riastrad 	r = cayman_pcie_gart_enable(rdev);
   2191  1.1  riastrad 	if (r)
   2192  1.1  riastrad 		return r;
   2193  1.1  riastrad 	cayman_gpu_init(rdev);
   2194  1.1  riastrad 
   2195  1.1  riastrad 	/* allocate rlc buffers */
   2196  1.1  riastrad 	if (rdev->flags & RADEON_IS_IGP) {
   2197  1.1  riastrad 		rdev->rlc.reg_list = tn_rlc_save_restore_register_list;
   2198  1.1  riastrad 		rdev->rlc.reg_list_size =
   2199  1.1  riastrad 			(u32)ARRAY_SIZE(tn_rlc_save_restore_register_list);
   2200  1.1  riastrad 		rdev->rlc.cs_data = cayman_cs_data;
   2201  1.1  riastrad 		r = sumo_rlc_init(rdev);
   2202  1.1  riastrad 		if (r) {
   2203  1.1  riastrad 			DRM_ERROR("Failed to init rlc BOs!\n");
   2204  1.1  riastrad 			return r;
   2205  1.1  riastrad 		}
   2206  1.1  riastrad 	}
   2207  1.1  riastrad 
   2208  1.1  riastrad 	/* allocate wb buffer */
   2209  1.1  riastrad 	r = radeon_wb_init(rdev);
   2210  1.1  riastrad 	if (r)
   2211  1.1  riastrad 		return r;
   2212  1.1  riastrad 
   2213  1.1  riastrad 	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
   2214  1.1  riastrad 	if (r) {
   2215  1.1  riastrad 		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
   2216  1.1  riastrad 		return r;
   2217  1.1  riastrad 	}
   2218  1.1  riastrad 
   2219  1.3  riastrad 	cayman_uvd_start(rdev);
   2220  1.3  riastrad 	cayman_vce_start(rdev);
   2221  1.1  riastrad 
   2222  1.1  riastrad 	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
   2223  1.1  riastrad 	if (r) {
   2224  1.1  riastrad 		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
   2225  1.1  riastrad 		return r;
   2226  1.1  riastrad 	}
   2227  1.1  riastrad 
   2228  1.1  riastrad 	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
   2229  1.1  riastrad 	if (r) {
   2230  1.1  riastrad 		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
   2231  1.1  riastrad 		return r;
   2232  1.1  riastrad 	}
   2233  1.1  riastrad 
   2234  1.1  riastrad 	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
   2235  1.1  riastrad 	if (r) {
   2236  1.1  riastrad 		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
   2237  1.1  riastrad 		return r;
   2238  1.1  riastrad 	}
   2239  1.1  riastrad 
   2240  1.1  riastrad 	r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_DMA1_INDEX);
   2241  1.1  riastrad 	if (r) {
   2242  1.1  riastrad 		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
   2243  1.1  riastrad 		return r;
   2244  1.1  riastrad 	}
   2245  1.1  riastrad 
   2246  1.1  riastrad 	/* Enable IRQ */
   2247  1.1  riastrad 	if (!rdev->irq.installed) {
   2248  1.1  riastrad 		r = radeon_irq_kms_init(rdev);
   2249  1.1  riastrad 		if (r)
   2250  1.1  riastrad 			return r;
   2251  1.1  riastrad 	}
   2252  1.1  riastrad 
   2253  1.1  riastrad 	r = r600_irq_init(rdev);
   2254  1.1  riastrad 	if (r) {
   2255  1.1  riastrad 		DRM_ERROR("radeon: IH init failed (%d).\n", r);
   2256  1.1  riastrad 		radeon_irq_kms_fini(rdev);
   2257  1.1  riastrad 		return r;
   2258  1.1  riastrad 	}
   2259  1.1  riastrad 	evergreen_irq_set(rdev);
   2260  1.1  riastrad 
   2261  1.1  riastrad 	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
   2262  1.1  riastrad 			     RADEON_CP_PACKET2);
   2263  1.1  riastrad 	if (r)
   2264  1.1  riastrad 		return r;
   2265  1.1  riastrad 
   2266  1.1  riastrad 	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
   2267  1.1  riastrad 	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
   2268  1.1  riastrad 			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
   2269  1.1  riastrad 	if (r)
   2270  1.1  riastrad 		return r;
   2271  1.1  riastrad 
   2272  1.1  riastrad 	ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
   2273  1.1  riastrad 	r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
   2274  1.1  riastrad 			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
   2275  1.1  riastrad 	if (r)
   2276  1.1  riastrad 		return r;
   2277  1.1  riastrad 
   2278  1.1  riastrad 	r = cayman_cp_load_microcode(rdev);
   2279  1.1  riastrad 	if (r)
   2280  1.1  riastrad 		return r;
   2281  1.1  riastrad 	r = cayman_cp_resume(rdev);
   2282  1.1  riastrad 	if (r)
   2283  1.1  riastrad 		return r;
   2284  1.1  riastrad 
   2285  1.1  riastrad 	r = cayman_dma_resume(rdev);
   2286  1.1  riastrad 	if (r)
   2287  1.1  riastrad 		return r;
   2288  1.1  riastrad 
   2289  1.3  riastrad 	cayman_uvd_resume(rdev);
   2290  1.3  riastrad 	cayman_vce_resume(rdev);
   2291  1.1  riastrad 
   2292  1.1  riastrad 	r = radeon_ib_pool_init(rdev);
   2293  1.1  riastrad 	if (r) {
   2294  1.1  riastrad 		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
   2295  1.1  riastrad 		return r;
   2296  1.1  riastrad 	}
   2297  1.1  riastrad 
   2298  1.1  riastrad 	r = radeon_vm_manager_init(rdev);
   2299  1.1  riastrad 	if (r) {
   2300  1.1  riastrad 		dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
   2301  1.1  riastrad 		return r;
   2302  1.1  riastrad 	}
   2303  1.1  riastrad 
   2304  1.1  riastrad 	r = radeon_audio_init(rdev);
   2305  1.1  riastrad 	if (r)
   2306  1.1  riastrad 		return r;
   2307  1.1  riastrad 
   2308  1.1  riastrad 	return 0;
   2309  1.1  riastrad }
   2310  1.1  riastrad 
   2311  1.1  riastrad int cayman_resume(struct radeon_device *rdev)
   2312  1.1  riastrad {
   2313  1.1  riastrad 	int r;
   2314  1.1  riastrad 
   2315  1.1  riastrad 	/* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
   2316  1.1  riastrad 	 * posting will perform necessary task to bring back GPU into good
   2317  1.1  riastrad 	 * shape.
   2318  1.1  riastrad 	 */
   2319  1.1  riastrad 	/* post card */
   2320  1.1  riastrad 	atom_asic_init(rdev->mode_info.atom_context);
   2321  1.1  riastrad 
   2322  1.1  riastrad 	/* init golden registers */
   2323  1.1  riastrad 	ni_init_golden_registers(rdev);
   2324  1.1  riastrad 
   2325  1.1  riastrad 	if (rdev->pm.pm_method == PM_METHOD_DPM)
   2326  1.1  riastrad 		radeon_pm_resume(rdev);
   2327  1.1  riastrad 
   2328  1.1  riastrad 	rdev->accel_working = true;
   2329  1.1  riastrad 	r = cayman_startup(rdev);
   2330  1.1  riastrad 	if (r) {
   2331  1.1  riastrad 		DRM_ERROR("cayman startup failed on resume\n");
   2332  1.1  riastrad 		rdev->accel_working = false;
   2333  1.1  riastrad 		return r;
   2334  1.1  riastrad 	}
   2335  1.1  riastrad 	return r;
   2336  1.1  riastrad }
   2337  1.1  riastrad 
   2338  1.1  riastrad int cayman_suspend(struct radeon_device *rdev)
   2339  1.1  riastrad {
   2340  1.1  riastrad 	radeon_pm_suspend(rdev);
   2341  1.1  riastrad 	radeon_audio_fini(rdev);
   2342  1.1  riastrad 	radeon_vm_manager_fini(rdev);
   2343  1.1  riastrad 	cayman_cp_enable(rdev, false);
   2344  1.1  riastrad 	cayman_dma_stop(rdev);
   2345  1.3  riastrad 	if (rdev->has_uvd) {
   2346  1.3  riastrad 		uvd_v1_0_fini(rdev);
   2347  1.3  riastrad 		radeon_uvd_suspend(rdev);
   2348  1.3  riastrad 	}
   2349  1.1  riastrad 	evergreen_irq_suspend(rdev);
   2350  1.1  riastrad 	radeon_wb_disable(rdev);
   2351  1.1  riastrad 	cayman_pcie_gart_disable(rdev);
   2352  1.1  riastrad 	return 0;
   2353  1.1  riastrad }
   2354  1.1  riastrad 
   2355  1.1  riastrad /* Plan is to move initialization in that function and use
   2356  1.1  riastrad  * helper function so that radeon_device_init pretty much
   2357  1.1  riastrad  * do nothing more than calling asic specific function. This
   2358  1.1  riastrad  * should also allow to remove a bunch of callback function
   2359  1.1  riastrad  * like vram_info.
   2360  1.1  riastrad  */
   2361  1.1  riastrad int cayman_init(struct radeon_device *rdev)
   2362  1.1  riastrad {
   2363  1.1  riastrad 	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
   2364  1.1  riastrad 	int r;
   2365  1.1  riastrad 
   2366  1.1  riastrad 	/* Read BIOS */
   2367  1.1  riastrad 	if (!radeon_get_bios(rdev)) {
   2368  1.1  riastrad 		if (ASIC_IS_AVIVO(rdev))
   2369  1.1  riastrad 			return -EINVAL;
   2370  1.1  riastrad 	}
   2371  1.1  riastrad 	/* Must be an ATOMBIOS */
   2372  1.1  riastrad 	if (!rdev->is_atom_bios) {
   2373  1.1  riastrad 		dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
   2374  1.1  riastrad 		return -EINVAL;
   2375  1.1  riastrad 	}
   2376  1.1  riastrad 	r = radeon_atombios_init(rdev);
   2377  1.1  riastrad 	if (r)
   2378  1.1  riastrad 		return r;
   2379  1.1  riastrad 
   2380  1.1  riastrad 	/* Post card if necessary */
   2381  1.1  riastrad 	if (!radeon_card_posted(rdev)) {
   2382  1.1  riastrad 		if (!rdev->bios) {
   2383  1.1  riastrad 			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
   2384  1.1  riastrad 			return -EINVAL;
   2385  1.1  riastrad 		}
   2386  1.1  riastrad 		DRM_INFO("GPU not posted. posting now...\n");
   2387  1.1  riastrad 		atom_asic_init(rdev->mode_info.atom_context);
   2388  1.1  riastrad 	}
   2389  1.1  riastrad 	/* init golden registers */
   2390  1.1  riastrad 	ni_init_golden_registers(rdev);
   2391  1.1  riastrad 	/* Initialize scratch registers */
   2392  1.1  riastrad 	r600_scratch_init(rdev);
   2393  1.1  riastrad 	/* Initialize surface registers */
   2394  1.1  riastrad 	radeon_surface_init(rdev);
   2395  1.1  riastrad 	/* Initialize clocks */
   2396  1.1  riastrad 	radeon_get_clock_info(rdev->ddev);
   2397  1.1  riastrad 	/* Fence driver */
   2398  1.1  riastrad 	r = radeon_fence_driver_init(rdev);
   2399  1.1  riastrad 	if (r)
   2400  1.1  riastrad 		return r;
   2401  1.1  riastrad 	/* initialize memory controller */
   2402  1.1  riastrad 	r = evergreen_mc_init(rdev);
   2403  1.1  riastrad 	if (r)
   2404  1.1  riastrad 		return r;
   2405  1.1  riastrad 	/* Memory manager */
   2406  1.1  riastrad 	r = radeon_bo_init(rdev);
   2407  1.1  riastrad 	if (r)
   2408  1.1  riastrad 		return r;
   2409  1.1  riastrad 
   2410  1.1  riastrad 	if (rdev->flags & RADEON_IS_IGP) {
   2411  1.1  riastrad 		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
   2412  1.1  riastrad 			r = ni_init_microcode(rdev);
   2413  1.1  riastrad 			if (r) {
   2414  1.1  riastrad 				DRM_ERROR("Failed to load firmware!\n");
   2415  1.1  riastrad 				return r;
   2416  1.1  riastrad 			}
   2417  1.1  riastrad 		}
   2418  1.1  riastrad 	} else {
   2419  1.1  riastrad 		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
   2420  1.1  riastrad 			r = ni_init_microcode(rdev);
   2421  1.1  riastrad 			if (r) {
   2422  1.1  riastrad 				DRM_ERROR("Failed to load firmware!\n");
   2423  1.1  riastrad 				return r;
   2424  1.1  riastrad 			}
   2425  1.1  riastrad 		}
   2426  1.1  riastrad 	}
   2427  1.1  riastrad 
   2428  1.1  riastrad 	/* Initialize power management */
   2429  1.1  riastrad 	radeon_pm_init(rdev);
   2430  1.1  riastrad 
   2431  1.1  riastrad 	ring->ring_obj = NULL;
   2432  1.1  riastrad 	r600_ring_init(rdev, ring, 1024 * 1024);
   2433  1.1  riastrad 
   2434  1.1  riastrad 	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
   2435  1.1  riastrad 	ring->ring_obj = NULL;
   2436  1.1  riastrad 	r600_ring_init(rdev, ring, 64 * 1024);
   2437  1.1  riastrad 
   2438  1.1  riastrad 	ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
   2439  1.1  riastrad 	ring->ring_obj = NULL;
   2440  1.1  riastrad 	r600_ring_init(rdev, ring, 64 * 1024);
   2441  1.1  riastrad 
   2442  1.3  riastrad 	cayman_uvd_init(rdev);
   2443  1.3  riastrad 	cayman_vce_init(rdev);
   2444  1.1  riastrad 
   2445  1.1  riastrad 	rdev->ih.ring_obj = NULL;
   2446  1.1  riastrad 	r600_ih_ring_init(rdev, 64 * 1024);
   2447  1.1  riastrad 
   2448  1.1  riastrad 	r = r600_pcie_gart_init(rdev);
   2449  1.1  riastrad 	if (r)
   2450  1.1  riastrad 		return r;
   2451  1.1  riastrad 
   2452  1.1  riastrad 	rdev->accel_working = true;
   2453  1.1  riastrad 	r = cayman_startup(rdev);
   2454  1.1  riastrad 	if (r) {
   2455  1.1  riastrad 		dev_err(rdev->dev, "disabling GPU acceleration\n");
   2456  1.1  riastrad 		cayman_cp_fini(rdev);
   2457  1.1  riastrad 		cayman_dma_fini(rdev);
   2458  1.1  riastrad 		r600_irq_fini(rdev);
   2459  1.1  riastrad 		if (rdev->flags & RADEON_IS_IGP)
   2460  1.1  riastrad 			sumo_rlc_fini(rdev);
   2461  1.1  riastrad 		radeon_wb_fini(rdev);
   2462  1.1  riastrad 		radeon_ib_pool_fini(rdev);
   2463  1.1  riastrad 		radeon_vm_manager_fini(rdev);
   2464  1.1  riastrad 		radeon_irq_kms_fini(rdev);
   2465  1.1  riastrad 		cayman_pcie_gart_fini(rdev);
   2466  1.1  riastrad 		rdev->accel_working = false;
   2467  1.1  riastrad 	}
   2468  1.1  riastrad 
   2469  1.1  riastrad 	/* Don't start up if the MC ucode is missing.
   2470  1.1  riastrad 	 * The default clocks and voltages before the MC ucode
   2471  1.1  riastrad 	 * is loaded are not suffient for advanced operations.
   2472  1.1  riastrad 	 *
   2473  1.1  riastrad 	 * We can skip this check for TN, because there is no MC
   2474  1.1  riastrad 	 * ucode.
   2475  1.1  riastrad 	 */
   2476  1.1  riastrad 	if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
   2477  1.1  riastrad 		DRM_ERROR("radeon: MC ucode required for NI+.\n");
   2478  1.1  riastrad 		return -EINVAL;
   2479  1.1  riastrad 	}
   2480  1.1  riastrad 
   2481  1.1  riastrad 	return 0;
   2482  1.1  riastrad }
   2483  1.1  riastrad 
   2484  1.1  riastrad void cayman_fini(struct radeon_device *rdev)
   2485  1.1  riastrad {
   2486  1.1  riastrad 	radeon_pm_fini(rdev);
   2487  1.1  riastrad 	cayman_cp_fini(rdev);
   2488  1.1  riastrad 	cayman_dma_fini(rdev);
   2489  1.1  riastrad 	r600_irq_fini(rdev);
   2490  1.1  riastrad 	if (rdev->flags & RADEON_IS_IGP)
   2491  1.1  riastrad 		sumo_rlc_fini(rdev);
   2492  1.1  riastrad 	radeon_wb_fini(rdev);
   2493  1.1  riastrad 	radeon_vm_manager_fini(rdev);
   2494  1.1  riastrad 	radeon_ib_pool_fini(rdev);
   2495  1.1  riastrad 	radeon_irq_kms_fini(rdev);
   2496  1.1  riastrad 	uvd_v1_0_fini(rdev);
   2497  1.1  riastrad 	radeon_uvd_fini(rdev);
   2498  1.3  riastrad 	if (rdev->has_vce)
   2499  1.1  riastrad 		radeon_vce_fini(rdev);
   2500  1.1  riastrad 	cayman_pcie_gart_fini(rdev);
   2501  1.1  riastrad 	r600_vram_scratch_fini(rdev);
   2502  1.1  riastrad 	radeon_gem_fini(rdev);
   2503  1.1  riastrad 	radeon_fence_driver_fini(rdev);
   2504  1.1  riastrad 	radeon_bo_fini(rdev);
   2505  1.1  riastrad 	radeon_atombios_fini(rdev);
   2506  1.1  riastrad 	kfree(rdev->bios);
   2507  1.1  riastrad 	rdev->bios = NULL;
   2508  1.1  riastrad }
   2509  1.1  riastrad 
   2510  1.1  riastrad /*
   2511  1.1  riastrad  * vm
   2512  1.1  riastrad  */
   2513  1.1  riastrad int cayman_vm_init(struct radeon_device *rdev)
   2514  1.1  riastrad {
   2515  1.1  riastrad 	/* number of VMs */
   2516  1.1  riastrad 	rdev->vm_manager.nvm = 8;
   2517  1.1  riastrad 	/* base offset of vram pages */
   2518  1.1  riastrad 	if (rdev->flags & RADEON_IS_IGP) {
   2519  1.1  riastrad 		u64 tmp = RREG32(FUS_MC_VM_FB_OFFSET);
   2520  1.1  riastrad 		tmp <<= 22;
   2521  1.1  riastrad 		rdev->vm_manager.vram_base_offset = tmp;
   2522  1.1  riastrad 	} else
   2523  1.1  riastrad 		rdev->vm_manager.vram_base_offset = 0;
   2524  1.1  riastrad 	return 0;
   2525  1.1  riastrad }
   2526  1.1  riastrad 
   2527  1.1  riastrad void cayman_vm_fini(struct radeon_device *rdev)
   2528  1.1  riastrad {
   2529  1.1  riastrad }
   2530  1.1  riastrad 
   2531  1.1  riastrad /**
   2532  1.1  riastrad  * cayman_vm_decode_fault - print human readable fault info
   2533  1.1  riastrad  *
   2534  1.1  riastrad  * @rdev: radeon_device pointer
   2535  1.1  riastrad  * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
   2536  1.1  riastrad  * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
   2537  1.1  riastrad  *
   2538  1.1  riastrad  * Print human readable fault information (cayman/TN).
   2539  1.1  riastrad  */
   2540  1.1  riastrad void cayman_vm_decode_fault(struct radeon_device *rdev,
   2541  1.1  riastrad 			    u32 status, u32 addr)
   2542  1.1  riastrad {
   2543  1.1  riastrad 	u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
   2544  1.1  riastrad 	u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
   2545  1.1  riastrad 	u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
   2546  1.1  riastrad 	const char *block;
   2547  1.1  riastrad 
   2548  1.1  riastrad 	switch (mc_id) {
   2549  1.1  riastrad 	case 32:
   2550  1.1  riastrad 	case 16:
   2551  1.1  riastrad 	case 96:
   2552  1.1  riastrad 	case 80:
   2553  1.1  riastrad 	case 160:
   2554  1.1  riastrad 	case 144:
   2555  1.1  riastrad 	case 224:
   2556  1.1  riastrad 	case 208:
   2557  1.1  riastrad 		block = "CB";
   2558  1.1  riastrad 		break;
   2559  1.1  riastrad 	case 33:
   2560  1.1  riastrad 	case 17:
   2561  1.1  riastrad 	case 97:
   2562  1.1  riastrad 	case 81:
   2563  1.1  riastrad 	case 161:
   2564  1.1  riastrad 	case 145:
   2565  1.1  riastrad 	case 225:
   2566  1.1  riastrad 	case 209:
   2567  1.1  riastrad 		block = "CB_FMASK";
   2568  1.1  riastrad 		break;
   2569  1.1  riastrad 	case 34:
   2570  1.1  riastrad 	case 18:
   2571  1.1  riastrad 	case 98:
   2572  1.1  riastrad 	case 82:
   2573  1.1  riastrad 	case 162:
   2574  1.1  riastrad 	case 146:
   2575  1.1  riastrad 	case 226:
   2576  1.1  riastrad 	case 210:
   2577  1.1  riastrad 		block = "CB_CMASK";
   2578  1.1  riastrad 		break;
   2579  1.1  riastrad 	case 35:
   2580  1.1  riastrad 	case 19:
   2581  1.1  riastrad 	case 99:
   2582  1.1  riastrad 	case 83:
   2583  1.1  riastrad 	case 163:
   2584  1.1  riastrad 	case 147:
   2585  1.1  riastrad 	case 227:
   2586  1.1  riastrad 	case 211:
   2587  1.1  riastrad 		block = "CB_IMMED";
   2588  1.1  riastrad 		break;
   2589  1.1  riastrad 	case 36:
   2590  1.1  riastrad 	case 20:
   2591  1.1  riastrad 	case 100:
   2592  1.1  riastrad 	case 84:
   2593  1.1  riastrad 	case 164:
   2594  1.1  riastrad 	case 148:
   2595  1.1  riastrad 	case 228:
   2596  1.1  riastrad 	case 212:
   2597  1.1  riastrad 		block = "DB";
   2598  1.1  riastrad 		break;
   2599  1.1  riastrad 	case 37:
   2600  1.1  riastrad 	case 21:
   2601  1.1  riastrad 	case 101:
   2602  1.1  riastrad 	case 85:
   2603  1.1  riastrad 	case 165:
   2604  1.1  riastrad 	case 149:
   2605  1.1  riastrad 	case 229:
   2606  1.1  riastrad 	case 213:
   2607  1.1  riastrad 		block = "DB_HTILE";
   2608  1.1  riastrad 		break;
   2609  1.1  riastrad 	case 38:
   2610  1.1  riastrad 	case 22:
   2611  1.1  riastrad 	case 102:
   2612  1.1  riastrad 	case 86:
   2613  1.1  riastrad 	case 166:
   2614  1.1  riastrad 	case 150:
   2615  1.1  riastrad 	case 230:
   2616  1.1  riastrad 	case 214:
   2617  1.1  riastrad 		block = "SX";
   2618  1.1  riastrad 		break;
   2619  1.1  riastrad 	case 39:
   2620  1.1  riastrad 	case 23:
   2621  1.1  riastrad 	case 103:
   2622  1.1  riastrad 	case 87:
   2623  1.1  riastrad 	case 167:
   2624  1.1  riastrad 	case 151:
   2625  1.1  riastrad 	case 231:
   2626  1.1  riastrad 	case 215:
   2627  1.1  riastrad 		block = "DB_STEN";
   2628  1.1  riastrad 		break;
   2629  1.1  riastrad 	case 40:
   2630  1.1  riastrad 	case 24:
   2631  1.1  riastrad 	case 104:
   2632  1.1  riastrad 	case 88:
   2633  1.1  riastrad 	case 232:
   2634  1.1  riastrad 	case 216:
   2635  1.1  riastrad 	case 168:
   2636  1.1  riastrad 	case 152:
   2637  1.1  riastrad 		block = "TC_TFETCH";
   2638  1.1  riastrad 		break;
   2639  1.1  riastrad 	case 41:
   2640  1.1  riastrad 	case 25:
   2641  1.1  riastrad 	case 105:
   2642  1.1  riastrad 	case 89:
   2643  1.1  riastrad 	case 233:
   2644  1.1  riastrad 	case 217:
   2645  1.1  riastrad 	case 169:
   2646  1.1  riastrad 	case 153:
   2647  1.1  riastrad 		block = "TC_VFETCH";
   2648  1.1  riastrad 		break;
   2649  1.1  riastrad 	case 42:
   2650  1.1  riastrad 	case 26:
   2651  1.1  riastrad 	case 106:
   2652  1.1  riastrad 	case 90:
   2653  1.1  riastrad 	case 234:
   2654  1.1  riastrad 	case 218:
   2655  1.1  riastrad 	case 170:
   2656  1.1  riastrad 	case 154:
   2657  1.1  riastrad 		block = "VC";
   2658  1.1  riastrad 		break;
   2659  1.1  riastrad 	case 112:
   2660  1.1  riastrad 		block = "CP";
   2661  1.1  riastrad 		break;
   2662  1.1  riastrad 	case 113:
   2663  1.1  riastrad 	case 114:
   2664  1.1  riastrad 		block = "SH";
   2665  1.1  riastrad 		break;
   2666  1.1  riastrad 	case 115:
   2667  1.1  riastrad 		block = "VGT";
   2668  1.1  riastrad 		break;
   2669  1.1  riastrad 	case 178:
   2670  1.1  riastrad 		block = "IH";
   2671  1.1  riastrad 		break;
   2672  1.1  riastrad 	case 51:
   2673  1.1  riastrad 		block = "RLC";
   2674  1.1  riastrad 		break;
   2675  1.1  riastrad 	case 55:
   2676  1.1  riastrad 		block = "DMA";
   2677  1.1  riastrad 		break;
   2678  1.1  riastrad 	case 56:
   2679  1.1  riastrad 		block = "HDP";
   2680  1.1  riastrad 		break;
   2681  1.1  riastrad 	default:
   2682  1.1  riastrad 		block = "unknown";
   2683  1.1  riastrad 		break;
   2684  1.1  riastrad 	}
   2685  1.1  riastrad 
   2686  1.1  riastrad 	printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n",
   2687  1.1  riastrad 	       protections, vmid, addr,
   2688  1.1  riastrad 	       (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
   2689  1.1  riastrad 	       block, mc_id);
   2690  1.1  riastrad }
   2691  1.1  riastrad 
   2692  1.1  riastrad /**
   2693  1.1  riastrad  * cayman_vm_flush - vm flush using the CP
   2694  1.1  riastrad  *
   2695  1.1  riastrad  * @rdev: radeon_device pointer
   2696  1.1  riastrad  *
   2697  1.1  riastrad  * Update the page table base and flush the VM TLB
   2698  1.1  riastrad  * using the CP (cayman-si).
   2699  1.1  riastrad  */
   2700  1.1  riastrad void cayman_vm_flush(struct radeon_device *rdev, struct radeon_ring *ring,
   2701  1.1  riastrad 		     unsigned vm_id, uint64_t pd_addr)
   2702  1.1  riastrad {
   2703  1.1  riastrad 	radeon_ring_write(ring, PACKET0(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm_id << 2), 0));
   2704  1.1  riastrad 	radeon_ring_write(ring, pd_addr >> 12);
   2705  1.1  riastrad 
   2706  1.1  riastrad 	/* flush hdp cache */
   2707  1.1  riastrad 	radeon_ring_write(ring, PACKET0(HDP_MEM_COHERENCY_FLUSH_CNTL, 0));
   2708  1.1  riastrad 	radeon_ring_write(ring, 0x1);
   2709  1.1  riastrad 
   2710  1.1  riastrad 	/* bits 0-7 are the VM contexts0-7 */
   2711  1.1  riastrad 	radeon_ring_write(ring, PACKET0(VM_INVALIDATE_REQUEST, 0));
   2712  1.1  riastrad 	radeon_ring_write(ring, 1 << vm_id);
   2713  1.1  riastrad 
   2714  1.1  riastrad 	/* wait for the invalidate to complete */
   2715  1.1  riastrad 	radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
   2716  1.1  riastrad 	radeon_ring_write(ring, (WAIT_REG_MEM_FUNCTION(0) |  /* always */
   2717  1.1  riastrad 				 WAIT_REG_MEM_ENGINE(0))); /* me */
   2718  1.1  riastrad 	radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
   2719  1.1  riastrad 	radeon_ring_write(ring, 0);
   2720  1.1  riastrad 	radeon_ring_write(ring, 0); /* ref */
   2721  1.1  riastrad 	radeon_ring_write(ring, 0); /* mask */
   2722  1.1  riastrad 	radeon_ring_write(ring, 0x20); /* poll interval */
   2723  1.1  riastrad 
   2724  1.1  riastrad 	/* sync PFP to ME, otherwise we might get invalid PFP reads */
   2725  1.1  riastrad 	radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
   2726  1.1  riastrad 	radeon_ring_write(ring, 0x0);
   2727  1.1  riastrad }
   2728  1.1  riastrad 
   2729  1.1  riastrad int tn_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk)
   2730  1.1  riastrad {
   2731  1.1  riastrad 	struct atom_clock_dividers dividers;
   2732  1.1  riastrad 	int r, i;
   2733  1.1  riastrad 
   2734  1.3  riastrad 	r = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
   2735  1.1  riastrad 					   ecclk, false, &dividers);
   2736  1.1  riastrad 	if (r)
   2737  1.1  riastrad 		return r;
   2738  1.1  riastrad 
   2739  1.1  riastrad 	for (i = 0; i < 100; i++) {
   2740  1.1  riastrad 		if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS)
   2741  1.1  riastrad 			break;
   2742  1.1  riastrad 		mdelay(10);
   2743  1.1  riastrad 	}
   2744  1.1  riastrad 	if (i == 100)
   2745  1.1  riastrad 		return -ETIMEDOUT;
   2746  1.1  riastrad 
   2747  1.1  riastrad 	WREG32_P(CG_ECLK_CNTL, dividers.post_div, ~(ECLK_DIR_CNTL_EN|ECLK_DIVIDER_MASK));
   2748  1.1  riastrad 
   2749  1.1  riastrad 	for (i = 0; i < 100; i++) {
   2750  1.1  riastrad 		if (RREG32(CG_ECLK_STATUS) & ECLK_STATUS)
   2751  1.1  riastrad 			break;
   2752  1.1  riastrad 		mdelay(10);
   2753  1.1  riastrad 	}
   2754  1.1  riastrad 	if (i == 100)
   2755  1.1  riastrad 		return -ETIMEDOUT;
   2756  1.1  riastrad 
   2757  1.1  riastrad 	return 0;
   2758  1.1  riastrad }
   2759