Subversion Repositories Kolibri OS

Rev

Rev 1125 | Rev 1128 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1120 serge 1
/*
2
 * Copyright 2008 Advanced Micro Devices, Inc.
3
 * Copyright 2008 Red Hat Inc.
4
 * Copyright 2009 Jerome Glisse.
5
 *
6
 * Permission is hereby granted, free of charge, to any person obtaining a
7
 * copy of this software and associated documentation files (the "Software"),
8
 * to deal in the Software without restriction, including without limitation
9
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10
 * and/or sell copies of the Software, and to permit persons to whom the
11
 * Software is furnished to do so, subject to the following conditions:
12
 *
13
 * The above copyright notice and this permission notice shall be included in
14
 * all copies or substantial portions of the Software.
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
 * OTHER DEALINGS IN THE SOFTWARE.
23
 *
24
 * Authors: Dave Airlie
25
 *          Alex Deucher
26
 *          Jerome Glisse
27
 */
28
//#include 
1125 serge 29
#include "drmP.h"
30
#include "drm.h"
1120 serge 31
#include "radeon_reg.h"
32
#include "radeon.h"
33
 
34
/* r300,r350,rv350,rv370,rv380 depends on : */
35
void r100_hdp_reset(struct radeon_device *rdev);
36
int r100_cp_reset(struct radeon_device *rdev);
37
int r100_rb2d_reset(struct radeon_device *rdev);
38
int r100_cp_init(struct radeon_device *rdev, unsigned ring_size);
39
int r100_pci_gart_enable(struct radeon_device *rdev);
40
void r100_pci_gart_disable(struct radeon_device *rdev);
41
void r100_mc_setup(struct radeon_device *rdev);
42
void r100_mc_disable_clients(struct radeon_device *rdev);
43
int r100_gui_wait_for_idle(struct radeon_device *rdev);
44
int r100_cs_packet_parse(struct radeon_cs_parser *p,
45
			 struct radeon_cs_packet *pkt,
46
			 unsigned idx);
47
int r100_cs_packet_next_reloc(struct radeon_cs_parser *p,
48
			      struct radeon_cs_reloc **cs_reloc);
49
int r100_cs_parse_packet0(struct radeon_cs_parser *p,
50
			  struct radeon_cs_packet *pkt,
51
			  const unsigned *auth, unsigned n,
52
			  radeon_packet0_check_t check);
53
void r100_cs_dump_packet(struct radeon_cs_parser *p,
54
			 struct radeon_cs_packet *pkt);
55
int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p,
56
					 struct radeon_cs_packet *pkt,
57
					 struct radeon_object *robj);
58
 
59
/* This files gather functions specifics to:
60
 * r300,r350,rv350,rv370,rv380
61
 *
62
 * Some of these functions might be used by newer ASICs.
63
 */
64
void r300_gpu_init(struct radeon_device *rdev);
65
int r300_mc_wait_for_idle(struct radeon_device *rdev);
66
int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev);
67
 
68
 
69
/*
70
 * rv370,rv380 PCIE GART
71
 */
72
void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev)
73
{
74
	uint32_t tmp;
75
	int i;
76
 
77
	/* Workaround HW bug do flush 2 times */
78
	for (i = 0; i < 2; i++) {
79
		tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL);
80
		WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp | RADEON_PCIE_TX_GART_INVALIDATE_TLB);
81
		(void)RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL);
82
		WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
83
		mb();
84
	}
85
}
86
 
87
int rv370_pcie_gart_enable(struct radeon_device *rdev)
88
{
89
	uint32_t table_addr;
90
	uint32_t tmp;
91
	int r;
92
 
93
	/* Initialize common gart structure */
94
	r = radeon_gart_init(rdev);
95
	if (r) {
96
		return r;
97
	}
98
//   r = rv370_debugfs_pcie_gart_info_init(rdev);
99
//   if (r) {
100
//       DRM_ERROR("Failed to register debugfs file for PCIE gart !\n");
101
//   }
102
	rdev->gart.table_size = rdev->gart.num_gpu_pages * 4;
103
	r = radeon_gart_table_vram_alloc(rdev);
104
	if (r) {
105
		return r;
106
	}
107
	/* discard memory request outside of configured range */
108
	tmp = RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD;
109
	WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
110
	WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO, rdev->mc.gtt_location);
111
	tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 4096;
112
	WREG32_PCIE(RADEON_PCIE_TX_GART_END_LO, tmp);
113
	WREG32_PCIE(RADEON_PCIE_TX_GART_START_HI, 0);
114
	WREG32_PCIE(RADEON_PCIE_TX_GART_END_HI, 0);
115
	table_addr = rdev->gart.table_addr;
116
	WREG32_PCIE(RADEON_PCIE_TX_GART_BASE, table_addr);
117
	/* FIXME: setup default page */
118
	WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO, rdev->mc.vram_location);
119
	WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_HI, 0);
120
	/* Clear error */
121
	WREG32_PCIE(0x18, 0);
122
	tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL);
123
	tmp |= RADEON_PCIE_TX_GART_EN;
124
	tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD;
125
	WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
126
	rv370_pcie_gart_tlb_flush(rdev);
127
	DRM_INFO("PCIE GART of %uM enabled (table at 0x%08X).\n",
128
		 rdev->mc.gtt_size >> 20, table_addr);
129
	rdev->gart.ready = true;
130
	return 0;
131
}
132
 
133
void rv370_pcie_gart_disable(struct radeon_device *rdev)
134
{
135
	uint32_t tmp;
136
 
137
	tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL);
138
	tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD;
139
	WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp & ~RADEON_PCIE_TX_GART_EN);
140
	if (rdev->gart.table.vram.robj) {
141
//       radeon_object_kunmap(rdev->gart.table.vram.robj);
142
//       radeon_object_unpin(rdev->gart.table.vram.robj);
143
	}
144
}
145
 
146
int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr)
147
{
148
    void __iomem *ptr = (void *)rdev->gart.table.vram.ptr;
149
 
150
    if (i < 0 || i > rdev->gart.num_gpu_pages) {
151
        return -EINVAL;
152
    }
1126 serge 153
	addr = (((u32)addr) >> 8) | ((upper_32_bits(addr) & 0xff) << 4) | 0xC;
1120 serge 154
    writel(cpu_to_le32(addr), ((void __iomem *)ptr) + (i * 4));
155
    return 0;
156
}
157
 
158
int r300_gart_enable(struct radeon_device *rdev)
159
{
160
#if __OS_HAS_AGP
161
	if (rdev->flags & RADEON_IS_AGP) {
162
		if (rdev->family > CHIP_RV350) {
163
			rv370_pcie_gart_disable(rdev);
164
		} else {
165
			r100_pci_gart_disable(rdev);
166
		}
167
		return 0;
168
	}
169
#endif
170
	if (rdev->flags & RADEON_IS_PCIE) {
171
		rdev->asic->gart_disable = &rv370_pcie_gart_disable;
172
		rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush;
173
		rdev->asic->gart_set_page = &rv370_pcie_gart_set_page;
174
		return rv370_pcie_gart_enable(rdev);
175
	}
176
//   return r100_pci_gart_enable(rdev);
177
}
178
 
179
#if 0
180
/*
181
 * MC
182
 */
