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 20... Line 20...
20
 * OTHER DEALINGS IN THE SOFTWARE.
20
 * OTHER DEALINGS IN THE SOFTWARE.
21
 *
21
 *
22
 * Authors: Alex Deucher
22
 * Authors: Alex Deucher
23
 */
23
 */
24
#include 
24
#include 
25
//#include 
-
 
26
#include 
25
#include 
27
#include 
26
#include 
28
#include 
27
#include 
29
#include "radeon.h"
28
#include "radeon.h"
30
#include "radeon_asic.h"
29
#include "radeon_asic.h"
31
#include 
30
#include 
32
#include "nid.h"
31
#include "nid.h"
33
#include "atom.h"
32
#include "atom.h"
34
#include "ni_reg.h"
33
#include "ni_reg.h"
35
#include "cayman_blit_shaders.h"
34
#include "cayman_blit_shaders.h"
-
 
35
#include "radeon_ucode.h"
-
 
36
#include "clearstate_cayman.h"
-
 
37
 
-
 
38
static const u32 tn_rlc_save_restore_register_list[] =
-
 
39
{
-
 
40
	0x98fc,
-
 
41
	0x98f0,
-
 
42
	0x9834,
-
 
43
	0x9838,
-
 
44
	0x9870,
-
 
45
	0x9874,
-
 
46
	0x8a14,
-
 
47
	0x8b24,
-
 
48
	0x8bcc,
-
 
49
	0x8b10,
-
 
50
	0x8c30,
-
 
51
	0x8d00,
-
 
52
	0x8d04,
-
 
53
	0x8c00,
-
 
54
	0x8c04,
-
 
55
	0x8c10,
-
 
56
	0x8c14,
-
 
57
	0x8d8c,
-
 
58
	0x8cf0,
-
 
59
	0x8e38,
-
 
60
	0x9508,
-
 
61
	0x9688,
-
 
62
	0x9608,
-
 
63
	0x960c,
-
 
64
	0x9610,
-
 
65
	0x9614,
-
 
66
	0x88c4,
-
 
67
	0x8978,
-
 
68
	0x88d4,
-
 
69
	0x900c,
-
 
70
	0x9100,
-
 
71
	0x913c,
-
 
72
	0x90e8,
-
 
73
	0x9354,
-
 
74
	0xa008,
-
 
75
	0x98f8,
-
 
76
	0x9148,
-
 
77
	0x914c,
-
 
78
	0x3f94,
-
 
79
	0x98f4,
-
 
80
	0x9b7c,
-
 
81
	0x3f8c,
-
 
82
	0x8950,
-
 
83
	0x8954,
-
 
84
	0x8a18,
-
 
85
	0x8b28,
-
 
86
	0x9144,
-
 
87
	0x3f90,
-
 
88
	0x915c,
-
 
89
	0x9160,
-
 
90
	0x9178,
-
 
91
	0x917c,
-
 
92
	0x9180,
-
 
93
	0x918c,
-
 
94
	0x9190,
-
 
95
	0x9194,
-
 
96
	0x9198,
-
 
97
	0x919c,
-
 
98
	0x91a8,
-
 
99
	0x91ac,
-
 
100
	0x91b0,
-
 
101
	0x91b4,
-
 
102
	0x91b8,
-
 
103
	0x91c4,
-
 
104
	0x91c8,
-
 
105
	0x91cc,
-
 
106
	0x91d0,
-
 
107
	0x91d4,
-
 
108
	0x91e0,
-
 
109
	0x91e4,
-
 
110
	0x91ec,
-
 
111
	0x91f0,
-
 
112
	0x91f4,
-
 
113
	0x9200,
-
 
114
	0x9204,
-
 
115
	0x929c,
-
 
116
	0x8030,
-
 
117
	0x9150,
-
 
118
	0x9a60,
-
 
119
	0x920c,
-
 
120
	0x9210,
-
 
121
	0x9228,
-
 
122
	0x922c,
-
 
123
	0x9244,
-
 
124
	0x9248,
-
 
125
	0x91e8,
-
 
126
	0x9294,
-
 
127
	0x9208,
-
 
128
	0x9224,
-
 
129
	0x9240,
-
 
130
	0x9220,
-
 
131
	0x923c,
-
 
132
	0x9258,
-
 
133
	0x9744,
-
 
134
	0xa200,
-
 
135
	0xa204,
-
 
136
	0xa208,
-
 
137
	0xa20c,
-
 
138
	0x8d58,
-
 
139
	0x9030,
-
 
140
	0x9034,
-
 
141
	0x9038,
-
 
142
	0x903c,
-
 
143
	0x9040,
-
 
144
	0x9654,
-
 
145
	0x897c,
-
 
146
	0xa210,
-
 
147
	0xa214,
-
 
148
	0x9868,
-
 
149
	0xa02c,
-
 
150
	0x9664,
-
 
151
	0x9698,
-
 
152
	0x949c,
-
 
153
	0x8e10,
-
 
154
	0x8e18,
-
 
155
	0x8c50,
-
 
156
	0x8c58,
-
 
157
	0x8c60,
-
 
158
	0x8c68,
-
 
159
	0x89b4,
-
 
160
	0x9830,
-
 
161
	0x802c,
-
 
162
};
Line 36... Line 163...
36
 
163
 
37
extern bool evergreen_is_display_hung(struct radeon_device *rdev);
164
extern bool evergreen_is_display_hung(struct radeon_device *rdev);
38
extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
165
extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
39
extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
166
extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
Line 42... Line 169...
42
extern void evergreen_mc_program(struct radeon_device *rdev);
169
extern void evergreen_mc_program(struct radeon_device *rdev);
43
extern void evergreen_irq_suspend(struct radeon_device *rdev);
170
extern void evergreen_irq_suspend(struct radeon_device *rdev);
44
extern int evergreen_mc_init(struct radeon_device *rdev);
171
extern int evergreen_mc_init(struct radeon_device *rdev);
45
extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
172
extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
46
extern void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
173
extern void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
47
extern void si_rlc_fini(struct radeon_device *rdev);
174
extern void evergreen_program_aspm(struct radeon_device *rdev);
48
extern int si_rlc_init(struct radeon_device *rdev);
175
extern void sumo_rlc_fini(struct radeon_device *rdev);
49
 
-
 
50
#define EVERGREEN_PFP_UCODE_SIZE 1120
176
extern int sumo_rlc_init(struct radeon_device *rdev);
51
#define EVERGREEN_PM4_UCODE_SIZE 1376
177
extern void evergreen_gpu_pci_config_reset(struct radeon_device *rdev);
52
#define EVERGREEN_RLC_UCODE_SIZE 768
-
 
53
#define BTC_MC_UCODE_SIZE 6024
-
 
54
 
-
 
55
#define CAYMAN_PFP_UCODE_SIZE 2176
-
 
56
#define CAYMAN_PM4_UCODE_SIZE 2176
-
 
57
#define CAYMAN_RLC_UCODE_SIZE 1024
-
 
58
#define CAYMAN_MC_UCODE_SIZE 6037
-
 
59
 
-
 
60
#define ARUBA_RLC_UCODE_SIZE 1536
-
 
Line 61... Line 178...
61
 
178
 
62
/* Firmware Names */
179
/* Firmware Names */
63
MODULE_FIRMWARE("radeon/BARTS_pfp.bin");
180
MODULE_FIRMWARE("radeon/BARTS_pfp.bin");
64
MODULE_FIRMWARE("radeon/BARTS_me.bin");
181
MODULE_FIRMWARE("radeon/BARTS_me.bin");
-
 
182
MODULE_FIRMWARE("radeon/BARTS_mc.bin");
65
MODULE_FIRMWARE("radeon/BARTS_mc.bin");
183
MODULE_FIRMWARE("radeon/BARTS_smc.bin");
66
MODULE_FIRMWARE("radeon/BTC_rlc.bin");
184
MODULE_FIRMWARE("radeon/BTC_rlc.bin");
67
MODULE_FIRMWARE("radeon/TURKS_pfp.bin");
185
MODULE_FIRMWARE("radeon/TURKS_pfp.bin");
68
MODULE_FIRMWARE("radeon/TURKS_me.bin");
186
MODULE_FIRMWARE("radeon/TURKS_me.bin");
-
 
187
MODULE_FIRMWARE("radeon/TURKS_mc.bin");
69
MODULE_FIRMWARE("radeon/TURKS_mc.bin");
188
MODULE_FIRMWARE("radeon/TURKS_smc.bin");
70
MODULE_FIRMWARE("radeon/CAICOS_pfp.bin");
189
MODULE_FIRMWARE("radeon/CAICOS_pfp.bin");
71
MODULE_FIRMWARE("radeon/CAICOS_me.bin");
190
MODULE_FIRMWARE("radeon/CAICOS_me.bin");
-
 
191
MODULE_FIRMWARE("radeon/CAICOS_mc.bin");
72
MODULE_FIRMWARE("radeon/CAICOS_mc.bin");
192
MODULE_FIRMWARE("radeon/CAICOS_smc.bin");
73
MODULE_FIRMWARE("radeon/CAYMAN_pfp.bin");
193
MODULE_FIRMWARE("radeon/CAYMAN_pfp.bin");
74
MODULE_FIRMWARE("radeon/CAYMAN_me.bin");
194
MODULE_FIRMWARE("radeon/CAYMAN_me.bin");
75
MODULE_FIRMWARE("radeon/CAYMAN_mc.bin");
195
MODULE_FIRMWARE("radeon/CAYMAN_mc.bin");
-
 
