Subversion Repositories Kolibri OS

Rev

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

Rev 1179 Rev 1221
Line 31... Line 31...
31
#include "radeon_reg.h"
31
#include "radeon_reg.h"
32
#include "radeon.h"
32
#include "radeon.h"
33
#include "radeon_drm.h"
33
#include "radeon_drm.h"
Line 34... Line 34...
34
 
34
 
35
#include "r300d.h"
-
 
-
 
35
#include "r300d.h"
36
 
36
#include "rv350d.h"
Line 37... Line -...
37
#include "r300_reg_safe.h"
-
 
38
 
-
 
39
/* r300,r350,rv350,rv370,rv380 depends on : */
-
 
40
void r100_hdp_reset(struct radeon_device *rdev);
-
 
41
int r100_cp_reset(struct radeon_device *rdev);
-
 
42
int r100_rb2d_reset(struct radeon_device *rdev);
-
 
43
int r100_cp_init(struct radeon_device *rdev, unsigned ring_size);
-
 
44
int r100_pci_gart_enable(struct radeon_device *rdev);
-
 
45
void r100_mc_setup(struct radeon_device *rdev);
-
 
46
void r100_mc_disable_clients(struct radeon_device *rdev);
-
 
47
int r100_gui_wait_for_idle(struct radeon_device *rdev);
-
 
48
int r100_cs_packet_parse(struct radeon_cs_parser *p,
-
 
49
			 struct radeon_cs_packet *pkt,
-
 
50
			 unsigned idx);
-
 
51
int r100_cs_packet_parse_vline(struct radeon_cs_parser *p);
-
 
52
int r100_cs_parse_packet0(struct radeon_cs_parser *p,
-
 
53
			  struct radeon_cs_packet *pkt,
-
 
54
			  const unsigned *auth, unsigned n,
-
 
55
			  radeon_packet0_check_t check);
-
 
56
int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p,
-
 
57
					 struct radeon_cs_packet *pkt,
-
 
58
					 struct radeon_object *robj);
37
#include "r300_reg_safe.h"
59
 
-
 
60
/* This files gather functions specifics to:
-
 
61
 * r300,r350,rv350,rv370,rv380
-
 
62
 *
-
 
63
 * Some of these functions might be used by newer ASICs.
-
 
64
 */
-
 
65
void r300_gpu_init(struct radeon_device *rdev);
-
 
66
int r300_mc_wait_for_idle(struct radeon_device *rdev);
-
 
Line 67... Line 38...
67
int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev);
38
 
68
 
39
/* This files gather functions specifics to: r300,r350,rv350,rv370,rv380 */
69
 
40
 
-
 
41
/*
-
 
42
 * rv370,rv380 PCIE GART
70
/*
43
 */
71
 * rv370,rv380 PCIE GART
44
static int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev);
72
 */
45
 
73
void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev)
46
void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev)
Line 180... Line 153...
180
			rv370_pcie_gart_disable(rdev);
153
			rv370_pcie_gart_disable(rdev);
181
	radeon_gart_table_vram_free(rdev);
154
	radeon_gart_table_vram_free(rdev);
182
	radeon_gart_fini(rdev);
155
	radeon_gart_fini(rdev);
183
}
156
}
Line 184... Line -...
184
 
-
 
185
/*
-
 
186
 * MC
-
 
187
 */
-
 
188
int r300_mc_init(struct radeon_device *rdev)
-
 
189
{
-
 
190
	int r;
-
 
191
 
-
 
192
	if (r100_debugfs_rbbm_init(rdev)) {
-
 
193
		DRM_ERROR("Failed to register debugfs file for RBBM !\n");
-
 
194
	}
-
 
195
 
-
 
196
	r300_gpu_init(rdev);
-
 
197
	r100_pci_gart_disable(rdev);
-
 
198
	if (rdev->flags & RADEON_IS_PCIE) {
-
 
199
		rv370_pcie_gart_disable(rdev);
-
 
200
	}
-
 
201
 
-
 
202
	/* Setup GPU memory space */
-
 
203
	rdev->mc.vram_location = 0xFFFFFFFFUL;
-
 
204
	rdev->mc.gtt_location = 0xFFFFFFFFUL;
-
 
205
	r = radeon_mc_setup(rdev);
-
 
206
	if (r) {
-
 
207
		return r;
-
 
208
	}
-
 
209
 
-
 
210
	/* Program GPU memory space */
-
 
211
	r100_mc_disable_clients(rdev);
-
 
212
	if (r300_mc_wait_for_idle(rdev)) {
-
 
213
		printk(KERN_WARNING "Failed to wait MC idle while "
-
 
214
		       "programming pipes. Bad things might happen.\n");
-
 
215
	}
-
 
216
	r100_mc_setup(rdev);
-
 
217
	return 0;
-
 
218
}
-
 
219
 
-
 
220
void r300_mc_fini(struct radeon_device *rdev)
-
 
221
{
-
 
222
}
-
 
223
 
-
 
224
 
-
 
225
/*
-
 
226
 * Fence emission
-
 
227
 */
157
 
228
void r300_fence_ring_emit(struct radeon_device *rdev,
158
void r300_fence_ring_emit(struct radeon_device *rdev,
229
			  struct radeon_fence *fence)
159
			  struct radeon_fence *fence)