183
int r300_mc_init(struct radeon_device *rdev)
184
{
185
	int r;
186
 
187
	if (r100_debugfs_rbbm_init(rdev)) {
188
		DRM_ERROR("Failed to register debugfs file for RBBM !\n");
189
	}
190
 
191
	r300_gpu_init(rdev);
192
	r100_pci_gart_disable(rdev);
193
	if (rdev->flags & RADEON_IS_PCIE) {
194
		rv370_pcie_gart_disable(rdev);
195
	}
196
 
197
	/* Setup GPU memory space */
198
	rdev->mc.vram_location = 0xFFFFFFFFUL;
199
	rdev->mc.gtt_location = 0xFFFFFFFFUL;
200
	if (rdev->flags & RADEON_IS_AGP) {
201
		r = radeon_agp_init(rdev);
202
		if (r) {
203
			printk(KERN_WARNING "[drm] Disabling AGP\n");
204
			rdev->flags &= ~RADEON_IS_AGP;
205
			rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
206
		} else {
207
			rdev->mc.gtt_location = rdev->mc.agp_base;
208
		}
209
	}
210
	r = radeon_mc_setup(rdev);
211
	if (r) {
212
		return r;
213
	}
214
 
215
	/* Program GPU memory space */
216
	r100_mc_disable_clients(rdev);
217
	if (r300_mc_wait_for_idle(rdev)) {
218
		printk(KERN_WARNING "Failed to wait MC idle while "
219
		       "programming pipes. Bad things might happen.\n");
220
	}
221
	r100_mc_setup(rdev);
222
	return 0;
223
}
224
 
225
void r300_mc_fini(struct radeon_device *rdev)
226
{
227
	if (rdev->flags & RADEON_IS_PCIE) {
228
		rv370_pcie_gart_disable(rdev);
229
		radeon_gart_table_vram_free(rdev);
230
	} else {
231
		r100_pci_gart_disable(rdev);
232
		radeon_gart_table_ram_free(rdev);
233
	}
234
	radeon_gart_fini(rdev);
235
}
236
 
237
 
238
/*
239
 * Fence emission
240
 */
241
void r300_fence_ring_emit(struct radeon_device *rdev,
242
			  struct radeon_fence *fence)
243
{
244
	/* Who ever call radeon_fence_emit should call ring_lock and ask
245
	 * for enough space (today caller are ib schedule and buffer move) */
246
	/* Write SC register so SC & US assert idle */
247
	radeon_ring_write(rdev, PACKET0(0x43E0, 0));
248
	radeon_ring_write(rdev, 0);
249
	radeon_ring_write(rdev, PACKET0(0x43E4, 0));
250
	radeon_ring_write(rdev, 0);
251
	/* Flush 3D cache */
252
	radeon_ring_write(rdev, PACKET0(0x4E4C, 0));
253
	radeon_ring_write(rdev, (2 << 0));
254
	radeon_ring_write(rdev, PACKET0(0x4F18, 0));
255
	radeon_ring_write(rdev, (1 << 0));
256
	/* Wait until IDLE & CLEAN */
257
	radeon_ring_write(rdev, PACKET0(0x1720, 0));
258
	radeon_ring_write(rdev, (1 << 17) | (1 << 16)  | (1 << 9));
259
	/* Emit fence sequence & fire IRQ */
260
	radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0));
261
	radeon_ring_write(rdev, fence->seq);
262
	radeon_ring_write(rdev, PACKET0(RADEON_GEN_INT_STATUS, 0));
263
	radeon_ring_write(rdev, RADEON_SW_INT_FIRE);
264
}
265
 
266
 
267
/*
268
 * Global GPU functions
269
 */
270
int r300_copy_dma(struct radeon_device *rdev,
271
		  uint64_t src_offset,
272
		  uint64_t dst_offset,
273
		  unsigned num_pages,
274
		  struct radeon_fence *fence)
275
{
276
	uint32_t size;
277
	uint32_t cur_size;
278
	int i, num_loops;
279
	int r = 0;
280
 
281
	/* radeon pitch is /64 */
282
	size = num_pages << PAGE_SHIFT;
283
	num_loops = DIV_ROUND_UP(size, 0x1FFFFF);
284
	r = radeon_ring_lock(rdev, num_loops * 4 + 64);
285
	if (r) {
286
		DRM_ERROR("radeon: moving bo (%d).\n", r);
287
		return r;
288
	}
289
	/* Must wait for 2D idle & clean before DMA or hangs might happen */
290
	radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0 ));
291
	radeon_ring_write(rdev, (1 << 16));
292
	for (i = 0; i < num_loops; i++) {
293
		cur_size = size;
294
		if (cur_size > 0x1FFFFF) {
295
			cur_size = 0x1FFFFF;
296
		}
297
		size -= cur_size;
298
		radeon_ring_write(rdev, PACKET0(0x720, 2));
299
		radeon_ring_write(rdev, src_offset);
300
		radeon_ring_write(rdev, dst_offset);
301
		radeon_ring_write(rdev, cur_size | (1 << 31) | (1 << 30));
302
		src_offset += cur_size;
303
		dst_offset += cur_size;
304
	}
305
	radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
306
	radeon_ring_write(rdev, RADEON_WAIT_DMA_GUI_IDLE);
307
	if (fence) {
308
		r = radeon_fence_emit(rdev, fence);
309
	}
310
	radeon_ring_unlock_commit(rdev);
311
	return r;
312
}
313
 
314
void r300_ring_start(struct radeon_device *rdev)
315
{
316
	unsigned gb_tile_config;
317
	int r;
318
 
319
	/* Sub pixel 1/12 so we can have 4K rendering according to doc */
320
	gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16);
321
	switch(rdev->num_gb_pipes) {
322
	case 2:
323
		gb_tile_config |= R300_PIPE_COUNT_R300;
324
		break;
325
	case 3:
326
		gb_tile_config |= R300_PIPE_COUNT_R420_3P;
327
		break;
328
	case 4:
329
		gb_tile_config |= R300_PIPE_COUNT_R420;
330
		break;
331
	case 1:
332
	default:
333
		gb_tile_config |= R300_PIPE_COUNT_RV350;
334
		break;
335
	}
336
 
337
	r = radeon_ring_lock(rdev, 64);
338
	if (r) {
339
		return;
340
	}
341
	radeon_ring_write(rdev, PACKET0(RADEON_ISYNC_CNTL, 0));
342
	radeon_ring_write(rdev,
343
			  RADEON_ISYNC_ANY2D_IDLE3D |
344
			  RADEON_ISYNC_ANY3D_IDLE2D |
345
			  RADEON_ISYNC_WAIT_IDLEGUI |
346
			  RADEON_ISYNC_CPSCRATCH_IDLEGUI);
347
	radeon_ring_write(rdev, PACKET0(R300_GB_TILE_CONFIG, 0));
348
	radeon_ring_write(rdev, gb_tile_config);
349
	radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
350
	radeon_ring_write(rdev,
351
			  RADEON_WAIT_2D_IDLECLEAN |
352
			  RADEON_WAIT_3D_IDLECLEAN);
353
	radeon_ring_write(rdev, PACKET0(0x170C, 0));
354
	radeon_ring_write(rdev, 1 << 31);
355
	radeon_ring_write(rdev, PACKET0(R300_GB_SELECT, 0));
356
	radeon_ring_write(rdev, 0);
357
	radeon_ring_write(rdev, PACKET0(R300_GB_ENABLE, 0));
358
	radeon_ring_write(rdev, 0);
359
	radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
360
	radeon_ring_write(rdev, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE);
361
	radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0));
362
	radeon_ring_write(rdev, R300_ZC_FLUSH | R300_ZC_FREE);
363
	radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0));
364
	radeon_ring_write(rdev,
365
			  RADEON_WAIT_2D_IDLECLEAN |
366
			  RADEON_WAIT_3D_IDLECLEAN);
367
	radeon_ring_write(rdev, PACKET0(R300_GB_AA_CONFIG, 0));
368
	radeon_ring_write(rdev, 0);
369
	radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
370
	radeon_ring_write(rdev, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE);
371
	radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0));
372
	radeon_ring_write(rdev, R300_ZC_FLUSH | R300_ZC_FREE);