196
MODULE_FIRMWARE("radeon/CAYMAN_rlc.bin");
76
MODULE_FIRMWARE("radeon/CAYMAN_rlc.bin");
197
MODULE_FIRMWARE("radeon/CAYMAN_smc.bin");
77
MODULE_FIRMWARE("radeon/ARUBA_pfp.bin");
198
MODULE_FIRMWARE("radeon/ARUBA_pfp.bin");
78
MODULE_FIRMWARE("radeon/ARUBA_me.bin");
199
MODULE_FIRMWARE("radeon/ARUBA_me.bin");
Line 560... Line 681...
560
	return 0;
681
	return 0;
561
}
682
}
Line 562... Line 683...
562
 
683
 
563
int ni_init_microcode(struct radeon_device *rdev)
684
int ni_init_microcode(struct radeon_device *rdev)
564
{
-
 
565
	struct platform_device *pdev;
685
{
566
	const char *chip_name;
686
	const char *chip_name;
567
	const char *rlc_chip_name;
687
	const char *rlc_chip_name;
-
 
688
	size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size;
568
	size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size;
689
	size_t smc_req_size = 0;
569
	char fw_name[30];
690
	char fw_name[30];
Line 570... Line 691...
570
	int err;
691
	int err;
Line 571... Line -...
571
 
-
 
572
	DRM_DEBUG("\n");
-
 
573
 
-
 
574
	pdev = platform_device_register_simple("radeon_cp", 0, NULL, 0);
-
 
575
	err = IS_ERR(pdev);
-
 
576
	if (err) {
-
 
577
		printk(KERN_ERR "radeon_cp: Failed to register firmware\n");
-
 
578
		return -EINVAL;
692
 
579
	}
693
	DRM_DEBUG("\n");
580
 
694
 
581
	switch (rdev->family) {
695
	switch (rdev->family) {
582
	case CHIP_BARTS:
696
	case CHIP_BARTS:
583
		chip_name = "BARTS";
697
		chip_name = "BARTS";
584
		rlc_chip_name = "BTC";
698
		rlc_chip_name = "BTC";
585
		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
699
		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
-
 
700
		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
586
		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
701
		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
587
		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
702
		mc_req_size = BTC_MC_UCODE_SIZE * 4;
588
		mc_req_size = BTC_MC_UCODE_SIZE * 4;
703
		smc_req_size = ALIGN(BARTS_SMC_UCODE_SIZE, 4);
589
		break;
704
		break;
590
	case CHIP_TURKS:
705
	case CHIP_TURKS:
591
		chip_name = "TURKS";
706
		chip_name = "TURKS";
592
		rlc_chip_name = "BTC";
707
		rlc_chip_name = "BTC";
593
		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
708
		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
-
 
709
		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
594
		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
710
		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
595
		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
711
		mc_req_size = BTC_MC_UCODE_SIZE * 4;
596
		mc_req_size = BTC_MC_UCODE_SIZE * 4;
712
		smc_req_size = ALIGN(TURKS_SMC_UCODE_SIZE, 4);
597
		break;
713
		break;
598
	case CHIP_CAICOS:
714
	case CHIP_CAICOS:
599
		chip_name = "CAICOS";
715
		chip_name = "CAICOS";
600
		rlc_chip_name = "BTC";
716
		rlc_chip_name = "BTC";
601
		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
717
		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
-
 
718
		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
602
		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
719
		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
603
		rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
720
		mc_req_size = BTC_MC_UCODE_SIZE * 4;
604
		mc_req_size = BTC_MC_UCODE_SIZE * 4;
721
		smc_req_size = ALIGN(CAICOS_SMC_UCODE_SIZE, 4);
605
		break;
722
		break;
606
	case CHIP_CAYMAN:
723
	case CHIP_CAYMAN:
607
		chip_name = "CAYMAN";
724
		chip_name = "CAYMAN";
608
		rlc_chip_name = "CAYMAN";
725
		rlc_chip_name = "CAYMAN";
609
		pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
726
		pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
-
 
727
		me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
610
		me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
728
		rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4;
611
		rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4;
729
		mc_req_size = CAYMAN_MC_UCODE_SIZE * 4;
612
		mc_req_size = CAYMAN_MC_UCODE_SIZE * 4;
730
		smc_req_size = ALIGN(CAYMAN_SMC_UCODE_SIZE, 4);
613
		break;
731
		break;
614
	case CHIP_ARUBA:
732
	case CHIP_ARUBA:
Line 624... Line 742...
624
	}
742
	}
Line 625... Line 743...
625
 
743
 
Line 626... Line 744...
626
	DRM_INFO("Loading %s Microcode\n", chip_name);
744
	DRM_INFO("Loading %s Microcode\n", chip_name);
627
 
745
 
628
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
746
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
629
	err = request_firmware(&rdev->pfp_fw, fw_name, &pdev->dev);
747
	err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
630
	if (err)
748
	if (err)
631
		goto out;
749
		goto out;
632
	if (rdev->pfp_fw->size != pfp_req_size) {
750
	if (rdev->pfp_fw->size != pfp_req_size) {
Line 636... Line 754...
636
		err = -EINVAL;
754
		err = -EINVAL;
637
		goto out;
755
		goto out;
638
	}
756
	}
Line 639... Line 757...
639
 
757
 
640
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
758
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
641
	err = request_firmware(&rdev->me_fw, fw_name, &pdev->dev);
759
	err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
642
	if (err)
760
	if (err)
643
		goto out;
761
		goto out;
644
	if (rdev->me_fw->size != me_req_size) {
762
	if (rdev->me_fw->size != me_req_size) {
645
		printk(KERN_ERR
763
		printk(KERN_ERR
646
		       "ni_cp: Bogus length %zu in firmware \"%s\"\n",
764
		       "ni_cp: Bogus length %zu in firmware \"%s\"\n",
647
		       rdev->me_fw->size, fw_name);
765
		       rdev->me_fw->size, fw_name);
648
		err = -EINVAL;
766
		err = -EINVAL;
Line 649... Line 767...
649
	}
767
	}
650
 
768
 
651
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
769
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
652
	err = request_firmware(&rdev->rlc_fw, fw_name, &pdev->dev);
770
	err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
653
	if (err)
771
	if (err)
654
		goto out;
772
		goto out;
655
	if (rdev->rlc_fw->size != rlc_req_size) {
773
	if (rdev->rlc_fw->size != rlc_req_size) {
Line 660... Line 778...
660
	}
778
	}
Line 661... Line 779...
661
 
779
 
662
	/* no MC ucode on TN */
780
	/* no MC ucode on TN */
663
	if (!(rdev->flags & RADEON_IS_IGP)) {
781
	if (!(rdev->flags & RADEON_IS_IGP)) {
664
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
782
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
665
	err = request_firmware(&rdev->mc_fw, fw_name, &pdev->dev);
783
		err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
666
	if (err)
784
	if (err)
667
		goto out;
785
		goto out;
668
	if (rdev->mc_fw->size != mc_req_size) {
786
	if (rdev->mc_fw->size != mc_req_size) {
669
		printk(KERN_ERR
787
		printk(KERN_ERR
670
		       "ni_mc: Bogus length %zu in firmware \"%s\"\n",
788
		       "ni_mc: Bogus length %zu in firmware \"%s\"\n",
671
		       rdev->mc_fw->size, fw_name);
789
		       rdev->mc_fw->size, fw_name);
672
		err = -EINVAL;
790
		err = -EINVAL;
673
	}
791
	}
674
	}
-
 
675
out:
-
 
Line -... Line 792...
-
 
792
	}
-
 
793
 
-
 
794
	if ((rdev->family >= CHIP_BARTS) && (rdev->family <= CHIP_CAYMAN)) {
-
 
795
		snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
-
 
796
		err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
-
 
797
		if (err) {
-
 
798
			printk(KERN_ERR
-
 
799
			       "smc: error loading firmware \"%s\"\n",
-
 
800
			       fw_name);
-
 
801
			release_firmware(rdev->smc_fw);
-
 
802
			rdev->smc_fw = NULL;
-
 
803
			err = 0;
-
 
804
		} else if (rdev->smc_fw->size != smc_req_size) {
-
 
805
			printk(KERN_ERR
-
 
806
			       "ni_mc: Bogus length %zu in firmware \"%s\"\n",
-
 
807
			       rdev->mc_fw->size, fw_name);
-
 
808
			err = -EINVAL;
-
 
809
		}
-
 
810
	}
676
	platform_device_unregister(pdev);
811
 
677
 
812
out:
678
	if (err) {
813
	if (err) {
679
		if (err != -EINVAL)
814
		if (err != -EINVAL)
680
			printk(KERN_ERR
815
			printk(KERN_ERR
Line 690... Line 825...
690
		rdev->mc_fw = NULL;
825
		rdev->mc_fw = NULL;
691
	}
826
	}
692
	return err;
827
	return err;
693
}
828
}
Line -... Line 829...
-
 
829
 
-
 
830
int tn_get_temp(struct radeon_device *rdev)
-
 
831
{
-
 
832
	u32 temp = RREG32_SMC(TN_CURRENT_GNB_TEMP) & 0x7ff;
-
 
833
	int actual_temp = (temp / 8) - 49;
-
 
834
 
-
 
835
	return actual_temp * 1000;
-
 
836
}
694
 
837
 
695
/*
838
/*
696
 * Core functions
839
 * Core functions
697
 */
840
 */
698
static void cayman_gpu_init(struct radeon_device *rdev)
841
static void cayman_gpu_init(struct radeon_device *rdev)
Line 751... Line 894...
751
		    (rdev->pdev->device == 0x9917) ||
894
		    (rdev->pdev->device == 0x9917) ||
752
		    (rdev->pdev->device == 0x9999) ||
895
		    (rdev->pdev->device == 0x9999) ||
753
		    (rdev->pdev->device == 0x999C)) {
896
		    (rdev->pdev->device == 0x999C)) {
754
			rdev->config.cayman.max_simds_per_se = 6;
897
			rdev->config.cayman.max_simds_per_se = 6;
755
			rdev->config.cayman.max_backends_per_se = 2;
898
			rdev->config.cayman.max_backends_per_se = 2;
-
 
899
			rdev->config.cayman.max_hw_contexts = 8;
-
 
900
			rdev->config.cayman.sx_max_export_size = 256;
-
 
901
			rdev->config.cayman.sx_max_export_pos_size = 64;
-
 
902
			rdev->config.cayman.sx_max_export_smx_size = 192;
756
		} else if ((rdev->pdev->device == 0x9903) ||
903
		} else if ((rdev->pdev->device == 0x9903) ||
757
			   (rdev->pdev->device == 0x9904) ||
904
			   (rdev->pdev->device == 0x9904) ||
758
			   (rdev->pdev->device == 0x990A) ||
905
			   (rdev->pdev->device == 0x990A) ||
759
			   (rdev->pdev->device == 0x990D) ||
906
			   (rdev->pdev->device == 0x990D) ||
760
			   (rdev->pdev->device == 0x990E) ||
907
			   (rdev->pdev->device == 0x990E) ||
761
			   (rdev->pdev->device == 0x9913) ||
908
			   (rdev->pdev->device == 0x9913) ||
762
			   (rdev->pdev->device == 0x9918) ||
909
			   (rdev->pdev->device == 0x9918) ||
763
			   (rdev->pdev->device == 0x999D)) {
910
			   (rdev->pdev->device == 0x999D)) {
764
			rdev->config.cayman.max_simds_per_se = 4;
911
			rdev->config.cayman.max_simds_per_se = 4;
765
			rdev->config.cayman.max_backends_per_se = 2;
912
			rdev->config.cayman.max_backends_per_se = 2;
-
 
913
			rdev->config.cayman.max_hw_contexts = 8;
-
 
914
			rdev->config.cayman.sx_max_export_size = 256;
-
 
915
			rdev->config.cayman.sx_max_export_pos_size = 64;
-
 
916
			rdev->config.cayman.sx_max_export_smx_size = 192;
766
		} else if ((rdev->pdev->device == 0x9919) ||
917
		} else if ((rdev->pdev->device == 0x9919) ||
767
			   (rdev->pdev->device == 0x9990) ||
918
			   (rdev->pdev->device == 0x9990) ||
768
			   (rdev->pdev->device == 0x9991) ||
919
			   (rdev->pdev->device == 0x9991) ||
769
			   (rdev->pdev->device == 0x9994) ||
920
			   (rdev->pdev->device == 0x9994) ||
770
			   (rdev->pdev->device == 0x9995) ||
921
			   (rdev->pdev->device == 0x9995) ||
771
			   (rdev->pdev->device == 0x9996) ||
922
			   (rdev->pdev->device == 0x9996) ||
772
			   (rdev->pdev->device == 0x999A) ||
923
			   (rdev->pdev->device == 0x999A) ||
773
			   (rdev->pdev->device == 0x99A0)) {
924
			   (rdev->pdev->device == 0x99A0)) {
774
			rdev->config.cayman.max_simds_per_se = 3;
925
			rdev->config.cayman.max_simds_per_se = 3;
775
			rdev->config.cayman.max_backends_per_se = 1;
926
			rdev->config.cayman.max_backends_per_se = 1;
-
 
927
			rdev->config.cayman.max_hw_contexts = 4;
-
 
928
			rdev->config.cayman.sx_max_export_size = 128;
-
 
929
			rdev->config.cayman.sx_max_export_pos_size = 32;
-
 
930
			rdev->config.cayman.sx_max_export_smx_size = 96;
776
		} else {
931
		} else {
777
			rdev->config.cayman.max_simds_per_se = 2;
932
			rdev->config.cayman.max_simds_per_se = 2;
778
			rdev->config.cayman.max_backends_per_se = 1;
933
			rdev->config.cayman.max_backends_per_se = 1;
-
 
934
			rdev->config.cayman.max_hw_contexts = 4;
-
 
935
			rdev->config.cayman.sx_max_export_size = 128;
-
 
936
			rdev->config.cayman.sx_max_export_pos_size = 32;
-
 
937
			rdev->config.cayman.sx_max_export_smx_size = 96;
779
		}
938
		}
