Subversion Repositories Kolibri OS

Rev

Rev 2005 | Rev 3120 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2005 Rev 2997
Line 31... Line 31...
31
#include 
31
#include 
32
#include 
32
#include 
33
#include "radeon_reg.h"
33
#include "radeon_reg.h"
34
#include "radeon.h"
34
#include "radeon.h"
35
#include "radeon_asic.h"
35
#include "radeon_asic.h"
36
#include "radeon_drm.h"
36
#include 
Line 37... Line 37...
37
 
37
 
38
#include "r300d.h"
38
#include "r300d.h"
39
#include "rv350d.h"
39
#include "rv350d.h"
Line 72... Line 72...
72
#define R300_PTE_WRITEABLE (1 << 2)
72
#define R300_PTE_WRITEABLE (1 << 2)
73
#define R300_PTE_READABLE  (1 << 3)
73
#define R300_PTE_READABLE  (1 << 3)
Line 74... Line 74...
74
 
74
 
75
int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr)
75
int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr)
76
{
76
{
Line 77... Line 77...
77
	void __iomem *ptr = (void *)rdev->gart.table.vram.ptr;
77
	void __iomem *ptr = rdev->gart.ptr;
78
 
78
 
79
	if (i < 0 || i > rdev->gart.num_gpu_pages) {
79
	if (i < 0 || i > rdev->gart.num_gpu_pages) {
80
		return -EINVAL;
80
		return -EINVAL;
Line 91... Line 91...
91
 
91
 
92
int rv370_pcie_gart_init(struct radeon_device *rdev)
92
int rv370_pcie_gart_init(struct radeon_device *rdev)
93
{
93
{
Line 94... Line 94...
94
	int r;
94
	int r;
95
 
95
 
96
	if (rdev->gart.table.vram.robj) {
96
	if (rdev->gart.robj) {
97
		WARN(1, "RV370 PCIE GART already initialized\n");
97
		WARN(1, "RV370 PCIE GART already initialized\n");
98
		return 0;
98
		return 0;
99
	}
99
	}
Line 103... Line 103...
103
		return r;
103
		return r;
104
	r = rv370_debugfs_pcie_gart_info_init(rdev);
104
	r = rv370_debugfs_pcie_gart_info_init(rdev);
105
	if (r)
105
	if (r)
106
		DRM_ERROR("Failed to register debugfs file for PCIE gart !\n");
106
		DRM_ERROR("Failed to register debugfs file for PCIE gart !\n");
107
	rdev->gart.table_size = rdev->gart.num_gpu_pages * 4;
107
	rdev->gart.table_size = rdev->gart.num_gpu_pages * 4;
108
	rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush;
108
	rdev->asic->gart.tlb_flush = &rv370_pcie_gart_tlb_flush;
109
	rdev->asic->gart_set_page = &rv370_pcie_gart_set_page;
109
	rdev->asic->gart.set_page = &rv370_pcie_gart_set_page;
110
	return radeon_gart_table_vram_alloc(rdev);
110
	return radeon_gart_table_vram_alloc(rdev);
111
}
111
}
Line 112... Line 112...
112
 
112
 
113
int rv370_pcie_gart_enable(struct radeon_device *rdev)
113
int rv370_pcie_gart_enable(struct radeon_device *rdev)
114
{
114
{
115
	uint32_t table_addr;
115
	uint32_t table_addr;
116
	uint32_t tmp;
116
	uint32_t tmp;
Line 117... Line 117...
117
	int r;
117
	int r;
118
 
118
 
119
	if (rdev->gart.table.vram.robj == NULL) {
119
	if (rdev->gart.robj == NULL) {
120
		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
120
		dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
121
		return -EINVAL;
121
		return -EINVAL;
122
	}
122
	}
Line 142... Line 142...
142
	tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL);
142
	tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL);
143
	tmp |= RADEON_PCIE_TX_GART_EN;
143
	tmp |= RADEON_PCIE_TX_GART_EN;
144
	tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD;
144
	tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD;
145
	WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
145
	WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
146
	rv370_pcie_gart_tlb_flush(rdev);
146
	rv370_pcie_gart_tlb_flush(rdev);
147
	DRM_INFO("PCIE GART of %uM enabled (table at 0x%08X).\n",
147
	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
148
		 (unsigned)(rdev->mc.gtt_size >> 20), table_addr);
148
		 (unsigned)(rdev->mc.gtt_size >> 20),
-
 
149
		 (unsigned long long)table_addr);
149
	rdev->gart.ready = true;
150
	rdev->gart.ready = true;
150
	return 0;
151
	return 0;
151
}
152
}
Line 152... Line 153...
152
 
153
 
153
void rv370_pcie_gart_disable(struct radeon_device *rdev)
154
void rv370_pcie_gart_disable(struct radeon_device *rdev)
154
{
155
{
155
	u32 tmp;
-
 
Line 156... Line 156...
156
	int r;
156
	u32 tmp;
157
 
157
 
158
	WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO, 0);
158
	WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO, 0);
159
	WREG32_PCIE(RADEON_PCIE_TX_GART_END_LO, 0);
159
	WREG32_PCIE(RADEON_PCIE_TX_GART_END_LO, 0);
160
	WREG32_PCIE(RADEON_PCIE_TX_GART_START_HI, 0);
160
	WREG32_PCIE(RADEON_PCIE_TX_GART_START_HI, 0);
161
	WREG32_PCIE(RADEON_PCIE_TX_GART_END_HI, 0);
161
	WREG32_PCIE(RADEON_PCIE_TX_GART_END_HI, 0);
162
	tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL);
