Subversion Repositories Kolibri OS

Rev

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

Rev 3764 Rev 5078
Line 32... Line 32...
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 
36
#include 
37
 
-
 
-
 
37
#include "r100_track.h"
38
#include "r300d.h"
38
#include "r300d.h"
39
#include "rv350d.h"
39
#include "rv350d.h"
40
#include "r300_reg_safe.h"
40
#include "r300_reg_safe.h"
Line 41... Line 41...
41
 
41
 
Line 67... Line 67...
67
		WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
67
		WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
68
	}
68
	}
69
		mb();
69
		mb();
70
}
70
}
Line -... Line 71...
-
 
71
 
71
 
72
#define R300_PTE_UNSNOOPED (1 << 0)
72
#define R300_PTE_WRITEABLE (1 << 2)
73
#define R300_PTE_WRITEABLE (1 << 2)
Line 73... Line 74...
73
#define R300_PTE_READABLE  (1 << 3)
74
#define R300_PTE_READABLE  (1 << 3)
-
 
75
 
74
 
76
void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i,
75
int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr)
77
			      uint64_t addr, uint32_t flags)
Line 76... Line -...
76
{
-
 
77
	void __iomem *ptr = rdev->gart.ptr;
-
 
78
 
-
 
79
	if (i < 0 || i > rdev->gart.num_gpu_pages) {
78
{
80
		return -EINVAL;
79
	void __iomem *ptr = rdev->gart.ptr;
-
 
80
 
81
	}
81
	addr = (lower_32_bits(addr) >> 8) |
-
 
82
		((upper_32_bits(addr) & 0xff) << 24);
-
 
83
	if (flags & RADEON_GART_PAGE_READ)
-
 
84
		addr |= R300_PTE_READABLE;
-
 
85
	if (flags & RADEON_GART_PAGE_WRITE)
82
	addr = (lower_32_bits(addr) >> 8) |
86
		addr |= R300_PTE_WRITEABLE;
83
	       ((upper_32_bits(addr) & 0xff) << 24) |
87
	if (!(flags & RADEON_GART_PAGE_SNOOP))
84
	       R300_PTE_WRITEABLE | R300_PTE_READABLE;
88
		addr |= R300_PTE_UNSNOOPED;
85
	/* on x86 we want this to be CPU endian, on powerpc
89
	/* on x86 we want this to be CPU endian, on powerpc
86
	 * on powerpc without HW swappers, it'll get swapped on way
-
 
87
	 * into VRAM - so no need for cpu_to_le32 on VRAM tables */
90
	 * on powerpc without HW swappers, it'll get swapped on way
Line 88... Line 91...
88
	writel(addr, ((void __iomem *)ptr) + (i * 4));
91
	 * into VRAM - so no need for cpu_to_le32 on VRAM tables */
89
	return 0;
92
	writel(addr, ((void __iomem *)ptr) + (i * 4));
90
}
93
}
Line 121... Line 124...
121
		return -EINVAL;
124
		return -EINVAL;
122
	}
125
	}
123
	r = radeon_gart_table_vram_pin(rdev);
126
	r = radeon_gart_table_vram_pin(rdev);
124
	if (r)
127
	if (r)
125
		return r;
128
		return r;
126
	radeon_gart_restore(rdev);
-
 
127
	/* discard memory request outside of configured range */
129
	/* discard memory request outside of configured range */
128
	tmp = RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD;
130
	tmp = RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD;
129
	WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
131
	WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
130
	WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO, rdev->mc.gtt_start);
132
	WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO, rdev->mc.gtt_start);
131
	tmp = rdev->mc.gtt_end & ~RADEON_GPU_PAGE_MASK;
133
	tmp = rdev->mc.gtt_end & ~RADEON_GPU_PAGE_MASK;
Line 291... Line 293...
291
			  R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE);
293
			  R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE);
292
	radeon_ring_write(ring, PACKET0(R300_GA_ROUND_MODE, 0));