780
		rdev->config.cayman.max_texture_channel_caches = 2;
939
		rdev->config.cayman.max_texture_channel_caches = 2;
781
		rdev->config.cayman.max_gprs = 256;
940
		rdev->config.cayman.max_gprs = 256;
782
		rdev->config.cayman.max_threads = 256;
941
		rdev->config.cayman.max_threads = 256;
783
		rdev->config.cayman.max_gs_threads = 32;
942
		rdev->config.cayman.max_gs_threads = 32;
784
		rdev->config.cayman.max_stack_entries = 512;
943
		rdev->config.cayman.max_stack_entries = 512;
785
		rdev->config.cayman.sx_num_of_sets = 8;
944
		rdev->config.cayman.sx_num_of_sets = 8;
786
		rdev->config.cayman.sx_max_export_size = 256;
-
 
787
		rdev->config.cayman.sx_max_export_pos_size = 64;
-
 
788
		rdev->config.cayman.sx_max_export_smx_size = 192;
-
 
789
		rdev->config.cayman.max_hw_contexts = 8;
-
 
790
		rdev->config.cayman.sq_num_cf_insts = 2;
945
		rdev->config.cayman.sq_num_cf_insts = 2;
Line 791... Line 946...
791
 
946
 
792
		rdev->config.cayman.sc_prim_fifo_size = 0x40;
947
		rdev->config.cayman.sc_prim_fifo_size = 0x40;
793
		rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
948
		rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
Line 900... Line 1055...
900
	if ((disabled_rb_mask & tmp) == tmp) {
1055
	if ((disabled_rb_mask & tmp) == tmp) {
901
		for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
1056
		for (i = 0; i < (rdev->config.cayman.max_backends_per_se * rdev->config.cayman.max_shader_engines); i++)
902
			disabled_rb_mask &= ~(1 << i);
1057
			disabled_rb_mask &= ~(1 << i);
903
	}
1058
	}
Line -... Line 1059...
-
 
1059
 
-
 
1060
	for (i = 0; i < rdev->config.cayman.max_shader_engines; i++) {
-
 
1061
		u32 simd_disable_bitmap;
-
 
1062
 
-
 
1063
		WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
-
 
1064
		WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
-
 
1065
		simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
-
 
1066
		simd_disable_bitmap |= 0xffffffff << rdev->config.cayman.max_simds_per_se;
-
 
1067
		tmp <<= 16;
-
 
1068
		tmp |= simd_disable_bitmap;
-
 
1069
	}
-
 
1070
	rdev->config.cayman.active_simds = hweight32(~tmp);
904
 
1071
 
905
	WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1072
	WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
Line 906... Line 1073...
906
	WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
1073
	WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
907
 
1074
 
Line 1025... Line 1192...
1025
	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1192
	WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
Line 1026... Line 1193...
1026
 
1193
 
Line 1027... Line 1194...
1027
	WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
1194
	WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
-
 
1195
 
-
 
1196
	udelay(50);
-
 
1197
 
-
 
1198
	/* set clockgating golden values on TN */
-
 
1199
	if (rdev->family == CHIP_ARUBA) {
-
 
1200
		tmp = RREG32_CG(CG_CGTT_LOCAL_0);
-
 
1201
		tmp &= ~0x00380000;
-
 
1202
		WREG32_CG(CG_CGTT_LOCAL_0, tmp);
-
 
1203
                tmp = RREG32_CG(CG_CGTT_LOCAL_1);
-
 
1204
		tmp &= ~0x0e000000;
1028
 
1205
		WREG32_CG(CG_CGTT_LOCAL_1, tmp);
Line 1029... Line 1206...
1029
	udelay(50);
1206
	}
1030
}
1207
}
1031
 
1208
 
Line 1050... Line 1227...
1050
		return -EINVAL;
1227
		return -EINVAL;
1051
	}
1228
	}
1052
	r = radeon_gart_table_vram_pin(rdev);
1229
	r = radeon_gart_table_vram_pin(rdev);
1053
	if (r)
1230
	if (r)
1054
		return r;
1231
		return r;
1055
	radeon_gart_restore(rdev);
-
 
1056
	/* Setup TLB control */
1232
	/* Setup TLB control */
1057
	WREG32(MC_VM_MX_L1_TLB_CNTL,
1233
	WREG32(MC_VM_MX_L1_TLB_CNTL,
1058
	       (0xA << 7) |
1234
	       (0xA << 7) |
1059
	       ENABLE_L1_TLB |
1235
	       ENABLE_L1_TLB |
1060
	       ENABLE_L1_FRAGMENT_PROCESSING |
1236
	       ENABLE_L1_FRAGMENT_PROCESSING |
1061
	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1237
	       SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1062
	       ENABLE_ADVANCED_DRIVER_MODEL |
1238
	       ENABLE_ADVANCED_DRIVER_MODEL |
1063
	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1239
	       SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1064
	/* Setup L2 cache */
1240
	/* Setup L2 cache */
1065
	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
1241
	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
-
 
1242
	       ENABLE_L2_FRAGMENT_PROCESSING |
1066
	       ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1243
	       ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1067
	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1244
	       ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1068
	       EFFECTIVE_L2_QUEUE_SIZE(7) |
1245
	       EFFECTIVE_L2_QUEUE_SIZE(7) |
1069
	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
1246
	       CONTEXT1_IDENTITY_ACCESS_MODE(1));
1070
	WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
1247
	WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
1071
	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1248
	WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
-
 
1249
	       BANK_SELECT(6) |
1072
	       L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1250
	       L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1073
	/* setup context0 */
1251
	/* setup context0 */
1074
	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
1252
	WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
1075
	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
1253
	WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
1076
	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
1254
	WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
Line 1091... Line 1269...
1091
	 */
1269
	 */
1092
	for (i = 1; i < 8; i++) {
1270
	for (i = 1; i < 8; i++) {
1093
		WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (i << 2), 0);
1271
		WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (i << 2), 0);
1094
		WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (i << 2), rdev->vm_manager.max_pfn);