162
	tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL);
163
	tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD;
163
	tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD;
164
	WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp & ~RADEON_PCIE_TX_GART_EN);
-
 
165
	if (rdev->gart.table.vram.robj) {
-
 
166
		r = radeon_bo_reserve(rdev->gart.table.vram.robj, false);
-
 
167
		if (likely(r == 0)) {
-
 
168
			radeon_bo_kunmap(rdev->gart.table.vram.robj);
-
 
169
			radeon_bo_unpin(rdev->gart.table.vram.robj);
-
 
170
			radeon_bo_unreserve(rdev->gart.table.vram.robj);
-
 
171
		}
164
	WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp & ~RADEON_PCIE_TX_GART_EN);
Line 172... Line 165...
172
	}
165
	radeon_gart_table_vram_unpin(rdev);
173
}
166
}
174
 
167
 
Line 180... Line 173...
180
}
173
}
Line 181... Line 174...
181
 
174
 
182
void r300_fence_ring_emit(struct radeon_device *rdev,
175
void r300_fence_ring_emit(struct radeon_device *rdev,
183
			  struct radeon_fence *fence)
176
			  struct radeon_fence *fence)
-
 
177
{
-
 
178
	struct radeon_ring *ring = &rdev->ring[fence->ring];
184
{
179
 
185
	/* Who ever call radeon_fence_emit should call ring_lock and ask
180
	/* Who ever call radeon_fence_emit should call ring_lock and ask
186
	 * for enough space (today caller are ib schedule and buffer move) */
181
	 * for enough space (today caller are ib schedule and buffer move) */
187
	/* Write SC register so SC & US assert idle */
182
	/* Write SC register so SC & US assert idle */
188
	radeon_ring_write(rdev, PACKET0(R300_RE_SCISSORS_TL, 0));
183
	radeon_ring_write(ring, PACKET0(R300_RE_SCISSORS_TL, 0));
189
	radeon_ring_write(rdev, 0);
184
	radeon_ring_write(ring, 0);
190
	radeon_ring_write(rdev, PACKET0(R300_RE_SCISSORS_BR, 0));
185
	radeon_ring_write(ring, PACKET0(R300_RE_SCISSORS_BR, 0));
191
	radeon_ring_write(rdev, 0);
186
	radeon_ring_write(ring, 0);
192
	/* Flush 3D cache */
187
	/* Flush 3D cache */
193
	radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
188
	radeon_ring_write(ring, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
194
	radeon_ring_write(rdev, R300_RB3D_DC_FLUSH);
189
	radeon_ring_write(ring, R300_RB3D_DC_FLUSH);
195
	radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0));
190
	radeon_ring_write(ring, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0));