373
	radeon_ring_write(rdev, PACKET0(R300_GB_MSPOS0, 0));
374
	radeon_ring_write(rdev,
375
			  ((6 << R300_MS_X0_SHIFT) |
376
			   (6 << R300_MS_Y0_SHIFT) |
377
			   (6 << R300_MS_X1_SHIFT) |
378
			   (6 << R300_MS_Y1_SHIFT) |
379
			   (6 << R300_MS_X2_SHIFT) |
380
			   (6 << R300_MS_Y2_SHIFT) |
381
			   (6 << R300_MSBD0_Y_SHIFT) |
382
			   (6 << R300_MSBD0_X_SHIFT)));
383
	radeon_ring_write(rdev, PACKET0(R300_GB_MSPOS1, 0));
384
	radeon_ring_write(rdev,
385
			  ((6 << R300_MS_X3_SHIFT) |
386
			   (6 << R300_MS_Y3_SHIFT) |
387
			   (6 << R300_MS_X4_SHIFT) |
388
			   (6 << R300_MS_Y4_SHIFT) |
389
			   (6 << R300_MS_X5_SHIFT) |
390
			   (6 << R300_MS_Y5_SHIFT) |
391
			   (6 << R300_MSBD1_SHIFT)));
392
	radeon_ring_write(rdev, PACKET0(R300_GA_ENHANCE, 0));
393
	radeon_ring_write(rdev, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL);
394
	radeon_ring_write(rdev, PACKET0(R300_GA_POLY_MODE, 0));
395
	radeon_ring_write(rdev,
396
			  R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE);
397
	radeon_ring_write(rdev, PACKET0(R300_GA_ROUND_MODE, 0));
398
	radeon_ring_write(rdev,
399
			  R300_GEOMETRY_ROUND_NEAREST |
400
			  R300_COLOR_ROUND_NEAREST);
401
	radeon_ring_unlock_commit(rdev);
402
}
403
 
404
void r300_errata(struct radeon_device *rdev)
405
{
406
	rdev->pll_errata = 0;
407
 
408
	if (rdev->family == CHIP_R300 &&
409
	    (RREG32(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) == RADEON_CFG_ATI_REV_A11) {
410
		rdev->pll_errata |= CHIP_ERRATA_R300_CG;
411
	}
412
}
413
 
414
int r300_mc_wait_for_idle(struct radeon_device *rdev)
415
{
416
	unsigned i;
417
	uint32_t tmp;
418
 
419
	for (i = 0; i < rdev->usec_timeout; i++) {
420
		/* read MC_STATUS */
421
		tmp = RREG32(0x0150);
422
		if (tmp & (1 << 4)) {
423
			return 0;
424
		}
425
		DRM_UDELAY(1);
426
	}
427
	return -1;
428
}
429
 
430
void r300_gpu_init(struct radeon_device *rdev)
431
{
432
	uint32_t gb_tile_config, tmp;
433
 
434
	r100_hdp_reset(rdev);
435
	/* FIXME: rv380 one pipes ? */
436
	if ((rdev->family == CHIP_R300) || (rdev->family == CHIP_R350)) {
437
		/* r300,r350 */
438
		rdev->num_gb_pipes = 2;
439
	} else {
440
		/* rv350,rv370,rv380 */
441
		rdev->num_gb_pipes = 1;
442
	}
443
	gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16);
444
	switch (rdev->num_gb_pipes) {
445
	case 2:
446
		gb_tile_config |= R300_PIPE_COUNT_R300;
447
		break;
448
	case 3:
449
		gb_tile_config |= R300_PIPE_COUNT_R420_3P;
450
		break;
451
	case 4:
452
		gb_tile_config |= R300_PIPE_COUNT_R420;
453
		break;
454
	default:
455
	case 1:
456
		gb_tile_config |= R300_PIPE_COUNT_RV350;
457
		break;
458
	}
459
	WREG32(R300_GB_TILE_CONFIG, gb_tile_config);
460
 
461
	if (r100_gui_wait_for_idle(rdev)) {
462
		printk(KERN_WARNING "Failed to wait GUI idle while "
463
		       "programming pipes. Bad things might happen.\n");
464
	}
465
 
466
	tmp = RREG32(0x170C);
467
	WREG32(0x170C, tmp | (1 << 31));
468
 
469
	WREG32(R300_RB2D_DSTCACHE_MODE,
470
	       R300_DC_AUTOFLUSH_ENABLE |
471
	       R300_DC_DC_DISABLE_IGNORE_PE);
472
 
473
	if (r100_gui_wait_for_idle(rdev)) {
474
		printk(KERN_WARNING "Failed to wait GUI idle while "
475
		       "programming pipes. Bad things might happen.\n");
476
	}
477
	if (r300_mc_wait_for_idle(rdev)) {
478
		printk(KERN_WARNING "Failed to wait MC idle while "
479
		       "programming pipes. Bad things might happen.\n");
480
	}
481
	DRM_INFO("radeon: %d pipes initialized.\n", rdev->num_gb_pipes);
482
}
483
 
484
int r300_ga_reset(struct radeon_device *rdev)
485
{
486
	uint32_t tmp;
487
	bool reinit_cp;
488
	int i;
489
 
490
	reinit_cp = rdev->cp.ready;
491
	rdev->cp.ready = false;
492
	for (i = 0; i < rdev->usec_timeout; i++) {
493
		WREG32(RADEON_CP_CSQ_MODE, 0);
494
		WREG32(RADEON_CP_CSQ_CNTL, 0);
495
		WREG32(RADEON_RBBM_SOFT_RESET, 0x32005);
496
		(void)RREG32(RADEON_RBBM_SOFT_RESET);
497
		udelay(200);
498
		WREG32(RADEON_RBBM_SOFT_RESET, 0);
499
		/* Wait to prevent race in RBBM_STATUS */
500
		mdelay(1);
501
		tmp = RREG32(RADEON_RBBM_STATUS);
502
		if (tmp & ((1 << 20) | (1 << 26))) {
503
			DRM_ERROR("VAP & CP still busy (RBBM_STATUS=0x%08X)", tmp);
504
			/* GA still busy soft reset it */
505
			WREG32(0x429C, 0x200);
506
			WREG32(R300_VAP_PVS_STATE_FLUSH_REG, 0);
507
			WREG32(0x43E0, 0);
508
			WREG32(0x43E4, 0);
509
			WREG32(0x24AC, 0);
510
		}
511
		/* Wait to prevent race in RBBM_STATUS */
512
		mdelay(1);
513
		tmp = RREG32(RADEON_RBBM_STATUS);
514
		if (!(tmp & ((1 << 20) | (1 << 26)))) {
515
			break;
516
		}
517
	}
518
	for (i = 0; i < rdev->usec_timeout; i++) {
519
		tmp = RREG32(RADEON_RBBM_STATUS);
520
		if (!(tmp & ((1 << 20) | (1 << 26)))) {
521
			DRM_INFO("GA reset succeed (RBBM_STATUS=0x%08X)\n",
522
				 tmp);
523
			if (reinit_cp) {
524
				return r100_cp_init(rdev, rdev->cp.ring_size);
525
			}
526
			return 0;
527
		}
528
		DRM_UDELAY(1);
529
	}
530
	tmp = RREG32(RADEON_RBBM_STATUS);
531
	DRM_ERROR("Failed to reset GA ! (RBBM_STATUS=0x%08X)\n", tmp);
532
	return -1;
533
}
534
 