230
{
160
{
231
	/* Who ever call radeon_fence_emit should call ring_lock and ask
161
	/* Who ever call radeon_fence_emit should call ring_lock and ask
Line 251... Line 181...
251
}
181
}
Line 252... Line 182...
252
 
182
 
Line 253... Line 183...
253
 
183
 
254
#if 0
-
 
255
 
-
 
256
/*
184
#if 0
257
 * Global GPU functions
185
 
258
 */
186
 
259
int r300_copy_dma(struct radeon_device *rdev,
187
int r300_copy_dma(struct radeon_device *rdev,
260
		  uint64_t src_offset,
188
		  uint64_t src_offset,
Line 574... Line 502...
574
	}
502
	}
Line 575... Line 503...
575
 
503
 
576
	r100_vram_init_sizes(rdev);
504
	r100_vram_init_sizes(rdev);
Line 577... Line -...
577
}
-
 
578
 
-
 
579
 
-
 
580
/*
-
 
581
 * PCIE Lanes
-
 
582
 */
505
}
583
 
506
 
584
void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes)
507
void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes)
Line 585... Line 508...
585
{
508
{
Line 638... Line 561...
638
	while (link_width_cntl == 0xffffffff)
561
	while (link_width_cntl == 0xffffffff)
639
		link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL);
562
		link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL);
Line 640... Line 563...
640
 
563
 
Line 641... Line -...
641
}
-
 
642
 
-
 
643
 
-
 
644
/*
-
 
645
 * Debugfs info
564
}
646
 */
565
 
647
#if defined(CONFIG_DEBUG_FS)
566
#if defined(CONFIG_DEBUG_FS)
648
static int rv370_debugfs_pcie_gart_info(struct seq_file *m, void *data)
567
static int rv370_debugfs_pcie_gart_info(struct seq_file *m, void *data)
649
{
568
{
Line 672... Line 591...
672
static struct drm_info_list rv370_pcie_gart_info_list[] = {
591
static struct drm_info_list rv370_pcie_gart_info_list[] = {
673
	{"rv370_pcie_gart_info", rv370_debugfs_pcie_gart_info, 0, NULL},
592
	{"rv370_pcie_gart_info", rv370_debugfs_pcie_gart_info, 0, NULL},
674
};
593
};
675
#endif
594
#endif
Line 676... Line 595...
676
 
595
 
677
int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev)
596
static int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev)
678
{
597
{
679
#if defined(CONFIG_DEBUG_FS)
598
#if defined(CONFIG_DEBUG_FS)
680
	return radeon_debugfs_add_files(rdev, rv370_pcie_gart_info_list, 1);
599
	return radeon_debugfs_add_files(rdev, rv370_pcie_gart_info_list, 1);
681
#else
600
#else
682
	return 0;
601
	return 0;
683
#endif
602
#endif
Line 684... Line 603...
684
}
603
}
685
 
604
 
686
 
-
 
687
#if 0
-
 
688
/*
605
 
689
 * CS functions
606
#if 0
690
 */
607
 
691
static int r300_packet0_check(struct radeon_cs_parser *p,
608
static int r300_packet0_check(struct radeon_cs_parser *p,
692
		struct radeon_cs_packet *pkt,
-
 
693
		unsigned idx, unsigned reg)
609
		struct radeon_cs_packet *pkt,
694
{
610
		unsigned idx, unsigned reg)
695
	struct radeon_cs_chunk *ib_chunk;
611
{
696
	struct radeon_cs_reloc *reloc;
612
	struct radeon_cs_reloc *reloc;
697
	struct r100_cs_track *track;
613
	struct r100_cs_track *track;
698
	volatile uint32_t *ib;
614
	volatile uint32_t *ib;
-
 
615
	uint32_t tmp, tile_flags = 0;
Line 699... Line 616...
699
	uint32_t tmp, tile_flags = 0;
616
	unsigned i;
700
	unsigned i;
-
 
701
	int r;
617
	int r;
-
 
618
	u32 idx_value;
-
 
619
 
702
 
620
	ib = p->ib->ptr;
703
	ib = p->ib->ptr;
621
	track = (struct r100_cs_track *)p->track;
704
	ib_chunk = &p->chunks[p->chunk_ib_idx];
622
	idx_value = radeon_get_ib_value(p, idx);
705
	track = (struct r100_cs_track *)p->track;
623
 
706
	switch(reg) {
624
	switch(reg) {
Line 731... Line 649...
731
					idx, reg);
649
					idx, reg);
732
			r100_cs_dump_packet(p, pkt);
650
			r100_cs_dump_packet(p, pkt);
733
			return r;
651
			return r;
734
		}
652
		}
735
		track->cb[i].robj = reloc->robj;
653
		track->cb[i].robj = reloc->robj;
736
		track->cb[i].offset = ib_chunk->kdata[idx];
654
		track->cb[i].offset = idx_value;
737
		ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset);
655
		ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
738
		break;
656
		break;
739
	case R300_ZB_DEPTHOFFSET:
657
	case R300_ZB_DEPTHOFFSET:
740
		r = r100_cs_packet_next_reloc(p, &reloc);
658
		r = r100_cs_packet_next_reloc(p, &reloc);
741
		if (r) {
659
		if (r) {
742
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
660
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
743
					idx, reg);
661
					idx, reg);
744
			r100_cs_dump_packet(p, pkt);
662
			r100_cs_dump_packet(p, pkt);
745
			return r;
663
			return r;
746
		}
664
		}
747
		track->zb.robj = reloc->robj;
665
		track->zb.robj = reloc->robj;
748
		track->zb.offset = ib_chunk->kdata[idx];
666
		track->zb.offset = idx_value;
749
		ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset);
667
		ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
750
		break;
668
		break;
751
	case R300_TX_OFFSET_0:
669
	case R300_TX_OFFSET_0:
752
	case R300_TX_OFFSET_0+4:
670
	case R300_TX_OFFSET_0+4:
753
	case R300_TX_OFFSET_0+8:
671
	case R300_TX_OFFSET_0+8:
754
	case R300_TX_OFFSET_0+12:
672
	case R300_TX_OFFSET_0+12:
Line 770... Line 688...
770
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
688
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
771
					idx, reg);
689
					idx, reg);
772
			r100_cs_dump_packet(p, pkt);
690
			r100_cs_dump_packet(p, pkt);
773
			return r;
691
			return r;
774
		}
692
		}
775
		ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset);
693
		ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
776
		track->textures[i].robj = reloc->robj;
694
		track->textures[i].robj = reloc->robj;
777
		break;
695
		break;
778
	/* Tracked registers */
696
	/* Tracked registers */
779
	case 0x2084:
697
	case 0x2084:
780
		/* VAP_VF_CNTL */
698
		/* VAP_VF_CNTL */
781
		track->vap_vf_cntl = ib_chunk->kdata[idx];
699
		track->vap_vf_cntl = idx_value;
782
		break;
700
		break;
783
	case 0x20B4:
701
	case 0x20B4:
784
		/* VAP_VTX_SIZE */
702
		/* VAP_VTX_SIZE */
785
		track->vtx_size = ib_chunk->kdata[idx] & 0x7F;
703
		track->vtx_size = idx_value & 0x7F;
786
		break;
704
		break;
787
	case 0x2134:
705
	case 0x2134:
788
		/* VAP_VF_MAX_VTX_INDX */
706
		/* VAP_VF_MAX_VTX_INDX */
789
		track->max_indx = ib_chunk->kdata[idx] & 0x00FFFFFFUL;
707
		track->max_indx = idx_value & 0x00FFFFFFUL;
790
		break;
708
		break;
791
	case 0x43E4:
709
	case 0x43E4:
792
		/* SC_SCISSOR1 */
710
		/* SC_SCISSOR1 */
793
		track->maxy = ((ib_chunk->kdata[idx] >> 13) & 0x1FFF) + 1;
711
		track->maxy = ((idx_value >> 13) & 0x1FFF) + 1;
794
		if (p->rdev->family < CHIP_RV515) {
712
		if (p->rdev->family < CHIP_RV515) {
795
			track->maxy -= 1440;
713
			track->maxy -= 1440;
796
		}
714
		}
797
		break;
715
		break;
798
	case 0x4E00:
716
	case 0x4E00:
799
		/* RB3D_CCTL */
717
		/* RB3D_CCTL */
800
		track->num_cb = ((ib_chunk->kdata[idx] >> 5) & 0x3) + 1;
718
		track->num_cb = ((idx_value >> 5) & 0x3) + 1;
801
		break;
719
		break;
802
	case 0x4E38:
720
	case 0x4E38:
803
	case 0x4E3C:
721
	case 0x4E3C:
804
	case 0x4E40:
722
	case 0x4E40:
805
	case 0x4E44:
723
	case 0x4E44:
Line 818... Line 736...
818
		if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
736
		if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
819
			tile_flags |= R300_COLOR_TILE_ENABLE;
737
			tile_flags |= R300_COLOR_TILE_ENABLE;
820
		if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
738
		if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
821
			tile_flags |= R300_COLOR_MICROTILE_ENABLE;
739
			tile_flags |= R300_COLOR_MICROTILE_ENABLE;
Line 822... Line 740...
822
 
740
 
823
		tmp = ib_chunk->kdata[idx] & ~(0x7 << 16);
741
		tmp = idx_value & ~(0x7 << 16);
824
		tmp |= tile_flags;
742
		tmp |= tile_flags;
Line 825... Line 743...
825
		ib[idx] = tmp;
743
		ib[idx] = tmp;
826
 
744
 
827
		i = (reg - 0x4E38) >> 2;
745
		i = (reg - 0x4E38) >> 2;
828
		track->cb[i].pitch = ib_chunk->kdata[idx] & 0x3FFE;
746
		track->cb[i].pitch = idx_value & 0x3FFE;
829
		switch (((ib_chunk->kdata[idx] >> 21) & 0xF)) {
747
		switch (((idx_value >> 21) & 0xF)) {
830
		case 9:
748
		case 9:
831
		case 11:
749
		case 11:
832
		case 12:
750
		case 12:
Line 847... Line 765...
847
		case 7:
765
		case 7:
848
			track->cb[i].cpp = 16;
766
			track->cb[i].cpp = 16;
849
			break;
767
			break;
850
		default:
768
		default:
851
			DRM_ERROR("Invalid color buffer format (%d) !\n",
769
			DRM_ERROR("Invalid color buffer format (%d) !\n",
852
				  ((ib_chunk->kdata[idx] >> 21) & 0xF));
770
				  ((idx_value >> 21) & 0xF));
853
			return -EINVAL;
771
			return -EINVAL;
854
		}
772
		}
855
		break;
773
		break;
856
	case 0x4F00:
774
	case 0x4F00:
857
		/* ZB_CNTL */
775
		/* ZB_CNTL */
858
		if (ib_chunk->kdata[idx] & 2) {
776
		if (idx_value & 2) {
859
			track->z_enabled = true;
777
			track->z_enabled = true;
860
		} else {
778
		} else {
861
			track->z_enabled = false;
779
			track->z_enabled = false;
862
		}
780
		}
863
		break;
781
		break;
864
	case 0x4F10:
782
	case 0x4F10:
865
		/* ZB_FORMAT */
783
		/* ZB_FORMAT */