196
	radeon_ring_write(rdev, R300_ZC_FLUSH);
191
	radeon_ring_write(ring, R300_ZC_FLUSH);
197
	/* Wait until IDLE & CLEAN */
192
	/* Wait until IDLE & CLEAN */
198
	radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
193
	radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0));
199
	radeon_ring_write(rdev, (RADEON_WAIT_3D_IDLECLEAN |
194
	radeon_ring_write(ring, (RADEON_WAIT_3D_IDLECLEAN |
200
				 RADEON_WAIT_2D_IDLECLEAN |
195
				 RADEON_WAIT_2D_IDLECLEAN |
201
				 RADEON_WAIT_DMA_GUI_IDLE));
196
				 RADEON_WAIT_DMA_GUI_IDLE));
202
	radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0));
197
	radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0));
203
	radeon_ring_write(rdev, rdev->config.r300.hdp_cntl |
198
	radeon_ring_write(ring, rdev->config.r300.hdp_cntl |
204
				RADEON_HDP_READ_BUFFER_INVALIDATE);
199
				RADEON_HDP_READ_BUFFER_INVALIDATE);
205
	radeon_ring_write(rdev, PACKET0(RADEON_HOST_PATH_CNTL, 0));
200
	radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0));
206
	radeon_ring_write(rdev, rdev->config.r300.hdp_cntl);
201
	radeon_ring_write(ring, rdev->config.r300.hdp_cntl);
207
	/* Emit fence sequence & fire IRQ */
202
	/* Emit fence sequence & fire IRQ */
208
	radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0));
203
	radeon_ring_write(ring, PACKET0(rdev->fence_drv[fence->ring].scratch_reg, 0));
209
	radeon_ring_write(rdev, fence->seq);
204
	radeon_ring_write(ring, fence->seq);
210
	radeon_ring_write(rdev, PACKET0(RADEON_GEN_INT_STATUS, 0));
205
	radeon_ring_write(ring, PACKET0(RADEON_GEN_INT_STATUS, 0));
211
	radeon_ring_write(rdev, RADEON_SW_INT_FIRE);
206
	radeon_ring_write(ring, RADEON_SW_INT_FIRE);
Line 212... Line 207...
212
}
207
}
213
 
208
 
214
void r300_ring_start(struct radeon_device *rdev)
209
void r300_ring_start(struct radeon_device *rdev, struct radeon_ring *ring)
215
{
210
{
Line 216... Line 211...
216
	unsigned gb_tile_config;
211
	unsigned gb_tile_config;
Line 232... Line 227...
232
	default:
227
	default:
233
		gb_tile_config |= R300_PIPE_COUNT_RV350;
228
		gb_tile_config |= R300_PIPE_COUNT_RV350;
234
		break;
229
		break;
235
	}
230
	}
Line 236... Line 231...
236
 
231
 
237
	r = radeon_ring_lock(rdev, 64);
232
	r = radeon_ring_lock(rdev, ring, 64);
238
	if (r) {
233
	if (r) {
239
		return;
234
		return;
240
	}
235
	}
241
	radeon_ring_write(rdev, PACKET0(RADEON_ISYNC_CNTL, 0));
236
	radeon_ring_write(ring, PACKET0(RADEON_ISYNC_CNTL, 0));