1272
		WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (i << 2), rdev->vm_manager.max_pfn);
1095
		WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
1273
		WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
1096
			rdev->gart.table_addr >> 12);
1274
		       rdev->vm_manager.saved_table_addr[i]);
1097
	}
1275
	}
Line 1098... Line 1276...
1098
 
1276
 
1099
	/* enable context1-7 */
1277
	/* enable context1-7 */
1100
	WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
1278
	WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
1101
	       (u32)(rdev->dummy_page.addr >> 12));
1279
	       (u32)(rdev->dummy_page.addr >> 12));
1102
	WREG32(VM_CONTEXT1_CNTL2, 4);
1280
	WREG32(VM_CONTEXT1_CNTL2, 4);
-
 
1281
	WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
1103
	WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
1282
				PAGE_TABLE_BLOCK_SIZE(radeon_vm_block_size - 9) |
1104
				RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1283
				RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1105
				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1284
				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1106
				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1285
				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
1107
				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
1286
				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
Line 1122... Line 1301...
1122
	return 0;
1301
	return 0;
1123
}
1302
}
Line 1124... Line 1303...
1124
 
1303
 
1125
static void cayman_pcie_gart_disable(struct radeon_device *rdev)
1304
static void cayman_pcie_gart_disable(struct radeon_device *rdev)
-
 
1305
{
-
 
1306
	unsigned i;
-
 
1307
 
-
 
1308
	for (i = 1; i < 8; ++i) {
-
 
1309
		rdev->vm_manager.saved_table_addr[i] = RREG32(
-
 
1310
			VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2));
-
 
1311
	}
1126
{
1312
 
1127
	/* Disable all tables */
1313
	/* Disable all tables */
1128
	WREG32(VM_CONTEXT0_CNTL, 0);
1314
	WREG32(VM_CONTEXT0_CNTL, 0);
1129
	WREG32(VM_CONTEXT1_CNTL, 0);
1315
	WREG32(VM_CONTEXT1_CNTL, 0);
1130
	/* Setup TLB control */
1316
	/* Setup TLB control */
Line 1157... Line 1343...
1157
void cayman_fence_ring_emit(struct radeon_device *rdev,
1343
void cayman_fence_ring_emit(struct radeon_device *rdev,
1158
			    struct radeon_fence *fence)
1344
			    struct radeon_fence *fence)
1159
{
1345
{
1160
	struct radeon_ring *ring = &rdev->ring[fence->ring];
1346
	struct radeon_ring *ring = &rdev->ring[fence->ring];
1161
	u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
1347
	u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
-
 
1348
	u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
-
 
1349
		PACKET3_SH_ACTION_ENA;
Line 1162... Line 1350...
1162
 
1350
 
1163
	/* flush read cache over gart for this vmid */
-
 
1164
	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
-
 
1165
	radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
-
 
1166
	radeon_ring_write(ring, 0);
1351
	/* flush read cache over gart for this vmid */
1167
	radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1352
	radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1168
	radeon_ring_write(ring, PACKET3_TC_ACTION_ENA | PACKET3_SH_ACTION_ENA);
1353
	radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
1169
	radeon_ring_write(ring, 0xFFFFFFFF);
1354
	radeon_ring_write(ring, 0xFFFFFFFF);
1170
	radeon_ring_write(ring, 0);
1355
	radeon_ring_write(ring, 0);
1171
	radeon_ring_write(ring, 10); /* poll interval */
1356
	radeon_ring_write(ring, 10); /* poll interval */
1172
	/* EVENT_WRITE_EOP - flush caches, send int */
1357
	/* EVENT_WRITE_EOP - flush caches, send int */
1173
	radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
1358
	radeon_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
1174
	radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
1359
	radeon_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
1175
	radeon_ring_write(ring, addr & 0xffffffff);
1360
	radeon_ring_write(ring, lower_32_bits(addr));
1176
	radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
1361
	radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
1177
	radeon_ring_write(ring, fence->seq);
1362
	radeon_ring_write(ring, fence->seq);
1178
	radeon_ring_write(ring, 0);
1363
	radeon_ring_write(ring, 0);
Line 1179... Line 1364...
1179
}
1364
}
1180
 
1365
 
1181
void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
1366
void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
-
 
1367
{
-
 
1368
	struct radeon_ring *ring = &rdev->ring[ib->ring];
Line 1182... Line 1369...
1182
{
1369
	u32 cp_coher_cntl = PACKET3_FULL_CACHE_ENA | PACKET3_TC_ACTION_ENA |
1183
	struct radeon_ring *ring = &rdev->ring[ib->ring];
1370
		PACKET3_SH_ACTION_ENA;
1184
 
1371
 
Line 1203... Line 1390...
1203
	radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF);
1390
	radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFF);
1204
	radeon_ring_write(ring, ib->length_dw |
1391
	radeon_ring_write(ring, ib->length_dw |
1205
			  (ib->vm ? (ib->vm->id << 24) : 0));
1392
			  (ib->vm ? (ib->vm->id << 24) : 0));
Line 1206... Line 1393...
1206
 
1393
 
1207
	/* flush read cache over gart for this vmid */
-
 
1208
	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
-
 
1209
	radeon_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START) >> 2);
-
 
1210
	radeon_ring_write(ring, ib->vm ? ib->vm->id : 0);
1394
	/* flush read cache over gart for this vmid */
1211
	radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1395
	radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1212
	radeon_ring_write(ring, PACKET3_TC_ACTION_ENA | PACKET3_SH_ACTION_ENA);
1396
	radeon_ring_write(ring, PACKET3_ENGINE_ME | cp_coher_cntl);
1213
	radeon_ring_write(ring, 0xFFFFFFFF);
1397
	radeon_ring_write(ring, 0xFFFFFFFF);
1214
	radeon_ring_write(ring, 0);
1398
	radeon_ring_write(ring, 0);
1215
	radeon_ring_write(ring, 10); /* poll interval */
-
 
1216
}
-
 
1217
 
-
 
1218
void cayman_uvd_semaphore_emit(struct radeon_device *rdev,
-
 
1219
			       struct radeon_ring *ring,
-
 
1220
			       struct radeon_semaphore *semaphore,
-
 
1221
			       bool emit_wait)
-
 
1222
{
-
 
1223
	uint64_t addr = semaphore->gpu_addr;
-
 
1224
 
-
 
1225
	radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_LOW, 0));
-
 
1226
	radeon_ring_write(ring, (addr >> 3) & 0x000FFFFF);
-
 
1227
 
-
 
1228
	radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_HIGH, 0));
-
 
1229
	radeon_ring_write(ring, (addr >> 23) & 0x000FFFFF);
-
 
1230
 
-
 
1231
	radeon_ring_write(ring, PACKET0(UVD_SEMA_CMD, 0));
-
 
1232
	radeon_ring_write(ring, 0x80 | (emit_wait ? 1 : 0));
1399
	radeon_ring_write(ring, ((ib->vm ? ib->vm->id : 0) << 24) | 10); /* poll interval */
Line 1233... Line 1400...
1233
}
1400
}
1234
 
1401
 
1235
static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
1402
static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
1236
{
1403
{
1237
	if (enable)
1404
	if (enable)
-
 
1405
		WREG32(CP_ME_CNTL, 0);
1238
		WREG32(CP_ME_CNTL, 0);
1406
	else {
1239
	else {
1407
		if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
1240
		radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1408
		radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1241
		WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1409
		WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1242
		WREG32(SCRATCH_UMSK, 0);
1410
		WREG32(SCRATCH_UMSK, 0);
1243
		rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
1411
		rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
Line -... Line 1412...
-
 
1412
	}
-
 
1413
}
-
 
1414
 
-
 
1415
u32 cayman_gfx_get_rptr(struct radeon_device *rdev,
-
 
1416
			struct radeon_ring *ring)
-
 
1417
{
-
 
1418
	u32 rptr;
-
 
1419
 
-
 
1420
	if (rdev->wb.enabled)
-
 
1421
		rptr = rdev->wb.wb[ring->rptr_offs/4];
-
 
1422
	else {
-
 
1423
		if (ring->idx == RADEON_RING_TYPE_GFX_INDEX)
-
 
1424
			rptr = RREG32(CP_RB0_RPTR);
-
 
1425
		else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX)
-
 
1426
			rptr = RREG32(CP_RB1_RPTR);
-
 
1427
		else
-
 
1428
			rptr = RREG32(CP_RB2_RPTR);
-
 
1429
	}
-
 
1430
 
-
 
1431
	return rptr;
-
 
1432
}
-
 
1433
 
-
 
1434
u32 cayman_gfx_get_wptr(struct radeon_device *rdev,
-
 
1435
			struct radeon_ring *ring)
-
 
1436
{
-
 
1437
	u32 wptr;
-
 
1438
 
-
 
1439
	if (ring->idx == RADEON_RING_TYPE_GFX_INDEX)
-
 
1440
		wptr = RREG32(CP_RB0_WPTR);
-
 
1441
	else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX)
-
 
1442
		wptr = RREG32(CP_RB1_WPTR);
-
 
1443
	else
-
 
1444
		wptr = RREG32(CP_RB2_WPTR);
-
 
1445
 
-
 
1446
	return wptr;
-
 
1447
}
-
 
1448
 
-
 
1449
void cayman_gfx_set_wptr(struct radeon_device *rdev,
-
 
1450
			 struct radeon_ring *ring)
-
 