866
		switch ((ib_chunk->kdata[idx] & 0xF)) {
784
		switch ((idx_value & 0xF)) {
867
		case 0:
785
		case 0:
868
		case 1:
786
		case 1:
869
			track->zb.cpp = 2;
787
			track->zb.cpp = 2;
870
			break;
788
			break;
871
		case 2:
789
		case 2:
872
			track->zb.cpp = 4;
790
			track->zb.cpp = 4;
873
			break;
791
			break;
874
		default:
792
		default:
875
			DRM_ERROR("Invalid z buffer format (%d) !\n",
793
			DRM_ERROR("Invalid z buffer format (%d) !\n",
876
				  (ib_chunk->kdata[idx] & 0xF));
794
				  (idx_value & 0xF));
877
			return -EINVAL;
795
			return -EINVAL;
878
		}
796
		}
879
		break;
797
		break;
880
	case 0x4F24:
798
	case 0x4F24:
881
		/* ZB_DEPTHPITCH */
799
		/* ZB_DEPTHPITCH */
Line 890... Line 808...
890
		if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
808
		if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
891
			tile_flags |= R300_DEPTHMACROTILE_ENABLE;
809
			tile_flags |= R300_DEPTHMACROTILE_ENABLE;
892
		if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
810
		if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
893
			tile_flags |= R300_DEPTHMICROTILE_TILED;;
811
			tile_flags |= R300_DEPTHMICROTILE_TILED;;
Line 894... Line 812...
894
 
812
 
895
		tmp = ib_chunk->kdata[idx] & ~(0x7 << 16);
813
		tmp = idx_value & ~(0x7 << 16);
896
		tmp |= tile_flags;
814
		tmp |= tile_flags;
Line 897... Line 815...
897
		ib[idx] = tmp;
815
		ib[idx] = tmp;
898
 
816
 
899
		track->zb.pitch = ib_chunk->kdata[idx] & 0x3FFC;
817
		track->zb.pitch = idx_value & 0x3FFC;
900
		break;
818
		break;
901
	case 0x4104:
819
	case 0x4104:
Line 902... Line 820...
902
		for (i = 0; i < 16; i++) {
820
		for (i = 0; i < 16; i++) {
903
			bool enabled;
821
			bool enabled;
904
 
822
 
905
			enabled = !!(ib_chunk->kdata[idx] & (1 << i));
823
			enabled = !!(idx_value & (1 << i));
906
			track->textures[i].enabled = enabled;
824
			track->textures[i].enabled = enabled;
907
		}
825
		}
Line 922... Line 840...
922
	case 0x44F4:
840
	case 0x44F4:
923
	case 0x44F8:
841
	case 0x44F8:
924
	case 0x44FC:
842
	case 0x44FC:
925
		/* TX_FORMAT1_[0-15] */
843
		/* TX_FORMAT1_[0-15] */
926
		i = (reg - 0x44C0) >> 2;
844
		i = (reg - 0x44C0) >> 2;
927
		tmp = (ib_chunk->kdata[idx] >> 25) & 0x3;
845
		tmp = (idx_value >> 25) & 0x3;
928
		track->textures[i].tex_coord_type = tmp;
846
		track->textures[i].tex_coord_type = tmp;
929
		switch ((ib_chunk->kdata[idx] & 0x1F)) {
847
		switch ((idx_value & 0x1F)) {
930
		case R300_TX_FORMAT_X8:
848
		case R300_TX_FORMAT_X8:
931
		case R300_TX_FORMAT_Y4X4:
849
		case R300_TX_FORMAT_Y4X4:
932
		case R300_TX_FORMAT_Z3Y3X2:
850
		case R300_TX_FORMAT_Z3Y3X2:
933
			track->textures[i].cpp = 1;
851
			track->textures[i].cpp = 1;
934
			break;
852
			break;
Line 964... Line 882...
964
		case R300_TX_FORMAT_FL_R32G32B32A32:
882
		case R300_TX_FORMAT_FL_R32G32B32A32:
965
			track->textures[i].cpp = 16;
883
			track->textures[i].cpp = 16;
966
			break;
884
			break;
967
		default:
885
		default:
968
			DRM_ERROR("Invalid texture format %u\n",
886
			DRM_ERROR("Invalid texture format %u\n",
969
				  (ib_chunk->kdata[idx] & 0x1F));
887
				  (idx_value & 0x1F));
970
			return -EINVAL;
888
			return -EINVAL;
971
			break;
889
			break;
972
		}
890
		}
973
		break;
891
		break;
974
	case 0x4400:
892
	case 0x4400:
Line 987... Line 905...
987
	case 0x4434:
905
	case 0x4434:
988
	case 0x4438:
906
	case 0x4438:
989
	case 0x443C:
907
	case 0x443C:
990
		/* TX_FILTER0_[0-15] */
908
		/* TX_FILTER0_[0-15] */
991
		i = (reg - 0x4400) >> 2;
909
		i = (reg - 0x4400) >> 2;
992
		tmp = ib_chunk->kdata[idx] & 0x7;
910
		tmp = idx_value & 0x7;
993
		if (tmp == 2 || tmp == 4 || tmp == 6) {
911
		if (tmp == 2 || tmp == 4 || tmp == 6) {
994
			track->textures[i].roundup_w = false;
912
			track->textures[i].roundup_w = false;
995
		}
913
		}
996
		tmp = (ib_chunk->kdata[idx] >> 3) & 0x7;
914
		tmp = (idx_value >> 3) & 0x7;
997
		if (tmp == 2 || tmp == 4 || tmp == 6) {
915
		if (tmp == 2 || tmp == 4 || tmp == 6) {
998
			track->textures[i].roundup_h = false;
916
			track->textures[i].roundup_h = false;
999
		}
917
		}
1000
		break;
918
		break;
1001
	case 0x4500:
919
	case 0x4500:
Line 1014... Line 932...
1014
	case 0x4534:
932
	case 0x4534:
1015
	case 0x4538:
933
	case 0x4538:
1016
	case 0x453C:
934
	case 0x453C:
1017
		/* TX_FORMAT2_[0-15] */
935
		/* TX_FORMAT2_[0-15] */
1018
		i = (reg - 0x4500) >> 2;
936
		i = (reg - 0x4500) >> 2;
1019
		tmp = ib_chunk->kdata[idx] & 0x3FFF;
937
		tmp = idx_value & 0x3FFF;
1020
		track->textures[i].pitch = tmp + 1;
938
		track->textures[i].pitch = tmp + 1;
1021
		if (p->rdev->family >= CHIP_RV515) {
939
		if (p->rdev->family >= CHIP_RV515) {
1022
			tmp = ((ib_chunk->kdata[idx] >> 15) & 1) << 11;
940
			tmp = ((idx_value >> 15) & 1) << 11;
1023
			track->textures[i].width_11 = tmp;
941
			track->textures[i].width_11 = tmp;
1024
			tmp = ((ib_chunk->kdata[idx] >> 16) & 1) << 11;
942
			tmp = ((idx_value >> 16) & 1) << 11;
1025
			track->textures[i].height_11 = tmp;
943
			track->textures[i].height_11 = tmp;
1026
		}
944
		}
1027
		break;
945
		break;
1028
	case 0x4480:
946
	case 0x4480:
1029
	case 0x4484:
947
	case 0x4484:
Line 1041... Line 959...
1041
	case 0x44B4:
959
	case 0x44B4:
1042
	case 0x44B8:
960
	case 0x44B8:
1043
	case 0x44BC:
961
	case 0x44BC:
1044
		/* TX_FORMAT0_[0-15] */
962
		/* TX_FORMAT0_[0-15] */
1045
		i = (reg - 0x4480) >> 2;
963
		i = (reg - 0x4480) >> 2;
1046
		tmp = ib_chunk->kdata[idx] & 0x7FF;
964
		tmp = idx_value & 0x7FF;
1047
		track->textures[i].width = tmp + 1;
965
		track->textures[i].width = tmp + 1;
1048
		tmp = (ib_chunk->kdata[idx] >> 11) & 0x7FF;
966
		tmp = (idx_value >> 11) & 0x7FF;
1049
		track->textures[i].height = tmp + 1;
967
		track->textures[i].height = tmp + 1;
1050
		tmp = (ib_chunk->kdata[idx] >> 26) & 0xF;
968
		tmp = (idx_value >> 26) & 0xF;
1051
		track->textures[i].num_levels = tmp;
969
		track->textures[i].num_levels = tmp;
1052
		tmp = ib_chunk->kdata[idx] & (1 << 31);
970
		tmp = idx_value & (1 << 31);
1053
		track->textures[i].use_pitch = !!tmp;
971
		track->textures[i].use_pitch = !!tmp;
1054
		tmp = (ib_chunk->kdata[idx] >> 22) & 0xF;
972
		tmp = (idx_value >> 22) & 0xF;
1055
		track->textures[i].txdepth = tmp;
973
		track->textures[i].txdepth = tmp;
1056
		break;
974
		break;
1057
	case R300_ZB_ZPASS_ADDR:
975
	case R300_ZB_ZPASS_ADDR:
1058
		r = r100_cs_packet_next_reloc(p, &reloc);
976
		r = r100_cs_packet_next_reloc(p, &reloc);
1059
		if (r) {
977
		if (r) {
1060
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
978
			DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1061
					idx, reg);
979
					idx, reg);
1062
			r100_cs_dump_packet(p, pkt);
980
			r100_cs_dump_packet(p, pkt);
1063
			return r;
981
			return r;
1064
		}
982
		}
1065
		ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset);
983
		ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1066
		break;
984
		break;
1067
	case 0x4be8:
985
	case 0x4be8:
1068
		/* valid register only on RV530 */
986
		/* valid register only on RV530 */
1069
		if (p->rdev->family == CHIP_RV530)
987
		if (p->rdev->family == CHIP_RV530)
1070
			break;
988
			break;
Line 1078... Line 996...
1078
}
996
}
Line 1079... Line 997...
1079
 
997
 
1080
static int r300_packet3_check(struct radeon_cs_parser *p,
998
static int r300_packet3_check(struct radeon_cs_parser *p,
1081
			      struct radeon_cs_packet *pkt)
999
			      struct radeon_cs_packet *pkt)