242
	radeon_ring_write(rdev,
237
	radeon_ring_write(ring,
243
			  RADEON_ISYNC_ANY2D_IDLE3D |
238
			  RADEON_ISYNC_ANY2D_IDLE3D |
244
			  RADEON_ISYNC_ANY3D_IDLE2D |
239
			  RADEON_ISYNC_ANY3D_IDLE2D |
245
			  RADEON_ISYNC_WAIT_IDLEGUI |
240
			  RADEON_ISYNC_WAIT_IDLEGUI |
246
			  RADEON_ISYNC_CPSCRATCH_IDLEGUI);
241
			  RADEON_ISYNC_CPSCRATCH_IDLEGUI);
247
	radeon_ring_write(rdev, PACKET0(R300_GB_TILE_CONFIG, 0));
242
	radeon_ring_write(ring, PACKET0(R300_GB_TILE_CONFIG, 0));
248
	radeon_ring_write(rdev, gb_tile_config);
243
	radeon_ring_write(ring, gb_tile_config);
249
	radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
244
	radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0));
250
	radeon_ring_write(rdev,
245
	radeon_ring_write(ring,
251
			  RADEON_WAIT_2D_IDLECLEAN |
246
			  RADEON_WAIT_2D_IDLECLEAN |
252
			  RADEON_WAIT_3D_IDLECLEAN);
247
			  RADEON_WAIT_3D_IDLECLEAN);
253
	radeon_ring_write(rdev, PACKET0(R300_DST_PIPE_CONFIG, 0));
248
	radeon_ring_write(ring, PACKET0(R300_DST_PIPE_CONFIG, 0));
254
	radeon_ring_write(rdev, R300_PIPE_AUTO_CONFIG);
249
	radeon_ring_write(ring, R300_PIPE_AUTO_CONFIG);
255
	radeon_ring_write(rdev, PACKET0(R300_GB_SELECT, 0));
250
	radeon_ring_write(ring, PACKET0(R300_GB_SELECT, 0));
256
	radeon_ring_write(rdev, 0);
251
	radeon_ring_write(ring, 0);
257
	radeon_ring_write(rdev, PACKET0(R300_GB_ENABLE, 0));
252
	radeon_ring_write(ring, PACKET0(R300_GB_ENABLE, 0));
258
	radeon_ring_write(rdev, 0);
253
	radeon_ring_write(ring, 0);
259
	radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
254
	radeon_ring_write(ring, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
260
	radeon_ring_write(rdev, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE);
255
	radeon_ring_write(ring, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE);
261
	radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0));
256
	radeon_ring_write(ring, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0));
262
	radeon_ring_write(rdev, R300_ZC_FLUSH | R300_ZC_FREE);
257
	radeon_ring_write(ring, R300_ZC_FLUSH | R300_ZC_FREE);
263
	radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
258
	radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0));
264
	radeon_ring_write(rdev,
259
	radeon_ring_write(ring,
265
			  RADEON_WAIT_2D_IDLECLEAN |
260
			  RADEON_WAIT_2D_IDLECLEAN |
266
			  RADEON_WAIT_3D_IDLECLEAN);
261
			  RADEON_WAIT_3D_IDLECLEAN);
267
	radeon_ring_write(rdev, PACKET0(R300_GB_AA_CONFIG, 0));
262
	radeon_ring_write(ring, PACKET0(R300_GB_AA_CONFIG, 0));
268
	radeon_ring_write(rdev, 0);
263
	radeon_ring_write(ring, 0);
269
	radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
264
	radeon_ring_write(ring, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
270
	radeon_ring_write(rdev, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE);
265
	radeon_ring_write(ring, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE);
271
	radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0));
266
	radeon_ring_write(ring, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0));
272
	radeon_ring_write(rdev, R300_ZC_FLUSH | R300_ZC_FREE);
267
	radeon_ring_write(ring, R300_ZC_FLUSH | R300_ZC_FREE);
273
	radeon_ring_write(rdev, PACKET0(R300_GB_MSPOS0, 0));
268
	radeon_ring_write(ring, PACKET0(R300_GB_MSPOS0, 0));
