Home | History | Annotate | Line # | Download | only in radeon
      1  1.3       mrg /*	$NetBSD: radeon_rv770.c,v 1.3 2023/09/30 10:46:45 mrg Exp $	*/
      2  1.1  riastrad 
      3  1.1  riastrad /*
      4  1.1  riastrad  * Copyright 2008 Advanced Micro Devices, Inc.
      5  1.1  riastrad  * Copyright 2008 Red Hat Inc.
      6  1.1  riastrad  * Copyright 2009 Jerome Glisse.
      7  1.1  riastrad  *
      8  1.1  riastrad  * Permission is hereby granted, free of charge, to any person obtaining a
      9  1.1  riastrad  * copy of this software and associated documentation files (the "Software"),
     10  1.1  riastrad  * to deal in the Software without restriction, including without limitation
     11  1.1  riastrad  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     12  1.1  riastrad  * and/or sell copies of the Software, and to permit persons to whom the
     13  1.1  riastrad  * Software is furnished to do so, subject to the following conditions:
     14  1.1  riastrad  *
     15  1.1  riastrad  * The above copyright notice and this permission notice shall be included in
     16  1.1  riastrad  * all copies or substantial portions of the Software.
     17  1.1  riastrad  *
     18  1.1  riastrad  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     19  1.1  riastrad  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     20  1.1  riastrad  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     21  1.1  riastrad  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     22  1.1  riastrad  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     23  1.1  riastrad  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     24  1.1  riastrad  * OTHER DEALINGS IN THE SOFTWARE.
     25  1.1  riastrad  *
     26  1.1  riastrad  * Authors: Dave Airlie
     27  1.1  riastrad  *          Alex Deucher
     28  1.1  riastrad  *          Jerome Glisse
     29  1.1  riastrad  */
     30  1.2  riastrad 
     31  1.1  riastrad #include <sys/cdefs.h>
     32  1.3       mrg __KERNEL_RCSID(0, "$NetBSD: radeon_rv770.c,v 1.3 2023/09/30 10:46:45 mrg Exp $");
     33  1.1  riastrad 
     34  1.1  riastrad #include <linux/firmware.h>
     35  1.2  riastrad #include <linux/pci.h>
     36  1.1  riastrad #include <linux/slab.h>
     37  1.2  riastrad 
     38  1.2  riastrad #include <drm/drm_device.h>
     39  1.2  riastrad #include <drm/radeon_drm.h>
     40  1.2  riastrad 
     41  1.2  riastrad #include "atom.h"
     42  1.2  riastrad #include "avivod.h"
     43  1.1  riastrad #include "radeon.h"
     44  1.1  riastrad #include "radeon_asic.h"
     45  1.1  riastrad #include "radeon_audio.h"
     46  1.1  riastrad #include "rv770d.h"
     47  1.1  riastrad 
     48  1.1  riastrad #define R700_PFP_UCODE_SIZE 848
     49  1.1  riastrad #define R700_PM4_UCODE_SIZE 1360
     50  1.1  riastrad 
     51  1.1  riastrad static void rv770_gpu_init(struct radeon_device *rdev);
     52  1.1  riastrad void rv770_fini(struct radeon_device *rdev);
     53  1.1  riastrad static void rv770_pcie_gen2_enable(struct radeon_device *rdev);
     54  1.1  riastrad int evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk);
     55  1.1  riastrad 
     56  1.1  riastrad int rv770_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
     57  1.1  riastrad {
     58  1.1  riastrad 	unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
     59  1.1  riastrad 	int r;
     60  1.1  riastrad 
     61  1.1  riastrad 	/* RV740 uses evergreen uvd clk programming */
     62  1.1  riastrad 	if (rdev->family == CHIP_RV740)
     63  1.1  riastrad 		return evergreen_set_uvd_clocks(rdev, vclk, dclk);
     64  1.1  riastrad 
     65  1.1  riastrad 	/* bypass vclk and dclk with bclk */
     66  1.1  riastrad 	WREG32_P(CG_UPLL_FUNC_CNTL_2,
     67  1.1  riastrad 		 VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
     68  1.1  riastrad 		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
     69  1.1  riastrad 
     70  1.1  riastrad 	if (!vclk || !dclk) {
     71  1.1  riastrad 		/* keep the Bypass mode, put PLL to sleep */
     72  1.1  riastrad 		WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
     73  1.1  riastrad 		return 0;
     74  1.1  riastrad 	}
     75  1.1  riastrad 
     76  1.1  riastrad 	r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 50000, 160000,
     77  1.1  riastrad 					  43663, 0x03FFFFFE, 1, 30, ~0,
     78  1.1  riastrad 					  &fb_div, &vclk_div, &dclk_div);
     79  1.1  riastrad 	if (r)
     80  1.1  riastrad 		return r;
     81  1.1  riastrad 
     82  1.1  riastrad 	fb_div |= 1;
     83  1.1  riastrad 	vclk_div -= 1;
     84  1.1  riastrad 	dclk_div -= 1;
     85  1.1  riastrad 
     86  1.1  riastrad 	/* set UPLL_FB_DIV to 0x50000 */
     87  1.1  riastrad 	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(0x50000), ~UPLL_FB_DIV_MASK);
     88  1.1  riastrad 
     89  1.1  riastrad 	/* deassert UPLL_RESET and UPLL_SLEEP */
     90  1.1  riastrad 	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~(UPLL_RESET_MASK | UPLL_SLEEP_MASK));
     91  1.1  riastrad 
     92  1.1  riastrad 	/* assert BYPASS EN and FB_DIV[0] <- ??? why? */
     93  1.1  riastrad 	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
     94  1.1  riastrad 	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(1), ~UPLL_FB_DIV(1));
     95  1.1  riastrad 
     96  1.1  riastrad 	r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
     97  1.1  riastrad 	if (r)
     98  1.1  riastrad 		return r;
     99  1.1  riastrad 
    100  1.1  riastrad 	/* assert PLL_RESET */
    101  1.1  riastrad 	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
    102  1.1  riastrad 
    103  1.1  riastrad 	/* set the required FB_DIV, REF_DIV, Post divder values */
    104  1.1  riastrad 	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_REF_DIV(1), ~UPLL_REF_DIV_MASK);
    105  1.1  riastrad 	WREG32_P(CG_UPLL_FUNC_CNTL_2,
    106  1.1  riastrad 		 UPLL_SW_HILEN(vclk_div >> 1) |
    107  1.1  riastrad 		 UPLL_SW_LOLEN((vclk_div >> 1) + (vclk_div & 1)) |
    108  1.1  riastrad 		 UPLL_SW_HILEN2(dclk_div >> 1) |
    109  1.1  riastrad 		 UPLL_SW_LOLEN2((dclk_div >> 1) + (dclk_div & 1)),
    110  1.1  riastrad 		 ~UPLL_SW_MASK);
    111  1.1  riastrad 
    112  1.1  riastrad 	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div),
    113  1.1  riastrad 		 ~UPLL_FB_DIV_MASK);
    114  1.1  riastrad 
    115  1.1  riastrad 	/* give the PLL some time to settle */
    116  1.1  riastrad 	mdelay(15);
    117  1.1  riastrad 
    118  1.1  riastrad 	/* deassert PLL_RESET */
    119  1.1  riastrad 	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
    120  1.1  riastrad 
    121  1.1  riastrad 	mdelay(15);
    122  1.1  riastrad 
    123  1.1  riastrad 	/* deassert BYPASS EN and FB_DIV[0] <- ??? why? */
    124  1.1  riastrad 	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
    125  1.1  riastrad 	WREG32_P(CG_UPLL_FUNC_CNTL_3, 0, ~UPLL_FB_DIV(1));
    126  1.1  riastrad 
    127  1.1  riastrad 	r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
    128  1.1  riastrad 	if (r)
    129  1.1  riastrad 		return r;
    130  1.1  riastrad 
    131  1.1  riastrad 	/* switch VCLK and DCLK selection */
    132  1.1  riastrad 	WREG32_P(CG_UPLL_FUNC_CNTL_2,
    133  1.1  riastrad 		 VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
    134  1.1  riastrad 		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
    135  1.1  riastrad 
    136  1.1  riastrad 	mdelay(100);
    137  1.1  riastrad 
    138  1.1  riastrad 	return 0;
    139  1.1  riastrad }
    140  1.1  riastrad 
    141  1.1  riastrad static const u32 r7xx_golden_registers[] =
    142  1.1  riastrad {
    143  1.1  riastrad 	0x8d00, 0xffffffff, 0x0e0e0074,
    144  1.1  riastrad 	0x8d04, 0xffffffff, 0x013a2b34,
    145  1.1  riastrad 	0x9508, 0xffffffff, 0x00000002,
    146  1.1  riastrad 	0x8b20, 0xffffffff, 0,
    147  1.1  riastrad 	0x88c4, 0xffffffff, 0x000000c2,
    148  1.1  riastrad 	0x28350, 0xffffffff, 0,
    149  1.1  riastrad 	0x9058, 0xffffffff, 0x0fffc40f,
    150  1.1  riastrad 	0x240c, 0xffffffff, 0x00000380,
    151  1.1  riastrad 	0x733c, 0xffffffff, 0x00000002,
    152  1.1  riastrad 	0x2650, 0x00040000, 0,
    153  1.1  riastrad 	0x20bc, 0x00040000, 0,
    154  1.1  riastrad 	0x7300, 0xffffffff, 0x001000f0
    155  1.1  riastrad };
    156  1.1  riastrad 
    157  1.1  riastrad static const u32 r7xx_golden_dyn_gpr_registers[] =
    158  1.1  riastrad {
    159  1.1  riastrad 	0x8db0, 0xffffffff, 0x98989898,
    160  1.1  riastrad 	0x8db4, 0xffffffff, 0x98989898,
    161  1.1  riastrad 	0x8db8, 0xffffffff, 0x98989898,
    162  1.1  riastrad 	0x8dbc, 0xffffffff, 0x98989898,
    163  1.1  riastrad 	0x8dc0, 0xffffffff, 0x98989898,
    164  1.1  riastrad 	0x8dc4, 0xffffffff, 0x98989898,
    165  1.1  riastrad 	0x8dc8, 0xffffffff, 0x98989898,
    166  1.1  riastrad 	0x8dcc, 0xffffffff, 0x98989898,
    167  1.1  riastrad 	0x88c4, 0xffffffff, 0x00000082
    168  1.1  riastrad };
    169  1.1  riastrad 
    170  1.1  riastrad static const u32 rv770_golden_registers[] =
    171  1.1  riastrad {
    172  1.1  riastrad 	0x562c, 0xffffffff, 0,
    173  1.1  riastrad 	0x3f90, 0xffffffff, 0,
    174  1.1  riastrad 	0x9148, 0xffffffff, 0,
    175  1.1  riastrad 	0x3f94, 0xffffffff, 0,
    176  1.1  riastrad 	0x914c, 0xffffffff, 0,
    177  1.1  riastrad 	0x9698, 0x18000000, 0x18000000
    178  1.1  riastrad };
    179  1.1  riastrad 
    180  1.1  riastrad static const u32 rv770ce_golden_registers[] =
    181  1.1  riastrad {
    182  1.1  riastrad 	0x562c, 0xffffffff, 0,
    183  1.1  riastrad 	0x3f90, 0xffffffff, 0x00cc0000,
    184  1.1  riastrad 	0x9148, 0xffffffff, 0x00cc0000,
    185  1.1  riastrad 	0x3f94, 0xffffffff, 0x00cc0000,
    186  1.1  riastrad 	0x914c, 0xffffffff, 0x00cc0000,
    187  1.1  riastrad 	0x9b7c, 0xffffffff, 0x00fa0000,
    188  1.1  riastrad 	0x3f8c, 0xffffffff, 0x00fa0000,
    189  1.1  riastrad 	0x9698, 0x18000000, 0x18000000
    190  1.1  riastrad };
    191  1.1  riastrad 
    192  1.1  riastrad static const u32 rv770_mgcg_init[] =
    193  1.1  riastrad {
    194  1.1  riastrad 	0x8bcc, 0xffffffff, 0x130300f9,
    195  1.1  riastrad 	0x5448, 0xffffffff, 0x100,
    196  1.1  riastrad 	0x55e4, 0xffffffff, 0x100,
    197  1.1  riastrad 	0x160c, 0xffffffff, 0x100,
    198  1.1  riastrad 	0x5644, 0xffffffff, 0x100,
    199  1.1  riastrad 	0xc164, 0xffffffff, 0x100,
    200  1.1  riastrad 	0x8a18, 0xffffffff, 0x100,
    201  1.1  riastrad 	0x897c, 0xffffffff, 0x8000100,
    202  1.1  riastrad 	0x8b28, 0xffffffff, 0x3c000100,
    203  1.1  riastrad 	0x9144, 0xffffffff, 0x100,
    204  1.1  riastrad 	0x9a1c, 0xffffffff, 0x10000,
    205  1.1  riastrad 	0x9a50, 0xffffffff, 0x100,
    206  1.1  riastrad 	0x9a1c, 0xffffffff, 0x10001,
    207  1.1  riastrad 	0x9a50, 0xffffffff, 0x100,
    208  1.1  riastrad 	0x9a1c, 0xffffffff, 0x10002,
    209  1.1  riastrad 	0x9a50, 0xffffffff, 0x100,
    210  1.1  riastrad 	0x9a1c, 0xffffffff, 0x10003,
    211  1.1  riastrad 	0x9a50, 0xffffffff, 0x100,
    212  1.1  riastrad 	0x9a1c, 0xffffffff, 0x0,
    213  1.1  riastrad 	0x9870, 0xffffffff, 0x100,
    214  1.1  riastrad 	0x8d58, 0xffffffff, 0x100,
    215  1.1  riastrad 	0x9500, 0xffffffff, 0x0,
    216  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    217  1.1  riastrad 	0x9500, 0xffffffff, 0x1,
    218  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    219  1.1  riastrad 	0x9500, 0xffffffff, 0x2,
    220  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    221  1.1  riastrad 	0x9500, 0xffffffff, 0x3,
    222  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    223  1.1  riastrad 	0x9500, 0xffffffff, 0x4,
    224  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    225  1.1  riastrad 	0x9500, 0xffffffff, 0x5,
    226  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    227  1.1  riastrad 	0x9500, 0xffffffff, 0x6,
    228  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    229  1.1  riastrad 	0x9500, 0xffffffff, 0x7,
    230  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    231  1.1  riastrad 	0x9500, 0xffffffff, 0x8,
    232  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    233  1.1  riastrad 	0x9500, 0xffffffff, 0x9,
    234  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    235  1.1  riastrad 	0x9500, 0xffffffff, 0x8000,
    236  1.1  riastrad 	0x9490, 0xffffffff, 0x0,
    237  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    238  1.1  riastrad 	0x9490, 0xffffffff, 0x1,
    239  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    240  1.1  riastrad 	0x9490, 0xffffffff, 0x2,
    241  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    242  1.1  riastrad 	0x9490, 0xffffffff, 0x3,
    243  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    244  1.1  riastrad 	0x9490, 0xffffffff, 0x4,
    245  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    246  1.1  riastrad 	0x9490, 0xffffffff, 0x5,
    247  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    248  1.1  riastrad 	0x9490, 0xffffffff, 0x6,
    249  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    250  1.1  riastrad 	0x9490, 0xffffffff, 0x7,
    251  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    252  1.1  riastrad 	0x9490, 0xffffffff, 0x8,
    253  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    254  1.1  riastrad 	0x9490, 0xffffffff, 0x9,
    255  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    256  1.1  riastrad 	0x9490, 0xffffffff, 0x8000,
    257  1.1  riastrad 	0x9604, 0xffffffff, 0x0,
    258  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    259  1.1  riastrad 	0x9604, 0xffffffff, 0x1,
    260  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    261  1.1  riastrad 	0x9604, 0xffffffff, 0x2,
    262  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    263  1.1  riastrad 	0x9604, 0xffffffff, 0x3,
    264  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    265  1.1  riastrad 	0x9604, 0xffffffff, 0x4,
    266  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    267  1.1  riastrad 	0x9604, 0xffffffff, 0x5,
    268  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    269  1.1  riastrad 	0x9604, 0xffffffff, 0x6,
    270  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    271  1.1  riastrad 	0x9604, 0xffffffff, 0x7,
    272  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    273  1.1  riastrad 	0x9604, 0xffffffff, 0x8,
    274  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    275  1.1  riastrad 	0x9604, 0xffffffff, 0x9,
    276  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    277  1.1  riastrad 	0x9604, 0xffffffff, 0x80000000,
    278  1.1  riastrad 	0x9030, 0xffffffff, 0x100,
    279  1.1  riastrad 	0x9034, 0xffffffff, 0x100,
    280  1.1  riastrad 	0x9038, 0xffffffff, 0x100,
    281  1.1  riastrad 	0x903c, 0xffffffff, 0x100,
    282  1.1  riastrad 	0x9040, 0xffffffff, 0x100,
    283  1.1  riastrad 	0xa200, 0xffffffff, 0x100,
    284  1.1  riastrad 	0xa204, 0xffffffff, 0x100,
    285  1.1  riastrad 	0xa208, 0xffffffff, 0x100,
    286  1.1  riastrad 	0xa20c, 0xffffffff, 0x100,
    287  1.1  riastrad 	0x971c, 0xffffffff, 0x100,
    288  1.1  riastrad 	0x915c, 0xffffffff, 0x00020001,
    289  1.1  riastrad 	0x9160, 0xffffffff, 0x00040003,
    290  1.1  riastrad 	0x916c, 0xffffffff, 0x00060005,
    291  1.1  riastrad 	0x9170, 0xffffffff, 0x00080007,
    292  1.1  riastrad 	0x9174, 0xffffffff, 0x000a0009,
    293  1.1  riastrad 	0x9178, 0xffffffff, 0x000c000b,
    294  1.1  riastrad 	0x917c, 0xffffffff, 0x000e000d,
    295  1.1  riastrad 	0x9180, 0xffffffff, 0x0010000f,
    296  1.1  riastrad 	0x918c, 0xffffffff, 0x00120011,
    297  1.1  riastrad 	0x9190, 0xffffffff, 0x00140013,
    298  1.1  riastrad 	0x9194, 0xffffffff, 0x00020001,
    299  1.1  riastrad 	0x9198, 0xffffffff, 0x00040003,
    300  1.1  riastrad 	0x919c, 0xffffffff, 0x00060005,
    301  1.1  riastrad 	0x91a8, 0xffffffff, 0x00080007,
    302  1.1  riastrad 	0x91ac, 0xffffffff, 0x000a0009,
    303  1.1  riastrad 	0x91b0, 0xffffffff, 0x000c000b,
    304  1.1  riastrad 	0x91b4, 0xffffffff, 0x000e000d,
    305  1.1  riastrad 	0x91b8, 0xffffffff, 0x0010000f,
    306  1.1  riastrad 	0x91c4, 0xffffffff, 0x00120011,
    307  1.1  riastrad 	0x91c8, 0xffffffff, 0x00140013,
    308  1.1  riastrad 	0x91cc, 0xffffffff, 0x00020001,
    309  1.1  riastrad 	0x91d0, 0xffffffff, 0x00040003,
    310  1.1  riastrad 	0x91d4, 0xffffffff, 0x00060005,
    311  1.1  riastrad 	0x91e0, 0xffffffff, 0x00080007,
    312  1.1  riastrad 	0x91e4, 0xffffffff, 0x000a0009,
    313  1.1  riastrad 	0x91e8, 0xffffffff, 0x000c000b,
    314  1.1  riastrad 	0x91ec, 0xffffffff, 0x00020001,
    315  1.1  riastrad 	0x91f0, 0xffffffff, 0x00040003,
    316  1.1  riastrad 	0x91f4, 0xffffffff, 0x00060005,
    317  1.1  riastrad 	0x9200, 0xffffffff, 0x00080007,
    318  1.1  riastrad 	0x9204, 0xffffffff, 0x000a0009,
    319  1.1  riastrad 	0x9208, 0xffffffff, 0x000c000b,
    320  1.1  riastrad 	0x920c, 0xffffffff, 0x000e000d,
    321  1.1  riastrad 	0x9210, 0xffffffff, 0x0010000f,
    322  1.1  riastrad 	0x921c, 0xffffffff, 0x00120011,
    323  1.1  riastrad 	0x9220, 0xffffffff, 0x00140013,
    324  1.1  riastrad 	0x9224, 0xffffffff, 0x00020001,
    325  1.1  riastrad 	0x9228, 0xffffffff, 0x00040003,
    326  1.1  riastrad 	0x922c, 0xffffffff, 0x00060005,
    327  1.1  riastrad 	0x9238, 0xffffffff, 0x00080007,
    328  1.1  riastrad 	0x923c, 0xffffffff, 0x000a0009,
    329  1.1  riastrad 	0x9240, 0xffffffff, 0x000c000b,
    330  1.1  riastrad 	0x9244, 0xffffffff, 0x000e000d,
    331  1.1  riastrad 	0x9248, 0xffffffff, 0x0010000f,
    332  1.1  riastrad 	0x9254, 0xffffffff, 0x00120011,
    333  1.1  riastrad 	0x9258, 0xffffffff, 0x00140013,
    334  1.1  riastrad 	0x925c, 0xffffffff, 0x00020001,
    335  1.1  riastrad 	0x9260, 0xffffffff, 0x00040003,
    336  1.1  riastrad 	0x9264, 0xffffffff, 0x00060005,
    337  1.1  riastrad 	0x9270, 0xffffffff, 0x00080007,
    338  1.1  riastrad 	0x9274, 0xffffffff, 0x000a0009,
    339  1.1  riastrad 	0x9278, 0xffffffff, 0x000c000b,
    340  1.1  riastrad 	0x927c, 0xffffffff, 0x000e000d,
    341  1.1  riastrad 	0x9280, 0xffffffff, 0x0010000f,
    342  1.1  riastrad 	0x928c, 0xffffffff, 0x00120011,
    343  1.1  riastrad 	0x9290, 0xffffffff, 0x00140013,
    344  1.1  riastrad 	0x9294, 0xffffffff, 0x00020001,
    345  1.1  riastrad 	0x929c, 0xffffffff, 0x00040003,
    346  1.1  riastrad 	0x92a0, 0xffffffff, 0x00060005,
    347  1.1  riastrad 	0x92a4, 0xffffffff, 0x00080007
    348  1.1  riastrad };
    349  1.1  riastrad 
    350  1.1  riastrad static const u32 rv710_golden_registers[] =
    351  1.1  riastrad {
    352  1.1  riastrad 	0x3f90, 0x00ff0000, 0x00fc0000,
    353  1.1  riastrad 	0x9148, 0x00ff0000, 0x00fc0000,
    354  1.1  riastrad 	0x3f94, 0x00ff0000, 0x00fc0000,
    355  1.1  riastrad 	0x914c, 0x00ff0000, 0x00fc0000,
    356  1.1  riastrad 	0xb4c, 0x00000020, 0x00000020,
    357  1.1  riastrad 	0xa180, 0xffffffff, 0x00003f3f
    358  1.1  riastrad };
    359  1.1  riastrad 
    360  1.1  riastrad static const u32 rv710_mgcg_init[] =
    361  1.1  riastrad {
    362  1.1  riastrad 	0x8bcc, 0xffffffff, 0x13030040,
    363  1.1  riastrad 	0x5448, 0xffffffff, 0x100,
    364  1.1  riastrad 	0x55e4, 0xffffffff, 0x100,
    365  1.1  riastrad 	0x160c, 0xffffffff, 0x100,
    366  1.1  riastrad 	0x5644, 0xffffffff, 0x100,
    367  1.1  riastrad 	0xc164, 0xffffffff, 0x100,
    368  1.1  riastrad 	0x8a18, 0xffffffff, 0x100,
    369  1.1  riastrad 	0x897c, 0xffffffff, 0x8000100,
    370  1.1  riastrad 	0x8b28, 0xffffffff, 0x3c000100,
    371  1.1  riastrad 	0x9144, 0xffffffff, 0x100,
    372  1.1  riastrad 	0x9a1c, 0xffffffff, 0x10000,
    373  1.1  riastrad 	0x9a50, 0xffffffff, 0x100,
    374  1.1  riastrad 	0x9a1c, 0xffffffff, 0x0,
    375  1.1  riastrad 	0x9870, 0xffffffff, 0x100,
    376  1.1  riastrad 	0x8d58, 0xffffffff, 0x100,
    377  1.1  riastrad 	0x9500, 0xffffffff, 0x0,
    378  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    379  1.1  riastrad 	0x9500, 0xffffffff, 0x1,
    380  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    381  1.1  riastrad 	0x9500, 0xffffffff, 0x8000,
    382  1.1  riastrad 	0x9490, 0xffffffff, 0x0,
    383  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    384  1.1  riastrad 	0x9490, 0xffffffff, 0x1,
    385  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    386  1.1  riastrad 	0x9490, 0xffffffff, 0x8000,
    387  1.1  riastrad 	0x9604, 0xffffffff, 0x0,
    388  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    389  1.1  riastrad 	0x9604, 0xffffffff, 0x1,
    390  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    391  1.1  riastrad 	0x9604, 0xffffffff, 0x80000000,
    392  1.1  riastrad 	0x9030, 0xffffffff, 0x100,
    393  1.1  riastrad 	0x9034, 0xffffffff, 0x100,
    394  1.1  riastrad 	0x9038, 0xffffffff, 0x100,
    395  1.1  riastrad 	0x903c, 0xffffffff, 0x100,
    396  1.1  riastrad 	0x9040, 0xffffffff, 0x100,
    397  1.1  riastrad 	0xa200, 0xffffffff, 0x100,
    398  1.1  riastrad 	0xa204, 0xffffffff, 0x100,
    399  1.1  riastrad 	0xa208, 0xffffffff, 0x100,
    400  1.1  riastrad 	0xa20c, 0xffffffff, 0x100,
    401  1.1  riastrad 	0x971c, 0xffffffff, 0x100,
    402  1.1  riastrad 	0x915c, 0xffffffff, 0x00020001,
    403  1.1  riastrad 	0x9174, 0xffffffff, 0x00000003,
    404  1.1  riastrad 	0x9178, 0xffffffff, 0x00050001,
    405  1.1  riastrad 	0x917c, 0xffffffff, 0x00030002,
    406  1.1  riastrad 	0x918c, 0xffffffff, 0x00000004,
    407  1.1  riastrad 	0x9190, 0xffffffff, 0x00070006,
    408  1.1  riastrad 	0x9194, 0xffffffff, 0x00050001,
    409  1.1  riastrad 	0x9198, 0xffffffff, 0x00030002,
    410  1.1  riastrad 	0x91a8, 0xffffffff, 0x00000004,
    411  1.1  riastrad 	0x91ac, 0xffffffff, 0x00070006,
    412  1.1  riastrad 	0x91e8, 0xffffffff, 0x00000001,
    413  1.1  riastrad 	0x9294, 0xffffffff, 0x00000001,
    414  1.1  riastrad 	0x929c, 0xffffffff, 0x00000002,
    415  1.1  riastrad 	0x92a0, 0xffffffff, 0x00040003,
    416  1.1  riastrad 	0x9150, 0xffffffff, 0x4d940000
    417  1.1  riastrad };
    418  1.1  riastrad 
    419  1.1  riastrad static const u32 rv730_golden_registers[] =
    420  1.1  riastrad {
    421  1.1  riastrad 	0x3f90, 0x00ff0000, 0x00f00000,
    422  1.1  riastrad 	0x9148, 0x00ff0000, 0x00f00000,
    423  1.1  riastrad 	0x3f94, 0x00ff0000, 0x00f00000,
    424  1.1  riastrad 	0x914c, 0x00ff0000, 0x00f00000,
    425  1.1  riastrad 	0x900c, 0xffffffff, 0x003b033f,
    426  1.1  riastrad 	0xb4c, 0x00000020, 0x00000020,
    427  1.1  riastrad 	0xa180, 0xffffffff, 0x00003f3f
    428  1.1  riastrad };
    429  1.1  riastrad 
    430  1.1  riastrad static const u32 rv730_mgcg_init[] =
    431  1.1  riastrad {
    432  1.1  riastrad 	0x8bcc, 0xffffffff, 0x130300f9,
    433  1.1  riastrad 	0x5448, 0xffffffff, 0x100,
    434  1.1  riastrad 	0x55e4, 0xffffffff, 0x100,
    435  1.1  riastrad 	0x160c, 0xffffffff, 0x100,
    436  1.1  riastrad 	0x5644, 0xffffffff, 0x100,
    437  1.1  riastrad 	0xc164, 0xffffffff, 0x100,
    438  1.1  riastrad 	0x8a18, 0xffffffff, 0x100,
    439  1.1  riastrad 	0x897c, 0xffffffff, 0x8000100,
    440  1.1  riastrad 	0x8b28, 0xffffffff, 0x3c000100,
    441  1.1  riastrad 	0x9144, 0xffffffff, 0x100,
    442  1.1  riastrad 	0x9a1c, 0xffffffff, 0x10000,
    443  1.1  riastrad 	0x9a50, 0xffffffff, 0x100,
    444  1.1  riastrad 	0x9a1c, 0xffffffff, 0x10001,
    445  1.1  riastrad 	0x9a50, 0xffffffff, 0x100,
    446  1.1  riastrad 	0x9a1c, 0xffffffff, 0x0,
    447  1.1  riastrad 	0x9870, 0xffffffff, 0x100,
    448  1.1  riastrad 	0x8d58, 0xffffffff, 0x100,
    449  1.1  riastrad 	0x9500, 0xffffffff, 0x0,
    450  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    451  1.1  riastrad 	0x9500, 0xffffffff, 0x1,
    452  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    453  1.1  riastrad 	0x9500, 0xffffffff, 0x2,
    454  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    455  1.1  riastrad 	0x9500, 0xffffffff, 0x3,
    456  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    457  1.1  riastrad 	0x9500, 0xffffffff, 0x4,
    458  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    459  1.1  riastrad 	0x9500, 0xffffffff, 0x5,
    460  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    461  1.1  riastrad 	0x9500, 0xffffffff, 0x6,
    462  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    463  1.1  riastrad 	0x9500, 0xffffffff, 0x7,
    464  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    465  1.1  riastrad 	0x9500, 0xffffffff, 0x8000,
    466  1.1  riastrad 	0x9490, 0xffffffff, 0x0,
    467  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    468  1.1  riastrad 	0x9490, 0xffffffff, 0x1,
    469  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    470  1.1  riastrad 	0x9490, 0xffffffff, 0x2,
    471  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    472  1.1  riastrad 	0x9490, 0xffffffff, 0x3,
    473  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    474  1.1  riastrad 	0x9490, 0xffffffff, 0x4,
    475  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    476  1.1  riastrad 	0x9490, 0xffffffff, 0x5,
    477  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    478  1.1  riastrad 	0x9490, 0xffffffff, 0x6,
    479  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    480  1.1  riastrad 	0x9490, 0xffffffff, 0x7,
    481  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    482  1.1  riastrad 	0x9490, 0xffffffff, 0x8000,
    483  1.1  riastrad 	0x9604, 0xffffffff, 0x0,
    484  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    485  1.1  riastrad 	0x9604, 0xffffffff, 0x1,
    486  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    487  1.1  riastrad 	0x9604, 0xffffffff, 0x2,
    488  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    489  1.1  riastrad 	0x9604, 0xffffffff, 0x3,
    490  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    491  1.1  riastrad 	0x9604, 0xffffffff, 0x4,
    492  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    493  1.1  riastrad 	0x9604, 0xffffffff, 0x5,
    494  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    495  1.1  riastrad 	0x9604, 0xffffffff, 0x6,
    496  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    497  1.1  riastrad 	0x9604, 0xffffffff, 0x7,
    498  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    499  1.1  riastrad 	0x9604, 0xffffffff, 0x80000000,
    500  1.1  riastrad 	0x9030, 0xffffffff, 0x100,
    501  1.1  riastrad 	0x9034, 0xffffffff, 0x100,
    502  1.1  riastrad 	0x9038, 0xffffffff, 0x100,
    503  1.1  riastrad 	0x903c, 0xffffffff, 0x100,
    504  1.1  riastrad 	0x9040, 0xffffffff, 0x100,
    505  1.1  riastrad 	0xa200, 0xffffffff, 0x100,
    506  1.1  riastrad 	0xa204, 0xffffffff, 0x100,
    507  1.1  riastrad 	0xa208, 0xffffffff, 0x100,
    508  1.1  riastrad 	0xa20c, 0xffffffff, 0x100,
    509  1.1  riastrad 	0x971c, 0xffffffff, 0x100,
    510  1.1  riastrad 	0x915c, 0xffffffff, 0x00020001,
    511  1.1  riastrad 	0x916c, 0xffffffff, 0x00040003,
    512  1.1  riastrad 	0x9170, 0xffffffff, 0x00000005,
    513  1.1  riastrad 	0x9178, 0xffffffff, 0x00050001,
    514  1.1  riastrad 	0x917c, 0xffffffff, 0x00030002,
    515  1.1  riastrad 	0x918c, 0xffffffff, 0x00000004,
    516  1.1  riastrad 	0x9190, 0xffffffff, 0x00070006,
    517  1.1  riastrad 	0x9194, 0xffffffff, 0x00050001,
    518  1.1  riastrad 	0x9198, 0xffffffff, 0x00030002,
    519  1.1  riastrad 	0x91a8, 0xffffffff, 0x00000004,
    520  1.1  riastrad 	0x91ac, 0xffffffff, 0x00070006,
    521  1.1  riastrad 	0x91b0, 0xffffffff, 0x00050001,
    522  1.1  riastrad 	0x91b4, 0xffffffff, 0x00030002,
    523  1.1  riastrad 	0x91c4, 0xffffffff, 0x00000004,
    524  1.1  riastrad 	0x91c8, 0xffffffff, 0x00070006,
    525  1.1  riastrad 	0x91cc, 0xffffffff, 0x00050001,
    526  1.1  riastrad 	0x91d0, 0xffffffff, 0x00030002,
    527  1.1  riastrad 	0x91e0, 0xffffffff, 0x00000004,
    528  1.1  riastrad 	0x91e4, 0xffffffff, 0x00070006,
    529  1.1  riastrad 	0x91e8, 0xffffffff, 0x00000001,
    530  1.1  riastrad 	0x91ec, 0xffffffff, 0x00050001,
    531  1.1  riastrad 	0x91f0, 0xffffffff, 0x00030002,
    532  1.1  riastrad 	0x9200, 0xffffffff, 0x00000004,
    533  1.1  riastrad 	0x9204, 0xffffffff, 0x00070006,
    534  1.1  riastrad 	0x9208, 0xffffffff, 0x00050001,
    535  1.1  riastrad 	0x920c, 0xffffffff, 0x00030002,
    536  1.1  riastrad 	0x921c, 0xffffffff, 0x00000004,
    537  1.1  riastrad 	0x9220, 0xffffffff, 0x00070006,
    538  1.1  riastrad 	0x9224, 0xffffffff, 0x00050001,
    539  1.1  riastrad 	0x9228, 0xffffffff, 0x00030002,
    540  1.1  riastrad 	0x9238, 0xffffffff, 0x00000004,
    541  1.1  riastrad 	0x923c, 0xffffffff, 0x00070006,
    542  1.1  riastrad 	0x9240, 0xffffffff, 0x00050001,
    543  1.1  riastrad 	0x9244, 0xffffffff, 0x00030002,
    544  1.1  riastrad 	0x9254, 0xffffffff, 0x00000004,
    545  1.1  riastrad 	0x9258, 0xffffffff, 0x00070006,
    546  1.1  riastrad 	0x9294, 0xffffffff, 0x00000001,
    547  1.1  riastrad 	0x929c, 0xffffffff, 0x00000002,
    548  1.1  riastrad 	0x92a0, 0xffffffff, 0x00040003,
    549  1.1  riastrad 	0x92a4, 0xffffffff, 0x00000005
    550  1.1  riastrad };
    551  1.1  riastrad 
    552  1.1  riastrad static const u32 rv740_golden_registers[] =
    553  1.1  riastrad {
    554  1.1  riastrad 	0x88c4, 0xffffffff, 0x00000082,
    555  1.1  riastrad 	0x28a50, 0xfffffffc, 0x00000004,
    556  1.1  riastrad 	0x2650, 0x00040000, 0,
    557  1.1  riastrad 	0x20bc, 0x00040000, 0,
    558  1.1  riastrad 	0x733c, 0xffffffff, 0x00000002,
    559  1.1  riastrad 	0x7300, 0xffffffff, 0x001000f0,
    560  1.1  riastrad 	0x3f90, 0x00ff0000, 0,
    561  1.1  riastrad 	0x9148, 0x00ff0000, 0,
    562  1.1  riastrad 	0x3f94, 0x00ff0000, 0,
    563  1.1  riastrad 	0x914c, 0x00ff0000, 0,
    564  1.1  riastrad 	0x240c, 0xffffffff, 0x00000380,
    565  1.1  riastrad 	0x8a14, 0x00000007, 0x00000007,
    566  1.1  riastrad 	0x8b24, 0xffffffff, 0x00ff0fff,
    567  1.1  riastrad 	0x28a4c, 0xffffffff, 0x00004000,
    568  1.1  riastrad 	0xa180, 0xffffffff, 0x00003f3f,
    569  1.1  riastrad 	0x8d00, 0xffffffff, 0x0e0e003a,
    570  1.1  riastrad 	0x8d04, 0xffffffff, 0x013a0e2a,
    571  1.1  riastrad 	0x8c00, 0xffffffff, 0xe400000f,
    572  1.1  riastrad 	0x8db0, 0xffffffff, 0x98989898,
    573  1.1  riastrad 	0x8db4, 0xffffffff, 0x98989898,
    574  1.1  riastrad 	0x8db8, 0xffffffff, 0x98989898,
    575  1.1  riastrad 	0x8dbc, 0xffffffff, 0x98989898,
    576  1.1  riastrad 	0x8dc0, 0xffffffff, 0x98989898,
    577  1.1  riastrad 	0x8dc4, 0xffffffff, 0x98989898,
    578  1.1  riastrad 	0x8dc8, 0xffffffff, 0x98989898,
    579  1.1  riastrad 	0x8dcc, 0xffffffff, 0x98989898,
    580  1.1  riastrad 	0x9058, 0xffffffff, 0x0fffc40f,
    581  1.1  riastrad 	0x900c, 0xffffffff, 0x003b033f,
    582  1.1  riastrad 	0x28350, 0xffffffff, 0,
    583  1.1  riastrad 	0x8cf0, 0x1fffffff, 0x08e00420,
    584  1.1  riastrad 	0x9508, 0xffffffff, 0x00000002,
    585  1.1  riastrad 	0x88c4, 0xffffffff, 0x000000c2,
    586  1.1  riastrad 	0x9698, 0x18000000, 0x18000000
    587  1.1  riastrad };
    588  1.1  riastrad 
    589  1.1  riastrad static const u32 rv740_mgcg_init[] =
    590  1.1  riastrad {
    591  1.1  riastrad 	0x8bcc, 0xffffffff, 0x13030100,
    592  1.1  riastrad 	0x5448, 0xffffffff, 0x100,
    593  1.1  riastrad 	0x55e4, 0xffffffff, 0x100,
    594  1.1  riastrad 	0x160c, 0xffffffff, 0x100,
    595  1.1  riastrad 	0x5644, 0xffffffff, 0x100,
    596  1.1  riastrad 	0xc164, 0xffffffff, 0x100,
    597  1.1  riastrad 	0x8a18, 0xffffffff, 0x100,
    598  1.1  riastrad 	0x897c, 0xffffffff, 0x100,
    599  1.1  riastrad 	0x8b28, 0xffffffff, 0x100,
    600  1.1  riastrad 	0x9144, 0xffffffff, 0x100,
    601  1.1  riastrad 	0x9a1c, 0xffffffff, 0x10000,
    602  1.1  riastrad 	0x9a50, 0xffffffff, 0x100,
    603  1.1  riastrad 	0x9a1c, 0xffffffff, 0x10001,
    604  1.1  riastrad 	0x9a50, 0xffffffff, 0x100,
    605  1.1  riastrad 	0x9a1c, 0xffffffff, 0x10002,
    606  1.1  riastrad 	0x9a50, 0xffffffff, 0x100,
    607  1.1  riastrad 	0x9a1c, 0xffffffff, 0x10003,
    608  1.1  riastrad 	0x9a50, 0xffffffff, 0x100,
    609  1.1  riastrad 	0x9a1c, 0xffffffff, 0x0,
    610  1.1  riastrad 	0x9870, 0xffffffff, 0x100,
    611  1.1  riastrad 	0x8d58, 0xffffffff, 0x100,
    612  1.1  riastrad 	0x9500, 0xffffffff, 0x0,
    613  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    614  1.1  riastrad 	0x9500, 0xffffffff, 0x1,
    615  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    616  1.1  riastrad 	0x9500, 0xffffffff, 0x2,
    617  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    618  1.1  riastrad 	0x9500, 0xffffffff, 0x3,
    619  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    620  1.1  riastrad 	0x9500, 0xffffffff, 0x4,
    621  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    622  1.1  riastrad 	0x9500, 0xffffffff, 0x5,
    623  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    624  1.1  riastrad 	0x9500, 0xffffffff, 0x6,
    625  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    626  1.1  riastrad 	0x9500, 0xffffffff, 0x7,
    627  1.1  riastrad 	0x9510, 0xffffffff, 0x100,
    628  1.1  riastrad 	0x9500, 0xffffffff, 0x8000,
    629  1.1  riastrad 	0x9490, 0xffffffff, 0x0,
    630  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    631  1.1  riastrad 	0x9490, 0xffffffff, 0x1,
    632  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    633  1.1  riastrad 	0x9490, 0xffffffff, 0x2,
    634  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    635  1.1  riastrad 	0x9490, 0xffffffff, 0x3,
    636  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    637  1.1  riastrad 	0x9490, 0xffffffff, 0x4,
    638  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    639  1.1  riastrad 	0x9490, 0xffffffff, 0x5,
    640  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    641  1.1  riastrad 	0x9490, 0xffffffff, 0x6,
    642  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    643  1.1  riastrad 	0x9490, 0xffffffff, 0x7,
    644  1.1  riastrad 	0x949c, 0xffffffff, 0x100,
    645  1.1  riastrad 	0x9490, 0xffffffff, 0x8000,
    646  1.1  riastrad 	0x9604, 0xffffffff, 0x0,
    647  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    648  1.1  riastrad 	0x9604, 0xffffffff, 0x1,
    649  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    650  1.1  riastrad 	0x9604, 0xffffffff, 0x2,
    651  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    652  1.1  riastrad 	0x9604, 0xffffffff, 0x3,
    653  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    654  1.1  riastrad 	0x9604, 0xffffffff, 0x4,
    655  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    656  1.1  riastrad 	0x9604, 0xffffffff, 0x5,
    657  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    658  1.1  riastrad 	0x9604, 0xffffffff, 0x6,
    659  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    660  1.1  riastrad 	0x9604, 0xffffffff, 0x7,
    661  1.1  riastrad 	0x9654, 0xffffffff, 0x100,
    662  1.1  riastrad 	0x9604, 0xffffffff, 0x80000000,
    663  1.1  riastrad 	0x9030, 0xffffffff, 0x100,
    664  1.1  riastrad 	0x9034, 0xffffffff, 0x100,
    665  1.1  riastrad 	0x9038, 0xffffffff, 0x100,
    666  1.1  riastrad 	0x903c, 0xffffffff, 0x100,
    667  1.1  riastrad 	0x9040, 0xffffffff, 0x100,
    668  1.1  riastrad 	0xa200, 0xffffffff, 0x100,
    669  1.1  riastrad 	0xa204, 0xffffffff, 0x100,
    670  1.1  riastrad 	0xa208, 0xffffffff, 0x100,
    671  1.1  riastrad 	0xa20c, 0xffffffff, 0x100,
    672  1.1  riastrad 	0x971c, 0xffffffff, 0x100,
    673  1.1  riastrad 	0x915c, 0xffffffff, 0x00020001,
    674  1.1  riastrad 	0x9160, 0xffffffff, 0x00040003,
    675  1.1  riastrad 	0x916c, 0xffffffff, 0x00060005,
    676  1.1  riastrad 	0x9170, 0xffffffff, 0x00080007,
    677  1.1  riastrad 	0x9174, 0xffffffff, 0x000a0009,
    678  1.1  riastrad 	0x9178, 0xffffffff, 0x000c000b,
    679  1.1  riastrad 	0x917c, 0xffffffff, 0x000e000d,
    680  1.1  riastrad 	0x9180, 0xffffffff, 0x0010000f,
    681  1.1  riastrad 	0x918c, 0xffffffff, 0x00120011,
    682  1.1  riastrad 	0x9190, 0xffffffff, 0x00140013,
    683  1.1  riastrad 	0x9194, 0xffffffff, 0x00020001,
    684  1.1  riastrad 	0x9198, 0xffffffff, 0x00040003,
    685  1.1  riastrad 	0x919c, 0xffffffff, 0x00060005,
    686  1.1  riastrad 	0x91a8, 0xffffffff, 0x00080007,
    687  1.1  riastrad 	0x91ac, 0xffffffff, 0x000a0009,
    688  1.1  riastrad 	0x91b0, 0xffffffff, 0x000c000b,
    689  1.1  riastrad 	0x91b4, 0xffffffff, 0x000e000d,
    690  1.1  riastrad 	0x91b8, 0xffffffff, 0x0010000f,
    691  1.1  riastrad 	0x91c4, 0xffffffff, 0x00120011,
    692  1.1  riastrad 	0x91c8, 0xffffffff, 0x00140013,
    693  1.1  riastrad 	0x91cc, 0xffffffff, 0x00020001,
    694  1.1  riastrad 	0x91d0, 0xffffffff, 0x00040003,
    695  1.1  riastrad 	0x91d4, 0xffffffff, 0x00060005,
    696  1.1  riastrad 	0x91e0, 0xffffffff, 0x00080007,
    697  1.1  riastrad 	0x91e4, 0xffffffff, 0x000a0009,
    698  1.1  riastrad 	0x91e8, 0xffffffff, 0x000c000b,
    699  1.1  riastrad 	0x91ec, 0xffffffff, 0x00020001,
    700  1.1  riastrad 	0x91f0, 0xffffffff, 0x00040003,
    701  1.1  riastrad 	0x91f4, 0xffffffff, 0x00060005,
    702  1.1  riastrad 	0x9200, 0xffffffff, 0x00080007,
    703  1.1  riastrad 	0x9204, 0xffffffff, 0x000a0009,
    704  1.1  riastrad 	0x9208, 0xffffffff, 0x000c000b,
    705  1.1  riastrad 	0x920c, 0xffffffff, 0x000e000d,
    706  1.1  riastrad 	0x9210, 0xffffffff, 0x0010000f,
    707  1.1  riastrad 	0x921c, 0xffffffff, 0x00120011,
    708  1.1  riastrad 	0x9220, 0xffffffff, 0x00140013,
    709  1.1  riastrad 	0x9224, 0xffffffff, 0x00020001,
    710  1.1  riastrad 	0x9228, 0xffffffff, 0x00040003,
    711  1.1  riastrad 	0x922c, 0xffffffff, 0x00060005,
    712  1.1  riastrad 	0x9238, 0xffffffff, 0x00080007,
    713  1.1  riastrad 	0x923c, 0xffffffff, 0x000a0009,
    714  1.1  riastrad 	0x9240, 0xffffffff, 0x000c000b,
    715  1.1  riastrad 	0x9244, 0xffffffff, 0x000e000d,
    716  1.1  riastrad 	0x9248, 0xffffffff, 0x0010000f,
    717  1.1  riastrad 	0x9254, 0xffffffff, 0x00120011,
    718  1.1  riastrad 	0x9258, 0xffffffff, 0x00140013,
    719  1.1  riastrad 	0x9294, 0xffffffff, 0x00020001,
    720  1.1  riastrad 	0x929c, 0xffffffff, 0x00040003,
    721  1.1  riastrad 	0x92a0, 0xffffffff, 0x00060005,
    722  1.1  riastrad 	0x92a4, 0xffffffff, 0x00080007
    723  1.1  riastrad };
    724  1.1  riastrad 
    725  1.1  riastrad static void rv770_init_golden_registers(struct radeon_device *rdev)
    726  1.1  riastrad {
    727  1.1  riastrad 	switch (rdev->family) {
    728  1.1  riastrad 	case CHIP_RV770:
    729  1.1  riastrad 		radeon_program_register_sequence(rdev,
    730  1.1  riastrad 						 r7xx_golden_registers,
    731  1.1  riastrad 						 (const u32)ARRAY_SIZE(r7xx_golden_registers));
    732  1.1  riastrad 		radeon_program_register_sequence(rdev,
    733  1.1  riastrad 						 r7xx_golden_dyn_gpr_registers,
    734  1.1  riastrad 						 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
    735  1.1  riastrad 		if (rdev->pdev->device == 0x994e)
    736  1.1  riastrad 			radeon_program_register_sequence(rdev,
    737  1.1  riastrad 							 rv770ce_golden_registers,
    738  1.1  riastrad 							 (const u32)ARRAY_SIZE(rv770ce_golden_registers));
    739  1.1  riastrad 		else
    740  1.1  riastrad 			radeon_program_register_sequence(rdev,
    741  1.1  riastrad 							 rv770_golden_registers,
    742  1.1  riastrad 							 (const u32)ARRAY_SIZE(rv770_golden_registers));
    743  1.1  riastrad 		radeon_program_register_sequence(rdev,
    744  1.1  riastrad 						 rv770_mgcg_init,
    745  1.1  riastrad 						 (const u32)ARRAY_SIZE(rv770_mgcg_init));
    746  1.1  riastrad 		break;
    747  1.1  riastrad 	case CHIP_RV730:
    748  1.1  riastrad 		radeon_program_register_sequence(rdev,
    749  1.1  riastrad 						 r7xx_golden_registers,
    750  1.1  riastrad 						 (const u32)ARRAY_SIZE(r7xx_golden_registers));
    751  1.1  riastrad 		radeon_program_register_sequence(rdev,
    752  1.1  riastrad 						 r7xx_golden_dyn_gpr_registers,
    753  1.1  riastrad 						 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
    754  1.1  riastrad 		radeon_program_register_sequence(rdev,
    755  1.1  riastrad 						 rv730_golden_registers,
    756  1.1  riastrad 						 (const u32)ARRAY_SIZE(rv730_golden_registers));
    757  1.1  riastrad 		radeon_program_register_sequence(rdev,
    758  1.1  riastrad 						 rv730_mgcg_init,
    759  1.1  riastrad 						 (const u32)ARRAY_SIZE(rv730_mgcg_init));
    760  1.1  riastrad 		break;
    761  1.1  riastrad 	case CHIP_RV710:
    762  1.1  riastrad 		radeon_program_register_sequence(rdev,
    763  1.1  riastrad 						 r7xx_golden_registers,
    764  1.1  riastrad 						 (const u32)ARRAY_SIZE(r7xx_golden_registers));
    765  1.1  riastrad 		radeon_program_register_sequence(rdev,
    766  1.1  riastrad 						 r7xx_golden_dyn_gpr_registers,
    767  1.1  riastrad 						 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
    768  1.1  riastrad 		radeon_program_register_sequence(rdev,
    769  1.1  riastrad 						 rv710_golden_registers,
    770  1.1  riastrad 						 (const u32)ARRAY_SIZE(rv710_golden_registers));
    771  1.1  riastrad 		radeon_program_register_sequence(rdev,
    772  1.1  riastrad 						 rv710_mgcg_init,
    773  1.1  riastrad 						 (const u32)ARRAY_SIZE(rv710_mgcg_init));
    774  1.1  riastrad 		break;
    775  1.1  riastrad 	case CHIP_RV740:
    776  1.1  riastrad 		radeon_program_register_sequence(rdev,
    777  1.1  riastrad 						 rv740_golden_registers,
    778  1.1  riastrad 						 (const u32)ARRAY_SIZE(rv740_golden_registers));
    779  1.1  riastrad 		radeon_program_register_sequence(rdev,
    780  1.1  riastrad 						 rv740_mgcg_init,
    781  1.1  riastrad 						 (const u32)ARRAY_SIZE(rv740_mgcg_init));
    782  1.1  riastrad 		break;
    783  1.1  riastrad 	default:
    784  1.1  riastrad 		break;
    785  1.1  riastrad 	}
    786  1.1  riastrad }
    787  1.1  riastrad 
    788  1.1  riastrad #define PCIE_BUS_CLK                10000
    789  1.1  riastrad #define TCLK                        (PCIE_BUS_CLK / 10)
    790  1.1  riastrad 
    791  1.1  riastrad /**
    792  1.1  riastrad  * rv770_get_xclk - get the xclk
    793  1.1  riastrad  *
    794  1.1  riastrad  * @rdev: radeon_device pointer
    795  1.1  riastrad  *
    796  1.1  riastrad  * Returns the reference clock used by the gfx engine
    797  1.1  riastrad  * (r7xx-cayman).
    798  1.1  riastrad  */
    799  1.1  riastrad u32 rv770_get_xclk(struct radeon_device *rdev)
    800  1.1  riastrad {
    801  1.1  riastrad 	u32 reference_clock = rdev->clock.spll.reference_freq;
    802  1.1  riastrad 	u32 tmp = RREG32(CG_CLKPIN_CNTL);
    803  1.1  riastrad 
    804  1.1  riastrad 	if (tmp & MUX_TCLK_TO_XCLK)
    805  1.1  riastrad 		return TCLK;
    806  1.1  riastrad 
    807  1.1  riastrad 	if (tmp & XTALIN_DIVIDE)
    808  1.1  riastrad 		return reference_clock / 4;
    809  1.1  riastrad 
    810  1.1  riastrad 	return reference_clock;
    811  1.1  riastrad }
    812  1.1  riastrad 
    813  1.2  riastrad void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, bool async)
    814  1.1  riastrad {
    815  1.1  riastrad 	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
    816  1.1  riastrad 	u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset);
    817  1.1  riastrad 	int i;
    818  1.1  riastrad 
    819  1.1  riastrad 	/* Lock the graphics update lock */
    820  1.1  riastrad 	tmp |= AVIVO_D1GRPH_UPDATE_LOCK;
    821  1.1  riastrad 	WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
    822  1.1  riastrad 
    823  1.1  riastrad 	/* update the scanout addresses */
    824  1.2  riastrad 	WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset,
    825  1.2  riastrad 	       async ? AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
    826  1.1  riastrad 	if (radeon_crtc->crtc_id) {
    827  1.1  riastrad 		WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
    828  1.1  riastrad 		WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
    829  1.1  riastrad 	} else {
    830  1.1  riastrad 		WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
    831  1.1  riastrad 		WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
    832  1.1  riastrad 	}
    833  1.1  riastrad 	WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
    834  1.1  riastrad 	       (u32)crtc_base);
    835  1.1  riastrad 	WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
    836  1.1  riastrad 	       (u32)crtc_base);
    837  1.1  riastrad 
    838  1.1  riastrad 	/* Wait for update_pending to go high. */
    839  1.1  riastrad 	for (i = 0; i < rdev->usec_timeout; i++) {
    840  1.1  riastrad 		if (RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING)
    841  1.1  riastrad 			break;
    842  1.1  riastrad 		udelay(1);
    843  1.1  riastrad 	}
    844  1.1  riastrad 	DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
    845  1.1  riastrad 
    846  1.1  riastrad 	/* Unlock the lock, so double-buffering can take place inside vblank */
    847  1.1  riastrad 	tmp &= ~AVIVO_D1GRPH_UPDATE_LOCK;
    848  1.1  riastrad 	WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
    849  1.1  riastrad }
    850  1.1  riastrad 
    851  1.1  riastrad bool rv770_page_flip_pending(struct radeon_device *rdev, int crtc_id)
    852  1.1  riastrad {
    853  1.1  riastrad 	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
    854  1.1  riastrad 
    855  1.1  riastrad 	/* Return current update_pending status: */
    856  1.1  riastrad 	return !!(RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) &
    857  1.1  riastrad 		AVIVO_D1GRPH_SURFACE_UPDATE_PENDING);
    858  1.1  riastrad }
    859  1.1  riastrad 
    860  1.1  riastrad /* get temperature in millidegrees */
    861  1.1  riastrad int rv770_get_temp(struct radeon_device *rdev)
    862  1.1  riastrad {
    863  1.1  riastrad 	u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
    864  1.1  riastrad 		ASIC_T_SHIFT;
    865  1.1  riastrad 	int actual_temp;
    866  1.1  riastrad 
    867  1.1  riastrad 	if (temp & 0x400)
    868  1.1  riastrad 		actual_temp = -256;
    869  1.1  riastrad 	else if (temp & 0x200)
    870  1.1  riastrad 		actual_temp = 255;
    871  1.1  riastrad 	else if (temp & 0x100) {
    872  1.1  riastrad 		actual_temp = temp & 0x1ff;
    873  1.1  riastrad 		actual_temp |= ~0x1ff;
    874  1.1  riastrad 	} else
    875  1.1  riastrad 		actual_temp = temp & 0xff;
    876  1.1  riastrad 
    877  1.1  riastrad 	return (actual_temp * 1000) / 2;
    878  1.1  riastrad }
    879  1.1  riastrad 
    880  1.1  riastrad void rv770_pm_misc(struct radeon_device *rdev)
    881  1.1  riastrad {
    882  1.1  riastrad 	int req_ps_idx = rdev->pm.requested_power_state_index;
    883  1.1  riastrad 	int req_cm_idx = rdev->pm.requested_clock_mode_index;
    884  1.1  riastrad 	struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
    885  1.1  riastrad 	struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
    886  1.1  riastrad 
    887  1.1  riastrad 	if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
    888  1.1  riastrad 		/* 0xff01 is a flag rather then an actual voltage */
    889  1.1  riastrad 		if (voltage->voltage == 0xff01)
    890  1.1  riastrad 			return;
    891  1.1  riastrad 		if (voltage->voltage != rdev->pm.current_vddc) {
    892  1.1  riastrad 			radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
    893  1.1  riastrad 			rdev->pm.current_vddc = voltage->voltage;
    894  1.1  riastrad 			DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
    895  1.1  riastrad 		}
    896  1.1  riastrad 	}
    897  1.1  riastrad }
    898  1.1  riastrad 
    899  1.1  riastrad /*
    900  1.1  riastrad  * GART
    901  1.1  riastrad  */
    902  1.1  riastrad static int rv770_pcie_gart_enable(struct radeon_device *rdev)
    903  1.1  riastrad {
    904  1.1  riastrad 	u32 tmp;
    905  1.1  riastrad 	int r, i;
    906  1.1  riastrad 
    907  1.1  riastrad 	if (rdev->gart.robj == NULL) {
    908  1.1  riastrad 		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
    909  1.1  riastrad 		return -EINVAL;
    910  1.1  riastrad 	}
    911  1.1  riastrad 	r = radeon_gart_table_vram_pin(rdev);
    912  1.1  riastrad 	if (r)
    913  1.1  riastrad 		return r;
    914  1.1  riastrad 	/* Setup L2 cache */
    915  1.1  riastrad 	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
    916  1.1  riastrad 				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
    917  1.1  riastrad 				EFFECTIVE_L2_QUEUE_SIZE(7));
    918  1.1  riastrad 	WREG32(VM_L2_CNTL2, 0);
    919  1.1  riastrad 	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
    920  1.1  riastrad 	/* Setup TLB control */
    921  1.1  riastrad 	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
    922  1.1  riastrad 		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
    923  1.1  riastrad 		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
    924  1.1  riastrad 		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
    925  1.1  riastrad 	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
    926  1.1  riastrad 	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
    927  1.1  riastrad 	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
    928  1.1  riastrad 	if (rdev->family == CHIP_RV740)
    929  1.1  riastrad 		WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
    930  1.1  riastrad 	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
    931  1.1  riastrad 	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
    932  1.1  riastrad 	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
    933  1.1  riastrad 	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
    934  1.1  riastrad 	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
    935  1.1  riastrad 	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
    936  1.1  riastrad 	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
    937  1.1  riastrad 	WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
    938  1.1  riastrad 				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
    939  1.1  riastrad 	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
    940  1.1  riastrad 			(u32)(rdev->dummy_page.addr >> 12));
    941  1.1  riastrad 	for (i = 1; i < 7; i++)
    942  1.1  riastrad 		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
    943  1.1  riastrad 
    944  1.1  riastrad 	r600_pcie_gart_tlb_flush(rdev);
    945  1.1  riastrad 	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
    946  1.1  riastrad 		 (unsigned)(rdev->mc.gtt_size >> 20),
    947  1.1  riastrad 		 (unsigned long long)rdev->gart.table_addr);
    948  1.1  riastrad 	rdev->gart.ready = true;
    949  1.1  riastrad 	return 0;
    950  1.1  riastrad }
    951  1.1  riastrad 
    952  1.1  riastrad static void rv770_pcie_gart_disable(struct radeon_device *rdev)
    953  1.1  riastrad {
    954  1.1  riastrad 	u32 tmp;
    955  1.1  riastrad 	int i;
    956  1.1  riastrad 
    957  1.1  riastrad 	/* Disable all tables */
    958  1.1  riastrad 	for (i = 0; i < 7; i++)
    959  1.1  riastrad 		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
    960  1.1  riastrad 
    961  1.1  riastrad 	/* Setup L2 cache */
    962  1.1  riastrad 	WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
    963  1.1  riastrad 				EFFECTIVE_L2_QUEUE_SIZE(7));
    964  1.1  riastrad 	WREG32(VM_L2_CNTL2, 0);
    965  1.1  riastrad 	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
    966  1.1  riastrad 	/* Setup TLB control */
    967  1.1  riastrad 	tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
    968  1.1  riastrad 	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
    969  1.1  riastrad 	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
    970  1.1  riastrad 	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
    971  1.1  riastrad 	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
    972  1.1  riastrad 	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
    973  1.1  riastrad 	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
    974  1.1  riastrad 	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
    975  1.1  riastrad 	radeon_gart_table_vram_unpin(rdev);
    976  1.1  riastrad }
    977  1.1  riastrad 
    978  1.1  riastrad static void rv770_pcie_gart_fini(struct radeon_device *rdev)
    979  1.1  riastrad {
    980  1.1  riastrad 	radeon_gart_fini(rdev);
    981  1.1  riastrad 	rv770_pcie_gart_disable(rdev);
    982  1.1  riastrad 	radeon_gart_table_vram_free(rdev);
    983  1.1  riastrad }
    984  1.1  riastrad 
    985  1.1  riastrad 
    986  1.1  riastrad static void rv770_agp_enable(struct radeon_device *rdev)
    987  1.1  riastrad {
    988  1.1  riastrad 	u32 tmp;
    989  1.1  riastrad 	int i;
    990  1.1  riastrad 
    991  1.1  riastrad 	/* Setup L2 cache */
    992  1.1  riastrad 	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
    993  1.1  riastrad 				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
    994  1.1  riastrad 				EFFECTIVE_L2_QUEUE_SIZE(7));
    995  1.1  riastrad 	WREG32(VM_L2_CNTL2, 0);
    996  1.1  riastrad 	WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
    997  1.1  riastrad 	/* Setup TLB control */
    998  1.1  riastrad 	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
    999  1.1  riastrad 		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
   1000  1.1  riastrad 		SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
   1001  1.1  riastrad 		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
   1002  1.1  riastrad 	WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
   1003  1.1  riastrad 	WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
   1004  1.1  riastrad 	WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
   1005  1.1  riastrad 	WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
   1006  1.1  riastrad 	WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
   1007  1.1  riastrad 	WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
   1008  1.1  riastrad 	WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
   1009  1.1  riastrad 	for (i = 0; i < 7; i++)
   1010  1.1  riastrad 		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
   1011  1.1  riastrad }
   1012  1.1  riastrad 
   1013  1.1  riastrad static void rv770_mc_program(struct radeon_device *rdev)
   1014  1.1  riastrad {
   1015  1.1  riastrad 	struct rv515_mc_save save;
   1016  1.1  riastrad 	u32 tmp;
   1017  1.1  riastrad 	int i, j;
   1018  1.1  riastrad 
   1019  1.1  riastrad 	/* Initialize HDP */
   1020  1.1  riastrad 	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
   1021  1.1  riastrad 		WREG32((0x2c14 + j), 0x00000000);
   1022  1.1  riastrad 		WREG32((0x2c18 + j), 0x00000000);
   1023  1.1  riastrad 		WREG32((0x2c1c + j), 0x00000000);
   1024  1.1  riastrad 		WREG32((0x2c20 + j), 0x00000000);
   1025  1.1  riastrad 		WREG32((0x2c24 + j), 0x00000000);
   1026  1.1  riastrad 	}
   1027  1.1  riastrad 	/* r7xx hw bug.  Read from HDP_DEBUG1 rather
   1028  1.1  riastrad 	 * than writing to HDP_REG_COHERENCY_FLUSH_CNTL
   1029  1.1  riastrad 	 */
   1030  1.1  riastrad 	tmp = RREG32(HDP_DEBUG1);
   1031  1.1  riastrad 
   1032  1.1  riastrad 	rv515_mc_stop(rdev, &save);
   1033  1.1  riastrad 	if (r600_mc_wait_for_idle(rdev)) {
   1034  1.1  riastrad 		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
   1035  1.1  riastrad 	}
   1036  1.1  riastrad 	/* Lockout access through VGA aperture*/
   1037  1.1  riastrad 	WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
   1038  1.1  riastrad 	/* Update configuration */
   1039  1.1  riastrad 	if (rdev->flags & RADEON_IS_AGP) {
   1040  1.1  riastrad 		if (rdev->mc.vram_start < rdev->mc.gtt_start) {
   1041  1.1  riastrad 			/* VRAM before AGP */
   1042  1.1  riastrad 			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
   1043  1.1  riastrad 				rdev->mc.vram_start >> 12);
   1044  1.1  riastrad 			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
   1045  1.1  riastrad 				rdev->mc.gtt_end >> 12);
   1046  1.1  riastrad 		} else {
   1047  1.1  riastrad 			/* VRAM after AGP */
   1048  1.1  riastrad 			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
   1049  1.1  riastrad 				rdev->mc.gtt_start >> 12);
   1050  1.1  riastrad 			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
   1051  1.1  riastrad 				rdev->mc.vram_end >> 12);
   1052  1.1  riastrad 		}
   1053  1.1  riastrad 	} else {
   1054  1.1  riastrad 		WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
   1055  1.1  riastrad 			rdev->mc.vram_start >> 12);
   1056  1.1  riastrad 		WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
   1057  1.1  riastrad 			rdev->mc.vram_end >> 12);
   1058  1.1  riastrad 	}
   1059  1.1  riastrad 	WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
   1060  1.1  riastrad 	tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
   1061  1.1  riastrad 	tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
   1062  1.1  riastrad 	WREG32(MC_VM_FB_LOCATION, tmp);
   1063  1.1  riastrad 	WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
   1064  1.1  riastrad 	WREG32(HDP_NONSURFACE_INFO, (2 << 7));
   1065  1.1  riastrad 	WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
   1066  1.1  riastrad 	if (rdev->flags & RADEON_IS_AGP) {
   1067  1.1  riastrad 		WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16);
   1068  1.1  riastrad 		WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16);
   1069  1.1  riastrad 		WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
   1070  1.1  riastrad 	} else {
   1071  1.1  riastrad 		WREG32(MC_VM_AGP_BASE, 0);
   1072  1.1  riastrad 		WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
   1073  1.1  riastrad 		WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
   1074  1.1  riastrad 	}
   1075  1.1  riastrad 	if (r600_mc_wait_for_idle(rdev)) {
   1076  1.1  riastrad 		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
   1077  1.1  riastrad 	}
   1078  1.1  riastrad 	rv515_mc_resume(rdev, &save);
   1079  1.1  riastrad 	/* we need to own VRAM, so turn off the VGA renderer here
   1080  1.1  riastrad 	 * to stop it overwriting our objects */
   1081  1.1  riastrad 	rv515_vga_render_disable(rdev);
   1082  1.1  riastrad }
   1083  1.1  riastrad 
   1084  1.1  riastrad 
   1085  1.1  riastrad /*
   1086  1.1  riastrad  * CP.
   1087  1.1  riastrad  */
   1088  1.1  riastrad void r700_cp_stop(struct radeon_device *rdev)
   1089  1.1  riastrad {
   1090  1.1  riastrad 	if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
   1091  1.1  riastrad 		radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
   1092  1.1  riastrad 	WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
   1093  1.1  riastrad 	WREG32(SCRATCH_UMSK, 0);
   1094  1.1  riastrad 	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
   1095  1.1  riastrad }
   1096  1.1  riastrad 
   1097  1.1  riastrad static int rv770_cp_load_microcode(struct radeon_device *rdev)
   1098  1.1  riastrad {
   1099  1.1  riastrad 	const __be32 *fw_data;
   1100  1.1  riastrad 	int i;
   1101  1.1  riastrad 
   1102  1.1  riastrad 	if (!rdev->me_fw || !rdev->pfp_fw)
   1103  1.1  riastrad 		return -EINVAL;
   1104  1.1  riastrad 
   1105  1.1  riastrad 	r700_cp_stop(rdev);
   1106  1.1  riastrad 	WREG32(CP_RB_CNTL,
   1107  1.1  riastrad #ifdef __BIG_ENDIAN
   1108  1.1  riastrad 	       BUF_SWAP_32BIT |
   1109  1.1  riastrad #endif
   1110  1.1  riastrad 	       RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
   1111  1.1  riastrad 
   1112  1.1  riastrad 	/* Reset cp */
   1113  1.1  riastrad 	WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
   1114  1.1  riastrad 	RREG32(GRBM_SOFT_RESET);
   1115  1.1  riastrad 	mdelay(15);
   1116  1.1  riastrad 	WREG32(GRBM_SOFT_RESET, 0);
   1117  1.1  riastrad 
   1118  1.1  riastrad 	fw_data = (const __be32 *)rdev->pfp_fw->data;
   1119  1.1  riastrad 	WREG32(CP_PFP_UCODE_ADDR, 0);
   1120  1.1  riastrad 	for (i = 0; i < R700_PFP_UCODE_SIZE; i++)
   1121  1.1  riastrad 		WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
   1122  1.1  riastrad 	WREG32(CP_PFP_UCODE_ADDR, 0);
   1123  1.1  riastrad 
   1124  1.1  riastrad 	fw_data = (const __be32 *)rdev->me_fw->data;
   1125  1.1  riastrad 	WREG32(CP_ME_RAM_WADDR, 0);
   1126  1.1  riastrad 	for (i = 0; i < R700_PM4_UCODE_SIZE; i++)
   1127  1.1  riastrad 		WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
   1128  1.1  riastrad 
   1129  1.1  riastrad 	WREG32(CP_PFP_UCODE_ADDR, 0);
   1130  1.1  riastrad 	WREG32(CP_ME_RAM_WADDR, 0);
   1131  1.1  riastrad 	WREG32(CP_ME_RAM_RADDR, 0);
   1132  1.1  riastrad 	return 0;
   1133  1.1  riastrad }
   1134  1.1  riastrad 
   1135  1.1  riastrad void r700_cp_fini(struct radeon_device *rdev)
   1136  1.1  riastrad {
   1137  1.1  riastrad 	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
   1138  1.1  riastrad 	r700_cp_stop(rdev);
   1139  1.1  riastrad 	radeon_ring_fini(rdev, ring);
   1140  1.1  riastrad 	radeon_scratch_free(rdev, ring->rptr_save_reg);
   1141  1.1  riastrad }
   1142  1.1  riastrad 
   1143  1.1  riastrad void rv770_set_clk_bypass_mode(struct radeon_device *rdev)
   1144  1.1  riastrad {
   1145  1.1  riastrad 	u32 tmp, i;
   1146  1.1  riastrad 
   1147  1.1  riastrad 	if (rdev->flags & RADEON_IS_IGP)
   1148  1.1  riastrad 		return;
   1149  1.1  riastrad 
   1150  1.1  riastrad 	tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
   1151  1.1  riastrad 	tmp &= SCLK_MUX_SEL_MASK;
   1152  1.1  riastrad 	tmp |= SCLK_MUX_SEL(1) | SCLK_MUX_UPDATE;
   1153  1.1  riastrad 	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
   1154  1.1  riastrad 
   1155  1.1  riastrad 	for (i = 0; i < rdev->usec_timeout; i++) {
   1156  1.1  riastrad 		if (RREG32(CG_SPLL_STATUS) & SPLL_CHG_STATUS)
   1157  1.1  riastrad 			break;
   1158  1.1  riastrad 		udelay(1);
   1159  1.1  riastrad 	}
   1160  1.1  riastrad 
   1161  1.1  riastrad 	tmp &= ~SCLK_MUX_UPDATE;
   1162  1.1  riastrad 	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
   1163  1.1  riastrad 
   1164  1.1  riastrad 	tmp = RREG32(MPLL_CNTL_MODE);
   1165  1.1  riastrad 	if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730))
   1166  1.1  riastrad 		tmp &= ~RV730_MPLL_MCLK_SEL;
   1167  1.1  riastrad 	else
   1168  1.1  riastrad 		tmp &= ~MPLL_MCLK_SEL;
   1169  1.1  riastrad 	WREG32(MPLL_CNTL_MODE, tmp);
   1170  1.1  riastrad }
   1171  1.1  riastrad 
   1172  1.1  riastrad /*
   1173  1.1  riastrad  * Core functions
   1174  1.1  riastrad  */
   1175  1.1  riastrad static void rv770_gpu_init(struct radeon_device *rdev)
   1176  1.1  riastrad {
   1177  1.1  riastrad 	int i, j, num_qd_pipes;
   1178  1.1  riastrad 	u32 ta_aux_cntl;
   1179  1.1  riastrad 	u32 sx_debug_1;
   1180  1.1  riastrad 	u32 smx_dc_ctl0;
   1181  1.1  riastrad 	u32 db_debug3;
   1182  1.1  riastrad 	u32 num_gs_verts_per_thread;
   1183  1.1  riastrad 	u32 vgt_gs_per_es;
   1184  1.1  riastrad 	u32 gs_prim_buffer_depth = 0;
   1185  1.1  riastrad 	u32 sq_ms_fifo_sizes;
   1186  1.1  riastrad 	u32 sq_config;
   1187  1.1  riastrad 	u32 sq_thread_resource_mgmt;
   1188  1.1  riastrad 	u32 hdp_host_path_cntl;
   1189  1.1  riastrad 	u32 sq_dyn_gpr_size_simd_ab_0;
   1190  1.1  riastrad 	u32 gb_tiling_config = 0;
   1191  1.1  riastrad 	u32 cc_gc_shader_pipe_config = 0;
   1192  1.1  riastrad 	u32 mc_arb_ramcfg;
   1193  1.1  riastrad 	u32 db_debug4, tmp;
   1194  1.1  riastrad 	u32 inactive_pipes, shader_pipe_config;
   1195  1.1  riastrad 	u32 disabled_rb_mask;
   1196  1.1  riastrad 	unsigned active_number;
   1197  1.1  riastrad 
   1198  1.1  riastrad 	/* setup chip specs */
   1199  1.1  riastrad 	rdev->config.rv770.tiling_group_size = 256;
   1200  1.1  riastrad 	switch (rdev->family) {
   1201  1.1  riastrad 	case CHIP_RV770:
   1202  1.1  riastrad 		rdev->config.rv770.max_pipes = 4;
   1203  1.1  riastrad 		rdev->config.rv770.max_tile_pipes = 8;
   1204  1.1  riastrad 		rdev->config.rv770.max_simds = 10;
   1205  1.1  riastrad 		rdev->config.rv770.max_backends = 4;
   1206  1.1  riastrad 		rdev->config.rv770.max_gprs = 256;
   1207  1.1  riastrad 		rdev->config.rv770.max_threads = 248;
   1208  1.1  riastrad 		rdev->config.rv770.max_stack_entries = 512;
   1209  1.1  riastrad 		rdev->config.rv770.max_hw_contexts = 8;
   1210  1.1  riastrad 		rdev->config.rv770.max_gs_threads = 16 * 2;
   1211  1.1  riastrad 		rdev->config.rv770.sx_max_export_size = 128;
   1212  1.1  riastrad 		rdev->config.rv770.sx_max_export_pos_size = 16;
   1213  1.1  riastrad 		rdev->config.rv770.sx_max_export_smx_size = 112;
   1214  1.1  riastrad 		rdev->config.rv770.sq_num_cf_insts = 2;
   1215  1.1  riastrad 
   1216  1.1  riastrad 		rdev->config.rv770.sx_num_of_sets = 7;
   1217  1.1  riastrad 		rdev->config.rv770.sc_prim_fifo_size = 0xF9;
   1218  1.1  riastrad 		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
   1219  1.1  riastrad 		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
   1220  1.1  riastrad 		break;
   1221  1.1  riastrad 	case CHIP_RV730:
   1222  1.1  riastrad 		rdev->config.rv770.max_pipes = 2;
   1223  1.1  riastrad 		rdev->config.rv770.max_tile_pipes = 4;
   1224  1.1  riastrad 		rdev->config.rv770.max_simds = 8;
   1225  1.1  riastrad 		rdev->config.rv770.max_backends = 2;
   1226  1.1  riastrad 		rdev->config.rv770.max_gprs = 128;
   1227  1.1  riastrad 		rdev->config.rv770.max_threads = 248;
   1228  1.1  riastrad 		rdev->config.rv770.max_stack_entries = 256;
   1229  1.1  riastrad 		rdev->config.rv770.max_hw_contexts = 8;
   1230  1.1  riastrad 		rdev->config.rv770.max_gs_threads = 16 * 2;
   1231  1.1  riastrad 		rdev->config.rv770.sx_max_export_size = 256;
   1232  1.1  riastrad 		rdev->config.rv770.sx_max_export_pos_size = 32;
   1233  1.1  riastrad 		rdev->config.rv770.sx_max_export_smx_size = 224;
   1234  1.1  riastrad 		rdev->config.rv770.sq_num_cf_insts = 2;
   1235  1.1  riastrad 
   1236  1.1  riastrad 		rdev->config.rv770.sx_num_of_sets = 7;
   1237  1.1  riastrad 		rdev->config.rv770.sc_prim_fifo_size = 0xf9;
   1238  1.1  riastrad 		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
   1239  1.1  riastrad 		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
   1240  1.1  riastrad 		if (rdev->config.rv770.sx_max_export_pos_size > 16) {
   1241  1.1  riastrad 			rdev->config.rv770.sx_max_export_pos_size -= 16;
   1242  1.1  riastrad 			rdev->config.rv770.sx_max_export_smx_size += 16;
   1243  1.1  riastrad 		}
   1244  1.1  riastrad 		break;
   1245  1.1  riastrad 	case CHIP_RV710:
   1246  1.1  riastrad 		rdev->config.rv770.max_pipes = 2;
   1247  1.1  riastrad 		rdev->config.rv770.max_tile_pipes = 2;
   1248  1.1  riastrad 		rdev->config.rv770.max_simds = 2;
   1249  1.1  riastrad 		rdev->config.rv770.max_backends = 1;
   1250  1.1  riastrad 		rdev->config.rv770.max_gprs = 256;
   1251  1.1  riastrad 		rdev->config.rv770.max_threads = 192;
   1252  1.1  riastrad 		rdev->config.rv770.max_stack_entries = 256;
   1253  1.1  riastrad 		rdev->config.rv770.max_hw_contexts = 4;
   1254  1.1  riastrad 		rdev->config.rv770.max_gs_threads = 8 * 2;
   1255  1.1  riastrad 		rdev->config.rv770.sx_max_export_size = 128;
   1256  1.1  riastrad 		rdev->config.rv770.sx_max_export_pos_size = 16;
   1257  1.1  riastrad 		rdev->config.rv770.sx_max_export_smx_size = 112;
   1258  1.1  riastrad 		rdev->config.rv770.sq_num_cf_insts = 1;
   1259  1.1  riastrad 
   1260  1.1  riastrad 		rdev->config.rv770.sx_num_of_sets = 7;
   1261  1.1  riastrad 		rdev->config.rv770.sc_prim_fifo_size = 0x40;
   1262  1.1  riastrad 		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
   1263  1.1  riastrad 		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
   1264  1.1  riastrad 		break;
   1265  1.1  riastrad 	case CHIP_RV740:
   1266  1.1  riastrad 		rdev->config.rv770.max_pipes = 4;
   1267  1.1  riastrad 		rdev->config.rv770.max_tile_pipes = 4;
   1268  1.1  riastrad 		rdev->config.rv770.max_simds = 8;
   1269  1.1  riastrad 		rdev->config.rv770.max_backends = 4;
   1270  1.1  riastrad 		rdev->config.rv770.max_gprs = 256;
   1271  1.1  riastrad 		rdev->config.rv770.max_threads = 248;
   1272  1.1  riastrad 		rdev->config.rv770.max_stack_entries = 512;
   1273  1.1  riastrad 		rdev->config.rv770.max_hw_contexts = 8;
   1274  1.1  riastrad 		rdev->config.rv770.max_gs_threads = 16 * 2;
   1275  1.1  riastrad 		rdev->config.rv770.sx_max_export_size = 256;
   1276  1.1  riastrad 		rdev->config.rv770.sx_max_export_pos_size = 32;
   1277  1.1  riastrad 		rdev->config.rv770.sx_max_export_smx_size = 224;
   1278  1.1  riastrad 		rdev->config.rv770.sq_num_cf_insts = 2;
   1279  1.1  riastrad 
   1280  1.1  riastrad 		rdev->config.rv770.sx_num_of_sets = 7;
   1281  1.1  riastrad 		rdev->config.rv770.sc_prim_fifo_size = 0x100;
   1282  1.1  riastrad 		rdev->config.rv770.sc_hiz_tile_fifo_size = 0x30;
   1283  1.1  riastrad 		rdev->config.rv770.sc_earlyz_tile_fifo_fize = 0x130;
   1284  1.1  riastrad 
   1285  1.1  riastrad 		if (rdev->config.rv770.sx_max_export_pos_size > 16) {
   1286  1.1  riastrad 			rdev->config.rv770.sx_max_export_pos_size -= 16;
   1287  1.1  riastrad 			rdev->config.rv770.sx_max_export_smx_size += 16;
   1288  1.1  riastrad 		}
   1289  1.1  riastrad 		break;
   1290  1.1  riastrad 	default:
   1291  1.1  riastrad 		break;
   1292  1.1  riastrad 	}
   1293  1.1  riastrad 
   1294  1.1  riastrad 	/* Initialize HDP */
   1295  1.1  riastrad 	j = 0;
   1296  1.1  riastrad 	for (i = 0; i < 32; i++) {
   1297  1.1  riastrad 		WREG32((0x2c14 + j), 0x00000000);
   1298  1.1  riastrad 		WREG32((0x2c18 + j), 0x00000000);
   1299  1.1  riastrad 		WREG32((0x2c1c + j), 0x00000000);
   1300  1.1  riastrad 		WREG32((0x2c20 + j), 0x00000000);
   1301  1.1  riastrad 		WREG32((0x2c24 + j), 0x00000000);
   1302  1.1  riastrad 		j += 0x18;
   1303  1.1  riastrad 	}
   1304  1.1  riastrad 
   1305  1.1  riastrad 	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
   1306  1.1  riastrad 
   1307  1.1  riastrad 	/* setup tiling, simd, pipe config */
   1308  1.1  riastrad 	mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
   1309  1.1  riastrad 
   1310  1.1  riastrad 	shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG);
   1311  1.1  riastrad 	inactive_pipes = (shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT;
   1312  1.1  riastrad 	for (i = 0, tmp = 1, active_number = 0; i < R7XX_MAX_PIPES; i++) {
   1313  1.1  riastrad 		if (!(inactive_pipes & tmp)) {
   1314  1.1  riastrad 			active_number++;
   1315  1.1  riastrad 		}
   1316  1.1  riastrad 		tmp <<= 1;
   1317  1.1  riastrad 	}
   1318  1.1  riastrad 	if (active_number == 1) {
   1319  1.1  riastrad 		WREG32(SPI_CONFIG_CNTL, DISABLE_INTERP_1);
   1320  1.1  riastrad 	} else {
   1321  1.1  riastrad 		WREG32(SPI_CONFIG_CNTL, 0);
   1322  1.1  riastrad 	}
   1323  1.1  riastrad 
   1324  1.1  riastrad 	cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00;
   1325  1.1  riastrad 	tmp = rdev->config.rv770.max_simds -
   1326  1.1  riastrad 		r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK);
   1327  1.1  riastrad 	rdev->config.rv770.active_simds = tmp;
   1328  1.1  riastrad 
   1329  1.1  riastrad 	switch (rdev->config.rv770.max_tile_pipes) {
   1330  1.1  riastrad 	case 1:
   1331  1.1  riastrad 	default:
   1332  1.1  riastrad 		gb_tiling_config = PIPE_TILING(0);
   1333  1.1  riastrad 		break;
   1334  1.1  riastrad 	case 2:
   1335  1.1  riastrad 		gb_tiling_config = PIPE_TILING(1);
   1336  1.1  riastrad 		break;
   1337  1.1  riastrad 	case 4:
   1338  1.1  riastrad 		gb_tiling_config = PIPE_TILING(2);
   1339  1.1  riastrad 		break;
   1340  1.1  riastrad 	case 8:
   1341  1.1  riastrad 		gb_tiling_config = PIPE_TILING(3);
   1342  1.1  riastrad 		break;
   1343  1.1  riastrad 	}
   1344  1.1  riastrad 	rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes;
   1345  1.1  riastrad 
   1346  1.1  riastrad 	disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK;
   1347  1.1  riastrad 	tmp = 0;
   1348  1.1  riastrad 	for (i = 0; i < rdev->config.rv770.max_backends; i++)
   1349  1.1  riastrad 		tmp |= (1 << i);
   1350  1.1  riastrad 	/* if all the backends are disabled, fix it up here */
   1351  1.1  riastrad 	if ((disabled_rb_mask & tmp) == tmp) {
   1352  1.1  riastrad 		for (i = 0; i < rdev->config.rv770.max_backends; i++)
   1353  1.1  riastrad 			disabled_rb_mask &= ~(1 << i);
   1354  1.1  riastrad 	}
   1355  1.1  riastrad 	tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT;
   1356  1.1  riastrad 	tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends,
   1357  1.1  riastrad 					R7XX_MAX_BACKENDS, disabled_rb_mask);
   1358  1.1  riastrad 	gb_tiling_config |= tmp << 16;
   1359  1.1  riastrad 	rdev->config.rv770.backend_map = tmp;
   1360  1.1  riastrad 
   1361  1.1  riastrad 	if (rdev->family == CHIP_RV770)
   1362  1.1  riastrad 		gb_tiling_config |= BANK_TILING(1);
   1363  1.1  riastrad 	else {
   1364  1.1  riastrad 		if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT)
   1365  1.1  riastrad 			gb_tiling_config |= BANK_TILING(1);
   1366  1.1  riastrad 		else
   1367  1.1  riastrad 			gb_tiling_config |= BANK_TILING(0);
   1368  1.1  riastrad 	}
   1369  1.1  riastrad 	rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3);
   1370  1.1  riastrad 	gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
   1371  1.1  riastrad 	if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) {
   1372  1.1  riastrad 		gb_tiling_config |= ROW_TILING(3);
   1373  1.1  riastrad 		gb_tiling_config |= SAMPLE_SPLIT(3);
   1374  1.1  riastrad 	} else {
   1375  1.1  riastrad 		gb_tiling_config |=
   1376  1.1  riastrad 			ROW_TILING(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
   1377  1.1  riastrad 		gb_tiling_config |=
   1378  1.1  riastrad 			SAMPLE_SPLIT(((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT));
   1379  1.1  riastrad 	}
   1380  1.1  riastrad 
   1381  1.1  riastrad 	gb_tiling_config |= BANK_SWAPS(1);
   1382  1.1  riastrad 	rdev->config.rv770.tile_config = gb_tiling_config;
   1383  1.1  riastrad 
   1384  1.1  riastrad 	WREG32(GB_TILING_CONFIG, gb_tiling_config);
   1385  1.1  riastrad 	WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
   1386  1.1  riastrad 	WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff));
   1387  1.1  riastrad 	WREG32(DMA_TILING_CONFIG, (gb_tiling_config & 0xffff));
   1388  1.1  riastrad 	WREG32(DMA_TILING_CONFIG2, (gb_tiling_config & 0xffff));
   1389  1.1  riastrad 	if (rdev->family == CHIP_RV730) {
   1390  1.1  riastrad 		WREG32(UVD_UDEC_DB_TILING_CONFIG, (gb_tiling_config & 0xffff));
   1391  1.1  riastrad 		WREG32(UVD_UDEC_DBW_TILING_CONFIG, (gb_tiling_config & 0xffff));
   1392  1.1  riastrad 		WREG32(UVD_UDEC_TILING_CONFIG, (gb_tiling_config & 0xffff));
   1393  1.1  riastrad 	}
   1394  1.1  riastrad 
   1395  1.1  riastrad 	WREG32(CGTS_SYS_TCC_DISABLE, 0);
   1396  1.1  riastrad 	WREG32(CGTS_TCC_DISABLE, 0);
   1397  1.1  riastrad 	WREG32(CGTS_USER_SYS_TCC_DISABLE, 0);
   1398  1.1  riastrad 	WREG32(CGTS_USER_TCC_DISABLE, 0);
   1399  1.1  riastrad 
   1400  1.1  riastrad 
   1401  1.1  riastrad 	num_qd_pipes = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8);
   1402  1.1  riastrad 	WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK);
   1403  1.1  riastrad 	WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK);
   1404  1.1  riastrad 
   1405  1.1  riastrad 	/* set HW defaults for 3D engine */
   1406  1.1  riastrad 	WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
   1407  1.1  riastrad 				     ROQ_IB2_START(0x2b)));
   1408  1.1  riastrad 
   1409  1.1  riastrad 	WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30));
   1410  1.1  riastrad 
   1411  1.1  riastrad 	ta_aux_cntl = RREG32(TA_CNTL_AUX);
   1412  1.1  riastrad 	WREG32(TA_CNTL_AUX, ta_aux_cntl | DISABLE_CUBE_ANISO);
   1413  1.1  riastrad 
   1414  1.1  riastrad 	sx_debug_1 = RREG32(SX_DEBUG_1);
   1415  1.1  riastrad 	sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
   1416  1.1  riastrad 	WREG32(SX_DEBUG_1, sx_debug_1);
   1417  1.1  riastrad 
   1418  1.1  riastrad 	smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
   1419  1.1  riastrad 	smx_dc_ctl0 &= ~CACHE_DEPTH(0x1ff);
   1420  1.1  riastrad 	smx_dc_ctl0 |= CACHE_DEPTH((rdev->config.rv770.sx_num_of_sets * 64) - 1);
   1421  1.1  riastrad 	WREG32(SMX_DC_CTL0, smx_dc_ctl0);
   1422  1.1  riastrad 
   1423  1.1  riastrad 	if (rdev->family != CHIP_RV740)
   1424  1.1  riastrad 		WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) |
   1425  1.1  riastrad 				       GS_FLUSH_CTL(4) |
   1426  1.1  riastrad 				       ACK_FLUSH_CTL(3) |
   1427  1.1  riastrad 				       SYNC_FLUSH_CTL));
   1428  1.1  riastrad 
   1429  1.1  riastrad 	if (rdev->family != CHIP_RV770)
   1430  1.1  riastrad 		WREG32(SMX_SAR_CTL0, 0x00003f3f);
   1431  1.1  riastrad 
   1432  1.1  riastrad 	db_debug3 = RREG32(DB_DEBUG3);
   1433  1.1  riastrad 	db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);
   1434  1.1  riastrad 	switch (rdev->family) {
   1435  1.1  riastrad 	case CHIP_RV770:
   1436  1.1  riastrad 	case CHIP_RV740:
   1437  1.1  riastrad 		db_debug3 |= DB_CLK_OFF_DELAY(0x1f);
   1438  1.1  riastrad 		break;
   1439  1.1  riastrad 	case CHIP_RV710:
   1440  1.1  riastrad 	case CHIP_RV730:
   1441  1.1  riastrad 	default:
   1442  1.1  riastrad 		db_debug3 |= DB_CLK_OFF_DELAY(2);
   1443  1.1  riastrad 		break;
   1444  1.1  riastrad 	}
   1445  1.1  riastrad 	WREG32(DB_DEBUG3, db_debug3);
   1446  1.1  riastrad 
   1447  1.1  riastrad 	if (rdev->family != CHIP_RV770) {
   1448  1.1  riastrad 		db_debug4 = RREG32(DB_DEBUG4);
   1449  1.1  riastrad 		db_debug4 |= DISABLE_TILE_COVERED_FOR_PS_ITER;
   1450  1.1  riastrad 		WREG32(DB_DEBUG4, db_debug4);
   1451  1.1  riastrad 	}
   1452  1.1  riastrad 
   1453  1.1  riastrad 	WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.rv770.sx_max_export_size / 4) - 1) |
   1454  1.1  riastrad 					POSITION_BUFFER_SIZE((rdev->config.rv770.sx_max_export_pos_size / 4) - 1) |
   1455  1.1  riastrad 					SMX_BUFFER_SIZE((rdev->config.rv770.sx_max_export_smx_size / 4) - 1)));
   1456  1.1  riastrad 
   1457  1.1  riastrad 	WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.rv770.sc_prim_fifo_size) |
   1458  1.1  riastrad 				 SC_HIZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_hiz_tile_fifo_size) |
   1459  1.1  riastrad 				 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_earlyz_tile_fifo_fize)));
   1460  1.1  riastrad 
   1461  1.1  riastrad 	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
   1462  1.1  riastrad 
   1463  1.1  riastrad 	WREG32(VGT_NUM_INSTANCES, 1);
   1464  1.1  riastrad 
   1465  1.1  riastrad 	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
   1466  1.1  riastrad 
   1467  1.1  riastrad 	WREG32(CP_PERFMON_CNTL, 0);
   1468  1.1  riastrad 
   1469  1.1  riastrad 	sq_ms_fifo_sizes = (CACHE_FIFO_SIZE(16 * rdev->config.rv770.sq_num_cf_insts) |
   1470  1.1  riastrad 			    DONE_FIFO_HIWATER(0xe0) |
   1471  1.1  riastrad 			    ALU_UPDATE_FIFO_HIWATER(0x8));
   1472  1.1  riastrad 	switch (rdev->family) {
   1473  1.1  riastrad 	case CHIP_RV770:
   1474  1.1  riastrad 	case CHIP_RV730:
   1475  1.1  riastrad 	case CHIP_RV710:
   1476  1.1  riastrad 		sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x1);
   1477  1.1  riastrad 		break;
   1478  1.1  riastrad 	case CHIP_RV740:
   1479  1.1  riastrad 	default:
   1480  1.1  riastrad 		sq_ms_fifo_sizes |= FETCH_FIFO_HIWATER(0x4);
   1481  1.1  riastrad 		break;
   1482  1.1  riastrad 	}
   1483  1.1  riastrad 	WREG32(SQ_MS_FIFO_SIZES, sq_ms_fifo_sizes);
   1484  1.1  riastrad 
   1485  1.1  riastrad 	/* SQ_CONFIG, SQ_GPR_RESOURCE_MGMT, SQ_THREAD_RESOURCE_MGMT, SQ_STACK_RESOURCE_MGMT
   1486  1.1  riastrad 	 * should be adjusted as needed by the 2D/3D drivers.  This just sets default values
   1487  1.1  riastrad 	 */
   1488  1.1  riastrad 	sq_config = RREG32(SQ_CONFIG);
   1489  1.1  riastrad 	sq_config &= ~(PS_PRIO(3) |
   1490  1.1  riastrad 		       VS_PRIO(3) |
   1491  1.1  riastrad 		       GS_PRIO(3) |
   1492  1.1  riastrad 		       ES_PRIO(3));
   1493  1.1  riastrad 	sq_config |= (DX9_CONSTS |
   1494  1.1  riastrad 		      VC_ENABLE |
   1495  1.1  riastrad 		      EXPORT_SRC_C |
   1496  1.1  riastrad 		      PS_PRIO(0) |
   1497  1.1  riastrad 		      VS_PRIO(1) |
   1498  1.1  riastrad 		      GS_PRIO(2) |
   1499  1.1  riastrad 		      ES_PRIO(3));
   1500  1.1  riastrad 	if (rdev->family == CHIP_RV710)
   1501  1.1  riastrad 		/* no vertex cache */
   1502  1.1  riastrad 		sq_config &= ~VC_ENABLE;
   1503  1.1  riastrad 
   1504  1.1  riastrad 	WREG32(SQ_CONFIG, sq_config);
   1505  1.1  riastrad 
   1506  1.1  riastrad 	WREG32(SQ_GPR_RESOURCE_MGMT_1,  (NUM_PS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
   1507  1.1  riastrad 					 NUM_VS_GPRS((rdev->config.rv770.max_gprs * 24)/64) |
   1508  1.1  riastrad 					 NUM_CLAUSE_TEMP_GPRS(((rdev->config.rv770.max_gprs * 24)/64)/2)));
   1509  1.1  riastrad 
   1510  1.1  riastrad 	WREG32(SQ_GPR_RESOURCE_MGMT_2,  (NUM_GS_GPRS((rdev->config.rv770.max_gprs * 7)/64) |
   1511  1.1  riastrad 					 NUM_ES_GPRS((rdev->config.rv770.max_gprs * 7)/64)));
   1512  1.1  riastrad 
   1513  1.1  riastrad 	sq_thread_resource_mgmt = (NUM_PS_THREADS((rdev->config.rv770.max_threads * 4)/8) |
   1514  1.1  riastrad 				   NUM_VS_THREADS((rdev->config.rv770.max_threads * 2)/8) |
   1515  1.1  riastrad 				   NUM_ES_THREADS((rdev->config.rv770.max_threads * 1)/8));
   1516  1.1  riastrad 	if (((rdev->config.rv770.max_threads * 1) / 8) > rdev->config.rv770.max_gs_threads)
   1517  1.1  riastrad 		sq_thread_resource_mgmt |= NUM_GS_THREADS(rdev->config.rv770.max_gs_threads);
   1518  1.1  riastrad 	else
   1519  1.1  riastrad 		sq_thread_resource_mgmt |= NUM_GS_THREADS((rdev->config.rv770.max_gs_threads * 1)/8);
   1520  1.1  riastrad 	WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt);
   1521  1.1  riastrad 
   1522  1.1  riastrad 	WREG32(SQ_STACK_RESOURCE_MGMT_1, (NUM_PS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
   1523  1.1  riastrad 						     NUM_VS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
   1524  1.1  riastrad 
   1525  1.1  riastrad 	WREG32(SQ_STACK_RESOURCE_MGMT_2, (NUM_GS_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4) |
   1526  1.1  riastrad 						     NUM_ES_STACK_ENTRIES((rdev->config.rv770.max_stack_entries * 1)/4)));
   1527  1.1  riastrad 
   1528  1.1  riastrad 	sq_dyn_gpr_size_simd_ab_0 = (SIMDA_RING0((rdev->config.rv770.max_gprs * 38)/64) |
   1529  1.1  riastrad 				     SIMDA_RING1((rdev->config.rv770.max_gprs * 38)/64) |
   1530  1.1  riastrad 				     SIMDB_RING0((rdev->config.rv770.max_gprs * 38)/64) |
   1531  1.1  riastrad 				     SIMDB_RING1((rdev->config.rv770.max_gprs * 38)/64));
   1532  1.1  riastrad 
   1533  1.1  riastrad 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_0, sq_dyn_gpr_size_simd_ab_0);
   1534  1.1  riastrad 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_1, sq_dyn_gpr_size_simd_ab_0);
   1535  1.1  riastrad 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_2, sq_dyn_gpr_size_simd_ab_0);
   1536  1.1  riastrad 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_3, sq_dyn_gpr_size_simd_ab_0);
   1537  1.1  riastrad 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_4, sq_dyn_gpr_size_simd_ab_0);
   1538  1.1  riastrad 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_5, sq_dyn_gpr_size_simd_ab_0);
   1539  1.1  riastrad 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_6, sq_dyn_gpr_size_simd_ab_0);
   1540  1.1  riastrad 	WREG32(SQ_DYN_GPR_SIZE_SIMD_AB_7, sq_dyn_gpr_size_simd_ab_0);
   1541  1.1  riastrad 
   1542  1.1  riastrad 	WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
   1543  1.1  riastrad 					  FORCE_EOV_MAX_REZ_CNT(255)));
   1544  1.1  riastrad 
   1545  1.1  riastrad 	if (rdev->family == CHIP_RV710)
   1546  1.1  riastrad 		WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(TC_ONLY) |
   1547  1.1  riastrad 						AUTO_INVLD_EN(ES_AND_GS_AUTO)));
   1548  1.1  riastrad 	else
   1549  1.1  riastrad 		WREG32(VGT_CACHE_INVALIDATION, (CACHE_INVALIDATION(VC_AND_TC) |
   1550  1.1  riastrad 						AUTO_INVLD_EN(ES_AND_GS_AUTO)));
   1551  1.1  riastrad 
   1552  1.1  riastrad 	switch (rdev->family) {
   1553  1.1  riastrad 	case CHIP_RV770:
   1554  1.1  riastrad 	case CHIP_RV730:
   1555  1.1  riastrad 	case CHIP_RV740:
   1556  1.1  riastrad 		gs_prim_buffer_depth = 384;
   1557  1.1  riastrad 		break;
   1558  1.1  riastrad 	case CHIP_RV710:
   1559  1.1  riastrad 		gs_prim_buffer_depth = 128;
   1560  1.1  riastrad 		break;
   1561  1.1  riastrad 	default:
   1562  1.1  riastrad 		break;
   1563  1.1  riastrad 	}
   1564  1.1  riastrad 
   1565  1.1  riastrad 	num_gs_verts_per_thread = rdev->config.rv770.max_pipes * 16;
   1566  1.1  riastrad 	vgt_gs_per_es = gs_prim_buffer_depth + num_gs_verts_per_thread;
   1567  1.1  riastrad 	/* Max value for this is 256 */
   1568  1.1  riastrad 	if (vgt_gs_per_es > 256)
   1569  1.1  riastrad 		vgt_gs_per_es = 256;
   1570  1.1  riastrad 
   1571  1.1  riastrad 	WREG32(VGT_ES_PER_GS, 128);
   1572  1.1  riastrad 	WREG32(VGT_GS_PER_ES, vgt_gs_per_es);
   1573  1.1  riastrad 	WREG32(VGT_GS_PER_VS, 2);
   1574  1.1  riastrad 
   1575  1.1  riastrad 	/* more default values. 2D/3D driver should adjust as needed */
   1576  1.1  riastrad 	WREG32(VGT_GS_VERTEX_REUSE, 16);
   1577  1.1  riastrad 	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
   1578  1.1  riastrad 	WREG32(VGT_STRMOUT_EN, 0);
   1579  1.1  riastrad 	WREG32(SX_MISC, 0);
   1580  1.1  riastrad 	WREG32(PA_SC_MODE_CNTL, 0);
   1581  1.1  riastrad 	WREG32(PA_SC_EDGERULE, 0xaaaaaaaa);
   1582  1.1  riastrad 	WREG32(PA_SC_AA_CONFIG, 0);
   1583  1.1  riastrad 	WREG32(PA_SC_CLIPRECT_RULE, 0xffff);
   1584  1.1  riastrad 	WREG32(PA_SC_LINE_STIPPLE, 0);
   1585  1.1  riastrad 	WREG32(SPI_INPUT_Z, 0);
   1586  1.1  riastrad 	WREG32(SPI_PS_IN_CONTROL_0, NUM_INTERP(2));
   1587  1.1  riastrad 	WREG32(CB_COLOR7_FRAG, 0);
   1588  1.1  riastrad 
   1589  1.1  riastrad 	/* clear render buffer base addresses */
   1590  1.1  riastrad 	WREG32(CB_COLOR0_BASE, 0);
   1591  1.1  riastrad 	WREG32(CB_COLOR1_BASE, 0);
   1592  1.1  riastrad 	WREG32(CB_COLOR2_BASE, 0);
   1593  1.1  riastrad 	WREG32(CB_COLOR3_BASE, 0);
   1594  1.1  riastrad 	WREG32(CB_COLOR4_BASE, 0);
   1595  1.1  riastrad 	WREG32(CB_COLOR5_BASE, 0);
   1596  1.1  riastrad 	WREG32(CB_COLOR6_BASE, 0);
   1597  1.1  riastrad 	WREG32(CB_COLOR7_BASE, 0);
   1598  1.1  riastrad 
   1599  1.1  riastrad 	WREG32(TCP_CNTL, 0);
   1600  1.1  riastrad 
   1601  1.1  riastrad 	hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
   1602  1.1  riastrad 	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
   1603  1.1  riastrad 
   1604  1.1  riastrad 	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
   1605  1.1  riastrad 
   1606  1.1  riastrad 	WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
   1607  1.1  riastrad 					  NUM_CLIP_SEQ(3)));
   1608  1.1  riastrad 	WREG32(VC_ENHANCE, 0);
   1609  1.1  riastrad }
   1610  1.1  riastrad 
   1611  1.1  riastrad void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
   1612  1.1  riastrad {
   1613  1.1  riastrad 	u64 size_bf, size_af;
   1614  1.1  riastrad 
   1615  1.1  riastrad 	if (mc->mc_vram_size > 0xE0000000) {
   1616  1.1  riastrad 		/* leave room for at least 512M GTT */
   1617  1.1  riastrad 		dev_warn(rdev->dev, "limiting VRAM\n");
   1618  1.1  riastrad 		mc->real_vram_size = 0xE0000000;
   1619  1.1  riastrad 		mc->mc_vram_size = 0xE0000000;
   1620  1.1  riastrad 	}
   1621  1.1  riastrad 	if (rdev->flags & RADEON_IS_AGP) {
   1622  1.1  riastrad 		size_bf = mc->gtt_start;
   1623  1.1  riastrad 		size_af = mc->mc_mask - mc->gtt_end;
   1624  1.1  riastrad 		if (size_bf > size_af) {
   1625  1.1  riastrad 			if (mc->mc_vram_size > size_bf) {
   1626  1.1  riastrad 				dev_warn(rdev->dev, "limiting VRAM\n");
   1627  1.1  riastrad 				mc->real_vram_size = size_bf;
   1628  1.1  riastrad 				mc->mc_vram_size = size_bf;
   1629  1.1  riastrad 			}
   1630  1.1  riastrad 			mc->vram_start = mc->gtt_start - mc->mc_vram_size;
   1631  1.1  riastrad 		} else {
   1632  1.1  riastrad 			if (mc->mc_vram_size > size_af) {
   1633  1.1  riastrad 				dev_warn(rdev->dev, "limiting VRAM\n");
   1634  1.1  riastrad 				mc->real_vram_size = size_af;
   1635  1.1  riastrad 				mc->mc_vram_size = size_af;
   1636  1.1  riastrad 			}
   1637  1.1  riastrad 			mc->vram_start = mc->gtt_end + 1;
   1638  1.1  riastrad 		}
   1639  1.1  riastrad 		mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
   1640  1.1  riastrad 		dev_info(rdev->dev, "VRAM: %"PRIu64"M 0x%08"PRIX64" - 0x%08"PRIX64" (%"PRIu64"M used)\n",
   1641  1.1  riastrad 				mc->mc_vram_size >> 20, mc->vram_start,
   1642  1.1  riastrad 				mc->vram_end, mc->real_vram_size >> 20);
   1643  1.1  riastrad 	} else {
   1644  1.1  riastrad 		radeon_vram_location(rdev, &rdev->mc, 0);
   1645  1.1  riastrad 		rdev->mc.gtt_base_align = 0;
   1646  1.1  riastrad 		radeon_gtt_location(rdev, mc);
   1647  1.1  riastrad 	}
   1648  1.1  riastrad }
   1649  1.1  riastrad 
   1650  1.1  riastrad static int rv770_mc_init(struct radeon_device *rdev)
   1651  1.1  riastrad {
   1652  1.1  riastrad 	u32 tmp;
   1653  1.1  riastrad 	int chansize, numchan;
   1654  1.1  riastrad 
   1655  1.1  riastrad 	/* Get VRAM informations */
   1656  1.1  riastrad 	rdev->mc.vram_is_ddr = true;
   1657  1.1  riastrad 	tmp = RREG32(MC_ARB_RAMCFG);
   1658  1.1  riastrad 	if (tmp & CHANSIZE_OVERRIDE) {
   1659  1.1  riastrad 		chansize = 16;
   1660  1.1  riastrad 	} else if (tmp & CHANSIZE_MASK) {
   1661  1.1  riastrad 		chansize = 64;
   1662  1.1  riastrad 	} else {
   1663  1.1  riastrad 		chansize = 32;
   1664  1.1  riastrad 	}
   1665  1.1  riastrad 	tmp = RREG32(MC_SHARED_CHMAP);
   1666  1.1  riastrad 	switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
   1667  1.1  riastrad 	case 0:
   1668  1.1  riastrad 	default:
   1669  1.1  riastrad 		numchan = 1;
   1670  1.1  riastrad 		break;
   1671  1.1  riastrad 	case 1:
   1672  1.1  riastrad 		numchan = 2;
   1673  1.1  riastrad 		break;
   1674  1.1  riastrad 	case 2:
   1675  1.1  riastrad 		numchan = 4;
   1676  1.1  riastrad 		break;
   1677  1.1  riastrad 	case 3:
   1678  1.1  riastrad 		numchan = 8;
   1679  1.1  riastrad 		break;
   1680  1.1  riastrad 	}
   1681  1.1  riastrad 	rdev->mc.vram_width = numchan * chansize;
   1682  1.1  riastrad 	/* Could aper size report 0 ? */
   1683  1.1  riastrad 	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
   1684  1.1  riastrad 	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
   1685  1.1  riastrad 	/* Setup GPU memory space */
   1686  1.1  riastrad 	rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
   1687  1.1  riastrad 	rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
   1688  1.1  riastrad 	rdev->mc.visible_vram_size = rdev->mc.aper_size;
   1689  1.1  riastrad 	r700_vram_gtt_location(rdev, &rdev->mc);
   1690  1.1  riastrad 	radeon_update_bandwidth_info(rdev);
   1691  1.1  riastrad 
   1692  1.1  riastrad 	return 0;
   1693  1.1  riastrad }
   1694  1.1  riastrad 
   1695  1.2  riastrad static void rv770_uvd_init(struct radeon_device *rdev)
   1696  1.2  riastrad {
   1697  1.2  riastrad 	int r;
   1698  1.2  riastrad 
   1699  1.2  riastrad 	if (!rdev->has_uvd)
   1700  1.2  riastrad 		return;
   1701  1.2  riastrad 
   1702  1.2  riastrad 	r = radeon_uvd_init(rdev);
   1703  1.2  riastrad 	if (r) {
   1704  1.2  riastrad 		dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
   1705  1.2  riastrad 		/*
   1706  1.2  riastrad 		 * At this point rdev->uvd.vcpu_bo is NULL which trickles down
   1707  1.2  riastrad 		 * to early fails uvd_v2_2_resume() and thus nothing happens
   1708  1.2  riastrad 		 * there. So it is pointless to try to go through that code
   1709  1.2  riastrad 		 * hence why we disable uvd here.
   1710  1.2  riastrad 		 */
   1711  1.2  riastrad 		rdev->has_uvd = false;
   1712  1.2  riastrad 		return;
   1713  1.2  riastrad 	}
   1714  1.2  riastrad 	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
   1715  1.2  riastrad 	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
   1716  1.2  riastrad }
   1717  1.2  riastrad 
   1718  1.2  riastrad static void rv770_uvd_start(struct radeon_device *rdev)
   1719  1.2  riastrad {
   1720  1.2  riastrad 	int r;
   1721  1.2  riastrad 
   1722  1.2  riastrad 	if (!rdev->has_uvd)
   1723  1.2  riastrad 		return;
   1724  1.2  riastrad 
   1725  1.2  riastrad 	r = uvd_v2_2_resume(rdev);
   1726  1.2  riastrad 	if (r) {
   1727  1.2  riastrad 		dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
   1728  1.2  riastrad 		goto error;
   1729  1.2  riastrad 	}
   1730  1.2  riastrad 	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
   1731  1.2  riastrad 	if (r) {
   1732  1.2  riastrad 		dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
   1733  1.2  riastrad 		goto error;
   1734  1.2  riastrad 	}
   1735  1.2  riastrad 	return;
   1736  1.2  riastrad 
   1737  1.2  riastrad error:
   1738  1.2  riastrad 	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
   1739  1.2  riastrad }
   1740  1.2  riastrad 
   1741  1.2  riastrad static void rv770_uvd_resume(struct radeon_device *rdev)
   1742  1.2  riastrad {
   1743  1.2  riastrad 	struct radeon_ring *ring;
   1744  1.2  riastrad 	int r;
   1745  1.2  riastrad 
   1746  1.2  riastrad 	if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
   1747  1.2  riastrad 		return;
   1748  1.2  riastrad 
   1749  1.2  riastrad 	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
   1750  1.2  riastrad 	r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0));
   1751  1.2  riastrad 	if (r) {
   1752  1.2  riastrad 		dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
   1753  1.2  riastrad 		return;
   1754  1.2  riastrad 	}
   1755  1.2  riastrad 	r = uvd_v1_0_init(rdev);
   1756  1.2  riastrad 	if (r) {
   1757  1.2  riastrad 		dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
   1758  1.2  riastrad 		return;
   1759  1.2  riastrad 	}
   1760  1.2  riastrad }
   1761  1.2  riastrad 
   1762  1.1  riastrad static int rv770_startup(struct radeon_device *rdev)
   1763  1.1  riastrad {
   1764  1.1  riastrad 	struct radeon_ring *ring;
   1765  1.1  riastrad 	int r;
   1766  1.1  riastrad 
   1767  1.1  riastrad 	/* enable pcie gen2 link */
   1768  1.1  riastrad 	rv770_pcie_gen2_enable(rdev);
   1769  1.1  riastrad 
   1770  1.1  riastrad 	/* scratch needs to be initialized before MC */
   1771  1.1  riastrad 	r = r600_vram_scratch_init(rdev);
   1772  1.1  riastrad 	if (r)
   1773  1.1  riastrad 		return r;
   1774  1.1  riastrad 
   1775  1.1  riastrad 	rv770_mc_program(rdev);
   1776  1.1  riastrad 
   1777  1.1  riastrad 	if (rdev->flags & RADEON_IS_AGP) {
   1778  1.1  riastrad 		rv770_agp_enable(rdev);
   1779  1.1  riastrad 	} else {
   1780  1.1  riastrad 		r = rv770_pcie_gart_enable(rdev);
   1781  1.1  riastrad 		if (r)
   1782  1.1  riastrad 			return r;
   1783  1.1  riastrad 	}
   1784  1.1  riastrad 
   1785  1.1  riastrad 	rv770_gpu_init(rdev);
   1786  1.1  riastrad 
   1787  1.1  riastrad 	/* allocate wb buffer */
   1788  1.1  riastrad 	r = radeon_wb_init(rdev);
   1789  1.1  riastrad 	if (r)
   1790  1.1  riastrad 		return r;
   1791  1.1  riastrad 
   1792  1.1  riastrad 	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
   1793  1.1  riastrad 	if (r) {
   1794  1.1  riastrad 		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
   1795  1.1  riastrad 		return r;
   1796  1.1  riastrad 	}
   1797  1.1  riastrad 
   1798  1.1  riastrad 	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_DMA_INDEX);
   1799  1.1  riastrad 	if (r) {
   1800  1.1  riastrad 		dev_err(rdev->dev, "failed initializing DMA fences (%d).\n", r);
   1801  1.1  riastrad 		return r;
   1802  1.1  riastrad 	}
   1803  1.1  riastrad 
   1804  1.2  riastrad 	rv770_uvd_start(rdev);
   1805  1.1  riastrad 
   1806  1.1  riastrad 	/* Enable IRQ */
   1807  1.1  riastrad 	if (!rdev->irq.installed) {
   1808  1.1  riastrad 		r = radeon_irq_kms_init(rdev);
   1809  1.1  riastrad 		if (r)
   1810  1.1  riastrad 			return r;
   1811  1.1  riastrad 	}
   1812  1.1  riastrad 
   1813  1.1  riastrad 	r = r600_irq_init(rdev);
   1814  1.1  riastrad 	if (r) {
   1815  1.1  riastrad 		DRM_ERROR("radeon: IH init failed (%d).\n", r);
   1816  1.1  riastrad 		radeon_irq_kms_fini(rdev);
   1817  1.1  riastrad 		return r;
   1818  1.1  riastrad 	}
   1819  1.1  riastrad 	r600_irq_set(rdev);
   1820  1.1  riastrad 
   1821  1.1  riastrad 	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
   1822  1.1  riastrad 	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
   1823  1.1  riastrad 			     RADEON_CP_PACKET2);
   1824  1.1  riastrad 	if (r)
   1825  1.1  riastrad 		return r;
   1826  1.1  riastrad 
   1827  1.1  riastrad 	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
   1828  1.1  riastrad 	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
   1829  1.1  riastrad 			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
   1830  1.1  riastrad 	if (r)
   1831  1.1  riastrad 		return r;
   1832  1.1  riastrad 
   1833  1.1  riastrad 	r = rv770_cp_load_microcode(rdev);
   1834  1.1  riastrad 	if (r)
   1835  1.1  riastrad 		return r;
   1836  1.1  riastrad 	r = r600_cp_resume(rdev);
   1837  1.1  riastrad 	if (r)
   1838  1.1  riastrad 		return r;
   1839  1.1  riastrad 
   1840  1.1  riastrad 	r = r600_dma_resume(rdev);
   1841  1.1  riastrad 	if (r)
   1842  1.1  riastrad 		return r;
   1843  1.1  riastrad 
   1844  1.2  riastrad 	rv770_uvd_resume(rdev);
   1845  1.1  riastrad 
   1846  1.1  riastrad 	r = radeon_ib_pool_init(rdev);
   1847  1.1  riastrad 	if (r) {
   1848  1.1  riastrad 		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
   1849  1.1  riastrad 		return r;
   1850  1.1  riastrad 	}
   1851  1.1  riastrad 
   1852  1.1  riastrad 	r = radeon_audio_init(rdev);
   1853  1.1  riastrad 	if (r) {
   1854  1.1  riastrad 		DRM_ERROR("radeon: audio init failed\n");
   1855  1.1  riastrad 		return r;
   1856  1.1  riastrad 	}
   1857  1.1  riastrad 
   1858  1.1  riastrad 	return 0;
   1859  1.1  riastrad }
   1860  1.1  riastrad 
   1861  1.1  riastrad int rv770_resume(struct radeon_device *rdev)
   1862  1.1  riastrad {
   1863  1.1  riastrad 	int r;
   1864  1.1  riastrad 
   1865  1.1  riastrad 	/* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
   1866  1.1  riastrad 	 * posting will perform necessary task to bring back GPU into good
   1867  1.1  riastrad 	 * shape.
   1868  1.1  riastrad 	 */
   1869  1.1  riastrad 	/* post card */
   1870  1.1  riastrad 	atom_asic_init(rdev->mode_info.atom_context);
   1871  1.1  riastrad 
   1872  1.1  riastrad 	/* init golden registers */
   1873  1.1  riastrad 	rv770_init_golden_registers(rdev);
   1874  1.1  riastrad 
   1875  1.1  riastrad 	if (rdev->pm.pm_method == PM_METHOD_DPM)
   1876  1.1  riastrad 		radeon_pm_resume(rdev);
   1877  1.1  riastrad 
   1878  1.1  riastrad 	rdev->accel_working = true;
   1879  1.1  riastrad 	r = rv770_startup(rdev);
   1880  1.1  riastrad 	if (r) {
   1881  1.1  riastrad 		DRM_ERROR("r600 startup failed on resume\n");
   1882  1.1  riastrad 		rdev->accel_working = false;
   1883  1.1  riastrad 		return r;
   1884  1.1  riastrad 	}
   1885  1.1  riastrad 
   1886  1.1  riastrad 	return r;
   1887  1.1  riastrad 
   1888  1.1  riastrad }
   1889  1.1  riastrad 
   1890  1.1  riastrad int rv770_suspend(struct radeon_device *rdev)
   1891  1.1  riastrad {
   1892  1.1  riastrad 	radeon_pm_suspend(rdev);
   1893  1.1  riastrad 	radeon_audio_fini(rdev);
   1894  1.2  riastrad 	if (rdev->has_uvd) {
   1895  1.2  riastrad 		uvd_v1_0_fini(rdev);
   1896  1.2  riastrad 		radeon_uvd_suspend(rdev);
   1897  1.2  riastrad 	}
   1898  1.1  riastrad 	r700_cp_stop(rdev);
   1899  1.1  riastrad 	r600_dma_stop(rdev);
   1900  1.1  riastrad 	r600_irq_suspend(rdev);
   1901  1.1  riastrad 	radeon_wb_disable(rdev);
   1902  1.1  riastrad 	rv770_pcie_gart_disable(rdev);
   1903  1.1  riastrad 
   1904  1.1  riastrad 	return 0;
   1905  1.1  riastrad }
   1906  1.1  riastrad 
   1907  1.1  riastrad /* Plan is to move initialization in that function and use
   1908  1.1  riastrad  * helper function so that radeon_device_init pretty much
   1909  1.1  riastrad  * do nothing more than calling asic specific function. This
   1910  1.1  riastrad  * should also allow to remove a bunch of callback function
   1911  1.1  riastrad  * like vram_info.
   1912  1.1  riastrad  */
   1913  1.1  riastrad int rv770_init(struct radeon_device *rdev)
   1914  1.1  riastrad {
   1915  1.1  riastrad 	int r;
   1916  1.1  riastrad 
   1917  1.1  riastrad 	/* Read BIOS */
   1918  1.1  riastrad 	if (!radeon_get_bios(rdev)) {
   1919  1.1  riastrad 		if (ASIC_IS_AVIVO(rdev))
   1920  1.1  riastrad 			return -EINVAL;
   1921  1.1  riastrad 	}
   1922  1.1  riastrad 	/* Must be an ATOMBIOS */
   1923  1.1  riastrad 	if (!rdev->is_atom_bios) {
   1924  1.1  riastrad 		dev_err(rdev->dev, "Expecting atombios for R600 GPU\n");
   1925  1.1  riastrad 		return -EINVAL;
   1926  1.1  riastrad 	}
   1927  1.1  riastrad 	r = radeon_atombios_init(rdev);
   1928  1.1  riastrad 	if (r)
   1929  1.1  riastrad 		return r;
   1930  1.1  riastrad 	/* Post card if necessary */
   1931  1.1  riastrad 	if (!radeon_card_posted(rdev)) {
   1932  1.1  riastrad 		if (!rdev->bios) {
   1933  1.1  riastrad 			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
   1934  1.1  riastrad 			return -EINVAL;
   1935  1.1  riastrad 		}
   1936  1.1  riastrad 		DRM_INFO("GPU not posted. posting now...\n");
   1937  1.1  riastrad 		atom_asic_init(rdev->mode_info.atom_context);
   1938  1.1  riastrad 	}
   1939  1.1  riastrad 	/* init golden registers */
   1940  1.1  riastrad 	rv770_init_golden_registers(rdev);
   1941  1.1  riastrad 	/* Initialize scratch registers */
   1942  1.1  riastrad 	r600_scratch_init(rdev);
   1943  1.1  riastrad 	/* Initialize surface registers */
   1944  1.1  riastrad 	radeon_surface_init(rdev);
   1945  1.1  riastrad 	/* Initialize clocks */
   1946  1.1  riastrad 	radeon_get_clock_info(rdev->ddev);
   1947  1.1  riastrad 	/* Fence driver */
   1948  1.1  riastrad 	r = radeon_fence_driver_init(rdev);
   1949  1.1  riastrad 	if (r)
   1950  1.1  riastrad 		return r;
   1951  1.1  riastrad 	/* initialize AGP */
   1952  1.1  riastrad 	if (rdev->flags & RADEON_IS_AGP) {
   1953  1.1  riastrad 		r = radeon_agp_init(rdev);
   1954  1.1  riastrad 		if (r)
   1955  1.1  riastrad 			radeon_agp_disable(rdev);
   1956  1.1  riastrad 	}
   1957  1.1  riastrad 	r = rv770_mc_init(rdev);
   1958  1.1  riastrad 	if (r)
   1959  1.1  riastrad 		return r;
   1960  1.1  riastrad 	/* Memory manager */
   1961  1.1  riastrad 	r = radeon_bo_init(rdev);
   1962  1.1  riastrad 	if (r)
   1963  1.1  riastrad 		return r;
   1964  1.1  riastrad 
   1965  1.1  riastrad 	if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
   1966  1.1  riastrad 		r = r600_init_microcode(rdev);
   1967  1.1  riastrad 		if (r) {
   1968  1.1  riastrad 			DRM_ERROR("Failed to load firmware!\n");
   1969  1.1  riastrad 			return r;
   1970  1.1  riastrad 		}
   1971  1.1  riastrad 	}
   1972  1.1  riastrad 
   1973  1.1  riastrad 	/* Initialize power management */
   1974  1.1  riastrad 	radeon_pm_init(rdev);
   1975  1.1  riastrad 
   1976  1.1  riastrad 	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
   1977  1.1  riastrad 	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
   1978  1.1  riastrad 
   1979  1.1  riastrad 	rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
   1980  1.1  riastrad 	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
   1981  1.1  riastrad 
   1982  1.2  riastrad 	rv770_uvd_init(rdev);
   1983  1.1  riastrad 
   1984  1.1  riastrad 	rdev->ih.ring_obj = NULL;
   1985  1.1  riastrad 	r600_ih_ring_init(rdev, 64 * 1024);
   1986  1.1  riastrad 
   1987  1.1  riastrad 	r = r600_pcie_gart_init(rdev);
   1988  1.1  riastrad 	if (r)
   1989  1.1  riastrad 		return r;
   1990  1.1  riastrad 
   1991  1.1  riastrad 	rdev->accel_working = true;
   1992  1.1  riastrad 	r = rv770_startup(rdev);
   1993  1.1  riastrad 	if (r) {
   1994  1.1  riastrad 		dev_err(rdev->dev, "disabling GPU acceleration\n");
   1995  1.1  riastrad 		r700_cp_fini(rdev);
   1996  1.1  riastrad 		r600_dma_fini(rdev);
   1997  1.1  riastrad 		r600_irq_fini(rdev);
   1998  1.1  riastrad 		radeon_wb_fini(rdev);
   1999  1.1  riastrad 		radeon_ib_pool_fini(rdev);
   2000  1.1  riastrad 		radeon_irq_kms_fini(rdev);
   2001  1.1  riastrad 		rv770_pcie_gart_fini(rdev);
   2002  1.1  riastrad 		rdev->accel_working = false;
   2003  1.1  riastrad 	}
   2004  1.1  riastrad 
   2005  1.1  riastrad 	return 0;
   2006  1.1  riastrad }
   2007  1.1  riastrad 
   2008  1.1  riastrad void rv770_fini(struct radeon_device *rdev)
   2009  1.1  riastrad {
   2010  1.1  riastrad 	radeon_pm_fini(rdev);
   2011  1.1  riastrad 	r700_cp_fini(rdev);
   2012  1.1  riastrad 	r600_dma_fini(rdev);
   2013  1.1  riastrad 	r600_irq_fini(rdev);
   2014  1.1  riastrad 	radeon_wb_fini(rdev);
   2015  1.1  riastrad 	radeon_ib_pool_fini(rdev);
   2016  1.1  riastrad 	radeon_irq_kms_fini(rdev);
   2017  1.1  riastrad 	uvd_v1_0_fini(rdev);
   2018  1.1  riastrad 	radeon_uvd_fini(rdev);
   2019  1.1  riastrad 	rv770_pcie_gart_fini(rdev);
   2020  1.1  riastrad 	r600_vram_scratch_fini(rdev);
   2021  1.1  riastrad 	radeon_gem_fini(rdev);
   2022  1.1  riastrad 	radeon_fence_driver_fini(rdev);
   2023  1.1  riastrad 	radeon_agp_fini(rdev);
   2024  1.1  riastrad 	radeon_bo_fini(rdev);
   2025  1.1  riastrad 	radeon_atombios_fini(rdev);
   2026  1.1  riastrad 	kfree(rdev->bios);
   2027  1.1  riastrad 	rdev->bios = NULL;
   2028  1.1  riastrad }
   2029  1.1  riastrad 
   2030  1.1  riastrad static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
   2031  1.1  riastrad {
   2032  1.1  riastrad 	u32 link_width_cntl, lanes, speed_cntl, tmp;
   2033  1.1  riastrad 	u16 link_cntl2;
   2034  1.1  riastrad 
   2035  1.1  riastrad 	if (radeon_pcie_gen2 == 0)
   2036  1.1  riastrad 		return;
   2037  1.1  riastrad 
   2038  1.1  riastrad 	if (rdev->flags & RADEON_IS_IGP)
   2039  1.1  riastrad 		return;
   2040  1.1  riastrad 
   2041  1.1  riastrad 	if (!(rdev->flags & RADEON_IS_PCIE))
   2042  1.1  riastrad 		return;
   2043  1.1  riastrad 
   2044  1.1  riastrad 	/* x2 cards have a special sequence */
   2045  1.1  riastrad 	if (ASIC_IS_X2(rdev))
   2046  1.1  riastrad 		return;
   2047  1.1  riastrad 
   2048  1.1  riastrad 	if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) &&
   2049  1.1  riastrad 		(rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))
   2050  1.1  riastrad 		return;
   2051  1.1  riastrad 
   2052  1.1  riastrad 	DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
   2053  1.1  riastrad 
   2054  1.1  riastrad 	/* advertise upconfig capability */
   2055  1.1  riastrad 	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
   2056  1.1  riastrad 	link_width_cntl &= ~LC_UPCONFIGURE_DIS;
   2057  1.1  riastrad 	WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
   2058  1.1  riastrad 	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
   2059  1.1  riastrad 	if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) {
   2060  1.1  riastrad 		lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT;
   2061  1.1  riastrad 		link_width_cntl &= ~(LC_LINK_WIDTH_MASK |
   2062  1.1  riastrad 				     LC_RECONFIG_ARC_MISSING_ESCAPE);
   2063  1.1  riastrad 		link_width_cntl |= lanes | LC_RECONFIG_NOW |
   2064  1.1  riastrad 			LC_RENEGOTIATE_EN | LC_UPCONFIGURE_SUPPORT;
   2065  1.1  riastrad 		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
   2066  1.1  riastrad 	} else {
   2067  1.1  riastrad 		link_width_cntl |= LC_UPCONFIGURE_DIS;
   2068  1.1  riastrad 		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
   2069  1.1  riastrad 	}
   2070  1.1  riastrad 
   2071  1.1  riastrad 	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
   2072  1.1  riastrad 	if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
   2073  1.1  riastrad 	    (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
   2074  1.1  riastrad 
   2075  1.1  riastrad 		tmp = RREG32(0x541c);
   2076  1.1  riastrad 		WREG32(0x541c, tmp | 0x8);
   2077  1.1  riastrad 		WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN);
   2078  1.1  riastrad 		link_cntl2 = RREG16(0x4088);
   2079  1.1  riastrad 		link_cntl2 &= ~TARGET_LINK_SPEED_MASK;
   2080  1.1  riastrad 		link_cntl2 |= 0x2;
   2081  1.1  riastrad 		WREG16(0x4088, link_cntl2);
   2082  1.1  riastrad 		WREG32(MM_CFGREGS_CNTL, 0);
   2083  1.1  riastrad 
   2084  1.1  riastrad 		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
   2085  1.1  riastrad 		speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
   2086  1.1  riastrad 		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
   2087  1.1  riastrad 
   2088  1.1  riastrad 		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
   2089  1.1  riastrad 		speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT;
   2090  1.1  riastrad 		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
   2091  1.1  riastrad 
   2092  1.1  riastrad 		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
   2093  1.1  riastrad 		speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
   2094  1.1  riastrad 		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
   2095  1.1  riastrad 
   2096  1.1  riastrad 		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
   2097  1.1  riastrad 		speed_cntl |= LC_GEN2_EN_STRAP;
   2098  1.1  riastrad 		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
   2099  1.1  riastrad 
   2100  1.1  riastrad 	} else {
   2101  1.1  riastrad 		link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
   2102  1.1  riastrad 		/* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
   2103  1.1  riastrad 		if (1)
   2104  1.1  riastrad 			link_width_cntl |= LC_UPCONFIGURE_DIS;
   2105  1.1  riastrad 		else
   2106  1.1  riastrad 			link_width_cntl &= ~LC_UPCONFIGURE_DIS;
   2107  1.1  riastrad 		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
   2108  1.1  riastrad 	}
   2109  1.1  riastrad }
   2110