1082
{
-
 
1083
	struct radeon_cs_chunk *ib_chunk;
-
 
1084
 
1000
{
1085
	struct radeon_cs_reloc *reloc;
1001
	struct radeon_cs_reloc *reloc;
1086
	struct r100_cs_track *track;
1002
	struct r100_cs_track *track;
1087
	volatile uint32_t *ib;
1003
	volatile uint32_t *ib;
1088
	unsigned idx;
-
 
1089
	unsigned i, c;
1004
	unsigned idx;
Line 1090... Line 1005...
1090
	int r;
1005
	int r;
1091
 
-
 
1092
	ib = p->ib->ptr;
1006
 
1093
	ib_chunk = &p->chunks[p->chunk_ib_idx];
1007
	ib = p->ib->ptr;
1094
	idx = pkt->idx + 1;
1008
	idx = pkt->idx + 1;
1095
	track = (struct r100_cs_track *)p->track;
1009
	track = (struct r100_cs_track *)p->track;
1096
	switch(pkt->opcode) {
-
 
1097
	case PACKET3_3D_LOAD_VBPNTR:
-
 
1098
		c = ib_chunk->kdata[idx++] & 0x1F;
-
 
1099
		track->num_arrays = c;
1010
	switch(pkt->opcode) {
1100
		for (i = 0; i < (c - 1); i+=2, idx+=3) {
-
 
1101
			r = r100_cs_packet_next_reloc(p, &reloc);
-
 
1102
			if (r) {
-
 
1103
				DRM_ERROR("No reloc for packet3 %d\n",
-
 
1104
					  pkt->opcode);
-
 
1105
				r100_cs_dump_packet(p, pkt);
-
 
1106
				return r;
-
 
1107
			}
-
 
1108
			ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset);
-
 
1109
			track->arrays[i + 0].robj = reloc->robj;
-
 
1110
			track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8;
-
 
1111
			track->arrays[i + 0].esize &= 0x7F;
-
 
1112
			r = r100_cs_packet_next_reloc(p, &reloc);
-
 
1113
			if (r) {
-
 
1114
				DRM_ERROR("No reloc for packet3 %d\n",
-
 
1115
					  pkt->opcode);
-
 
1116
				r100_cs_dump_packet(p, pkt);
-
 
1117
				return r;
-
 
1118
			}
-
 
1119
			ib[idx+2] = ib_chunk->kdata[idx+2] + ((u32)reloc->lobj.gpu_offset);
-
 
1120
			track->arrays[i + 1].robj = reloc->robj;
-
 
1121
			track->arrays[i + 1].esize = ib_chunk->kdata[idx] >> 24;
-
 
1122
			track->arrays[i + 1].esize &= 0x7F;
-
 
1123
		}
-
 
1124
		if (c & 1) {
1011
	case PACKET3_3D_LOAD_VBPNTR:
1125
			r = r100_cs_packet_next_reloc(p, &reloc);
-
 
1126
			if (r) {
-
 
1127
				DRM_ERROR("No reloc for packet3 %d\n",
-
 
1128
					  pkt->opcode);
1012
		r = r100_packet3_load_vbpntr(p, pkt, idx);
1129
				r100_cs_dump_packet(p, pkt);
-
 
1130
				return r;
-
 
1131
			}
-
 
1132
			ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset);
-
 
1133
			track->arrays[i + 0].robj = reloc->robj;
-
 
1134
			track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8;
-
 
1135
			track->arrays[i + 0].esize &= 0x7F;
1013
		if (r)
1136
		}
1014
				return r;
1137
		break;
1015
		break;
1138
	case PACKET3_INDX_BUFFER:
1016
	case PACKET3_INDX_BUFFER:
1139
		r = r100_cs_packet_next_reloc(p, &reloc);
1017
		r = r100_cs_packet_next_reloc(p, &reloc);
1140
		if (r) {
1018
		if (r) {
1141
			DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode);
1019
			DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode);
1142
			r100_cs_dump_packet(p, pkt);
1020
			r100_cs_dump_packet(p, pkt);
1143
			return r;
1021
			return r;
1144
		}
1022
		}
1145
		ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset);
1023
		ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->lobj.gpu_offset);
1146
		r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj);
1024
		r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj);
1147
		if (r) {
1025
		if (r) {
1148
			return r;
1026
			return r;
1149
		}
1027
		}
1150
		break;
1028
		break;
1151
	/* Draw packet */
1029
	/* Draw packet */
1152
	case PACKET3_3D_DRAW_IMMD:
1030
	case PACKET3_3D_DRAW_IMMD:
1153
		/* Number of dwords is vtx_size * (num_vertices - 1)
1031
		/* Number of dwords is vtx_size * (num_vertices - 1)
1154
		 * PRIM_WALK must be equal to 3 vertex data in embedded
1032
		 * PRIM_WALK must be equal to 3 vertex data in embedded
1155
		 * in cmd stream */
1033
		 * in cmd stream */
1156
		if (((ib_chunk->kdata[idx+1] >> 4) & 0x3) != 3) {
1034
		if (((radeon_get_ib_value(p, idx + 1) >> 4) & 0x3) != 3) {
1157
			DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n");
1035
			DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n");
1158
			return -EINVAL;
1036
			return -EINVAL;
1159
		}
1037
		}
1160
		track->vap_vf_cntl = ib_chunk->kdata[idx+1];
1038
		track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1);
1161
		track->immd_dwords = pkt->count - 1;
1039
		track->immd_dwords = pkt->count - 1;
1162
		r = r100_cs_track_check(p->rdev, track);
1040
		r = r100_cs_track_check(p->rdev, track);
1163
		if (r) {
1041
		if (r) {
1164
			return r;
1042
			return r;
1165
		}
1043
		}
1166
		break;
1044
		break;
1167
	case PACKET3_3D_DRAW_IMMD_2:
1045
	case PACKET3_3D_DRAW_IMMD_2:
1168
		/* Number of dwords is vtx_size * (num_vertices - 1)
1046
		/* Number of dwords is vtx_size * (num_vertices - 1)
1169
		 * PRIM_WALK must be equal to 3 vertex data in embedded
1047
		 * PRIM_WALK must be equal to 3 vertex data in embedded
1170
		 * in cmd stream */
1048
		 * in cmd stream */
1171
		if (((ib_chunk->kdata[idx] >> 4) & 0x3) != 3) {
1049
		if (((radeon_get_ib_value(p, idx) >> 4) & 0x3) != 3) {
1172
			DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n");
1050
			DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n");
1173
			return -EINVAL;
1051
			return -EINVAL;
1174
		}
1052
		}
1175
		track->vap_vf_cntl = ib_chunk->kdata[idx];
1053
		track->vap_vf_cntl = radeon_get_ib_value(p, idx);
1176
		track->immd_dwords = pkt->count;