274
	radeon_ring_write(rdev,
269
	radeon_ring_write(ring,
275
			  ((6 << R300_MS_X0_SHIFT) |
270
			  ((6 << R300_MS_X0_SHIFT) |
276
			   (6 << R300_MS_Y0_SHIFT) |
271
			   (6 << R300_MS_Y0_SHIFT) |
277
			   (6 << R300_MS_X1_SHIFT) |
272
			   (6 << R300_MS_X1_SHIFT) |
278
			   (6 << R300_MS_Y1_SHIFT) |
273
			   (6 << R300_MS_Y1_SHIFT) |
279
			   (6 << R300_MS_X2_SHIFT) |
274
			   (6 << R300_MS_X2_SHIFT) |
280
			   (6 << R300_MS_Y2_SHIFT) |
275
			   (6 << R300_MS_Y2_SHIFT) |
281
			   (6 << R300_MSBD0_Y_SHIFT) |
276
			   (6 << R300_MSBD0_Y_SHIFT) |
282
			   (6 << R300_MSBD0_X_SHIFT)));
277
			   (6 << R300_MSBD0_X_SHIFT)));
283
	radeon_ring_write(rdev, PACKET0(R300_GB_MSPOS1, 0));
278
	radeon_ring_write(ring, PACKET0(R300_GB_MSPOS1, 0));
284
	radeon_ring_write(rdev,
279
	radeon_ring_write(ring,
285
			  ((6 << R300_MS_X3_SHIFT) |
280
			  ((6 << R300_MS_X3_SHIFT) |
286
			   (6 << R300_MS_Y3_SHIFT) |
281
			   (6 << R300_MS_Y3_SHIFT) |
287
			   (6 << R300_MS_X4_SHIFT) |
282
			   (6 << R300_MS_X4_SHIFT) |
288
			   (6 << R300_MS_Y4_SHIFT) |
283
			   (6 << R300_MS_Y4_SHIFT) |
289
			   (6 << R300_MS_X5_SHIFT) |
284
			   (6 << R300_MS_X5_SHIFT) |
290
			   (6 << R300_MS_Y5_SHIFT) |
285
			   (6 << R300_MS_Y5_SHIFT) |
291
			   (6 << R300_MSBD1_SHIFT)));
286
			   (6 << R300_MSBD1_SHIFT)));
292
	radeon_ring_write(rdev, PACKET0(R300_GA_ENHANCE, 0));
287
	radeon_ring_write(ring, PACKET0(R300_GA_ENHANCE, 0));
293
	radeon_ring_write(rdev, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL);
288
	radeon_ring_write(ring, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL);
294
	radeon_ring_write(rdev, PACKET0(R300_GA_POLY_MODE, 0));
289
	radeon_ring_write(ring, PACKET0(R300_GA_POLY_MODE, 0));
295
	radeon_ring_write(rdev,
290
	radeon_ring_write(ring,
296
			  R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE);
291
			  R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE);
297
	radeon_ring_write(rdev, PACKET0(R300_GA_ROUND_MODE, 0));
292
	radeon_ring_write(ring, PACKET0(R300_GA_ROUND_MODE, 0));
298
	radeon_ring_write(rdev,
293
	radeon_ring_write(ring,
299
			  R300_GEOMETRY_ROUND_NEAREST |
294
			  R300_GEOMETRY_ROUND_NEAREST |
300
			  R300_COLOR_ROUND_NEAREST);
295
			  R300_COLOR_ROUND_NEAREST);
301
	radeon_ring_unlock_commit(rdev);
296
	radeon_ring_unlock_commit(rdev, ring);
Line 302... Line 297...
302
}
297
}
303
 
298
 
304
void r300_errata(struct radeon_device *rdev)
299
static void r300_errata(struct radeon_device *rdev)
Line 305... Line 300...
305
{
300
{
306
	rdev->pll_errata = 0;
301
	rdev->pll_errata = 0;
Line 325... Line 320...
325
		DRM_UDELAY(1);
320
		DRM_UDELAY(1);
326
	}
321
	}
