cachepc-linux

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

r600.c (138350B)


      1/*
      2 * Copyright 2008 Advanced Micro Devices, Inc.
      3 * Copyright 2008 Red Hat Inc.
      4 * Copyright 2009 Jerome Glisse.
      5 *
      6 * Permission is hereby granted, free of charge, to any person obtaining a
      7 * copy of this software and associated documentation files (the "Software"),
      8 * to deal in the Software without restriction, including without limitation
      9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10 * and/or sell copies of the Software, and to permit persons to whom the
     11 * Software is furnished to do so, subject to the following conditions:
     12 *
     13 * The above copyright notice and this permission notice shall be included in
     14 * all copies or substantial portions of the Software.
     15 *
     16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     22 * OTHER DEALINGS IN THE SOFTWARE.
     23 *
     24 * Authors: Dave Airlie
     25 *          Alex Deucher
     26 *          Jerome Glisse
     27 */
     28
     29#include <linux/firmware.h>
     30#include <linux/module.h>
     31#include <linux/pci.h>
     32#include <linux/slab.h>
     33#include <linux/seq_file.h>
     34
     35#include <drm/drm_device.h>
     36#include <drm/drm_vblank.h>
     37#include <drm/radeon_drm.h>
     38
     39#include "atom.h"
     40#include "avivod.h"
     41#include "evergreen.h"
     42#include "r600.h"
     43#include "r600d.h"
     44#include "rv770.h"
     45#include "radeon.h"
     46#include "radeon_asic.h"
     47#include "radeon_audio.h"
     48#include "radeon_mode.h"
     49#include "radeon_ucode.h"
     50
     51/* Firmware Names */
     52MODULE_FIRMWARE("radeon/R600_pfp.bin");
     53MODULE_FIRMWARE("radeon/R600_me.bin");
     54MODULE_FIRMWARE("radeon/RV610_pfp.bin");
     55MODULE_FIRMWARE("radeon/RV610_me.bin");
     56MODULE_FIRMWARE("radeon/RV630_pfp.bin");
     57MODULE_FIRMWARE("radeon/RV630_me.bin");
     58MODULE_FIRMWARE("radeon/RV620_pfp.bin");
     59MODULE_FIRMWARE("radeon/RV620_me.bin");
     60MODULE_FIRMWARE("radeon/RV635_pfp.bin");
     61MODULE_FIRMWARE("radeon/RV635_me.bin");
     62MODULE_FIRMWARE("radeon/RV670_pfp.bin");
     63MODULE_FIRMWARE("radeon/RV670_me.bin");
     64MODULE_FIRMWARE("radeon/RS780_pfp.bin");
     65MODULE_FIRMWARE("radeon/RS780_me.bin");
     66MODULE_FIRMWARE("radeon/RV770_pfp.bin");
     67MODULE_FIRMWARE("radeon/RV770_me.bin");
     68MODULE_FIRMWARE("radeon/RV770_smc.bin");
     69MODULE_FIRMWARE("radeon/RV730_pfp.bin");
     70MODULE_FIRMWARE("radeon/RV730_me.bin");
     71MODULE_FIRMWARE("radeon/RV730_smc.bin");
     72MODULE_FIRMWARE("radeon/RV740_smc.bin");
     73MODULE_FIRMWARE("radeon/RV710_pfp.bin");
     74MODULE_FIRMWARE("radeon/RV710_me.bin");
     75MODULE_FIRMWARE("radeon/RV710_smc.bin");
     76MODULE_FIRMWARE("radeon/R600_rlc.bin");
     77MODULE_FIRMWARE("radeon/R700_rlc.bin");
     78MODULE_FIRMWARE("radeon/CEDAR_pfp.bin");
     79MODULE_FIRMWARE("radeon/CEDAR_me.bin");
     80MODULE_FIRMWARE("radeon/CEDAR_rlc.bin");
     81MODULE_FIRMWARE("radeon/CEDAR_smc.bin");
     82MODULE_FIRMWARE("radeon/REDWOOD_pfp.bin");
     83MODULE_FIRMWARE("radeon/REDWOOD_me.bin");
     84MODULE_FIRMWARE("radeon/REDWOOD_rlc.bin");
     85MODULE_FIRMWARE("radeon/REDWOOD_smc.bin");
     86MODULE_FIRMWARE("radeon/JUNIPER_pfp.bin");
     87MODULE_FIRMWARE("radeon/JUNIPER_me.bin");
     88MODULE_FIRMWARE("radeon/JUNIPER_rlc.bin");
     89MODULE_FIRMWARE("radeon/JUNIPER_smc.bin");
     90MODULE_FIRMWARE("radeon/CYPRESS_pfp.bin");
     91MODULE_FIRMWARE("radeon/CYPRESS_me.bin");
     92MODULE_FIRMWARE("radeon/CYPRESS_rlc.bin");
     93MODULE_FIRMWARE("radeon/CYPRESS_smc.bin");
     94MODULE_FIRMWARE("radeon/PALM_pfp.bin");
     95MODULE_FIRMWARE("radeon/PALM_me.bin");
     96MODULE_FIRMWARE("radeon/SUMO_rlc.bin");
     97MODULE_FIRMWARE("radeon/SUMO_pfp.bin");
     98MODULE_FIRMWARE("radeon/SUMO_me.bin");
     99MODULE_FIRMWARE("radeon/SUMO2_pfp.bin");
    100MODULE_FIRMWARE("radeon/SUMO2_me.bin");
    101
    102static const u32 crtc_offsets[2] =
    103{
    104	0,
    105	AVIVO_D2CRTC_H_TOTAL - AVIVO_D1CRTC_H_TOTAL
    106};
    107
    108static void r600_debugfs_mc_info_init(struct radeon_device *rdev);
    109
    110/* r600,rv610,rv630,rv620,rv635,rv670 */
    111int r600_mc_wait_for_idle(struct radeon_device *rdev);
    112static void r600_gpu_init(struct radeon_device *rdev);
    113void r600_fini(struct radeon_device *rdev);
    114void r600_irq_disable(struct radeon_device *rdev);
    115static void r600_pcie_gen2_enable(struct radeon_device *rdev);
    116
    117/*
    118 * Indirect registers accessor
    119 */
    120u32 r600_rcu_rreg(struct radeon_device *rdev, u32 reg)
    121{
    122	unsigned long flags;
    123	u32 r;
    124
    125	spin_lock_irqsave(&rdev->rcu_idx_lock, flags);
    126	WREG32(R600_RCU_INDEX, ((reg) & 0x1fff));
    127	r = RREG32(R600_RCU_DATA);
    128	spin_unlock_irqrestore(&rdev->rcu_idx_lock, flags);
    129	return r;
    130}
    131
    132void r600_rcu_wreg(struct radeon_device *rdev, u32 reg, u32 v)
    133{
    134	unsigned long flags;
    135
    136	spin_lock_irqsave(&rdev->rcu_idx_lock, flags);
    137	WREG32(R600_RCU_INDEX, ((reg) & 0x1fff));
    138	WREG32(R600_RCU_DATA, (v));
    139	spin_unlock_irqrestore(&rdev->rcu_idx_lock, flags);
    140}
    141
    142u32 r600_uvd_ctx_rreg(struct radeon_device *rdev, u32 reg)
    143{
    144	unsigned long flags;
    145	u32 r;
    146
    147	spin_lock_irqsave(&rdev->uvd_idx_lock, flags);
    148	WREG32(R600_UVD_CTX_INDEX, ((reg) & 0x1ff));
    149	r = RREG32(R600_UVD_CTX_DATA);
    150	spin_unlock_irqrestore(&rdev->uvd_idx_lock, flags);
    151	return r;
    152}
    153
    154void r600_uvd_ctx_wreg(struct radeon_device *rdev, u32 reg, u32 v)
    155{
    156	unsigned long flags;
    157
    158	spin_lock_irqsave(&rdev->uvd_idx_lock, flags);
    159	WREG32(R600_UVD_CTX_INDEX, ((reg) & 0x1ff));
    160	WREG32(R600_UVD_CTX_DATA, (v));
    161	spin_unlock_irqrestore(&rdev->uvd_idx_lock, flags);
    162}
    163
    164/**
    165 * r600_get_allowed_info_register - fetch the register for the info ioctl
    166 *
    167 * @rdev: radeon_device pointer
    168 * @reg: register offset in bytes
    169 * @val: register value
    170 *
    171 * Returns 0 for success or -EINVAL for an invalid register
    172 *
    173 */
    174int r600_get_allowed_info_register(struct radeon_device *rdev,
    175				   u32 reg, u32 *val)
    176{
    177	switch (reg) {
    178	case GRBM_STATUS:
    179	case GRBM_STATUS2:
    180	case R_000E50_SRBM_STATUS:
    181	case DMA_STATUS_REG:
    182	case UVD_STATUS:
    183		*val = RREG32(reg);
    184		return 0;
    185	default:
    186		return -EINVAL;
    187	}
    188}
    189
    190/**
    191 * r600_get_xclk - get the xclk
    192 *
    193 * @rdev: radeon_device pointer
    194 *
    195 * Returns the reference clock used by the gfx engine
    196 * (r6xx, IGPs, APUs).
    197 */
    198u32 r600_get_xclk(struct radeon_device *rdev)
    199{
    200	return rdev->clock.spll.reference_freq;
    201}
    202
    203int r600_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
    204{
    205	unsigned fb_div = 0, ref_div, vclk_div = 0, dclk_div = 0;
    206	int r;
    207
    208	/* bypass vclk and dclk with bclk */
    209	WREG32_P(CG_UPLL_FUNC_CNTL_2,
    210		 VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
    211		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
    212
    213	/* assert BYPASS_EN, deassert UPLL_RESET, UPLL_SLEEP and UPLL_CTLREQ */
    214	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~(
    215		 UPLL_RESET_MASK | UPLL_SLEEP_MASK | UPLL_CTLREQ_MASK));
    216
    217	if (rdev->family >= CHIP_RS780)
    218		WREG32_P(GFX_MACRO_BYPASS_CNTL, UPLL_BYPASS_CNTL,
    219			 ~UPLL_BYPASS_CNTL);
    220
    221	if (!vclk || !dclk) {
    222		/* keep the Bypass mode, put PLL to sleep */
    223		WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
    224		return 0;
    225	}
    226
    227	if (rdev->clock.spll.reference_freq == 10000)
    228		ref_div = 34;
    229	else
    230		ref_div = 4;
    231
    232	r = radeon_uvd_calc_upll_dividers(rdev, vclk, dclk, 50000, 160000,
    233					  ref_div + 1, 0xFFF, 2, 30, ~0,
    234					  &fb_div, &vclk_div, &dclk_div);
    235	if (r)
    236		return r;
    237
    238	if (rdev->family >= CHIP_RV670 && rdev->family < CHIP_RS780)
    239		fb_div >>= 1;
    240	else
    241		fb_div |= 1;
    242
    243	r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
    244	if (r)
    245		return r;
    246
    247	/* assert PLL_RESET */
    248	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
    249
    250	/* For RS780 we have to choose ref clk */
    251	if (rdev->family >= CHIP_RS780)
    252		WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_REFCLK_SRC_SEL_MASK,
    253			 ~UPLL_REFCLK_SRC_SEL_MASK);
    254
    255	/* set the required fb, ref and post divder values */
    256	WREG32_P(CG_UPLL_FUNC_CNTL,
    257		 UPLL_FB_DIV(fb_div) |
    258		 UPLL_REF_DIV(ref_div),
    259		 ~(UPLL_FB_DIV_MASK | UPLL_REF_DIV_MASK));
    260	WREG32_P(CG_UPLL_FUNC_CNTL_2,
    261		 UPLL_SW_HILEN(vclk_div >> 1) |
    262		 UPLL_SW_LOLEN((vclk_div >> 1) + (vclk_div & 1)) |
    263		 UPLL_SW_HILEN2(dclk_div >> 1) |
    264		 UPLL_SW_LOLEN2((dclk_div >> 1) + (dclk_div & 1)) |
    265		 UPLL_DIVEN_MASK | UPLL_DIVEN2_MASK,
    266		 ~UPLL_SW_MASK);
    267
    268	/* give the PLL some time to settle */
    269	mdelay(15);
    270
    271	/* deassert PLL_RESET */
    272	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
    273
    274	mdelay(15);
    275
    276	/* deassert BYPASS EN */
    277	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
    278
    279	if (rdev->family >= CHIP_RS780)
    280		WREG32_P(GFX_MACRO_BYPASS_CNTL, 0, ~UPLL_BYPASS_CNTL);
    281
    282	r = radeon_uvd_send_upll_ctlreq(rdev, CG_UPLL_FUNC_CNTL);
    283	if (r)
    284		return r;
    285
    286	/* switch VCLK and DCLK selection */
    287	WREG32_P(CG_UPLL_FUNC_CNTL_2,
    288		 VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
    289		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
    290
    291	mdelay(100);
    292
    293	return 0;
    294}
    295
    296void dce3_program_fmt(struct drm_encoder *encoder)
    297{
    298	struct drm_device *dev = encoder->dev;
    299	struct radeon_device *rdev = dev->dev_private;
    300	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
    301	struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
    302	struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
    303	int bpc = 0;
    304	u32 tmp = 0;
    305	enum radeon_connector_dither dither = RADEON_FMT_DITHER_DISABLE;
    306
    307	if (connector) {
    308		struct radeon_connector *radeon_connector = to_radeon_connector(connector);
    309		bpc = radeon_get_monitor_bpc(connector);
    310		dither = radeon_connector->dither;
    311	}
    312
    313	/* LVDS FMT is set up by atom */
    314	if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
    315		return;
    316
    317	/* not needed for analog */
    318	if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1) ||
    319	    (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2))
    320		return;
    321
    322	if (bpc == 0)
    323		return;
    324
    325	switch (bpc) {
    326	case 6:
    327		if (dither == RADEON_FMT_DITHER_ENABLE)
    328			/* XXX sort out optimal dither settings */
    329			tmp |= FMT_SPATIAL_DITHER_EN;
    330		else
    331			tmp |= FMT_TRUNCATE_EN;
    332		break;
    333	case 8:
    334		if (dither == RADEON_FMT_DITHER_ENABLE)
    335			/* XXX sort out optimal dither settings */
    336			tmp |= (FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH);
    337		else
    338			tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH);
    339		break;
    340	case 10:
    341	default:
    342		/* not needed */
    343		break;
    344	}
    345
    346	WREG32(FMT_BIT_DEPTH_CONTROL + radeon_crtc->crtc_offset, tmp);
    347}
    348
    349/* get temperature in millidegrees */
    350int rv6xx_get_temp(struct radeon_device *rdev)
    351{
    352	u32 temp = (RREG32(CG_THERMAL_STATUS) & ASIC_T_MASK) >>
    353		ASIC_T_SHIFT;
    354	int actual_temp = temp & 0xff;
    355
    356	if (temp & 0x100)
    357		actual_temp -= 256;
    358
    359	return actual_temp * 1000;
    360}
    361
    362void r600_pm_get_dynpm_state(struct radeon_device *rdev)
    363{
    364	int i;
    365
    366	rdev->pm.dynpm_can_upclock = true;
    367	rdev->pm.dynpm_can_downclock = true;
    368
    369	/* power state array is low to high, default is first */
    370	if ((rdev->flags & RADEON_IS_IGP) || (rdev->family == CHIP_R600)) {
    371		int min_power_state_index = 0;
    372
    373		if (rdev->pm.num_power_states > 2)
    374			min_power_state_index = 1;
    375
    376		switch (rdev->pm.dynpm_planned_action) {
    377		case DYNPM_ACTION_MINIMUM:
    378			rdev->pm.requested_power_state_index = min_power_state_index;
    379			rdev->pm.requested_clock_mode_index = 0;
    380			rdev->pm.dynpm_can_downclock = false;
    381			break;
    382		case DYNPM_ACTION_DOWNCLOCK:
    383			if (rdev->pm.current_power_state_index == min_power_state_index) {
    384				rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index;
    385				rdev->pm.dynpm_can_downclock = false;
    386			} else {
    387				if (rdev->pm.active_crtc_count > 1) {
    388					for (i = 0; i < rdev->pm.num_power_states; i++) {
    389						if (rdev->pm.power_state[i].flags & RADEON_PM_STATE_SINGLE_DISPLAY_ONLY)
    390							continue;
    391						else if (i >= rdev->pm.current_power_state_index) {
    392							rdev->pm.requested_power_state_index =
    393								rdev->pm.current_power_state_index;
    394							break;
    395						} else {
    396							rdev->pm.requested_power_state_index = i;
    397							break;
    398						}
    399					}
    400				} else {
    401					if (rdev->pm.current_power_state_index == 0)
    402						rdev->pm.requested_power_state_index =
    403							rdev->pm.num_power_states - 1;
    404					else
    405						rdev->pm.requested_power_state_index =
    406							rdev->pm.current_power_state_index - 1;
    407				}
    408			}
    409			rdev->pm.requested_clock_mode_index = 0;
    410			/* don't use the power state if crtcs are active and no display flag is set */
    411			if ((rdev->pm.active_crtc_count > 0) &&
    412			    (rdev->pm.power_state[rdev->pm.requested_power_state_index].
    413			     clock_info[rdev->pm.requested_clock_mode_index].flags &
    414			     RADEON_PM_MODE_NO_DISPLAY)) {
    415				rdev->pm.requested_power_state_index++;
    416			}
    417			break;
    418		case DYNPM_ACTION_UPCLOCK:
    419			if (rdev->pm.current_power_state_index == (rdev->pm.num_power_states - 1)) {
    420				rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index;
    421				rdev->pm.dynpm_can_upclock = false;
    422			} else {
    423				if (rdev->pm.active_crtc_count > 1) {
    424					for (i = (rdev->pm.num_power_states - 1); i >= 0; i--) {
    425						if (rdev->pm.power_state[i].flags & RADEON_PM_STATE_SINGLE_DISPLAY_ONLY)
    426							continue;
    427						else if (i <= rdev->pm.current_power_state_index) {
    428							rdev->pm.requested_power_state_index =
    429								rdev->pm.current_power_state_index;
    430							break;
    431						} else {
    432							rdev->pm.requested_power_state_index = i;
    433							break;
    434						}
    435					}
    436				} else
    437					rdev->pm.requested_power_state_index =
    438						rdev->pm.current_power_state_index + 1;
    439			}
    440			rdev->pm.requested_clock_mode_index = 0;
    441			break;
    442		case DYNPM_ACTION_DEFAULT:
    443			rdev->pm.requested_power_state_index = rdev->pm.default_power_state_index;
    444			rdev->pm.requested_clock_mode_index = 0;
    445			rdev->pm.dynpm_can_upclock = false;
    446			break;
    447		case DYNPM_ACTION_NONE:
    448		default:
    449			DRM_ERROR("Requested mode for not defined action\n");
    450			return;
    451		}
    452	} else {
    453		/* XXX select a power state based on AC/DC, single/dualhead, etc. */
    454		/* for now just select the first power state and switch between clock modes */
    455		/* power state array is low to high, default is first (0) */
    456		if (rdev->pm.active_crtc_count > 1) {
    457			rdev->pm.requested_power_state_index = -1;
    458			/* start at 1 as we don't want the default mode */
    459			for (i = 1; i < rdev->pm.num_power_states; i++) {
    460				if (rdev->pm.power_state[i].flags & RADEON_PM_STATE_SINGLE_DISPLAY_ONLY)
    461					continue;
    462				else if ((rdev->pm.power_state[i].type == POWER_STATE_TYPE_PERFORMANCE) ||
    463					 (rdev->pm.power_state[i].type == POWER_STATE_TYPE_BATTERY)) {
    464					rdev->pm.requested_power_state_index = i;
    465					break;
    466				}
    467			}
    468			/* if nothing selected, grab the default state. */
    469			if (rdev->pm.requested_power_state_index == -1)
    470				rdev->pm.requested_power_state_index = 0;
    471		} else
    472			rdev->pm.requested_power_state_index = 1;
    473
    474		switch (rdev->pm.dynpm_planned_action) {
    475		case DYNPM_ACTION_MINIMUM:
    476			rdev->pm.requested_clock_mode_index = 0;
    477			rdev->pm.dynpm_can_downclock = false;
    478			break;
    479		case DYNPM_ACTION_DOWNCLOCK:
    480			if (rdev->pm.requested_power_state_index == rdev->pm.current_power_state_index) {
    481				if (rdev->pm.current_clock_mode_index == 0) {
    482					rdev->pm.requested_clock_mode_index = 0;
    483					rdev->pm.dynpm_can_downclock = false;
    484				} else
    485					rdev->pm.requested_clock_mode_index =
    486						rdev->pm.current_clock_mode_index - 1;
    487			} else {
    488				rdev->pm.requested_clock_mode_index = 0;
    489				rdev->pm.dynpm_can_downclock = false;
    490			}
    491			/* don't use the power state if crtcs are active and no display flag is set */
    492			if ((rdev->pm.active_crtc_count > 0) &&
    493			    (rdev->pm.power_state[rdev->pm.requested_power_state_index].
    494			     clock_info[rdev->pm.requested_clock_mode_index].flags &
    495			     RADEON_PM_MODE_NO_DISPLAY)) {
    496				rdev->pm.requested_clock_mode_index++;
    497			}
    498			break;
    499		case DYNPM_ACTION_UPCLOCK:
    500			if (rdev->pm.requested_power_state_index == rdev->pm.current_power_state_index) {
    501				if (rdev->pm.current_clock_mode_index ==
    502				    (rdev->pm.power_state[rdev->pm.requested_power_state_index].num_clock_modes - 1)) {
    503					rdev->pm.requested_clock_mode_index = rdev->pm.current_clock_mode_index;
    504					rdev->pm.dynpm_can_upclock = false;
    505				} else
    506					rdev->pm.requested_clock_mode_index =
    507						rdev->pm.current_clock_mode_index + 1;
    508			} else {
    509				rdev->pm.requested_clock_mode_index =
    510					rdev->pm.power_state[rdev->pm.requested_power_state_index].num_clock_modes - 1;
    511				rdev->pm.dynpm_can_upclock = false;
    512			}
    513			break;
    514		case DYNPM_ACTION_DEFAULT:
    515			rdev->pm.requested_power_state_index = rdev->pm.default_power_state_index;
    516			rdev->pm.requested_clock_mode_index = 0;
    517			rdev->pm.dynpm_can_upclock = false;
    518			break;
    519		case DYNPM_ACTION_NONE:
    520		default:
    521			DRM_ERROR("Requested mode for not defined action\n");
    522			return;
    523		}
    524	}
    525
    526	DRM_DEBUG_DRIVER("Requested: e: %d m: %d p: %d\n",
    527		  rdev->pm.power_state[rdev->pm.requested_power_state_index].
    528		  clock_info[rdev->pm.requested_clock_mode_index].sclk,
    529		  rdev->pm.power_state[rdev->pm.requested_power_state_index].
    530		  clock_info[rdev->pm.requested_clock_mode_index].mclk,
    531		  rdev->pm.power_state[rdev->pm.requested_power_state_index].
    532		  pcie_lanes);
    533}
    534
    535void rs780_pm_init_profile(struct radeon_device *rdev)
    536{
    537	if (rdev->pm.num_power_states == 2) {
    538		/* default */
    539		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
    540		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
    541		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
    542		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0;
    543		/* low sh */
    544		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = 0;
    545		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = 0;
    546		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
    547		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
    548		/* mid sh */
    549		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = 0;
    550		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = 0;
    551		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;
    552		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 0;
    553		/* high sh */
    554		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = 0;
    555		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = 1;
    556		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
    557		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 0;
    558		/* low mh */
    559		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = 0;
    560		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = 0;
    561		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
    562		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
    563		/* mid mh */
    564		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = 0;
    565		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = 0;
    566		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;
    567		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0;
    568		/* high mh */
    569		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = 0;
    570		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = 1;
    571		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
    572		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 0;
    573	} else if (rdev->pm.num_power_states == 3) {
    574		/* default */
    575		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
    576		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
    577		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
    578		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0;
    579		/* low sh */
    580		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = 1;
    581		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = 1;
    582		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
    583		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
    584		/* mid sh */
    585		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = 1;
    586		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = 1;
    587		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;
    588		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 0;
    589		/* high sh */
    590		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = 1;
    591		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = 2;
    592		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
    593		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 0;
    594		/* low mh */
    595		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = 1;
    596		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = 1;
    597		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
    598		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
    599		/* mid mh */
    600		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = 1;
    601		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = 1;
    602		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;
    603		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0;
    604		/* high mh */
    605		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = 1;
    606		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = 2;
    607		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
    608		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 0;
    609	} else {
    610		/* default */
    611		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
    612		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
    613		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
    614		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0;
    615		/* low sh */
    616		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = 2;
    617		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = 2;
    618		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
    619		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
    620		/* mid sh */
    621		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = 2;
    622		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = 2;
    623		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;
    624		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 0;
    625		/* high sh */
    626		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = 2;
    627		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = 3;
    628		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
    629		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 0;
    630		/* low mh */
    631		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = 2;
    632		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = 0;
    633		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
    634		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
    635		/* mid mh */
    636		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = 2;
    637		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = 0;
    638		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;
    639		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0;
    640		/* high mh */
    641		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = 2;
    642		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = 3;
    643		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
    644		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 0;
    645	}
    646}
    647
    648void r600_pm_init_profile(struct radeon_device *rdev)
    649{
    650	int idx;
    651
    652	if (rdev->family == CHIP_R600) {
    653		/* XXX */
    654		/* default */
    655		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
    656		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
    657		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
    658		rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0;
    659		/* low sh */
    660		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
    661		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
    662		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
    663		rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
    664		/* mid sh */
    665		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
    666		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
    667		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;
    668		rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 0;
    669		/* high sh */
    670		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
    671		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
    672		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
    673		rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 0;
    674		/* low mh */
    675		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
    676		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
    677		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
    678		rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
    679		/* mid mh */
    680		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
    681		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
    682		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;
    683		rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0;
    684		/* high mh */
    685		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
    686		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
    687		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
    688		rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 0;
    689	} else {
    690		if (rdev->pm.num_power_states < 4) {
    691			/* default */
    692			rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
    693			rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
    694			rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
    695			rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 2;
    696			/* low sh */
    697			rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = 1;
    698			rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = 1;
    699			rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
    700			rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
    701			/* mid sh */
    702			rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = 1;
    703			rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = 1;
    704			rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;
    705			rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 1;
    706			/* high sh */
    707			rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = 1;
    708			rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = 1;
    709			rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
    710			rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 2;
    711			/* low mh */
    712			rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = 2;
    713			rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = 2;
    714			rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
    715			rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
    716			/* low mh */
    717			rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = 2;
    718			rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = 2;
    719			rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;
    720			rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 1;
    721			/* high mh */
    722			rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = 2;
    723			rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = 2;
    724			rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
    725			rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 2;
    726		} else {
    727			/* default */
    728			rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;
    729			rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;
    730			rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;
    731			rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 2;
    732			/* low sh */
    733			if (rdev->flags & RADEON_IS_MOBILITY)
    734				idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_BATTERY, 0);
    735			else
    736				idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0);
    737			rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = idx;
    738			rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = idx;
    739			rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;
    740			rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;
    741			/* mid sh */
    742			rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = idx;
    743			rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = idx;
    744			rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;
    745			rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 1;
    746			/* high sh */
    747			idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 0);
    748			rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = idx;
    749			rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = idx;
    750			rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;
    751			rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 2;
    752			/* low mh */
    753			if (rdev->flags & RADEON_IS_MOBILITY)
    754				idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_BATTERY, 1);
    755			else
    756				idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 1);
    757			rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = idx;
    758			rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = idx;
    759			rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;
    760			rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;
    761			/* mid mh */
    762			rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = idx;
    763			rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = idx;
    764			rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;
    765			rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 1;
    766			/* high mh */
    767			idx = radeon_pm_get_type_index(rdev, POWER_STATE_TYPE_PERFORMANCE, 1);
    768			rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = idx;
    769			rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = idx;
    770			rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;
    771			rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 2;
    772		}
    773	}
    774}
    775
    776void r600_pm_misc(struct radeon_device *rdev)
    777{
    778	int req_ps_idx = rdev->pm.requested_power_state_index;
    779	int req_cm_idx = rdev->pm.requested_clock_mode_index;
    780	struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
    781	struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
    782
    783	if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
    784		/* 0xff01 is a flag rather then an actual voltage */
    785		if (voltage->voltage == 0xff01)
    786			return;
    787		if (voltage->voltage != rdev->pm.current_vddc) {
    788			radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
    789			rdev->pm.current_vddc = voltage->voltage;
    790			DRM_DEBUG_DRIVER("Setting: v: %d\n", voltage->voltage);
    791		}
    792	}
    793}
    794
    795bool r600_gui_idle(struct radeon_device *rdev)
    796{
    797	if (RREG32(GRBM_STATUS) & GUI_ACTIVE)
    798		return false;
    799	else
    800		return true;
    801}
    802
    803/* hpd for digital panel detect/disconnect */
    804bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd)
    805{
    806	bool connected = false;
    807
    808	if (ASIC_IS_DCE3(rdev)) {
    809		switch (hpd) {
    810		case RADEON_HPD_1:
    811			if (RREG32(DC_HPD1_INT_STATUS) & DC_HPDx_SENSE)
    812				connected = true;
    813			break;
    814		case RADEON_HPD_2:
    815			if (RREG32(DC_HPD2_INT_STATUS) & DC_HPDx_SENSE)
    816				connected = true;
    817			break;
    818		case RADEON_HPD_3:
    819			if (RREG32(DC_HPD3_INT_STATUS) & DC_HPDx_SENSE)
    820				connected = true;
    821			break;
    822		case RADEON_HPD_4:
    823			if (RREG32(DC_HPD4_INT_STATUS) & DC_HPDx_SENSE)
    824				connected = true;
    825			break;
    826			/* DCE 3.2 */
    827		case RADEON_HPD_5:
    828			if (RREG32(DC_HPD5_INT_STATUS) & DC_HPDx_SENSE)
    829				connected = true;
    830			break;
    831		case RADEON_HPD_6:
    832			if (RREG32(DC_HPD6_INT_STATUS) & DC_HPDx_SENSE)
    833				connected = true;
    834			break;
    835		default:
    836			break;
    837		}
    838	} else {
    839		switch (hpd) {
    840		case RADEON_HPD_1:
    841			if (RREG32(DC_HOT_PLUG_DETECT1_INT_STATUS) & DC_HOT_PLUG_DETECTx_SENSE)
    842				connected = true;
    843			break;
    844		case RADEON_HPD_2:
    845			if (RREG32(DC_HOT_PLUG_DETECT2_INT_STATUS) & DC_HOT_PLUG_DETECTx_SENSE)
    846				connected = true;
    847			break;
    848		case RADEON_HPD_3:
    849			if (RREG32(DC_HOT_PLUG_DETECT3_INT_STATUS) & DC_HOT_PLUG_DETECTx_SENSE)
    850				connected = true;
    851			break;
    852		default:
    853			break;
    854		}
    855	}
    856	return connected;
    857}
    858
    859void r600_hpd_set_polarity(struct radeon_device *rdev,
    860			   enum radeon_hpd_id hpd)
    861{
    862	u32 tmp;
    863	bool connected = r600_hpd_sense(rdev, hpd);
    864
    865	if (ASIC_IS_DCE3(rdev)) {
    866		switch (hpd) {
    867		case RADEON_HPD_1:
    868			tmp = RREG32(DC_HPD1_INT_CONTROL);
    869			if (connected)
    870				tmp &= ~DC_HPDx_INT_POLARITY;
    871			else
    872				tmp |= DC_HPDx_INT_POLARITY;
    873			WREG32(DC_HPD1_INT_CONTROL, tmp);
    874			break;
    875		case RADEON_HPD_2:
    876			tmp = RREG32(DC_HPD2_INT_CONTROL);
    877			if (connected)
    878				tmp &= ~DC_HPDx_INT_POLARITY;
    879			else
    880				tmp |= DC_HPDx_INT_POLARITY;
    881			WREG32(DC_HPD2_INT_CONTROL, tmp);
    882			break;
    883		case RADEON_HPD_3:
    884			tmp = RREG32(DC_HPD3_INT_CONTROL);
    885			if (connected)
    886				tmp &= ~DC_HPDx_INT_POLARITY;
    887			else
    888				tmp |= DC_HPDx_INT_POLARITY;
    889			WREG32(DC_HPD3_INT_CONTROL, tmp);
    890			break;
    891		case RADEON_HPD_4:
    892			tmp = RREG32(DC_HPD4_INT_CONTROL);
    893			if (connected)
    894				tmp &= ~DC_HPDx_INT_POLARITY;
    895			else
    896				tmp |= DC_HPDx_INT_POLARITY;
    897			WREG32(DC_HPD4_INT_CONTROL, tmp);
    898			break;
    899		case RADEON_HPD_5:
    900			tmp = RREG32(DC_HPD5_INT_CONTROL);
    901			if (connected)
    902				tmp &= ~DC_HPDx_INT_POLARITY;
    903			else
    904				tmp |= DC_HPDx_INT_POLARITY;
    905			WREG32(DC_HPD5_INT_CONTROL, tmp);
    906			break;
    907			/* DCE 3.2 */
    908		case RADEON_HPD_6:
    909			tmp = RREG32(DC_HPD6_INT_CONTROL);
    910			if (connected)
    911				tmp &= ~DC_HPDx_INT_POLARITY;
    912			else
    913				tmp |= DC_HPDx_INT_POLARITY;
    914			WREG32(DC_HPD6_INT_CONTROL, tmp);
    915			break;
    916		default:
    917			break;
    918		}
    919	} else {
    920		switch (hpd) {
    921		case RADEON_HPD_1:
    922			tmp = RREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL);
    923			if (connected)
    924				tmp &= ~DC_HOT_PLUG_DETECTx_INT_POLARITY;
    925			else
    926				tmp |= DC_HOT_PLUG_DETECTx_INT_POLARITY;
    927			WREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL, tmp);
    928			break;
    929		case RADEON_HPD_2:
    930			tmp = RREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL);
    931			if (connected)
    932				tmp &= ~DC_HOT_PLUG_DETECTx_INT_POLARITY;
    933			else
    934				tmp |= DC_HOT_PLUG_DETECTx_INT_POLARITY;
    935			WREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL, tmp);
    936			break;
    937		case RADEON_HPD_3:
    938			tmp = RREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL);
    939			if (connected)
    940				tmp &= ~DC_HOT_PLUG_DETECTx_INT_POLARITY;
    941			else
    942				tmp |= DC_HOT_PLUG_DETECTx_INT_POLARITY;
    943			WREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL, tmp);
    944			break;
    945		default:
    946			break;
    947		}
    948	}
    949}
    950
    951void r600_hpd_init(struct radeon_device *rdev)
    952{
    953	struct drm_device *dev = rdev->ddev;
    954	struct drm_connector *connector;
    955	unsigned enable = 0;
    956
    957	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
    958		struct radeon_connector *radeon_connector = to_radeon_connector(connector);
    959
    960		if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
    961		    connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
    962			/* don't try to enable hpd on eDP or LVDS avoid breaking the
    963			 * aux dp channel on imac and help (but not completely fix)
    964			 * https://bugzilla.redhat.com/show_bug.cgi?id=726143
    965			 */
    966			continue;
    967		}
    968		if (ASIC_IS_DCE3(rdev)) {
    969			u32 tmp = DC_HPDx_CONNECTION_TIMER(0x9c4) | DC_HPDx_RX_INT_TIMER(0xfa);
    970			if (ASIC_IS_DCE32(rdev))
    971				tmp |= DC_HPDx_EN;
    972
    973			switch (radeon_connector->hpd.hpd) {
    974			case RADEON_HPD_1:
    975				WREG32(DC_HPD1_CONTROL, tmp);
    976				break;
    977			case RADEON_HPD_2:
    978				WREG32(DC_HPD2_CONTROL, tmp);
    979				break;
    980			case RADEON_HPD_3:
    981				WREG32(DC_HPD3_CONTROL, tmp);
    982				break;
    983			case RADEON_HPD_4:
    984				WREG32(DC_HPD4_CONTROL, tmp);
    985				break;
    986				/* DCE 3.2 */
    987			case RADEON_HPD_5:
    988				WREG32(DC_HPD5_CONTROL, tmp);
    989				break;
    990			case RADEON_HPD_6:
    991				WREG32(DC_HPD6_CONTROL, tmp);
    992				break;
    993			default:
    994				break;
    995			}
    996		} else {
    997			switch (radeon_connector->hpd.hpd) {
    998			case RADEON_HPD_1:
    999				WREG32(DC_HOT_PLUG_DETECT1_CONTROL, DC_HOT_PLUG_DETECTx_EN);
   1000				break;
   1001			case RADEON_HPD_2:
   1002				WREG32(DC_HOT_PLUG_DETECT2_CONTROL, DC_HOT_PLUG_DETECTx_EN);
   1003				break;
   1004			case RADEON_HPD_3:
   1005				WREG32(DC_HOT_PLUG_DETECT3_CONTROL, DC_HOT_PLUG_DETECTx_EN);
   1006				break;
   1007			default:
   1008				break;
   1009			}
   1010		}
   1011		if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)
   1012			enable |= 1 << radeon_connector->hpd.hpd;
   1013		radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);
   1014	}
   1015	radeon_irq_kms_enable_hpd(rdev, enable);
   1016}
   1017
   1018void r600_hpd_fini(struct radeon_device *rdev)
   1019{
   1020	struct drm_device *dev = rdev->ddev;
   1021	struct drm_connector *connector;
   1022	unsigned disable = 0;
   1023
   1024	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
   1025		struct radeon_connector *radeon_connector = to_radeon_connector(connector);
   1026		if (ASIC_IS_DCE3(rdev)) {
   1027			switch (radeon_connector->hpd.hpd) {
   1028			case RADEON_HPD_1:
   1029				WREG32(DC_HPD1_CONTROL, 0);
   1030				break;
   1031			case RADEON_HPD_2:
   1032				WREG32(DC_HPD2_CONTROL, 0);
   1033				break;
   1034			case RADEON_HPD_3:
   1035				WREG32(DC_HPD3_CONTROL, 0);
   1036				break;
   1037			case RADEON_HPD_4:
   1038				WREG32(DC_HPD4_CONTROL, 0);
   1039				break;
   1040				/* DCE 3.2 */
   1041			case RADEON_HPD_5:
   1042				WREG32(DC_HPD5_CONTROL, 0);
   1043				break;
   1044			case RADEON_HPD_6:
   1045				WREG32(DC_HPD6_CONTROL, 0);
   1046				break;
   1047			default:
   1048				break;
   1049			}
   1050		} else {
   1051			switch (radeon_connector->hpd.hpd) {
   1052			case RADEON_HPD_1:
   1053				WREG32(DC_HOT_PLUG_DETECT1_CONTROL, 0);
   1054				break;
   1055			case RADEON_HPD_2:
   1056				WREG32(DC_HOT_PLUG_DETECT2_CONTROL, 0);
   1057				break;
   1058			case RADEON_HPD_3:
   1059				WREG32(DC_HOT_PLUG_DETECT3_CONTROL, 0);
   1060				break;
   1061			default:
   1062				break;
   1063			}
   1064		}
   1065		if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)
   1066			disable |= 1 << radeon_connector->hpd.hpd;
   1067	}
   1068	radeon_irq_kms_disable_hpd(rdev, disable);
   1069}
   1070
   1071/*
   1072 * R600 PCIE GART
   1073 */
   1074void r600_pcie_gart_tlb_flush(struct radeon_device *rdev)
   1075{
   1076	unsigned i;
   1077	u32 tmp;
   1078
   1079	/* flush hdp cache so updates hit vram */
   1080	if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740) &&
   1081	    !(rdev->flags & RADEON_IS_AGP)) {
   1082		void __iomem *ptr = (void *)rdev->gart.ptr;
   1083
   1084		/* r7xx hw bug.  write to HDP_DEBUG1 followed by fb read
   1085		 * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL
   1086		 * This seems to cause problems on some AGP cards. Just use the old
   1087		 * method for them.
   1088		 */
   1089		WREG32(HDP_DEBUG1, 0);
   1090		readl((void __iomem *)ptr);
   1091	} else
   1092		WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
   1093
   1094	WREG32(VM_CONTEXT0_INVALIDATION_LOW_ADDR, rdev->mc.gtt_start >> 12);
   1095	WREG32(VM_CONTEXT0_INVALIDATION_HIGH_ADDR, (rdev->mc.gtt_end - 1) >> 12);
   1096	WREG32(VM_CONTEXT0_REQUEST_RESPONSE, REQUEST_TYPE(1));
   1097	for (i = 0; i < rdev->usec_timeout; i++) {
   1098		/* read MC_STATUS */
   1099		tmp = RREG32(VM_CONTEXT0_REQUEST_RESPONSE);
   1100		tmp = (tmp & RESPONSE_TYPE_MASK) >> RESPONSE_TYPE_SHIFT;
   1101		if (tmp == 2) {
   1102			pr_warn("[drm] r600 flush TLB failed\n");
   1103			return;
   1104		}
   1105		if (tmp) {
   1106			return;
   1107		}
   1108		udelay(1);
   1109	}
   1110}
   1111
   1112int r600_pcie_gart_init(struct radeon_device *rdev)
   1113{
   1114	int r;
   1115
   1116	if (rdev->gart.robj) {
   1117		WARN(1, "R600 PCIE GART already initialized\n");
   1118		return 0;
   1119	}
   1120	/* Initialize common gart structure */
   1121	r = radeon_gart_init(rdev);
   1122	if (r)
   1123		return r;
   1124	rdev->gart.table_size = rdev->gart.num_gpu_pages * 8;
   1125	return radeon_gart_table_vram_alloc(rdev);
   1126}
   1127
   1128static int r600_pcie_gart_enable(struct radeon_device *rdev)
   1129{
   1130	u32 tmp;
   1131	int r, i;
   1132
   1133	if (rdev->gart.robj == NULL) {
   1134		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
   1135		return -EINVAL;
   1136	}
   1137	r = radeon_gart_table_vram_pin(rdev);
   1138	if (r)
   1139		return r;
   1140
   1141	/* Setup L2 cache */
   1142	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
   1143				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
   1144				EFFECTIVE_L2_QUEUE_SIZE(7));
   1145	WREG32(VM_L2_CNTL2, 0);
   1146	WREG32(VM_L2_CNTL3, BANK_SELECT_0(0) | BANK_SELECT_1(1));
   1147	/* Setup TLB control */
   1148	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
   1149		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
   1150		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5) |
   1151		ENABLE_WAIT_L2_QUERY;
   1152	WREG32(MC_VM_L1_TLB_MCB_RD_SYS_CNTL, tmp);
   1153	WREG32(MC_VM_L1_TLB_MCB_WR_SYS_CNTL, tmp);
   1154	WREG32(MC_VM_L1_TLB_MCB_RD_HDP_CNTL, tmp | ENABLE_L1_STRICT_ORDERING);
   1155	WREG32(MC_VM_L1_TLB_MCB_WR_HDP_CNTL, tmp);
   1156	WREG32(MC_VM_L1_TLB_MCD_RD_A_CNTL, tmp);
   1157	WREG32(MC_VM_L1_TLB_MCD_WR_A_CNTL, tmp);
   1158	WREG32(MC_VM_L1_TLB_MCD_RD_B_CNTL, tmp);
   1159	WREG32(MC_VM_L1_TLB_MCD_WR_B_CNTL, tmp);
   1160	WREG32(MC_VM_L1_TLB_MCB_RD_GFX_CNTL, tmp);
   1161	WREG32(MC_VM_L1_TLB_MCB_WR_GFX_CNTL, tmp);
   1162	WREG32(MC_VM_L1_TLB_MCB_RD_PDMA_CNTL, tmp);
   1163	WREG32(MC_VM_L1_TLB_MCB_WR_PDMA_CNTL, tmp);
   1164	WREG32(MC_VM_L1_TLB_MCB_RD_UVD_CNTL, tmp);
   1165	WREG32(MC_VM_L1_TLB_MCB_WR_UVD_CNTL, tmp);
   1166	WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE);
   1167	WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE);
   1168	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
   1169	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
   1170	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
   1171	WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
   1172				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
   1173	WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
   1174			(u32)(rdev->dummy_page.addr >> 12));
   1175	for (i = 1; i < 7; i++)
   1176		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
   1177
   1178	r600_pcie_gart_tlb_flush(rdev);
   1179	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
   1180		 (unsigned)(rdev->mc.gtt_size >> 20),
   1181		 (unsigned long long)rdev->gart.table_addr);
   1182	rdev->gart.ready = true;
   1183	return 0;
   1184}
   1185
   1186static void r600_pcie_gart_disable(struct radeon_device *rdev)
   1187{
   1188	u32 tmp;
   1189	int i;
   1190
   1191	/* Disable all tables */
   1192	for (i = 0; i < 7; i++)
   1193		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
   1194
   1195	/* Disable L2 cache */
   1196	WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
   1197				EFFECTIVE_L2_QUEUE_SIZE(7));
   1198	WREG32(VM_L2_CNTL3, BANK_SELECT_0(0) | BANK_SELECT_1(1));
   1199	/* Setup L1 TLB control */
   1200	tmp = EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5) |
   1201		ENABLE_WAIT_L2_QUERY;
   1202	WREG32(MC_VM_L1_TLB_MCD_RD_A_CNTL, tmp);
   1203	WREG32(MC_VM_L1_TLB_MCD_WR_A_CNTL, tmp);
   1204	WREG32(MC_VM_L1_TLB_MCD_RD_B_CNTL, tmp);
   1205	WREG32(MC_VM_L1_TLB_MCD_WR_B_CNTL, tmp);
   1206	WREG32(MC_VM_L1_TLB_MCB_RD_GFX_CNTL, tmp);
   1207	WREG32(MC_VM_L1_TLB_MCB_WR_GFX_CNTL, tmp);
   1208	WREG32(MC_VM_L1_TLB_MCB_RD_PDMA_CNTL, tmp);
   1209	WREG32(MC_VM_L1_TLB_MCB_WR_PDMA_CNTL, tmp);
   1210	WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp);
   1211	WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp);
   1212	WREG32(MC_VM_L1_TLB_MCB_RD_SYS_CNTL, tmp);
   1213	WREG32(MC_VM_L1_TLB_MCB_WR_SYS_CNTL, tmp);
   1214	WREG32(MC_VM_L1_TLB_MCB_RD_HDP_CNTL, tmp);
   1215	WREG32(MC_VM_L1_TLB_MCB_WR_HDP_CNTL, tmp);
   1216	WREG32(MC_VM_L1_TLB_MCB_RD_UVD_CNTL, tmp);
   1217	WREG32(MC_VM_L1_TLB_MCB_WR_UVD_CNTL, tmp);
   1218	radeon_gart_table_vram_unpin(rdev);
   1219}
   1220
   1221static void r600_pcie_gart_fini(struct radeon_device *rdev)
   1222{
   1223	radeon_gart_fini(rdev);
   1224	r600_pcie_gart_disable(rdev);
   1225	radeon_gart_table_vram_free(rdev);
   1226}
   1227
   1228static void r600_agp_enable(struct radeon_device *rdev)
   1229{
   1230	u32 tmp;
   1231	int i;
   1232
   1233	/* Setup L2 cache */
   1234	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
   1235				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
   1236				EFFECTIVE_L2_QUEUE_SIZE(7));
   1237	WREG32(VM_L2_CNTL2, 0);
   1238	WREG32(VM_L2_CNTL3, BANK_SELECT_0(0) | BANK_SELECT_1(1));
   1239	/* Setup TLB control */
   1240	tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
   1241		SYSTEM_ACCESS_MODE_NOT_IN_SYS |
   1242		EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5) |
   1243		ENABLE_WAIT_L2_QUERY;
   1244	WREG32(MC_VM_L1_TLB_MCB_RD_SYS_CNTL, tmp);
   1245	WREG32(MC_VM_L1_TLB_MCB_WR_SYS_CNTL, tmp);
   1246	WREG32(MC_VM_L1_TLB_MCB_RD_HDP_CNTL, tmp | ENABLE_L1_STRICT_ORDERING);
   1247	WREG32(MC_VM_L1_TLB_MCB_WR_HDP_CNTL, tmp);
   1248	WREG32(MC_VM_L1_TLB_MCD_RD_A_CNTL, tmp);
   1249	WREG32(MC_VM_L1_TLB_MCD_WR_A_CNTL, tmp);
   1250	WREG32(MC_VM_L1_TLB_MCD_RD_B_CNTL, tmp);
   1251	WREG32(MC_VM_L1_TLB_MCD_WR_B_CNTL, tmp);
   1252	WREG32(MC_VM_L1_TLB_MCB_RD_GFX_CNTL, tmp);
   1253	WREG32(MC_VM_L1_TLB_MCB_WR_GFX_CNTL, tmp);
   1254	WREG32(MC_VM_L1_TLB_MCB_RD_PDMA_CNTL, tmp);
   1255	WREG32(MC_VM_L1_TLB_MCB_WR_PDMA_CNTL, tmp);
   1256	WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE);
   1257	WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE);
   1258	for (i = 0; i < 7; i++)
   1259		WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
   1260}
   1261
   1262int r600_mc_wait_for_idle(struct radeon_device *rdev)
   1263{
   1264	unsigned i;
   1265	u32 tmp;
   1266
   1267	for (i = 0; i < rdev->usec_timeout; i++) {
   1268		/* read MC_STATUS */
   1269		tmp = RREG32(R_000E50_SRBM_STATUS) & 0x3F00;
   1270		if (!tmp)
   1271			return 0;
   1272		udelay(1);
   1273	}
   1274	return -1;
   1275}
   1276
   1277uint32_t rs780_mc_rreg(struct radeon_device *rdev, uint32_t reg)
   1278{
   1279	unsigned long flags;
   1280	uint32_t r;
   1281
   1282	spin_lock_irqsave(&rdev->mc_idx_lock, flags);
   1283	WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg));
   1284	r = RREG32(R_0028FC_MC_DATA);
   1285	WREG32(R_0028F8_MC_INDEX, ~C_0028F8_MC_IND_ADDR);
   1286	spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
   1287	return r;
   1288}
   1289
   1290void rs780_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
   1291{
   1292	unsigned long flags;
   1293
   1294	spin_lock_irqsave(&rdev->mc_idx_lock, flags);
   1295	WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg) |
   1296		S_0028F8_MC_IND_WR_EN(1));
   1297	WREG32(R_0028FC_MC_DATA, v);
   1298	WREG32(R_0028F8_MC_INDEX, 0x7F);
   1299	spin_unlock_irqrestore(&rdev->mc_idx_lock, flags);
   1300}
   1301
   1302static void r600_mc_program(struct radeon_device *rdev)
   1303{
   1304	struct rv515_mc_save save;
   1305	u32 tmp;
   1306	int i, j;
   1307
   1308	/* Initialize HDP */
   1309	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
   1310		WREG32((0x2c14 + j), 0x00000000);
   1311		WREG32((0x2c18 + j), 0x00000000);
   1312		WREG32((0x2c1c + j), 0x00000000);
   1313		WREG32((0x2c20 + j), 0x00000000);
   1314		WREG32((0x2c24 + j), 0x00000000);
   1315	}
   1316	WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
   1317
   1318	rv515_mc_stop(rdev, &save);
   1319	if (r600_mc_wait_for_idle(rdev)) {
   1320		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
   1321	}
   1322	/* Lockout access through VGA aperture (doesn't exist before R600) */
   1323	WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
   1324	/* Update configuration */
   1325	if (rdev->flags & RADEON_IS_AGP) {
   1326		if (rdev->mc.vram_start < rdev->mc.gtt_start) {
   1327			/* VRAM before AGP */
   1328			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
   1329				rdev->mc.vram_start >> 12);
   1330			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
   1331				rdev->mc.gtt_end >> 12);
   1332		} else {
   1333			/* VRAM after AGP */
   1334			WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
   1335				rdev->mc.gtt_start >> 12);
   1336			WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
   1337				rdev->mc.vram_end >> 12);
   1338		}
   1339	} else {
   1340		WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12);
   1341		WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, rdev->mc.vram_end >> 12);
   1342	}
   1343	WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
   1344	tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
   1345	tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
   1346	WREG32(MC_VM_FB_LOCATION, tmp);
   1347	WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
   1348	WREG32(HDP_NONSURFACE_INFO, (2 << 7));
   1349	WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
   1350	if (rdev->flags & RADEON_IS_AGP) {
   1351		WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 22);
   1352		WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 22);
   1353		WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
   1354	} else {
   1355		WREG32(MC_VM_AGP_BASE, 0);
   1356		WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
   1357		WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
   1358	}
   1359	if (r600_mc_wait_for_idle(rdev)) {
   1360		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
   1361	}
   1362	rv515_mc_resume(rdev, &save);
   1363	/* we need to own VRAM, so turn off the VGA renderer here
   1364	 * to stop it overwriting our objects */
   1365	rv515_vga_render_disable(rdev);
   1366}
   1367
   1368/**
   1369 * r600_vram_gtt_location - try to find VRAM & GTT location
   1370 * @rdev: radeon device structure holding all necessary informations
   1371 * @mc: memory controller structure holding memory informations
   1372 *
   1373 * Function will place try to place VRAM at same place as in CPU (PCI)
   1374 * address space as some GPU seems to have issue when we reprogram at
   1375 * different address space.
   1376 *
   1377 * If there is not enough space to fit the unvisible VRAM after the
   1378 * aperture then we limit the VRAM size to the aperture.
   1379 *
   1380 * If we are using AGP then place VRAM adjacent to AGP aperture are we need
   1381 * them to be in one from GPU point of view so that we can program GPU to
   1382 * catch access outside them (weird GPU policy see ??).
   1383 *
   1384 * This function will never fails, worst case are limiting VRAM or GTT.
   1385 *
   1386 * Note: GTT start, end, size should be initialized before calling this
   1387 * function on AGP platform.
   1388 */
   1389static void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
   1390{
   1391	u64 size_bf, size_af;
   1392
   1393	if (mc->mc_vram_size > 0xE0000000) {
   1394		/* leave room for at least 512M GTT */
   1395		dev_warn(rdev->dev, "limiting VRAM\n");
   1396		mc->real_vram_size = 0xE0000000;
   1397		mc->mc_vram_size = 0xE0000000;
   1398	}
   1399	if (rdev->flags & RADEON_IS_AGP) {
   1400		size_bf = mc->gtt_start;
   1401		size_af = mc->mc_mask - mc->gtt_end;
   1402		if (size_bf > size_af) {
   1403			if (mc->mc_vram_size > size_bf) {
   1404				dev_warn(rdev->dev, "limiting VRAM\n");
   1405				mc->real_vram_size = size_bf;
   1406				mc->mc_vram_size = size_bf;
   1407			}
   1408			mc->vram_start = mc->gtt_start - mc->mc_vram_size;
   1409		} else {
   1410			if (mc->mc_vram_size > size_af) {
   1411				dev_warn(rdev->dev, "limiting VRAM\n");
   1412				mc->real_vram_size = size_af;
   1413				mc->mc_vram_size = size_af;
   1414			}
   1415			mc->vram_start = mc->gtt_end + 1;
   1416		}
   1417		mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
   1418		dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",
   1419				mc->mc_vram_size >> 20, mc->vram_start,
   1420				mc->vram_end, mc->real_vram_size >> 20);
   1421	} else {
   1422		u64 base = 0;
   1423		if (rdev->flags & RADEON_IS_IGP) {
   1424			base = RREG32(MC_VM_FB_LOCATION) & 0xFFFF;
   1425			base <<= 24;
   1426		}
   1427		radeon_vram_location(rdev, &rdev->mc, base);
   1428		rdev->mc.gtt_base_align = 0;
   1429		radeon_gtt_location(rdev, mc);
   1430	}
   1431}
   1432
   1433static int r600_mc_init(struct radeon_device *rdev)
   1434{
   1435	u32 tmp;
   1436	int chansize, numchan;
   1437	uint32_t h_addr, l_addr;
   1438	unsigned long long k8_addr;
   1439
   1440	/* Get VRAM informations */
   1441	rdev->mc.vram_is_ddr = true;
   1442	tmp = RREG32(RAMCFG);
   1443	if (tmp & CHANSIZE_OVERRIDE) {
   1444		chansize = 16;
   1445	} else if (tmp & CHANSIZE_MASK) {
   1446		chansize = 64;
   1447	} else {
   1448		chansize = 32;
   1449	}
   1450	tmp = RREG32(CHMAP);
   1451	switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
   1452	case 0:
   1453	default:
   1454		numchan = 1;
   1455		break;
   1456	case 1:
   1457		numchan = 2;
   1458		break;
   1459	case 2:
   1460		numchan = 4;
   1461		break;
   1462	case 3:
   1463		numchan = 8;
   1464		break;
   1465	}
   1466	rdev->mc.vram_width = numchan * chansize;
   1467	/* Could aper size report 0 ? */
   1468	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
   1469	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
   1470	/* Setup GPU memory space */
   1471	rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
   1472	rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
   1473	rdev->mc.visible_vram_size = rdev->mc.aper_size;
   1474	r600_vram_gtt_location(rdev, &rdev->mc);
   1475
   1476	if (rdev->flags & RADEON_IS_IGP) {
   1477		rs690_pm_info(rdev);
   1478		rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
   1479
   1480		if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) {
   1481			/* Use K8 direct mapping for fast fb access. */
   1482			rdev->fastfb_working = false;
   1483			h_addr = G_000012_K8_ADDR_EXT(RREG32_MC(R_000012_MC_MISC_UMA_CNTL));
   1484			l_addr = RREG32_MC(R_000011_K8_FB_LOCATION);
   1485			k8_addr = ((unsigned long long)h_addr) << 32 | l_addr;
   1486#if defined(CONFIG_X86_32) && !defined(CONFIG_X86_PAE)
   1487			if (k8_addr + rdev->mc.visible_vram_size < 0x100000000ULL)
   1488#endif
   1489			{
   1490				/* FastFB shall be used with UMA memory. Here it is simply disabled when sideport
   1491		 		* memory is present.
   1492		 		*/
   1493				if (rdev->mc.igp_sideport_enabled == false && radeon_fastfb == 1) {
   1494					DRM_INFO("Direct mapping: aper base at 0x%llx, replaced by direct mapping base 0x%llx.\n",
   1495						(unsigned long long)rdev->mc.aper_base, k8_addr);
   1496					rdev->mc.aper_base = (resource_size_t)k8_addr;
   1497					rdev->fastfb_working = true;
   1498				}
   1499			}
   1500		}
   1501	}
   1502
   1503	radeon_update_bandwidth_info(rdev);
   1504	return 0;
   1505}
   1506
   1507int r600_vram_scratch_init(struct radeon_device *rdev)
   1508{
   1509	int r;
   1510
   1511	if (rdev->vram_scratch.robj == NULL) {
   1512		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE,
   1513				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
   1514				     0, NULL, NULL, &rdev->vram_scratch.robj);
   1515		if (r) {
   1516			return r;
   1517		}
   1518	}
   1519
   1520	r = radeon_bo_reserve(rdev->vram_scratch.robj, false);
   1521	if (unlikely(r != 0))
   1522		return r;
   1523	r = radeon_bo_pin(rdev->vram_scratch.robj,
   1524			  RADEON_GEM_DOMAIN_VRAM, &rdev->vram_scratch.gpu_addr);
   1525	if (r) {
   1526		radeon_bo_unreserve(rdev->vram_scratch.robj);
   1527		return r;
   1528	}
   1529	r = radeon_bo_kmap(rdev->vram_scratch.robj,
   1530				(void **)&rdev->vram_scratch.ptr);
   1531	if (r)
   1532		radeon_bo_unpin(rdev->vram_scratch.robj);
   1533	radeon_bo_unreserve(rdev->vram_scratch.robj);
   1534
   1535	return r;
   1536}
   1537
   1538void r600_vram_scratch_fini(struct radeon_device *rdev)
   1539{
   1540	int r;
   1541
   1542	if (rdev->vram_scratch.robj == NULL) {
   1543		return;
   1544	}
   1545	r = radeon_bo_reserve(rdev->vram_scratch.robj, false);
   1546	if (likely(r == 0)) {
   1547		radeon_bo_kunmap(rdev->vram_scratch.robj);
   1548		radeon_bo_unpin(rdev->vram_scratch.robj);
   1549		radeon_bo_unreserve(rdev->vram_scratch.robj);
   1550	}
   1551	radeon_bo_unref(&rdev->vram_scratch.robj);
   1552}
   1553
   1554void r600_set_bios_scratch_engine_hung(struct radeon_device *rdev, bool hung)
   1555{
   1556	u32 tmp = RREG32(R600_BIOS_3_SCRATCH);
   1557
   1558	if (hung)
   1559		tmp |= ATOM_S3_ASIC_GUI_ENGINE_HUNG;
   1560	else
   1561		tmp &= ~ATOM_S3_ASIC_GUI_ENGINE_HUNG;
   1562
   1563	WREG32(R600_BIOS_3_SCRATCH, tmp);
   1564}
   1565
   1566static void r600_print_gpu_status_regs(struct radeon_device *rdev)
   1567{
   1568	dev_info(rdev->dev, "  R_008010_GRBM_STATUS      = 0x%08X\n",
   1569		 RREG32(R_008010_GRBM_STATUS));
   1570	dev_info(rdev->dev, "  R_008014_GRBM_STATUS2     = 0x%08X\n",
   1571		 RREG32(R_008014_GRBM_STATUS2));
   1572	dev_info(rdev->dev, "  R_000E50_SRBM_STATUS      = 0x%08X\n",
   1573		 RREG32(R_000E50_SRBM_STATUS));
   1574	dev_info(rdev->dev, "  R_008674_CP_STALLED_STAT1 = 0x%08X\n",
   1575		 RREG32(CP_STALLED_STAT1));
   1576	dev_info(rdev->dev, "  R_008678_CP_STALLED_STAT2 = 0x%08X\n",
   1577		 RREG32(CP_STALLED_STAT2));
   1578	dev_info(rdev->dev, "  R_00867C_CP_BUSY_STAT     = 0x%08X\n",
   1579		 RREG32(CP_BUSY_STAT));
   1580	dev_info(rdev->dev, "  R_008680_CP_STAT          = 0x%08X\n",
   1581		 RREG32(CP_STAT));
   1582	dev_info(rdev->dev, "  R_00D034_DMA_STATUS_REG   = 0x%08X\n",
   1583		RREG32(DMA_STATUS_REG));
   1584}
   1585
   1586static bool r600_is_display_hung(struct radeon_device *rdev)
   1587{
   1588	u32 crtc_hung = 0;
   1589	u32 crtc_status[2];
   1590	u32 i, j, tmp;
   1591
   1592	for (i = 0; i < rdev->num_crtc; i++) {
   1593		if (RREG32(AVIVO_D1CRTC_CONTROL + crtc_offsets[i]) & AVIVO_CRTC_EN) {
   1594			crtc_status[i] = RREG32(AVIVO_D1CRTC_STATUS_HV_COUNT + crtc_offsets[i]);
   1595			crtc_hung |= (1 << i);
   1596		}
   1597	}
   1598
   1599	for (j = 0; j < 10; j++) {
   1600		for (i = 0; i < rdev->num_crtc; i++) {
   1601			if (crtc_hung & (1 << i)) {
   1602				tmp = RREG32(AVIVO_D1CRTC_STATUS_HV_COUNT + crtc_offsets[i]);
   1603				if (tmp != crtc_status[i])
   1604					crtc_hung &= ~(1 << i);
   1605			}
   1606		}
   1607		if (crtc_hung == 0)
   1608			return false;
   1609		udelay(100);
   1610	}
   1611
   1612	return true;
   1613}
   1614
   1615u32 r600_gpu_check_soft_reset(struct radeon_device *rdev)
   1616{
   1617	u32 reset_mask = 0;
   1618	u32 tmp;
   1619
   1620	/* GRBM_STATUS */
   1621	tmp = RREG32(R_008010_GRBM_STATUS);
   1622	if (rdev->family >= CHIP_RV770) {
   1623		if (G_008010_PA_BUSY(tmp) | G_008010_SC_BUSY(tmp) |
   1624		    G_008010_SH_BUSY(tmp) | G_008010_SX_BUSY(tmp) |
   1625		    G_008010_TA_BUSY(tmp) | G_008010_VGT_BUSY(tmp) |
   1626		    G_008010_DB03_BUSY(tmp) | G_008010_CB03_BUSY(tmp) |
   1627		    G_008010_SPI03_BUSY(tmp) | G_008010_VGT_BUSY_NO_DMA(tmp))
   1628			reset_mask |= RADEON_RESET_GFX;
   1629	} else {
   1630		if (G_008010_PA_BUSY(tmp) | G_008010_SC_BUSY(tmp) |
   1631		    G_008010_SH_BUSY(tmp) | G_008010_SX_BUSY(tmp) |
   1632		    G_008010_TA03_BUSY(tmp) | G_008010_VGT_BUSY(tmp) |
   1633		    G_008010_DB03_BUSY(tmp) | G_008010_CB03_BUSY(tmp) |
   1634		    G_008010_SPI03_BUSY(tmp) | G_008010_VGT_BUSY_NO_DMA(tmp))
   1635			reset_mask |= RADEON_RESET_GFX;
   1636	}
   1637
   1638	if (G_008010_CF_RQ_PENDING(tmp) | G_008010_PF_RQ_PENDING(tmp) |
   1639	    G_008010_CP_BUSY(tmp) | G_008010_CP_COHERENCY_BUSY(tmp))
   1640		reset_mask |= RADEON_RESET_CP;
   1641
   1642	if (G_008010_GRBM_EE_BUSY(tmp))
   1643		reset_mask |= RADEON_RESET_GRBM | RADEON_RESET_GFX | RADEON_RESET_CP;
   1644
   1645	/* DMA_STATUS_REG */
   1646	tmp = RREG32(DMA_STATUS_REG);
   1647	if (!(tmp & DMA_IDLE))
   1648		reset_mask |= RADEON_RESET_DMA;
   1649
   1650	/* SRBM_STATUS */
   1651	tmp = RREG32(R_000E50_SRBM_STATUS);
   1652	if (G_000E50_RLC_RQ_PENDING(tmp) | G_000E50_RLC_BUSY(tmp))
   1653		reset_mask |= RADEON_RESET_RLC;
   1654
   1655	if (G_000E50_IH_BUSY(tmp))
   1656		reset_mask |= RADEON_RESET_IH;
   1657
   1658	if (G_000E50_SEM_BUSY(tmp))
   1659		reset_mask |= RADEON_RESET_SEM;
   1660
   1661	if (G_000E50_GRBM_RQ_PENDING(tmp))
   1662		reset_mask |= RADEON_RESET_GRBM;
   1663
   1664	if (G_000E50_VMC_BUSY(tmp))
   1665		reset_mask |= RADEON_RESET_VMC;
   1666
   1667	if (G_000E50_MCB_BUSY(tmp) | G_000E50_MCDZ_BUSY(tmp) |
   1668	    G_000E50_MCDY_BUSY(tmp) | G_000E50_MCDX_BUSY(tmp) |
   1669	    G_000E50_MCDW_BUSY(tmp))
   1670		reset_mask |= RADEON_RESET_MC;
   1671
   1672	if (r600_is_display_hung(rdev))
   1673		reset_mask |= RADEON_RESET_DISPLAY;
   1674
   1675	/* Skip MC reset as it's mostly likely not hung, just busy */
   1676	if (reset_mask & RADEON_RESET_MC) {
   1677		DRM_DEBUG("MC busy: 0x%08X, clearing.\n", reset_mask);
   1678		reset_mask &= ~RADEON_RESET_MC;
   1679	}
   1680
   1681	return reset_mask;
   1682}
   1683
   1684static void r600_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
   1685{
   1686	struct rv515_mc_save save;
   1687	u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
   1688	u32 tmp;
   1689
   1690	if (reset_mask == 0)
   1691		return;
   1692
   1693	dev_info(rdev->dev, "GPU softreset: 0x%08X\n", reset_mask);
   1694
   1695	r600_print_gpu_status_regs(rdev);
   1696
   1697	/* Disable CP parsing/prefetching */
   1698	if (rdev->family >= CHIP_RV770)
   1699		WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1) | S_0086D8_CP_PFP_HALT(1));
   1700	else
   1701		WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1));
   1702
   1703	/* disable the RLC */
   1704	WREG32(RLC_CNTL, 0);
   1705
   1706	if (reset_mask & RADEON_RESET_DMA) {
   1707		/* Disable DMA */
   1708		tmp = RREG32(DMA_RB_CNTL);
   1709		tmp &= ~DMA_RB_ENABLE;
   1710		WREG32(DMA_RB_CNTL, tmp);
   1711	}
   1712
   1713	mdelay(50);
   1714
   1715	rv515_mc_stop(rdev, &save);
   1716	if (r600_mc_wait_for_idle(rdev)) {
   1717		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
   1718	}
   1719
   1720	if (reset_mask & (RADEON_RESET_GFX | RADEON_RESET_COMPUTE)) {
   1721		if (rdev->family >= CHIP_RV770)
   1722			grbm_soft_reset |= S_008020_SOFT_RESET_DB(1) |
   1723				S_008020_SOFT_RESET_CB(1) |
   1724				S_008020_SOFT_RESET_PA(1) |
   1725				S_008020_SOFT_RESET_SC(1) |
   1726				S_008020_SOFT_RESET_SPI(1) |
   1727				S_008020_SOFT_RESET_SX(1) |
   1728				S_008020_SOFT_RESET_SH(1) |
   1729				S_008020_SOFT_RESET_TC(1) |
   1730				S_008020_SOFT_RESET_TA(1) |
   1731				S_008020_SOFT_RESET_VC(1) |
   1732				S_008020_SOFT_RESET_VGT(1);
   1733		else
   1734			grbm_soft_reset |= S_008020_SOFT_RESET_CR(1) |
   1735				S_008020_SOFT_RESET_DB(1) |
   1736				S_008020_SOFT_RESET_CB(1) |
   1737				S_008020_SOFT_RESET_PA(1) |
   1738				S_008020_SOFT_RESET_SC(1) |
   1739				S_008020_SOFT_RESET_SMX(1) |
   1740				S_008020_SOFT_RESET_SPI(1) |
   1741				S_008020_SOFT_RESET_SX(1) |
   1742				S_008020_SOFT_RESET_SH(1) |
   1743				S_008020_SOFT_RESET_TC(1) |
   1744				S_008020_SOFT_RESET_TA(1) |
   1745				S_008020_SOFT_RESET_VC(1) |
   1746				S_008020_SOFT_RESET_VGT(1);
   1747	}
   1748
   1749	if (reset_mask & RADEON_RESET_CP) {
   1750		grbm_soft_reset |= S_008020_SOFT_RESET_CP(1) |
   1751			S_008020_SOFT_RESET_VGT(1);
   1752
   1753		srbm_soft_reset |= S_000E60_SOFT_RESET_GRBM(1);
   1754	}
   1755
   1756	if (reset_mask & RADEON_RESET_DMA) {
   1757		if (rdev->family >= CHIP_RV770)
   1758			srbm_soft_reset |= RV770_SOFT_RESET_DMA;
   1759		else
   1760			srbm_soft_reset |= SOFT_RESET_DMA;
   1761	}
   1762
   1763	if (reset_mask & RADEON_RESET_RLC)
   1764		srbm_soft_reset |= S_000E60_SOFT_RESET_RLC(1);
   1765
   1766	if (reset_mask & RADEON_RESET_SEM)
   1767		srbm_soft_reset |= S_000E60_SOFT_RESET_SEM(1);
   1768
   1769	if (reset_mask & RADEON_RESET_IH)
   1770		srbm_soft_reset |= S_000E60_SOFT_RESET_IH(1);
   1771
   1772	if (reset_mask & RADEON_RESET_GRBM)
   1773		srbm_soft_reset |= S_000E60_SOFT_RESET_GRBM(1);
   1774
   1775	if (!(rdev->flags & RADEON_IS_IGP)) {
   1776		if (reset_mask & RADEON_RESET_MC)
   1777			srbm_soft_reset |= S_000E60_SOFT_RESET_MC(1);
   1778	}
   1779
   1780	if (reset_mask & RADEON_RESET_VMC)
   1781		srbm_soft_reset |= S_000E60_SOFT_RESET_VMC(1);
   1782
   1783	if (grbm_soft_reset) {
   1784		tmp = RREG32(R_008020_GRBM_SOFT_RESET);
   1785		tmp |= grbm_soft_reset;
   1786		dev_info(rdev->dev, "R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp);
   1787		WREG32(R_008020_GRBM_SOFT_RESET, tmp);
   1788		tmp = RREG32(R_008020_GRBM_SOFT_RESET);
   1789
   1790		udelay(50);
   1791
   1792		tmp &= ~grbm_soft_reset;
   1793		WREG32(R_008020_GRBM_SOFT_RESET, tmp);
   1794		tmp = RREG32(R_008020_GRBM_SOFT_RESET);
   1795	}
   1796
   1797	if (srbm_soft_reset) {
   1798		tmp = RREG32(SRBM_SOFT_RESET);
   1799		tmp |= srbm_soft_reset;
   1800		dev_info(rdev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
   1801		WREG32(SRBM_SOFT_RESET, tmp);
   1802		tmp = RREG32(SRBM_SOFT_RESET);
   1803
   1804		udelay(50);
   1805
   1806		tmp &= ~srbm_soft_reset;
   1807		WREG32(SRBM_SOFT_RESET, tmp);
   1808		tmp = RREG32(SRBM_SOFT_RESET);
   1809	}
   1810
   1811	/* Wait a little for things to settle down */
   1812	mdelay(1);
   1813
   1814	rv515_mc_resume(rdev, &save);
   1815	udelay(50);
   1816
   1817	r600_print_gpu_status_regs(rdev);
   1818}
   1819
   1820static void r600_gpu_pci_config_reset(struct radeon_device *rdev)
   1821{
   1822	struct rv515_mc_save save;
   1823	u32 tmp, i;
   1824
   1825	dev_info(rdev->dev, "GPU pci config reset\n");
   1826
   1827	/* disable dpm? */
   1828
   1829	/* Disable CP parsing/prefetching */
   1830	if (rdev->family >= CHIP_RV770)
   1831		WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1) | S_0086D8_CP_PFP_HALT(1));
   1832	else
   1833		WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1));
   1834
   1835	/* disable the RLC */
   1836	WREG32(RLC_CNTL, 0);
   1837
   1838	/* Disable DMA */
   1839	tmp = RREG32(DMA_RB_CNTL);
   1840	tmp &= ~DMA_RB_ENABLE;
   1841	WREG32(DMA_RB_CNTL, tmp);
   1842
   1843	mdelay(50);
   1844
   1845	/* set mclk/sclk to bypass */
   1846	if (rdev->family >= CHIP_RV770)
   1847		rv770_set_clk_bypass_mode(rdev);
   1848	/* disable BM */
   1849	pci_clear_master(rdev->pdev);
   1850	/* disable mem access */
   1851	rv515_mc_stop(rdev, &save);
   1852	if (r600_mc_wait_for_idle(rdev)) {
   1853		dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
   1854	}
   1855
   1856	/* BIF reset workaround.  Not sure if this is needed on 6xx */
   1857	tmp = RREG32(BUS_CNTL);
   1858	tmp |= VGA_COHE_SPEC_TIMER_DIS;
   1859	WREG32(BUS_CNTL, tmp);
   1860
   1861	tmp = RREG32(BIF_SCRATCH0);
   1862
   1863	/* reset */
   1864	radeon_pci_config_reset(rdev);
   1865	mdelay(1);
   1866
   1867	/* BIF reset workaround.  Not sure if this is needed on 6xx */
   1868	tmp = SOFT_RESET_BIF;
   1869	WREG32(SRBM_SOFT_RESET, tmp);
   1870	mdelay(1);
   1871	WREG32(SRBM_SOFT_RESET, 0);
   1872
   1873	/* wait for asic to come out of reset */
   1874	for (i = 0; i < rdev->usec_timeout; i++) {
   1875		if (RREG32(CONFIG_MEMSIZE) != 0xffffffff)
   1876			break;
   1877		udelay(1);
   1878	}
   1879}
   1880
   1881int r600_asic_reset(struct radeon_device *rdev, bool hard)
   1882{
   1883	u32 reset_mask;
   1884
   1885	if (hard) {
   1886		r600_gpu_pci_config_reset(rdev);
   1887		return 0;
   1888	}
   1889
   1890	reset_mask = r600_gpu_check_soft_reset(rdev);
   1891
   1892	if (reset_mask)
   1893		r600_set_bios_scratch_engine_hung(rdev, true);
   1894
   1895	/* try soft reset */
   1896	r600_gpu_soft_reset(rdev, reset_mask);
   1897
   1898	reset_mask = r600_gpu_check_soft_reset(rdev);
   1899
   1900	/* try pci config reset */
   1901	if (reset_mask && radeon_hard_reset)
   1902		r600_gpu_pci_config_reset(rdev);
   1903
   1904	reset_mask = r600_gpu_check_soft_reset(rdev);
   1905
   1906	if (!reset_mask)
   1907		r600_set_bios_scratch_engine_hung(rdev, false);
   1908
   1909	return 0;
   1910}
   1911
   1912/**
   1913 * r600_gfx_is_lockup - Check if the GFX engine is locked up
   1914 *
   1915 * @rdev: radeon_device pointer
   1916 * @ring: radeon_ring structure holding ring information
   1917 *
   1918 * Check if the GFX engine is locked up.
   1919 * Returns true if the engine appears to be locked up, false if not.
   1920 */
   1921bool r600_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
   1922{
   1923	u32 reset_mask = r600_gpu_check_soft_reset(rdev);
   1924
   1925	if (!(reset_mask & (RADEON_RESET_GFX |
   1926			    RADEON_RESET_COMPUTE |
   1927			    RADEON_RESET_CP))) {
   1928		radeon_ring_lockup_update(rdev, ring);
   1929		return false;
   1930	}
   1931	return radeon_ring_test_lockup(rdev, ring);
   1932}
   1933
   1934u32 r6xx_remap_render_backend(struct radeon_device *rdev,
   1935			      u32 tiling_pipe_num,
   1936			      u32 max_rb_num,
   1937			      u32 total_max_rb_num,
   1938			      u32 disabled_rb_mask)
   1939{
   1940	u32 rendering_pipe_num, rb_num_width, req_rb_num;
   1941	u32 pipe_rb_ratio, pipe_rb_remain, tmp;
   1942	u32 data = 0, mask = 1 << (max_rb_num - 1);
   1943	unsigned i, j;
   1944
   1945	/* mask out the RBs that don't exist on that asic */
   1946	tmp = disabled_rb_mask | ((0xff << max_rb_num) & 0xff);
   1947	/* make sure at least one RB is available */
   1948	if ((tmp & 0xff) != 0xff)
   1949		disabled_rb_mask = tmp;
   1950
   1951	rendering_pipe_num = 1 << tiling_pipe_num;
   1952	req_rb_num = total_max_rb_num - r600_count_pipe_bits(disabled_rb_mask);
   1953	BUG_ON(rendering_pipe_num < req_rb_num);
   1954
   1955	pipe_rb_ratio = rendering_pipe_num / req_rb_num;
   1956	pipe_rb_remain = rendering_pipe_num - pipe_rb_ratio * req_rb_num;
   1957
   1958	if (rdev->family <= CHIP_RV740) {
   1959		/* r6xx/r7xx */
   1960		rb_num_width = 2;
   1961	} else {
   1962		/* eg+ */
   1963		rb_num_width = 4;
   1964	}
   1965
   1966	for (i = 0; i < max_rb_num; i++) {
   1967		if (!(mask & disabled_rb_mask)) {
   1968			for (j = 0; j < pipe_rb_ratio; j++) {
   1969				data <<= rb_num_width;
   1970				data |= max_rb_num - i - 1;
   1971			}
   1972			if (pipe_rb_remain) {
   1973				data <<= rb_num_width;
   1974				data |= max_rb_num - i - 1;
   1975				pipe_rb_remain--;
   1976			}
   1977		}
   1978		mask >>= 1;
   1979	}
   1980
   1981	return data;
   1982}
   1983
   1984int r600_count_pipe_bits(uint32_t val)
   1985{
   1986	return hweight32(val);
   1987}
   1988
   1989static void r600_gpu_init(struct radeon_device *rdev)
   1990{
   1991	u32 tiling_config;
   1992	u32 ramcfg;
   1993	u32 cc_gc_shader_pipe_config;
   1994	u32 tmp;
   1995	int i, j;
   1996	u32 sq_config;
   1997	u32 sq_gpr_resource_mgmt_1 = 0;
   1998	u32 sq_gpr_resource_mgmt_2 = 0;
   1999	u32 sq_thread_resource_mgmt = 0;
   2000	u32 sq_stack_resource_mgmt_1 = 0;
   2001	u32 sq_stack_resource_mgmt_2 = 0;
   2002	u32 disabled_rb_mask;
   2003
   2004	rdev->config.r600.tiling_group_size = 256;
   2005	switch (rdev->family) {
   2006	case CHIP_R600:
   2007		rdev->config.r600.max_pipes = 4;
   2008		rdev->config.r600.max_tile_pipes = 8;
   2009		rdev->config.r600.max_simds = 4;
   2010		rdev->config.r600.max_backends = 4;
   2011		rdev->config.r600.max_gprs = 256;
   2012		rdev->config.r600.max_threads = 192;
   2013		rdev->config.r600.max_stack_entries = 256;
   2014		rdev->config.r600.max_hw_contexts = 8;
   2015		rdev->config.r600.max_gs_threads = 16;
   2016		rdev->config.r600.sx_max_export_size = 128;
   2017		rdev->config.r600.sx_max_export_pos_size = 16;
   2018		rdev->config.r600.sx_max_export_smx_size = 128;
   2019		rdev->config.r600.sq_num_cf_insts = 2;
   2020		break;
   2021	case CHIP_RV630:
   2022	case CHIP_RV635:
   2023		rdev->config.r600.max_pipes = 2;
   2024		rdev->config.r600.max_tile_pipes = 2;
   2025		rdev->config.r600.max_simds = 3;
   2026		rdev->config.r600.max_backends = 1;
   2027		rdev->config.r600.max_gprs = 128;
   2028		rdev->config.r600.max_threads = 192;
   2029		rdev->config.r600.max_stack_entries = 128;
   2030		rdev->config.r600.max_hw_contexts = 8;
   2031		rdev->config.r600.max_gs_threads = 4;
   2032		rdev->config.r600.sx_max_export_size = 128;
   2033		rdev->config.r600.sx_max_export_pos_size = 16;
   2034		rdev->config.r600.sx_max_export_smx_size = 128;
   2035		rdev->config.r600.sq_num_cf_insts = 2;
   2036		break;
   2037	case CHIP_RV610:
   2038	case CHIP_RV620:
   2039	case CHIP_RS780:
   2040	case CHIP_RS880:
   2041		rdev->config.r600.max_pipes = 1;
   2042		rdev->config.r600.max_tile_pipes = 1;
   2043		rdev->config.r600.max_simds = 2;
   2044		rdev->config.r600.max_backends = 1;
   2045		rdev->config.r600.max_gprs = 128;
   2046		rdev->config.r600.max_threads = 192;
   2047		rdev->config.r600.max_stack_entries = 128;
   2048		rdev->config.r600.max_hw_contexts = 4;
   2049		rdev->config.r600.max_gs_threads = 4;
   2050		rdev->config.r600.sx_max_export_size = 128;
   2051		rdev->config.r600.sx_max_export_pos_size = 16;
   2052		rdev->config.r600.sx_max_export_smx_size = 128;
   2053		rdev->config.r600.sq_num_cf_insts = 1;
   2054		break;
   2055	case CHIP_RV670:
   2056		rdev->config.r600.max_pipes = 4;
   2057		rdev->config.r600.max_tile_pipes = 4;
   2058		rdev->config.r600.max_simds = 4;
   2059		rdev->config.r600.max_backends = 4;
   2060		rdev->config.r600.max_gprs = 192;
   2061		rdev->config.r600.max_threads = 192;
   2062		rdev->config.r600.max_stack_entries = 256;
   2063		rdev->config.r600.max_hw_contexts = 8;
   2064		rdev->config.r600.max_gs_threads = 16;
   2065		rdev->config.r600.sx_max_export_size = 128;
   2066		rdev->config.r600.sx_max_export_pos_size = 16;
   2067		rdev->config.r600.sx_max_export_smx_size = 128;
   2068		rdev->config.r600.sq_num_cf_insts = 2;
   2069		break;
   2070	default:
   2071		break;
   2072	}
   2073
   2074	/* Initialize HDP */
   2075	for (i = 0, j = 0; i < 32; i++, j += 0x18) {
   2076		WREG32((0x2c14 + j), 0x00000000);
   2077		WREG32((0x2c18 + j), 0x00000000);
   2078		WREG32((0x2c1c + j), 0x00000000);
   2079		WREG32((0x2c20 + j), 0x00000000);
   2080		WREG32((0x2c24 + j), 0x00000000);
   2081	}
   2082
   2083	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
   2084
   2085	/* Setup tiling */
   2086	tiling_config = 0;
   2087	ramcfg = RREG32(RAMCFG);
   2088	switch (rdev->config.r600.max_tile_pipes) {
   2089	case 1:
   2090		tiling_config |= PIPE_TILING(0);
   2091		break;
   2092	case 2:
   2093		tiling_config |= PIPE_TILING(1);
   2094		break;
   2095	case 4:
   2096		tiling_config |= PIPE_TILING(2);
   2097		break;
   2098	case 8:
   2099		tiling_config |= PIPE_TILING(3);
   2100		break;
   2101	default:
   2102		break;
   2103	}
   2104	rdev->config.r600.tiling_npipes = rdev->config.r600.max_tile_pipes;
   2105	rdev->config.r600.tiling_nbanks = 4 << ((ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT);
   2106	tiling_config |= BANK_TILING((ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT);
   2107	tiling_config |= GROUP_SIZE((ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
   2108
   2109	tmp = (ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT;
   2110	if (tmp > 3) {
   2111		tiling_config |= ROW_TILING(3);
   2112		tiling_config |= SAMPLE_SPLIT(3);
   2113	} else {
   2114		tiling_config |= ROW_TILING(tmp);
   2115		tiling_config |= SAMPLE_SPLIT(tmp);
   2116	}
   2117	tiling_config |= BANK_SWAPS(1);
   2118
   2119	cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0x00ffff00;
   2120	tmp = rdev->config.r600.max_simds -
   2121		r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R6XX_MAX_SIMDS_MASK);
   2122	rdev->config.r600.active_simds = tmp;
   2123
   2124	disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R6XX_MAX_BACKENDS_MASK;
   2125	tmp = 0;
   2126	for (i = 0; i < rdev->config.r600.max_backends; i++)
   2127		tmp |= (1 << i);
   2128	/* if all the backends are disabled, fix it up here */
   2129	if ((disabled_rb_mask & tmp) == tmp) {
   2130		for (i = 0; i < rdev->config.r600.max_backends; i++)
   2131			disabled_rb_mask &= ~(1 << i);
   2132	}
   2133	tmp = (tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT;
   2134	tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.r600.max_backends,
   2135					R6XX_MAX_BACKENDS, disabled_rb_mask);
   2136	tiling_config |= tmp << 16;
   2137	rdev->config.r600.backend_map = tmp;
   2138
   2139	rdev->config.r600.tile_config = tiling_config;
   2140	WREG32(GB_TILING_CONFIG, tiling_config);
   2141	WREG32(DCP_TILING_CONFIG, tiling_config & 0xffff);
   2142	WREG32(HDP_TILING_CONFIG, tiling_config & 0xffff);
   2143	WREG32(DMA_TILING_CONFIG, tiling_config & 0xffff);
   2144
   2145	tmp = R6XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8);
   2146	WREG32(VGT_OUT_DEALLOC_CNTL, (tmp * 4) & DEALLOC_DIST_MASK);
   2147	WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((tmp * 4) - 2) & VTX_REUSE_DEPTH_MASK);
   2148
   2149	/* Setup some CP states */
   2150	WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) | ROQ_IB2_START(0x2b)));
   2151	WREG32(CP_MEQ_THRESHOLDS, (MEQ_END(0x40) | ROQ_END(0x40)));
   2152
   2153	WREG32(TA_CNTL_AUX, (DISABLE_CUBE_ANISO | SYNC_GRADIENT |
   2154			     SYNC_WALKER | SYNC_ALIGNER));
   2155	/* Setup various GPU states */
   2156	if (rdev->family == CHIP_RV670)
   2157		WREG32(ARB_GDEC_RD_CNTL, 0x00000021);
   2158
   2159	tmp = RREG32(SX_DEBUG_1);
   2160	tmp |= SMX_EVENT_RELEASE;
   2161	if ((rdev->family > CHIP_R600))
   2162		tmp |= ENABLE_NEW_SMX_ADDRESS;
   2163	WREG32(SX_DEBUG_1, tmp);
   2164
   2165	if (((rdev->family) == CHIP_R600) ||
   2166	    ((rdev->family) == CHIP_RV630) ||
   2167	    ((rdev->family) == CHIP_RV610) ||
   2168	    ((rdev->family) == CHIP_RV620) ||
   2169	    ((rdev->family) == CHIP_RS780) ||
   2170	    ((rdev->family) == CHIP_RS880)) {
   2171		WREG32(DB_DEBUG, PREZ_MUST_WAIT_FOR_POSTZ_DONE);
   2172	} else {
   2173		WREG32(DB_DEBUG, 0);
   2174	}
   2175	WREG32(DB_WATERMARKS, (DEPTH_FREE(4) | DEPTH_CACHELINE_FREE(16) |
   2176			       DEPTH_FLUSH(16) | DEPTH_PENDING_FREE(4)));
   2177
   2178	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
   2179	WREG32(VGT_NUM_INSTANCES, 0);
   2180
   2181	WREG32(SPI_CONFIG_CNTL, GPR_WRITE_PRIORITY(0));
   2182	WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(0));
   2183
   2184	tmp = RREG32(SQ_MS_FIFO_SIZES);
   2185	if (((rdev->family) == CHIP_RV610) ||
   2186	    ((rdev->family) == CHIP_RV620) ||
   2187	    ((rdev->family) == CHIP_RS780) ||
   2188	    ((rdev->family) == CHIP_RS880)) {
   2189		tmp = (CACHE_FIFO_SIZE(0xa) |
   2190		       FETCH_FIFO_HIWATER(0xa) |
   2191		       DONE_FIFO_HIWATER(0xe0) |
   2192		       ALU_UPDATE_FIFO_HIWATER(0x8));
   2193	} else if (((rdev->family) == CHIP_R600) ||
   2194		   ((rdev->family) == CHIP_RV630)) {
   2195		tmp &= ~DONE_FIFO_HIWATER(0xff);
   2196		tmp |= DONE_FIFO_HIWATER(0x4);
   2197	}
   2198	WREG32(SQ_MS_FIFO_SIZES, tmp);
   2199
   2200	/* SQ_CONFIG, SQ_GPR_RESOURCE_MGMT, SQ_THREAD_RESOURCE_MGMT, SQ_STACK_RESOURCE_MGMT
   2201	 * should be adjusted as needed by the 2D/3D drivers.  This just sets default values
   2202	 */
   2203	sq_config = RREG32(SQ_CONFIG);
   2204	sq_config &= ~(PS_PRIO(3) |
   2205		       VS_PRIO(3) |
   2206		       GS_PRIO(3) |
   2207		       ES_PRIO(3));
   2208	sq_config |= (DX9_CONSTS |
   2209		      VC_ENABLE |
   2210		      PS_PRIO(0) |
   2211		      VS_PRIO(1) |
   2212		      GS_PRIO(2) |
   2213		      ES_PRIO(3));
   2214
   2215	if ((rdev->family) == CHIP_R600) {
   2216		sq_gpr_resource_mgmt_1 = (NUM_PS_GPRS(124) |
   2217					  NUM_VS_GPRS(124) |
   2218					  NUM_CLAUSE_TEMP_GPRS(4));
   2219		sq_gpr_resource_mgmt_2 = (NUM_GS_GPRS(0) |
   2220					  NUM_ES_GPRS(0));
   2221		sq_thread_resource_mgmt = (NUM_PS_THREADS(136) |
   2222					   NUM_VS_THREADS(48) |
   2223					   NUM_GS_THREADS(4) |
   2224					   NUM_ES_THREADS(4));
   2225		sq_stack_resource_mgmt_1 = (NUM_PS_STACK_ENTRIES(128) |
   2226					    NUM_VS_STACK_ENTRIES(128));
   2227		sq_stack_resource_mgmt_2 = (NUM_GS_STACK_ENTRIES(0) |
   2228					    NUM_ES_STACK_ENTRIES(0));
   2229	} else if (((rdev->family) == CHIP_RV610) ||
   2230		   ((rdev->family) == CHIP_RV620) ||
   2231		   ((rdev->family) == CHIP_RS780) ||
   2232		   ((rdev->family) == CHIP_RS880)) {
   2233		/* no vertex cache */
   2234		sq_config &= ~VC_ENABLE;
   2235
   2236		sq_gpr_resource_mgmt_1 = (NUM_PS_GPRS(44) |
   2237					  NUM_VS_GPRS(44) |
   2238					  NUM_CLAUSE_TEMP_GPRS(2));
   2239		sq_gpr_resource_mgmt_2 = (NUM_GS_GPRS(17) |
   2240					  NUM_ES_GPRS(17));
   2241		sq_thread_resource_mgmt = (NUM_PS_THREADS(79) |
   2242					   NUM_VS_THREADS(78) |
   2243					   NUM_GS_THREADS(4) |
   2244					   NUM_ES_THREADS(31));
   2245		sq_stack_resource_mgmt_1 = (NUM_PS_STACK_ENTRIES(40) |
   2246					    NUM_VS_STACK_ENTRIES(40));
   2247		sq_stack_resource_mgmt_2 = (NUM_GS_STACK_ENTRIES(32) |
   2248					    NUM_ES_STACK_ENTRIES(16));
   2249	} else if (((rdev->family) == CHIP_RV630) ||
   2250		   ((rdev->family) == CHIP_RV635)) {
   2251		sq_gpr_resource_mgmt_1 = (NUM_PS_GPRS(44) |
   2252					  NUM_VS_GPRS(44) |
   2253					  NUM_CLAUSE_TEMP_GPRS(2));
   2254		sq_gpr_resource_mgmt_2 = (NUM_GS_GPRS(18) |
   2255					  NUM_ES_GPRS(18));
   2256		sq_thread_resource_mgmt = (NUM_PS_THREADS(79) |
   2257					   NUM_VS_THREADS(78) |
   2258					   NUM_GS_THREADS(4) |
   2259					   NUM_ES_THREADS(31));
   2260		sq_stack_resource_mgmt_1 = (NUM_PS_STACK_ENTRIES(40) |
   2261					    NUM_VS_STACK_ENTRIES(40));
   2262		sq_stack_resource_mgmt_2 = (NUM_GS_STACK_ENTRIES(32) |
   2263					    NUM_ES_STACK_ENTRIES(16));
   2264	} else if ((rdev->family) == CHIP_RV670) {
   2265		sq_gpr_resource_mgmt_1 = (NUM_PS_GPRS(44) |
   2266					  NUM_VS_GPRS(44) |
   2267					  NUM_CLAUSE_TEMP_GPRS(2));
   2268		sq_gpr_resource_mgmt_2 = (NUM_GS_GPRS(17) |
   2269					  NUM_ES_GPRS(17));
   2270		sq_thread_resource_mgmt = (NUM_PS_THREADS(79) |
   2271					   NUM_VS_THREADS(78) |
   2272					   NUM_GS_THREADS(4) |
   2273					   NUM_ES_THREADS(31));
   2274		sq_stack_resource_mgmt_1 = (NUM_PS_STACK_ENTRIES(64) |
   2275					    NUM_VS_STACK_ENTRIES(64));
   2276		sq_stack_resource_mgmt_2 = (NUM_GS_STACK_ENTRIES(64) |
   2277					    NUM_ES_STACK_ENTRIES(64));
   2278	}
   2279
   2280	WREG32(SQ_CONFIG, sq_config);
   2281	WREG32(SQ_GPR_RESOURCE_MGMT_1,  sq_gpr_resource_mgmt_1);
   2282	WREG32(SQ_GPR_RESOURCE_MGMT_2,  sq_gpr_resource_mgmt_2);
   2283	WREG32(SQ_THREAD_RESOURCE_MGMT, sq_thread_resource_mgmt);
   2284	WREG32(SQ_STACK_RESOURCE_MGMT_1, sq_stack_resource_mgmt_1);
   2285	WREG32(SQ_STACK_RESOURCE_MGMT_2, sq_stack_resource_mgmt_2);
   2286
   2287	if (((rdev->family) == CHIP_RV610) ||
   2288	    ((rdev->family) == CHIP_RV620) ||
   2289	    ((rdev->family) == CHIP_RS780) ||
   2290	    ((rdev->family) == CHIP_RS880)) {
   2291		WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(TC_ONLY));
   2292	} else {
   2293		WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC));
   2294	}
   2295
   2296	/* More default values. 2D/3D driver should adjust as needed */
   2297	WREG32(PA_SC_AA_SAMPLE_LOCS_2S, (S0_X(0xc) | S0_Y(0x4) |
   2298					 S1_X(0x4) | S1_Y(0xc)));
   2299	WREG32(PA_SC_AA_SAMPLE_LOCS_4S, (S0_X(0xe) | S0_Y(0xe) |
   2300					 S1_X(0x2) | S1_Y(0x2) |
   2301					 S2_X(0xa) | S2_Y(0x6) |
   2302					 S3_X(0x6) | S3_Y(0xa)));
   2303	WREG32(PA_SC_AA_SAMPLE_LOCS_8S_WD0, (S0_X(0xe) | S0_Y(0xb) |
   2304					     S1_X(0x4) | S1_Y(0xc) |
   2305					     S2_X(0x1) | S2_Y(0x6) |
   2306					     S3_X(0xa) | S3_Y(0xe)));
   2307	WREG32(PA_SC_AA_SAMPLE_LOCS_8S_WD1, (S4_X(0x6) | S4_Y(0x1) |
   2308					     S5_X(0x0) | S5_Y(0x0) |
   2309					     S6_X(0xb) | S6_Y(0x4) |
   2310					     S7_X(0x7) | S7_Y(0x8)));
   2311
   2312	WREG32(VGT_STRMOUT_EN, 0);
   2313	tmp = rdev->config.r600.max_pipes * 16;
   2314	switch (rdev->family) {
   2315	case CHIP_RV610:
   2316	case CHIP_RV620:
   2317	case CHIP_RS780:
   2318	case CHIP_RS880:
   2319		tmp += 32;
   2320		break;
   2321	case CHIP_RV670:
   2322		tmp += 128;
   2323		break;
   2324	default:
   2325		break;
   2326	}
   2327	if (tmp > 256) {
   2328		tmp = 256;
   2329	}
   2330	WREG32(VGT_ES_PER_GS, 128);
   2331	WREG32(VGT_GS_PER_ES, tmp);
   2332	WREG32(VGT_GS_PER_VS, 2);
   2333	WREG32(VGT_GS_VERTEX_REUSE, 16);
   2334
   2335	/* more default values. 2D/3D driver should adjust as needed */
   2336	WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
   2337	WREG32(VGT_STRMOUT_EN, 0);
   2338	WREG32(SX_MISC, 0);
   2339	WREG32(PA_SC_MODE_CNTL, 0);
   2340	WREG32(PA_SC_AA_CONFIG, 0);
   2341	WREG32(PA_SC_LINE_STIPPLE, 0);
   2342	WREG32(SPI_INPUT_Z, 0);
   2343	WREG32(SPI_PS_IN_CONTROL_0, NUM_INTERP(2));
   2344	WREG32(CB_COLOR7_FRAG, 0);
   2345
   2346	/* Clear render buffer base addresses */
   2347	WREG32(CB_COLOR0_BASE, 0);
   2348	WREG32(CB_COLOR1_BASE, 0);
   2349	WREG32(CB_COLOR2_BASE, 0);
   2350	WREG32(CB_COLOR3_BASE, 0);
   2351	WREG32(CB_COLOR4_BASE, 0);
   2352	WREG32(CB_COLOR5_BASE, 0);
   2353	WREG32(CB_COLOR6_BASE, 0);
   2354	WREG32(CB_COLOR7_BASE, 0);
   2355	WREG32(CB_COLOR7_FRAG, 0);
   2356
   2357	switch (rdev->family) {
   2358	case CHIP_RV610:
   2359	case CHIP_RV620:
   2360	case CHIP_RS780:
   2361	case CHIP_RS880:
   2362		tmp = TC_L2_SIZE(8);
   2363		break;
   2364	case CHIP_RV630:
   2365	case CHIP_RV635:
   2366		tmp = TC_L2_SIZE(4);
   2367		break;
   2368	case CHIP_R600:
   2369		tmp = TC_L2_SIZE(0) | L2_DISABLE_LATE_HIT;
   2370		break;
   2371	default:
   2372		tmp = TC_L2_SIZE(0);
   2373		break;
   2374	}
   2375	WREG32(TC_CNTL, tmp);
   2376
   2377	tmp = RREG32(HDP_HOST_PATH_CNTL);
   2378	WREG32(HDP_HOST_PATH_CNTL, tmp);
   2379
   2380	tmp = RREG32(ARB_POP);
   2381	tmp |= ENABLE_TC128;
   2382	WREG32(ARB_POP, tmp);
   2383
   2384	WREG32(PA_SC_MULTI_CHIP_CNTL, 0);
   2385	WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |
   2386			       NUM_CLIP_SEQ(3)));
   2387	WREG32(PA_SC_ENHANCE, FORCE_EOV_MAX_CLK_CNT(4095));
   2388	WREG32(VC_ENHANCE, 0);
   2389}
   2390
   2391
   2392/*
   2393 * Indirect registers accessor
   2394 */
   2395u32 r600_pciep_rreg(struct radeon_device *rdev, u32 reg)
   2396{
   2397	unsigned long flags;
   2398	u32 r;
   2399
   2400	spin_lock_irqsave(&rdev->pciep_idx_lock, flags);
   2401	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
   2402	(void)RREG32(PCIE_PORT_INDEX);
   2403	r = RREG32(PCIE_PORT_DATA);
   2404	spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags);
   2405	return r;
   2406}
   2407
   2408void r600_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v)
   2409{
   2410	unsigned long flags;
   2411
   2412	spin_lock_irqsave(&rdev->pciep_idx_lock, flags);
   2413	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
   2414	(void)RREG32(PCIE_PORT_INDEX);
   2415	WREG32(PCIE_PORT_DATA, (v));
   2416	(void)RREG32(PCIE_PORT_DATA);
   2417	spin_unlock_irqrestore(&rdev->pciep_idx_lock, flags);
   2418}
   2419
   2420/*
   2421 * CP & Ring
   2422 */
   2423void r600_cp_stop(struct radeon_device *rdev)
   2424{
   2425	if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
   2426		radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
   2427	WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1));
   2428	WREG32(SCRATCH_UMSK, 0);
   2429	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
   2430}
   2431
   2432int r600_init_microcode(struct radeon_device *rdev)
   2433{
   2434	const char *chip_name;
   2435	const char *rlc_chip_name;
   2436	const char *smc_chip_name = "RV770";
   2437	size_t pfp_req_size, me_req_size, rlc_req_size, smc_req_size = 0;
   2438	char fw_name[30];
   2439	int err;
   2440
   2441	DRM_DEBUG("\n");
   2442
   2443	switch (rdev->family) {
   2444	case CHIP_R600:
   2445		chip_name = "R600";
   2446		rlc_chip_name = "R600";
   2447		break;
   2448	case CHIP_RV610:
   2449		chip_name = "RV610";
   2450		rlc_chip_name = "R600";
   2451		break;
   2452	case CHIP_RV630:
   2453		chip_name = "RV630";
   2454		rlc_chip_name = "R600";
   2455		break;
   2456	case CHIP_RV620:
   2457		chip_name = "RV620";
   2458		rlc_chip_name = "R600";
   2459		break;
   2460	case CHIP_RV635:
   2461		chip_name = "RV635";
   2462		rlc_chip_name = "R600";
   2463		break;
   2464	case CHIP_RV670:
   2465		chip_name = "RV670";
   2466		rlc_chip_name = "R600";
   2467		break;
   2468	case CHIP_RS780:
   2469	case CHIP_RS880:
   2470		chip_name = "RS780";
   2471		rlc_chip_name = "R600";
   2472		break;
   2473	case CHIP_RV770:
   2474		chip_name = "RV770";
   2475		rlc_chip_name = "R700";
   2476		smc_chip_name = "RV770";
   2477		smc_req_size = ALIGN(RV770_SMC_UCODE_SIZE, 4);
   2478		break;
   2479	case CHIP_RV730:
   2480		chip_name = "RV730";
   2481		rlc_chip_name = "R700";
   2482		smc_chip_name = "RV730";
   2483		smc_req_size = ALIGN(RV730_SMC_UCODE_SIZE, 4);
   2484		break;
   2485	case CHIP_RV710:
   2486		chip_name = "RV710";
   2487		rlc_chip_name = "R700";
   2488		smc_chip_name = "RV710";
   2489		smc_req_size = ALIGN(RV710_SMC_UCODE_SIZE, 4);
   2490		break;
   2491	case CHIP_RV740:
   2492		chip_name = "RV730";
   2493		rlc_chip_name = "R700";
   2494		smc_chip_name = "RV740";
   2495		smc_req_size = ALIGN(RV740_SMC_UCODE_SIZE, 4);
   2496		break;
   2497	case CHIP_CEDAR:
   2498		chip_name = "CEDAR";
   2499		rlc_chip_name = "CEDAR";
   2500		smc_chip_name = "CEDAR";
   2501		smc_req_size = ALIGN(CEDAR_SMC_UCODE_SIZE, 4);
   2502		break;
   2503	case CHIP_REDWOOD:
   2504		chip_name = "REDWOOD";
   2505		rlc_chip_name = "REDWOOD";
   2506		smc_chip_name = "REDWOOD";
   2507		smc_req_size = ALIGN(REDWOOD_SMC_UCODE_SIZE, 4);
   2508		break;
   2509	case CHIP_JUNIPER:
   2510		chip_name = "JUNIPER";
   2511		rlc_chip_name = "JUNIPER";
   2512		smc_chip_name = "JUNIPER";
   2513		smc_req_size = ALIGN(JUNIPER_SMC_UCODE_SIZE, 4);
   2514		break;
   2515	case CHIP_CYPRESS:
   2516	case CHIP_HEMLOCK:
   2517		chip_name = "CYPRESS";
   2518		rlc_chip_name = "CYPRESS";
   2519		smc_chip_name = "CYPRESS";
   2520		smc_req_size = ALIGN(CYPRESS_SMC_UCODE_SIZE, 4);
   2521		break;
   2522	case CHIP_PALM:
   2523		chip_name = "PALM";
   2524		rlc_chip_name = "SUMO";
   2525		break;
   2526	case CHIP_SUMO:
   2527		chip_name = "SUMO";
   2528		rlc_chip_name = "SUMO";
   2529		break;
   2530	case CHIP_SUMO2:
   2531		chip_name = "SUMO2";
   2532		rlc_chip_name = "SUMO";
   2533		break;
   2534	default: BUG();
   2535	}
   2536
   2537	if (rdev->family >= CHIP_CEDAR) {
   2538		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
   2539		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
   2540		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
   2541	} else if (rdev->family >= CHIP_RV770) {
   2542		pfp_req_size = R700_PFP_UCODE_SIZE * 4;
   2543		me_req_size = R700_PM4_UCODE_SIZE * 4;
   2544		rlc_req_size = R700_RLC_UCODE_SIZE * 4;
   2545	} else {
   2546		pfp_req_size = R600_PFP_UCODE_SIZE * 4;
   2547		me_req_size = R600_PM4_UCODE_SIZE * 12;
   2548		rlc_req_size = R600_RLC_UCODE_SIZE * 4;
   2549	}
   2550
   2551	DRM_INFO("Loading %s Microcode\n", chip_name);
   2552
   2553	snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
   2554	err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
   2555	if (err)
   2556		goto out;
   2557	if (rdev->pfp_fw->size != pfp_req_size) {
   2558		pr_err("r600_cp: Bogus length %zu in firmware \"%s\"\n",
   2559		       rdev->pfp_fw->size, fw_name);
   2560		err = -EINVAL;
   2561		goto out;
   2562	}
   2563
   2564	snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
   2565	err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
   2566	if (err)
   2567		goto out;
   2568	if (rdev->me_fw->size != me_req_size) {
   2569		pr_err("r600_cp: Bogus length %zu in firmware \"%s\"\n",
   2570		       rdev->me_fw->size, fw_name);
   2571		err = -EINVAL;
   2572		goto out;
   2573	}
   2574
   2575	snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
   2576	err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
   2577	if (err)
   2578		goto out;
   2579	if (rdev->rlc_fw->size != rlc_req_size) {
   2580		pr_err("r600_rlc: Bogus length %zu in firmware \"%s\"\n",
   2581		       rdev->rlc_fw->size, fw_name);
   2582		err = -EINVAL;
   2583		goto out;
   2584	}
   2585
   2586	if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_HEMLOCK)) {
   2587		snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", smc_chip_name);
   2588		err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
   2589		if (err) {
   2590			pr_err("smc: error loading firmware \"%s\"\n", fw_name);
   2591			release_firmware(rdev->smc_fw);
   2592			rdev->smc_fw = NULL;
   2593			err = 0;
   2594		} else if (rdev->smc_fw->size != smc_req_size) {
   2595			pr_err("smc: Bogus length %zu in firmware \"%s\"\n",
   2596			       rdev->smc_fw->size, fw_name);
   2597			err = -EINVAL;
   2598		}
   2599	}
   2600
   2601out:
   2602	if (err) {
   2603		if (err != -EINVAL)
   2604			pr_err("r600_cp: Failed to load firmware \"%s\"\n",
   2605			       fw_name);
   2606		release_firmware(rdev->pfp_fw);
   2607		rdev->pfp_fw = NULL;
   2608		release_firmware(rdev->me_fw);
   2609		rdev->me_fw = NULL;
   2610		release_firmware(rdev->rlc_fw);
   2611		rdev->rlc_fw = NULL;
   2612		release_firmware(rdev->smc_fw);
   2613		rdev->smc_fw = NULL;
   2614	}
   2615	return err;
   2616}
   2617
   2618u32 r600_gfx_get_rptr(struct radeon_device *rdev,
   2619		      struct radeon_ring *ring)
   2620{
   2621	u32 rptr;
   2622
   2623	if (rdev->wb.enabled)
   2624		rptr = rdev->wb.wb[ring->rptr_offs/4];
   2625	else
   2626		rptr = RREG32(R600_CP_RB_RPTR);
   2627
   2628	return rptr;
   2629}
   2630
   2631u32 r600_gfx_get_wptr(struct radeon_device *rdev,
   2632		      struct radeon_ring *ring)
   2633{
   2634	return RREG32(R600_CP_RB_WPTR);
   2635}
   2636
   2637void r600_gfx_set_wptr(struct radeon_device *rdev,
   2638		       struct radeon_ring *ring)
   2639{
   2640	WREG32(R600_CP_RB_WPTR, ring->wptr);
   2641	(void)RREG32(R600_CP_RB_WPTR);
   2642}
   2643
   2644static int r600_cp_load_microcode(struct radeon_device *rdev)
   2645{
   2646	const __be32 *fw_data;
   2647	int i;
   2648
   2649	if (!rdev->me_fw || !rdev->pfp_fw)
   2650		return -EINVAL;
   2651
   2652	r600_cp_stop(rdev);
   2653
   2654	WREG32(CP_RB_CNTL,
   2655#ifdef __BIG_ENDIAN
   2656	       BUF_SWAP_32BIT |
   2657#endif
   2658	       RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
   2659
   2660	/* Reset cp */
   2661	WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
   2662	RREG32(GRBM_SOFT_RESET);
   2663	mdelay(15);
   2664	WREG32(GRBM_SOFT_RESET, 0);
   2665
   2666	WREG32(CP_ME_RAM_WADDR, 0);
   2667
   2668	fw_data = (const __be32 *)rdev->me_fw->data;
   2669	WREG32(CP_ME_RAM_WADDR, 0);
   2670	for (i = 0; i < R600_PM4_UCODE_SIZE * 3; i++)
   2671		WREG32(CP_ME_RAM_DATA,
   2672		       be32_to_cpup(fw_data++));
   2673
   2674	fw_data = (const __be32 *)rdev->pfp_fw->data;
   2675	WREG32(CP_PFP_UCODE_ADDR, 0);
   2676	for (i = 0; i < R600_PFP_UCODE_SIZE; i++)
   2677		WREG32(CP_PFP_UCODE_DATA,
   2678		       be32_to_cpup(fw_data++));
   2679
   2680	WREG32(CP_PFP_UCODE_ADDR, 0);
   2681	WREG32(CP_ME_RAM_WADDR, 0);
   2682	WREG32(CP_ME_RAM_RADDR, 0);
   2683	return 0;
   2684}
   2685
   2686int r600_cp_start(struct radeon_device *rdev)
   2687{
   2688	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
   2689	int r;
   2690	uint32_t cp_me;
   2691
   2692	r = radeon_ring_lock(rdev, ring, 7);
   2693	if (r) {
   2694		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
   2695		return r;
   2696	}
   2697	radeon_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
   2698	radeon_ring_write(ring, 0x1);
   2699	if (rdev->family >= CHIP_RV770) {
   2700		radeon_ring_write(ring, 0x0);
   2701		radeon_ring_write(ring, rdev->config.rv770.max_hw_contexts - 1);
   2702	} else {
   2703		radeon_ring_write(ring, 0x3);
   2704		radeon_ring_write(ring, rdev->config.r600.max_hw_contexts - 1);
   2705	}
   2706	radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
   2707	radeon_ring_write(ring, 0);
   2708	radeon_ring_write(ring, 0);
   2709	radeon_ring_unlock_commit(rdev, ring, false);
   2710
   2711	cp_me = 0xff;
   2712	WREG32(R_0086D8_CP_ME_CNTL, cp_me);
   2713	return 0;
   2714}
   2715
   2716int r600_cp_resume(struct radeon_device *rdev)
   2717{
   2718	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
   2719	u32 tmp;
   2720	u32 rb_bufsz;
   2721	int r;
   2722
   2723	/* Reset cp */
   2724	WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
   2725	RREG32(GRBM_SOFT_RESET);
   2726	mdelay(15);
   2727	WREG32(GRBM_SOFT_RESET, 0);
   2728
   2729	/* Set ring buffer size */
   2730	rb_bufsz = order_base_2(ring->ring_size / 8);
   2731	tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
   2732#ifdef __BIG_ENDIAN
   2733	tmp |= BUF_SWAP_32BIT;
   2734#endif
   2735	WREG32(CP_RB_CNTL, tmp);
   2736	WREG32(CP_SEM_WAIT_TIMER, 0x0);
   2737
   2738	/* Set the write pointer delay */
   2739	WREG32(CP_RB_WPTR_DELAY, 0);
   2740
   2741	/* Initialize the ring buffer's read and write pointers */
   2742	WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA);
   2743	WREG32(CP_RB_RPTR_WR, 0);
   2744	ring->wptr = 0;
   2745	WREG32(CP_RB_WPTR, ring->wptr);
   2746
   2747	/* set the wb address whether it's enabled or not */
   2748	WREG32(CP_RB_RPTR_ADDR,
   2749	       ((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC));
   2750	WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
   2751	WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
   2752
   2753	if (rdev->wb.enabled)
   2754		WREG32(SCRATCH_UMSK, 0xff);
   2755	else {
   2756		tmp |= RB_NO_UPDATE;
   2757		WREG32(SCRATCH_UMSK, 0);
   2758	}
   2759
   2760	mdelay(1);
   2761	WREG32(CP_RB_CNTL, tmp);
   2762
   2763	WREG32(CP_RB_BASE, ring->gpu_addr >> 8);
   2764	WREG32(CP_DEBUG, (1 << 27) | (1 << 28));
   2765
   2766	r600_cp_start(rdev);
   2767	ring->ready = true;
   2768	r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring);
   2769	if (r) {
   2770		ring->ready = false;
   2771		return r;
   2772	}
   2773
   2774	if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
   2775		radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
   2776
   2777	return 0;
   2778}
   2779
   2780void r600_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsigned ring_size)
   2781{
   2782	u32 rb_bufsz;
   2783	int r;
   2784
   2785	/* Align ring size */
   2786	rb_bufsz = order_base_2(ring_size / 8);
   2787	ring_size = (1 << (rb_bufsz + 1)) * 4;
   2788	ring->ring_size = ring_size;
   2789	ring->align_mask = 16 - 1;
   2790
   2791	if (radeon_ring_supports_scratch_reg(rdev, ring)) {
   2792		r = radeon_scratch_get(rdev, &ring->rptr_save_reg);
   2793		if (r) {
   2794			DRM_ERROR("failed to get scratch reg for rptr save (%d).\n", r);
   2795			ring->rptr_save_reg = 0;
   2796		}
   2797	}
   2798}
   2799
   2800void r600_cp_fini(struct radeon_device *rdev)
   2801{
   2802	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
   2803	r600_cp_stop(rdev);
   2804	radeon_ring_fini(rdev, ring);
   2805	radeon_scratch_free(rdev, ring->rptr_save_reg);
   2806}
   2807
   2808/*
   2809 * GPU scratch registers helpers function.
   2810 */
   2811void r600_scratch_init(struct radeon_device *rdev)
   2812{
   2813	int i;
   2814
   2815	rdev->scratch.num_reg = 7;
   2816	rdev->scratch.reg_base = SCRATCH_REG0;
   2817	for (i = 0; i < rdev->scratch.num_reg; i++) {
   2818		rdev->scratch.free[i] = true;
   2819		rdev->scratch.reg[i] = rdev->scratch.reg_base + (i * 4);
   2820	}
   2821}
   2822
   2823int r600_ring_test(struct radeon_device *rdev, struct radeon_ring *ring)
   2824{
   2825	uint32_t scratch;
   2826	uint32_t tmp = 0;
   2827	unsigned i;
   2828	int r;
   2829
   2830	r = radeon_scratch_get(rdev, &scratch);
   2831	if (r) {
   2832		DRM_ERROR("radeon: cp failed to get scratch reg (%d).\n", r);
   2833		return r;
   2834	}
   2835	WREG32(scratch, 0xCAFEDEAD);
   2836	r = radeon_ring_lock(rdev, ring, 3);
   2837	if (r) {
   2838		DRM_ERROR("radeon: cp failed to lock ring %d (%d).\n", ring->idx, r);
   2839		radeon_scratch_free(rdev, scratch);
   2840		return r;
   2841	}
   2842	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
   2843	radeon_ring_write(ring, ((scratch - PACKET3_SET_CONFIG_REG_OFFSET) >> 2));
   2844	radeon_ring_write(ring, 0xDEADBEEF);
   2845	radeon_ring_unlock_commit(rdev, ring, false);
   2846	for (i = 0; i < rdev->usec_timeout; i++) {
   2847		tmp = RREG32(scratch);
   2848		if (tmp == 0xDEADBEEF)
   2849			break;
   2850		udelay(1);
   2851	}
   2852	if (i < rdev->usec_timeout) {
   2853		DRM_INFO("ring test on %d succeeded in %d usecs\n", ring->idx, i);
   2854	} else {
   2855		DRM_ERROR("radeon: ring %d test failed (scratch(0x%04X)=0x%08X)\n",
   2856			  ring->idx, scratch, tmp);
   2857		r = -EINVAL;
   2858	}
   2859	radeon_scratch_free(rdev, scratch);
   2860	return r;
   2861}
   2862
   2863/*
   2864 * CP fences/semaphores
   2865 */
   2866
   2867void r600_fence_ring_emit(struct radeon_device *rdev,
   2868			  struct radeon_fence *fence)
   2869{
   2870	struct radeon_ring *ring = &rdev->ring[fence->ring];
   2871	u32 cp_coher_cntl = PACKET3_TC_ACTION_ENA | PACKET3_VC_ACTION_ENA |
   2872		PACKET3_SH_ACTION_ENA;
   2873
   2874	if (rdev->family >= CHIP_RV770)
   2875		cp_coher_cntl |= PACKET3_FULL_CACHE_ENA;
   2876
   2877	if (rdev->wb.use_event) {
   2878		u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
   2879		/* flush read cache over gart */
   2880		radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
   2881		radeon_ring_write(ring, cp_coher_cntl);
   2882		radeon_ring_write(ring, 0xFFFFFFFF);
   2883		radeon_ring_write(ring, 0);
   2884		radeon_ring_write(ring, 10); /* poll interval */
   2885		/* EVENT_WRITE_EOP - flush caches, send int */
   2886		radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
   2887		radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
   2888		radeon_ring_write(ring, lower_32_bits(addr));
   2889		radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
   2890		radeon_ring_write(ring, fence->seq);
   2891		radeon_ring_write(ring, 0);
   2892	} else {
   2893		/* flush read cache over gart */
   2894		radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
   2895		radeon_ring_write(ring, cp_coher_cntl);
   2896		radeon_ring_write(ring, 0xFFFFFFFF);
   2897		radeon_ring_write(ring, 0);
   2898		radeon_ring_write(ring, 10); /* poll interval */
   2899		radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE, 0));
   2900		radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT) | EVENT_INDEX(0));
   2901		/* wait for 3D idle clean */
   2902		radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
   2903		radeon_ring_write(ring, (WAIT_UNTIL - PACKET3_SET_CONFIG_REG_OFFSET) >> 2);
   2904		radeon_ring_write(ring, WAIT_3D_IDLE_bit | WAIT_3D_IDLECLEAN_bit);
   2905		/* Emit fence sequence & fire IRQ */
   2906		radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
   2907		radeon_ring_write(ring, ((rdev->fence_drv[fence->ring].scratch_reg - PACKET3_SET_CONFIG_REG_OFFSET) >> 2));
   2908		radeon_ring_write(ring, fence->seq);
   2909		/* CP_INTERRUPT packet 3 no longer exists, use packet 0 */
   2910		radeon_ring_write(ring, PACKET0(CP_INT_STATUS, 0));
   2911		radeon_ring_write(ring, RB_INT_STAT);
   2912	}
   2913}
   2914
   2915/**
   2916 * r600_semaphore_ring_emit - emit a semaphore on the CP ring
   2917 *
   2918 * @rdev: radeon_device pointer
   2919 * @ring: radeon ring buffer object
   2920 * @semaphore: radeon semaphore object
   2921 * @emit_wait: Is this a sempahore wait?
   2922 *
   2923 * Emits a semaphore signal/wait packet to the CP ring and prevents the PFP
   2924 * from running ahead of semaphore waits.
   2925 */
   2926bool r600_semaphore_ring_emit(struct radeon_device *rdev,
   2927			      struct radeon_ring *ring,
   2928			      struct radeon_semaphore *semaphore,
   2929			      bool emit_wait)
   2930{
   2931	uint64_t addr = semaphore->gpu_addr;
   2932	unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL;
   2933
   2934	if (rdev->family < CHIP_CAYMAN)
   2935		sel |= PACKET3_SEM_WAIT_ON_SIGNAL;
   2936
   2937	radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1));
   2938	radeon_ring_write(ring, lower_32_bits(addr));
   2939	radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel);
   2940
   2941	/* PFP_SYNC_ME packet only exists on 7xx+, only enable it on eg+ */
   2942	if (emit_wait && (rdev->family >= CHIP_CEDAR)) {
   2943		/* Prevent the PFP from running ahead of the semaphore wait */
   2944		radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
   2945		radeon_ring_write(ring, 0x0);
   2946	}
   2947
   2948	return true;
   2949}
   2950
   2951/**
   2952 * r600_copy_cpdma - copy pages using the CP DMA engine
   2953 *
   2954 * @rdev: radeon_device pointer
   2955 * @src_offset: src GPU address
   2956 * @dst_offset: dst GPU address
   2957 * @num_gpu_pages: number of GPU pages to xfer
   2958 * @resv: DMA reservation object to manage fences
   2959 *
   2960 * Copy GPU paging using the CP DMA engine (r6xx+).
   2961 * Used by the radeon ttm implementation to move pages if
   2962 * registered as the asic copy callback.
   2963 */
   2964struct radeon_fence *r600_copy_cpdma(struct radeon_device *rdev,
   2965				     uint64_t src_offset, uint64_t dst_offset,
   2966				     unsigned num_gpu_pages,
   2967				     struct dma_resv *resv)
   2968{
   2969	struct radeon_fence *fence;
   2970	struct radeon_sync sync;
   2971	int ring_index = rdev->asic->copy.blit_ring_index;
   2972	struct radeon_ring *ring = &rdev->ring[ring_index];
   2973	u32 size_in_bytes, cur_size_in_bytes, tmp;
   2974	int i, num_loops;
   2975	int r = 0;
   2976
   2977	radeon_sync_create(&sync);
   2978
   2979	size_in_bytes = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT);
   2980	num_loops = DIV_ROUND_UP(size_in_bytes, 0x1fffff);
   2981	r = radeon_ring_lock(rdev, ring, num_loops * 6 + 24);
   2982	if (r) {
   2983		DRM_ERROR("radeon: moving bo (%d).\n", r);
   2984		radeon_sync_free(rdev, &sync, NULL);
   2985		return ERR_PTR(r);
   2986	}
   2987
   2988	radeon_sync_resv(rdev, &sync, resv, false);
   2989	radeon_sync_rings(rdev, &sync, ring->idx);
   2990
   2991	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
   2992	radeon_ring_write(ring, (WAIT_UNTIL - PACKET3_SET_CONFIG_REG_OFFSET) >> 2);
   2993	radeon_ring_write(ring, WAIT_3D_IDLE_bit);
   2994	for (i = 0; i < num_loops; i++) {
   2995		cur_size_in_bytes = size_in_bytes;
   2996		if (cur_size_in_bytes > 0x1fffff)
   2997			cur_size_in_bytes = 0x1fffff;
   2998		size_in_bytes -= cur_size_in_bytes;
   2999		tmp = upper_32_bits(src_offset) & 0xff;
   3000		if (size_in_bytes == 0)
   3001			tmp |= PACKET3_CP_DMA_CP_SYNC;
   3002		radeon_ring_write(ring, PACKET3(PACKET3_CP_DMA, 4));
   3003		radeon_ring_write(ring, lower_32_bits(src_offset));
   3004		radeon_ring_write(ring, tmp);
   3005		radeon_ring_write(ring, lower_32_bits(dst_offset));
   3006		radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
   3007		radeon_ring_write(ring, cur_size_in_bytes);
   3008		src_offset += cur_size_in_bytes;
   3009		dst_offset += cur_size_in_bytes;
   3010	}
   3011	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
   3012	radeon_ring_write(ring, (WAIT_UNTIL - PACKET3_SET_CONFIG_REG_OFFSET) >> 2);
   3013	radeon_ring_write(ring, WAIT_CP_DMA_IDLE_bit);
   3014
   3015	r = radeon_fence_emit(rdev, &fence, ring->idx);
   3016	if (r) {
   3017		radeon_ring_unlock_undo(rdev, ring);
   3018		radeon_sync_free(rdev, &sync, NULL);
   3019		return ERR_PTR(r);
   3020	}
   3021
   3022	radeon_ring_unlock_commit(rdev, ring, false);
   3023	radeon_sync_free(rdev, &sync, fence);
   3024
   3025	return fence;
   3026}
   3027
   3028int r600_set_surface_reg(struct radeon_device *rdev, int reg,
   3029			 uint32_t tiling_flags, uint32_t pitch,
   3030			 uint32_t offset, uint32_t obj_size)
   3031{
   3032	/* FIXME: implement */
   3033	return 0;
   3034}
   3035
   3036void r600_clear_surface_reg(struct radeon_device *rdev, int reg)
   3037{
   3038	/* FIXME: implement */
   3039}
   3040
   3041static void r600_uvd_init(struct radeon_device *rdev)
   3042{
   3043	int r;
   3044
   3045	if (!rdev->has_uvd)
   3046		return;
   3047
   3048	r = radeon_uvd_init(rdev);
   3049	if (r) {
   3050		dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
   3051		/*
   3052		 * At this point rdev->uvd.vcpu_bo is NULL which trickles down
   3053		 * to early fails uvd_v1_0_resume() and thus nothing happens
   3054		 * there. So it is pointless to try to go through that code
   3055		 * hence why we disable uvd here.
   3056		 */
   3057		rdev->has_uvd = false;
   3058		return;
   3059	}
   3060	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
   3061	r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
   3062}
   3063
   3064static void r600_uvd_start(struct radeon_device *rdev)
   3065{
   3066	int r;
   3067
   3068	if (!rdev->has_uvd)
   3069		return;
   3070
   3071	r = uvd_v1_0_resume(rdev);
   3072	if (r) {
   3073		dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
   3074		goto error;
   3075	}
   3076	r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
   3077	if (r) {
   3078		dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
   3079		goto error;
   3080	}
   3081	return;
   3082
   3083error:
   3084	rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
   3085}
   3086
   3087static void r600_uvd_resume(struct radeon_device *rdev)
   3088{
   3089	struct radeon_ring *ring;
   3090	int r;
   3091
   3092	if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
   3093		return;
   3094
   3095	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
   3096	r = radeon_ring_init(rdev, ring, ring->ring_size, 0, PACKET0(UVD_NO_OP, 0));
   3097	if (r) {
   3098		dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
   3099		return;
   3100	}
   3101	r = uvd_v1_0_init(rdev);
   3102	if (r) {
   3103		dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
   3104		return;
   3105	}
   3106}
   3107
   3108static int r600_startup(struct radeon_device *rdev)
   3109{
   3110	struct radeon_ring *ring;
   3111	int r;
   3112
   3113	/* enable pcie gen2 link */
   3114	r600_pcie_gen2_enable(rdev);
   3115
   3116	/* scratch needs to be initialized before MC */
   3117	r = r600_vram_scratch_init(rdev);
   3118	if (r)
   3119		return r;
   3120
   3121	r600_mc_program(rdev);
   3122
   3123	if (rdev->flags & RADEON_IS_AGP) {
   3124		r600_agp_enable(rdev);
   3125	} else {
   3126		r = r600_pcie_gart_enable(rdev);
   3127		if (r)
   3128			return r;
   3129	}
   3130	r600_gpu_init(rdev);
   3131
   3132	/* allocate wb buffer */
   3133	r = radeon_wb_init(rdev);
   3134	if (r)
   3135		return r;
   3136
   3137	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
   3138	if (r) {
   3139		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
   3140		return r;
   3141	}
   3142
   3143	r600_uvd_start(rdev);
   3144
   3145	/* Enable IRQ */
   3146	if (!rdev->irq.installed) {
   3147		r = radeon_irq_kms_init(rdev);
   3148		if (r)
   3149			return r;
   3150	}
   3151
   3152	r = r600_irq_init(rdev);
   3153	if (r) {
   3154		DRM_ERROR("radeon: IH init failed (%d).\n", r);
   3155		radeon_irq_kms_fini(rdev);
   3156		return r;
   3157	}
   3158	r600_irq_set(rdev);
   3159
   3160	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
   3161	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
   3162			     RADEON_CP_PACKET2);
   3163	if (r)
   3164		return r;
   3165
   3166	r = r600_cp_load_microcode(rdev);
   3167	if (r)
   3168		return r;
   3169	r = r600_cp_resume(rdev);
   3170	if (r)
   3171		return r;
   3172
   3173	r600_uvd_resume(rdev);
   3174
   3175	r = radeon_ib_pool_init(rdev);
   3176	if (r) {
   3177		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
   3178		return r;
   3179	}
   3180
   3181	r = radeon_audio_init(rdev);
   3182	if (r) {
   3183		DRM_ERROR("radeon: audio init failed\n");
   3184		return r;
   3185	}
   3186
   3187	return 0;
   3188}
   3189
   3190void r600_vga_set_state(struct radeon_device *rdev, bool state)
   3191{
   3192	uint32_t temp;
   3193
   3194	temp = RREG32(CONFIG_CNTL);
   3195	if (!state) {
   3196		temp &= ~(1<<0);
   3197		temp |= (1<<1);
   3198	} else {
   3199		temp &= ~(1<<1);
   3200	}
   3201	WREG32(CONFIG_CNTL, temp);
   3202}
   3203
   3204int r600_resume(struct radeon_device *rdev)
   3205{
   3206	int r;
   3207
   3208	/* Do not reset GPU before posting, on r600 hw unlike on r500 hw,
   3209	 * posting will perform necessary task to bring back GPU into good
   3210	 * shape.
   3211	 */
   3212	/* post card */
   3213	atom_asic_init(rdev->mode_info.atom_context);
   3214
   3215	if (rdev->pm.pm_method == PM_METHOD_DPM)
   3216		radeon_pm_resume(rdev);
   3217
   3218	rdev->accel_working = true;
   3219	r = r600_startup(rdev);
   3220	if (r) {
   3221		DRM_ERROR("r600 startup failed on resume\n");
   3222		rdev->accel_working = false;
   3223		return r;
   3224	}
   3225
   3226	return r;
   3227}
   3228
   3229int r600_suspend(struct radeon_device *rdev)
   3230{
   3231	radeon_pm_suspend(rdev);
   3232	radeon_audio_fini(rdev);
   3233	r600_cp_stop(rdev);
   3234	if (rdev->has_uvd) {
   3235		radeon_uvd_suspend(rdev);
   3236		uvd_v1_0_fini(rdev);
   3237	}
   3238	r600_irq_suspend(rdev);
   3239	radeon_wb_disable(rdev);
   3240	r600_pcie_gart_disable(rdev);
   3241
   3242	return 0;
   3243}
   3244
   3245/* Plan is to move initialization in that function and use
   3246 * helper function so that radeon_device_init pretty much
   3247 * do nothing more than calling asic specific function. This
   3248 * should also allow to remove a bunch of callback function
   3249 * like vram_info.
   3250 */
   3251int r600_init(struct radeon_device *rdev)
   3252{
   3253	int r;
   3254
   3255	r600_debugfs_mc_info_init(rdev);
   3256	/* Read BIOS */
   3257	if (!radeon_get_bios(rdev)) {
   3258		if (ASIC_IS_AVIVO(rdev))
   3259			return -EINVAL;
   3260	}
   3261	/* Must be an ATOMBIOS */
   3262	if (!rdev->is_atom_bios) {
   3263		dev_err(rdev->dev, "Expecting atombios for R600 GPU\n");
   3264		return -EINVAL;
   3265	}
   3266	r = radeon_atombios_init(rdev);
   3267	if (r)
   3268		return r;
   3269	/* Post card if necessary */
   3270	if (!radeon_card_posted(rdev)) {
   3271		if (!rdev->bios) {
   3272			dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
   3273			return -EINVAL;
   3274		}
   3275		DRM_INFO("GPU not posted. posting now...\n");
   3276		atom_asic_init(rdev->mode_info.atom_context);
   3277	}
   3278	/* Initialize scratch registers */
   3279	r600_scratch_init(rdev);
   3280	/* Initialize surface registers */
   3281	radeon_surface_init(rdev);
   3282	/* Initialize clocks */
   3283	radeon_get_clock_info(rdev->ddev);
   3284	/* Fence driver */
   3285	radeon_fence_driver_init(rdev);
   3286	if (rdev->flags & RADEON_IS_AGP) {
   3287		r = radeon_agp_init(rdev);
   3288		if (r)
   3289			radeon_agp_disable(rdev);
   3290	}
   3291	r = r600_mc_init(rdev);
   3292	if (r)
   3293		return r;
   3294	/* Memory manager */
   3295	r = radeon_bo_init(rdev);
   3296	if (r)
   3297		return r;
   3298
   3299	if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
   3300		r = r600_init_microcode(rdev);
   3301		if (r) {
   3302			DRM_ERROR("Failed to load firmware!\n");
   3303			return r;
   3304		}
   3305	}
   3306
   3307	/* Initialize power management */
   3308	radeon_pm_init(rdev);
   3309
   3310	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
   3311	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
   3312
   3313	r600_uvd_init(rdev);
   3314
   3315	rdev->ih.ring_obj = NULL;
   3316	r600_ih_ring_init(rdev, 64 * 1024);
   3317
   3318	r = r600_pcie_gart_init(rdev);
   3319	if (r)
   3320		return r;
   3321
   3322	rdev->accel_working = true;
   3323	r = r600_startup(rdev);
   3324	if (r) {
   3325		dev_err(rdev->dev, "disabling GPU acceleration\n");
   3326		r600_cp_fini(rdev);
   3327		r600_irq_fini(rdev);
   3328		radeon_wb_fini(rdev);
   3329		radeon_ib_pool_fini(rdev);
   3330		radeon_irq_kms_fini(rdev);
   3331		r600_pcie_gart_fini(rdev);
   3332		rdev->accel_working = false;
   3333	}
   3334
   3335	return 0;
   3336}
   3337
   3338void r600_fini(struct radeon_device *rdev)
   3339{
   3340	radeon_pm_fini(rdev);
   3341	radeon_audio_fini(rdev);
   3342	r600_cp_fini(rdev);
   3343	r600_irq_fini(rdev);
   3344	if (rdev->has_uvd) {
   3345		uvd_v1_0_fini(rdev);
   3346		radeon_uvd_fini(rdev);
   3347	}
   3348	radeon_wb_fini(rdev);
   3349	radeon_ib_pool_fini(rdev);
   3350	radeon_irq_kms_fini(rdev);
   3351	r600_pcie_gart_fini(rdev);
   3352	r600_vram_scratch_fini(rdev);
   3353	radeon_agp_fini(rdev);
   3354	radeon_gem_fini(rdev);
   3355	radeon_fence_driver_fini(rdev);
   3356	radeon_bo_fini(rdev);
   3357	radeon_atombios_fini(rdev);
   3358	kfree(rdev->bios);
   3359	rdev->bios = NULL;
   3360}
   3361
   3362
   3363/*
   3364 * CS stuff
   3365 */
   3366void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
   3367{
   3368	struct radeon_ring *ring = &rdev->ring[ib->ring];
   3369	u32 next_rptr;
   3370
   3371	if (ring->rptr_save_reg) {
   3372		next_rptr = ring->wptr + 3 + 4;
   3373		radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
   3374		radeon_ring_write(ring, ((ring->rptr_save_reg -
   3375					 PACKET3_SET_CONFIG_REG_OFFSET) >> 2));
   3376		radeon_ring_write(ring, next_rptr);
   3377	} else if (rdev->wb.enabled) {
   3378		next_rptr = ring->wptr + 5 + 4;
   3379		radeon_ring_write(ring, PACKET3(PACKET3_MEM_WRITE, 3));
   3380		radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
   3381		radeon_ring_write(ring, (upper_32_bits(ring->next_rptr_gpu_addr) & 0xff) | (1 << 18));
   3382		radeon_ring_write(ring, next_rptr);
   3383		radeon_ring_write(ring, 0);
   3384	}
   3385
   3386	radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
   3387	radeon_ring_write(ring,
   3388#ifdef __BIG_ENDIAN
   3389			  (2 << 0) |
   3390#endif
   3391			  (ib->gpu_addr & 0xFFFFFFFC));
   3392	radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF);
   3393	radeon_ring_write(ring, ib->length_dw);
   3394}
   3395
   3396int r600_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
   3397{
   3398	struct radeon_ib ib;
   3399	uint32_t scratch;
   3400	uint32_t tmp = 0;
   3401	unsigned i;
   3402	int r;
   3403
   3404	r = radeon_scratch_get(rdev, &scratch);
   3405	if (r) {
   3406		DRM_ERROR("radeon: failed to get scratch reg (%d).\n", r);
   3407		return r;
   3408	}
   3409	WREG32(scratch, 0xCAFEDEAD);
   3410	r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256);
   3411	if (r) {
   3412		DRM_ERROR("radeon: failed to get ib (%d).\n", r);
   3413		goto free_scratch;
   3414	}
   3415	ib.ptr[0] = PACKET3(PACKET3_SET_CONFIG_REG, 1);
   3416	ib.ptr[1] = ((scratch - PACKET3_SET_CONFIG_REG_OFFSET) >> 2);
   3417	ib.ptr[2] = 0xDEADBEEF;
   3418	ib.length_dw = 3;
   3419	r = radeon_ib_schedule(rdev, &ib, NULL, false);
   3420	if (r) {
   3421		DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
   3422		goto free_ib;
   3423	}
   3424	r = radeon_fence_wait_timeout(ib.fence, false, usecs_to_jiffies(
   3425		RADEON_USEC_IB_TEST_TIMEOUT));
   3426	if (r < 0) {
   3427		DRM_ERROR("radeon: fence wait failed (%d).\n", r);
   3428		goto free_ib;
   3429	} else if (r == 0) {
   3430		DRM_ERROR("radeon: fence wait timed out.\n");
   3431		r = -ETIMEDOUT;
   3432		goto free_ib;
   3433	}
   3434	r = 0;
   3435	for (i = 0; i < rdev->usec_timeout; i++) {
   3436		tmp = RREG32(scratch);
   3437		if (tmp == 0xDEADBEEF)
   3438			break;
   3439		udelay(1);
   3440	}
   3441	if (i < rdev->usec_timeout) {
   3442		DRM_INFO("ib test on ring %d succeeded in %u usecs\n", ib.fence->ring, i);
   3443	} else {
   3444		DRM_ERROR("radeon: ib test failed (scratch(0x%04X)=0x%08X)\n",
   3445			  scratch, tmp);
   3446		r = -EINVAL;
   3447	}
   3448free_ib:
   3449	radeon_ib_free(rdev, &ib);
   3450free_scratch:
   3451	radeon_scratch_free(rdev, scratch);
   3452	return r;
   3453}
   3454
   3455/*
   3456 * Interrupts
   3457 *
   3458 * Interrupts use a ring buffer on r6xx/r7xx hardware.  It works pretty
   3459 * the same as the CP ring buffer, but in reverse.  Rather than the CPU
   3460 * writing to the ring and the GPU consuming, the GPU writes to the ring
   3461 * and host consumes.  As the host irq handler processes interrupts, it
   3462 * increments the rptr.  When the rptr catches up with the wptr, all the
   3463 * current interrupts have been processed.
   3464 */
   3465
   3466void r600_ih_ring_init(struct radeon_device *rdev, unsigned ring_size)
   3467{
   3468	u32 rb_bufsz;
   3469
   3470	/* Align ring size */
   3471	rb_bufsz = order_base_2(ring_size / 4);
   3472	ring_size = (1 << rb_bufsz) * 4;
   3473	rdev->ih.ring_size = ring_size;
   3474	rdev->ih.ptr_mask = rdev->ih.ring_size - 1;
   3475	rdev->ih.rptr = 0;
   3476}
   3477
   3478int r600_ih_ring_alloc(struct radeon_device *rdev)
   3479{
   3480	int r;
   3481
   3482	/* Allocate ring buffer */
   3483	if (rdev->ih.ring_obj == NULL) {
   3484		r = radeon_bo_create(rdev, rdev->ih.ring_size,
   3485				     PAGE_SIZE, true,
   3486				     RADEON_GEM_DOMAIN_GTT, 0,
   3487				     NULL, NULL, &rdev->ih.ring_obj);
   3488		if (r) {
   3489			DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r);
   3490			return r;
   3491		}
   3492		r = radeon_bo_reserve(rdev->ih.ring_obj, false);
   3493		if (unlikely(r != 0))
   3494			return r;
   3495		r = radeon_bo_pin(rdev->ih.ring_obj,
   3496				  RADEON_GEM_DOMAIN_GTT,
   3497				  &rdev->ih.gpu_addr);
   3498		if (r) {
   3499			radeon_bo_unreserve(rdev->ih.ring_obj);
   3500			DRM_ERROR("radeon: failed to pin ih ring buffer (%d).\n", r);
   3501			return r;
   3502		}
   3503		r = radeon_bo_kmap(rdev->ih.ring_obj,
   3504				   (void **)&rdev->ih.ring);
   3505		radeon_bo_unreserve(rdev->ih.ring_obj);
   3506		if (r) {
   3507			DRM_ERROR("radeon: failed to map ih ring buffer (%d).\n", r);
   3508			return r;
   3509		}
   3510	}
   3511	return 0;
   3512}
   3513
   3514void r600_ih_ring_fini(struct radeon_device *rdev)
   3515{
   3516	int r;
   3517	if (rdev->ih.ring_obj) {
   3518		r = radeon_bo_reserve(rdev->ih.ring_obj, false);
   3519		if (likely(r == 0)) {
   3520			radeon_bo_kunmap(rdev->ih.ring_obj);
   3521			radeon_bo_unpin(rdev->ih.ring_obj);
   3522			radeon_bo_unreserve(rdev->ih.ring_obj);
   3523		}
   3524		radeon_bo_unref(&rdev->ih.ring_obj);
   3525		rdev->ih.ring = NULL;
   3526		rdev->ih.ring_obj = NULL;
   3527	}
   3528}
   3529
   3530void r600_rlc_stop(struct radeon_device *rdev)
   3531{
   3532
   3533	if ((rdev->family >= CHIP_RV770) &&
   3534	    (rdev->family <= CHIP_RV740)) {
   3535		/* r7xx asics need to soft reset RLC before halting */
   3536		WREG32(SRBM_SOFT_RESET, SOFT_RESET_RLC);
   3537		RREG32(SRBM_SOFT_RESET);
   3538		mdelay(15);
   3539		WREG32(SRBM_SOFT_RESET, 0);
   3540		RREG32(SRBM_SOFT_RESET);
   3541	}
   3542
   3543	WREG32(RLC_CNTL, 0);
   3544}
   3545
   3546static void r600_rlc_start(struct radeon_device *rdev)
   3547{
   3548	WREG32(RLC_CNTL, RLC_ENABLE);
   3549}
   3550
   3551static int r600_rlc_resume(struct radeon_device *rdev)
   3552{
   3553	u32 i;
   3554	const __be32 *fw_data;
   3555
   3556	if (!rdev->rlc_fw)
   3557		return -EINVAL;
   3558
   3559	r600_rlc_stop(rdev);
   3560
   3561	WREG32(RLC_HB_CNTL, 0);
   3562
   3563	WREG32(RLC_HB_BASE, 0);
   3564	WREG32(RLC_HB_RPTR, 0);
   3565	WREG32(RLC_HB_WPTR, 0);
   3566	WREG32(RLC_HB_WPTR_LSB_ADDR, 0);
   3567	WREG32(RLC_HB_WPTR_MSB_ADDR, 0);
   3568	WREG32(RLC_MC_CNTL, 0);
   3569	WREG32(RLC_UCODE_CNTL, 0);
   3570
   3571	fw_data = (const __be32 *)rdev->rlc_fw->data;
   3572	if (rdev->family >= CHIP_RV770) {
   3573		for (i = 0; i < R700_RLC_UCODE_SIZE; i++) {
   3574			WREG32(RLC_UCODE_ADDR, i);
   3575			WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
   3576		}
   3577	} else {
   3578		for (i = 0; i < R600_RLC_UCODE_SIZE; i++) {
   3579			WREG32(RLC_UCODE_ADDR, i);
   3580			WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
   3581		}
   3582	}
   3583	WREG32(RLC_UCODE_ADDR, 0);
   3584
   3585	r600_rlc_start(rdev);
   3586
   3587	return 0;
   3588}
   3589
   3590static void r600_enable_interrupts(struct radeon_device *rdev)
   3591{
   3592	u32 ih_cntl = RREG32(IH_CNTL);
   3593	u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
   3594
   3595	ih_cntl |= ENABLE_INTR;
   3596	ih_rb_cntl |= IH_RB_ENABLE;
   3597	WREG32(IH_CNTL, ih_cntl);
   3598	WREG32(IH_RB_CNTL, ih_rb_cntl);
   3599	rdev->ih.enabled = true;
   3600}
   3601
   3602void r600_disable_interrupts(struct radeon_device *rdev)
   3603{
   3604	u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
   3605	u32 ih_cntl = RREG32(IH_CNTL);
   3606
   3607	ih_rb_cntl &= ~IH_RB_ENABLE;
   3608	ih_cntl &= ~ENABLE_INTR;
   3609	WREG32(IH_RB_CNTL, ih_rb_cntl);
   3610	WREG32(IH_CNTL, ih_cntl);
   3611	/* set rptr, wptr to 0 */
   3612	WREG32(IH_RB_RPTR, 0);
   3613	WREG32(IH_RB_WPTR, 0);
   3614	rdev->ih.enabled = false;
   3615	rdev->ih.rptr = 0;
   3616}
   3617
   3618static void r600_disable_interrupt_state(struct radeon_device *rdev)
   3619{
   3620	u32 tmp;
   3621
   3622	WREG32(CP_INT_CNTL, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
   3623	tmp = RREG32(DMA_CNTL) & ~TRAP_ENABLE;
   3624	WREG32(DMA_CNTL, tmp);
   3625	WREG32(GRBM_INT_CNTL, 0);
   3626	WREG32(DxMODE_INT_MASK, 0);
   3627	WREG32(D1GRPH_INTERRUPT_CONTROL, 0);
   3628	WREG32(D2GRPH_INTERRUPT_CONTROL, 0);
   3629	if (ASIC_IS_DCE3(rdev)) {
   3630		WREG32(DCE3_DACA_AUTODETECT_INT_CONTROL, 0);
   3631		WREG32(DCE3_DACB_AUTODETECT_INT_CONTROL, 0);
   3632		tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY;
   3633		WREG32(DC_HPD1_INT_CONTROL, tmp);
   3634		tmp = RREG32(DC_HPD2_INT_CONTROL) & DC_HPDx_INT_POLARITY;
   3635		WREG32(DC_HPD2_INT_CONTROL, tmp);
   3636		tmp = RREG32(DC_HPD3_INT_CONTROL) & DC_HPDx_INT_POLARITY;
   3637		WREG32(DC_HPD3_INT_CONTROL, tmp);
   3638		tmp = RREG32(DC_HPD4_INT_CONTROL) & DC_HPDx_INT_POLARITY;
   3639		WREG32(DC_HPD4_INT_CONTROL, tmp);
   3640		if (ASIC_IS_DCE32(rdev)) {
   3641			tmp = RREG32(DC_HPD5_INT_CONTROL) & DC_HPDx_INT_POLARITY;
   3642			WREG32(DC_HPD5_INT_CONTROL, tmp);
   3643			tmp = RREG32(DC_HPD6_INT_CONTROL) & DC_HPDx_INT_POLARITY;
   3644			WREG32(DC_HPD6_INT_CONTROL, tmp);
   3645			tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0) & ~HDMI0_AZ_FORMAT_WTRIG_MASK;
   3646			WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0, tmp);
   3647			tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1) & ~HDMI0_AZ_FORMAT_WTRIG_MASK;
   3648			WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1, tmp);
   3649		} else {
   3650			tmp = RREG32(HDMI0_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK;
   3651			WREG32(HDMI0_AUDIO_PACKET_CONTROL, tmp);
   3652			tmp = RREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK;
   3653			WREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL, tmp);
   3654		}
   3655	} else {
   3656		WREG32(DACA_AUTODETECT_INT_CONTROL, 0);
   3657		WREG32(DACB_AUTODETECT_INT_CONTROL, 0);
   3658		tmp = RREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL) & DC_HOT_PLUG_DETECTx_INT_POLARITY;
   3659		WREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL, tmp);
   3660		tmp = RREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL) & DC_HOT_PLUG_DETECTx_INT_POLARITY;
   3661		WREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL, tmp);
   3662		tmp = RREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL) & DC_HOT_PLUG_DETECTx_INT_POLARITY;
   3663		WREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL, tmp);
   3664		tmp = RREG32(HDMI0_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK;
   3665		WREG32(HDMI0_AUDIO_PACKET_CONTROL, tmp);
   3666		tmp = RREG32(HDMI1_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK;
   3667		WREG32(HDMI1_AUDIO_PACKET_CONTROL, tmp);
   3668	}
   3669}
   3670
   3671int r600_irq_init(struct radeon_device *rdev)
   3672{
   3673	int ret = 0;
   3674	int rb_bufsz;
   3675	u32 interrupt_cntl, ih_cntl, ih_rb_cntl;
   3676
   3677	/* allocate ring */
   3678	ret = r600_ih_ring_alloc(rdev);
   3679	if (ret)
   3680		return ret;
   3681
   3682	/* disable irqs */
   3683	r600_disable_interrupts(rdev);
   3684
   3685	/* init rlc */
   3686	if (rdev->family >= CHIP_CEDAR)
   3687		ret = evergreen_rlc_resume(rdev);
   3688	else
   3689		ret = r600_rlc_resume(rdev);
   3690	if (ret) {
   3691		r600_ih_ring_fini(rdev);
   3692		return ret;
   3693	}
   3694
   3695	/* setup interrupt control */
   3696	/* set dummy read address to dummy page address */
   3697	WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8);
   3698	interrupt_cntl = RREG32(INTERRUPT_CNTL);
   3699	/* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi
   3700	 * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN
   3701	 */
   3702	interrupt_cntl &= ~IH_DUMMY_RD_OVERRIDE;
   3703	/* IH_REQ_NONSNOOP_EN=1 if ring is in non-cacheable memory, e.g., vram */
   3704	interrupt_cntl &= ~IH_REQ_NONSNOOP_EN;
   3705	WREG32(INTERRUPT_CNTL, interrupt_cntl);
   3706
   3707	WREG32(IH_RB_BASE, rdev->ih.gpu_addr >> 8);
   3708	rb_bufsz = order_base_2(rdev->ih.ring_size / 4);
   3709
   3710	ih_rb_cntl = (IH_WPTR_OVERFLOW_ENABLE |
   3711		      IH_WPTR_OVERFLOW_CLEAR |
   3712		      (rb_bufsz << 1));
   3713
   3714	if (rdev->wb.enabled)
   3715		ih_rb_cntl |= IH_WPTR_WRITEBACK_ENABLE;
   3716
   3717	/* set the writeback address whether it's enabled or not */
   3718	WREG32(IH_RB_WPTR_ADDR_LO, (rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFFFFFFFC);
   3719	WREG32(IH_RB_WPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFF);
   3720
   3721	WREG32(IH_RB_CNTL, ih_rb_cntl);
   3722
   3723	/* set rptr, wptr to 0 */
   3724	WREG32(IH_RB_RPTR, 0);
   3725	WREG32(IH_RB_WPTR, 0);
   3726
   3727	/* Default settings for IH_CNTL (disabled at first) */
   3728	ih_cntl = MC_WRREQ_CREDIT(0x10) | MC_WR_CLEAN_CNT(0x10);
   3729	/* RPTR_REARM only works if msi's are enabled */
   3730	if (rdev->msi_enabled)
   3731		ih_cntl |= RPTR_REARM;
   3732	WREG32(IH_CNTL, ih_cntl);
   3733
   3734	/* force the active interrupt state to all disabled */
   3735	if (rdev->family >= CHIP_CEDAR)
   3736		evergreen_disable_interrupt_state(rdev);
   3737	else
   3738		r600_disable_interrupt_state(rdev);
   3739
   3740	/* at this point everything should be setup correctly to enable master */
   3741	pci_set_master(rdev->pdev);
   3742
   3743	/* enable irqs */
   3744	r600_enable_interrupts(rdev);
   3745
   3746	return ret;
   3747}
   3748
   3749void r600_irq_suspend(struct radeon_device *rdev)
   3750{
   3751	r600_irq_disable(rdev);
   3752	r600_rlc_stop(rdev);
   3753}
   3754
   3755void r600_irq_fini(struct radeon_device *rdev)
   3756{
   3757	r600_irq_suspend(rdev);
   3758	r600_ih_ring_fini(rdev);
   3759}
   3760
   3761int r600_irq_set(struct radeon_device *rdev)
   3762{
   3763	u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE;
   3764	u32 mode_int = 0;
   3765	u32 hpd1, hpd2, hpd3, hpd4 = 0, hpd5 = 0, hpd6 = 0;
   3766	u32 grbm_int_cntl = 0;
   3767	u32 hdmi0, hdmi1;
   3768	u32 dma_cntl;
   3769	u32 thermal_int = 0;
   3770
   3771	if (!rdev->irq.installed) {
   3772		WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
   3773		return -EINVAL;
   3774	}
   3775	/* don't enable anything if the ih is disabled */
   3776	if (!rdev->ih.enabled) {
   3777		r600_disable_interrupts(rdev);
   3778		/* force the active interrupt state to all disabled */
   3779		r600_disable_interrupt_state(rdev);
   3780		return 0;
   3781	}
   3782
   3783	if (ASIC_IS_DCE3(rdev)) {
   3784		hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN;
   3785		hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN;
   3786		hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN;
   3787		hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN;
   3788		if (ASIC_IS_DCE32(rdev)) {
   3789			hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN;
   3790			hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN;
   3791			hdmi0 = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
   3792			hdmi1 = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
   3793		} else {
   3794			hdmi0 = RREG32(HDMI0_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK;
   3795			hdmi1 = RREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK;
   3796		}
   3797	} else {
   3798		hpd1 = RREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL) & ~DC_HPDx_INT_EN;
   3799		hpd2 = RREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL) & ~DC_HPDx_INT_EN;
   3800		hpd3 = RREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL) & ~DC_HPDx_INT_EN;
   3801		hdmi0 = RREG32(HDMI0_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK;
   3802		hdmi1 = RREG32(HDMI1_AUDIO_PACKET_CONTROL) & ~HDMI0_AZ_FORMAT_WTRIG_MASK;
   3803	}
   3804
   3805	dma_cntl = RREG32(DMA_CNTL) & ~TRAP_ENABLE;
   3806
   3807	if ((rdev->family > CHIP_R600) && (rdev->family < CHIP_RV770)) {
   3808		thermal_int = RREG32(CG_THERMAL_INT) &
   3809			~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
   3810	} else if (rdev->family >= CHIP_RV770) {
   3811		thermal_int = RREG32(RV770_CG_THERMAL_INT) &
   3812			~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
   3813	}
   3814	if (rdev->irq.dpm_thermal) {
   3815		DRM_DEBUG("dpm thermal\n");
   3816		thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
   3817	}
   3818
   3819	if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
   3820		DRM_DEBUG("r600_irq_set: sw int\n");
   3821		cp_int_cntl |= RB_INT_ENABLE;
   3822		cp_int_cntl |= TIME_STAMP_INT_ENABLE;
   3823	}
   3824
   3825	if (atomic_read(&rdev->irq.ring_int[R600_RING_TYPE_DMA_INDEX])) {
   3826		DRM_DEBUG("r600_irq_set: sw int dma\n");
   3827		dma_cntl |= TRAP_ENABLE;
   3828	}
   3829
   3830	if (rdev->irq.crtc_vblank_int[0] ||
   3831	    atomic_read(&rdev->irq.pflip[0])) {
   3832		DRM_DEBUG("r600_irq_set: vblank 0\n");
   3833		mode_int |= D1MODE_VBLANK_INT_MASK;
   3834	}
   3835	if (rdev->irq.crtc_vblank_int[1] ||
   3836	    atomic_read(&rdev->irq.pflip[1])) {
   3837		DRM_DEBUG("r600_irq_set: vblank 1\n");
   3838		mode_int |= D2MODE_VBLANK_INT_MASK;
   3839	}
   3840	if (rdev->irq.hpd[0]) {
   3841		DRM_DEBUG("r600_irq_set: hpd 1\n");
   3842		hpd1 |= DC_HPDx_INT_EN;
   3843	}
   3844	if (rdev->irq.hpd[1]) {
   3845		DRM_DEBUG("r600_irq_set: hpd 2\n");
   3846		hpd2 |= DC_HPDx_INT_EN;
   3847	}
   3848	if (rdev->irq.hpd[2]) {
   3849		DRM_DEBUG("r600_irq_set: hpd 3\n");
   3850		hpd3 |= DC_HPDx_INT_EN;
   3851	}
   3852	if (rdev->irq.hpd[3]) {
   3853		DRM_DEBUG("r600_irq_set: hpd 4\n");
   3854		hpd4 |= DC_HPDx_INT_EN;
   3855	}
   3856	if (rdev->irq.hpd[4]) {
   3857		DRM_DEBUG("r600_irq_set: hpd 5\n");
   3858		hpd5 |= DC_HPDx_INT_EN;
   3859	}
   3860	if (rdev->irq.hpd[5]) {
   3861		DRM_DEBUG("r600_irq_set: hpd 6\n");
   3862		hpd6 |= DC_HPDx_INT_EN;
   3863	}
   3864	if (rdev->irq.afmt[0]) {
   3865		DRM_DEBUG("r600_irq_set: hdmi 0\n");
   3866		hdmi0 |= HDMI0_AZ_FORMAT_WTRIG_MASK;
   3867	}
   3868	if (rdev->irq.afmt[1]) {
   3869		DRM_DEBUG("r600_irq_set: hdmi 0\n");
   3870		hdmi1 |= HDMI0_AZ_FORMAT_WTRIG_MASK;
   3871	}
   3872
   3873	WREG32(CP_INT_CNTL, cp_int_cntl);
   3874	WREG32(DMA_CNTL, dma_cntl);
   3875	WREG32(DxMODE_INT_MASK, mode_int);
   3876	WREG32(D1GRPH_INTERRUPT_CONTROL, DxGRPH_PFLIP_INT_MASK);
   3877	WREG32(D2GRPH_INTERRUPT_CONTROL, DxGRPH_PFLIP_INT_MASK);
   3878	WREG32(GRBM_INT_CNTL, grbm_int_cntl);
   3879	if (ASIC_IS_DCE3(rdev)) {
   3880		WREG32(DC_HPD1_INT_CONTROL, hpd1);
   3881		WREG32(DC_HPD2_INT_CONTROL, hpd2);
   3882		WREG32(DC_HPD3_INT_CONTROL, hpd3);
   3883		WREG32(DC_HPD4_INT_CONTROL, hpd4);
   3884		if (ASIC_IS_DCE32(rdev)) {
   3885			WREG32(DC_HPD5_INT_CONTROL, hpd5);
   3886			WREG32(DC_HPD6_INT_CONTROL, hpd6);
   3887			WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0, hdmi0);
   3888			WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1, hdmi1);
   3889		} else {
   3890			WREG32(HDMI0_AUDIO_PACKET_CONTROL, hdmi0);
   3891			WREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL, hdmi1);
   3892		}
   3893	} else {
   3894		WREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL, hpd1);
   3895		WREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL, hpd2);
   3896		WREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL, hpd3);
   3897		WREG32(HDMI0_AUDIO_PACKET_CONTROL, hdmi0);
   3898		WREG32(HDMI1_AUDIO_PACKET_CONTROL, hdmi1);
   3899	}
   3900	if ((rdev->family > CHIP_R600) && (rdev->family < CHIP_RV770)) {
   3901		WREG32(CG_THERMAL_INT, thermal_int);
   3902	} else if (rdev->family >= CHIP_RV770) {
   3903		WREG32(RV770_CG_THERMAL_INT, thermal_int);
   3904	}
   3905
   3906	/* posting read */
   3907	RREG32(R_000E50_SRBM_STATUS);
   3908
   3909	return 0;
   3910}
   3911
   3912static void r600_irq_ack(struct radeon_device *rdev)
   3913{
   3914	u32 tmp;
   3915
   3916	if (ASIC_IS_DCE3(rdev)) {
   3917		rdev->irq.stat_regs.r600.disp_int = RREG32(DCE3_DISP_INTERRUPT_STATUS);
   3918		rdev->irq.stat_regs.r600.disp_int_cont = RREG32(DCE3_DISP_INTERRUPT_STATUS_CONTINUE);
   3919		rdev->irq.stat_regs.r600.disp_int_cont2 = RREG32(DCE3_DISP_INTERRUPT_STATUS_CONTINUE2);
   3920		if (ASIC_IS_DCE32(rdev)) {
   3921			rdev->irq.stat_regs.r600.hdmi0_status = RREG32(AFMT_STATUS + DCE3_HDMI_OFFSET0);
   3922			rdev->irq.stat_regs.r600.hdmi1_status = RREG32(AFMT_STATUS + DCE3_HDMI_OFFSET1);
   3923		} else {
   3924			rdev->irq.stat_regs.r600.hdmi0_status = RREG32(HDMI0_STATUS);
   3925			rdev->irq.stat_regs.r600.hdmi1_status = RREG32(DCE3_HDMI1_STATUS);
   3926		}
   3927	} else {
   3928		rdev->irq.stat_regs.r600.disp_int = RREG32(DISP_INTERRUPT_STATUS);
   3929		rdev->irq.stat_regs.r600.disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE);
   3930		rdev->irq.stat_regs.r600.disp_int_cont2 = 0;
   3931		rdev->irq.stat_regs.r600.hdmi0_status = RREG32(HDMI0_STATUS);
   3932		rdev->irq.stat_regs.r600.hdmi1_status = RREG32(HDMI1_STATUS);
   3933	}
   3934	rdev->irq.stat_regs.r600.d1grph_int = RREG32(D1GRPH_INTERRUPT_STATUS);
   3935	rdev->irq.stat_regs.r600.d2grph_int = RREG32(D2GRPH_INTERRUPT_STATUS);
   3936
   3937	if (rdev->irq.stat_regs.r600.d1grph_int & DxGRPH_PFLIP_INT_OCCURRED)
   3938		WREG32(D1GRPH_INTERRUPT_STATUS, DxGRPH_PFLIP_INT_CLEAR);
   3939	if (rdev->irq.stat_regs.r600.d2grph_int & DxGRPH_PFLIP_INT_OCCURRED)
   3940		WREG32(D2GRPH_INTERRUPT_STATUS, DxGRPH_PFLIP_INT_CLEAR);
   3941	if (rdev->irq.stat_regs.r600.disp_int & LB_D1_VBLANK_INTERRUPT)
   3942		WREG32(D1MODE_VBLANK_STATUS, DxMODE_VBLANK_ACK);
   3943	if (rdev->irq.stat_regs.r600.disp_int & LB_D1_VLINE_INTERRUPT)
   3944		WREG32(D1MODE_VLINE_STATUS, DxMODE_VLINE_ACK);
   3945	if (rdev->irq.stat_regs.r600.disp_int & LB_D2_VBLANK_INTERRUPT)
   3946		WREG32(D2MODE_VBLANK_STATUS, DxMODE_VBLANK_ACK);
   3947	if (rdev->irq.stat_regs.r600.disp_int & LB_D2_VLINE_INTERRUPT)
   3948		WREG32(D2MODE_VLINE_STATUS, DxMODE_VLINE_ACK);
   3949	if (rdev->irq.stat_regs.r600.disp_int & DC_HPD1_INTERRUPT) {
   3950		if (ASIC_IS_DCE3(rdev)) {
   3951			tmp = RREG32(DC_HPD1_INT_CONTROL);
   3952			tmp |= DC_HPDx_INT_ACK;
   3953			WREG32(DC_HPD1_INT_CONTROL, tmp);
   3954		} else {
   3955			tmp = RREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL);
   3956			tmp |= DC_HPDx_INT_ACK;
   3957			WREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL, tmp);
   3958		}
   3959	}
   3960	if (rdev->irq.stat_regs.r600.disp_int & DC_HPD2_INTERRUPT) {
   3961		if (ASIC_IS_DCE3(rdev)) {
   3962			tmp = RREG32(DC_HPD2_INT_CONTROL);
   3963			tmp |= DC_HPDx_INT_ACK;
   3964			WREG32(DC_HPD2_INT_CONTROL, tmp);
   3965		} else {
   3966			tmp = RREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL);
   3967			tmp |= DC_HPDx_INT_ACK;
   3968			WREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL, tmp);
   3969		}
   3970	}
   3971	if (rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD3_INTERRUPT) {
   3972		if (ASIC_IS_DCE3(rdev)) {
   3973			tmp = RREG32(DC_HPD3_INT_CONTROL);
   3974			tmp |= DC_HPDx_INT_ACK;
   3975			WREG32(DC_HPD3_INT_CONTROL, tmp);
   3976		} else {
   3977			tmp = RREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL);
   3978			tmp |= DC_HPDx_INT_ACK;
   3979			WREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL, tmp);
   3980		}
   3981	}
   3982	if (rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD4_INTERRUPT) {
   3983		tmp = RREG32(DC_HPD4_INT_CONTROL);
   3984		tmp |= DC_HPDx_INT_ACK;
   3985		WREG32(DC_HPD4_INT_CONTROL, tmp);
   3986	}
   3987	if (ASIC_IS_DCE32(rdev)) {
   3988		if (rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD5_INTERRUPT) {
   3989			tmp = RREG32(DC_HPD5_INT_CONTROL);
   3990			tmp |= DC_HPDx_INT_ACK;
   3991			WREG32(DC_HPD5_INT_CONTROL, tmp);
   3992		}
   3993		if (rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD6_INTERRUPT) {
   3994			tmp = RREG32(DC_HPD6_INT_CONTROL);
   3995			tmp |= DC_HPDx_INT_ACK;
   3996			WREG32(DC_HPD6_INT_CONTROL, tmp);
   3997		}
   3998		if (rdev->irq.stat_regs.r600.hdmi0_status & AFMT_AZ_FORMAT_WTRIG) {
   3999			tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0);
   4000			tmp |= AFMT_AZ_FORMAT_WTRIG_ACK;
   4001			WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET0, tmp);
   4002		}
   4003		if (rdev->irq.stat_regs.r600.hdmi1_status & AFMT_AZ_FORMAT_WTRIG) {
   4004			tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1);
   4005			tmp |= AFMT_AZ_FORMAT_WTRIG_ACK;
   4006			WREG32(AFMT_AUDIO_PACKET_CONTROL + DCE3_HDMI_OFFSET1, tmp);
   4007		}
   4008	} else {
   4009		if (rdev->irq.stat_regs.r600.hdmi0_status & HDMI0_AZ_FORMAT_WTRIG) {
   4010			tmp = RREG32(HDMI0_AUDIO_PACKET_CONTROL);
   4011			tmp |= HDMI0_AZ_FORMAT_WTRIG_ACK;
   4012			WREG32(HDMI0_AUDIO_PACKET_CONTROL, tmp);
   4013		}
   4014		if (rdev->irq.stat_regs.r600.hdmi1_status & HDMI0_AZ_FORMAT_WTRIG) {
   4015			if (ASIC_IS_DCE3(rdev)) {
   4016				tmp = RREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL);
   4017				tmp |= HDMI0_AZ_FORMAT_WTRIG_ACK;
   4018				WREG32(DCE3_HDMI1_AUDIO_PACKET_CONTROL, tmp);
   4019			} else {
   4020				tmp = RREG32(HDMI1_AUDIO_PACKET_CONTROL);
   4021				tmp |= HDMI0_AZ_FORMAT_WTRIG_ACK;
   4022				WREG32(HDMI1_AUDIO_PACKET_CONTROL, tmp);
   4023			}
   4024		}
   4025	}
   4026}
   4027
   4028void r600_irq_disable(struct radeon_device *rdev)
   4029{
   4030	r600_disable_interrupts(rdev);
   4031	/* Wait and acknowledge irq */
   4032	mdelay(1);
   4033	r600_irq_ack(rdev);
   4034	r600_disable_interrupt_state(rdev);
   4035}
   4036
   4037static u32 r600_get_ih_wptr(struct radeon_device *rdev)
   4038{
   4039	u32 wptr, tmp;
   4040
   4041	if (rdev->wb.enabled)
   4042		wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
   4043	else
   4044		wptr = RREG32(IH_RB_WPTR);
   4045
   4046	if (wptr & RB_OVERFLOW) {
   4047		wptr &= ~RB_OVERFLOW;
   4048		/* When a ring buffer overflow happen start parsing interrupt
   4049		 * from the last not overwritten vector (wptr + 16). Hopefully
   4050		 * this should allow us to catchup.
   4051		 */
   4052		dev_warn(rdev->dev, "IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n",
   4053			 wptr, rdev->ih.rptr, (wptr + 16) & rdev->ih.ptr_mask);
   4054		rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask;
   4055		tmp = RREG32(IH_RB_CNTL);
   4056		tmp |= IH_WPTR_OVERFLOW_CLEAR;
   4057		WREG32(IH_RB_CNTL, tmp);
   4058	}
   4059	return (wptr & rdev->ih.ptr_mask);
   4060}
   4061
   4062/*        r600 IV Ring
   4063 * Each IV ring entry is 128 bits:
   4064 * [7:0]    - interrupt source id
   4065 * [31:8]   - reserved
   4066 * [59:32]  - interrupt source data
   4067 * [127:60]  - reserved
   4068 *
   4069 * The basic interrupt vector entries
   4070 * are decoded as follows:
   4071 * src_id  src_data  description
   4072 *      1         0  D1 Vblank
   4073 *      1         1  D1 Vline
   4074 *      5         0  D2 Vblank
   4075 *      5         1  D2 Vline
   4076 *     19         0  FP Hot plug detection A
   4077 *     19         1  FP Hot plug detection B
   4078 *     19         2  DAC A auto-detection
   4079 *     19         3  DAC B auto-detection
   4080 *     21         4  HDMI block A
   4081 *     21         5  HDMI block B
   4082 *    176         -  CP_INT RB
   4083 *    177         -  CP_INT IB1
   4084 *    178         -  CP_INT IB2
   4085 *    181         -  EOP Interrupt
   4086 *    233         -  GUI Idle
   4087 *
   4088 * Note, these are based on r600 and may need to be
   4089 * adjusted or added to on newer asics
   4090 */
   4091
   4092int r600_irq_process(struct radeon_device *rdev)
   4093{
   4094	u32 wptr;
   4095	u32 rptr;
   4096	u32 src_id, src_data;
   4097	u32 ring_index;
   4098	bool queue_hotplug = false;
   4099	bool queue_hdmi = false;
   4100	bool queue_thermal = false;
   4101
   4102	if (!rdev->ih.enabled || rdev->shutdown)
   4103		return IRQ_NONE;
   4104
   4105	/* No MSIs, need a dummy read to flush PCI DMAs */
   4106	if (!rdev->msi_enabled)
   4107		RREG32(IH_RB_WPTR);
   4108
   4109	wptr = r600_get_ih_wptr(rdev);
   4110
   4111restart_ih:
   4112	/* is somebody else already processing irqs? */
   4113	if (atomic_xchg(&rdev->ih.lock, 1))
   4114		return IRQ_NONE;
   4115
   4116	rptr = rdev->ih.rptr;
   4117	DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr);
   4118
   4119	/* Order reading of wptr vs. reading of IH ring data */
   4120	rmb();
   4121
   4122	/* display interrupts */
   4123	r600_irq_ack(rdev);
   4124
   4125	while (rptr != wptr) {
   4126		/* wptr/rptr are in bytes! */
   4127		ring_index = rptr / 4;
   4128		src_id = le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
   4129		src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
   4130
   4131		switch (src_id) {
   4132		case 1: /* D1 vblank/vline */
   4133			switch (src_data) {
   4134			case 0: /* D1 vblank */
   4135				if (!(rdev->irq.stat_regs.r600.disp_int & LB_D1_VBLANK_INTERRUPT))
   4136					DRM_DEBUG("IH: D1 vblank - IH event w/o asserted irq bit?\n");
   4137
   4138				if (rdev->irq.crtc_vblank_int[0]) {
   4139					drm_handle_vblank(rdev->ddev, 0);
   4140					rdev->pm.vblank_sync = true;
   4141					wake_up(&rdev->irq.vblank_queue);
   4142				}
   4143				if (atomic_read(&rdev->irq.pflip[0]))
   4144					radeon_crtc_handle_vblank(rdev, 0);
   4145				rdev->irq.stat_regs.r600.disp_int &= ~LB_D1_VBLANK_INTERRUPT;
   4146				DRM_DEBUG("IH: D1 vblank\n");
   4147
   4148				break;
   4149			case 1: /* D1 vline */
   4150				if (!(rdev->irq.stat_regs.r600.disp_int & LB_D1_VLINE_INTERRUPT))
   4151				    DRM_DEBUG("IH: D1 vline - IH event w/o asserted irq bit?\n");
   4152
   4153				rdev->irq.stat_regs.r600.disp_int &= ~LB_D1_VLINE_INTERRUPT;
   4154				DRM_DEBUG("IH: D1 vline\n");
   4155
   4156				break;
   4157			default:
   4158				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
   4159				break;
   4160			}
   4161			break;
   4162		case 5: /* D2 vblank/vline */
   4163			switch (src_data) {
   4164			case 0: /* D2 vblank */
   4165				if (!(rdev->irq.stat_regs.r600.disp_int & LB_D2_VBLANK_INTERRUPT))
   4166					DRM_DEBUG("IH: D2 vblank - IH event w/o asserted irq bit?\n");
   4167
   4168				if (rdev->irq.crtc_vblank_int[1]) {
   4169					drm_handle_vblank(rdev->ddev, 1);
   4170					rdev->pm.vblank_sync = true;
   4171					wake_up(&rdev->irq.vblank_queue);
   4172				}
   4173				if (atomic_read(&rdev->irq.pflip[1]))
   4174					radeon_crtc_handle_vblank(rdev, 1);
   4175				rdev->irq.stat_regs.r600.disp_int &= ~LB_D2_VBLANK_INTERRUPT;
   4176				DRM_DEBUG("IH: D2 vblank\n");
   4177
   4178				break;
   4179			case 1: /* D1 vline */
   4180				if (!(rdev->irq.stat_regs.r600.disp_int & LB_D2_VLINE_INTERRUPT))
   4181					DRM_DEBUG("IH: D2 vline - IH event w/o asserted irq bit?\n");
   4182
   4183				rdev->irq.stat_regs.r600.disp_int &= ~LB_D2_VLINE_INTERRUPT;
   4184				DRM_DEBUG("IH: D2 vline\n");
   4185
   4186				break;
   4187			default:
   4188				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
   4189				break;
   4190			}
   4191			break;
   4192		case 9: /* D1 pflip */
   4193			DRM_DEBUG("IH: D1 flip\n");
   4194			if (radeon_use_pflipirq > 0)
   4195				radeon_crtc_handle_flip(rdev, 0);
   4196			break;
   4197		case 11: /* D2 pflip */
   4198			DRM_DEBUG("IH: D2 flip\n");
   4199			if (radeon_use_pflipirq > 0)
   4200				radeon_crtc_handle_flip(rdev, 1);
   4201			break;
   4202		case 19: /* HPD/DAC hotplug */
   4203			switch (src_data) {
   4204			case 0:
   4205				if (!(rdev->irq.stat_regs.r600.disp_int & DC_HPD1_INTERRUPT))
   4206					DRM_DEBUG("IH: HPD1 - IH event w/o asserted irq bit?\n");
   4207
   4208				rdev->irq.stat_regs.r600.disp_int &= ~DC_HPD1_INTERRUPT;
   4209				queue_hotplug = true;
   4210				DRM_DEBUG("IH: HPD1\n");
   4211				break;
   4212			case 1:
   4213				if (!(rdev->irq.stat_regs.r600.disp_int & DC_HPD2_INTERRUPT))
   4214					DRM_DEBUG("IH: HPD2 - IH event w/o asserted irq bit?\n");
   4215
   4216				rdev->irq.stat_regs.r600.disp_int &= ~DC_HPD2_INTERRUPT;
   4217				queue_hotplug = true;
   4218				DRM_DEBUG("IH: HPD2\n");
   4219				break;
   4220			case 4:
   4221				if (!(rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD3_INTERRUPT))
   4222					DRM_DEBUG("IH: HPD3 - IH event w/o asserted irq bit?\n");
   4223
   4224				rdev->irq.stat_regs.r600.disp_int_cont &= ~DC_HPD3_INTERRUPT;
   4225				queue_hotplug = true;
   4226				DRM_DEBUG("IH: HPD3\n");
   4227				break;
   4228			case 5:
   4229				if (!(rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD4_INTERRUPT))
   4230					DRM_DEBUG("IH: HPD4 - IH event w/o asserted irq bit?\n");
   4231
   4232				rdev->irq.stat_regs.r600.disp_int_cont &= ~DC_HPD4_INTERRUPT;
   4233				queue_hotplug = true;
   4234				DRM_DEBUG("IH: HPD4\n");
   4235				break;
   4236			case 10:
   4237				if (!(rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD5_INTERRUPT))
   4238					DRM_DEBUG("IH: HPD5 - IH event w/o asserted irq bit?\n");
   4239
   4240				rdev->irq.stat_regs.r600.disp_int_cont2 &= ~DC_HPD5_INTERRUPT;
   4241				queue_hotplug = true;
   4242				DRM_DEBUG("IH: HPD5\n");
   4243				break;
   4244			case 12:
   4245				if (!(rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD6_INTERRUPT))
   4246					DRM_DEBUG("IH: HPD6 - IH event w/o asserted irq bit?\n");
   4247
   4248				rdev->irq.stat_regs.r600.disp_int_cont2 &= ~DC_HPD6_INTERRUPT;
   4249				queue_hotplug = true;
   4250				DRM_DEBUG("IH: HPD6\n");
   4251
   4252				break;
   4253			default:
   4254				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
   4255				break;
   4256			}
   4257			break;
   4258		case 21: /* hdmi */
   4259			switch (src_data) {
   4260			case 4:
   4261				if (!(rdev->irq.stat_regs.r600.hdmi0_status & HDMI0_AZ_FORMAT_WTRIG))
   4262					DRM_DEBUG("IH: HDMI0 - IH event w/o asserted irq bit?\n");
   4263
   4264				rdev->irq.stat_regs.r600.hdmi0_status &= ~HDMI0_AZ_FORMAT_WTRIG;
   4265				queue_hdmi = true;
   4266				DRM_DEBUG("IH: HDMI0\n");
   4267
   4268				break;
   4269			case 5:
   4270				if (!(rdev->irq.stat_regs.r600.hdmi1_status & HDMI0_AZ_FORMAT_WTRIG))
   4271					DRM_DEBUG("IH: HDMI1 - IH event w/o asserted irq bit?\n");
   4272
   4273				rdev->irq.stat_regs.r600.hdmi1_status &= ~HDMI0_AZ_FORMAT_WTRIG;
   4274				queue_hdmi = true;
   4275				DRM_DEBUG("IH: HDMI1\n");
   4276
   4277				break;
   4278			default:
   4279				DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data);
   4280				break;
   4281			}
   4282			break;
   4283		case 124: /* UVD */
   4284			DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
   4285			radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
   4286			break;
   4287		case 176: /* CP_INT in ring buffer */
   4288		case 177: /* CP_INT in IB1 */
   4289		case 178: /* CP_INT in IB2 */
   4290			DRM_DEBUG("IH: CP int: 0x%08x\n", src_data);
   4291			radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
   4292			break;
   4293		case 181: /* CP EOP event */
   4294			DRM_DEBUG("IH: CP EOP\n");
   4295			radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
   4296			break;
   4297		case 224: /* DMA trap event */
   4298			DRM_DEBUG("IH: DMA trap\n");
   4299			radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX);
   4300			break;
   4301		case 230: /* thermal low to high */
   4302			DRM_DEBUG("IH: thermal low to high\n");
   4303			rdev->pm.dpm.thermal.high_to_low = false;
   4304			queue_thermal = true;
   4305			break;
   4306		case 231: /* thermal high to low */
   4307			DRM_DEBUG("IH: thermal high to low\n");
   4308			rdev->pm.dpm.thermal.high_to_low = true;
   4309			queue_thermal = true;
   4310			break;
   4311		case 233: /* GUI IDLE */
   4312			DRM_DEBUG("IH: GUI idle\n");
   4313			break;
   4314		default:
   4315			DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
   4316			break;
   4317		}
   4318
   4319		/* wptr/rptr are in bytes! */
   4320		rptr += 16;
   4321		rptr &= rdev->ih.ptr_mask;
   4322		WREG32(IH_RB_RPTR, rptr);
   4323	}
   4324	if (queue_hotplug)
   4325		schedule_delayed_work(&rdev->hotplug_work, 0);
   4326	if (queue_hdmi)
   4327		schedule_work(&rdev->audio_work);
   4328	if (queue_thermal && rdev->pm.dpm_enabled)
   4329		schedule_work(&rdev->pm.dpm.thermal.work);
   4330	rdev->ih.rptr = rptr;
   4331	atomic_set(&rdev->ih.lock, 0);
   4332
   4333	/* make sure wptr hasn't changed while processing */
   4334	wptr = r600_get_ih_wptr(rdev);
   4335	if (wptr != rptr)
   4336		goto restart_ih;
   4337
   4338	return IRQ_HANDLED;
   4339}
   4340
   4341/*
   4342 * Debugfs info
   4343 */
   4344#if defined(CONFIG_DEBUG_FS)
   4345
   4346static int r600_debugfs_mc_info_show(struct seq_file *m, void *unused)
   4347{
   4348	struct radeon_device *rdev = (struct radeon_device *)m->private;
   4349
   4350	DREG32_SYS(m, rdev, R_000E50_SRBM_STATUS);
   4351	DREG32_SYS(m, rdev, VM_L2_STATUS);
   4352	return 0;
   4353}
   4354
   4355DEFINE_SHOW_ATTRIBUTE(r600_debugfs_mc_info);
   4356#endif
   4357
   4358static void r600_debugfs_mc_info_init(struct radeon_device *rdev)
   4359{
   4360#if defined(CONFIG_DEBUG_FS)
   4361	struct dentry *root = rdev->ddev->primary->debugfs_root;
   4362
   4363	debugfs_create_file("r600_mc_info", 0444, root, rdev,
   4364			    &r600_debugfs_mc_info_fops);
   4365
   4366#endif
   4367}
   4368
   4369/**
   4370 * r600_mmio_hdp_flush - flush Host Data Path cache via MMIO
   4371 * @rdev: radeon device structure
   4372 *
   4373 * Some R6XX/R7XX don't seem to take into account HDP flushes performed
   4374 * through the ring buffer. This leads to corruption in rendering, see
   4375 * http://bugzilla.kernel.org/show_bug.cgi?id=15186 . To avoid this, we
   4376 * directly perform the HDP flush by writing the register through MMIO.
   4377 */
   4378void r600_mmio_hdp_flush(struct radeon_device *rdev)
   4379{
   4380	/* r7xx hw bug.  write to HDP_DEBUG1 followed by fb read
   4381	 * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL.
   4382	 * This seems to cause problems on some AGP cards. Just use the old
   4383	 * method for them.
   4384	 */
   4385	if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740) &&
   4386	    rdev->vram_scratch.ptr && !(rdev->flags & RADEON_IS_AGP)) {
   4387		void __iomem *ptr = (void *)rdev->vram_scratch.ptr;
   4388
   4389		WREG32(HDP_DEBUG1, 0);
   4390		readl((void __iomem *)ptr);
   4391	} else
   4392		WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
   4393}
   4394
   4395void r600_set_pcie_lanes(struct radeon_device *rdev, int lanes)
   4396{
   4397	u32 link_width_cntl, mask;
   4398
   4399	if (rdev->flags & RADEON_IS_IGP)
   4400		return;
   4401
   4402	if (!(rdev->flags & RADEON_IS_PCIE))
   4403		return;
   4404
   4405	/* x2 cards have a special sequence */
   4406	if (ASIC_IS_X2(rdev))
   4407		return;
   4408
   4409	radeon_gui_idle(rdev);
   4410
   4411	switch (lanes) {
   4412	case 0:
   4413		mask = RADEON_PCIE_LC_LINK_WIDTH_X0;
   4414		break;
   4415	case 1:
   4416		mask = RADEON_PCIE_LC_LINK_WIDTH_X1;
   4417		break;
   4418	case 2:
   4419		mask = RADEON_PCIE_LC_LINK_WIDTH_X2;
   4420		break;
   4421	case 4:
   4422		mask = RADEON_PCIE_LC_LINK_WIDTH_X4;
   4423		break;
   4424	case 8:
   4425		mask = RADEON_PCIE_LC_LINK_WIDTH_X8;
   4426		break;
   4427	case 12:
   4428		/* not actually supported */
   4429		mask = RADEON_PCIE_LC_LINK_WIDTH_X12;
   4430		break;
   4431	case 16:
   4432		mask = RADEON_PCIE_LC_LINK_WIDTH_X16;
   4433		break;
   4434	default:
   4435		DRM_ERROR("invalid pcie lane request: %d\n", lanes);
   4436		return;
   4437	}
   4438
   4439	link_width_cntl = RREG32_PCIE_PORT(RADEON_PCIE_LC_LINK_WIDTH_CNTL);
   4440	link_width_cntl &= ~RADEON_PCIE_LC_LINK_WIDTH_MASK;
   4441	link_width_cntl |= mask << RADEON_PCIE_LC_LINK_WIDTH_SHIFT;
   4442	link_width_cntl |= (RADEON_PCIE_LC_RECONFIG_NOW |
   4443			    R600_PCIE_LC_RECONFIG_ARC_MISSING_ESCAPE);
   4444
   4445	WREG32_PCIE_PORT(RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
   4446}
   4447
   4448int r600_get_pcie_lanes(struct radeon_device *rdev)
   4449{
   4450	u32 link_width_cntl;
   4451
   4452	if (rdev->flags & RADEON_IS_IGP)
   4453		return 0;
   4454
   4455	if (!(rdev->flags & RADEON_IS_PCIE))
   4456		return 0;
   4457
   4458	/* x2 cards have a special sequence */
   4459	if (ASIC_IS_X2(rdev))
   4460		return 0;
   4461
   4462	radeon_gui_idle(rdev);
   4463
   4464	link_width_cntl = RREG32_PCIE_PORT(RADEON_PCIE_LC_LINK_WIDTH_CNTL);
   4465
   4466	switch ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) >> RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT) {
   4467	case RADEON_PCIE_LC_LINK_WIDTH_X1:
   4468		return 1;
   4469	case RADEON_PCIE_LC_LINK_WIDTH_X2:
   4470		return 2;
   4471	case RADEON_PCIE_LC_LINK_WIDTH_X4:
   4472		return 4;
   4473	case RADEON_PCIE_LC_LINK_WIDTH_X8:
   4474		return 8;
   4475	case RADEON_PCIE_LC_LINK_WIDTH_X12:
   4476		/* not actually supported */
   4477		return 12;
   4478	case RADEON_PCIE_LC_LINK_WIDTH_X0:
   4479	case RADEON_PCIE_LC_LINK_WIDTH_X16:
   4480	default:
   4481		return 16;
   4482	}
   4483}
   4484
   4485static void r600_pcie_gen2_enable(struct radeon_device *rdev)
   4486{
   4487	u32 link_width_cntl, lanes, speed_cntl, training_cntl, tmp;
   4488	u16 link_cntl2;
   4489
   4490	if (radeon_pcie_gen2 == 0)
   4491		return;
   4492
   4493	if (rdev->flags & RADEON_IS_IGP)
   4494		return;
   4495
   4496	if (!(rdev->flags & RADEON_IS_PCIE))
   4497		return;
   4498
   4499	/* x2 cards have a special sequence */
   4500	if (ASIC_IS_X2(rdev))
   4501		return;
   4502
   4503	/* only RV6xx+ chips are supported */
   4504	if (rdev->family <= CHIP_R600)
   4505		return;
   4506
   4507	if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) &&
   4508		(rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))
   4509		return;
   4510
   4511	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
   4512	if (speed_cntl & LC_CURRENT_DATA_RATE) {
   4513		DRM_INFO("PCIE gen 2 link speeds already enabled\n");
   4514		return;
   4515	}
   4516
   4517	DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
   4518
   4519	/* 55 nm r6xx asics */
   4520	if ((rdev->family == CHIP_RV670) ||
   4521	    (rdev->family == CHIP_RV620) ||
   4522	    (rdev->family == CHIP_RV635)) {
   4523		/* advertise upconfig capability */
   4524		link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
   4525		link_width_cntl &= ~LC_UPCONFIGURE_DIS;
   4526		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
   4527		link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
   4528		if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) {
   4529			lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT;
   4530			link_width_cntl &= ~(LC_LINK_WIDTH_MASK |
   4531					     LC_RECONFIG_ARC_MISSING_ESCAPE);
   4532			link_width_cntl |= lanes | LC_RECONFIG_NOW | LC_RENEGOTIATE_EN;
   4533			WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
   4534		} else {
   4535			link_width_cntl |= LC_UPCONFIGURE_DIS;
   4536			WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
   4537		}
   4538	}
   4539
   4540	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
   4541	if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
   4542	    (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
   4543
   4544		/* 55 nm r6xx asics */
   4545		if ((rdev->family == CHIP_RV670) ||
   4546		    (rdev->family == CHIP_RV620) ||
   4547		    (rdev->family == CHIP_RV635)) {
   4548			WREG32(MM_CFGREGS_CNTL, 0x8);
   4549			link_cntl2 = RREG32(0x4088);
   4550			WREG32(MM_CFGREGS_CNTL, 0);
   4551			/* not supported yet */
   4552			if (link_cntl2 & SELECTABLE_DEEMPHASIS)
   4553				return;
   4554		}
   4555
   4556		speed_cntl &= ~LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_MASK;
   4557		speed_cntl |= (0x3 << LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_SHIFT);
   4558		speed_cntl &= ~LC_VOLTAGE_TIMER_SEL_MASK;
   4559		speed_cntl &= ~LC_FORCE_DIS_HW_SPEED_CHANGE;
   4560		speed_cntl |= LC_FORCE_EN_HW_SPEED_CHANGE;
   4561		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
   4562
   4563		tmp = RREG32(0x541c);
   4564		WREG32(0x541c, tmp | 0x8);
   4565		WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN);
   4566		link_cntl2 = RREG16(0x4088);
   4567		link_cntl2 &= ~TARGET_LINK_SPEED_MASK;
   4568		link_cntl2 |= 0x2;
   4569		WREG16(0x4088, link_cntl2);
   4570		WREG32(MM_CFGREGS_CNTL, 0);
   4571
   4572		if ((rdev->family == CHIP_RV670) ||
   4573		    (rdev->family == CHIP_RV620) ||
   4574		    (rdev->family == CHIP_RV635)) {
   4575			training_cntl = RREG32_PCIE_PORT(PCIE_LC_TRAINING_CNTL);
   4576			training_cntl &= ~LC_POINT_7_PLUS_EN;
   4577			WREG32_PCIE_PORT(PCIE_LC_TRAINING_CNTL, training_cntl);
   4578		} else {
   4579			speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
   4580			speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
   4581			WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
   4582		}
   4583
   4584		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
   4585		speed_cntl |= LC_GEN2_EN_STRAP;
   4586		WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
   4587
   4588	} else {
   4589		link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
   4590		/* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
   4591		if (1)
   4592			link_width_cntl |= LC_UPCONFIGURE_DIS;
   4593		else
   4594			link_width_cntl &= ~LC_UPCONFIGURE_DIS;
   4595		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
   4596	}
   4597}
   4598
   4599/**
   4600 * r600_get_gpu_clock_counter - return GPU clock counter snapshot
   4601 *
   4602 * @rdev: radeon_device pointer
   4603 *
   4604 * Fetches a GPU clock counter snapshot (R6xx-cayman).
   4605 * Returns the 64 bit clock counter snapshot.
   4606 */
   4607uint64_t r600_get_gpu_clock_counter(struct radeon_device *rdev)
   4608{
   4609	uint64_t clock;
   4610
   4611	mutex_lock(&rdev->gpu_clock_mutex);
   4612	WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1);
   4613	clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) |
   4614		((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
   4615	mutex_unlock(&rdev->gpu_clock_mutex);
   4616	return clock;
   4617}