535
int r300_gpu_reset(struct radeon_device *rdev)
536
{
537
	uint32_t status;
538
 
539
	/* reset order likely matter */
540
	status = RREG32(RADEON_RBBM_STATUS);
541
	/* reset HDP */
542
	r100_hdp_reset(rdev);
543
	/* reset rb2d */
544
	if (status & ((1 << 17) | (1 << 18) | (1 << 27))) {
545
		r100_rb2d_reset(rdev);
546
	}
547
	/* reset GA */
548
	if (status & ((1 << 20) | (1 << 26))) {
549
		r300_ga_reset(rdev);
550
	}
551
	/* reset CP */
552
	status = RREG32(RADEON_RBBM_STATUS);
553
	if (status & (1 << 16)) {
554
		r100_cp_reset(rdev);
555
	}
556
	/* Check if GPU is idle */
557
	status = RREG32(RADEON_RBBM_STATUS);
558
	if (status & (1 << 31)) {
559
		DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status);
560
		return -1;
561
	}
562
	DRM_INFO("GPU reset succeed (RBBM_STATUS=0x%08X)\n", status);
563
	return 0;
564
}
565
 
566
 
567
/*
568
 * r300,r350,rv350,rv380 VRAM info
569
 */
570
void r300_vram_info(struct radeon_device *rdev)
571
{
572
	uint32_t tmp;
573
 
574
	/* DDR for all card after R300 & IGP */
575
	rdev->mc.vram_is_ddr = true;
576
	tmp = RREG32(RADEON_MEM_CNTL);
577
	if (tmp & R300_MEM_NUM_CHANNELS_MASK) {
578
		rdev->mc.vram_width = 128;
579
	} else {
580
		rdev->mc.vram_width = 64;
581
	}
582
	rdev->mc.vram_size = RREG32(RADEON_CONFIG_MEMSIZE);
583
 
584
	rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0);
585
	rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0);
586
}
587
 
588
 
589
/*
590
 * Indirect registers accessor
591
 */
592
uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg)
593
{
594
	uint32_t r;
595
 
596
	WREG8(RADEON_PCIE_INDEX, ((reg) & 0xff));
597
	(void)RREG32(RADEON_PCIE_INDEX);
598
	r = RREG32(RADEON_PCIE_DATA);
599
	return r;
600
}
601
 
602
void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
603
{
604
	WREG8(RADEON_PCIE_INDEX, ((reg) & 0xff));
605
	(void)RREG32(RADEON_PCIE_INDEX);
606
	WREG32(RADEON_PCIE_DATA, (v));
607
	(void)RREG32(RADEON_PCIE_DATA);
608
}
609
 
610
/*
611
 * PCIE Lanes
612
 */
613
 
614
void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes)
615
{
616
	uint32_t link_width_cntl, mask;
617
 
618
	if (rdev->flags & RADEON_IS_IGP)
619
		return;
620
 
621
	if (!(rdev->flags & RADEON_IS_PCIE))
622
		return;
623
 
624
	/* FIXME wait for idle */
625
 
626
	switch (lanes) {
627
	case 0:
628
		mask = RADEON_PCIE_LC_LINK_WIDTH_X0;
629
		break;
630
	case 1:
631
		mask = RADEON_PCIE_LC_LINK_WIDTH_X1;
632
		break;
633
	case 2:
634
		mask = RADEON_PCIE_LC_LINK_WIDTH_X2;
635
		break;
636
	case 4:
637
		mask = RADEON_PCIE_LC_LINK_WIDTH_X4;
638
		break;
639
	case 8:
640
		mask = RADEON_PCIE_LC_LINK_WIDTH_X8;
641
		break;
642
	case 12:
643
		mask = RADEON_PCIE_LC_LINK_WIDTH_X12;
644
		break;
645
	case 16:
646
	default:
647
		mask = RADEON_PCIE_LC_LINK_WIDTH_X16;
648
		break;
649
	}
650
 
651
	link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL);
652
 
653
	if ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) ==
654
	    (mask << RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT))
655
		return;
656
 
657
	link_width_cntl &= ~(RADEON_PCIE_LC_LINK_WIDTH_MASK |
658
			     RADEON_PCIE_LC_RECONFIG_NOW |
659
			     RADEON_PCIE_LC_RECONFIG_LATER |
660
			     RADEON_PCIE_LC_SHORT_RECONFIG_EN);
661
	link_width_cntl |= mask;
662
	WREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
663
	WREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL, (link_width_cntl |
664
						     RADEON_PCIE_LC_RECONFIG_NOW));
665
 
666
	/* wait for lane set to complete */
667
	link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL);
668
	while (link_width_cntl == 0xffffffff)
669
		link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL);
670
 
671
}
672
 
673
 
674
/*
675
 * Debugfs info
676
 */
677
#if defined(CONFIG_DEBUG_FS)
678
static int rv370_debugfs_pcie_gart_info(struct seq_file *m, void *data)
679
{
680
	struct drm_info_node *node = (struct drm_info_node *) m->private;
681
	struct drm_device *dev = node->minor->dev;
682
	struct radeon_device *rdev = dev->dev_private;
683
	uint32_t tmp;
684
 
685
	tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL);
686
	seq_printf(m, "PCIE_TX_GART_CNTL 0x%08x\n", tmp);
687
	tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_BASE);
688
	seq_printf(m, "PCIE_TX_GART_BASE 0x%08x\n", tmp);
689
	tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_START_LO);
690
	seq_printf(m, "PCIE_TX_GART_START_LO 0x%08x\n", tmp);
691
	tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_START_HI);
692
	seq_printf(m, "PCIE_TX_GART_START_HI 0x%08x\n", tmp);
693
	tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_END_LO);
694
	seq_printf(m, "PCIE_TX_GART_END_LO 0x%08x\n", tmp);
695
	tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_END_HI);
696
	seq_printf(m, "PCIE_TX_GART_END_HI 0x%08x\n", tmp);
697
	tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_ERROR);
698
	seq_printf(m, "PCIE_TX_GART_ERROR 0x%08x\n", tmp);
699
	return 0;
700
}
701
 
702
static struct drm_info_list rv370_pcie_gart_info_list[] = {
703
	{"rv370_pcie_gart_info", rv370_debugfs_pcie_gart_info, 0, NULL},
704
};
705
#endif
706
 
707
int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev)
708
{
709
#if defined(CONFIG_DEBUG_FS)
710
	return radeon_debugfs_add_files(rdev, rv370_pcie_gart_info_list, 1);
711
#else
712
	return 0;
713
#endif
714
}
715
 
716
 
717
/*
718
 * CS functions
719
 */
720
struct r300_cs_track_cb {
721
	struct radeon_object	*robj;
722
	unsigned		pitch;
723
	unsigned		cpp;
724
	unsigned		offset;
725
};
726
 
727
struct r300_cs_track_array {
728
	struct radeon_object	*robj;
729
	unsigned		esize;
730
};
731
 
732
struct r300_cs_track_texture {
733
	struct radeon_object	*robj;
734
	unsigned		pitch;
735
	unsigned		width;
736
	unsigned		height;
737
	unsigned		num_levels;
738
	unsigned		cpp;
739
	unsigned		tex_coord_type;
740
	unsigned		txdepth;
741
	unsigned		width_11;
742
	unsigned		height_11;
743
	bool			use_pitch;
744
	bool			enabled;
745
	bool			roundup_w;
746
	bool			roundup_h;
747
};
748
 
749
struct r300_cs_track {
750
	unsigned			num_cb;
751
	unsigned			maxy;
752
	unsigned			vtx_size;
753
	unsigned			vap_vf_cntl;
754
	unsigned			immd_dwords;
755
	unsigned			num_arrays;
756
	unsigned			max_indx;
757
	struct r300_cs_track_array	arrays[11];
758
	struct r300_cs_track_cb 	cb[4];
759
	struct r300_cs_track_cb 	zb;
760
	struct r300_cs_track_texture	textures[16];
761
	bool				z_enabled;
762
};
763
 