327
	return -1;
322
	return -1;
328
}
323
}
Line 329... Line 324...
329
 
324
 
330
void r300_gpu_init(struct radeon_device *rdev)
325
static void r300_gpu_init(struct radeon_device *rdev)
331
{
326
{
Line 332... Line 327...
332
	uint32_t gb_tile_config, tmp;
327
	uint32_t gb_tile_config, tmp;
333
 
328
 
Line 380... Line 375...
380
	}
375
	}
381
	DRM_INFO("radeon: %d quad pipes, %d Z pipes initialized.\n",
376
	DRM_INFO("radeon: %d quad pipes, %d Z pipes initialized.\n",
382
		 rdev->num_gb_pipes, rdev->num_z_pipes);
377
		 rdev->num_gb_pipes, rdev->num_z_pipes);
383
}
378
}
Line 384... Line -...
384
 
-
 
385
bool r300_gpu_is_lockup(struct radeon_device *rdev)
-
 
386
{
-
 
387
	u32 rbbm_status;
-
 
388
	int r;
-
 
389
 
-
 
390
	rbbm_status = RREG32(R_000E40_RBBM_STATUS);
-
 
391
	if (!G_000E40_GUI_ACTIVE(rbbm_status)) {
-
 
392
		r100_gpu_lockup_update(&rdev->config.r300.lockup, &rdev->cp);
-
 
393
		return false;
-
 
394
		}
-
 
395
	/* force CP activities */
-
 
396
	r = radeon_ring_lock(rdev, 2);
-
 
397
	if (!r) {
-
 
398
		/* PACKET2 NOP */
-
 
399
		radeon_ring_write(rdev, 0x80000000);
-
 
400
		radeon_ring_write(rdev, 0x80000000);
-
 
401
		radeon_ring_unlock_commit(rdev);
-
 
402
	}
-
 
403
	rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR);
-
 
404
	return r100_gpu_cp_is_lockup(rdev, &rdev->config.r300.lockup, &rdev->cp);
-
 
405
}
-
 
406
 
379
 
407
int r300_asic_reset(struct radeon_device *rdev)
380
int r300_asic_reset(struct radeon_device *rdev)
408
{
381
{
409
	struct r100_mc_save save;
382
	struct r100_mc_save save;
410
	u32 status, tmp;
383
	u32 status, tmp;
Line 452... Line 425...
452
//   pci_restore_state(rdev->pdev);
425
//   pci_restore_state(rdev->pdev);
453
	r100_enable_bm(rdev);
426
	r100_enable_bm(rdev);
454
	/* Check if GPU is idle */
427
	/* Check if GPU is idle */
455
	if (G_000E40_GA_BUSY(status) || G_000E40_VAP_BUSY(status)) {
428
	if (G_000E40_GA_BUSY(status) || G_000E40_VAP_BUSY(status)) {
456
		dev_err(rdev->dev, "failed to reset GPU\n");
429
		dev_err(rdev->dev, "failed to reset GPU\n");
457
		rdev->gpu_lockup = true;
-
 
458
		ret = -1;
430
		ret = -1;
459
	} else
431
	} else
460
		dev_info(rdev->dev, "GPU reset succeed\n");
432
		dev_info(rdev->dev, "GPU reset succeed\n");
461
	r100_mc_resume(rdev, &save);
433
	r100_mc_resume(rdev, &save);
462
	return ret;
434
	return ret;
Line 633... Line 605...
633
	uint32_t tmp, tile_flags = 0;
605
	uint32_t tmp, tile_flags = 0;
634
	unsigned i;
606
	unsigned i;
635
	int r;
607
	int r;
636
	u32 idx_value;
608
	u32 idx_value;
Line 637... Line 609...
637
 
609
 
638
	ib = p->ib->ptr;
610
	ib = p->ib.ptr;
639
	track = (struct r100_cs_track *)p->track;
611
	track = (struct r100_cs_track *)p->track;
Line 640... Line 612...
640
	idx_value = radeon_get_ib_value(p, idx);
612
	idx_value = radeon_get_ib_value(p, idx);
641
 
613
 
Line 709... Line 681...
709
					idx, reg);
681
					idx, reg);