1451
{
-
 
1452
	if (ring->idx == RADEON_RING_TYPE_GFX_INDEX) {
-
 
1453
		WREG32(CP_RB0_WPTR, ring->wptr);
-
 
1454
		(void)RREG32(CP_RB0_WPTR);
-
 
1455
	} else if (ring->idx == CAYMAN_RING_TYPE_CP1_INDEX) {
-
 
1456
		WREG32(CP_RB1_WPTR, ring->wptr);
-
 
1457
		(void)RREG32(CP_RB1_WPTR);
-
 
1458
	} else {
-
 
1459
		WREG32(CP_RB2_WPTR, ring->wptr);
-
 
1460
		(void)RREG32(CP_RB2_WPTR);
1244
	}
1461
	}
1245
}
1462
}
1246
 
1463
 
1247
static int cayman_cp_load_microcode(struct radeon_device *rdev)
1464
static int cayman_cp_load_microcode(struct radeon_device *rdev)
Line 1286... Line 1503...
1286
	radeon_ring_write(ring, 0x0);
1503
	radeon_ring_write(ring, 0x0);
1287
	radeon_ring_write(ring, rdev->config.cayman.max_hw_contexts - 1);
1504
	radeon_ring_write(ring, rdev->config.cayman.max_hw_contexts - 1);
1288
	radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
1505
	radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
1289
	radeon_ring_write(ring, 0);
1506
	radeon_ring_write(ring, 0);
1290
	radeon_ring_write(ring, 0);
1507
	radeon_ring_write(ring, 0);
1291
	radeon_ring_unlock_commit(rdev, ring);
1508
	radeon_ring_unlock_commit(rdev, ring, false);
Line 1292... Line 1509...
1292
 
1509
 
Line 1293... Line 1510...
1293
	cayman_cp_enable(rdev, true);
1510
	cayman_cp_enable(rdev, true);
1294
 
1511
 
Line 1328... Line 1545...
1328
	radeon_ring_write(ring, 0xc0026900);
1545
	radeon_ring_write(ring, 0xc0026900);
1329
	radeon_ring_write(ring, 0x00000316);
1546
	radeon_ring_write(ring, 0x00000316);
1330
	radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
1547
	radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
1331
	radeon_ring_write(ring, 0x00000010); /*  */
1548
	radeon_ring_write(ring, 0x00000010); /*  */
Line 1332... Line 1549...
1332
 
1549
 
Line 1333... Line 1550...
1333
	radeon_ring_unlock_commit(rdev, ring);
1550
	radeon_ring_unlock_commit(rdev, ring, false);
Line 1334... Line 1551...
1334
 
1551
 
1335
	/* XXX init other rings */
1552
	/* XXX init other rings */
Line 1363... Line 1580...
1363
	static const unsigned cp_rb_base[] = {
1580
	static const unsigned cp_rb_base[] = {
1364
		CP_RB0_BASE,
1581
		CP_RB0_BASE,
1365
		CP_RB1_BASE,
1582
		CP_RB1_BASE,
1366
		CP_RB2_BASE
1583
		CP_RB2_BASE
1367
	};
1584
	};
-
 
1585
	static const unsigned cp_rb_rptr[] = {
-
 
1586
		CP_RB0_RPTR,
-
 
1587
		CP_RB1_RPTR,
-
 
1588
		CP_RB2_RPTR
-
 
1589
	};
-
 
1590
	static const unsigned cp_rb_wptr[] = {
-
 
1591
		CP_RB0_WPTR,
-
 
1592
		CP_RB1_WPTR,
-
 
1593
		CP_RB2_WPTR
-
 
1594
	};
1368
	struct radeon_ring *ring;
1595
	struct radeon_ring *ring;
1369
	int i, r;
1596
	int i, r;
Line 1370... Line 1597...
1370
 
1597
 
1371
	/* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
1598
	/* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
Line 1396... Line 1623...
1396
		uint32_t rb_cntl;
1623
		uint32_t rb_cntl;
1397
		uint64_t addr;
1624
		uint64_t addr;
Line 1398... Line 1625...
1398
 
1625
 
1399
	/* Set ring buffer size */
1626
	/* Set ring buffer size */
1400
		ring = &rdev->ring[ridx[i]];
1627
		ring = &rdev->ring[ridx[i]];
1401
		rb_cntl = drm_order(ring->ring_size / 8);
1628
		rb_cntl = order_base_2(ring->ring_size / 8);
1402
		rb_cntl |= drm_order(RADEON_GPU_PAGE_SIZE/8) << 8;
1629
		rb_cntl |= order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8;
1403
#ifdef __BIG_ENDIAN
1630
#ifdef __BIG_ENDIAN
1404
		rb_cntl |= BUF_SWAP_32BIT;
1631
		rb_cntl |= BUF_SWAP_32BIT;
1405
#endif
1632
#endif
Line 1420... Line 1647...
1420
	for (i = 0; i < 3; ++i) {
1647
	for (i = 0; i < 3; ++i) {
1421
	/* Initialize the ring buffer's read and write pointers */
1648
	/* Initialize the ring buffer's read and write pointers */
1422
		ring = &rdev->ring[ridx[i]];
1649
		ring = &rdev->ring[ridx[i]];
1423
		WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA);
1650
		WREG32_P(cp_rb_cntl[i], RB_RPTR_WR_ENA, ~RB_RPTR_WR_ENA);
Line 1424... Line 1651...
1424
 
1651
 
1425
		ring->rptr = ring->wptr = 0;
1652
		ring->wptr = 0;
1426
		WREG32(ring->rptr_reg, ring->rptr);
1653
		WREG32(cp_rb_rptr[i], 0);
Line 1427... Line 1654...
1427
		WREG32(ring->wptr_reg, ring->wptr);
1654
		WREG32(cp_rb_wptr[i], ring->wptr);
1428
 
1655
 
1429
	mdelay(1);
1656
	mdelay(1);
Line 1442... Line 1669...
1442
		rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1669
		rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
1443
		rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1670
		rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
1444
		return r;
1671
		return r;
1445
	}
1672
	}
Line 1446... Line -...
1446
 
-
 
1447
	return 0;
-
 
1448
}
-
 
1449
 
-
 
1450
/*
-
 
1451
 * DMA
-
 
1452
 * Starting with R600, the GPU has an asynchronous
-
 
1453
 * DMA engine.  The programming model is very similar
-
 
1454
 * to the 3D engine (ring buffer, IBs, etc.), but the
-
 
1455
 * DMA controller has it's own packet format that is
-
 
1456
 * different form the PM4 format used by the 3D engine.
-
 
1457
 * It supports copying data, writing embedded data,
-
 
1458
 * solid fills, and a number of other things.  It also
-
 
1459
 * has support for tiling/detiling of buffers.
-
 
1460
 * Cayman and newer support two asynchronous DMA engines.
-
 
1461
 */
-
 
1462
/**
-
 
1463
 * cayman_dma_ring_ib_execute - Schedule an IB on the DMA engine
-
 
1464
 *
-
 
1465
 * @rdev: radeon_device pointer
-
 
1466
 * @ib: IB object to schedule
-
 
1467
 *
-
 
1468
 * Schedule an IB in the DMA ring (cayman-SI).
-
 
1469
 */
-
 
1470
void cayman_dma_ring_ib_execute(struct radeon_device *rdev,
-
 
1471
				struct radeon_ib *ib)
-
 
1472
{
-
 
1473
	struct radeon_ring *ring = &rdev->ring[ib->ring];
-
 
1474
 
-
 
1475
	if (rdev->wb.enabled) {
-
 
1476
		u32 next_rptr = ring->wptr + 4;
-
 
1477
		while ((next_rptr & 7) != 5)
-
 
1478
			next_rptr++;
-
 
1479
		next_rptr += 3;
-
 
1480
		radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1));
-
 
1481
		radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
-
 
1482
		radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xff);
-
 
1483
		radeon_ring_write(ring, next_rptr);
-
 
1484
	}
-
 
1485
 
-
 
1486
	/* The indirect buffer packet must end on an 8 DW boundary in the DMA ring.
-
 
1487
	 * Pad as necessary with NOPs.
-
 
1488
	 */
-
 
1489
	while ((ring->wptr & 7) != 5)
-
 
1490
		radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
-
 
1491
	radeon_ring_write(ring, DMA_IB_PACKET(DMA_PACKET_INDIRECT_BUFFER, ib->vm ? ib->vm->id : 0, 0));
-
 
1492
	radeon_ring_write(ring, (ib->gpu_addr & 0xFFFFFFE0));
-
 
1493
	radeon_ring_write(ring, (ib->length_dw << 12) | (upper_32_bits(ib->gpu_addr) & 0xFF));
-
 
1494
 
-
 
1495
}
-
 
1496
 
-
 
1497
/**
-
 
1498
 * cayman_dma_stop - stop the async dma engines
-
 
1499
 *
-
 
1500
 * @rdev: radeon_device pointer
-
 
1501
 *
-
 
1502
 * Stop the async dma engines (cayman-SI).
-
 
1503
 */
-
 
1504
void cayman_dma_stop(struct radeon_device *rdev)
-
 
1505
{
-
 
1506
	u32 rb_cntl;
-
 
1507
 
-
 
1508
	radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
-
 
1509
 
-
 
1510
	/* dma0 */
-
 
1511
	rb_cntl = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
-
 
1512
	rb_cntl &= ~DMA_RB_ENABLE;
-
 
1513
	WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, rb_cntl);
-
 
1514
 
-
 
1515
	/* dma1 */
-
 
1516
	rb_cntl = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
-
 
1517
	rb_cntl &= ~DMA_RB_ENABLE;
-
 
1518
	WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, rb_cntl);
-
 
1519
 
-
 
1520
	rdev->ring[R600_RING_TYPE_DMA_INDEX].ready = false;
-
 
1521
	rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX].ready = false;
-
 