1054
		track->immd_dwords = pkt->count;
1177
		r = r100_cs_track_check(p->rdev, track);
1055
		r = r100_cs_track_check(p->rdev, track);
1178
		if (r) {
1056
		if (r) {
1179
			return r;
1057
			return r;
1180
		}
1058
		}
1181
		break;
1059
		break;
1182
	case PACKET3_3D_DRAW_VBUF:
1060
	case PACKET3_3D_DRAW_VBUF:
1183
		track->vap_vf_cntl = ib_chunk->kdata[idx + 1];
1061
		track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1);
1184
		r = r100_cs_track_check(p->rdev, track);
1062
		r = r100_cs_track_check(p->rdev, track);
1185
		if (r) {
1063
		if (r) {
1186
			return r;
1064
			return r;
1187
		}
1065
		}
1188
		break;
1066
		break;
1189
	case PACKET3_3D_DRAW_VBUF_2:
1067
	case PACKET3_3D_DRAW_VBUF_2:
1190
		track->vap_vf_cntl = ib_chunk->kdata[idx];
1068
		track->vap_vf_cntl = radeon_get_ib_value(p, idx);
1191
		r = r100_cs_track_check(p->rdev, track);
1069
		r = r100_cs_track_check(p->rdev, track);
1192
		if (r) {
1070
		if (r) {
1193
			return r;
1071
			return r;
1194
		}
1072
		}
1195
		break;
1073
		break;
1196
	case PACKET3_3D_DRAW_INDX:
1074
	case PACKET3_3D_DRAW_INDX:
1197
		track->vap_vf_cntl = ib_chunk->kdata[idx + 1];
1075
		track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1);
1198
		r = r100_cs_track_check(p->rdev, track);
1076
		r = r100_cs_track_check(p->rdev, track);
1199
		if (r) {
1077
		if (r) {
1200
			return r;
1078
			return r;
1201
		}
1079
		}
1202
		break;
1080
		break;
1203
	case PACKET3_3D_DRAW_INDX_2:
1081
	case PACKET3_3D_DRAW_INDX_2:
1204
		track->vap_vf_cntl = ib_chunk->kdata[idx];
1082
		track->vap_vf_cntl = radeon_get_ib_value(p, idx);
1205
		r = r100_cs_track_check(p->rdev, track);
1083
		r = r100_cs_track_check(p->rdev, track);
1206
		if (r) {
1084
		if (r) {
1207
			return r;
1085
			return r;
Line 1260... Line 1138...
1260
{
1138
{
1261
	rdev->config.r300.reg_safe_bm = r300_reg_safe_bm;
1139
	rdev->config.r300.reg_safe_bm = r300_reg_safe_bm;
1262
	rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r300_reg_safe_bm);
1140
	rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r300_reg_safe_bm);
1263
}
1141
}
Line 1264... Line -...
1264
 
-
 
1265
int r300_init(struct radeon_device *rdev)
-
 
1266
{
-
 
1267
	r300_set_reg_safe(rdev);
-
 
1268
	return 0;
-
 
1269
}
-
 
1270
 
1142
 
1271
void r300_mc_program(struct radeon_device *rdev)
1143
void r300_mc_program(struct radeon_device *rdev)
1272
{
1144
{
1273
	struct r100_mc_save save;
1145
	struct r100_mc_save save;
Line 1299... Line 1171...
1299
	WREG32(R_000148_MC_FB_LOCATION,
1171
	WREG32(R_000148_MC_FB_LOCATION,
1300
		S_000148_MC_FB_START(rdev->mc.vram_start >> 16) |
1172
		S_000148_MC_FB_START(rdev->mc.vram_start >> 16) |
1301
		S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16));
1173
		S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16));
1302
	r100_mc_resume(rdev, &save);
1174
	r100_mc_resume(rdev, &save);
1303
}
1175
}
-
 
1176
 
-
 
1177
void r300_clock_startup(struct radeon_device *rdev)
-
 
1178
{
-
 
1179
	u32 tmp;
-
 
1180
 
-
 
1181
	if (radeon_dynclks != -1 && radeon_dynclks)
-
 
1182
		radeon_legacy_set_clock_gating(rdev, 1);
-
 
1183
	/* We need to force on some of the block */
-
 
1184
	tmp = RREG32_PLL(R_00000D_SCLK_CNTL);
-
 
1185
	tmp |= S_00000D_FORCE_CP(1) | S_00000D_FORCE_VIP(1);
-
 
1186
	if ((rdev->family == CHIP_RV350) || (rdev->family == CHIP_RV380))
-
 
1187
		tmp |= S_00000D_FORCE_VAP(1);
-
 
1188
	WREG32_PLL(R_00000D_SCLK_CNTL, tmp);
-
 
1189
}
-
 
1190
 
-
 
1191
static int r300_startup(struct radeon_device *rdev)
-
 