710
			r100_cs_dump_packet(p, pkt);
682
			r100_cs_dump_packet(p, pkt);
711
			return r;
683
			return r;
712
		}
684
		}
Line -... Line 685...
-
 
685
 
-
 
686
		if (p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS) {
-
 
687
			ib[idx] = (idx_value & 31) | /* keep the 1st 5 bits */
-
 
688
				  ((idx_value & ~31) + (u32)reloc->lobj.gpu_offset);
713
 
689
		} else {
714
		if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
690
		if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
715
			tile_flags |= R300_TXO_MACRO_TILE;
691
			tile_flags |= R300_TXO_MACRO_TILE;
716
		if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
692
		if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
717
			tile_flags |= R300_TXO_MICRO_TILE;
693
			tile_flags |= R300_TXO_MICRO_TILE;
718
		else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE)
694
		else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE)
Line 719... Line 695...
719
			tile_flags |= R300_TXO_MICRO_TILE_SQUARE;
695
			tile_flags |= R300_TXO_MICRO_TILE_SQUARE;
720
 
696
 
721
		tmp = idx_value + ((u32)reloc->lobj.gpu_offset);
697
		tmp = idx_value + ((u32)reloc->lobj.gpu_offset);
-
 
698
		tmp |= tile_flags;
722
		tmp |= tile_flags;
699
		ib[idx] = tmp;
723
		ib[idx] = tmp;
700
		}
724
		track->textures[i].robj = reloc->robj;
701
		track->textures[i].robj = reloc->robj;
725
		track->tex_dirty = true;
702
		track->tex_dirty = true;
726
		break;
703
		break;
Line 768... Line 745...
768
	case 0x4E44:
745
	case 0x4E44:
769
		/* RB3D_COLORPITCH0 */
746
		/* RB3D_COLORPITCH0 */
770
		/* RB3D_COLORPITCH1 */
747
		/* RB3D_COLORPITCH1 */
771
		/* RB3D_COLORPITCH2 */
748
		/* RB3D_COLORPITCH2 */
772
		/* RB3D_COLORPITCH3 */
749
		/* RB3D_COLORPITCH3 */
-
 
750
		if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) {
773
		r = r100_cs_packet_next_reloc(p, &reloc);
751
		r = r100_cs_packet_next_reloc(p, &reloc);
774
		if (r) {
752
		if (r) {
775
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
753
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
776
				  idx, reg);
754
				  idx, reg);
777
			r100_cs_dump_packet(p, pkt);
755
			r100_cs_dump_packet(p, pkt);
Line 786... Line 764...
786
			tile_flags |= R300_COLOR_MICROTILE_SQUARE_ENABLE;
764
			tile_flags |= R300_COLOR_MICROTILE_SQUARE_ENABLE;
Line 787... Line 765...
787
 
765
 
788
		tmp = idx_value & ~(0x7 << 16);
766
		tmp = idx_value & ~(0x7 << 16);
789
		tmp |= tile_flags;
767
		tmp |= tile_flags;
-
 
768
		ib[idx] = tmp;
790
		ib[idx] = tmp;
769
		}
791
		i = (reg - 0x4E38) >> 2;
770
		i = (reg - 0x4E38) >> 2;
792
		track->cb[i].pitch = idx_value & 0x3FFE;
771
		track->cb[i].pitch = idx_value & 0x3FFE;
793
		switch (((idx_value >> 21) & 0xF)) {
772
		switch (((idx_value >> 21) & 0xF)) {
794
		case 9:
773
		case 9:
Line 851... Line 830...
851
		}
830
		}
852
		track->zb_dirty = true;
831
		track->zb_dirty = true;
853
		break;
832
		break;