764
static inline void r300_cs_track_texture_print(struct r300_cs_track_texture *t)
765
{
766
	DRM_ERROR("pitch                      %d\n", t->pitch);
767
	DRM_ERROR("width                      %d\n", t->width);
768
	DRM_ERROR("height                     %d\n", t->height);
769
	DRM_ERROR("num levels                 %d\n", t->num_levels);
770
	DRM_ERROR("depth                      %d\n", t->txdepth);
771
	DRM_ERROR("bpp                        %d\n", t->cpp);
772
	DRM_ERROR("coordinate type            %d\n", t->tex_coord_type);
773
	DRM_ERROR("width round to power of 2  %d\n", t->roundup_w);
774
	DRM_ERROR("height round to power of 2 %d\n", t->roundup_h);
775
}
776
 
777
static inline int r300_cs_track_texture_check(struct radeon_device *rdev,
778
					      struct r300_cs_track *track)
779
{
780
	struct radeon_object *robj;
781
	unsigned long size;
782
	unsigned u, i, w, h;
783
 
784
	for (u = 0; u < 16; u++) {
785
		if (!track->textures[u].enabled)
786
			continue;
787
		robj = track->textures[u].robj;
788
		if (robj == NULL) {
789
			DRM_ERROR("No texture bound to unit %u\n", u);
790
			return -EINVAL;
791
		}
792
		size = 0;
793
		for (i = 0; i <= track->textures[u].num_levels; i++) {
794
			if (track->textures[u].use_pitch) {
795
				w = track->textures[u].pitch / (1 << i);
796
			} else {
797
				w = track->textures[u].width / (1 << i);
798
				if (rdev->family >= CHIP_RV515)
799
					w |= track->textures[u].width_11;
800
				if (track->textures[u].roundup_w)
801
					w = roundup_pow_of_two(w);
802
			}
803
			h = track->textures[u].height / (1 << i);
804
			if (rdev->family >= CHIP_RV515)
805
				h |= track->textures[u].height_11;
806
			if (track->textures[u].roundup_h)
807
				h = roundup_pow_of_two(h);
808
			size += w * h;
809
		}
810
		size *= track->textures[u].cpp;
811
		switch (track->textures[u].tex_coord_type) {
812
		case 0:
813
			break;
814
		case 1:
815
			size *= (1 << track->textures[u].txdepth);
816
			break;
817
		case 2:
818
			size *= 6;
819
			break;
820
		default:
821
			DRM_ERROR("Invalid texture coordinate type %u for unit "
822
				  "%u\n", track->textures[u].tex_coord_type, u);
823
			return -EINVAL;
824
		}
825
		if (size > radeon_object_size(robj)) {
826
			DRM_ERROR("Texture of unit %u needs %lu bytes but is "
827
				  "%lu\n", u, size, radeon_object_size(robj));
828
			r300_cs_track_texture_print(&track->textures[u]);
829
			return -EINVAL;
830
		}
831
	}
832
	return 0;
833
}
834
 
835
int r300_cs_track_check(struct radeon_device *rdev, struct r300_cs_track *track)
836
{
837
	unsigned i;
838
	unsigned long size;
839
	unsigned prim_walk;
840
	unsigned nverts;
841
 
842
	for (i = 0; i < track->num_cb; i++) {
843
		if (track->cb[i].robj == NULL) {
844
			DRM_ERROR("[drm] No buffer for color buffer %d !\n", i);
845
			return -EINVAL;
846
		}
847
		size = track->cb[i].pitch * track->cb[i].cpp * track->maxy;
848
		size += track->cb[i].offset;
849
		if (size > radeon_object_size(track->cb[i].robj)) {
850
			DRM_ERROR("[drm] Buffer too small for color buffer %d "
851
				  "(need %lu have %lu) !\n", i, size,
852
				  radeon_object_size(track->cb[i].robj));
853
			DRM_ERROR("[drm] color buffer %d (%u %u %u %u)\n",
854
				  i, track->cb[i].pitch, track->cb[i].cpp,
855
				  track->cb[i].offset, track->maxy);
856
			return -EINVAL;
857
		}
858
	}
859
	if (track->z_enabled) {
860
		if (track->zb.robj == NULL) {
861
			DRM_ERROR("[drm] No buffer for z buffer !\n");
862
			return -EINVAL;
863
		}
864
		size = track->zb.pitch * track->zb.cpp * track->maxy;
865
		size += track->zb.offset;
866
		if (size > radeon_object_size(track->zb.robj)) {
867
			DRM_ERROR("[drm] Buffer too small for z buffer "
868
				  "(need %lu have %lu) !\n", size,
869
				  radeon_object_size(track->zb.robj));
870
			return -EINVAL;
871
		}
872
	}
873
	prim_walk = (track->vap_vf_cntl >> 4) & 0x3;
874
	nverts = (track->vap_vf_cntl >> 16) & 0xFFFF;
875
	switch (prim_walk) {
876
	case 1:
877
		for (i = 0; i < track->num_arrays; i++) {
878
			size = track->arrays[i].esize * track->max_indx * 4;
879
			if (track->arrays[i].robj == NULL) {
880
				DRM_ERROR("(PW %u) Vertex array %u no buffer "
881
					  "bound\n", prim_walk, i);
882
				return -EINVAL;
883
			}
884
			if (size > radeon_object_size(track->arrays[i].robj)) {
885
				DRM_ERROR("(PW %u) Vertex array %u need %lu dwords "
886
					   "have %lu dwords\n", prim_walk, i,
887
					   size >> 2,
888
					   radeon_object_size(track->arrays[i].robj) >> 2);
889
				DRM_ERROR("Max indices %u\n", track->max_indx);
890
				return -EINVAL;
891
			}
892
		}
893
		break;
894
	case 2:
895
		for (i = 0; i < track->num_arrays; i++) {
896
			size = track->arrays[i].esize * (nverts - 1) * 4;
897
			if (track->arrays[i].robj == NULL) {
898
				DRM_ERROR("(PW %u) Vertex array %u no buffer "
899
					  "bound\n", prim_walk, i);
900
				return -EINVAL;
901
			}
902
			if (size > radeon_object_size(track->arrays[i].robj)) {
903
				DRM_ERROR("(PW %u) Vertex array %u need %lu dwords "
904
					   "have %lu dwords\n", prim_walk, i, size >> 2,
905
					   radeon_object_size(track->arrays[i].robj) >> 2);
906
				return -EINVAL;
907
			}
908
		}
909
		break;
910
	case 3:
911
		size = track->vtx_size * nverts;
912
		if (size != track->immd_dwords) {
913
			DRM_ERROR("IMMD draw %u dwors but needs %lu dwords\n",
914
				  track->immd_dwords, size);
915
			DRM_ERROR("VAP_VF_CNTL.NUM_VERTICES %u, VTX_SIZE %u\n",
916
				  nverts, track->vtx_size);
917
			return -EINVAL;
918
		}
919
		break;
920
	default:
921
		DRM_ERROR("[drm] Invalid primitive walk %d for VAP_VF_CNTL\n",
922
			  prim_walk);
923
		return -EINVAL;
924
	}
925
	return r300_cs_track_texture_check(rdev, track);
926
}
927
 