1192
{
-
 
1193
	int r;
-
 
1194
 
-
 
1195
	r300_mc_program(rdev);
-
 
1196
	/* Resume clock */
-
 
1197
	r300_clock_startup(rdev);
-
 
1198
	/* Initialize GPU configuration (# pipes, ...) */
-
 
1199
	r300_gpu_init(rdev);
-
 
1200
	/* Initialize GART (initialize after TTM so we can allocate
-
 
1201
	 * memory through TTM but finalize after TTM) */
-
 
1202
	if (rdev->flags & RADEON_IS_PCIE) {
-
 
1203
		r = rv370_pcie_gart_enable(rdev);
-
 
1204
		if (r)
-
 
1205
			return r;
-
 
1206
	}
-
 
1207
	if (rdev->flags & RADEON_IS_PCI) {
-
 
1208
		r = r100_pci_gart_enable(rdev);
-
 
1209
		if (r)
-
 
1210
			return r;
-
 
1211
	}
-
 
1212
	/* Enable IRQ */
-
 
1213
//	rdev->irq.sw_int = true;
-
 
1214
//	r100_irq_set(rdev);
-
 
1215
	/* 1M ring buffer */
-
 
1216
//   r = r100_cp_init(rdev, 1024 * 1024);
-
 
1217
//   if (r) {
-
 
1218
//       dev_err(rdev->dev, "failled initializing CP (%d).\n", r);
-
 
1219
//       return r;
-
 
1220
//   }
-
 
1221
//   r = r100_wb_init(rdev);
-
 
1222
//   if (r)
-
 
1223
//       dev_err(rdev->dev, "failled initializing WB (%d).\n", r);
-
 
1224
//   r = r100_ib_init(rdev);
-
 
1225
//   if (r) {
-
 
1226
//       dev_err(rdev->dev, "failled initializing IB (%d).\n", r);
-
 
1227
//       return r;
-
 
1228
//   }
-
 
1229
	return 0;
-
 
1230
}
-
 
1231
 
-
 
1232
 
-
 
1233
 
-
 
1234
 
-
 
1235
 
-
 
1236
int r300_init(struct radeon_device *rdev)
-
 
1237
{
-
 
1238
	int r;
-
 
1239
 
-
 
1240
	/* Disable VGA */
-
 
1241
	r100_vga_render_disable(rdev);
-
 
1242
	/* Initialize scratch registers */
-
 
1243
	radeon_scratch_init(rdev);
-
 
1244
	/* Initialize surface registers */
-
 
1245
	radeon_surface_init(rdev);
-
 
1246
	/* TODO: disable VGA need to use VGA request */
-
 
1247
	/* BIOS*/
-
 
1248
	if (!radeon_get_bios(rdev)) {
-
 
1249
		if (ASIC_IS_AVIVO(rdev))
-
 
1250
			return -EINVAL;
-
 
1251
	}
-
 
1252
	if (rdev->is_atom_bios) {
-
 
1253
		dev_err(rdev->dev, "Expecting combios for RS400/RS480 GPU\n");
-
 
1254
		return -EINVAL;
-
 
1255
	} else {
-
 
1256
		r = radeon_combios_init(rdev);
-
 
1257
		if (r)
-
 
1258
			return r;
-
 
1259
	}
-
 
1260
	/* Reset gpu before posting otherwise ATOM will enter infinite loop */
-
 
1261
	if (radeon_gpu_reset(rdev)) {
-
 
1262
		dev_warn(rdev->dev,
-
 
1263
			"GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n",
-
 
1264
			RREG32(R_000E40_RBBM_STATUS),
-
 
1265
			RREG32(R_0007C0_CP_STAT));
-
 
1266
	}
-
 
1267
	/* check if cards are posted or not */
-
 
1268
	if (!radeon_card_posted(rdev) && rdev->bios) {
-
 
1269
		DRM_INFO("GPU not posted. posting now...\n");
-
 
1270
		radeon_combios_asic_init(rdev->ddev);
-
 
1271
	}
-
 
1272
	/* Set asic errata */
-
 
1273
	r300_errata(rdev);
-
 
1274
	/* Initialize clocks */
-
 
1275
	radeon_get_clock_info(rdev->ddev);
-
 
1276
	/* Get vram informations */
-
 
1277
	r300_vram_info(rdev);
-
 
1278
	/* Initialize memory controller (also test AGP) */
-
 
1279
	r = r420_mc_init(rdev);
-
 
1280
	if (r)
-
 
1281
		return r;
-
 
1282
	/* Fence driver */
-
 
1283
//	r = radeon_fence_driver_init(rdev);
-
 
1284
//	if (r)
-
 
1285
//		return r;
-
 
1286
//	r = radeon_irq_kms_init(rdev);
-
 
1287
//	if (r)
-
 
1288
//		return r;
-
 
1289
	/* Memory manager */
-
 
1290
	r = radeon_object_init(rdev);
-
 
1291
	if (r)
-
 
1292
		return r;
-
 
1293
	if (rdev->flags & RADEON_IS_PCIE) {
-
 
1294
		r = rv370_pcie_gart_init(rdev);
-
 
1295
		if (r)
-
 
1296
			return r;
-
 
1297
	}
-
 
1298
	if (rdev->flags & RADEON_IS_PCI) {
-
 
1299
		r = r100_pci_gart_init(rdev);
-
 
1300
		if (r)
-
 
1301
			return r;
-
 
1302
	}
-
 
1303
	r300_set_reg_safe(rdev);
-
 
1304
	rdev->accel_working = true;
-
 
1305
	r = r300_startup(rdev);
-
 
1306
	if (r) {
-
 
1307
		/* Somethings want wront with the accel init stop accel */
-
 
1308
		dev_err(rdev->dev, "Disabling GPU acceleration\n");
-
 
1309
//		r300_suspend(rdev);
-
 
1310
//		r100_cp_fini(rdev);
-
 
1311
//		r100_wb_fini(rdev);
-
 
1312
//		r100_ib_fini(rdev);
-
 
1313
		if (rdev->flags & RADEON_IS_PCIE)
-
 
1314
			rv370_pcie_gart_fini(rdev);
-
 
1315
		if (rdev->flags & RADEON_IS_PCI)
-
 
1316
			r100_pci_gart_fini(rdev);
-
 
1317
//       radeon_irq_kms_fini(rdev);
-
 
1318
		rdev->accel_working = false;
-
 
1319
	}
-
 
1320
	return 0;
-
 
1321
}