854
	case 0x4F24:
833
	case 0x4F24:
855
		/* ZB_DEPTHPITCH */
834
		/* ZB_DEPTHPITCH */
-
 
835
		if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) {
856
		r = r100_cs_packet_next_reloc(p, &reloc);
836
		r = r100_cs_packet_next_reloc(p, &reloc);
857
		if (r) {
837
		if (r) {
858
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
838
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
859
				  idx, reg);
839
				  idx, reg);
860
			r100_cs_dump_packet(p, pkt);
840
			r100_cs_dump_packet(p, pkt);
Line 869... Line 849...
869
			tile_flags |= R300_DEPTHMICROTILE_TILED_SQUARE;
849
			tile_flags |= R300_DEPTHMICROTILE_TILED_SQUARE;
Line 870... Line 850...
870
 
850
 
871
		tmp = idx_value & ~(0x7 << 16);
851
		tmp = idx_value & ~(0x7 << 16);
872
		tmp |= tile_flags;
852
		tmp |= tile_flags;
873
		ib[idx] = tmp;
853
		ib[idx] = tmp;
874
 
854
		}
875
		track->zb.pitch = idx_value & 0x3FFC;
855
		track->zb.pitch = idx_value & 0x3FFC;
876
		track->zb_dirty = true;
856
		track->zb_dirty = true;
877
		break;
857
		break;
878
	case 0x4104:
858
	case 0x4104:
Line 1167... Line 1147...
1167
	struct r100_cs_track *track;
1147
	struct r100_cs_track *track;
1168
	volatile uint32_t *ib;
1148
	volatile uint32_t *ib;
1169
	unsigned idx;
1149
	unsigned idx;
1170
	int r;
1150
	int r;
Line 1171... Line 1151...
1171
 
1151
 
1172
	ib = p->ib->ptr;
1152
	ib = p->ib.ptr;
1173
	idx = pkt->idx + 1;
1153
	idx = pkt->idx + 1;
1174
	track = (struct r100_cs_track *)p->track;
1154
	track = (struct r100_cs_track *)p->track;
1175
	switch(pkt->opcode) {
1155
	switch(pkt->opcode) {
1176
	case PACKET3_3D_LOAD_VBPNTR:
1156
	case PACKET3_3D_LOAD_VBPNTR:
Line 1407... Line 1387...
1407
    r = r100_cp_init(rdev, 1024 * 1024);
1387
    r = r100_cp_init(rdev, 1024 * 1024);
1408
    if (r) {
1388
    if (r) {
1409
		dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
1389
		dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
1410
       return r;
1390
       return r;
1411
    }
1391
    }
-
 
1392
 
1412
	r = r100_ib_init(rdev);
1393
	r = radeon_ib_pool_init(rdev);
1413
	if (r) {
1394
	if (r) {
1414
		dev_err(rdev->dev, "failed initializing IB (%d).\n", r);
1395
		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
1415
		return r;
1396
		return r;
1416
	}
1397
	}
-
 
1398
 
1417
	return 0;
1399
	return 0;
1418
}
1400
}
Line 1490... Line 1472...
1490
		r = r100_pci_gart_init(rdev);
1472
		r = r100_pci_gart_init(rdev);
1491
		if (r)
1473
		if (r)
1492
			return r;
1474
			return r;
1493
	}
1475
	}
1494
	r300_set_reg_safe(rdev);
1476
	r300_set_reg_safe(rdev);
-
 
1477
 
1495
	rdev->accel_working = true;
1478
	rdev->accel_working = true;
1496
	r = r300_startup(rdev);
1479
	r = r300_startup(rdev);
1497
	if (r) {
1480
	if (r) {
1498
		/* Somethings want wront with the accel init stop accel */
1481
		/* Somethings want wront with the accel init stop accel */
1499
		dev_err(rdev->dev, "Disabling GPU acceleration\n");
1482
		dev_err(rdev->dev, "Disabling GPU acceleration\n");