928
static inline void r300_cs_track_clear(struct r300_cs_track *track)
929
{
930
	unsigned i;
931
 
932
	track->num_cb = 4;
933
	track->maxy = 4096;
934
	for (i = 0; i < track->num_cb; i++) {
935
		track->cb[i].robj = NULL;
936
		track->cb[i].pitch = 8192;
937
		track->cb[i].cpp = 16;
938
		track->cb[i].offset = 0;
939
	}
940
	track->z_enabled = true;
941
	track->zb.robj = NULL;
942
	track->zb.pitch = 8192;
943
	track->zb.cpp = 4;
944
	track->zb.offset = 0;
945
	track->vtx_size = 0x7F;
946
	track->immd_dwords = 0xFFFFFFFFUL;
947
	track->num_arrays = 11;
948
	track->max_indx = 0x00FFFFFFUL;
949
	for (i = 0; i < track->num_arrays; i++) {
950
		track->arrays[i].robj = NULL;
951
		track->arrays[i].esize = 0x7F;
952
	}
953
	for (i = 0; i < 16; i++) {
954
		track->textures[i].pitch = 16536;
955
		track->textures[i].width = 16536;
956
		track->textures[i].height = 16536;
957
		track->textures[i].width_11 = 1 << 11;
958
		track->textures[i].height_11 = 1 << 11;
959
		track->textures[i].num_levels = 12;
960
		track->textures[i].txdepth = 16;
961
		track->textures[i].cpp = 64;
962
		track->textures[i].tex_coord_type = 1;
963
		track->textures[i].robj = NULL;
964
		/* CS IB emission code makes sure texture unit are disabled */
965
		track->textures[i].enabled = false;
966
		track->textures[i].roundup_w = true;
967
		track->textures[i].roundup_h = true;
968
	}
969
}
970
 
971
static const unsigned r300_reg_safe_bm[159] = {
972
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
973
	0xFFFFFFBF, 0xFFFFFFFF, 0xFFFFFFBF, 0xFFFFFFFF,
974
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
975
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
976
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
977
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
978
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
979
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
980
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
981
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
982
	0x17FF1FFF, 0xFFFFFFFC, 0xFFFFFFFF, 0xFF30FFBF,
983
	0xFFFFFFF8, 0xC3E6FFFF, 0xFFFFF6DF, 0xFFFFFFFF,
984
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
985
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
986
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFF03F,
987
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
988
	0xFFFFFFFF, 0xFFFFEFCE, 0xF00EBFFF, 0x007C0000,
989
	0xF0000078, 0xFF000009, 0xFFFFFFFF, 0xFFFFFFFF,
990
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
991
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
992
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
993
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
994
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
995
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
996
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
997
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
998
	0xFFFFF7FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
999
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
1000
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
1001
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
1002
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
1003
	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
1004
	0xFFFFFC78, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF,
1005
	0x38FF8F50, 0xFFF88082, 0xF000000C, 0xFAE009FF,
1006
	0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000,
1007
	0x00000000, 0x0000C100, 0x00000000, 0x00000000,
1008
	0x00000000, 0x00000000, 0x00000000, 0x00000000,
1009
	0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xFF80FFFF,
1010
	0x00000000, 0x00000000, 0x00000000, 0x00000000,
1011
	0x0003FC01, 0xFFFFFFF8, 0xFE800B19,
1012
};
1013
 
1014
static int r300_packet0_check(struct radeon_cs_parser *p,
1015
		struct radeon_cs_packet *pkt,
1016
		unsigned idx, unsigned reg)
1017
{
1018
	struct radeon_cs_chunk *ib_chunk;
1019
	struct radeon_cs_reloc *reloc;
1020
	struct r300_cs_track *track;
1021
	volatile uint32_t *ib;
1022
	uint32_t tmp;
1023
	unsigned i;
1024
	int r;
1025
 
1026
	ib = p->ib->ptr;
1027
	ib_chunk = &p->chunks[p->chunk_ib_idx];
1028
	track = (struct r300_cs_track*)p->track;
1029
	switch(reg) {
1030
	case RADEON_DST_PITCH_OFFSET:
1031
	case RADEON_SRC_PITCH_OFFSET:
1032
		r = r100_cs_packet_next_reloc(p, &reloc);
1033
		if (r) {
1034
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1035
					idx, reg);
1036
			r100_cs_dump_packet(p, pkt);
1037
			return r;
1038
		}
1039
		tmp = ib_chunk->kdata[idx] & 0x003fffff;
1040
		tmp += (((u32)reloc->lobj.gpu_offset) >> 10);
1041
		ib[idx] = (ib_chunk->kdata[idx] & 0xffc00000) | tmp;
1042
		break;
1043
	case R300_RB3D_COLOROFFSET0:
1044
	case R300_RB3D_COLOROFFSET1:
1045
	case R300_RB3D_COLOROFFSET2:
1046
	case R300_RB3D_COLOROFFSET3:
1047
		i = (reg - R300_RB3D_COLOROFFSET0) >> 2;
1048
		r = r100_cs_packet_next_reloc(p, &reloc);
1049
		if (r) {
1050
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1051
					idx, reg);
1052
			r100_cs_dump_packet(p, pkt);
1053
			return r;
1054
		}
1055
		track->cb[i].robj = reloc->robj;
1056
		track->cb[i].offset = ib_chunk->kdata[idx];
1057
		ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset);
1058
		break;
1059
	case R300_ZB_DEPTHOFFSET:
1060
		r = r100_cs_packet_next_reloc(p, &reloc);
1061
		if (r) {
1062
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1063
					idx, reg);
1064
			r100_cs_dump_packet(p, pkt);
1065
			return r;
1066
		}
1067
		track->zb.robj = reloc->robj;
1068
		track->zb.offset = ib_chunk->kdata[idx];
1069
		ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset);
1070
		break;
1071
	case R300_TX_OFFSET_0:
1072
	case R300_TX_OFFSET_0+4:
1073
	case R300_TX_OFFSET_0+8:
1074
	case R300_TX_OFFSET_0+12:
1075
	case R300_TX_OFFSET_0+16:
1076
	case R300_TX_OFFSET_0+20:
1077
	case R300_TX_OFFSET_0+24:
1078
	case R300_TX_OFFSET_0+28:
1079
	case R300_TX_OFFSET_0+32:
1080
	case R300_TX_OFFSET_0+36:
1081
	case R300_TX_OFFSET_0+40:
1082
	case R300_TX_OFFSET_0+44:
1083
	case R300_TX_OFFSET_0+48:
1084
	case R300_TX_OFFSET_0+52:
1085
	case R300_TX_OFFSET_0+56:
1086
	case R300_TX_OFFSET_0+60:
1087
		i = (reg - R300_TX_OFFSET_0) >> 2;
1088
		r = r100_cs_packet_next_reloc(p, &reloc);
1089
		if (r) {
1090
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1091
					idx, reg);
1092
			r100_cs_dump_packet(p, pkt);
1093
			return r;
1094
		}
1095
		ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset);
1096
		track->textures[i].robj = reloc->robj;
1097
		break;
1098
	/* Tracked registers */
1099
	case 0x2084:
1100
		/* VAP_VF_CNTL */
1101
		track->vap_vf_cntl = ib_chunk->kdata[idx];
1102
		break;
1103
	case 0x20B4:
1104
		/* VAP_VTX_SIZE */
1105
		track->vtx_size = ib_chunk->kdata[idx] & 0x7F;
1106
		break;
1107
	case 0x2134:
1108
		/* VAP_VF_MAX_VTX_INDX */
1109
		track->max_indx = ib_chunk->kdata[idx] & 0x00FFFFFFUL;
1110
		break;
1111
	case 0x43E4:
1112
		/* SC_SCISSOR1 */
1113
		track->maxy = ((ib_chunk->kdata[idx] >> 13) & 0x1FFF) + 1;
1114
		if (p->rdev->family < CHIP_RV515) {
1115
			track->maxy -= 1440;
1116
		}
1117
		break;
1118
	case 0x4E00:
1119
		/* RB3D_CCTL */
1120
		track->num_cb = ((ib_chunk->kdata[idx] >> 5) & 0x3) + 1;
1121
		break;
1122
	case 0x4E38:
1123
	case 0x4E3C:
1124
	case 0x4E40:
1125
	case 0x4E44:
1126
		/* RB3D_COLORPITCH0 */
1127
		/* RB3D_COLORPITCH1 */
1128
		/* RB3D_COLORPITCH2 */