1522
}
-
 
1523
 
-
 
1524
/**
-
 
1525
 * cayman_dma_resume - setup and start the async dma engines
-
 
1526
 *
-
 
1527
 * @rdev: radeon_device pointer
-
 
1528
 *
-
 
1529
 * Set up the DMA ring buffers and enable them. (cayman-SI).
-
 
1530
 * Returns 0 for success, error for failure.
-
 
1531
 */
-
 
1532
int cayman_dma_resume(struct radeon_device *rdev)
-
 
1533
{
-
 
1534
	struct radeon_ring *ring;
-
 
1535
	u32 rb_cntl, dma_cntl, ib_cntl;
-
 
1536
	u32 rb_bufsz;
-
 
1537
	u32 reg_offset, wb_offset;
-
 
1538
	int i, r;
-
 
1539
 
-
 
1540
	/* Reset dma */
-
 
1541
	WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA | SOFT_RESET_DMA1);
-
 
1542
	RREG32(SRBM_SOFT_RESET);
-
 
1543
	udelay(50);
-
 
1544
	WREG32(SRBM_SOFT_RESET, 0);
-
 
1545
 
-
 
1546
	for (i = 0; i < 2; i++) {
-
 
1547
		if (i == 0) {
-
 
1548
			ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
-
 
1549
			reg_offset = DMA0_REGISTER_OFFSET;
-
 
1550
			wb_offset = R600_WB_DMA_RPTR_OFFSET;
-
 
1551
		} else {
1673
 
1552
			ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
-
 
1553
			reg_offset = DMA1_REGISTER_OFFSET;
-
 
1554
			wb_offset = CAYMAN_WB_DMA1_RPTR_OFFSET;
-
 
1555
		}
-
 
1556
 
-
 
1557
		WREG32(DMA_SEM_INCOMPLETE_TIMER_CNTL + reg_offset, 0);
-
 
1558
		WREG32(DMA_SEM_WAIT_FAIL_TIMER_CNTL + reg_offset, 0);
-
 
1559
 
-
 
1560
		/* Set ring buffer size in dwords */
-
 
1561
		rb_bufsz = drm_order(ring->ring_size / 4);
-
 
1562
		rb_cntl = rb_bufsz << 1;
-
 
1563
#ifdef __BIG_ENDIAN
-
 
1564
		rb_cntl |= DMA_RB_SWAP_ENABLE | DMA_RPTR_WRITEBACK_SWAP_ENABLE;
-
 
1565
#endif
-
 
1566
		WREG32(DMA_RB_CNTL + reg_offset, rb_cntl);
-
 
1567
 
-
 
1568
		/* Initialize the ring buffer's read and write pointers */
-
 
1569
		WREG32(DMA_RB_RPTR + reg_offset, 0);
-
 
1570
		WREG32(DMA_RB_WPTR + reg_offset, 0);
-
 
1571
 
-
 
1572
		/* set the wb address whether it's enabled or not */
-
 
1573
		WREG32(DMA_RB_RPTR_ADDR_HI + reg_offset,
-
 
1574
		       upper_32_bits(rdev->wb.gpu_addr + wb_offset) & 0xFF);
-
 
1575
		WREG32(DMA_RB_RPTR_ADDR_LO + reg_offset,
-
 
1576
		       ((rdev->wb.gpu_addr + wb_offset) & 0xFFFFFFFC));
-
 
1577
 
-
 
1578
		if (rdev->wb.enabled)
-
 
1579
			rb_cntl |= DMA_RPTR_WRITEBACK_ENABLE;
-
 
1580
 
-
 
1581
		WREG32(DMA_RB_BASE + reg_offset, ring->gpu_addr >> 8);
-
 
1582
 
-
 
1583
		/* enable DMA IBs */
-
 
1584
		ib_cntl = DMA_IB_ENABLE | CMD_VMID_FORCE;
-
 
1585
#ifdef __BIG_ENDIAN
-
 
1586
		ib_cntl |= DMA_IB_SWAP_ENABLE;
-
 
1587
#endif
-
 
1588
		WREG32(DMA_IB_CNTL + reg_offset, ib_cntl);
-
 
1589
 
-
 
1590
		dma_cntl = RREG32(DMA_CNTL + reg_offset);
-
 
1591
		dma_cntl &= ~CTXEMPTY_INT_ENABLE;
-
 
1592
		WREG32(DMA_CNTL + reg_offset, dma_cntl);
-
 
1593
 
-
 
1594
		ring->wptr = 0;
-
 
1595
		WREG32(DMA_RB_WPTR + reg_offset, ring->wptr << 2);
-
 
1596
 
-
 
1597
		ring->rptr = RREG32(DMA_RB_RPTR + reg_offset) >> 2;
-
 
1598
 
-
 
1599
		WREG32(DMA_RB_CNTL + reg_offset, rb_cntl | DMA_RB_ENABLE);
-
 
1600
 
-
 
1601
		ring->ready = true;
-
 
1602
 
-
 
1603
		r = radeon_ring_test(rdev, ring->idx, ring);
-
 
1604
		if (r) {
-
 
1605
			ring->ready = false;
-
 
1606
			return r;
-
 
1607
		}
-
 
1608
	}
-
 
1609
 
1674
	if (rdev->asic->copy.copy_ring_index == RADEON_RING_TYPE_GFX_INDEX)
Line 1610... Line 1675...
1610
	radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
1675
	radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
1611
 
1676
 
Line 1612... Line -...
1612
	return 0;
-
 
1613
}
-
 
1614
 
-
 
1615
/**
-
 
1616
 * cayman_dma_fini - tear down the async dma engines
-
 
1617
 *
-
 
1618
 * @rdev: radeon_device pointer
-
 
1619
 *
-
 
1620
 * Stop the async dma engines and free the rings (cayman-SI).
-
 
1621
 */
-
 
1622
void cayman_dma_fini(struct radeon_device *rdev)
-
 
1623
{
-
 
1624
	cayman_dma_stop(rdev);
-
 
1625
	radeon_ring_fini(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX]);
-
 
1626
	radeon_ring_fini(rdev, &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]);
1677
	return 0;
1627
}
1678
}
1628
 
1679
 
1629
static u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev)
1680
u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev)
Line 1630... Line 1681...
1630
{
1681
{
Line 1847... Line 1898...
1847
 
1898
 
Line 1848... Line 1899...
1848
	cayman_gpu_soft_reset(rdev, reset_mask);
1899
	cayman_gpu_soft_reset(rdev, reset_mask);
Line 1849... Line 1900...
1849
 
1900
 
-
 
1901
	reset_mask = cayman_gpu_check_soft_reset(rdev);
-
 
1902
 
1850
	reset_mask = cayman_gpu_check_soft_reset(rdev);
1903
	if (reset_mask)
Line 1851... Line 1904...
1851
 
1904
		evergreen_gpu_pci_config_reset(rdev);
1852
	if (!reset_mask)
1905
 
Line 1869... Line 1922...
1869
	u32 reset_mask = cayman_gpu_check_soft_reset(rdev);
1922
	u32 reset_mask = cayman_gpu_check_soft_reset(rdev);
Line 1870... Line 1923...
1870
 
1923
 
1871
	if (!(reset_mask & (RADEON_RESET_GFX |
1924
	if (!(reset_mask & (RADEON_RESET_GFX |
1872
					    RADEON_RESET_COMPUTE |
1925
					    RADEON_RESET_COMPUTE |
1873
			    RADEON_RESET_CP))) {
1926
			    RADEON_RESET_CP))) {
1874
		radeon_ring_lockup_update(ring);
-
 
1875
		return false;
-
 
1876
	}
-
 
1877
	/* force CP activities */
-
 
1878
	radeon_ring_force_activity(rdev, ring);
-
 
1879
	return radeon_ring_test_lockup(rdev, ring);
-
 
1880
}
-
 
1881
 
-
 
1882
/**
-
 
1883
 * cayman_dma_is_lockup - Check if the DMA engine is locked up
-
 
1884
 *
-
 
1885
 * @rdev: radeon_device pointer
-
 
1886
 * @ring: radeon_ring structure holding ring information
-
 
1887
 *
-
 
1888
 * Check if the async DMA engine is locked up.
-
 
1889
 * Returns true if the engine appears to be locked up, false if not.
-
 
1890
 */
-
 
1891
bool cayman_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
-
 
1892
{
-
 
1893
	u32 reset_mask = cayman_gpu_check_soft_reset(rdev);
-
 
1894
	u32 mask;
-
 
1895
 
-
 
1896
	if (ring->idx == R600_RING_TYPE_DMA_INDEX)
-
 
1897
		mask = RADEON_RESET_DMA;
-
 
1898
	else
-
 
1899
		mask = RADEON_RESET_DMA1;
-
 
1900
 
-
 
1901
	if (!(reset_mask & mask)) {
-
 
1902
		radeon_ring_lockup_update(ring);
1927
		radeon_ring_lockup_update(rdev, ring);
1903
		return false;
1928
		return false;
1904
	}
-
 
1905
	/* force ring activities */
-
 
1906
	radeon_ring_force_activity(rdev, ring);
1929
	}
1907
	return radeon_ring_test_lockup(rdev, ring);
1930
	return radeon_ring_test_lockup(rdev, ring);
Line 1908... Line 1931...
1908
}
1931
}
1909
 
1932
 