294
	radeon_ring_write(ring, PACKET0(R300_GA_ROUND_MODE, 0));
293
	radeon_ring_write(ring,
295
	radeon_ring_write(ring,
294
			  R300_GEOMETRY_ROUND_NEAREST |
296
			  R300_GEOMETRY_ROUND_NEAREST |
295
			  R300_COLOR_ROUND_NEAREST);
297
			  R300_COLOR_ROUND_NEAREST);
296
	radeon_ring_unlock_commit(rdev, ring);
298
	radeon_ring_unlock_commit(rdev, ring, false);
297
}
299
}
Line 298... Line 300...
298
 
300
 
299
static void r300_errata(struct radeon_device *rdev)
301
static void r300_errata(struct radeon_device *rdev)
300
{
302
{
Line 590... Line 592...
590
#else
592
#else
591
	return 0;
593
	return 0;
592
#endif
594
#endif
593
}
595
}
Line 594... Line -...
594
 
-
 
595
 
-
 
596
#if 0
-
 
597
 
596
 
598
static int r300_packet0_check(struct radeon_cs_parser *p,
597
static int r300_packet0_check(struct radeon_cs_parser *p,
599
		struct radeon_cs_packet *pkt,
598
		struct radeon_cs_packet *pkt,
600
		unsigned idx, unsigned reg)
599
		unsigned idx, unsigned reg)
601
{
600
{
Line 641... Line 640...
641
			return r;
640
			return r;
642
		}
641
		}
643
		track->cb[i].robj = reloc->robj;
642
		track->cb[i].robj = reloc->robj;
644
		track->cb[i].offset = idx_value;
643
		track->cb[i].offset = idx_value;
645
		track->cb_dirty = true;
644
		track->cb_dirty = true;
646
		ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
645
		ib[idx] = idx_value + ((u32)reloc->gpu_offset);
647
		break;
646
		break;
648
	case R300_ZB_DEPTHOFFSET:
647
	case R300_ZB_DEPTHOFFSET:
649
		r = radeon_cs_packet_next_reloc(p, &reloc, 0);
648
		r = radeon_cs_packet_next_reloc(p, &reloc, 0);
650
		if (r) {
649
		if (r) {
651
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
650
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
Line 654... Line 653...
654
			return r;
653
			return r;
655
		}
654
		}
656
		track->zb.robj = reloc->robj;
655
		track->zb.robj = reloc->robj;
657
		track->zb.offset = idx_value;
656
		track->zb.offset = idx_value;
658
		track->zb_dirty = true;
657
		track->zb_dirty = true;
659
		ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
658
		ib[idx] = idx_value + ((u32)reloc->gpu_offset);
660
		break;
659
		break;
661
	case R300_TX_OFFSET_0:
660
	case R300_TX_OFFSET_0:
662
	case R300_TX_OFFSET_0+4:
661
	case R300_TX_OFFSET_0+4:
663
	case R300_TX_OFFSET_0+8:
662
	case R300_TX_OFFSET_0+8:
664
	case R300_TX_OFFSET_0+12:
663
	case R300_TX_OFFSET_0+12:
Line 683... Line 682...
683
			return r;
682
			return r;
684
		}
683
		}
Line 685... Line 684...
685
 
684
 