1129
		/* RB3D_COLORPITCH3 */
1130
		i = (reg - 0x4E38) >> 2;
1131
		track->cb[i].pitch = ib_chunk->kdata[idx] & 0x3FFE;
1132
		switch (((ib_chunk->kdata[idx] >> 21) & 0xF)) {
1133
		case 9:
1134
		case 11:
1135
		case 12:
1136
			track->cb[i].cpp = 1;
1137
			break;
1138
		case 3:
1139
		case 4:
1140
		case 13:
1141
		case 15:
1142
			track->cb[i].cpp = 2;
1143
			break;
1144
		case 6:
1145
			track->cb[i].cpp = 4;
1146
			break;
1147
		case 10:
1148
			track->cb[i].cpp = 8;
1149
			break;
1150
		case 7:
1151
			track->cb[i].cpp = 16;
1152
			break;
1153
		default:
1154
			DRM_ERROR("Invalid color buffer format (%d) !\n",
1155
				  ((ib_chunk->kdata[idx] >> 21) & 0xF));
1156
			return -EINVAL;
1157
		}
1158
		break;
1159
	case 0x4F00:
1160
		/* ZB_CNTL */
1161
		if (ib_chunk->kdata[idx] & 2) {
1162
			track->z_enabled = true;
1163
		} else {
1164
			track->z_enabled = false;
1165
		}
1166
		break;
1167
	case 0x4F10:
1168
		/* ZB_FORMAT */
1169
		switch ((ib_chunk->kdata[idx] & 0xF)) {
1170
		case 0:
1171
		case 1:
1172
			track->zb.cpp = 2;
1173
			break;
1174
		case 2:
1175
			track->zb.cpp = 4;
1176
			break;
1177
		default:
1178
			DRM_ERROR("Invalid z buffer format (%d) !\n",
1179
				  (ib_chunk->kdata[idx] & 0xF));
1180
			return -EINVAL;
1181
		}
1182
		break;
1183
	case 0x4F24:
1184
		/* ZB_DEPTHPITCH */
1185
		track->zb.pitch = ib_chunk->kdata[idx] & 0x3FFC;
1186
		break;
1187
	case 0x4104:
1188
		for (i = 0; i < 16; i++) {
1189
			bool enabled;
1190
 
1191
			enabled = !!(ib_chunk->kdata[idx] & (1 << i));
1192
			track->textures[i].enabled = enabled;
1193
		}
1194
		break;
1195
	case 0x44C0:
1196
	case 0x44C4:
1197
	case 0x44C8:
1198
	case 0x44CC:
1199
	case 0x44D0:
1200
	case 0x44D4:
1201
	case 0x44D8:
1202
	case 0x44DC:
1203
	case 0x44E0:
1204
	case 0x44E4:
1205
	case 0x44E8:
1206
	case 0x44EC:
1207
	case 0x44F0:
1208
	case 0x44F4:
1209
	case 0x44F8:
1210
	case 0x44FC:
1211
		/* TX_FORMAT1_[0-15] */
1212
		i = (reg - 0x44C0) >> 2;
1213
		tmp = (ib_chunk->kdata[idx] >> 25) & 0x3;
1214
		track->textures[i].tex_coord_type = tmp;
1215
		switch ((ib_chunk->kdata[idx] & 0x1F)) {
1216
		case 0:
1217
		case 2:
1218
		case 5:
1219
		case 18:
1220
		case 20:
1221
		case 21:
1222
			track->textures[i].cpp = 1;
1223
			break;
1224
		case 1:
1225
		case 3:
1226
		case 6:
1227
		case 7:
1228
		case 10:
1229
		case 11:
1230
		case 19:
1231
		case 22:
1232
		case 24:
1233
			track->textures[i].cpp = 2;
1234
			break;
1235
		case 4:
1236
		case 8:
1237
		case 9:
1238
		case 12:
1239
		case 13:
1240
		case 23:
1241
		case 25:
1242
		case 27:
1243
		case 30:
1244
			track->textures[i].cpp = 4;
1245
			break;
1246
		case 14:
1247
		case 26:
1248
		case 28:
1249
			track->textures[i].cpp = 8;
1250
			break;
1251
		case 29:
1252
			track->textures[i].cpp = 16;
1253
			break;
1254
		default:
1255
			DRM_ERROR("Invalid texture format %u\n",
1256
				  (ib_chunk->kdata[idx] & 0x1F));
1257
			return -EINVAL;
1258
			break;
1259
		}
1260
		break;
1261
	case 0x4400:
1262
	case 0x4404:
1263
	case 0x4408:
1264
	case 0x440C:
1265
	case 0x4410:
1266
	case 0x4414:
1267
	case 0x4418:
1268
	case 0x441C:
1269
	case 0x4420:
1270
	case 0x4424:
1271
	case 0x4428:
1272
	case 0x442C:
1273
	case 0x4430:
1274
	case 0x4434:
1275
	case 0x4438:
1276
	case 0x443C:
1277
		/* TX_FILTER0_[0-15] */
1278
		i = (reg - 0x4400) >> 2;
1279
		tmp = ib_chunk->kdata[idx] & 0x7;;
1280
		if (tmp == 2 || tmp == 4 || tmp == 6) {
1281
			track->textures[i].roundup_w = false;
1282
		}
1283
		tmp = (ib_chunk->kdata[idx] >> 3) & 0x7;;
1284
		if (tmp == 2 || tmp == 4 || tmp == 6) {
1285
			track->textures[i].roundup_h = false;
1286
		}
1287
		break;
1288
	case 0x4500:
1289
	case 0x4504:
1290
	case 0x4508:
1291
	case 0x450C:
1292
	case 0x4510:
1293
	case 0x4514:
1294
	case 0x4518:
1295
	case 0x451C:
1296
	case 0x4520:
1297
	case 0x4524:
1298
	case 0x4528:
1299
	case 0x452C:
1300
	case 0x4530:
1301
	case 0x4534:
1302
	case 0x4538:
1303
	case 0x453C:
1304
		/* TX_FORMAT2_[0-15] */
1305
		i = (reg - 0x4500) >> 2;
1306
		tmp = ib_chunk->kdata[idx] & 0x3FFF;
1307
		track->textures[i].pitch = tmp + 1;
1308
		if (p->rdev->family >= CHIP_RV515) {
1309
			tmp = ((ib_chunk->kdata[idx] >> 15) & 1) << 11;
1310
			track->textures[i].width_11 = tmp;
1311
			tmp = ((ib_chunk->kdata[idx] >> 16) & 1) << 11;
1312
			track->textures[i].height_11 = tmp;
1313
		}
1314
		break;
1315
	case 0x4480:
1316
	case 0x4484:
1317
	case 0x4488:
1318
	case 0x448C:
1319
	case 0x4490:
1320
	case 0x4494:
1321
	case 0x4498:
1322
	case 0x449C:
1323
	case 0x44A0:
1324
	case 0x44A4:
1325
	case 0x44A8:
1326
	case 0x44AC:
1327
	case 0x44B0:
1328
	case 0x44B4:
1329
	case 0x44B8:
1330
	case 0x44BC:
1331
		/* TX_FORMAT0_[0-15] */
1332
		i = (reg - 0x4480) >> 2;
1333
		tmp = ib_chunk->kdata[idx] & 0x7FF;
1334
		track->textures[i].width = tmp + 1;
1335
		tmp = (ib_chunk->kdata[idx] >> 11) & 0x7FF;
1336
		track->textures[i].height = tmp + 1;
1337
		tmp = (ib_chunk->kdata[idx] >> 26) & 0xF;
1338
		track->textures[i].num_levels = tmp;
1339
		tmp = ib_chunk->kdata[idx] & (1 << 31);
1340
		track->textures[i].use_pitch = !!tmp;