1910
static int cayman_startup(struct radeon_device *rdev)
1933
static int cayman_startup(struct radeon_device *rdev)
1911
{
1934
{
Line 1912... Line 1935...
1912
	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1935
	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1913
	int r;
1936
	int r;
-
 
1937
 
-
 
1938
	/* enable pcie gen2 link */
Line 1914... Line -...
1914
 
-
 
1915
	/* enable pcie gen2 link */
1939
	evergreen_pcie_gen2_enable(rdev);
1916
	evergreen_pcie_gen2_enable(rdev);
-
 
1917
 
-
 
1918
	if (rdev->flags & RADEON_IS_IGP) {
-
 
1919
		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
-
 
1920
			r = ni_init_microcode(rdev);
-
 
1921
			if (r) {
-
 
1922
				DRM_ERROR("Failed to load firmware!\n");
-
 
1923
				return r;
-
 
1924
			}
1940
	/* enable aspm */
1925
		}
1941
	evergreen_program_aspm(rdev);
1926
	} else {
-
 
1927
	if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
1942
 
1928
		r = ni_init_microcode(rdev);
-
 
1929
		if (r) {
-
 
Line -... Line 1943...
-
 
1943
	/* scratch needs to be initialized before MC */
-
 
1944
	r = r600_vram_scratch_init(rdev);
-
 
1945
	if (r)
1930
			DRM_ERROR("Failed to load firmware!\n");
1946
				return r;
1931
			return r;
1947
 
1932
		}
1948
	evergreen_mc_program(rdev);
1933
	}
1949
 
1934
 
1950
	if (!(rdev->flags & RADEON_IS_IGP) && !rdev->pm.dpm_enabled) {
1935
	r = ni_mc_load_microcode(rdev);
1951
	r = ni_mc_load_microcode(rdev);
Line 1936... Line -...
1936
	if (r) {
-
 
1937
		DRM_ERROR("Failed to load MC firmware!\n");
-
 
1938
		return r;
-
 
1939
	}
-
 
1940
	}
-
 
1941
 
1952
	if (r) {
1942
	r = r600_vram_scratch_init(rdev);
1953
		DRM_ERROR("Failed to load MC firmware!\n");
1943
	if (r)
1954
		return r;
1944
		return r;
1955
	}
Line 1945... Line -...
1945
 
-
 
1946
	evergreen_mc_program(rdev);
-
 
1947
	r = cayman_pcie_gart_enable(rdev);
-
 
1948
	if (r)
-
 
1949
		return r;
-
 
1950
	cayman_gpu_init(rdev);
-
 
1951
 
-
 
1952
	r = evergreen_blit_init(rdev);
1956
	}
1953
	if (r) {
1957
 
-
 
1958
	r = cayman_pcie_gart_enable(rdev);
-
 
1959
	if (r)
-
 
1960
		return r;
-
 
1961
	cayman_gpu_init(rdev);
1954
//		r600_blit_fini(rdev);
1962
 
1955
		rdev->asic->copy.copy = NULL;
1963
	/* allocate rlc buffers */
1956
		dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
1964
	if (rdev->flags & RADEON_IS_IGP) {
1957
	}
1965
		rdev->rlc.reg_list = tn_rlc_save_restore_register_list;
1958
 
1966
		rdev->rlc.reg_list_size =
1959
	/* allocate rlc buffers */
1967
			(u32)ARRAY_SIZE(tn_rlc_save_restore_register_list);
Line 2024... Line 2032...
2024
		return r;
2032
		return r;
2025
	}
2033
	}
2026
	evergreen_irq_set(rdev);
2034
	evergreen_irq_set(rdev);
Line 2027... Line 2035...
2027
 
2035
 
2028
	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
-
 
2029
			     CP_RB0_RPTR, CP_RB0_WPTR,
2036
	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
2030
			     0, 0xfffff, RADEON_CP_PACKET2);
2037
			     RADEON_CP_PACKET2);
2031
	if (r)
2038
	if (r)
Line 2032... Line 2039...
2032
		return r;
2039
		return r;
2033
 
2040
 
2034
	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
-
 
2035
	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
-
 
2036
			     DMA_RB_RPTR + DMA0_REGISTER_OFFSET,
2041
	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2037
			     DMA_RB_WPTR + DMA0_REGISTER_OFFSET,
2042
	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
2038
			     2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2043
			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
Line 2039... Line 2044...
2039
	if (r)
2044
	if (r)
2040
		return r;
2045
		return r;
2041
 
-
 
2042
	ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
-
 
2043
	r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
2046
 
2044
			     DMA_RB_RPTR + DMA1_REGISTER_OFFSET,
2047
	ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
2045
			     DMA_RB_WPTR + DMA1_REGISTER_OFFSET,
2048
	r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
Line 2046... Line 2049...
2046
			     2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2049
			     DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2047
	if (r)
2050
	if (r)
Line 2056... Line 2059...
2056
 
2059
 
2057
	r = cayman_dma_resume(rdev);
2060
	r = cayman_dma_resume(rdev);
2058
	if (r)
2061
	if (r)
Line 2059... Line -...
2059
		return r;
-
 
2060
 
-
 
2061
	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
-
 
2062
	if (ring->ring_size) {
-
 
2063
		r = radeon_ring_init(rdev, ring, ring->ring_size,
-
 
2064
				     R600_WB_UVD_RPTR_OFFSET,
-
 
2065
				     UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR,
-
 
2066
				     0, 0xfffff, RADEON_CP_PACKET2);
-
 
2067
		if (!r)
-
 
2068
			r = r600_uvd_init(rdev);
-
 
2069
		if (r)
-
 
Line 2070... Line 2062...
2070
			DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
2062
		return r;
2071
	}
2063
 
2072
 
2064
 
2073
	r = radeon_ib_pool_init(rdev);
2065
	r = radeon_ib_pool_init(rdev);
Line 2143... Line 2135...
2143
	/* Memory manager */
2135
	/* Memory manager */
2144
	r = radeon_bo_init(rdev);
2136
	r = radeon_bo_init(rdev);
2145
	if (r)
2137
	if (r)
2146
		return r;
2138
		return r;
Line -... Line 2139...
-
 
2139
 
-
 
2140
	if (rdev->flags & RADEON_IS_IGP) {
-
 
2141
		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
-
 
2142
			r = ni_init_microcode(rdev);
-
 
2143
			if (r) {
-
 
2144
				DRM_ERROR("Failed to load firmware!\n");
-
 
2145
				return r;
-
 
2146
			}
-
 
2147
		}
-
 
2148
	} else {
-
 
2149
		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
-
 
2150
			r = ni_init_microcode(rdev);
-
 
2151
			if (r) {
-
 
2152
				DRM_ERROR("Failed to load firmware!\n");
-
 
2153
				return r;
-
 
2154
			}
-
 
2155
		}
-
 
2156
	}
-
 
2157
 
-
 
2158
	/* Initialize power management */
-
 
2159
	radeon_pm_init(rdev);
2147
 
2160
 
2148
	ring->ring_obj = NULL;
2161
	ring->ring_obj = NULL;
Line 2149... Line 2162...
2149
	r600_ring_init(rdev, ring, 1024 * 1024);
2162
	r600_ring_init(rdev, ring, 1024 * 1024);
2150
 
2163
 
Line 2211... Line 2224...
2211
 
2224
 
2212
void cayman_vm_fini(struct radeon_device *rdev)
2225
void cayman_vm_fini(struct radeon_device *rdev)
2213
{
2226
{
Line 2214... Line -...
2214
}
-
 
2215
 
-
 
2216
#define R600_ENTRY_VALID   (1 << 0)
-
 
2217
#define R600_PTE_SYSTEM    (1 << 1)
-
 
2218
#define R600_PTE_SNOOPED   (1 << 2)
-
 
2219
#define R600_PTE_READABLE  (1 << 5)
-
 
2220
#define R600_PTE_WRITEABLE (1 << 6)
-
 
2221
 
-
 
2222
uint32_t cayman_vm_page_flags(struct radeon_device *rdev, uint32_t flags)
-
 
2223
{
-
 
2224
	uint32_t r600_flags = 0;
-
 
2225
	r600_flags |= (flags & RADEON_VM_PAGE_VALID) ? R600_ENTRY_VALID : 0;
-
 
2226
	r600_flags |= (flags & RADEON_VM_PAGE_READABLE) ? R600_PTE_READABLE : 0;
-
 
2227
	r600_flags |= (flags & RADEON_VM_PAGE_WRITEABLE) ? R600_PTE_WRITEABLE : 0;
-
 
2228
	if (flags & RADEON_VM_PAGE_SYSTEM) {
-
 
2229
		r600_flags |= R600_PTE_SYSTEM;
-
 
2230
		r600_flags |= (flags & RADEON_VM_PAGE_SNOOPED) ? R600_PTE_SNOOPED : 0;
-
 
2231
	}
-
 
2232
	return r600_flags;
-
 
2233
}
2227
}
2234
 
2228
 
2235
/**
2229
/**
2236
 * cayman_vm_set_page - update the page tables using the CP
2230
 * cayman_vm_decode_fault - print human readable fault info
2237
 *
2231
 *
2238
 * @rdev: radeon_device pointer
-
 
2239
 * @ib: indirect buffer to fill with commands
2232
 * @rdev: radeon_device pointer
2240
 * @pe: addr of the page entry
-
 
2241
 * @addr: dst addr to write into pe
-
 
2242
 * @count: number of page entries to update
-
 
2243
 * @incr: increase next addr by incr bytes
2233
 * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
2244
 * @flags: access flags
2234
 * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
2245
 *
2235
 *
2246
 * Update the page tables using the CP (cayman/TN).
2236
 * Print human readable fault information (cayman/TN).
2247
 */
-
 
2248
void cayman_vm_set_page(struct radeon_device *rdev,
-
 
2249
			struct radeon_ib *ib,
-
 
2250
			uint64_t pe,
2237
 */
2251
			uint64_t addr, unsigned count,
2238
void cayman_vm_decode_fault(struct radeon_device *rdev,
-
 
2239
			    u32 status, u32 addr)
2252
			uint32_t incr, uint32_t flags)