686
		if (p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS) {
685
		if (p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS) {
687
			ib[idx] = (idx_value & 31) | /* keep the 1st 5 bits */
686
			ib[idx] = (idx_value & 31) | /* keep the 1st 5 bits */
688
				  ((idx_value & ~31) + (u32)reloc->lobj.gpu_offset);
687
				  ((idx_value & ~31) + (u32)reloc->gpu_offset);
689
		} else {
688
		} else {
690
		if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
689
			if (reloc->tiling_flags & RADEON_TILING_MACRO)
691
			tile_flags |= R300_TXO_MACRO_TILE;
690
			tile_flags |= R300_TXO_MACRO_TILE;
692
		if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
691
			if (reloc->tiling_flags & RADEON_TILING_MICRO)
693
			tile_flags |= R300_TXO_MICRO_TILE;
692
			tile_flags |= R300_TXO_MICRO_TILE;
694
		else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE)
693
			else if (reloc->tiling_flags & RADEON_TILING_MICRO_SQUARE)
Line 695... Line 694...
695
			tile_flags |= R300_TXO_MICRO_TILE_SQUARE;
694
			tile_flags |= R300_TXO_MICRO_TILE_SQUARE;
696
 
695
 
697
		tmp = idx_value + ((u32)reloc->lobj.gpu_offset);
696
			tmp = idx_value + ((u32)reloc->gpu_offset);
698
		tmp |= tile_flags;
697
		tmp |= tile_flags;
699
		ib[idx] = tmp;
698
		ib[idx] = tmp;
700
		}
699
		}
Line 754... Line 753...
754
				  idx, reg);
753
				  idx, reg);
755
				radeon_cs_dump_packet(p, pkt);
754
				radeon_cs_dump_packet(p, pkt);
756
			return r;
755
			return r;
757
		}
756
		}
Line 758... Line 757...
758
 
757
 
759
		if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
758
			if (reloc->tiling_flags & RADEON_TILING_MACRO)
760
			tile_flags |= R300_COLOR_TILE_ENABLE;
759
			tile_flags |= R300_COLOR_TILE_ENABLE;
761
		if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
760
			if (reloc->tiling_flags & RADEON_TILING_MICRO)
762
			tile_flags |= R300_COLOR_MICROTILE_ENABLE;
761
			tile_flags |= R300_COLOR_MICROTILE_ENABLE;
763
		else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE)
762
			else if (reloc->tiling_flags & RADEON_TILING_MICRO_SQUARE)
Line 764... Line 763...
764
			tile_flags |= R300_COLOR_MICROTILE_SQUARE_ENABLE;
763
			tile_flags |= R300_COLOR_MICROTILE_SQUARE_ENABLE;
765
 
764
 
766
		tmp = idx_value & ~(0x7 << 16);
765
		tmp = idx_value & ~(0x7 << 16);
Line 839... Line 838...
839
				  idx, reg);
838
				  idx, reg);
840
				radeon_cs_dump_packet(p, pkt);
839
				radeon_cs_dump_packet(p, pkt);
841
			return r;
840
			return r;
842
		}
841
		}
Line 843... Line 842...
843
 
842
 
844
		if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
843
			if (reloc->tiling_flags & RADEON_TILING_MACRO)
845
			tile_flags |= R300_DEPTHMACROTILE_ENABLE;
844
			tile_flags |= R300_DEPTHMACROTILE_ENABLE;
846
		if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
845
			if (reloc->tiling_flags & RADEON_TILING_MICRO)
847
			tile_flags |= R300_DEPTHMICROTILE_TILED;
846
			tile_flags |= R300_DEPTHMICROTILE_TILED;
848
		else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE)
847
			else if (reloc->tiling_flags & RADEON_TILING_MICRO_SQUARE)
Line 849... Line 848...
849
			tile_flags |= R300_DEPTHMICROTILE_TILED_SQUARE;
848
			tile_flags |= R300_DEPTHMICROTILE_TILED_SQUARE;
850
 
849
 
851
		tmp = idx_value & ~(0x7 << 16);
850
		tmp = idx_value & ~(0x7 << 16);
Line 1053... Line 1052...
1053
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1052
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1054
					idx, reg);
1053
					idx, reg);
1055
			radeon_cs_dump_packet(p, pkt);
1054
			radeon_cs_dump_packet(p, pkt);
1056
			return r;
1055
			return r;
1057
		}
1056
		}
1058
		ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1057
		ib[idx] = idx_value + ((u32)reloc->gpu_offset);
1059
		break;
1058
		break;
1060
	case 0x4e0c:
1059
	case 0x4e0c:
1061
		/* RB3D_COLOR_CHANNEL_MASK */
1060
		/* RB3D_COLOR_CHANNEL_MASK */
1062
		track->color_channel_mask = idx_value;
1061
		track->color_channel_mask = idx_value;
1063
		track->cb_dirty = true;
1062
		track->cb_dirty = true;
Line 1098... Line 1097...
1098
			return r;
1097
			return r;
1099
		}
1098
		}
1100
		track->aa.robj = reloc->robj;
1099
		track->aa.robj = reloc->robj;
1101
		track->aa.offset = idx_value;
1100
		track->aa.offset = idx_value;
1102
		track->aa_dirty = true;
1101
		track->aa_dirty = true;
1103
		ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1102
		ib[idx] = idx_value + ((u32)reloc->gpu_offset);
1104
		break;
1103
		break;
1105
	case R300_RB3D_AARESOLVE_PITCH:
1104
	case R300_RB3D_AARESOLVE_PITCH:
1106
		track->aa.pitch = idx_value & 0x3FFE;
1105
		track->aa.pitch = idx_value & 0x3FFE;
1107
		track->aa_dirty = true;
1106
		track->aa_dirty = true;
1108
		break;
1107
		break;
Line 1163... Line 1162...
1163
		if (r) {
1162
		if (r) {
1164
			DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode);
1163
			DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode);
1165
			radeon_cs_dump_packet(p, pkt);
1164
			radeon_cs_dump_packet(p, pkt);
1166
			return r;
1165
			return r;
1167
		}
1166
		}
1168
		ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->lobj.gpu_offset);
1167
		ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->gpu_offset);
1169
		r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj);
1168
		r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj);
1170
		if (r) {
1169
		if (r) {
1171
			return r;
1170
			return r;
1172
		}
1171
		}
1173
		break;
1172
		break;
Line 1285... Line 1284...
1285
			return r;
1284
			return r;
1286
		}
1285
		}
1287
	} while (p->idx < p->chunks[p->chunk_ib_idx].length_dw);
1286
	} while (p->idx < p->chunks[p->chunk_ib_idx].length_dw);
1288
	return 0;
1287
	return 0;
1289
}
1288
}
1290
#endif
-
 
1291
 
-
 
Line 1292... Line 1289...
1292
 
1289
 
1293
void r300_set_reg_safe(struct radeon_device *rdev)
1290
void r300_set_reg_safe(struct radeon_device *rdev)
1294
{
1291
{
1295
	rdev->config.r300.reg_safe_bm = r300_reg_safe_bm;
1292
	rdev->config.r300.reg_safe_bm = r300_reg_safe_bm;
Line 1482... Line 1479...
1482
		if (r)
1479
		if (r)
1483
			return r;
1480
			return r;
1484
	}
1481
	}
1485
	r300_set_reg_safe(rdev);
1482
	r300_set_reg_safe(rdev);
Line -... Line 1483...
-
 
1483
 
-
 
1484
	/* Initialize power management */
-
 
1485
	radeon_pm_init(rdev);
1486
 
1486
 
1487
	rdev->accel_working = true;
1487
	rdev->accel_working = true;
1488
	r = r300_startup(rdev);
1488
	r = r300_startup(rdev);
1489
	if (r) {
1489
	if (r) {
1490
		/* Somethings want wront with the accel init stop accel */
1490
		/* Something went wrong with the accel init, so stop accel */
1491
		dev_err(rdev->dev, "Disabling GPU acceleration\n");
1491
		dev_err(rdev->dev, "Disabling GPU acceleration\n");
1492
		if (rdev->flags & RADEON_IS_PCIE)
1492
		if (rdev->flags & RADEON_IS_PCIE)
1493
			rv370_pcie_gart_fini(rdev);
1493
			rv370_pcie_gart_fini(rdev);
1494
		if (rdev->flags & RADEON_IS_PCI)
1494
		if (rdev->flags & RADEON_IS_PCI)