1341
		tmp = (ib_chunk->kdata[idx] >> 22) & 0xF;
1342
		track->textures[i].txdepth = tmp;
1343
		break;
1344
	default:
1345
		printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n",
1346
		       reg, idx);
1347
		return -EINVAL;
1348
	}
1349
	return 0;
1350
}
1351
 
1352
static int r300_packet3_check(struct radeon_cs_parser *p,
1353
			      struct radeon_cs_packet *pkt)
1354
{
1355
	struct radeon_cs_chunk *ib_chunk;
1356
	struct radeon_cs_reloc *reloc;
1357
	struct r300_cs_track *track;
1358
	volatile uint32_t *ib;
1359
	unsigned idx;
1360
	unsigned i, c;
1361
	int r;
1362
 
1363
	ib = p->ib->ptr;
1364
	ib_chunk = &p->chunks[p->chunk_ib_idx];
1365
	idx = pkt->idx + 1;
1366
	track = (struct r300_cs_track*)p->track;
1367
	switch(pkt->opcode) {
1368
	case PACKET3_3D_LOAD_VBPNTR:
1369
		c = ib_chunk->kdata[idx++] & 0x1F;
1370
		track->num_arrays = c;
1371
		for (i = 0; i < (c - 1); i+=2, idx+=3) {
1372
			r = r100_cs_packet_next_reloc(p, &reloc);
1373
			if (r) {
1374
				DRM_ERROR("No reloc for packet3 %d\n",
1375
					  pkt->opcode);
1376
				r100_cs_dump_packet(p, pkt);
1377
				return r;
1378
			}
1379
			ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset);
1380
			track->arrays[i + 0].robj = reloc->robj;
1381
			track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8;
1382
			track->arrays[i + 0].esize &= 0x7F;
1383
			r = r100_cs_packet_next_reloc(p, &reloc);
1384
			if (r) {
1385
				DRM_ERROR("No reloc for packet3 %d\n",
1386
					  pkt->opcode);
1387
				r100_cs_dump_packet(p, pkt);
1388
				return r;
1389
			}
1390
			ib[idx+2] = ib_chunk->kdata[idx+2] + ((u32)reloc->lobj.gpu_offset);
1391
			track->arrays[i + 1].robj = reloc->robj;
1392
			track->arrays[i + 1].esize = ib_chunk->kdata[idx] >> 24;
1393
			track->arrays[i + 1].esize &= 0x7F;
1394
		}
1395
		if (c & 1) {
1396
			r = r100_cs_packet_next_reloc(p, &reloc);
1397
			if (r) {
1398
				DRM_ERROR("No reloc for packet3 %d\n",
1399
					  pkt->opcode);
1400
				r100_cs_dump_packet(p, pkt);
1401
				return r;
1402
			}
1403
			ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset);
1404
			track->arrays[i + 0].robj = reloc->robj;
1405
			track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8;
1406
			track->arrays[i + 0].esize &= 0x7F;
1407
		}
1408
		break;
1409
	case PACKET3_INDX_BUFFER:
1410
		r = r100_cs_packet_next_reloc(p, &reloc);
1411
		if (r) {
1412
			DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode);
1413
			r100_cs_dump_packet(p, pkt);
1414
			return r;
1415
		}
1416
		ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset);
1417
		r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj);
1418
		if (r) {
1419
			return r;
1420
		}
1421
		break;
1422
	/* Draw packet */
1423
	case PACKET3_3D_DRAW_IMMD:
1424
		/* Number of dwords is vtx_size * (num_vertices - 1)
1425
		 * PRIM_WALK must be equal to 3 vertex data in embedded
1426
		 * in cmd stream */
1427
		if (((ib_chunk->kdata[idx+1] >> 4) & 0x3) != 3) {
1428
			DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n");
1429
			return -EINVAL;
1430
		}
1431
		track->vap_vf_cntl = ib_chunk->kdata[idx+1];
1432
		track->immd_dwords = pkt->count - 1;
1433
		r = r300_cs_track_check(p->rdev, track);
1434
		if (r) {
1435
			return r;
1436
		}
1437
		break;
1438
	case PACKET3_3D_DRAW_IMMD_2:
1439
		/* Number of dwords is vtx_size * (num_vertices - 1)
1440
		 * PRIM_WALK must be equal to 3 vertex data in embedded
1441
		 * in cmd stream */
1442
		if (((ib_chunk->kdata[idx] >> 4) & 0x3) != 3) {
1443
			DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n");
1444
			return -EINVAL;
1445
		}
1446
		track->vap_vf_cntl = ib_chunk->kdata[idx];
1447
		track->immd_dwords = pkt->count;
1448
		r = r300_cs_track_check(p->rdev, track);
1449
		if (r) {
1450
			return r;
1451
		}
1452
		break;
1453
	case PACKET3_3D_DRAW_VBUF:
1454
		track->vap_vf_cntl = ib_chunk->kdata[idx + 1];
1455
		r = r300_cs_track_check(p->rdev, track);
1456
		if (r) {
1457
			return r;
1458
		}
1459
		break;
1460
	case PACKET3_3D_DRAW_VBUF_2:
1461
		track->vap_vf_cntl = ib_chunk->kdata[idx];
1462
		r = r300_cs_track_check(p->rdev, track);
1463
		if (r) {
1464
			return r;
1465
		}
1466
		break;
1467
	case PACKET3_3D_DRAW_INDX:
1468
		track->vap_vf_cntl = ib_chunk->kdata[idx + 1];
1469
		r = r300_cs_track_check(p->rdev, track);
1470
		if (r) {
1471
			return r;
1472
		}
1473
		break;
1474
	case PACKET3_3D_DRAW_INDX_2:
1475
		track->vap_vf_cntl = ib_chunk->kdata[idx];
1476
		r = r300_cs_track_check(p->rdev, track);
1477
		if (r) {
1478
			return r;
1479
		}
1480
		break;
1481
	case PACKET3_NOP:
1482
		break;
1483
	default:
1484
		DRM_ERROR("Packet3 opcode %x not supported\n", pkt->opcode);
1485
		return -EINVAL;
1486
	}
1487
	return 0;
1488
}
1489
 
1490
int r300_cs_parse(struct radeon_cs_parser *p)
1491
{
1492
	struct radeon_cs_packet pkt;
1493
	struct r300_cs_track track;
1494
	int r;
1495
 
1496
	r300_cs_track_clear(&track);
1497
	p->track = &track;
1498
	do {
1499
		r = r100_cs_packet_parse(p, &pkt, p->idx);
1500
		if (r) {
1501
			return r;
1502
		}
1503
		p->idx += pkt.count + 2;
1504
		switch (pkt.type) {
1505
		case PACKET_TYPE0:
1506
			r = r100_cs_parse_packet0(p, &pkt,
1507
						  p->rdev->config.r300.reg_safe_bm,
1508
						  p->rdev->config.r300.reg_safe_bm_size,
1509
						  &r300_packet0_check);
1510
			break;
1511
		case PACKET_TYPE2:
1512
			break;
1513
		case PACKET_TYPE3:
1514
			r = r300_packet3_check(p, &pkt);
1515
			break;
1516
		default:
1517
			DRM_ERROR("Unknown packet type %d !\n", pkt.type);
1518
			return -EINVAL;
1519
		}
1520
		if (r) {
1521
			return r;
1522
		}
1523
	} while (p->idx < p->chunks[p->chunk_ib_idx].length_dw);
1524
	return 0;
1525
}
1526
 
1527
int r300_init(struct radeon_device *rdev)
1528
{
1529
	rdev->config.r300.reg_safe_bm = r300_reg_safe_bm;
1530
	rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r300_reg_safe_bm);
1531
	return 0;
1532
}
1533
 
1534
 
1535
#endif