brintos

brintos / linux-shallow public Read only

0
0
Text · 116.5 KiB · 8070341 Raw
4162 lines · c
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 a7 * copy of this software and associated documentation files (the "Software"),8 * to deal in the Software without restriction, including without limitation9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,10 * and/or sell copies of the Software, and to permit persons to whom the11 * Software is furnished to do so, subject to the following conditions:12 *13 * The above copyright notice and this permission notice shall be included in14 * all copies or substantial portions of the Software.15 *16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR20 * 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 OR22 * OTHER DEALINGS IN THE SOFTWARE.23 *24 * Authors: Dave Airlie25 *          Alex Deucher26 *          Jerome Glisse27 */28 29#include <linux/debugfs.h>30#include <linux/firmware.h>31#include <linux/module.h>32#include <linux/pci.h>33#include <linux/seq_file.h>34#include <linux/slab.h>35 36#include <drm/drm_device.h>37#include <drm/drm_file.h>38#include <drm/drm_fourcc.h>39#include <drm/drm_framebuffer.h>40#include <drm/drm_vblank.h>41#include <drm/radeon_drm.h>42 43#include "atom.h"44#include "r100_reg_safe.h"45#include "r100d.h"46#include "radeon.h"47#include "radeon_asic.h"48#include "radeon_reg.h"49#include "rn50_reg_safe.h"50#include "rs100d.h"51#include "rv200d.h"52#include "rv250d.h"53 54/* Firmware Names */55#define FIRMWARE_R100		"radeon/R100_cp.bin"56#define FIRMWARE_R200		"radeon/R200_cp.bin"57#define FIRMWARE_R300		"radeon/R300_cp.bin"58#define FIRMWARE_R420		"radeon/R420_cp.bin"59#define FIRMWARE_RS690		"radeon/RS690_cp.bin"60#define FIRMWARE_RS600		"radeon/RS600_cp.bin"61#define FIRMWARE_R520		"radeon/R520_cp.bin"62 63MODULE_FIRMWARE(FIRMWARE_R100);64MODULE_FIRMWARE(FIRMWARE_R200);65MODULE_FIRMWARE(FIRMWARE_R300);66MODULE_FIRMWARE(FIRMWARE_R420);67MODULE_FIRMWARE(FIRMWARE_RS690);68MODULE_FIRMWARE(FIRMWARE_RS600);69MODULE_FIRMWARE(FIRMWARE_R520);70 71#include "r100_track.h"72 73/* This files gather functions specifics to:74 * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv28075 * and others in some cases.76 */77 78static bool r100_is_in_vblank(struct radeon_device *rdev, int crtc)79{80	if (crtc == 0) {81		if (RREG32(RADEON_CRTC_STATUS) & RADEON_CRTC_VBLANK_CUR)82			return true;83		else84			return false;85	} else {86		if (RREG32(RADEON_CRTC2_STATUS) & RADEON_CRTC2_VBLANK_CUR)87			return true;88		else89			return false;90	}91}92 93static bool r100_is_counter_moving(struct radeon_device *rdev, int crtc)94{95	u32 vline1, vline2;96 97	if (crtc == 0) {98		vline1 = (RREG32(RADEON_CRTC_VLINE_CRNT_VLINE) >> 16) & RADEON_CRTC_V_TOTAL;99		vline2 = (RREG32(RADEON_CRTC_VLINE_CRNT_VLINE) >> 16) & RADEON_CRTC_V_TOTAL;100	} else {101		vline1 = (RREG32(RADEON_CRTC2_VLINE_CRNT_VLINE) >> 16) & RADEON_CRTC_V_TOTAL;102		vline2 = (RREG32(RADEON_CRTC2_VLINE_CRNT_VLINE) >> 16) & RADEON_CRTC_V_TOTAL;103	}104	if (vline1 != vline2)105		return true;106	else107		return false;108}109 110/**111 * r100_wait_for_vblank - vblank wait asic callback.112 *113 * @rdev: radeon_device pointer114 * @crtc: crtc to wait for vblank on115 *116 * Wait for vblank on the requested crtc (r1xx-r4xx).117 */118void r100_wait_for_vblank(struct radeon_device *rdev, int crtc)119{120	unsigned i = 0;121 122	if (crtc >= rdev->num_crtc)123		return;124 125	if (crtc == 0) {126		if (!(RREG32(RADEON_CRTC_GEN_CNTL) & RADEON_CRTC_EN))127			return;128	} else {129		if (!(RREG32(RADEON_CRTC2_GEN_CNTL) & RADEON_CRTC2_EN))130			return;131	}132 133	/* depending on when we hit vblank, we may be close to active; if so,134	 * wait for another frame.135	 */136	while (r100_is_in_vblank(rdev, crtc)) {137		if (i++ % 100 == 0) {138			if (!r100_is_counter_moving(rdev, crtc))139				break;140		}141	}142 143	while (!r100_is_in_vblank(rdev, crtc)) {144		if (i++ % 100 == 0) {145			if (!r100_is_counter_moving(rdev, crtc))146				break;147		}148	}149}150 151/**152 * r100_page_flip - pageflip callback.153 *154 * @rdev: radeon_device pointer155 * @crtc_id: crtc to cleanup pageflip on156 * @crtc_base: new address of the crtc (GPU MC address)157 * @async: asynchronous flip158 *159 * Does the actual pageflip (r1xx-r4xx).160 * During vblank we take the crtc lock and wait for the update_pending161 * bit to go high, when it does, we release the lock, and allow the162 * double buffered update to take place.163 */164void r100_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, bool async)165{166	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];167	uint32_t crtc_pitch, pitch_pixels;168	struct drm_framebuffer *fb = radeon_crtc->base.primary->fb;169	u32 tmp = ((u32)crtc_base) | RADEON_CRTC_OFFSET__OFFSET_LOCK;170	int i;171 172	/* Lock the graphics update lock */173	/* update the scanout addresses */174	WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, tmp);175 176	/* update pitch */177	pitch_pixels = fb->pitches[0] / fb->format->cpp[0];178	crtc_pitch = DIV_ROUND_UP(pitch_pixels * fb->format->cpp[0] * 8,179				  fb->format->cpp[0] * 8 * 8);180	crtc_pitch |= crtc_pitch << 16;181	WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch);182 183	/* Wait for update_pending to go high. */184	for (i = 0; i < rdev->usec_timeout; i++) {185		if (RREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset) & RADEON_CRTC_OFFSET__GUI_TRIG_OFFSET)186			break;187		udelay(1);188	}189	DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");190 191	/* Unlock the lock, so double-buffering can take place inside vblank */192	tmp &= ~RADEON_CRTC_OFFSET__OFFSET_LOCK;193	WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, tmp);194 195}196 197/**198 * r100_page_flip_pending - check if page flip is still pending199 *200 * @rdev: radeon_device pointer201 * @crtc_id: crtc to check202 *203 * Check if the last pagefilp is still pending (r1xx-r4xx).204 * Returns the current update pending status.205 */206bool r100_page_flip_pending(struct radeon_device *rdev, int crtc_id)207{208	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];209 210	/* Return current update_pending status: */211	return !!(RREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset) &212		RADEON_CRTC_OFFSET__GUI_TRIG_OFFSET);213}214 215/**216 * r100_pm_get_dynpm_state - look up dynpm power state callback.217 *218 * @rdev: radeon_device pointer219 *220 * Look up the optimal power state based on the221 * current state of the GPU (r1xx-r5xx).222 * Used for dynpm only.223 */224void r100_pm_get_dynpm_state(struct radeon_device *rdev)225{226	int i;227	rdev->pm.dynpm_can_upclock = true;228	rdev->pm.dynpm_can_downclock = true;229 230	switch (rdev->pm.dynpm_planned_action) {231	case DYNPM_ACTION_MINIMUM:232		rdev->pm.requested_power_state_index = 0;233		rdev->pm.dynpm_can_downclock = false;234		break;235	case DYNPM_ACTION_DOWNCLOCK:236		if (rdev->pm.current_power_state_index == 0) {237			rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index;238			rdev->pm.dynpm_can_downclock = false;239		} else {240			if (rdev->pm.active_crtc_count > 1) {241				for (i = 0; i < rdev->pm.num_power_states; i++) {242					if (rdev->pm.power_state[i].flags & RADEON_PM_STATE_SINGLE_DISPLAY_ONLY)243						continue;244					else if (i >= rdev->pm.current_power_state_index) {245						rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index;246						break;247					} else {248						rdev->pm.requested_power_state_index = i;249						break;250					}251				}252			} else253				rdev->pm.requested_power_state_index =254					rdev->pm.current_power_state_index - 1;255		}256		/* don't use the power state if crtcs are active and no display flag is set */257		if ((rdev->pm.active_crtc_count > 0) &&258		    (rdev->pm.power_state[rdev->pm.requested_power_state_index].clock_info[0].flags &259		     RADEON_PM_MODE_NO_DISPLAY)) {260			rdev->pm.requested_power_state_index++;261		}262		break;263	case DYNPM_ACTION_UPCLOCK:264		if (rdev->pm.current_power_state_index == (rdev->pm.num_power_states - 1)) {265			rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index;266			rdev->pm.dynpm_can_upclock = false;267		} else {268			if (rdev->pm.active_crtc_count > 1) {269				for (i = (rdev->pm.num_power_states - 1); i >= 0; i--) {270					if (rdev->pm.power_state[i].flags & RADEON_PM_STATE_SINGLE_DISPLAY_ONLY)271						continue;272					else if (i <= rdev->pm.current_power_state_index) {273						rdev->pm.requested_power_state_index = rdev->pm.current_power_state_index;274						break;275					} else {276						rdev->pm.requested_power_state_index = i;277						break;278					}279				}280			} else281				rdev->pm.requested_power_state_index =282					rdev->pm.current_power_state_index + 1;283		}284		break;285	case DYNPM_ACTION_DEFAULT:286		rdev->pm.requested_power_state_index = rdev->pm.default_power_state_index;287		rdev->pm.dynpm_can_upclock = false;288		break;289	case DYNPM_ACTION_NONE:290	default:291		DRM_ERROR("Requested mode for not defined action\n");292		return;293	}294	/* only one clock mode per power state */295	rdev->pm.requested_clock_mode_index = 0;296 297	DRM_DEBUG_DRIVER("Requested: e: %d m: %d p: %d\n",298		  rdev->pm.power_state[rdev->pm.requested_power_state_index].299		  clock_info[rdev->pm.requested_clock_mode_index].sclk,300		  rdev->pm.power_state[rdev->pm.requested_power_state_index].301		  clock_info[rdev->pm.requested_clock_mode_index].mclk,302		  rdev->pm.power_state[rdev->pm.requested_power_state_index].303		  pcie_lanes);304}305 306/**307 * r100_pm_init_profile - Initialize power profiles callback.308 *309 * @rdev: radeon_device pointer310 *311 * Initialize the power states used in profile mode312 * (r1xx-r3xx).313 * Used for profile mode only.314 */315void r100_pm_init_profile(struct radeon_device *rdev)316{317	/* default */318	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_ps_idx = rdev->pm.default_power_state_index;319	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;320	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_off_cm_idx = 0;321	rdev->pm.profiles[PM_PROFILE_DEFAULT_IDX].dpms_on_cm_idx = 0;322	/* low sh */323	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_ps_idx = 0;324	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_ps_idx = 0;325	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_off_cm_idx = 0;326	rdev->pm.profiles[PM_PROFILE_LOW_SH_IDX].dpms_on_cm_idx = 0;327	/* mid sh */328	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_ps_idx = 0;329	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_ps_idx = 0;330	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_off_cm_idx = 0;331	rdev->pm.profiles[PM_PROFILE_MID_SH_IDX].dpms_on_cm_idx = 0;332	/* high sh */333	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_ps_idx = 0;334	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;335	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_off_cm_idx = 0;336	rdev->pm.profiles[PM_PROFILE_HIGH_SH_IDX].dpms_on_cm_idx = 0;337	/* low mh */338	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_ps_idx = 0;339	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;340	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_off_cm_idx = 0;341	rdev->pm.profiles[PM_PROFILE_LOW_MH_IDX].dpms_on_cm_idx = 0;342	/* mid mh */343	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_ps_idx = 0;344	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;345	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_off_cm_idx = 0;346	rdev->pm.profiles[PM_PROFILE_MID_MH_IDX].dpms_on_cm_idx = 0;347	/* high mh */348	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_ps_idx = 0;349	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_ps_idx = rdev->pm.default_power_state_index;350	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_off_cm_idx = 0;351	rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx = 0;352}353 354/**355 * r100_pm_misc - set additional pm hw parameters callback.356 *357 * @rdev: radeon_device pointer358 *359 * Set non-clock parameters associated with a power state360 * (voltage, pcie lanes, etc.) (r1xx-r4xx).361 */362void r100_pm_misc(struct radeon_device *rdev)363{364	int requested_index = rdev->pm.requested_power_state_index;365	struct radeon_power_state *ps = &rdev->pm.power_state[requested_index];366	struct radeon_voltage *voltage = &ps->clock_info[0].voltage;367	u32 tmp, sclk_cntl, sclk_cntl2, sclk_more_cntl;368 369	if ((voltage->type == VOLTAGE_GPIO) && (voltage->gpio.valid)) {370		if (ps->misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) {371			tmp = RREG32(voltage->gpio.reg);372			if (voltage->active_high)373				tmp |= voltage->gpio.mask;374			else375				tmp &= ~(voltage->gpio.mask);376			WREG32(voltage->gpio.reg, tmp);377			if (voltage->delay)378				udelay(voltage->delay);379		} else {380			tmp = RREG32(voltage->gpio.reg);381			if (voltage->active_high)382				tmp &= ~voltage->gpio.mask;383			else384				tmp |= voltage->gpio.mask;385			WREG32(voltage->gpio.reg, tmp);386			if (voltage->delay)387				udelay(voltage->delay);388		}389	}390 391	sclk_cntl = RREG32_PLL(SCLK_CNTL);392	sclk_cntl2 = RREG32_PLL(SCLK_CNTL2);393	sclk_cntl2 &= ~REDUCED_SPEED_SCLK_SEL(3);394	sclk_more_cntl = RREG32_PLL(SCLK_MORE_CNTL);395	sclk_more_cntl &= ~VOLTAGE_DELAY_SEL(3);396	if (ps->misc & ATOM_PM_MISCINFO_ASIC_REDUCED_SPEED_SCLK_EN) {397		sclk_more_cntl |= REDUCED_SPEED_SCLK_EN;398		if (ps->misc & ATOM_PM_MISCINFO_DYN_CLK_3D_IDLE)399			sclk_cntl2 |= REDUCED_SPEED_SCLK_MODE;400		else401			sclk_cntl2 &= ~REDUCED_SPEED_SCLK_MODE;402		if (ps->misc & ATOM_PM_MISCINFO_DYNAMIC_CLOCK_DIVIDER_BY_2)403			sclk_cntl2 |= REDUCED_SPEED_SCLK_SEL(0);404		else if (ps->misc & ATOM_PM_MISCINFO_DYNAMIC_CLOCK_DIVIDER_BY_4)405			sclk_cntl2 |= REDUCED_SPEED_SCLK_SEL(2);406	} else407		sclk_more_cntl &= ~REDUCED_SPEED_SCLK_EN;408 409	if (ps->misc & ATOM_PM_MISCINFO_ASIC_DYNAMIC_VOLTAGE_EN) {410		sclk_more_cntl |= IO_CG_VOLTAGE_DROP;411		if (voltage->delay) {412			sclk_more_cntl |= VOLTAGE_DROP_SYNC;413			switch (voltage->delay) {414			case 33:415				sclk_more_cntl |= VOLTAGE_DELAY_SEL(0);416				break;417			case 66:418				sclk_more_cntl |= VOLTAGE_DELAY_SEL(1);419				break;420			case 99:421				sclk_more_cntl |= VOLTAGE_DELAY_SEL(2);422				break;423			case 132:424				sclk_more_cntl |= VOLTAGE_DELAY_SEL(3);425				break;426			}427		} else428			sclk_more_cntl &= ~VOLTAGE_DROP_SYNC;429	} else430		sclk_more_cntl &= ~IO_CG_VOLTAGE_DROP;431 432	if (ps->misc & ATOM_PM_MISCINFO_DYNAMIC_HDP_BLOCK_EN)433		sclk_cntl &= ~FORCE_HDP;434	else435		sclk_cntl |= FORCE_HDP;436 437	WREG32_PLL(SCLK_CNTL, sclk_cntl);438	WREG32_PLL(SCLK_CNTL2, sclk_cntl2);439	WREG32_PLL(SCLK_MORE_CNTL, sclk_more_cntl);440 441	/* set pcie lanes */442	if ((rdev->flags & RADEON_IS_PCIE) &&443	    !(rdev->flags & RADEON_IS_IGP) &&444	    rdev->asic->pm.set_pcie_lanes &&445	    (ps->pcie_lanes !=446	     rdev->pm.power_state[rdev->pm.current_power_state_index].pcie_lanes)) {447		radeon_set_pcie_lanes(rdev,448				      ps->pcie_lanes);449		DRM_DEBUG_DRIVER("Setting: p: %d\n", ps->pcie_lanes);450	}451}452 453/**454 * r100_pm_prepare - pre-power state change callback.455 *456 * @rdev: radeon_device pointer457 *458 * Prepare for a power state change (r1xx-r4xx).459 */460void r100_pm_prepare(struct radeon_device *rdev)461{462	struct drm_device *ddev = rdev_to_drm(rdev);463	struct drm_crtc *crtc;464	struct radeon_crtc *radeon_crtc;465	u32 tmp;466 467	/* disable any active CRTCs */468	list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) {469		radeon_crtc = to_radeon_crtc(crtc);470		if (radeon_crtc->enabled) {471			if (radeon_crtc->crtc_id) {472				tmp = RREG32(RADEON_CRTC2_GEN_CNTL);473				tmp |= RADEON_CRTC2_DISP_REQ_EN_B;474				WREG32(RADEON_CRTC2_GEN_CNTL, tmp);475			} else {476				tmp = RREG32(RADEON_CRTC_GEN_CNTL);477				tmp |= RADEON_CRTC_DISP_REQ_EN_B;478				WREG32(RADEON_CRTC_GEN_CNTL, tmp);479			}480		}481	}482}483 484/**485 * r100_pm_finish - post-power state change callback.486 *487 * @rdev: radeon_device pointer488 *489 * Clean up after a power state change (r1xx-r4xx).490 */491void r100_pm_finish(struct radeon_device *rdev)492{493	struct drm_device *ddev = rdev_to_drm(rdev);494	struct drm_crtc *crtc;495	struct radeon_crtc *radeon_crtc;496	u32 tmp;497 498	/* enable any active CRTCs */499	list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) {500		radeon_crtc = to_radeon_crtc(crtc);501		if (radeon_crtc->enabled) {502			if (radeon_crtc->crtc_id) {503				tmp = RREG32(RADEON_CRTC2_GEN_CNTL);504				tmp &= ~RADEON_CRTC2_DISP_REQ_EN_B;505				WREG32(RADEON_CRTC2_GEN_CNTL, tmp);506			} else {507				tmp = RREG32(RADEON_CRTC_GEN_CNTL);508				tmp &= ~RADEON_CRTC_DISP_REQ_EN_B;509				WREG32(RADEON_CRTC_GEN_CNTL, tmp);510			}511		}512	}513}514 515/**516 * r100_gui_idle - gui idle callback.517 *518 * @rdev: radeon_device pointer519 *520 * Check of the GUI (2D/3D engines) are idle (r1xx-r5xx).521 * Returns true if idle, false if not.522 */523bool r100_gui_idle(struct radeon_device *rdev)524{525	if (RREG32(RADEON_RBBM_STATUS) & RADEON_RBBM_ACTIVE)526		return false;527	else528		return true;529}530 531/* hpd for digital panel detect/disconnect */532/**533 * r100_hpd_sense - hpd sense callback.534 *535 * @rdev: radeon_device pointer536 * @hpd: hpd (hotplug detect) pin537 *538 * Checks if a digital monitor is connected (r1xx-r4xx).539 * Returns true if connected, false if not connected.540 */541bool r100_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd)542{543	bool connected = false;544 545	switch (hpd) {546	case RADEON_HPD_1:547		if (RREG32(RADEON_FP_GEN_CNTL) & RADEON_FP_DETECT_SENSE)548			connected = true;549		break;550	case RADEON_HPD_2:551		if (RREG32(RADEON_FP2_GEN_CNTL) & RADEON_FP2_DETECT_SENSE)552			connected = true;553		break;554	default:555		break;556	}557	return connected;558}559 560/**561 * r100_hpd_set_polarity - hpd set polarity callback.562 *563 * @rdev: radeon_device pointer564 * @hpd: hpd (hotplug detect) pin565 *566 * Set the polarity of the hpd pin (r1xx-r4xx).567 */568void r100_hpd_set_polarity(struct radeon_device *rdev,569			   enum radeon_hpd_id hpd)570{571	u32 tmp;572	bool connected = r100_hpd_sense(rdev, hpd);573 574	switch (hpd) {575	case RADEON_HPD_1:576		tmp = RREG32(RADEON_FP_GEN_CNTL);577		if (connected)578			tmp &= ~RADEON_FP_DETECT_INT_POL;579		else580			tmp |= RADEON_FP_DETECT_INT_POL;581		WREG32(RADEON_FP_GEN_CNTL, tmp);582		break;583	case RADEON_HPD_2:584		tmp = RREG32(RADEON_FP2_GEN_CNTL);585		if (connected)586			tmp &= ~RADEON_FP2_DETECT_INT_POL;587		else588			tmp |= RADEON_FP2_DETECT_INT_POL;589		WREG32(RADEON_FP2_GEN_CNTL, tmp);590		break;591	default:592		break;593	}594}595 596/**597 * r100_hpd_init - hpd setup callback.598 *599 * @rdev: radeon_device pointer600 *601 * Setup the hpd pins used by the card (r1xx-r4xx).602 * Set the polarity, and enable the hpd interrupts.603 */604void r100_hpd_init(struct radeon_device *rdev)605{606	struct drm_device *dev = rdev_to_drm(rdev);607	struct drm_connector *connector;608	unsigned enable = 0;609 610	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {611		struct radeon_connector *radeon_connector = to_radeon_connector(connector);612		if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)613			enable |= 1 << radeon_connector->hpd.hpd;614		radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);615	}616	radeon_irq_kms_enable_hpd(rdev, enable);617}618 619/**620 * r100_hpd_fini - hpd tear down callback.621 *622 * @rdev: radeon_device pointer623 *624 * Tear down the hpd pins used by the card (r1xx-r4xx).625 * Disable the hpd interrupts.626 */627void r100_hpd_fini(struct radeon_device *rdev)628{629	struct drm_device *dev = rdev_to_drm(rdev);630	struct drm_connector *connector;631	unsigned disable = 0;632 633	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {634		struct radeon_connector *radeon_connector = to_radeon_connector(connector);635		if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)636			disable |= 1 << radeon_connector->hpd.hpd;637	}638	radeon_irq_kms_disable_hpd(rdev, disable);639}640 641/*642 * PCI GART643 */644void r100_pci_gart_tlb_flush(struct radeon_device *rdev)645{646	/* TODO: can we do somethings here ? */647	/* It seems hw only cache one entry so we should discard this648	 * entry otherwise if first GPU GART read hit this entry it649	 * could end up in wrong address. */650}651 652int r100_pci_gart_init(struct radeon_device *rdev)653{654	int r;655 656	if (rdev->gart.ptr) {657		WARN(1, "R100 PCI GART already initialized\n");658		return 0;659	}660	/* Initialize common gart structure */661	r = radeon_gart_init(rdev);662	if (r)663		return r;664	rdev->gart.table_size = rdev->gart.num_gpu_pages * 4;665	rdev->asic->gart.tlb_flush = &r100_pci_gart_tlb_flush;666	rdev->asic->gart.get_page_entry = &r100_pci_gart_get_page_entry;667	rdev->asic->gart.set_page = &r100_pci_gart_set_page;668	return radeon_gart_table_ram_alloc(rdev);669}670 671int r100_pci_gart_enable(struct radeon_device *rdev)672{673	uint32_t tmp;674 675	/* discard memory request outside of configured range */676	tmp = RREG32(RADEON_AIC_CNTL) | RADEON_DIS_OUT_OF_PCI_GART_ACCESS;677	WREG32(RADEON_AIC_CNTL, tmp);678	/* set address range for PCI address translate */679	WREG32(RADEON_AIC_LO_ADDR, rdev->mc.gtt_start);680	WREG32(RADEON_AIC_HI_ADDR, rdev->mc.gtt_end);681	/* set PCI GART page-table base address */682	WREG32(RADEON_AIC_PT_BASE, rdev->gart.table_addr);683	tmp = RREG32(RADEON_AIC_CNTL) | RADEON_PCIGART_TRANSLATE_EN;684	WREG32(RADEON_AIC_CNTL, tmp);685	r100_pci_gart_tlb_flush(rdev);686	DRM_INFO("PCI GART of %uM enabled (table at 0x%016llX).\n",687		 (unsigned)(rdev->mc.gtt_size >> 20),688		 (unsigned long long)rdev->gart.table_addr);689	rdev->gart.ready = true;690	return 0;691}692 693void r100_pci_gart_disable(struct radeon_device *rdev)694{695	uint32_t tmp;696 697	/* discard memory request outside of configured range */698	tmp = RREG32(RADEON_AIC_CNTL) | RADEON_DIS_OUT_OF_PCI_GART_ACCESS;699	WREG32(RADEON_AIC_CNTL, tmp & ~RADEON_PCIGART_TRANSLATE_EN);700	WREG32(RADEON_AIC_LO_ADDR, 0);701	WREG32(RADEON_AIC_HI_ADDR, 0);702}703 704uint64_t r100_pci_gart_get_page_entry(uint64_t addr, uint32_t flags)705{706	return addr;707}708 709void r100_pci_gart_set_page(struct radeon_device *rdev, unsigned i,710			    uint64_t entry)711{712	u32 *gtt = rdev->gart.ptr;713	gtt[i] = cpu_to_le32(lower_32_bits(entry));714}715 716void r100_pci_gart_fini(struct radeon_device *rdev)717{718	radeon_gart_fini(rdev);719	r100_pci_gart_disable(rdev);720	radeon_gart_table_ram_free(rdev);721}722 723int r100_irq_set(struct radeon_device *rdev)724{725	uint32_t tmp = 0;726 727	if (!rdev->irq.installed) {728		WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");729		WREG32(R_000040_GEN_INT_CNTL, 0);730		return -EINVAL;731	}732	if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {733		tmp |= RADEON_SW_INT_ENABLE;734	}735	if (rdev->irq.crtc_vblank_int[0] ||736	    atomic_read(&rdev->irq.pflip[0])) {737		tmp |= RADEON_CRTC_VBLANK_MASK;738	}739	if (rdev->irq.crtc_vblank_int[1] ||740	    atomic_read(&rdev->irq.pflip[1])) {741		tmp |= RADEON_CRTC2_VBLANK_MASK;742	}743	if (rdev->irq.hpd[0]) {744		tmp |= RADEON_FP_DETECT_MASK;745	}746	if (rdev->irq.hpd[1]) {747		tmp |= RADEON_FP2_DETECT_MASK;748	}749	WREG32(RADEON_GEN_INT_CNTL, tmp);750 751	/* read back to post the write */752	RREG32(RADEON_GEN_INT_CNTL);753 754	return 0;755}756 757void r100_irq_disable(struct radeon_device *rdev)758{759	u32 tmp;760 761	WREG32(R_000040_GEN_INT_CNTL, 0);762	/* Wait and acknowledge irq */763	mdelay(1);764	tmp = RREG32(R_000044_GEN_INT_STATUS);765	WREG32(R_000044_GEN_INT_STATUS, tmp);766}767 768static uint32_t r100_irq_ack(struct radeon_device *rdev)769{770	uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS);771	uint32_t irq_mask = RADEON_SW_INT_TEST |772		RADEON_CRTC_VBLANK_STAT | RADEON_CRTC2_VBLANK_STAT |773		RADEON_FP_DETECT_STAT | RADEON_FP2_DETECT_STAT;774 775	if (irqs) {776		WREG32(RADEON_GEN_INT_STATUS, irqs);777	}778	return irqs & irq_mask;779}780 781int r100_irq_process(struct radeon_device *rdev)782{783	uint32_t status, msi_rearm;784	bool queue_hotplug = false;785 786	status = r100_irq_ack(rdev);787	if (!status) {788		return IRQ_NONE;789	}790	if (rdev->shutdown) {791		return IRQ_NONE;792	}793	while (status) {794		/* SW interrupt */795		if (status & RADEON_SW_INT_TEST) {796			radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);797		}798		/* Vertical blank interrupts */799		if (status & RADEON_CRTC_VBLANK_STAT) {800			if (rdev->irq.crtc_vblank_int[0]) {801				drm_handle_vblank(rdev_to_drm(rdev), 0);802				rdev->pm.vblank_sync = true;803				wake_up(&rdev->irq.vblank_queue);804			}805			if (atomic_read(&rdev->irq.pflip[0]))806				radeon_crtc_handle_vblank(rdev, 0);807		}808		if (status & RADEON_CRTC2_VBLANK_STAT) {809			if (rdev->irq.crtc_vblank_int[1]) {810				drm_handle_vblank(rdev_to_drm(rdev), 1);811				rdev->pm.vblank_sync = true;812				wake_up(&rdev->irq.vblank_queue);813			}814			if (atomic_read(&rdev->irq.pflip[1]))815				radeon_crtc_handle_vblank(rdev, 1);816		}817		if (status & RADEON_FP_DETECT_STAT) {818			queue_hotplug = true;819			DRM_DEBUG("HPD1\n");820		}821		if (status & RADEON_FP2_DETECT_STAT) {822			queue_hotplug = true;823			DRM_DEBUG("HPD2\n");824		}825		status = r100_irq_ack(rdev);826	}827	if (queue_hotplug)828		schedule_delayed_work(&rdev->hotplug_work, 0);829	if (rdev->msi_enabled) {830		switch (rdev->family) {831		case CHIP_RS400:832		case CHIP_RS480:833			msi_rearm = RREG32(RADEON_AIC_CNTL) & ~RS400_MSI_REARM;834			WREG32(RADEON_AIC_CNTL, msi_rearm);835			WREG32(RADEON_AIC_CNTL, msi_rearm | RS400_MSI_REARM);836			break;837		default:838			WREG32(RADEON_MSI_REARM_EN, RV370_MSI_REARM_EN);839			break;840		}841	}842	return IRQ_HANDLED;843}844 845u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc)846{847	if (crtc == 0)848		return RREG32(RADEON_CRTC_CRNT_FRAME);849	else850		return RREG32(RADEON_CRTC2_CRNT_FRAME);851}852 853/**854 * r100_ring_hdp_flush - flush Host Data Path via the ring buffer855 * @rdev: radeon device structure856 * @ring: ring buffer struct for emitting packets857 */858static void r100_ring_hdp_flush(struct radeon_device *rdev, struct radeon_ring *ring)859{860	radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0));861	radeon_ring_write(ring, rdev->config.r100.hdp_cntl |862				RADEON_HDP_READ_BUFFER_INVALIDATE);863	radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0));864	radeon_ring_write(ring, rdev->config.r100.hdp_cntl);865}866 867/* Who ever call radeon_fence_emit should call ring_lock and ask868 * for enough space (today caller are ib schedule and buffer move) */869void r100_fence_ring_emit(struct radeon_device *rdev,870			  struct radeon_fence *fence)871{872	struct radeon_ring *ring = &rdev->ring[fence->ring];873 874	/* We have to make sure that caches are flushed before875	 * CPU might read something from VRAM. */876	radeon_ring_write(ring, PACKET0(RADEON_RB3D_DSTCACHE_CTLSTAT, 0));877	radeon_ring_write(ring, RADEON_RB3D_DC_FLUSH_ALL);878	radeon_ring_write(ring, PACKET0(RADEON_RB3D_ZCACHE_CTLSTAT, 0));879	radeon_ring_write(ring, RADEON_RB3D_ZC_FLUSH_ALL);880	/* Wait until IDLE & CLEAN */881	radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0));882	radeon_ring_write(ring, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN);883	r100_ring_hdp_flush(rdev, ring);884	/* Emit fence sequence & fire IRQ */885	radeon_ring_write(ring, PACKET0(rdev->fence_drv[fence->ring].scratch_reg, 0));886	radeon_ring_write(ring, fence->seq);887	radeon_ring_write(ring, PACKET0(RADEON_GEN_INT_STATUS, 0));888	radeon_ring_write(ring, RADEON_SW_INT_FIRE);889}890 891bool r100_semaphore_ring_emit(struct radeon_device *rdev,892			      struct radeon_ring *ring,893			      struct radeon_semaphore *semaphore,894			      bool emit_wait)895{896	/* Unused on older asics, since we don't have semaphores or multiple rings */897	BUG();898	return false;899}900 901struct radeon_fence *r100_copy_blit(struct radeon_device *rdev,902				    uint64_t src_offset,903				    uint64_t dst_offset,904				    unsigned num_gpu_pages,905				    struct dma_resv *resv)906{907	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];908	struct radeon_fence *fence;909	uint32_t cur_pages;910	uint32_t stride_bytes = RADEON_GPU_PAGE_SIZE;911	uint32_t pitch;912	uint32_t stride_pixels;913	unsigned ndw;914	int num_loops;915	int r = 0;916 917	/* radeon limited to 16k stride */918	stride_bytes &= 0x3fff;919	/* radeon pitch is /64 */920	pitch = stride_bytes / 64;921	stride_pixels = stride_bytes / 4;922	num_loops = DIV_ROUND_UP(num_gpu_pages, 8191);923 924	/* Ask for enough room for blit + flush + fence */925	ndw = 64 + (10 * num_loops);926	r = radeon_ring_lock(rdev, ring, ndw);927	if (r) {928		DRM_ERROR("radeon: moving bo (%d) asking for %u dw.\n", r, ndw);929		return ERR_PTR(-EINVAL);930	}931	while (num_gpu_pages > 0) {932		cur_pages = num_gpu_pages;933		if (cur_pages > 8191) {934			cur_pages = 8191;935		}936		num_gpu_pages -= cur_pages;937 938		/* pages are in Y direction - height939		   page width in X direction - width */940		radeon_ring_write(ring, PACKET3(PACKET3_BITBLT_MULTI, 8));941		radeon_ring_write(ring,942				  RADEON_GMC_SRC_PITCH_OFFSET_CNTL |943				  RADEON_GMC_DST_PITCH_OFFSET_CNTL |944				  RADEON_GMC_SRC_CLIPPING |945				  RADEON_GMC_DST_CLIPPING |946				  RADEON_GMC_BRUSH_NONE |947				  (RADEON_COLOR_FORMAT_ARGB8888 << 8) |948				  RADEON_GMC_SRC_DATATYPE_COLOR |949				  RADEON_ROP3_S |950				  RADEON_DP_SRC_SOURCE_MEMORY |951				  RADEON_GMC_CLR_CMP_CNTL_DIS |952				  RADEON_GMC_WR_MSK_DIS);953		radeon_ring_write(ring, (pitch << 22) | (src_offset >> 10));954		radeon_ring_write(ring, (pitch << 22) | (dst_offset >> 10));955		radeon_ring_write(ring, (0x1fff) | (0x1fff << 16));956		radeon_ring_write(ring, 0);957		radeon_ring_write(ring, (0x1fff) | (0x1fff << 16));958		radeon_ring_write(ring, num_gpu_pages);959		radeon_ring_write(ring, num_gpu_pages);960		radeon_ring_write(ring, cur_pages | (stride_pixels << 16));961	}962	radeon_ring_write(ring, PACKET0(RADEON_DSTCACHE_CTLSTAT, 0));963	radeon_ring_write(ring, RADEON_RB2D_DC_FLUSH_ALL);964	radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0));965	radeon_ring_write(ring,966			  RADEON_WAIT_2D_IDLECLEAN |967			  RADEON_WAIT_HOST_IDLECLEAN |968			  RADEON_WAIT_DMA_GUI_IDLE);969	r = radeon_fence_emit(rdev, &fence, RADEON_RING_TYPE_GFX_INDEX);970	if (r) {971		radeon_ring_unlock_undo(rdev, ring);972		return ERR_PTR(r);973	}974	radeon_ring_unlock_commit(rdev, ring, false);975	return fence;976}977 978static int r100_cp_wait_for_idle(struct radeon_device *rdev)979{980	unsigned i;981	u32 tmp;982 983	for (i = 0; i < rdev->usec_timeout; i++) {984		tmp = RREG32(R_000E40_RBBM_STATUS);985		if (!G_000E40_CP_CMDSTRM_BUSY(tmp)) {986			return 0;987		}988		udelay(1);989	}990	return -1;991}992 993void r100_ring_start(struct radeon_device *rdev, struct radeon_ring *ring)994{995	int r;996 997	r = radeon_ring_lock(rdev, ring, 2);998	if (r) {999		return;1000	}1001	radeon_ring_write(ring, PACKET0(RADEON_ISYNC_CNTL, 0));1002	radeon_ring_write(ring,1003			  RADEON_ISYNC_ANY2D_IDLE3D |1004			  RADEON_ISYNC_ANY3D_IDLE2D |1005			  RADEON_ISYNC_WAIT_IDLEGUI |1006			  RADEON_ISYNC_CPSCRATCH_IDLEGUI);1007	radeon_ring_unlock_commit(rdev, ring, false);1008}1009 1010 1011/* Load the microcode for the CP */1012static int r100_cp_init_microcode(struct radeon_device *rdev)1013{1014	const char *fw_name = NULL;1015	int err;1016 1017	DRM_DEBUG_KMS("\n");1018 1019	switch (rdev->family) {1020	case CHIP_R100:1021	case CHIP_RV100:1022	case CHIP_RV200:1023	case CHIP_RS100:1024	case CHIP_RS200:1025		DRM_INFO("Loading R100 Microcode\n");1026		fw_name = FIRMWARE_R100;1027		break;1028 1029	case CHIP_R200:1030	case CHIP_RV250:1031	case CHIP_RV280:1032	case CHIP_RS300:1033		DRM_INFO("Loading R200 Microcode\n");1034		fw_name = FIRMWARE_R200;1035		break;1036 1037	case CHIP_R300:1038	case CHIP_R350:1039	case CHIP_RV350:1040	case CHIP_RV380:1041	case CHIP_RS400:1042	case CHIP_RS480:1043		DRM_INFO("Loading R300 Microcode\n");1044		fw_name = FIRMWARE_R300;1045		break;1046 1047	case CHIP_R420:1048	case CHIP_R423:1049	case CHIP_RV410:1050		DRM_INFO("Loading R400 Microcode\n");1051		fw_name = FIRMWARE_R420;1052		break;1053 1054	case CHIP_RS690:1055	case CHIP_RS740:1056		DRM_INFO("Loading RS690/RS740 Microcode\n");1057		fw_name = FIRMWARE_RS690;1058		break;1059 1060	case CHIP_RS600:1061		DRM_INFO("Loading RS600 Microcode\n");1062		fw_name = FIRMWARE_RS600;1063		break;1064 1065	case CHIP_RV515:1066	case CHIP_R520:1067	case CHIP_RV530:1068	case CHIP_R580:1069	case CHIP_RV560:1070	case CHIP_RV570:1071		DRM_INFO("Loading R500 Microcode\n");1072		fw_name = FIRMWARE_R520;1073		break;1074 1075	default:1076		DRM_ERROR("Unsupported Radeon family %u\n", rdev->family);1077		return -EINVAL;1078	}1079 1080	err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);1081	if (err) {1082		pr_err("radeon_cp: Failed to load firmware \"%s\"\n", fw_name);1083	} else if (rdev->me_fw->size % 8) {1084		pr_err("radeon_cp: Bogus length %zu in firmware \"%s\"\n",1085		       rdev->me_fw->size, fw_name);1086		err = -EINVAL;1087		release_firmware(rdev->me_fw);1088		rdev->me_fw = NULL;1089	}1090	return err;1091}1092 1093u32 r100_gfx_get_rptr(struct radeon_device *rdev,1094		      struct radeon_ring *ring)1095{1096	u32 rptr;1097 1098	if (rdev->wb.enabled)1099		rptr = le32_to_cpu(rdev->wb.wb[ring->rptr_offs/4]);1100	else1101		rptr = RREG32(RADEON_CP_RB_RPTR);1102 1103	return rptr;1104}1105 1106u32 r100_gfx_get_wptr(struct radeon_device *rdev,1107		      struct radeon_ring *ring)1108{1109	return RREG32(RADEON_CP_RB_WPTR);1110}1111 1112void r100_gfx_set_wptr(struct radeon_device *rdev,1113		       struct radeon_ring *ring)1114{1115	WREG32(RADEON_CP_RB_WPTR, ring->wptr);1116	(void)RREG32(RADEON_CP_RB_WPTR);1117}1118 1119static void r100_cp_load_microcode(struct radeon_device *rdev)1120{1121	const __be32 *fw_data;1122	int i, size;1123 1124	if (r100_gui_wait_for_idle(rdev)) {1125		pr_warn("Failed to wait GUI idle while programming pipes. Bad things might happen.\n");1126	}1127 1128	if (rdev->me_fw) {1129		size = rdev->me_fw->size / 4;1130		fw_data = (const __be32 *)&rdev->me_fw->data[0];1131		WREG32(RADEON_CP_ME_RAM_ADDR, 0);1132		for (i = 0; i < size; i += 2) {1133			WREG32(RADEON_CP_ME_RAM_DATAH,1134			       be32_to_cpup(&fw_data[i]));1135			WREG32(RADEON_CP_ME_RAM_DATAL,1136			       be32_to_cpup(&fw_data[i + 1]));1137		}1138	}1139}1140 1141int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)1142{1143	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];1144	unsigned rb_bufsz;1145	unsigned rb_blksz;1146	unsigned max_fetch;1147	unsigned pre_write_timer;1148	unsigned pre_write_limit;1149	unsigned indirect2_start;1150	unsigned indirect1_start;1151	uint32_t tmp;1152	int r;1153 1154	r100_debugfs_cp_init(rdev);1155	if (!rdev->me_fw) {1156		r = r100_cp_init_microcode(rdev);1157		if (r) {1158			DRM_ERROR("Failed to load firmware!\n");1159			return r;1160		}1161	}1162 1163	/* Align ring size */1164	rb_bufsz = order_base_2(ring_size / 8);1165	ring_size = (1 << (rb_bufsz + 1)) * 4;1166	r100_cp_load_microcode(rdev);1167	r = radeon_ring_init(rdev, ring, ring_size, RADEON_WB_CP_RPTR_OFFSET,1168			     RADEON_CP_PACKET2);1169	if (r) {1170		return r;1171	}1172	/* Each time the cp read 1024 bytes (16 dword/quadword) update1173	 * the rptr copy in system ram */1174	rb_blksz = 9;1175	/* cp will read 128bytes at a time (4 dwords) */1176	max_fetch = 1;1177	ring->align_mask = 16 - 1;1178	/* Write to CP_RB_WPTR will be delayed for pre_write_timer clocks */1179	pre_write_timer = 64;1180	/* Force CP_RB_WPTR write if written more than one time before the1181	 * delay expire1182	 */1183	pre_write_limit = 0;1184	/* Setup the cp cache like this (cache size is 96 dwords) :1185	 *	RING		0  to 151186	 *	INDIRECT1	16 to 791187	 *	INDIRECT2	80 to 951188	 * So ring cache size is 16dwords (> (2 * max_fetch = 2 * 4dwords))1189	 *    indirect1 cache size is 64dwords (> (2 * max_fetch = 2 * 4dwords))1190	 *    indirect2 cache size is 16dwords (> (2 * max_fetch = 2 * 4dwords))1191	 * Idea being that most of the gpu cmd will be through indirect1 buffer1192	 * so it gets the bigger cache.1193	 */1194	indirect2_start = 80;1195	indirect1_start = 16;1196	/* cp setup */1197	WREG32(0x718, pre_write_timer | (pre_write_limit << 28));1198	tmp = (REG_SET(RADEON_RB_BUFSZ, rb_bufsz) |1199	       REG_SET(RADEON_RB_BLKSZ, rb_blksz) |1200	       REG_SET(RADEON_MAX_FETCH, max_fetch));1201#ifdef __BIG_ENDIAN1202	tmp |= RADEON_BUF_SWAP_32BIT;1203#endif1204	WREG32(RADEON_CP_RB_CNTL, tmp | RADEON_RB_NO_UPDATE);1205 1206	/* Set ring address */1207	DRM_INFO("radeon: ring at 0x%016lX\n", (unsigned long)ring->gpu_addr);1208	WREG32(RADEON_CP_RB_BASE, ring->gpu_addr);1209	/* Force read & write ptr to 0 */1210	WREG32(RADEON_CP_RB_CNTL, tmp | RADEON_RB_RPTR_WR_ENA | RADEON_RB_NO_UPDATE);1211	WREG32(RADEON_CP_RB_RPTR_WR, 0);1212	ring->wptr = 0;1213	WREG32(RADEON_CP_RB_WPTR, ring->wptr);1214 1215	/* set the wb address whether it's enabled or not */1216	WREG32(R_00070C_CP_RB_RPTR_ADDR,1217		S_00070C_RB_RPTR_ADDR((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) >> 2));1218	WREG32(R_000774_SCRATCH_ADDR, rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET);1219 1220	if (rdev->wb.enabled)1221		WREG32(R_000770_SCRATCH_UMSK, 0xff);1222	else {1223		tmp |= RADEON_RB_NO_UPDATE;1224		WREG32(R_000770_SCRATCH_UMSK, 0);1225	}1226 1227	WREG32(RADEON_CP_RB_CNTL, tmp);1228	udelay(10);1229	/* Set cp mode to bus mastering & enable cp*/1230	WREG32(RADEON_CP_CSQ_MODE,1231	       REG_SET(RADEON_INDIRECT2_START, indirect2_start) |1232	       REG_SET(RADEON_INDIRECT1_START, indirect1_start));1233	WREG32(RADEON_CP_RB_WPTR_DELAY, 0);1234	WREG32(RADEON_CP_CSQ_MODE, 0x00004D4D);1235	WREG32(RADEON_CP_CSQ_CNTL, RADEON_CSQ_PRIBM_INDBM);1236 1237	/* at this point everything should be setup correctly to enable master */1238	pci_set_master(rdev->pdev);1239 1240	radeon_ring_start(rdev, RADEON_RING_TYPE_GFX_INDEX, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);1241	r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring);1242	if (r) {1243		DRM_ERROR("radeon: cp isn't working (%d).\n", r);1244		return r;1245	}1246	ring->ready = true;1247	radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);1248 1249	if (!ring->rptr_save_reg /* not resuming from suspend */1250	    && radeon_ring_supports_scratch_reg(rdev, ring)) {1251		r = radeon_scratch_get(rdev, &ring->rptr_save_reg);1252		if (r) {1253			DRM_ERROR("failed to get scratch reg for rptr save (%d).\n", r);1254			ring->rptr_save_reg = 0;1255		}1256	}1257	return 0;1258}1259 1260void r100_cp_fini(struct radeon_device *rdev)1261{1262	if (r100_cp_wait_for_idle(rdev)) {1263		DRM_ERROR("Wait for CP idle timeout, shutting down CP.\n");1264	}1265	/* Disable ring */1266	r100_cp_disable(rdev);1267	radeon_scratch_free(rdev, rdev->ring[RADEON_RING_TYPE_GFX_INDEX].rptr_save_reg);1268	radeon_ring_fini(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]);1269	DRM_INFO("radeon: cp finalized\n");1270}1271 1272void r100_cp_disable(struct radeon_device *rdev)1273{1274	/* Disable ring */1275	radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);1276	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;1277	WREG32(RADEON_CP_CSQ_MODE, 0);1278	WREG32(RADEON_CP_CSQ_CNTL, 0);1279	WREG32(R_000770_SCRATCH_UMSK, 0);1280	if (r100_gui_wait_for_idle(rdev)) {1281		pr_warn("Failed to wait GUI idle while programming pipes. Bad things might happen.\n");1282	}1283}1284 1285/*1286 * CS functions1287 */1288int r100_reloc_pitch_offset(struct radeon_cs_parser *p,1289			    struct radeon_cs_packet *pkt,1290			    unsigned idx,1291			    unsigned reg)1292{1293	int r;1294	u32 tile_flags = 0;1295	u32 tmp;1296	struct radeon_bo_list *reloc;1297	u32 value;1298 1299	r = radeon_cs_packet_next_reloc(p, &reloc, 0);1300	if (r) {1301		DRM_ERROR("No reloc for ib[%d]=0x%04X\n",1302			  idx, reg);1303		radeon_cs_dump_packet(p, pkt);1304		return r;1305	}1306 1307	value = radeon_get_ib_value(p, idx);1308	tmp = value & 0x003fffff;1309	tmp += (((u32)reloc->gpu_offset) >> 10);1310 1311	if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) {1312		if (reloc->tiling_flags & RADEON_TILING_MACRO)1313			tile_flags |= RADEON_DST_TILE_MACRO;1314		if (reloc->tiling_flags & RADEON_TILING_MICRO) {1315			if (reg == RADEON_SRC_PITCH_OFFSET) {1316				DRM_ERROR("Cannot src blit from microtiled surface\n");1317				radeon_cs_dump_packet(p, pkt);1318				return -EINVAL;1319			}1320			tile_flags |= RADEON_DST_TILE_MICRO;1321		}1322 1323		tmp |= tile_flags;1324		p->ib.ptr[idx] = (value & 0x3fc00000) | tmp;1325	} else1326		p->ib.ptr[idx] = (value & 0xffc00000) | tmp;1327	return 0;1328}1329 1330int r100_packet3_load_vbpntr(struct radeon_cs_parser *p,1331			     struct radeon_cs_packet *pkt,1332			     int idx)1333{1334	unsigned c, i;1335	struct radeon_bo_list *reloc;1336	struct r100_cs_track *track;1337	int r = 0;1338	volatile uint32_t *ib;1339	u32 idx_value;1340 1341	ib = p->ib.ptr;1342	track = (struct r100_cs_track *)p->track;1343	c = radeon_get_ib_value(p, idx++) & 0x1F;1344	if (c > 16) {1345	    DRM_ERROR("Only 16 vertex buffers are allowed %d\n",1346		      pkt->opcode);1347	    radeon_cs_dump_packet(p, pkt);1348	    return -EINVAL;1349	}1350	track->num_arrays = c;1351	for (i = 0; i < (c - 1); i += 2, idx += 3) {1352		r = radeon_cs_packet_next_reloc(p, &reloc, 0);1353		if (r) {1354			DRM_ERROR("No reloc for packet3 %d\n",1355				  pkt->opcode);1356			radeon_cs_dump_packet(p, pkt);1357			return r;1358		}1359		idx_value = radeon_get_ib_value(p, idx);1360		ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->gpu_offset);1361 1362		track->arrays[i + 0].esize = idx_value >> 8;1363		track->arrays[i + 0].robj = reloc->robj;1364		track->arrays[i + 0].esize &= 0x7F;1365		r = radeon_cs_packet_next_reloc(p, &reloc, 0);1366		if (r) {1367			DRM_ERROR("No reloc for packet3 %d\n",1368				  pkt->opcode);1369			radeon_cs_dump_packet(p, pkt);1370			return r;1371		}1372		ib[idx+2] = radeon_get_ib_value(p, idx + 2) + ((u32)reloc->gpu_offset);1373		track->arrays[i + 1].robj = reloc->robj;1374		track->arrays[i + 1].esize = idx_value >> 24;1375		track->arrays[i + 1].esize &= 0x7F;1376	}1377	if (c & 1) {1378		r = radeon_cs_packet_next_reloc(p, &reloc, 0);1379		if (r) {1380			DRM_ERROR("No reloc for packet3 %d\n",1381					  pkt->opcode);1382			radeon_cs_dump_packet(p, pkt);1383			return r;1384		}1385		idx_value = radeon_get_ib_value(p, idx);1386		ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->gpu_offset);1387		track->arrays[i + 0].robj = reloc->robj;1388		track->arrays[i + 0].esize = idx_value >> 8;1389		track->arrays[i + 0].esize &= 0x7F;1390	}1391	return r;1392}1393 1394int r100_cs_parse_packet0(struct radeon_cs_parser *p,1395			  struct radeon_cs_packet *pkt,1396			  const unsigned *auth, unsigned n,1397			  radeon_packet0_check_t check)1398{1399	unsigned reg;1400	unsigned i, j, m;1401	unsigned idx;1402	int r;1403 1404	idx = pkt->idx + 1;1405	reg = pkt->reg;1406	/* Check that register fall into register range1407	 * determined by the number of entry (n) in the1408	 * safe register bitmap.1409	 */1410	if (pkt->one_reg_wr) {1411		if ((reg >> 7) > n) {1412			return -EINVAL;1413		}1414	} else {1415		if (((reg + (pkt->count << 2)) >> 7) > n) {1416			return -EINVAL;1417		}1418	}1419	for (i = 0; i <= pkt->count; i++, idx++) {1420		j = (reg >> 7);1421		m = 1 << ((reg >> 2) & 31);1422		if (auth[j] & m) {1423			r = check(p, pkt, idx, reg);1424			if (r) {1425				return r;1426			}1427		}1428		if (pkt->one_reg_wr) {1429			if (!(auth[j] & m)) {1430				break;1431			}1432		} else {1433			reg += 4;1434		}1435	}1436	return 0;1437}1438 1439/**1440 * r100_cs_packet_parse_vline() - parse userspace VLINE packet1441 * @p:		parser structure holding parsing context.1442 *1443 * Userspace sends a special sequence for VLINE waits.1444 * PACKET0 - VLINE_START_END + value1445 * PACKET0 - WAIT_UNTIL +_value1446 * RELOC (P3) - crtc_id in reloc.1447 *1448 * This function parses this and relocates the VLINE START END1449 * and WAIT UNTIL packets to the correct crtc.1450 * It also detects a switched off crtc and nulls out the1451 * wait in that case.1452 */1453int r100_cs_packet_parse_vline(struct radeon_cs_parser *p)1454{1455	struct drm_crtc *crtc;1456	struct radeon_crtc *radeon_crtc;1457	struct radeon_cs_packet p3reloc, waitreloc;1458	int crtc_id;1459	int r;1460	uint32_t header, h_idx, reg;1461	volatile uint32_t *ib;1462 1463	ib = p->ib.ptr;1464 1465	/* parse the wait until */1466	r = radeon_cs_packet_parse(p, &waitreloc, p->idx);1467	if (r)1468		return r;1469 1470	/* check its a wait until and only 1 count */1471	if (waitreloc.reg != RADEON_WAIT_UNTIL ||1472	    waitreloc.count != 0) {1473		DRM_ERROR("vline wait had illegal wait until segment\n");1474		return -EINVAL;1475	}1476 1477	if (radeon_get_ib_value(p, waitreloc.idx + 1) != RADEON_WAIT_CRTC_VLINE) {1478		DRM_ERROR("vline wait had illegal wait until\n");1479		return -EINVAL;1480	}1481 1482	/* jump over the NOP */1483	r = radeon_cs_packet_parse(p, &p3reloc, p->idx + waitreloc.count + 2);1484	if (r)1485		return r;1486 1487	h_idx = p->idx - 2;1488	p->idx += waitreloc.count + 2;1489	p->idx += p3reloc.count + 2;1490 1491	header = radeon_get_ib_value(p, h_idx);1492	crtc_id = radeon_get_ib_value(p, h_idx + 5);1493	reg = R100_CP_PACKET0_GET_REG(header);1494	crtc = drm_crtc_find(rdev_to_drm(p->rdev), p->filp, crtc_id);1495	if (!crtc) {1496		DRM_ERROR("cannot find crtc %d\n", crtc_id);1497		return -ENOENT;1498	}1499	radeon_crtc = to_radeon_crtc(crtc);1500	crtc_id = radeon_crtc->crtc_id;1501 1502	if (!crtc->enabled) {1503		/* if the CRTC isn't enabled - we need to nop out the wait until */1504		ib[h_idx + 2] = PACKET2(0);1505		ib[h_idx + 3] = PACKET2(0);1506	} else if (crtc_id == 1) {1507		switch (reg) {1508		case AVIVO_D1MODE_VLINE_START_END:1509			header &= ~R300_CP_PACKET0_REG_MASK;1510			header |= AVIVO_D2MODE_VLINE_START_END >> 2;1511			break;1512		case RADEON_CRTC_GUI_TRIG_VLINE:1513			header &= ~R300_CP_PACKET0_REG_MASK;1514			header |= RADEON_CRTC2_GUI_TRIG_VLINE >> 2;1515			break;1516		default:1517			DRM_ERROR("unknown crtc reloc\n");1518			return -EINVAL;1519		}1520		ib[h_idx] = header;1521		ib[h_idx + 3] |= RADEON_ENG_DISPLAY_SELECT_CRTC1;1522	}1523 1524	return 0;1525}1526 1527static int r100_get_vtx_size(uint32_t vtx_fmt)1528{1529	int vtx_size;1530	vtx_size = 2;1531	/* ordered according to bits in spec */1532	if (vtx_fmt & RADEON_SE_VTX_FMT_W0)1533		vtx_size++;1534	if (vtx_fmt & RADEON_SE_VTX_FMT_FPCOLOR)1535		vtx_size += 3;1536	if (vtx_fmt & RADEON_SE_VTX_FMT_FPALPHA)1537		vtx_size++;1538	if (vtx_fmt & RADEON_SE_VTX_FMT_PKCOLOR)1539		vtx_size++;1540	if (vtx_fmt & RADEON_SE_VTX_FMT_FPSPEC)1541		vtx_size += 3;1542	if (vtx_fmt & RADEON_SE_VTX_FMT_FPFOG)1543		vtx_size++;1544	if (vtx_fmt & RADEON_SE_VTX_FMT_PKSPEC)1545		vtx_size++;1546	if (vtx_fmt & RADEON_SE_VTX_FMT_ST0)1547		vtx_size += 2;1548	if (vtx_fmt & RADEON_SE_VTX_FMT_ST1)1549		vtx_size += 2;1550	if (vtx_fmt & RADEON_SE_VTX_FMT_Q1)1551		vtx_size++;1552	if (vtx_fmt & RADEON_SE_VTX_FMT_ST2)1553		vtx_size += 2;1554	if (vtx_fmt & RADEON_SE_VTX_FMT_Q2)1555		vtx_size++;1556	if (vtx_fmt & RADEON_SE_VTX_FMT_ST3)1557		vtx_size += 2;1558	if (vtx_fmt & RADEON_SE_VTX_FMT_Q3)1559		vtx_size++;1560	if (vtx_fmt & RADEON_SE_VTX_FMT_Q0)1561		vtx_size++;1562	/* blend weight */1563	if (vtx_fmt & (0x7 << 15))1564		vtx_size += (vtx_fmt >> 15) & 0x7;1565	if (vtx_fmt & RADEON_SE_VTX_FMT_N0)1566		vtx_size += 3;1567	if (vtx_fmt & RADEON_SE_VTX_FMT_XY1)1568		vtx_size += 2;1569	if (vtx_fmt & RADEON_SE_VTX_FMT_Z1)1570		vtx_size++;1571	if (vtx_fmt & RADEON_SE_VTX_FMT_W1)1572		vtx_size++;1573	if (vtx_fmt & RADEON_SE_VTX_FMT_N1)1574		vtx_size++;1575	if (vtx_fmt & RADEON_SE_VTX_FMT_Z)1576		vtx_size++;1577	return vtx_size;1578}1579 1580static int r100_packet0_check(struct radeon_cs_parser *p,1581			      struct radeon_cs_packet *pkt,1582			      unsigned idx, unsigned reg)1583{1584	struct radeon_bo_list *reloc;1585	struct r100_cs_track *track;1586	volatile uint32_t *ib;1587	uint32_t tmp;1588	int r;1589	int i, face;1590	u32 tile_flags = 0;1591	u32 idx_value;1592 1593	ib = p->ib.ptr;1594	track = (struct r100_cs_track *)p->track;1595 1596	idx_value = radeon_get_ib_value(p, idx);1597 1598	switch (reg) {1599	case RADEON_CRTC_GUI_TRIG_VLINE:1600		r = r100_cs_packet_parse_vline(p);1601		if (r) {1602			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",1603				  idx, reg);1604			radeon_cs_dump_packet(p, pkt);1605			return r;1606		}1607		break;1608		/* FIXME: only allow PACKET3 blit? easier to check for out of1609		 * range access */1610	case RADEON_DST_PITCH_OFFSET:1611	case RADEON_SRC_PITCH_OFFSET:1612		r = r100_reloc_pitch_offset(p, pkt, idx, reg);1613		if (r)1614			return r;1615		break;1616	case RADEON_RB3D_DEPTHOFFSET:1617		r = radeon_cs_packet_next_reloc(p, &reloc, 0);1618		if (r) {1619			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",1620				  idx, reg);1621			radeon_cs_dump_packet(p, pkt);1622			return r;1623		}1624		track->zb.robj = reloc->robj;1625		track->zb.offset = idx_value;1626		track->zb_dirty = true;1627		ib[idx] = idx_value + ((u32)reloc->gpu_offset);1628		break;1629	case RADEON_RB3D_COLOROFFSET:1630		r = radeon_cs_packet_next_reloc(p, &reloc, 0);1631		if (r) {1632			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",1633				  idx, reg);1634			radeon_cs_dump_packet(p, pkt);1635			return r;1636		}1637		track->cb[0].robj = reloc->robj;1638		track->cb[0].offset = idx_value;1639		track->cb_dirty = true;1640		ib[idx] = idx_value + ((u32)reloc->gpu_offset);1641		break;1642	case RADEON_PP_TXOFFSET_0:1643	case RADEON_PP_TXOFFSET_1:1644	case RADEON_PP_TXOFFSET_2:1645		i = (reg - RADEON_PP_TXOFFSET_0) / 24;1646		r = radeon_cs_packet_next_reloc(p, &reloc, 0);1647		if (r) {1648			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",1649				  idx, reg);1650			radeon_cs_dump_packet(p, pkt);1651			return r;1652		}1653		if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) {1654			if (reloc->tiling_flags & RADEON_TILING_MACRO)1655				tile_flags |= RADEON_TXO_MACRO_TILE;1656			if (reloc->tiling_flags & RADEON_TILING_MICRO)1657				tile_flags |= RADEON_TXO_MICRO_TILE_X2;1658 1659			tmp = idx_value & ~(0x7 << 2);1660			tmp |= tile_flags;1661			ib[idx] = tmp + ((u32)reloc->gpu_offset);1662		} else1663			ib[idx] = idx_value + ((u32)reloc->gpu_offset);1664		track->textures[i].robj = reloc->robj;1665		track->tex_dirty = true;1666		break;1667	case RADEON_PP_CUBIC_OFFSET_T0_0:1668	case RADEON_PP_CUBIC_OFFSET_T0_1:1669	case RADEON_PP_CUBIC_OFFSET_T0_2:1670	case RADEON_PP_CUBIC_OFFSET_T0_3:1671	case RADEON_PP_CUBIC_OFFSET_T0_4:1672		i = (reg - RADEON_PP_CUBIC_OFFSET_T0_0) / 4;1673		r = radeon_cs_packet_next_reloc(p, &reloc, 0);1674		if (r) {1675			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",1676				  idx, reg);1677			radeon_cs_dump_packet(p, pkt);1678			return r;1679		}1680		track->textures[0].cube_info[i].offset = idx_value;1681		ib[idx] = idx_value + ((u32)reloc->gpu_offset);1682		track->textures[0].cube_info[i].robj = reloc->robj;1683		track->tex_dirty = true;1684		break;1685	case RADEON_PP_CUBIC_OFFSET_T1_0:1686	case RADEON_PP_CUBIC_OFFSET_T1_1:1687	case RADEON_PP_CUBIC_OFFSET_T1_2:1688	case RADEON_PP_CUBIC_OFFSET_T1_3:1689	case RADEON_PP_CUBIC_OFFSET_T1_4:1690		i = (reg - RADEON_PP_CUBIC_OFFSET_T1_0) / 4;1691		r = radeon_cs_packet_next_reloc(p, &reloc, 0);1692		if (r) {1693			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",1694				  idx, reg);1695			radeon_cs_dump_packet(p, pkt);1696			return r;1697		}1698		track->textures[1].cube_info[i].offset = idx_value;1699		ib[idx] = idx_value + ((u32)reloc->gpu_offset);1700		track->textures[1].cube_info[i].robj = reloc->robj;1701		track->tex_dirty = true;1702		break;1703	case RADEON_PP_CUBIC_OFFSET_T2_0:1704	case RADEON_PP_CUBIC_OFFSET_T2_1:1705	case RADEON_PP_CUBIC_OFFSET_T2_2:1706	case RADEON_PP_CUBIC_OFFSET_T2_3:1707	case RADEON_PP_CUBIC_OFFSET_T2_4:1708		i = (reg - RADEON_PP_CUBIC_OFFSET_T2_0) / 4;1709		r = radeon_cs_packet_next_reloc(p, &reloc, 0);1710		if (r) {1711			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",1712				  idx, reg);1713			radeon_cs_dump_packet(p, pkt);1714			return r;1715		}1716		track->textures[2].cube_info[i].offset = idx_value;1717		ib[idx] = idx_value + ((u32)reloc->gpu_offset);1718		track->textures[2].cube_info[i].robj = reloc->robj;1719		track->tex_dirty = true;1720		break;1721	case RADEON_RE_WIDTH_HEIGHT:1722		track->maxy = ((idx_value >> 16) & 0x7FF);1723		track->cb_dirty = true;1724		track->zb_dirty = true;1725		break;1726	case RADEON_RB3D_COLORPITCH:1727		r = radeon_cs_packet_next_reloc(p, &reloc, 0);1728		if (r) {1729			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",1730				  idx, reg);1731			radeon_cs_dump_packet(p, pkt);1732			return r;1733		}1734		if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) {1735			if (reloc->tiling_flags & RADEON_TILING_MACRO)1736				tile_flags |= RADEON_COLOR_TILE_ENABLE;1737			if (reloc->tiling_flags & RADEON_TILING_MICRO)1738				tile_flags |= RADEON_COLOR_MICROTILE_ENABLE;1739 1740			tmp = idx_value & ~(0x7 << 16);1741			tmp |= tile_flags;1742			ib[idx] = tmp;1743		} else1744			ib[idx] = idx_value;1745 1746		track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK;1747		track->cb_dirty = true;1748		break;1749	case RADEON_RB3D_DEPTHPITCH:1750		track->zb.pitch = idx_value & RADEON_DEPTHPITCH_MASK;1751		track->zb_dirty = true;1752		break;1753	case RADEON_RB3D_CNTL:1754		switch ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f) {1755		case 7:1756		case 8:1757		case 9:1758		case 11:1759		case 12:1760			track->cb[0].cpp = 1;1761			break;1762		case 3:1763		case 4:1764		case 15:1765			track->cb[0].cpp = 2;1766			break;1767		case 6:1768			track->cb[0].cpp = 4;1769			break;1770		default:1771			DRM_ERROR("Invalid color buffer format (%d) !\n",1772				  ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f));1773			return -EINVAL;1774		}1775		track->z_enabled = !!(idx_value & RADEON_Z_ENABLE);1776		track->cb_dirty = true;1777		track->zb_dirty = true;1778		break;1779	case RADEON_RB3D_ZSTENCILCNTL:1780		switch (idx_value & 0xf) {1781		case 0:1782			track->zb.cpp = 2;1783			break;1784		case 2:1785		case 3:1786		case 4:1787		case 5:1788		case 9:1789		case 11:1790			track->zb.cpp = 4;1791			break;1792		default:1793			break;1794		}1795		track->zb_dirty = true;1796		break;1797	case RADEON_RB3D_ZPASS_ADDR:1798		r = radeon_cs_packet_next_reloc(p, &reloc, 0);1799		if (r) {1800			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",1801				  idx, reg);1802			radeon_cs_dump_packet(p, pkt);1803			return r;1804		}1805		ib[idx] = idx_value + ((u32)reloc->gpu_offset);1806		break;1807	case RADEON_PP_CNTL:1808		{1809			uint32_t temp = idx_value >> 4;1810			for (i = 0; i < track->num_texture; i++)1811				track->textures[i].enabled = !!(temp & (1 << i));1812			track->tex_dirty = true;1813		}1814		break;1815	case RADEON_SE_VF_CNTL:1816		track->vap_vf_cntl = idx_value;1817		break;1818	case RADEON_SE_VTX_FMT:1819		track->vtx_size = r100_get_vtx_size(idx_value);1820		break;1821	case RADEON_PP_TEX_SIZE_0:1822	case RADEON_PP_TEX_SIZE_1:1823	case RADEON_PP_TEX_SIZE_2:1824		i = (reg - RADEON_PP_TEX_SIZE_0) / 8;1825		track->textures[i].width = (idx_value & RADEON_TEX_USIZE_MASK) + 1;1826		track->textures[i].height = ((idx_value & RADEON_TEX_VSIZE_MASK) >> RADEON_TEX_VSIZE_SHIFT) + 1;1827		track->tex_dirty = true;1828		break;1829	case RADEON_PP_TEX_PITCH_0:1830	case RADEON_PP_TEX_PITCH_1:1831	case RADEON_PP_TEX_PITCH_2:1832		i = (reg - RADEON_PP_TEX_PITCH_0) / 8;1833		track->textures[i].pitch = idx_value + 32;1834		track->tex_dirty = true;1835		break;1836	case RADEON_PP_TXFILTER_0:1837	case RADEON_PP_TXFILTER_1:1838	case RADEON_PP_TXFILTER_2:1839		i = (reg - RADEON_PP_TXFILTER_0) / 24;1840		track->textures[i].num_levels = ((idx_value & RADEON_MAX_MIP_LEVEL_MASK)1841						 >> RADEON_MAX_MIP_LEVEL_SHIFT);1842		tmp = (idx_value >> 23) & 0x7;1843		if (tmp == 2 || tmp == 6)1844			track->textures[i].roundup_w = false;1845		tmp = (idx_value >> 27) & 0x7;1846		if (tmp == 2 || tmp == 6)1847			track->textures[i].roundup_h = false;1848		track->tex_dirty = true;1849		break;1850	case RADEON_PP_TXFORMAT_0:1851	case RADEON_PP_TXFORMAT_1:1852	case RADEON_PP_TXFORMAT_2:1853		i = (reg - RADEON_PP_TXFORMAT_0) / 24;1854		if (idx_value & RADEON_TXFORMAT_NON_POWER2) {1855			track->textures[i].use_pitch = true;1856		} else {1857			track->textures[i].use_pitch = false;1858			track->textures[i].width = 1 << ((idx_value & RADEON_TXFORMAT_WIDTH_MASK) >> RADEON_TXFORMAT_WIDTH_SHIFT);1859			track->textures[i].height = 1 << ((idx_value & RADEON_TXFORMAT_HEIGHT_MASK) >> RADEON_TXFORMAT_HEIGHT_SHIFT);1860		}1861		if (idx_value & RADEON_TXFORMAT_CUBIC_MAP_ENABLE)1862			track->textures[i].tex_coord_type = 2;1863		switch ((idx_value & RADEON_TXFORMAT_FORMAT_MASK)) {1864		case RADEON_TXFORMAT_I8:1865		case RADEON_TXFORMAT_RGB332:1866		case RADEON_TXFORMAT_Y8:1867			track->textures[i].cpp = 1;1868			track->textures[i].compress_format = R100_TRACK_COMP_NONE;1869			break;1870		case RADEON_TXFORMAT_AI88:1871		case RADEON_TXFORMAT_ARGB1555:1872		case RADEON_TXFORMAT_RGB565:1873		case RADEON_TXFORMAT_ARGB4444:1874		case RADEON_TXFORMAT_VYUY422:1875		case RADEON_TXFORMAT_YVYU422:1876		case RADEON_TXFORMAT_SHADOW16:1877		case RADEON_TXFORMAT_LDUDV655:1878		case RADEON_TXFORMAT_DUDV88:1879			track->textures[i].cpp = 2;1880			track->textures[i].compress_format = R100_TRACK_COMP_NONE;1881			break;1882		case RADEON_TXFORMAT_ARGB8888:1883		case RADEON_TXFORMAT_RGBA8888:1884		case RADEON_TXFORMAT_SHADOW32:1885		case RADEON_TXFORMAT_LDUDUV8888:1886			track->textures[i].cpp = 4;1887			track->textures[i].compress_format = R100_TRACK_COMP_NONE;1888			break;1889		case RADEON_TXFORMAT_DXT1:1890			track->textures[i].cpp = 1;1891			track->textures[i].compress_format = R100_TRACK_COMP_DXT1;1892			break;1893		case RADEON_TXFORMAT_DXT23:1894		case RADEON_TXFORMAT_DXT45:1895			track->textures[i].cpp = 1;1896			track->textures[i].compress_format = R100_TRACK_COMP_DXT35;1897			break;1898		}1899		track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf);1900		track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf);1901		track->tex_dirty = true;1902		break;1903	case RADEON_PP_CUBIC_FACES_0:1904	case RADEON_PP_CUBIC_FACES_1:1905	case RADEON_PP_CUBIC_FACES_2:1906		tmp = idx_value;1907		i = (reg - RADEON_PP_CUBIC_FACES_0) / 4;1908		for (face = 0; face < 4; face++) {1909			track->textures[i].cube_info[face].width = 1 << ((tmp >> (face * 8)) & 0xf);1910			track->textures[i].cube_info[face].height = 1 << ((tmp >> ((face * 8) + 4)) & 0xf);1911		}1912		track->tex_dirty = true;1913		break;1914	default:1915		pr_err("Forbidden register 0x%04X in cs at %d\n", reg, idx);1916		return -EINVAL;1917	}1918	return 0;1919}1920 1921int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p,1922					 struct radeon_cs_packet *pkt,1923					 struct radeon_bo *robj)1924{1925	unsigned idx;1926	u32 value;1927	idx = pkt->idx + 1;1928	value = radeon_get_ib_value(p, idx + 2);1929	if ((value + 1) > radeon_bo_size(robj)) {1930		DRM_ERROR("[drm] Buffer too small for PACKET3 INDX_BUFFER "1931			  "(need %u have %lu) !\n",1932			  value + 1,1933			  radeon_bo_size(robj));1934		return -EINVAL;1935	}1936	return 0;1937}1938 1939static int r100_packet3_check(struct radeon_cs_parser *p,1940			      struct radeon_cs_packet *pkt)1941{1942	struct radeon_bo_list *reloc;1943	struct r100_cs_track *track;1944	unsigned idx;1945	volatile uint32_t *ib;1946	int r;1947 1948	ib = p->ib.ptr;1949	idx = pkt->idx + 1;1950	track = (struct r100_cs_track *)p->track;1951	switch (pkt->opcode) {1952	case PACKET3_3D_LOAD_VBPNTR:1953		r = r100_packet3_load_vbpntr(p, pkt, idx);1954		if (r)1955			return r;1956		break;1957	case PACKET3_INDX_BUFFER:1958		r = radeon_cs_packet_next_reloc(p, &reloc, 0);1959		if (r) {1960			DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode);1961			radeon_cs_dump_packet(p, pkt);1962			return r;1963		}1964		ib[idx+1] = radeon_get_ib_value(p, idx+1) + ((u32)reloc->gpu_offset);1965		r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj);1966		if (r) {1967			return r;1968		}1969		break;1970	case 0x23:1971		/* 3D_RNDR_GEN_INDX_PRIM on r100/r200 */1972		r = radeon_cs_packet_next_reloc(p, &reloc, 0);1973		if (r) {1974			DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode);1975			radeon_cs_dump_packet(p, pkt);1976			return r;1977		}1978		ib[idx] = radeon_get_ib_value(p, idx) + ((u32)reloc->gpu_offset);1979		track->num_arrays = 1;1980		track->vtx_size = r100_get_vtx_size(radeon_get_ib_value(p, idx + 2));1981 1982		track->arrays[0].robj = reloc->robj;1983		track->arrays[0].esize = track->vtx_size;1984 1985		track->max_indx = radeon_get_ib_value(p, idx+1);1986 1987		track->vap_vf_cntl = radeon_get_ib_value(p, idx+3);1988		track->immd_dwords = pkt->count - 1;1989		r = r100_cs_track_check(p->rdev, track);1990		if (r)1991			return r;1992		break;1993	case PACKET3_3D_DRAW_IMMD:1994		if (((radeon_get_ib_value(p, idx + 1) >> 4) & 0x3) != 3) {1995			DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n");1996			return -EINVAL;1997		}1998		track->vtx_size = r100_get_vtx_size(radeon_get_ib_value(p, idx + 0));1999		track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1);2000		track->immd_dwords = pkt->count - 1;2001		r = r100_cs_track_check(p->rdev, track);2002		if (r)2003			return r;2004		break;2005		/* triggers drawing using in-packet vertex data */2006	case PACKET3_3D_DRAW_IMMD_2:2007		if (((radeon_get_ib_value(p, idx) >> 4) & 0x3) != 3) {2008			DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n");2009			return -EINVAL;2010		}2011		track->vap_vf_cntl = radeon_get_ib_value(p, idx);2012		track->immd_dwords = pkt->count;2013		r = r100_cs_track_check(p->rdev, track);2014		if (r)2015			return r;2016		break;2017		/* triggers drawing using in-packet vertex data */2018	case PACKET3_3D_DRAW_VBUF_2:2019		track->vap_vf_cntl = radeon_get_ib_value(p, idx);2020		r = r100_cs_track_check(p->rdev, track);2021		if (r)2022			return r;2023		break;2024		/* triggers drawing of vertex buffers setup elsewhere */2025	case PACKET3_3D_DRAW_INDX_2:2026		track->vap_vf_cntl = radeon_get_ib_value(p, idx);2027		r = r100_cs_track_check(p->rdev, track);2028		if (r)2029			return r;2030		break;2031		/* triggers drawing using indices to vertex buffer */2032	case PACKET3_3D_DRAW_VBUF:2033		track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1);2034		r = r100_cs_track_check(p->rdev, track);2035		if (r)2036			return r;2037		break;2038		/* triggers drawing of vertex buffers setup elsewhere */2039	case PACKET3_3D_DRAW_INDX:2040		track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1);2041		r = r100_cs_track_check(p->rdev, track);2042		if (r)2043			return r;2044		break;2045		/* triggers drawing using indices to vertex buffer */2046	case PACKET3_3D_CLEAR_HIZ:2047	case PACKET3_3D_CLEAR_ZMASK:2048		if (p->rdev->hyperz_filp != p->filp)2049			return -EINVAL;2050		break;2051	case PACKET3_NOP:2052		break;2053	default:2054		DRM_ERROR("Packet3 opcode %x not supported\n", pkt->opcode);2055		return -EINVAL;2056	}2057	return 0;2058}2059 2060int r100_cs_parse(struct radeon_cs_parser *p)2061{2062	struct radeon_cs_packet pkt;2063	struct r100_cs_track *track;2064	int r;2065 2066	track = kzalloc(sizeof(*track), GFP_KERNEL);2067	if (!track)2068		return -ENOMEM;2069	r100_cs_track_clear(p->rdev, track);2070	p->track = track;2071	do {2072		r = radeon_cs_packet_parse(p, &pkt, p->idx);2073		if (r) {2074			return r;2075		}2076		p->idx += pkt.count + 2;2077		switch (pkt.type) {2078		case RADEON_PACKET_TYPE0:2079			if (p->rdev->family >= CHIP_R200)2080				r = r100_cs_parse_packet0(p, &pkt,2081					p->rdev->config.r100.reg_safe_bm,2082					p->rdev->config.r100.reg_safe_bm_size,2083					&r200_packet0_check);2084			else2085				r = r100_cs_parse_packet0(p, &pkt,2086					p->rdev->config.r100.reg_safe_bm,2087					p->rdev->config.r100.reg_safe_bm_size,2088					&r100_packet0_check);2089			break;2090		case RADEON_PACKET_TYPE2:2091			break;2092		case RADEON_PACKET_TYPE3:2093			r = r100_packet3_check(p, &pkt);2094			break;2095		default:2096			DRM_ERROR("Unknown packet type %d !\n",2097				  pkt.type);2098			return -EINVAL;2099		}2100		if (r)2101			return r;2102	} while (p->idx < p->chunk_ib->length_dw);2103	return 0;2104}2105 2106static void r100_cs_track_texture_print(struct r100_cs_track_texture *t)2107{2108	DRM_ERROR("pitch                      %d\n", t->pitch);2109	DRM_ERROR("use_pitch                  %d\n", t->use_pitch);2110	DRM_ERROR("width                      %d\n", t->width);2111	DRM_ERROR("width_11                   %d\n", t->width_11);2112	DRM_ERROR("height                     %d\n", t->height);2113	DRM_ERROR("height_11                  %d\n", t->height_11);2114	DRM_ERROR("num levels                 %d\n", t->num_levels);2115	DRM_ERROR("depth                      %d\n", t->txdepth);2116	DRM_ERROR("bpp                        %d\n", t->cpp);2117	DRM_ERROR("coordinate type            %d\n", t->tex_coord_type);2118	DRM_ERROR("width round to power of 2  %d\n", t->roundup_w);2119	DRM_ERROR("height round to power of 2 %d\n", t->roundup_h);2120	DRM_ERROR("compress format            %d\n", t->compress_format);2121}2122 2123static int r100_track_compress_size(int compress_format, int w, int h)2124{2125	int block_width, block_height, block_bytes;2126	int wblocks, hblocks;2127	int min_wblocks;2128	int sz;2129 2130	block_width = 4;2131	block_height = 4;2132 2133	switch (compress_format) {2134	case R100_TRACK_COMP_DXT1:2135		block_bytes = 8;2136		min_wblocks = 4;2137		break;2138	default:2139	case R100_TRACK_COMP_DXT35:2140		block_bytes = 16;2141		min_wblocks = 2;2142		break;2143	}2144 2145	hblocks = (h + block_height - 1) / block_height;2146	wblocks = (w + block_width - 1) / block_width;2147	if (wblocks < min_wblocks)2148		wblocks = min_wblocks;2149	sz = wblocks * hblocks * block_bytes;2150	return sz;2151}2152 2153static int r100_cs_track_cube(struct radeon_device *rdev,2154			      struct r100_cs_track *track, unsigned idx)2155{2156	unsigned face, w, h;2157	struct radeon_bo *cube_robj;2158	unsigned long size;2159	unsigned compress_format = track->textures[idx].compress_format;2160 2161	for (face = 0; face < 5; face++) {2162		cube_robj = track->textures[idx].cube_info[face].robj;2163		w = track->textures[idx].cube_info[face].width;2164		h = track->textures[idx].cube_info[face].height;2165 2166		if (compress_format) {2167			size = r100_track_compress_size(compress_format, w, h);2168		} else2169			size = w * h;2170		size *= track->textures[idx].cpp;2171 2172		size += track->textures[idx].cube_info[face].offset;2173 2174		if (size > radeon_bo_size(cube_robj)) {2175			DRM_ERROR("Cube texture offset greater than object size %lu %lu\n",2176				  size, radeon_bo_size(cube_robj));2177			r100_cs_track_texture_print(&track->textures[idx]);2178			return -1;2179		}2180	}2181	return 0;2182}2183 2184static int r100_cs_track_texture_check(struct radeon_device *rdev,2185				       struct r100_cs_track *track)2186{2187	struct radeon_bo *robj;2188	unsigned long size;2189	unsigned u, i, w, h, d;2190	int ret;2191 2192	for (u = 0; u < track->num_texture; u++) {2193		if (!track->textures[u].enabled)2194			continue;2195		if (track->textures[u].lookup_disable)2196			continue;2197		robj = track->textures[u].robj;2198		if (robj == NULL) {2199			DRM_ERROR("No texture bound to unit %u\n", u);2200			return -EINVAL;2201		}2202		size = 0;2203		for (i = 0; i <= track->textures[u].num_levels; i++) {2204			if (track->textures[u].use_pitch) {2205				if (rdev->family < CHIP_R300)2206					w = (track->textures[u].pitch / track->textures[u].cpp) / (1 << i);2207				else2208					w = track->textures[u].pitch / (1 << i);2209			} else {2210				w = track->textures[u].width;2211				if (rdev->family >= CHIP_RV515)2212					w |= track->textures[u].width_11;2213				w = w / (1 << i);2214				if (track->textures[u].roundup_w)2215					w = roundup_pow_of_two(w);2216			}2217			h = track->textures[u].height;2218			if (rdev->family >= CHIP_RV515)2219				h |= track->textures[u].height_11;2220			h = h / (1 << i);2221			if (track->textures[u].roundup_h)2222				h = roundup_pow_of_two(h);2223			if (track->textures[u].tex_coord_type == 1) {2224				d = (1 << track->textures[u].txdepth) / (1 << i);2225				if (!d)2226					d = 1;2227			} else {2228				d = 1;2229			}2230			if (track->textures[u].compress_format) {2231 2232				size += r100_track_compress_size(track->textures[u].compress_format, w, h) * d;2233				/* compressed textures are block based */2234			} else2235				size += w * h * d;2236		}2237		size *= track->textures[u].cpp;2238 2239		switch (track->textures[u].tex_coord_type) {2240		case 0:2241		case 1:2242			break;2243		case 2:2244			if (track->separate_cube) {2245				ret = r100_cs_track_cube(rdev, track, u);2246				if (ret)2247					return ret;2248			} else2249				size *= 6;2250			break;2251		default:2252			DRM_ERROR("Invalid texture coordinate type %u for unit "2253				  "%u\n", track->textures[u].tex_coord_type, u);2254			return -EINVAL;2255		}2256		if (size > radeon_bo_size(robj)) {2257			DRM_ERROR("Texture of unit %u needs %lu bytes but is "2258				  "%lu\n", u, size, radeon_bo_size(robj));2259			r100_cs_track_texture_print(&track->textures[u]);2260			return -EINVAL;2261		}2262	}2263	return 0;2264}2265 2266int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)2267{2268	unsigned i;2269	unsigned long size;2270	unsigned prim_walk;2271	unsigned nverts;2272	unsigned num_cb = track->cb_dirty ? track->num_cb : 0;2273 2274	if (num_cb && !track->zb_cb_clear && !track->color_channel_mask &&2275	    !track->blend_read_enable)2276		num_cb = 0;2277 2278	for (i = 0; i < num_cb; i++) {2279		if (track->cb[i].robj == NULL) {2280			DRM_ERROR("[drm] No buffer for color buffer %d !\n", i);2281			return -EINVAL;2282		}2283		size = track->cb[i].pitch * track->cb[i].cpp * track->maxy;2284		size += track->cb[i].offset;2285		if (size > radeon_bo_size(track->cb[i].robj)) {2286			DRM_ERROR("[drm] Buffer too small for color buffer %d "2287				  "(need %lu have %lu) !\n", i, size,2288				  radeon_bo_size(track->cb[i].robj));2289			DRM_ERROR("[drm] color buffer %d (%u %u %u %u)\n",2290				  i, track->cb[i].pitch, track->cb[i].cpp,2291				  track->cb[i].offset, track->maxy);2292			return -EINVAL;2293		}2294	}2295	track->cb_dirty = false;2296 2297	if (track->zb_dirty && track->z_enabled) {2298		if (track->zb.robj == NULL) {2299			DRM_ERROR("[drm] No buffer for z buffer !\n");2300			return -EINVAL;2301		}2302		size = track->zb.pitch * track->zb.cpp * track->maxy;2303		size += track->zb.offset;2304		if (size > radeon_bo_size(track->zb.robj)) {2305			DRM_ERROR("[drm] Buffer too small for z buffer "2306				  "(need %lu have %lu) !\n", size,2307				  radeon_bo_size(track->zb.robj));2308			DRM_ERROR("[drm] zbuffer (%u %u %u %u)\n",2309				  track->zb.pitch, track->zb.cpp,2310				  track->zb.offset, track->maxy);2311			return -EINVAL;2312		}2313	}2314	track->zb_dirty = false;2315 2316	if (track->aa_dirty && track->aaresolve) {2317		if (track->aa.robj == NULL) {2318			DRM_ERROR("[drm] No buffer for AA resolve buffer %d !\n", i);2319			return -EINVAL;2320		}2321		/* I believe the format comes from colorbuffer0. */2322		size = track->aa.pitch * track->cb[0].cpp * track->maxy;2323		size += track->aa.offset;2324		if (size > radeon_bo_size(track->aa.robj)) {2325			DRM_ERROR("[drm] Buffer too small for AA resolve buffer %d "2326				  "(need %lu have %lu) !\n", i, size,2327				  radeon_bo_size(track->aa.robj));2328			DRM_ERROR("[drm] AA resolve buffer %d (%u %u %u %u)\n",2329				  i, track->aa.pitch, track->cb[0].cpp,2330				  track->aa.offset, track->maxy);2331			return -EINVAL;2332		}2333	}2334	track->aa_dirty = false;2335 2336	prim_walk = (track->vap_vf_cntl >> 4) & 0x3;2337	if (track->vap_vf_cntl & (1 << 14)) {2338		nverts = track->vap_alt_nverts;2339	} else {2340		nverts = (track->vap_vf_cntl >> 16) & 0xFFFF;2341	}2342	switch (prim_walk) {2343	case 1:2344		for (i = 0; i < track->num_arrays; i++) {2345			size = track->arrays[i].esize * track->max_indx * 4UL;2346			if (track->arrays[i].robj == NULL) {2347				DRM_ERROR("(PW %u) Vertex array %u no buffer "2348					  "bound\n", prim_walk, i);2349				return -EINVAL;2350			}2351			if (size > radeon_bo_size(track->arrays[i].robj)) {2352				dev_err(rdev->dev, "(PW %u) Vertex array %u "2353					"need %lu dwords have %lu dwords\n",2354					prim_walk, i, size >> 2,2355					radeon_bo_size(track->arrays[i].robj)2356					>> 2);2357				DRM_ERROR("Max indices %u\n", track->max_indx);2358				return -EINVAL;2359			}2360		}2361		break;2362	case 2:2363		for (i = 0; i < track->num_arrays; i++) {2364			size = track->arrays[i].esize * (nverts - 1) * 4UL;2365			if (track->arrays[i].robj == NULL) {2366				DRM_ERROR("(PW %u) Vertex array %u no buffer "2367					  "bound\n", prim_walk, i);2368				return -EINVAL;2369			}2370			if (size > radeon_bo_size(track->arrays[i].robj)) {2371				dev_err(rdev->dev, "(PW %u) Vertex array %u "2372					"need %lu dwords have %lu dwords\n",2373					prim_walk, i, size >> 2,2374					radeon_bo_size(track->arrays[i].robj)2375					>> 2);2376				return -EINVAL;2377			}2378		}2379		break;2380	case 3:2381		size = track->vtx_size * nverts;2382		if (size != track->immd_dwords) {2383			DRM_ERROR("IMMD draw %u dwors but needs %lu dwords\n",2384				  track->immd_dwords, size);2385			DRM_ERROR("VAP_VF_CNTL.NUM_VERTICES %u, VTX_SIZE %u\n",2386				  nverts, track->vtx_size);2387			return -EINVAL;2388		}2389		break;2390	default:2391		DRM_ERROR("[drm] Invalid primitive walk %d for VAP_VF_CNTL\n",2392			  prim_walk);2393		return -EINVAL;2394	}2395 2396	if (track->tex_dirty) {2397		track->tex_dirty = false;2398		return r100_cs_track_texture_check(rdev, track);2399	}2400	return 0;2401}2402 2403void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track)2404{2405	unsigned i, face;2406 2407	track->cb_dirty = true;2408	track->zb_dirty = true;2409	track->tex_dirty = true;2410	track->aa_dirty = true;2411 2412	if (rdev->family < CHIP_R300) {2413		track->num_cb = 1;2414		if (rdev->family <= CHIP_RS200)2415			track->num_texture = 3;2416		else2417			track->num_texture = 6;2418		track->maxy = 2048;2419		track->separate_cube = true;2420	} else {2421		track->num_cb = 4;2422		track->num_texture = 16;2423		track->maxy = 4096;2424		track->separate_cube = false;2425		track->aaresolve = false;2426		track->aa.robj = NULL;2427	}2428 2429	for (i = 0; i < track->num_cb; i++) {2430		track->cb[i].robj = NULL;2431		track->cb[i].pitch = 8192;2432		track->cb[i].cpp = 16;2433		track->cb[i].offset = 0;2434	}2435	track->z_enabled = true;2436	track->zb.robj = NULL;2437	track->zb.pitch = 8192;2438	track->zb.cpp = 4;2439	track->zb.offset = 0;2440	track->vtx_size = 0x7F;2441	track->immd_dwords = 0xFFFFFFFFUL;2442	track->num_arrays = 11;2443	track->max_indx = 0x00FFFFFFUL;2444	for (i = 0; i < track->num_arrays; i++) {2445		track->arrays[i].robj = NULL;2446		track->arrays[i].esize = 0x7F;2447	}2448	for (i = 0; i < track->num_texture; i++) {2449		track->textures[i].compress_format = R100_TRACK_COMP_NONE;2450		track->textures[i].pitch = 16536;2451		track->textures[i].width = 16536;2452		track->textures[i].height = 16536;2453		track->textures[i].width_11 = 1 << 11;2454		track->textures[i].height_11 = 1 << 11;2455		track->textures[i].num_levels = 12;2456		if (rdev->family <= CHIP_RS200) {2457			track->textures[i].tex_coord_type = 0;2458			track->textures[i].txdepth = 0;2459		} else {2460			track->textures[i].txdepth = 16;2461			track->textures[i].tex_coord_type = 1;2462		}2463		track->textures[i].cpp = 64;2464		track->textures[i].robj = NULL;2465		/* CS IB emission code makes sure texture unit are disabled */2466		track->textures[i].enabled = false;2467		track->textures[i].lookup_disable = false;2468		track->textures[i].roundup_w = true;2469		track->textures[i].roundup_h = true;2470		if (track->separate_cube)2471			for (face = 0; face < 5; face++) {2472				track->textures[i].cube_info[face].robj = NULL;2473				track->textures[i].cube_info[face].width = 16536;2474				track->textures[i].cube_info[face].height = 16536;2475				track->textures[i].cube_info[face].offset = 0;2476			}2477	}2478}2479 2480/*2481 * Global GPU functions2482 */2483static void r100_errata(struct radeon_device *rdev)2484{2485	rdev->pll_errata = 0;2486 2487	if (rdev->family == CHIP_RV200 || rdev->family == CHIP_RS200) {2488		rdev->pll_errata |= CHIP_ERRATA_PLL_DUMMYREADS;2489	}2490 2491	if (rdev->family == CHIP_RV100 ||2492	    rdev->family == CHIP_RS100 ||2493	    rdev->family == CHIP_RS200) {2494		rdev->pll_errata |= CHIP_ERRATA_PLL_DELAY;2495	}2496}2497 2498static int r100_rbbm_fifo_wait_for_entry(struct radeon_device *rdev, unsigned n)2499{2500	unsigned i;2501	uint32_t tmp;2502 2503	for (i = 0; i < rdev->usec_timeout; i++) {2504		tmp = RREG32(RADEON_RBBM_STATUS) & RADEON_RBBM_FIFOCNT_MASK;2505		if (tmp >= n) {2506			return 0;2507		}2508		udelay(1);2509	}2510	return -1;2511}2512 2513int r100_gui_wait_for_idle(struct radeon_device *rdev)2514{2515	unsigned i;2516	uint32_t tmp;2517 2518	if (r100_rbbm_fifo_wait_for_entry(rdev, 64)) {2519		pr_warn("radeon: wait for empty RBBM fifo failed! Bad things might happen.\n");2520	}2521	for (i = 0; i < rdev->usec_timeout; i++) {2522		tmp = RREG32(RADEON_RBBM_STATUS);2523		if (!(tmp & RADEON_RBBM_ACTIVE)) {2524			return 0;2525		}2526		udelay(1);2527	}2528	return -1;2529}2530 2531int r100_mc_wait_for_idle(struct radeon_device *rdev)2532{2533	unsigned i;2534	uint32_t tmp;2535 2536	for (i = 0; i < rdev->usec_timeout; i++) {2537		/* read MC_STATUS */2538		tmp = RREG32(RADEON_MC_STATUS);2539		if (tmp & RADEON_MC_IDLE) {2540			return 0;2541		}2542		udelay(1);2543	}2544	return -1;2545}2546 2547bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)2548{2549	u32 rbbm_status;2550 2551	rbbm_status = RREG32(R_000E40_RBBM_STATUS);2552	if (!G_000E40_GUI_ACTIVE(rbbm_status)) {2553		radeon_ring_lockup_update(rdev, ring);2554		return false;2555	}2556	return radeon_ring_test_lockup(rdev, ring);2557}2558 2559/* required on r1xx, r2xx, r300, r(v)350, r420/r481, rs400/rs480 */2560void r100_enable_bm(struct radeon_device *rdev)2561{2562	uint32_t tmp;2563	/* Enable bus mastering */2564	tmp = RREG32(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS;2565	WREG32(RADEON_BUS_CNTL, tmp);2566}2567 2568void r100_bm_disable(struct radeon_device *rdev)2569{2570	u32 tmp;2571 2572	/* disable bus mastering */2573	tmp = RREG32(R_000030_BUS_CNTL);2574	WREG32(R_000030_BUS_CNTL, (tmp & 0xFFFFFFFF) | 0x00000044);2575	mdelay(1);2576	WREG32(R_000030_BUS_CNTL, (tmp & 0xFFFFFFFF) | 0x00000042);2577	mdelay(1);2578	WREG32(R_000030_BUS_CNTL, (tmp & 0xFFFFFFFF) | 0x00000040);2579	tmp = RREG32(RADEON_BUS_CNTL);2580	mdelay(1);2581	pci_clear_master(rdev->pdev);2582	mdelay(1);2583}2584 2585int r100_asic_reset(struct radeon_device *rdev, bool hard)2586{2587	struct r100_mc_save save;2588	u32 status, tmp;2589	int ret = 0;2590 2591	status = RREG32(R_000E40_RBBM_STATUS);2592	if (!G_000E40_GUI_ACTIVE(status)) {2593		return 0;2594	}2595	r100_mc_stop(rdev, &save);2596	status = RREG32(R_000E40_RBBM_STATUS);2597	dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status);2598	/* stop CP */2599	WREG32(RADEON_CP_CSQ_CNTL, 0);2600	tmp = RREG32(RADEON_CP_RB_CNTL);2601	WREG32(RADEON_CP_RB_CNTL, tmp | RADEON_RB_RPTR_WR_ENA);2602	WREG32(RADEON_CP_RB_RPTR_WR, 0);2603	WREG32(RADEON_CP_RB_WPTR, 0);2604	WREG32(RADEON_CP_RB_CNTL, tmp);2605	/* save PCI state */2606	pci_save_state(rdev->pdev);2607	/* disable bus mastering */2608	r100_bm_disable(rdev);2609	WREG32(R_0000F0_RBBM_SOFT_RESET, S_0000F0_SOFT_RESET_SE(1) |2610					S_0000F0_SOFT_RESET_RE(1) |2611					S_0000F0_SOFT_RESET_PP(1) |2612					S_0000F0_SOFT_RESET_RB(1));2613	RREG32(R_0000F0_RBBM_SOFT_RESET);2614	mdelay(500);2615	WREG32(R_0000F0_RBBM_SOFT_RESET, 0);2616	mdelay(1);2617	status = RREG32(R_000E40_RBBM_STATUS);2618	dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status);2619	/* reset CP */2620	WREG32(R_0000F0_RBBM_SOFT_RESET, S_0000F0_SOFT_RESET_CP(1));2621	RREG32(R_0000F0_RBBM_SOFT_RESET);2622	mdelay(500);2623	WREG32(R_0000F0_RBBM_SOFT_RESET, 0);2624	mdelay(1);2625	status = RREG32(R_000E40_RBBM_STATUS);2626	dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status);2627	/* restore PCI & busmastering */2628	pci_restore_state(rdev->pdev);2629	r100_enable_bm(rdev);2630	/* Check if GPU is idle */2631	if (G_000E40_SE_BUSY(status) || G_000E40_RE_BUSY(status) ||2632		G_000E40_TAM_BUSY(status) || G_000E40_PB_BUSY(status)) {2633		dev_err(rdev->dev, "failed to reset GPU\n");2634		ret = -1;2635	} else2636		dev_info(rdev->dev, "GPU reset succeed\n");2637	r100_mc_resume(rdev, &save);2638	return ret;2639}2640 2641void r100_set_common_regs(struct radeon_device *rdev)2642{2643	bool force_dac2 = false;2644	u32 tmp;2645 2646	/* set these so they don't interfere with anything */2647	WREG32(RADEON_OV0_SCALE_CNTL, 0);2648	WREG32(RADEON_SUBPIC_CNTL, 0);2649	WREG32(RADEON_VIPH_CONTROL, 0);2650	WREG32(RADEON_I2C_CNTL_1, 0);2651	WREG32(RADEON_DVI_I2C_CNTL_1, 0);2652	WREG32(RADEON_CAP0_TRIG_CNTL, 0);2653	WREG32(RADEON_CAP1_TRIG_CNTL, 0);2654 2655	/* always set up dac2 on rn50 and some rv100 as lots2656	 * of servers seem to wire it up to a VGA port but2657	 * don't report it in the bios connector2658	 * table.2659	 */2660	switch (rdev->pdev->device) {2661		/* RN50 */2662	case 0x515e:2663	case 0x5969:2664		force_dac2 = true;2665		break;2666		/* RV100*/2667	case 0x5159:2668	case 0x515a:2669		/* DELL triple head servers */2670		if ((rdev->pdev->subsystem_vendor == 0x1028 /* DELL */) &&2671		    ((rdev->pdev->subsystem_device == 0x016c) ||2672		     (rdev->pdev->subsystem_device == 0x016d) ||2673		     (rdev->pdev->subsystem_device == 0x016e) ||2674		     (rdev->pdev->subsystem_device == 0x016f) ||2675		     (rdev->pdev->subsystem_device == 0x0170) ||2676		     (rdev->pdev->subsystem_device == 0x017d) ||2677		     (rdev->pdev->subsystem_device == 0x017e) ||2678		     (rdev->pdev->subsystem_device == 0x0183) ||2679		     (rdev->pdev->subsystem_device == 0x018a) ||2680		     (rdev->pdev->subsystem_device == 0x019a)))2681			force_dac2 = true;2682		break;2683	}2684 2685	if (force_dac2) {2686		u32 disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG);2687		u32 tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL);2688		u32 dac2_cntl = RREG32(RADEON_DAC_CNTL2);2689 2690		/* For CRT on DAC2, don't turn it on if BIOS didn't2691		   enable it, even it's detected.2692		*/2693 2694		/* force it to crtc0 */2695		dac2_cntl &= ~RADEON_DAC2_DAC_CLK_SEL;2696		dac2_cntl |= RADEON_DAC2_DAC2_CLK_SEL;2697		disp_hw_debug |= RADEON_CRT2_DISP1_SEL;2698 2699		/* set up the TV DAC */2700		tv_dac_cntl &= ~(RADEON_TV_DAC_PEDESTAL |2701				 RADEON_TV_DAC_STD_MASK |2702				 RADEON_TV_DAC_RDACPD |2703				 RADEON_TV_DAC_GDACPD |2704				 RADEON_TV_DAC_BDACPD |2705				 RADEON_TV_DAC_BGADJ_MASK |2706				 RADEON_TV_DAC_DACADJ_MASK);2707		tv_dac_cntl |= (RADEON_TV_DAC_NBLANK |2708				RADEON_TV_DAC_NHOLD |2709				RADEON_TV_DAC_STD_PS2 |2710				(0x58 << 16));2711 2712		WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);2713		WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug);2714		WREG32(RADEON_DAC_CNTL2, dac2_cntl);2715	}2716 2717	/* switch PM block to ACPI mode */2718	tmp = RREG32_PLL(RADEON_PLL_PWRMGT_CNTL);2719	tmp &= ~RADEON_PM_MODE_SEL;2720	WREG32_PLL(RADEON_PLL_PWRMGT_CNTL, tmp);2721 2722}2723 2724/*2725 * VRAM info2726 */2727static void r100_vram_get_type(struct radeon_device *rdev)2728{2729	uint32_t tmp;2730 2731	rdev->mc.vram_is_ddr = false;2732	if (rdev->flags & RADEON_IS_IGP)2733		rdev->mc.vram_is_ddr = true;2734	else if (RREG32(RADEON_MEM_SDRAM_MODE_REG) & RADEON_MEM_CFG_TYPE_DDR)2735		rdev->mc.vram_is_ddr = true;2736	if ((rdev->family == CHIP_RV100) ||2737	    (rdev->family == CHIP_RS100) ||2738	    (rdev->family == CHIP_RS200)) {2739		tmp = RREG32(RADEON_MEM_CNTL);2740		if (tmp & RV100_HALF_MODE) {2741			rdev->mc.vram_width = 32;2742		} else {2743			rdev->mc.vram_width = 64;2744		}2745		if (rdev->flags & RADEON_SINGLE_CRTC) {2746			rdev->mc.vram_width /= 4;2747			rdev->mc.vram_is_ddr = true;2748		}2749	} else if (rdev->family <= CHIP_RV280) {2750		tmp = RREG32(RADEON_MEM_CNTL);2751		if (tmp & RADEON_MEM_NUM_CHANNELS_MASK) {2752			rdev->mc.vram_width = 128;2753		} else {2754			rdev->mc.vram_width = 64;2755		}2756	} else {2757		/* newer IGPs */2758		rdev->mc.vram_width = 128;2759	}2760}2761 2762static u32 r100_get_accessible_vram(struct radeon_device *rdev)2763{2764	u32 aper_size;2765	u8 byte;2766 2767	aper_size = RREG32(RADEON_CONFIG_APER_SIZE);2768 2769	/* Set HDP_APER_CNTL only on cards that are known not to be broken,2770	 * that is has the 2nd generation multifunction PCI interface2771	 */2772	if (rdev->family == CHIP_RV280 ||2773	    rdev->family >= CHIP_RV350) {2774		WREG32_P(RADEON_HOST_PATH_CNTL, RADEON_HDP_APER_CNTL,2775		       ~RADEON_HDP_APER_CNTL);2776		DRM_INFO("Generation 2 PCI interface, using max accessible memory\n");2777		return aper_size * 2;2778	}2779 2780	/* Older cards have all sorts of funny issues to deal with. First2781	 * check if it's a multifunction card by reading the PCI config2782	 * header type... Limit those to one aperture size2783	 */2784	pci_read_config_byte(rdev->pdev, 0xe, &byte);2785	if (byte & 0x80) {2786		DRM_INFO("Generation 1 PCI interface in multifunction mode\n");2787		DRM_INFO("Limiting VRAM to one aperture\n");2788		return aper_size;2789	}2790 2791	/* Single function older card. We read HDP_APER_CNTL to see how the BIOS2792	 * have set it up. We don't write this as it's broken on some ASICs but2793	 * we expect the BIOS to have done the right thing (might be too optimistic...)2794	 */2795	if (RREG32(RADEON_HOST_PATH_CNTL) & RADEON_HDP_APER_CNTL)2796		return aper_size * 2;2797	return aper_size;2798}2799 2800void r100_vram_init_sizes(struct radeon_device *rdev)2801{2802	u64 config_aper_size;2803 2804	/* work out accessible VRAM */2805	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);2806	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);2807	rdev->mc.visible_vram_size = r100_get_accessible_vram(rdev);2808	/* FIXME we don't use the second aperture yet when we could use it */2809	if (rdev->mc.visible_vram_size > rdev->mc.aper_size)2810		rdev->mc.visible_vram_size = rdev->mc.aper_size;2811	config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE);2812	if (rdev->flags & RADEON_IS_IGP) {2813		uint32_t tom;2814		/* read NB_TOM to get the amount of ram stolen for the GPU */2815		tom = RREG32(RADEON_NB_TOM);2816		rdev->mc.real_vram_size = (((tom >> 16) - (tom & 0xffff) + 1) << 16);2817		WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size);2818		rdev->mc.mc_vram_size = rdev->mc.real_vram_size;2819	} else {2820		rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE);2821		/* Some production boards of m6 will report 02822		 * if it's 8 MB2823		 */2824		if (rdev->mc.real_vram_size == 0) {2825			rdev->mc.real_vram_size = 8192 * 1024;2826			WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size);2827		}2828		/* Fix for RN50, M6, M7 with 8/16/32(??) MBs of VRAM -2829		 * Novell bug 204882 + along with lots of ubuntu ones2830		 */2831		if (rdev->mc.aper_size > config_aper_size)2832			config_aper_size = rdev->mc.aper_size;2833 2834		if (config_aper_size > rdev->mc.real_vram_size)2835			rdev->mc.mc_vram_size = config_aper_size;2836		else2837			rdev->mc.mc_vram_size = rdev->mc.real_vram_size;2838	}2839}2840 2841void r100_vga_set_state(struct radeon_device *rdev, bool state)2842{2843	uint32_t temp;2844 2845	temp = RREG32(RADEON_CONFIG_CNTL);2846	if (!state) {2847		temp &= ~RADEON_CFG_VGA_RAM_EN;2848		temp |= RADEON_CFG_VGA_IO_DIS;2849	} else {2850		temp &= ~RADEON_CFG_VGA_IO_DIS;2851	}2852	WREG32(RADEON_CONFIG_CNTL, temp);2853}2854 2855static void r100_mc_init(struct radeon_device *rdev)2856{2857	u64 base;2858 2859	r100_vram_get_type(rdev);2860	r100_vram_init_sizes(rdev);2861	base = rdev->mc.aper_base;2862	if (rdev->flags & RADEON_IS_IGP)2863		base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16;2864	radeon_vram_location(rdev, &rdev->mc, base);2865	rdev->mc.gtt_base_align = 0;2866	if (!(rdev->flags & RADEON_IS_AGP))2867		radeon_gtt_location(rdev, &rdev->mc);2868	radeon_update_bandwidth_info(rdev);2869}2870 2871 2872/*2873 * Indirect registers accessor2874 */2875void r100_pll_errata_after_index(struct radeon_device *rdev)2876{2877	if (rdev->pll_errata & CHIP_ERRATA_PLL_DUMMYREADS) {2878		(void)RREG32(RADEON_CLOCK_CNTL_DATA);2879		(void)RREG32(RADEON_CRTC_GEN_CNTL);2880	}2881}2882 2883static void r100_pll_errata_after_data(struct radeon_device *rdev)2884{2885	/* This workarounds is necessary on RV100, RS100 and RS200 chips2886	 * or the chip could hang on a subsequent access2887	 */2888	if (rdev->pll_errata & CHIP_ERRATA_PLL_DELAY) {2889		mdelay(5);2890	}2891 2892	/* This function is required to workaround a hardware bug in some (all?)2893	 * revisions of the R300.  This workaround should be called after every2894	 * CLOCK_CNTL_INDEX register access.  If not, register reads afterward2895	 * may not be correct.2896	 */2897	if (rdev->pll_errata & CHIP_ERRATA_R300_CG) {2898		uint32_t save, tmp;2899 2900		save = RREG32(RADEON_CLOCK_CNTL_INDEX);2901		tmp = save & ~(0x3f | RADEON_PLL_WR_EN);2902		WREG32(RADEON_CLOCK_CNTL_INDEX, tmp);2903		tmp = RREG32(RADEON_CLOCK_CNTL_DATA);2904		WREG32(RADEON_CLOCK_CNTL_INDEX, save);2905	}2906}2907 2908uint32_t r100_pll_rreg(struct radeon_device *rdev, uint32_t reg)2909{2910	unsigned long flags;2911	uint32_t data;2912 2913	spin_lock_irqsave(&rdev->pll_idx_lock, flags);2914	WREG8(RADEON_CLOCK_CNTL_INDEX, reg & 0x3f);2915	r100_pll_errata_after_index(rdev);2916	data = RREG32(RADEON_CLOCK_CNTL_DATA);2917	r100_pll_errata_after_data(rdev);2918	spin_unlock_irqrestore(&rdev->pll_idx_lock, flags);2919	return data;2920}2921 2922void r100_pll_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)2923{2924	unsigned long flags;2925 2926	spin_lock_irqsave(&rdev->pll_idx_lock, flags);2927	WREG8(RADEON_CLOCK_CNTL_INDEX, ((reg & 0x3f) | RADEON_PLL_WR_EN));2928	r100_pll_errata_after_index(rdev);2929	WREG32(RADEON_CLOCK_CNTL_DATA, v);2930	r100_pll_errata_after_data(rdev);2931	spin_unlock_irqrestore(&rdev->pll_idx_lock, flags);2932}2933 2934static void r100_set_safe_registers(struct radeon_device *rdev)2935{2936	if (ASIC_IS_RN50(rdev)) {2937		rdev->config.r100.reg_safe_bm = rn50_reg_safe_bm;2938		rdev->config.r100.reg_safe_bm_size = ARRAY_SIZE(rn50_reg_safe_bm);2939	} else if (rdev->family < CHIP_R200) {2940		rdev->config.r100.reg_safe_bm = r100_reg_safe_bm;2941		rdev->config.r100.reg_safe_bm_size = ARRAY_SIZE(r100_reg_safe_bm);2942	} else {2943		r200_set_safe_registers(rdev);2944	}2945}2946 2947/*2948 * Debugfs info2949 */2950#if defined(CONFIG_DEBUG_FS)2951static int r100_debugfs_rbbm_info_show(struct seq_file *m, void *unused)2952{2953	struct radeon_device *rdev = m->private;2954	uint32_t reg, value;2955	unsigned i;2956 2957	seq_printf(m, "RBBM_STATUS 0x%08x\n", RREG32(RADEON_RBBM_STATUS));2958	seq_printf(m, "RBBM_CMDFIFO_STAT 0x%08x\n", RREG32(0xE7C));2959	seq_printf(m, "CP_STAT 0x%08x\n", RREG32(RADEON_CP_STAT));2960	for (i = 0; i < 64; i++) {2961		WREG32(RADEON_RBBM_CMDFIFO_ADDR, i | 0x100);2962		reg = (RREG32(RADEON_RBBM_CMDFIFO_DATA) - 1) >> 2;2963		WREG32(RADEON_RBBM_CMDFIFO_ADDR, i);2964		value = RREG32(RADEON_RBBM_CMDFIFO_DATA);2965		seq_printf(m, "[0x%03X] 0x%04X=0x%08X\n", i, reg, value);2966	}2967	return 0;2968}2969 2970static int r100_debugfs_cp_ring_info_show(struct seq_file *m, void *unused)2971{2972	struct radeon_device *rdev = m->private;2973	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];2974	uint32_t rdp, wdp;2975	unsigned count, i, j;2976 2977	radeon_ring_free_size(rdev, ring);2978	rdp = RREG32(RADEON_CP_RB_RPTR);2979	wdp = RREG32(RADEON_CP_RB_WPTR);2980	count = (rdp + ring->ring_size - wdp) & ring->ptr_mask;2981	seq_printf(m, "CP_STAT 0x%08x\n", RREG32(RADEON_CP_STAT));2982	seq_printf(m, "CP_RB_WPTR 0x%08x\n", wdp);2983	seq_printf(m, "CP_RB_RPTR 0x%08x\n", rdp);2984	seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw);2985	seq_printf(m, "%u dwords in ring\n", count);2986	if (ring->ready) {2987		for (j = 0; j <= count; j++) {2988			i = (rdp + j) & ring->ptr_mask;2989			seq_printf(m, "r[%04d]=0x%08x\n", i, ring->ring[i]);2990		}2991	}2992	return 0;2993}2994 2995 2996static int r100_debugfs_cp_csq_fifo_show(struct seq_file *m, void *unused)2997{2998	struct radeon_device *rdev = m->private;2999	uint32_t csq_stat, csq2_stat, tmp;3000	unsigned r_rptr, r_wptr, ib1_rptr, ib1_wptr, ib2_rptr, ib2_wptr;3001	unsigned i;3002 3003	seq_printf(m, "CP_STAT 0x%08x\n", RREG32(RADEON_CP_STAT));3004	seq_printf(m, "CP_CSQ_MODE 0x%08x\n", RREG32(RADEON_CP_CSQ_MODE));3005	csq_stat = RREG32(RADEON_CP_CSQ_STAT);3006	csq2_stat = RREG32(RADEON_CP_CSQ2_STAT);3007	r_rptr = (csq_stat >> 0) & 0x3ff;3008	r_wptr = (csq_stat >> 10) & 0x3ff;3009	ib1_rptr = (csq_stat >> 20) & 0x3ff;3010	ib1_wptr = (csq2_stat >> 0) & 0x3ff;3011	ib2_rptr = (csq2_stat >> 10) & 0x3ff;3012	ib2_wptr = (csq2_stat >> 20) & 0x3ff;3013	seq_printf(m, "CP_CSQ_STAT 0x%08x\n", csq_stat);3014	seq_printf(m, "CP_CSQ2_STAT 0x%08x\n", csq2_stat);3015	seq_printf(m, "Ring rptr %u\n", r_rptr);3016	seq_printf(m, "Ring wptr %u\n", r_wptr);3017	seq_printf(m, "Indirect1 rptr %u\n", ib1_rptr);3018	seq_printf(m, "Indirect1 wptr %u\n", ib1_wptr);3019	seq_printf(m, "Indirect2 rptr %u\n", ib2_rptr);3020	seq_printf(m, "Indirect2 wptr %u\n", ib2_wptr);3021	/* FIXME: 0, 128, 640 depends on fifo setup see cp_init_kms3022	 * 128 = indirect1_start * 8 & 640 = indirect2_start * 8 */3023	seq_printf(m, "Ring fifo:\n");3024	for (i = 0; i < 256; i++) {3025		WREG32(RADEON_CP_CSQ_ADDR, i << 2);3026		tmp = RREG32(RADEON_CP_CSQ_DATA);3027		seq_printf(m, "rfifo[%04d]=0x%08X\n", i, tmp);3028	}3029	seq_printf(m, "Indirect1 fifo:\n");3030	for (i = 256; i <= 512; i++) {3031		WREG32(RADEON_CP_CSQ_ADDR, i << 2);3032		tmp = RREG32(RADEON_CP_CSQ_DATA);3033		seq_printf(m, "ib1fifo[%04d]=0x%08X\n", i, tmp);3034	}3035	seq_printf(m, "Indirect2 fifo:\n");3036	for (i = 640; i < ib1_wptr; i++) {3037		WREG32(RADEON_CP_CSQ_ADDR, i << 2);3038		tmp = RREG32(RADEON_CP_CSQ_DATA);3039		seq_printf(m, "ib2fifo[%04d]=0x%08X\n", i, tmp);3040	}3041	return 0;3042}3043 3044static int r100_debugfs_mc_info_show(struct seq_file *m, void *unused)3045{3046	struct radeon_device *rdev = m->private;3047	uint32_t tmp;3048 3049	tmp = RREG32(RADEON_CONFIG_MEMSIZE);3050	seq_printf(m, "CONFIG_MEMSIZE 0x%08x\n", tmp);3051	tmp = RREG32(RADEON_MC_FB_LOCATION);3052	seq_printf(m, "MC_FB_LOCATION 0x%08x\n", tmp);3053	tmp = RREG32(RADEON_BUS_CNTL);3054	seq_printf(m, "BUS_CNTL 0x%08x\n", tmp);3055	tmp = RREG32(RADEON_MC_AGP_LOCATION);3056	seq_printf(m, "MC_AGP_LOCATION 0x%08x\n", tmp);3057	tmp = RREG32(RADEON_AGP_BASE);3058	seq_printf(m, "AGP_BASE 0x%08x\n", tmp);3059	tmp = RREG32(RADEON_HOST_PATH_CNTL);3060	seq_printf(m, "HOST_PATH_CNTL 0x%08x\n", tmp);3061	tmp = RREG32(0x01D0);3062	seq_printf(m, "AIC_CTRL 0x%08x\n", tmp);3063	tmp = RREG32(RADEON_AIC_LO_ADDR);3064	seq_printf(m, "AIC_LO_ADDR 0x%08x\n", tmp);3065	tmp = RREG32(RADEON_AIC_HI_ADDR);3066	seq_printf(m, "AIC_HI_ADDR 0x%08x\n", tmp);3067	tmp = RREG32(0x01E4);3068	seq_printf(m, "AIC_TLB_ADDR 0x%08x\n", tmp);3069	return 0;3070}3071 3072DEFINE_SHOW_ATTRIBUTE(r100_debugfs_rbbm_info);3073DEFINE_SHOW_ATTRIBUTE(r100_debugfs_cp_ring_info);3074DEFINE_SHOW_ATTRIBUTE(r100_debugfs_cp_csq_fifo);3075DEFINE_SHOW_ATTRIBUTE(r100_debugfs_mc_info);3076 3077#endif3078 3079void  r100_debugfs_rbbm_init(struct radeon_device *rdev)3080{3081#if defined(CONFIG_DEBUG_FS)3082	struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root;3083 3084	debugfs_create_file("r100_rbbm_info", 0444, root, rdev,3085			    &r100_debugfs_rbbm_info_fops);3086#endif3087}3088 3089void r100_debugfs_cp_init(struct radeon_device *rdev)3090{3091#if defined(CONFIG_DEBUG_FS)3092	struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root;3093 3094	debugfs_create_file("r100_cp_ring_info", 0444, root, rdev,3095			    &r100_debugfs_cp_ring_info_fops);3096	debugfs_create_file("r100_cp_csq_fifo", 0444, root, rdev,3097			    &r100_debugfs_cp_csq_fifo_fops);3098#endif3099}3100 3101void  r100_debugfs_mc_info_init(struct radeon_device *rdev)3102{3103#if defined(CONFIG_DEBUG_FS)3104	struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root;3105 3106	debugfs_create_file("r100_mc_info", 0444, root, rdev,3107			    &r100_debugfs_mc_info_fops);3108#endif3109}3110 3111int r100_set_surface_reg(struct radeon_device *rdev, int reg,3112			 uint32_t tiling_flags, uint32_t pitch,3113			 uint32_t offset, uint32_t obj_size)3114{3115	int surf_index = reg * 16;3116	int flags = 0;3117 3118	if (rdev->family <= CHIP_RS200) {3119		if ((tiling_flags & (RADEON_TILING_MACRO|RADEON_TILING_MICRO))3120				 == (RADEON_TILING_MACRO|RADEON_TILING_MICRO))3121			flags |= RADEON_SURF_TILE_COLOR_BOTH;3122		if (tiling_flags & RADEON_TILING_MACRO)3123			flags |= RADEON_SURF_TILE_COLOR_MACRO;3124		/* setting pitch to 0 disables tiling */3125		if ((tiling_flags & (RADEON_TILING_MACRO|RADEON_TILING_MICRO))3126				== 0)3127			pitch = 0;3128	} else if (rdev->family <= CHIP_RV280) {3129		if (tiling_flags & (RADEON_TILING_MACRO))3130			flags |= R200_SURF_TILE_COLOR_MACRO;3131		if (tiling_flags & RADEON_TILING_MICRO)3132			flags |= R200_SURF_TILE_COLOR_MICRO;3133	} else {3134		if (tiling_flags & RADEON_TILING_MACRO)3135			flags |= R300_SURF_TILE_MACRO;3136		if (tiling_flags & RADEON_TILING_MICRO)3137			flags |= R300_SURF_TILE_MICRO;3138	}3139 3140	if (tiling_flags & RADEON_TILING_SWAP_16BIT)3141		flags |= RADEON_SURF_AP0_SWP_16BPP | RADEON_SURF_AP1_SWP_16BPP;3142	if (tiling_flags & RADEON_TILING_SWAP_32BIT)3143		flags |= RADEON_SURF_AP0_SWP_32BPP | RADEON_SURF_AP1_SWP_32BPP;3144 3145	/* r100/r200 divide by 16 */3146	if (rdev->family < CHIP_R300)3147		flags |= pitch / 16;3148	else3149		flags |= pitch / 8;3150 3151 3152	DRM_DEBUG_KMS("writing surface %d %d %x %x\n", reg, flags, offset, offset+obj_size-1);3153	WREG32(RADEON_SURFACE0_INFO + surf_index, flags);3154	WREG32(RADEON_SURFACE0_LOWER_BOUND + surf_index, offset);3155	WREG32(RADEON_SURFACE0_UPPER_BOUND + surf_index, offset + obj_size - 1);3156	return 0;3157}3158 3159void r100_clear_surface_reg(struct radeon_device *rdev, int reg)3160{3161	int surf_index = reg * 16;3162	WREG32(RADEON_SURFACE0_INFO + surf_index, 0);3163}3164 3165void r100_bandwidth_update(struct radeon_device *rdev)3166{3167	fixed20_12 trcd_ff, trp_ff, tras_ff, trbs_ff, tcas_ff;3168	fixed20_12 sclk_ff, mclk_ff, sclk_eff_ff, sclk_delay_ff;3169	fixed20_12 peak_disp_bw, mem_bw, pix_clk, pix_clk2, temp_ff;3170	fixed20_12 crit_point_ff = {0};3171	uint32_t temp, data, mem_trcd, mem_trp, mem_tras;3172	fixed20_12 memtcas_ff[8] = {3173		dfixed_init(1),3174		dfixed_init(2),3175		dfixed_init(3),3176		dfixed_init(0),3177		dfixed_init_half(1),3178		dfixed_init_half(2),3179		dfixed_init(0),3180	};3181	fixed20_12 memtcas_rs480_ff[8] = {3182		dfixed_init(0),3183		dfixed_init(1),3184		dfixed_init(2),3185		dfixed_init(3),3186		dfixed_init(0),3187		dfixed_init_half(1),3188		dfixed_init_half(2),3189		dfixed_init_half(3),3190	};3191	fixed20_12 memtcas2_ff[8] = {3192		dfixed_init(0),3193		dfixed_init(1),3194		dfixed_init(2),3195		dfixed_init(3),3196		dfixed_init(4),3197		dfixed_init(5),3198		dfixed_init(6),3199		dfixed_init(7),3200	};3201	fixed20_12 memtrbs[8] = {3202		dfixed_init(1),3203		dfixed_init_half(1),3204		dfixed_init(2),3205		dfixed_init_half(2),3206		dfixed_init(3),3207		dfixed_init_half(3),3208		dfixed_init(4),3209		dfixed_init_half(4)3210	};3211	fixed20_12 memtrbs_r4xx[8] = {3212		dfixed_init(4),3213		dfixed_init(5),3214		dfixed_init(6),3215		dfixed_init(7),3216		dfixed_init(8),3217		dfixed_init(9),3218		dfixed_init(10),3219		dfixed_init(11)3220	};3221	fixed20_12 min_mem_eff;3222	fixed20_12 mc_latency_sclk, mc_latency_mclk, k1;3223	fixed20_12 cur_latency_mclk, cur_latency_sclk;3224	fixed20_12 disp_latency, disp_latency_overhead, disp_drain_rate = {0},3225		disp_drain_rate2, read_return_rate;3226	fixed20_12 time_disp1_drop_priority;3227	int c;3228	int cur_size = 16;       /* in octawords */3229	int critical_point = 0, critical_point2;3230/* 	uint32_t read_return_rate, time_disp1_drop_priority; */3231	int stop_req, max_stop_req;3232	struct drm_display_mode *mode1 = NULL;3233	struct drm_display_mode *mode2 = NULL;3234	uint32_t pixel_bytes1 = 0;3235	uint32_t pixel_bytes2 = 0;3236 3237	/* Guess line buffer size to be 8192 pixels */3238	u32 lb_size = 8192;3239 3240	if (!rdev->mode_info.mode_config_initialized)3241		return;3242 3243	radeon_update_display_priority(rdev);3244 3245	if (rdev->mode_info.crtcs[0]->base.enabled) {3246		const struct drm_framebuffer *fb =3247			rdev->mode_info.crtcs[0]->base.primary->fb;3248 3249		mode1 = &rdev->mode_info.crtcs[0]->base.mode;3250		pixel_bytes1 = fb->format->cpp[0];3251	}3252	if (!(rdev->flags & RADEON_SINGLE_CRTC)) {3253		if (rdev->mode_info.crtcs[1]->base.enabled) {3254			const struct drm_framebuffer *fb =3255				rdev->mode_info.crtcs[1]->base.primary->fb;3256 3257			mode2 = &rdev->mode_info.crtcs[1]->base.mode;3258			pixel_bytes2 = fb->format->cpp[0];3259		}3260	}3261 3262	min_mem_eff.full = dfixed_const_8(0);3263	/* get modes */3264	if ((rdev->disp_priority == 2) && ASIC_IS_R300(rdev)) {3265		uint32_t mc_init_misc_lat_timer = RREG32(R300_MC_INIT_MISC_LAT_TIMER);3266		mc_init_misc_lat_timer &= ~(R300_MC_DISP1R_INIT_LAT_MASK << R300_MC_DISP1R_INIT_LAT_SHIFT);3267		mc_init_misc_lat_timer &= ~(R300_MC_DISP0R_INIT_LAT_MASK << R300_MC_DISP0R_INIT_LAT_SHIFT);3268		/* check crtc enables */3269		if (mode2)3270			mc_init_misc_lat_timer |= (1 << R300_MC_DISP1R_INIT_LAT_SHIFT);3271		if (mode1)3272			mc_init_misc_lat_timer |= (1 << R300_MC_DISP0R_INIT_LAT_SHIFT);3273		WREG32(R300_MC_INIT_MISC_LAT_TIMER, mc_init_misc_lat_timer);3274	}3275 3276	/*3277	 * determine is there is enough bw for current mode3278	 */3279	sclk_ff = rdev->pm.sclk;3280	mclk_ff = rdev->pm.mclk;3281 3282	temp = (rdev->mc.vram_width / 8) * (rdev->mc.vram_is_ddr ? 2 : 1);3283	temp_ff.full = dfixed_const(temp);3284	mem_bw.full = dfixed_mul(mclk_ff, temp_ff);3285 3286	pix_clk.full = 0;3287	pix_clk2.full = 0;3288	peak_disp_bw.full = 0;3289	if (mode1) {3290		temp_ff.full = dfixed_const(1000);3291		pix_clk.full = dfixed_const(mode1->clock); /* convert to fixed point */3292		pix_clk.full = dfixed_div(pix_clk, temp_ff);3293		temp_ff.full = dfixed_const(pixel_bytes1);3294		peak_disp_bw.full += dfixed_mul(pix_clk, temp_ff);3295	}3296	if (mode2) {3297		temp_ff.full = dfixed_const(1000);3298		pix_clk2.full = dfixed_const(mode2->clock); /* convert to fixed point */3299		pix_clk2.full = dfixed_div(pix_clk2, temp_ff);3300		temp_ff.full = dfixed_const(pixel_bytes2);3301		peak_disp_bw.full += dfixed_mul(pix_clk2, temp_ff);3302	}3303 3304	mem_bw.full = dfixed_mul(mem_bw, min_mem_eff);3305	if (peak_disp_bw.full >= mem_bw.full) {3306		DRM_ERROR("You may not have enough display bandwidth for current mode\n"3307			  "If you have flickering problem, try to lower resolution, refresh rate, or color depth\n");3308	}3309 3310	/*  Get values from the EXT_MEM_CNTL register...converting its contents. */3311	temp = RREG32(RADEON_MEM_TIMING_CNTL);3312	if ((rdev->family == CHIP_RV100) || (rdev->flags & RADEON_IS_IGP)) { /* RV100, M6, IGPs */3313		mem_trcd = ((temp >> 2) & 0x3) + 1;3314		mem_trp  = ((temp & 0x3)) + 1;3315		mem_tras = ((temp & 0x70) >> 4) + 1;3316	} else if (rdev->family == CHIP_R300 ||3317		   rdev->family == CHIP_R350) { /* r300, r350 */3318		mem_trcd = (temp & 0x7) + 1;3319		mem_trp = ((temp >> 8) & 0x7) + 1;3320		mem_tras = ((temp >> 11) & 0xf) + 4;3321	} else if (rdev->family == CHIP_RV350 ||3322		   rdev->family == CHIP_RV380) {3323		/* rv3x0 */3324		mem_trcd = (temp & 0x7) + 3;3325		mem_trp = ((temp >> 8) & 0x7) + 3;3326		mem_tras = ((temp >> 11) & 0xf) + 6;3327	} else if (rdev->family == CHIP_R420 ||3328		   rdev->family == CHIP_R423 ||3329		   rdev->family == CHIP_RV410) {3330		/* r4xx */3331		mem_trcd = (temp & 0xf) + 3;3332		if (mem_trcd > 15)3333			mem_trcd = 15;3334		mem_trp = ((temp >> 8) & 0xf) + 3;3335		if (mem_trp > 15)3336			mem_trp = 15;3337		mem_tras = ((temp >> 12) & 0x1f) + 6;3338		if (mem_tras > 31)3339			mem_tras = 31;3340	} else { /* RV200, R200 */3341		mem_trcd = (temp & 0x7) + 1;3342		mem_trp = ((temp >> 8) & 0x7) + 1;3343		mem_tras = ((temp >> 12) & 0xf) + 4;3344	}3345	/* convert to FF */3346	trcd_ff.full = dfixed_const(mem_trcd);3347	trp_ff.full = dfixed_const(mem_trp);3348	tras_ff.full = dfixed_const(mem_tras);3349 3350	/* Get values from the MEM_SDRAM_MODE_REG register...converting its */3351	temp = RREG32(RADEON_MEM_SDRAM_MODE_REG);3352	data = (temp & (7 << 20)) >> 20;3353	if ((rdev->family == CHIP_RV100) || rdev->flags & RADEON_IS_IGP) {3354		if (rdev->family == CHIP_RS480) /* don't think rs400 */3355			tcas_ff = memtcas_rs480_ff[data];3356		else3357			tcas_ff = memtcas_ff[data];3358	} else3359		tcas_ff = memtcas2_ff[data];3360 3361	if (rdev->family == CHIP_RS400 ||3362	    rdev->family == CHIP_RS480) {3363		/* extra cas latency stored in bits 23-25 0-4 clocks */3364		data = (temp >> 23) & 0x7;3365		if (data < 5)3366			tcas_ff.full += dfixed_const(data);3367	}3368 3369	if (ASIC_IS_R300(rdev) && !(rdev->flags & RADEON_IS_IGP)) {3370		/* on the R300, Tcas is included in Trbs.3371		 */3372		temp = RREG32(RADEON_MEM_CNTL);3373		data = (R300_MEM_NUM_CHANNELS_MASK & temp);3374		if (data == 1) {3375			if (R300_MEM_USE_CD_CH_ONLY & temp) {3376				temp = RREG32(R300_MC_IND_INDEX);3377				temp &= ~R300_MC_IND_ADDR_MASK;3378				temp |= R300_MC_READ_CNTL_CD_mcind;3379				WREG32(R300_MC_IND_INDEX, temp);3380				temp = RREG32(R300_MC_IND_DATA);3381				data = (R300_MEM_RBS_POSITION_C_MASK & temp);3382			} else {3383				temp = RREG32(R300_MC_READ_CNTL_AB);3384				data = (R300_MEM_RBS_POSITION_A_MASK & temp);3385			}3386		} else {3387			temp = RREG32(R300_MC_READ_CNTL_AB);3388			data = (R300_MEM_RBS_POSITION_A_MASK & temp);3389		}3390		if (rdev->family == CHIP_RV410 ||3391		    rdev->family == CHIP_R420 ||3392		    rdev->family == CHIP_R423)3393			trbs_ff = memtrbs_r4xx[data];3394		else3395			trbs_ff = memtrbs[data];3396		tcas_ff.full += trbs_ff.full;3397	}3398 3399	sclk_eff_ff.full = sclk_ff.full;3400 3401	if (rdev->flags & RADEON_IS_AGP) {3402		fixed20_12 agpmode_ff;3403		agpmode_ff.full = dfixed_const(radeon_agpmode);3404		temp_ff.full = dfixed_const_666(16);3405		sclk_eff_ff.full -= dfixed_mul(agpmode_ff, temp_ff);3406	}3407	/* TODO PCIE lanes may affect this - agpmode == 16?? */3408 3409	if (ASIC_IS_R300(rdev)) {3410		sclk_delay_ff.full = dfixed_const(250);3411	} else {3412		if ((rdev->family == CHIP_RV100) ||3413		    rdev->flags & RADEON_IS_IGP) {3414			if (rdev->mc.vram_is_ddr)3415				sclk_delay_ff.full = dfixed_const(41);3416			else3417				sclk_delay_ff.full = dfixed_const(33);3418		} else {3419			if (rdev->mc.vram_width == 128)3420				sclk_delay_ff.full = dfixed_const(57);3421			else3422				sclk_delay_ff.full = dfixed_const(41);3423		}3424	}3425 3426	mc_latency_sclk.full = dfixed_div(sclk_delay_ff, sclk_eff_ff);3427 3428	if (rdev->mc.vram_is_ddr) {3429		if (rdev->mc.vram_width == 32) {3430			k1.full = dfixed_const(40);3431			c  = 3;3432		} else {3433			k1.full = dfixed_const(20);3434			c  = 1;3435		}3436	} else {3437		k1.full = dfixed_const(40);3438		c  = 3;3439	}3440 3441	temp_ff.full = dfixed_const(2);3442	mc_latency_mclk.full = dfixed_mul(trcd_ff, temp_ff);3443	temp_ff.full = dfixed_const(c);3444	mc_latency_mclk.full += dfixed_mul(tcas_ff, temp_ff);3445	temp_ff.full = dfixed_const(4);3446	mc_latency_mclk.full += dfixed_mul(tras_ff, temp_ff);3447	mc_latency_mclk.full += dfixed_mul(trp_ff, temp_ff);3448	mc_latency_mclk.full += k1.full;3449 3450	mc_latency_mclk.full = dfixed_div(mc_latency_mclk, mclk_ff);3451	mc_latency_mclk.full += dfixed_div(temp_ff, sclk_eff_ff);3452 3453	/*3454	  HW cursor time assuming worst case of full size colour cursor.3455	*/3456	temp_ff.full = dfixed_const((2 * (cur_size - (rdev->mc.vram_is_ddr + 1))));3457	temp_ff.full += trcd_ff.full;3458	if (temp_ff.full < tras_ff.full)3459		temp_ff.full = tras_ff.full;3460	cur_latency_mclk.full = dfixed_div(temp_ff, mclk_ff);3461 3462	temp_ff.full = dfixed_const(cur_size);3463	cur_latency_sclk.full = dfixed_div(temp_ff, sclk_eff_ff);3464	/*3465	  Find the total latency for the display data.3466	*/3467	disp_latency_overhead.full = dfixed_const(8);3468	disp_latency_overhead.full = dfixed_div(disp_latency_overhead, sclk_ff);3469	mc_latency_mclk.full += disp_latency_overhead.full + cur_latency_mclk.full;3470	mc_latency_sclk.full += disp_latency_overhead.full + cur_latency_sclk.full;3471 3472	if (mc_latency_mclk.full > mc_latency_sclk.full)3473		disp_latency.full = mc_latency_mclk.full;3474	else3475		disp_latency.full = mc_latency_sclk.full;3476 3477	/* setup Max GRPH_STOP_REQ default value */3478	if (ASIC_IS_RV100(rdev))3479		max_stop_req = 0x5c;3480	else3481		max_stop_req = 0x7c;3482 3483	if (mode1) {3484		/*  CRTC13485		    Set GRPH_BUFFER_CNTL register using h/w defined optimal values.3486		    GRPH_STOP_REQ <= MIN[ 0x7C, (CRTC_H_DISP + 1) * (bit depth) / 0x10 ]3487		*/3488		stop_req = mode1->hdisplay * pixel_bytes1 / 16;3489 3490		if (stop_req > max_stop_req)3491			stop_req = max_stop_req;3492 3493		/*3494		  Find the drain rate of the display buffer.3495		*/3496		temp_ff.full = dfixed_const((16/pixel_bytes1));3497		disp_drain_rate.full = dfixed_div(pix_clk, temp_ff);3498 3499		/*3500		  Find the critical point of the display buffer.3501		*/3502		crit_point_ff.full = dfixed_mul(disp_drain_rate, disp_latency);3503		crit_point_ff.full += dfixed_const_half(0);3504 3505		critical_point = dfixed_trunc(crit_point_ff);3506 3507		if (rdev->disp_priority == 2) {3508			critical_point = 0;3509		}3510 3511		/*3512		  The critical point should never be above max_stop_req-4.  Setting3513		  GRPH_CRITICAL_CNTL = 0 will thus force high priority all the time.3514		*/3515		if (max_stop_req - critical_point < 4)3516			critical_point = 0;3517 3518		if (critical_point == 0 && mode2 && rdev->family == CHIP_R300) {3519			/* some R300 cards have problem with this set to 0, when CRTC2 is enabled.*/3520			critical_point = 0x10;3521		}3522 3523		temp = RREG32(RADEON_GRPH_BUFFER_CNTL);3524		temp &= ~(RADEON_GRPH_STOP_REQ_MASK);3525		temp |= (stop_req << RADEON_GRPH_STOP_REQ_SHIFT);3526		temp &= ~(RADEON_GRPH_START_REQ_MASK);3527		if ((rdev->family == CHIP_R350) &&3528		    (stop_req > 0x15)) {3529			stop_req -= 0x10;3530		}3531		temp |= (stop_req << RADEON_GRPH_START_REQ_SHIFT);3532		temp |= RADEON_GRPH_BUFFER_SIZE;3533		temp &= ~(RADEON_GRPH_CRITICAL_CNTL   |3534			  RADEON_GRPH_CRITICAL_AT_SOF |3535			  RADEON_GRPH_STOP_CNTL);3536		/*3537		  Write the result into the register.3538		*/3539		WREG32(RADEON_GRPH_BUFFER_CNTL, ((temp & ~RADEON_GRPH_CRITICAL_POINT_MASK) |3540						       (critical_point << RADEON_GRPH_CRITICAL_POINT_SHIFT)));3541 3542#if 03543		if ((rdev->family == CHIP_RS400) ||3544		    (rdev->family == CHIP_RS480)) {3545			/* attempt to program RS400 disp regs correctly ??? */3546			temp = RREG32(RS400_DISP1_REG_CNTL);3547			temp &= ~(RS400_DISP1_START_REQ_LEVEL_MASK |3548				  RS400_DISP1_STOP_REQ_LEVEL_MASK);3549			WREG32(RS400_DISP1_REQ_CNTL1, (temp |3550						       (critical_point << RS400_DISP1_START_REQ_LEVEL_SHIFT) |3551						       (critical_point << RS400_DISP1_STOP_REQ_LEVEL_SHIFT)));3552			temp = RREG32(RS400_DMIF_MEM_CNTL1);3553			temp &= ~(RS400_DISP1_CRITICAL_POINT_START_MASK |3554				  RS400_DISP1_CRITICAL_POINT_STOP_MASK);3555			WREG32(RS400_DMIF_MEM_CNTL1, (temp |3556						      (critical_point << RS400_DISP1_CRITICAL_POINT_START_SHIFT) |3557						      (critical_point << RS400_DISP1_CRITICAL_POINT_STOP_SHIFT)));3558		}3559#endif3560 3561		DRM_DEBUG_KMS("GRPH_BUFFER_CNTL from to %x\n",3562			  /* 	  (unsigned int)info->SavedReg->grph_buffer_cntl, */3563			  (unsigned int)RREG32(RADEON_GRPH_BUFFER_CNTL));3564	}3565 3566	if (mode2) {3567		u32 grph2_cntl;3568		stop_req = mode2->hdisplay * pixel_bytes2 / 16;3569 3570		if (stop_req > max_stop_req)3571			stop_req = max_stop_req;3572 3573		/*3574		  Find the drain rate of the display buffer.3575		*/3576		temp_ff.full = dfixed_const((16/pixel_bytes2));3577		disp_drain_rate2.full = dfixed_div(pix_clk2, temp_ff);3578 3579		grph2_cntl = RREG32(RADEON_GRPH2_BUFFER_CNTL);3580		grph2_cntl &= ~(RADEON_GRPH_STOP_REQ_MASK);3581		grph2_cntl |= (stop_req << RADEON_GRPH_STOP_REQ_SHIFT);3582		grph2_cntl &= ~(RADEON_GRPH_START_REQ_MASK);3583		if ((rdev->family == CHIP_R350) &&3584		    (stop_req > 0x15)) {3585			stop_req -= 0x10;3586		}3587		grph2_cntl |= (stop_req << RADEON_GRPH_START_REQ_SHIFT);3588		grph2_cntl |= RADEON_GRPH_BUFFER_SIZE;3589		grph2_cntl &= ~(RADEON_GRPH_CRITICAL_CNTL   |3590			  RADEON_GRPH_CRITICAL_AT_SOF |3591			  RADEON_GRPH_STOP_CNTL);3592 3593		if ((rdev->family == CHIP_RS100) ||3594		    (rdev->family == CHIP_RS200))3595			critical_point2 = 0;3596		else {3597			temp = (rdev->mc.vram_width * rdev->mc.vram_is_ddr + 1)/128;3598			temp_ff.full = dfixed_const(temp);3599			temp_ff.full = dfixed_mul(mclk_ff, temp_ff);3600			if (sclk_ff.full < temp_ff.full)3601				temp_ff.full = sclk_ff.full;3602 3603			read_return_rate.full = temp_ff.full;3604 3605			if (mode1) {3606				temp_ff.full = read_return_rate.full - disp_drain_rate.full;3607				time_disp1_drop_priority.full = dfixed_div(crit_point_ff, temp_ff);3608			} else {3609				time_disp1_drop_priority.full = 0;3610			}3611			crit_point_ff.full = disp_latency.full + time_disp1_drop_priority.full + disp_latency.full;3612			crit_point_ff.full = dfixed_mul(crit_point_ff, disp_drain_rate2);3613			crit_point_ff.full += dfixed_const_half(0);3614 3615			critical_point2 = dfixed_trunc(crit_point_ff);3616 3617			if (rdev->disp_priority == 2) {3618				critical_point2 = 0;3619			}3620 3621			if (max_stop_req - critical_point2 < 4)3622				critical_point2 = 0;3623 3624		}3625 3626		if (critical_point2 == 0 && rdev->family == CHIP_R300) {3627			/* some R300 cards have problem with this set to 0 */3628			critical_point2 = 0x10;3629		}3630 3631		WREG32(RADEON_GRPH2_BUFFER_CNTL, ((grph2_cntl & ~RADEON_GRPH_CRITICAL_POINT_MASK) |3632						  (critical_point2 << RADEON_GRPH_CRITICAL_POINT_SHIFT)));3633 3634		if ((rdev->family == CHIP_RS400) ||3635		    (rdev->family == CHIP_RS480)) {3636#if 03637			/* attempt to program RS400 disp2 regs correctly ??? */3638			temp = RREG32(RS400_DISP2_REQ_CNTL1);3639			temp &= ~(RS400_DISP2_START_REQ_LEVEL_MASK |3640				  RS400_DISP2_STOP_REQ_LEVEL_MASK);3641			WREG32(RS400_DISP2_REQ_CNTL1, (temp |3642						       (critical_point2 << RS400_DISP1_START_REQ_LEVEL_SHIFT) |3643						       (critical_point2 << RS400_DISP1_STOP_REQ_LEVEL_SHIFT)));3644			temp = RREG32(RS400_DISP2_REQ_CNTL2);3645			temp &= ~(RS400_DISP2_CRITICAL_POINT_START_MASK |3646				  RS400_DISP2_CRITICAL_POINT_STOP_MASK);3647			WREG32(RS400_DISP2_REQ_CNTL2, (temp |3648						       (critical_point2 << RS400_DISP2_CRITICAL_POINT_START_SHIFT) |3649						       (critical_point2 << RS400_DISP2_CRITICAL_POINT_STOP_SHIFT)));3650#endif3651			WREG32(RS400_DISP2_REQ_CNTL1, 0x105DC1CC);3652			WREG32(RS400_DISP2_REQ_CNTL2, 0x2749D000);3653			WREG32(RS400_DMIF_MEM_CNTL1,  0x29CA71DC);3654			WREG32(RS400_DISP1_REQ_CNTL1, 0x28FBC3AC);3655		}3656 3657		DRM_DEBUG_KMS("GRPH2_BUFFER_CNTL from to %x\n",3658			  (unsigned int)RREG32(RADEON_GRPH2_BUFFER_CNTL));3659	}3660 3661	/* Save number of lines the linebuffer leads before the scanout */3662	if (mode1)3663	    rdev->mode_info.crtcs[0]->lb_vblank_lead_lines = DIV_ROUND_UP(lb_size, mode1->crtc_hdisplay);3664 3665	if (mode2)3666	    rdev->mode_info.crtcs[1]->lb_vblank_lead_lines = DIV_ROUND_UP(lb_size, mode2->crtc_hdisplay);3667}3668 3669int r100_ring_test(struct radeon_device *rdev, struct radeon_ring *ring)3670{3671	uint32_t scratch;3672	uint32_t tmp = 0;3673	unsigned i;3674	int r;3675 3676	r = radeon_scratch_get(rdev, &scratch);3677	if (r) {3678		DRM_ERROR("radeon: cp failed to get scratch reg (%d).\n", r);3679		return r;3680	}3681	WREG32(scratch, 0xCAFEDEAD);3682	r = radeon_ring_lock(rdev, ring, 2);3683	if (r) {3684		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);3685		radeon_scratch_free(rdev, scratch);3686		return r;3687	}3688	radeon_ring_write(ring, PACKET0(scratch, 0));3689	radeon_ring_write(ring, 0xDEADBEEF);3690	radeon_ring_unlock_commit(rdev, ring, false);3691	for (i = 0; i < rdev->usec_timeout; i++) {3692		tmp = RREG32(scratch);3693		if (tmp == 0xDEADBEEF) {3694			break;3695		}3696		udelay(1);3697	}3698	if (i < rdev->usec_timeout) {3699		DRM_INFO("ring test succeeded in %d usecs\n", i);3700	} else {3701		DRM_ERROR("radeon: ring test failed (scratch(0x%04X)=0x%08X)\n",3702			  scratch, tmp);3703		r = -EINVAL;3704	}3705	radeon_scratch_free(rdev, scratch);3706	return r;3707}3708 3709void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)3710{3711	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];3712 3713	if (ring->rptr_save_reg) {3714		u32 next_rptr = ring->wptr + 2 + 3;3715		radeon_ring_write(ring, PACKET0(ring->rptr_save_reg, 0));3716		radeon_ring_write(ring, next_rptr);3717	}3718 3719	radeon_ring_write(ring, PACKET0(RADEON_CP_IB_BASE, 1));3720	radeon_ring_write(ring, ib->gpu_addr);3721	radeon_ring_write(ring, ib->length_dw);3722}3723 3724int r100_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)3725{3726	struct radeon_ib ib;3727	uint32_t scratch;3728	uint32_t tmp = 0;3729	unsigned i;3730	int r;3731 3732	r = radeon_scratch_get(rdev, &scratch);3733	if (r) {3734		DRM_ERROR("radeon: failed to get scratch reg (%d).\n", r);3735		return r;3736	}3737	WREG32(scratch, 0xCAFEDEAD);3738	r = radeon_ib_get(rdev, RADEON_RING_TYPE_GFX_INDEX, &ib, NULL, 256);3739	if (r) {3740		DRM_ERROR("radeon: failed to get ib (%d).\n", r);3741		goto free_scratch;3742	}3743	ib.ptr[0] = PACKET0(scratch, 0);3744	ib.ptr[1] = 0xDEADBEEF;3745	ib.ptr[2] = PACKET2(0);3746	ib.ptr[3] = PACKET2(0);3747	ib.ptr[4] = PACKET2(0);3748	ib.ptr[5] = PACKET2(0);3749	ib.ptr[6] = PACKET2(0);3750	ib.ptr[7] = PACKET2(0);3751	ib.length_dw = 8;3752	r = radeon_ib_schedule(rdev, &ib, NULL, false);3753	if (r) {3754		DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);3755		goto free_ib;3756	}3757	r = radeon_fence_wait_timeout(ib.fence, false, usecs_to_jiffies(3758		RADEON_USEC_IB_TEST_TIMEOUT));3759	if (r < 0) {3760		DRM_ERROR("radeon: fence wait failed (%d).\n", r);3761		goto free_ib;3762	} else if (r == 0) {3763		DRM_ERROR("radeon: fence wait timed out.\n");3764		r = -ETIMEDOUT;3765		goto free_ib;3766	}3767	r = 0;3768	for (i = 0; i < rdev->usec_timeout; i++) {3769		tmp = RREG32(scratch);3770		if (tmp == 0xDEADBEEF) {3771			break;3772		}3773		udelay(1);3774	}3775	if (i < rdev->usec_timeout) {3776		DRM_INFO("ib test succeeded in %u usecs\n", i);3777	} else {3778		DRM_ERROR("radeon: ib test failed (scratch(0x%04X)=0x%08X)\n",3779			  scratch, tmp);3780		r = -EINVAL;3781	}3782free_ib:3783	radeon_ib_free(rdev, &ib);3784free_scratch:3785	radeon_scratch_free(rdev, scratch);3786	return r;3787}3788 3789void r100_mc_stop(struct radeon_device *rdev, struct r100_mc_save *save)3790{3791	/* Shutdown CP we shouldn't need to do that but better be safe than3792	 * sorry3793	 */3794	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;3795	WREG32(R_000740_CP_CSQ_CNTL, 0);3796 3797	/* Save few CRTC registers */3798	save->GENMO_WT = RREG8(R_0003C2_GENMO_WT);3799	save->CRTC_EXT_CNTL = RREG32(R_000054_CRTC_EXT_CNTL);3800	save->CRTC_GEN_CNTL = RREG32(R_000050_CRTC_GEN_CNTL);3801	save->CUR_OFFSET = RREG32(R_000260_CUR_OFFSET);3802	if (!(rdev->flags & RADEON_SINGLE_CRTC)) {3803		save->CRTC2_GEN_CNTL = RREG32(R_0003F8_CRTC2_GEN_CNTL);3804		save->CUR2_OFFSET = RREG32(R_000360_CUR2_OFFSET);3805	}3806 3807	/* Disable VGA aperture access */3808	WREG8(R_0003C2_GENMO_WT, C_0003C2_VGA_RAM_EN & save->GENMO_WT);3809	/* Disable cursor, overlay, crtc */3810	WREG32(R_000260_CUR_OFFSET, save->CUR_OFFSET | S_000260_CUR_LOCK(1));3811	WREG32(R_000054_CRTC_EXT_CNTL, save->CRTC_EXT_CNTL |3812					S_000054_CRTC_DISPLAY_DIS(1));3813	WREG32(R_000050_CRTC_GEN_CNTL,3814			(C_000050_CRTC_CUR_EN & save->CRTC_GEN_CNTL) |3815			S_000050_CRTC_DISP_REQ_EN_B(1));3816	WREG32(R_000420_OV0_SCALE_CNTL,3817		C_000420_OV0_OVERLAY_EN & RREG32(R_000420_OV0_SCALE_CNTL));3818	WREG32(R_000260_CUR_OFFSET, C_000260_CUR_LOCK & save->CUR_OFFSET);3819	if (!(rdev->flags & RADEON_SINGLE_CRTC)) {3820		WREG32(R_000360_CUR2_OFFSET, save->CUR2_OFFSET |3821						S_000360_CUR2_LOCK(1));3822		WREG32(R_0003F8_CRTC2_GEN_CNTL,3823			(C_0003F8_CRTC2_CUR_EN & save->CRTC2_GEN_CNTL) |3824			S_0003F8_CRTC2_DISPLAY_DIS(1) |3825			S_0003F8_CRTC2_DISP_REQ_EN_B(1));3826		WREG32(R_000360_CUR2_OFFSET,3827			C_000360_CUR2_LOCK & save->CUR2_OFFSET);3828	}3829}3830 3831void r100_mc_resume(struct radeon_device *rdev, struct r100_mc_save *save)3832{3833	/* Update base address for crtc */3834	WREG32(R_00023C_DISPLAY_BASE_ADDR, rdev->mc.vram_start);3835	if (!(rdev->flags & RADEON_SINGLE_CRTC)) {3836		WREG32(R_00033C_CRTC2_DISPLAY_BASE_ADDR, rdev->mc.vram_start);3837	}3838	/* Restore CRTC registers */3839	WREG8(R_0003C2_GENMO_WT, save->GENMO_WT);3840	WREG32(R_000054_CRTC_EXT_CNTL, save->CRTC_EXT_CNTL);3841	WREG32(R_000050_CRTC_GEN_CNTL, save->CRTC_GEN_CNTL);3842	if (!(rdev->flags & RADEON_SINGLE_CRTC)) {3843		WREG32(R_0003F8_CRTC2_GEN_CNTL, save->CRTC2_GEN_CNTL);3844	}3845}3846 3847void r100_vga_render_disable(struct radeon_device *rdev)3848{3849	u32 tmp;3850 3851	tmp = RREG8(R_0003C2_GENMO_WT);3852	WREG8(R_0003C2_GENMO_WT, C_0003C2_VGA_RAM_EN & tmp);3853}3854 3855static void r100_mc_program(struct radeon_device *rdev)3856{3857	struct r100_mc_save save;3858 3859	/* Stops all mc clients */3860	r100_mc_stop(rdev, &save);3861	if (rdev->flags & RADEON_IS_AGP) {3862		WREG32(R_00014C_MC_AGP_LOCATION,3863			S_00014C_MC_AGP_START(rdev->mc.gtt_start >> 16) |3864			S_00014C_MC_AGP_TOP(rdev->mc.gtt_end >> 16));3865		WREG32(R_000170_AGP_BASE, lower_32_bits(rdev->mc.agp_base));3866		if (rdev->family > CHIP_RV200)3867			WREG32(R_00015C_AGP_BASE_2,3868				upper_32_bits(rdev->mc.agp_base) & 0xff);3869	} else {3870		WREG32(R_00014C_MC_AGP_LOCATION, 0x0FFFFFFF);3871		WREG32(R_000170_AGP_BASE, 0);3872		if (rdev->family > CHIP_RV200)3873			WREG32(R_00015C_AGP_BASE_2, 0);3874	}3875	/* Wait for mc idle */3876	if (r100_mc_wait_for_idle(rdev))3877		dev_warn(rdev->dev, "Wait for MC idle timeout.\n");3878	/* Program MC, should be a 32bits limited address space */3879	WREG32(R_000148_MC_FB_LOCATION,3880		S_000148_MC_FB_START(rdev->mc.vram_start >> 16) |3881		S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16));3882	r100_mc_resume(rdev, &save);3883}3884 3885static void r100_clock_startup(struct radeon_device *rdev)3886{3887	u32 tmp;3888 3889	if (radeon_dynclks != -1 && radeon_dynclks)3890		radeon_legacy_set_clock_gating(rdev, 1);3891	/* We need to force on some of the block */3892	tmp = RREG32_PLL(R_00000D_SCLK_CNTL);3893	tmp |= S_00000D_FORCE_CP(1) | S_00000D_FORCE_VIP(1);3894	if ((rdev->family == CHIP_RV250) || (rdev->family == CHIP_RV280))3895		tmp |= S_00000D_FORCE_DISP1(1) | S_00000D_FORCE_DISP2(1);3896	WREG32_PLL(R_00000D_SCLK_CNTL, tmp);3897}3898 3899static int r100_startup(struct radeon_device *rdev)3900{3901	int r;3902 3903	/* set common regs */3904	r100_set_common_regs(rdev);3905	/* program mc */3906	r100_mc_program(rdev);3907	/* Resume clock */3908	r100_clock_startup(rdev);3909	/* Initialize GART (initialize after TTM so we can allocate3910	 * memory through TTM but finalize after TTM) */3911	r100_enable_bm(rdev);3912	if (rdev->flags & RADEON_IS_PCI) {3913		r = r100_pci_gart_enable(rdev);3914		if (r)3915			return r;3916	}3917 3918	/* allocate wb buffer */3919	r = radeon_wb_init(rdev);3920	if (r)3921		return r;3922 3923	r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);3924	if (r) {3925		dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);3926		return r;3927	}3928 3929	/* Enable IRQ */3930	if (!rdev->irq.installed) {3931		r = radeon_irq_kms_init(rdev);3932		if (r)3933			return r;3934	}3935 3936	r100_irq_set(rdev);3937	rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);3938	/* 1M ring buffer */3939	r = r100_cp_init(rdev, 1024 * 1024);3940	if (r) {3941		dev_err(rdev->dev, "failed initializing CP (%d).\n", r);3942		return r;3943	}3944 3945	r = radeon_ib_pool_init(rdev);3946	if (r) {3947		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);3948		return r;3949	}3950 3951	return 0;3952}3953 3954int r100_resume(struct radeon_device *rdev)3955{3956	int r;3957 3958	/* Make sur GART are not working */3959	if (rdev->flags & RADEON_IS_PCI)3960		r100_pci_gart_disable(rdev);3961	/* Resume clock before doing reset */3962	r100_clock_startup(rdev);3963	/* Reset gpu before posting otherwise ATOM will enter infinite loop */3964	if (radeon_asic_reset(rdev)) {3965		dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n",3966			RREG32(R_000E40_RBBM_STATUS),3967			RREG32(R_0007C0_CP_STAT));3968	}3969	/* post */3970	radeon_combios_asic_init(rdev_to_drm(rdev));3971	/* Resume clock after posting */3972	r100_clock_startup(rdev);3973	/* Initialize surface registers */3974	radeon_surface_init(rdev);3975 3976	rdev->accel_working = true;3977	r = r100_startup(rdev);3978	if (r) {3979		rdev->accel_working = false;3980	}3981	return r;3982}3983 3984int r100_suspend(struct radeon_device *rdev)3985{3986	radeon_pm_suspend(rdev);3987	r100_cp_disable(rdev);3988	radeon_wb_disable(rdev);3989	r100_irq_disable(rdev);3990	if (rdev->flags & RADEON_IS_PCI)3991		r100_pci_gart_disable(rdev);3992	return 0;3993}3994 3995void r100_fini(struct radeon_device *rdev)3996{3997	radeon_pm_fini(rdev);3998	r100_cp_fini(rdev);3999	radeon_wb_fini(rdev);4000	radeon_ib_pool_fini(rdev);4001	radeon_gem_fini(rdev);4002	if (rdev->flags & RADEON_IS_PCI)4003		r100_pci_gart_fini(rdev);4004	radeon_agp_fini(rdev);4005	radeon_irq_kms_fini(rdev);4006	radeon_fence_driver_fini(rdev);4007	radeon_bo_fini(rdev);4008	radeon_atombios_fini(rdev);4009	kfree(rdev->bios);4010	rdev->bios = NULL;4011}4012 4013/*4014 * Due to how kexec works, it can leave the hw fully initialised when it4015 * boots the new kernel. However doing our init sequence with the CP and4016 * WB stuff setup causes GPU hangs on the RN50 at least. So at startup4017 * do some quick sanity checks and restore sane values to avoid this4018 * problem.4019 */4020void r100_restore_sanity(struct radeon_device *rdev)4021{4022	u32 tmp;4023 4024	tmp = RREG32(RADEON_CP_CSQ_CNTL);4025	if (tmp) {4026		WREG32(RADEON_CP_CSQ_CNTL, 0);4027	}4028	tmp = RREG32(RADEON_CP_RB_CNTL);4029	if (tmp) {4030		WREG32(RADEON_CP_RB_CNTL, 0);4031	}4032	tmp = RREG32(RADEON_SCRATCH_UMSK);4033	if (tmp) {4034		WREG32(RADEON_SCRATCH_UMSK, 0);4035	}4036}4037 4038int r100_init(struct radeon_device *rdev)4039{4040	int r;4041 4042	/* Register debugfs file specific to this group of asics */4043	r100_debugfs_mc_info_init(rdev);4044	/* Disable VGA */4045	r100_vga_render_disable(rdev);4046	/* Initialize scratch registers */4047	radeon_scratch_init(rdev);4048	/* Initialize surface registers */4049	radeon_surface_init(rdev);4050	/* sanity check some register to avoid hangs like after kexec */4051	r100_restore_sanity(rdev);4052	/* TODO: disable VGA need to use VGA request */4053	/* BIOS*/4054	if (!radeon_get_bios(rdev)) {4055		if (ASIC_IS_AVIVO(rdev))4056			return -EINVAL;4057	}4058	if (rdev->is_atom_bios) {4059		dev_err(rdev->dev, "Expecting combios for RS400/RS480 GPU\n");4060		return -EINVAL;4061	} else {4062		r = radeon_combios_init(rdev);4063		if (r)4064			return r;4065	}4066	/* Reset gpu before posting otherwise ATOM will enter infinite loop */4067	if (radeon_asic_reset(rdev)) {4068		dev_warn(rdev->dev,4069			"GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n",4070			RREG32(R_000E40_RBBM_STATUS),4071			RREG32(R_0007C0_CP_STAT));4072	}4073	/* check if cards are posted or not */4074	if (radeon_boot_test_post_card(rdev) == false)4075		return -EINVAL;4076	/* Set asic errata */4077	r100_errata(rdev);4078	/* Initialize clocks */4079	radeon_get_clock_info(rdev_to_drm(rdev));4080	/* initialize AGP */4081	if (rdev->flags & RADEON_IS_AGP) {4082		r = radeon_agp_init(rdev);4083		if (r) {4084			radeon_agp_disable(rdev);4085		}4086	}4087	/* initialize VRAM */4088	r100_mc_init(rdev);4089	/* Fence driver */4090	radeon_fence_driver_init(rdev);4091	/* Memory manager */4092	r = radeon_bo_init(rdev);4093	if (r)4094		return r;4095	if (rdev->flags & RADEON_IS_PCI) {4096		r = r100_pci_gart_init(rdev);4097		if (r)4098			return r;4099	}4100	r100_set_safe_registers(rdev);4101 4102	/* Initialize power management */4103	radeon_pm_init(rdev);4104 4105	rdev->accel_working = true;4106	r = r100_startup(rdev);4107	if (r) {4108		/* Somethings want wront with the accel init stop accel */4109		dev_err(rdev->dev, "Disabling GPU acceleration\n");4110		r100_cp_fini(rdev);4111		radeon_wb_fini(rdev);4112		radeon_ib_pool_fini(rdev);4113		radeon_irq_kms_fini(rdev);4114		if (rdev->flags & RADEON_IS_PCI)4115			r100_pci_gart_fini(rdev);4116		rdev->accel_working = false;4117	}4118	return 0;4119}4120 4121uint32_t r100_mm_rreg_slow(struct radeon_device *rdev, uint32_t reg)4122{4123	unsigned long flags;4124	uint32_t ret;4125 4126	spin_lock_irqsave(&rdev->mmio_idx_lock, flags);4127	writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX);4128	ret = readl(((void __iomem *)rdev->rmmio) + RADEON_MM_DATA);4129	spin_unlock_irqrestore(&rdev->mmio_idx_lock, flags);4130	return ret;4131}4132 4133void r100_mm_wreg_slow(struct radeon_device *rdev, uint32_t reg, uint32_t v)4134{4135	unsigned long flags;4136 4137	spin_lock_irqsave(&rdev->mmio_idx_lock, flags);4138	writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX);4139	writel(v, ((void __iomem *)rdev->rmmio) + RADEON_MM_DATA);4140	spin_unlock_irqrestore(&rdev->mmio_idx_lock, flags);4141}4142 4143u32 r100_io_rreg(struct radeon_device *rdev, u32 reg)4144{4145	if (reg < rdev->rio_mem_size)4146		return ioread32(rdev->rio_mem + reg);4147	else {4148		iowrite32(reg, rdev->rio_mem + RADEON_MM_INDEX);4149		return ioread32(rdev->rio_mem + RADEON_MM_DATA);4150	}4151}4152 4153void r100_io_wreg(struct radeon_device *rdev, u32 reg, u32 v)4154{4155	if (reg < rdev->rio_mem_size)4156		iowrite32(v, rdev->rio_mem + reg);4157	else {4158		iowrite32(reg, rdev->rio_mem + RADEON_MM_INDEX);4159		iowrite32(v, rdev->rio_mem + RADEON_MM_DATA);4160	}4161}4162