2240
{
2253
{
2241
	u32 mc_id = (status & MEMORY_CLIENT_ID_MASK) >> MEMORY_CLIENT_ID_SHIFT;
2254
	uint32_t r600_flags = cayman_vm_page_flags(rdev, flags);
2242
	u32 vmid = (status & FAULT_VMID_MASK) >> FAULT_VMID_SHIFT;
2255
	uint64_t value;
2243
	u32 protections = (status & PROTECTIONS_MASK) >> PROTECTIONS_SHIFT;
2256
	unsigned ndw;
-
 
2257
 
2244
	char *block;
2258
	if (rdev->asic->vm.pt_ring_index == RADEON_RING_TYPE_GFX_INDEX) {
2245
 
-
 
2246
	switch (mc_id) {
-
 
2247
	case 32:
-
 
2248
	case 16:
-
 
2249
	case 96:
-
 
2250
	case 80:
-
 
2251
	case 160:
2259
	while (count) {
2252
	case 144:
2260
			ndw = 1 + count * 2;
2253
	case 224:
2261
		if (ndw > 0x3FFF)
2254
	case 208:
-
 
2255
		block = "CB";
-
 
2256
		break;
-
 
2257
	case 33:
-
 
2258
	case 17:
-
 
2259
	case 97:
-
 
2260
	case 81:
-
 
2261
	case 161:
-
 
2262
	case 145:
2262
			ndw = 0x3FFF;
2263
	case 225:
2263
 
2264
	case 209:
-
 
2265
		block = "CB_FMASK";
-
 
2266
		break;
-
 
2267
	case 34:
-
 
2268
	case 18:
-
 
2269
	case 98:
-
 
2270
	case 82:
-
 
2271
	case 162:
-
 
2272
	case 146:
2264
			ib->ptr[ib->length_dw++] = PACKET3(PACKET3_ME_WRITE, ndw);
2273
	case 226:
-
 
2274
	case 210:
-
 
2275
		block = "CB_CMASK";
-
 
2276
		break;
-
 
2277
	case 35:
2265
			ib->ptr[ib->length_dw++] = pe;
2278
	case 19:
-
 
2279
	case 99:
-
 
2280
	case 83:
-
 
2281
	case 163:
-
 
2282
	case 147:
2266
			ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
2283
	case 227:
-
 
2284
	case 211:
-
 
2285
		block = "CB_IMMED";
-
 
2286
		break;
-
 
2287
	case 36:
-
 
2288
	case 20:
-
 
2289
	case 100:
-
 
2290
	case 84:
-
 
2291
	case 164:
-
 
2292
	case 148:
2267
		for (; ndw > 1; ndw -= 2, --count, pe += 8) {
2293
	case 228:
-
 
2294
	case 212:
-
 
2295
		block = "DB";
-
 
2296
		break;
2268
			if (flags & RADEON_VM_PAGE_SYSTEM) {
2297
	case 37:
-
 
2298
	case 21:
-
 
2299
	case 101:
-
 
2300
	case 85:
-
 
2301
	case 165:
-
 
2302
	case 149:
2269
				value = radeon_vm_map_gart(rdev, addr);
2303
	case 229:
2270
				value &= 0xFFFFFFFFFFFFF000ULL;
2304
	case 213:
-
 
2305
		block = "DB_HTILE";
-
 
2306
		break;
-
 
2307
	case 38:
-
 
2308
	case 22:
-
 
2309
	case 102:
2271
				} else if (flags & RADEON_VM_PAGE_VALID) {
2310
	case 86:
2272
					value = addr;
2311
	case 166:
2273
				} else {
2312
	case 150:
2274
					value = 0;
2313
	case 230:
-
 
2314
	case 214:
-
 
2315
		block = "SX";
-
 
2316
		break;
-
 
2317
	case 39:
-
 
2318
	case 23:
-
 
2319
	case 103:
-
 
2320
	case 87:
-
 
2321
	case 167:
-
 
2322
	case 151:
2275
				}
2323
	case 231:
2276
				addr += incr;
2324
	case 215:
-
 
2325
		block = "DB_STEN";
-
 
2326
		break;
-
 
2327
	case 40:
-
 
2328
	case 24:
-
 
2329
	case 104:
-
 
2330
	case 88:
-
 
2331
	case 232:
-
 
2332
	case 216:
2277
				value |= r600_flags;
2333
	case 168:
2278
				ib->ptr[ib->length_dw++] = value;
2334
	case 152:
-
 
2335
		block = "TC_TFETCH";
2279
				ib->ptr[ib->length_dw++] = upper_32_bits(value);
2336
		break;
-
 
2337
	case 41:
2280
			}
2338
	case 25:
-
 
2339
	case 105:
-
 
2340
	case 89:
-
 
2341
	case 233:
-
 
2342
	case 217:
2281
		}
2343
	case 169:
-
 
2344
	case 153:
-
 
2345
		block = "TC_VFETCH";
-
 
2346
		break;
2282
	} else {
2347
	case 42:
-
 
2348
	case 26:
2283
		if ((flags & RADEON_VM_PAGE_SYSTEM) ||
2349
	case 106:
2284
		    (count == 1)) {
2350
	case 90:
2285
		while (count) {
2351
	case 234:
-
 
2352
	case 218:
2286
			ndw = count * 2;
2353
	case 170:
2287
			if (ndw > 0xFFFFE)
2354
	case 154:
2288
				ndw = 0xFFFFE;
2355
		block = "VC";
2289
 
2356
		break;
2290
			/* for non-physically contiguous pages (system) */
2357
	case 112:
2291
			ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, ndw);
2358
		block = "CP";
2292
			ib->ptr[ib->length_dw++] = pe;
2359
		break;
2293
			ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
2360
	case 113:
2294
			for (; ndw > 0; ndw -= 2, --count, pe += 8) {
2361
	case 114:
2295
				if (flags & RADEON_VM_PAGE_SYSTEM) {
2362
		block = "SH";
2296
					value = radeon_vm_map_gart(rdev, addr);
2363
		break;
2297
					value &= 0xFFFFFFFFFFFFF000ULL;
2364
	case 115:
2298
			} else if (flags & RADEON_VM_PAGE_VALID) {
2365
		block = "VGT";
2299
				value = addr;
2366
		break;
2300
				} else {
2367
	case 178:
-
 
2368
		block = "IH";
2301
					value = 0;
2369
		break;
-
 
2370
	case 51:
-
 
2371
		block = "RLC";
2302
				}
2372
		break;
-
 
2373
	case 55:
-
 
2374
		block = "DMA";
2303
				addr += incr;
2375
		break;
-
 
2376
	case 56:
-
 
2377
		block = "HDP";
2304
			value |= r600_flags;
2378
		break;
2305
				ib->ptr[ib->length_dw++] = value;
2379
	default:
2306
				ib->ptr[ib->length_dw++] = upper_32_bits(value);
2380
		block = "unknown";
2307
		}
-
 
2308
	}
-
 
2309
		while (ib->length_dw & 0x7)
-
 
2310
			ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0);
-
 
2311
		} else {
-
 
2312
			while (count) {
-
 
2313
				ndw = count * 2;
-
 
Line 2314... Line -...
2314
				if (ndw > 0xFFFFE)
-
 
2315
					ndw = 0xFFFFE;
-
 
2316
 
-
 
2317
				if (flags & RADEON_VM_PAGE_VALID)
-
 
2318
					value = addr;
2381
		break;
2319
				else
-
 
2320
					value = 0;
-
 
2321
				/* for physically contiguous pages (vram) */
-
 
2322
				ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw);
-
 
2323
				ib->ptr[ib->length_dw++] = pe; /* dst addr */
2382
			}
2324
				ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
-
 
2325
				ib->ptr[ib->length_dw++] = r600_flags; /* mask */
-
 
2326
				ib->ptr[ib->length_dw++] = 0;
2383
 
2327
				ib->ptr[ib->length_dw++] = value; /* value */
-
 
2328
				ib->ptr[ib->length_dw++] = upper_32_bits(value);
2384
	printk("VM fault (0x%02x, vmid %d) at page %u, %s from %s (%d)\n",
2329
				ib->ptr[ib->length_dw++] = incr; /* increment size */
-
 
2330
				ib->ptr[ib->length_dw++] = 0;
-
 
2331
				pe += ndw * 4;
-
 
2332
				addr += (ndw / 2) * incr;
-
 
2333
				count -= ndw / 2;
-
 
2334
			}
-
 
2335
		}
-
 
2336
		while (ib->length_dw & 0x7)
2385
	       protections, vmid, addr,
Line 2337... Line 2386...
2337
			ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0);
2386
	       (status & MEMORY_CLIENT_RW_MASK) ? "write" : "read",
2338
	}
2387
	       block, mc_id);
2339
}
2388
}
Line 2366... Line 2415...
2366
 
2415
 
2367
	/* sync PFP to ME, otherwise we might get invalid PFP reads */
2416
	/* sync PFP to ME, otherwise we might get invalid PFP reads */
2368
	radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
2417
	radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
2369
	radeon_ring_write(ring, 0x0);
2418
	radeon_ring_write(ring, 0x0);
2370
}
-
 
2371
 
-
 
2372
void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
-
 
2373
{
-
 
2374
	struct radeon_ring *ring = &rdev->ring[ridx];
-
 
2375
 
-
 
2376
	if (vm == NULL)
-
 
2377
		return;
-
 
2378
 
-
 
2379
	radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
-
 
2380
	radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2));
-
 
2381
	radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
-
 
2382
 
-
 
2383
	/* flush hdp cache */
-
 
2384
	radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
-
 
2385
	radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2));
-
 
2386
	radeon_ring_write(ring, 1);
-
 
2387
 
-
 
2388
	/* bits 0-7 are the VM contexts0-7 */
-
 
2389
	radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
-
 
2390
	radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2));
-
 
2391
	radeon_ring_write(ring, 1 << vm->id);
-
 
2392
}
-