Subversion Repositories Kolibri OS

Rev

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

Rev 3764 Rev 5078
Line 31... Line 31...
31
#include "evergreend.h"
31
#include "evergreend.h"
32
#include "atom.h"
32
#include "atom.h"
33
#include "avivod.h"
33
#include "avivod.h"
34
#include "evergreen_reg.h"
34
#include "evergreen_reg.h"
35
#include "evergreen_blit_shaders.h"
35
#include "evergreen_blit_shaders.h"
36
 
-
 
37
#define EVERGREEN_PFP_UCODE_SIZE 1120
-
 
38
#define EVERGREEN_PM4_UCODE_SIZE 1376
36
#include "radeon_ucode.h"
Line 39... Line 37...
39
 
37
 
40
static const u32 crtc_offsets[6] =
38
static const u32 crtc_offsets[6] =
41
{
39
{
42
	EVERGREEN_CRTC0_REGISTER_OFFSET,
40
	EVERGREEN_CRTC0_REGISTER_OFFSET,
Line 45... Line 43...
45
	EVERGREEN_CRTC3_REGISTER_OFFSET,
43
	EVERGREEN_CRTC3_REGISTER_OFFSET,
46
	EVERGREEN_CRTC4_REGISTER_OFFSET,
44
	EVERGREEN_CRTC4_REGISTER_OFFSET,
47
	EVERGREEN_CRTC5_REGISTER_OFFSET
45
	EVERGREEN_CRTC5_REGISTER_OFFSET
48
};
46
};
Line -... Line 47...
-
 
47
 
-
 
48
#include "clearstate_evergreen.h"
-
 
49
 
-
 
50
static const u32 sumo_rlc_save_restore_register_list[] =
-
 
51
{
-
 
52
	0x98fc,
-
 
53
	0x9830,
-
 
54
	0x9834,
-
 
55
	0x9838,
-
 
56
	0x9870,
-
 
57
	0x9874,
-
 
58
	0x8a14,
-
 
59
	0x8b24,
-
 
60
	0x8bcc,
-
 
61
	0x8b10,
-
 
62
	0x8d00,
-
 
63
	0x8d04,
-
 
64
	0x8c00,
-
 
65
	0x8c04,
-
 
66
	0x8c08,
-
 
67
	0x8c0c,
-
 
68
	0x8d8c,
-
 
69
	0x8c20,
-
 
70
	0x8c24,
-
 
71
	0x8c28,
-
 
72
	0x8c18,
-
 
73
	0x8c1c,
-
 
74
	0x8cf0,
-
 
75
	0x8e2c,
-
 
76
	0x8e38,
-
 
77
	0x8c30,
-
 
78
	0x9508,
-
 
79
	0x9688,
-
 
80
	0x9608,
-
 
81
	0x960c,
-
 
82
	0x9610,
-
 
83
	0x9614,
-
 
84
	0x88c4,
-
 
85
	0x88d4,
-
 
86
	0xa008,
-
 
87
	0x900c,
-
 
88
	0x9100,
-
 
89
	0x913c,
-
 
90
	0x98f8,
-
 
91
	0x98f4,
-
 
92
	0x9b7c,
-
 
93
	0x3f8c,
-
 
94
	0x8950,
-
 
95
	0x8954,
-
 
96
	0x8a18,
-
 
97
	0x8b28,
-
 
98
	0x9144,
-
 
99
	0x9148,
-
 
100
	0x914c,
-
 
101
	0x3f90,
-
 
102
	0x3f94,
-
 
103
	0x915c,
-
 
104
	0x9160,
-
 
105
	0x9178,
-
 
106
	0x917c,
-
 
107
	0x9180,
-
 
108
	0x918c,
-
 
109
	0x9190,
-
 
110
	0x9194,
-
 
111
	0x9198,
-
 
112
	0x919c,
-
 
113
	0x91a8,
-
 
114
	0x91ac,
-
 
115
	0x91b0,
-
 
116
	0x91b4,
-
 
117
	0x91b8,
-
 
118
	0x91c4,
-
 
119
	0x91c8,
-
 
120
	0x91cc,
-
 
121
	0x91d0,
-
 
122
	0x91d4,
-
 
123
	0x91e0,
-
 
124
	0x91e4,
-
 
125
	0x91ec,
-
 
126
	0x91f0,
-
 
127
	0x91f4,
-
 
128
	0x9200,
-
 
129
	0x9204,
-
 
130
	0x929c,
-
 
131
	0x9150,
-
 
132
	0x802c,
-
 
133
};
49
 
134
 
50
static void evergreen_gpu_init(struct radeon_device *rdev);
135
static void evergreen_gpu_init(struct radeon_device *rdev);
51
void evergreen_fini(struct radeon_device *rdev);
136
void evergreen_fini(struct radeon_device *rdev);
-
 
137
void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
52
void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
138
void evergreen_program_aspm(struct radeon_device *rdev);
53
extern void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
139
extern void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
-
 
140
				     int ring, u32 cp_int_cntl);
-
 
141
extern void cayman_vm_decode_fault(struct radeon_device *rdev,
-
 
142
				   u32 status, u32 addr);
-
 
143
void cik_init_cp_pg_table(struct radeon_device *rdev);
-
 
144
 
-
 
145
extern u32 si_get_csb_size(struct radeon_device *rdev);
-
 
146
extern void si_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer);
-
 
147
extern u32 cik_get_csb_size(struct radeon_device *rdev);
-
 
148
extern void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer);
Line 54... Line 149...
54
				     int ring, u32 cp_int_cntl);
149
extern void rv770_set_clk_bypass_mode(struct radeon_device *rdev);
55
 
150
 
56
static const u32 evergreen_golden_registers[] =
151
static const u32 evergreen_golden_registers[] =
57
{
152
{
Line 92... Line 187...
92
	0x8c24, 0xffffffff, 0x00800080,
187
	0x8c24, 0xffffffff, 0x00800080,
93
	0x8c18, 0xffffffff, 0x20202078,
188
	0x8c18, 0xffffffff, 0x20202078,
94
	0x8c1c, 0xffffffff, 0x00001010,
189
	0x8c1c, 0xffffffff, 0x00001010,
95
	0x28350, 0xffffffff, 0x00000000,
190
	0x28350, 0xffffffff, 0x00000000,
96
	0xa008, 0xffffffff, 0x00010000,
191
	0xa008, 0xffffffff, 0x00010000,
97
	0x5cc, 0xffffffff, 0x00000001,
192
	0x5c4, 0xffffffff, 0x00000001,
98
	0x9508, 0xffffffff, 0x00000002,
193
	0x9508, 0xffffffff, 0x00000002,
99
	0x913c, 0x0000000f, 0x0000000a
194
	0x913c, 0x0000000f, 0x0000000a
100
};
195
};
Line 101... Line 196...
101
 
196
 
Line 379... Line 474...
379
	0x8c24, 0xffffffff, 0x00800080,
474
	0x8c24, 0xffffffff, 0x00800080,
380
	0x8c18, 0xffffffff, 0x20202078,
475
	0x8c18, 0xffffffff, 0x20202078,
381
	0x8c1c, 0xffffffff, 0x00001010,
476
	0x8c1c, 0xffffffff, 0x00001010,
382
	0x28350, 0xffffffff, 0x00000000,
477
	0x28350, 0xffffffff, 0x00000000,
383
	0xa008, 0xffffffff, 0x00010000,
478
	0xa008, 0xffffffff, 0x00010000,
384
	0x5cc, 0xffffffff, 0x00000001,
479
	0x5c4, 0xffffffff, 0x00000001,
385
	0x9508, 0xffffffff, 0x00000002
480
	0x9508, 0xffffffff, 0x00000002
386
};
481
};
Line 387... Line 482...
387
 
482
 
388
static const u32 cedar_mgcg_init[] =
483
static const u32 cedar_mgcg_init[] =
Line 538... Line 633...
538
};
633
};
Line 539... Line 634...
539
 
634
 
540
static const u32 supersumo_golden_registers[] =
635
static const u32 supersumo_golden_registers[] =
541
{
636
{
542
	0x5eb4, 0xffffffff, 0x00000002,
637
	0x5eb4, 0xffffffff, 0x00000002,
543
	0x5cc, 0xffffffff, 0x00000001,
638
	0x5c4, 0xffffffff, 0x00000001,
544
	0x7030, 0xffffffff, 0x00000011,
639
	0x7030, 0xffffffff, 0x00000011,
545
	0x7c30, 0xffffffff, 0x00000011,
640
	0x7c30, 0xffffffff, 0x00000011,
546
	0x6104, 0x01000300, 0x00000000,
641
	0x6104, 0x01000300, 0x00000000,
547
	0x5bc0, 0x00300000, 0x00000000,
642
	0x5bc0, 0x00300000, 0x00000000,
Line 622... Line 717...
622
};
717
};
Line 623... Line 718...
623
 
718
 
624
static const u32 wrestler_golden_registers[] =
719
static const u32 wrestler_golden_registers[] =
625
{
720
{
626
	0x5eb4, 0xffffffff, 0x00000002,
721
	0x5eb4, 0xffffffff, 0x00000002,
627
	0x5cc, 0xffffffff, 0x00000001,
722
	0x5c4, 0xffffffff, 0x00000001,
628
	0x7030, 0xffffffff, 0x00000011,
723
	0x7030, 0xffffffff, 0x00000011,
629
	0x7c30, 0xffffffff, 0x00000011,
724
	0x7c30, 0xffffffff, 0x00000011,
630
	0x6104, 0x01000300, 0x00000000,
725
	0x6104, 0x01000300, 0x00000000,
631
	0x5bc0, 0x00300000, 0x00000000,
726
	0x5bc0, 0x00300000, 0x00000000,
Line 1078... Line 1173...
1078
	return 0;
1173
	return 0;
1079
}
1174
}
Line 1080... Line 1175...
1080
 
1175
 
1081
void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev)
1176
void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev)
1082
{
-
 
1083
	u16 ctl, v;
1177
{
1084
	int err;
-
 
1085
 
-
 
1086
	err = pcie_capability_read_word(rdev->pdev, PCI_EXP_DEVCTL, &ctl);
-
 
1087
	if (err)
1178
	int readrq;
1088
		return;
-
 
1089
 
-
 
Line -... Line 1179...
-
 
1179
	u16 v;
-
 
1180
 
1090
	v = (ctl & PCI_EXP_DEVCTL_READRQ) >> 12;
1181
	readrq = pcie_get_readrq(rdev->pdev);
1091
 
1182
	v = ffs(readrq) - 8;
1092
	/* if bios or OS sets MAX_READ_REQUEST_SIZE to an invalid value, fix it
1183
	/* if bios or OS sets MAX_READ_REQUEST_SIZE to an invalid value, fix it
1093
	 * to avoid hangs or perfomance issues
1184
	 * to avoid hangs or perfomance issues
-
 
1185
	 */
-
 
1186
	if ((v == 0) || (v == 6) || (v == 7))
-
 
1187
		pcie_set_readrq(rdev->pdev, 512);
-
 
1188
}
-
 
1189
 
-
 
1190
void dce4_program_fmt(struct drm_encoder *encoder)
-
 
1191
{
-
 
1192
	struct drm_device *dev = encoder->dev;
-
 
1193
	struct radeon_device *rdev = dev->dev_private;
-
 
1194
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
-
 
1195
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
-
 
1196
	struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
-
 
1197
	int bpc = 0;
-
 
1198
	u32 tmp = 0;
-
 
1199
	enum radeon_connector_dither dither = RADEON_FMT_DITHER_DISABLE;
-
 
1200
 
-
 
1201
	if (connector) {
-
 
1202
		struct radeon_connector *radeon_connector = to_radeon_connector(connector);
-
 
1203
		bpc = radeon_get_monitor_bpc(connector);
-
 
1204
		dither = radeon_connector->dither;
-
 
1205
	}
-
 
1206
 
-
 
1207
	/* LVDS/eDP FMT is set up by atom */
-
 
1208
	if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
-
 
1209
		return;
-
 
1210
 
-
 
1211
	/* not needed for analog */
-
 
1212
	if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1) ||
-
 
1213
	    (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2))
-
 
1214
		return;
-
 
1215
 
-
 
1216
	if (bpc == 0)
-
 
1217
		return;
-
 
1218
 
-
 
1219
	switch (bpc) {
-
 
1220
	case 6:
-
 
1221
		if (dither == RADEON_FMT_DITHER_ENABLE)
1094
	 */
1222
			/* XXX sort out optimal dither settings */
-
 
1223
			tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
1095
	if ((v == 0) || (v == 6) || (v == 7)) {
1224
				FMT_SPATIAL_DITHER_EN);
-
 
1225
		else
-
 
1226
			tmp |= FMT_TRUNCATE_EN;
-
 
1227
		break;
-
 
1228
	case 8:
-
 
1229
		if (dither == RADEON_FMT_DITHER_ENABLE)
-
 
1230
			/* XXX sort out optimal dither settings */
1096
		ctl &= ~PCI_EXP_DEVCTL_READRQ;
1231
			tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
-
 
1232
				FMT_RGB_RANDOM_ENABLE |
-
 
1233
				FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH);
-
 
1234
		else
-
 
1235
			tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH);
-
 
1236
		break;
-
 
1237
	case 10:
-
 
1238
	default:
1097
		ctl |= (2 << 12);
1239
		/* not needed */
-
 
1240
		break;
-
 
1241
	}
1098
		pcie_capability_write_word(rdev->pdev, PCI_EXP_DEVCTL, ctl);
1242
 
Line 1099... Line 1243...
1099
	}
1243
	WREG32(FMT_BIT_DEPTH_CONTROL + radeon_crtc->crtc_offset, tmp);
1100
}
1244
}
1101
 
1245
 
Line 1154... Line 1298...
1154
				break;
1298
				break;
1155
		}
1299
		}
1156
	}
1300
	}
1157
}
1301
}
Line 1158... Line -...
1158
 
-
 
1159
 
1302
 
1160
/**
1303
/**
1161
 * evergreen_page_flip - pageflip callback.
1304
 * evergreen_page_flip - pageflip callback.
1162
 *
1305
 *
1163
 * @rdev: radeon_device pointer
1306
 * @rdev: radeon_device pointer
Line 1168... Line 1311...
1168
 * During vblank we take the crtc lock and wait for the update_pending
1311
 * During vblank we take the crtc lock and wait for the update_pending
1169
 * bit to go high, when it does, we release the lock, and allow the
1312
 * bit to go high, when it does, we release the lock, and allow the
1170
 * double buffered update to take place.
1313
 * double buffered update to take place.
1171
 * Returns the current update pending status.
1314
 * Returns the current update pending status.
1172
 */
1315
 */
1173
u32 evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
1316
void evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
1174
{
1317
{
1175
	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
1318
	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
1176
	u32 tmp = RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset);
1319
	u32 tmp = RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset);
1177
	int i;
1320
	int i;
Line 1200... Line 1343...
1200
	DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
1343
	DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
Line 1201... Line 1344...
1201
 
1344
 
1202
	/* Unlock the lock, so double-buffering can take place inside vblank */
1345
	/* Unlock the lock, so double-buffering can take place inside vblank */
1203
	tmp &= ~EVERGREEN_GRPH_UPDATE_LOCK;
1346
	tmp &= ~EVERGREEN_GRPH_UPDATE_LOCK;
-
 
1347
	WREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
-
 
1348
}
-
 
1349
 
-
 
1350
/**
-
 
1351
 * evergreen_page_flip_pending - check if page flip is still pending
-
 
1352
 *
-
 
1353
 * @rdev: radeon_device pointer
-
 
1354
 * @crtc_id: crtc to check
-
 
1355
 *
-
 
1356
 * Returns the current update pending status.
-
 
1357
 */
-
 
1358
bool evergreen_page_flip_pending(struct radeon_device *rdev, int crtc_id)
-
 
1359
{
Line 1204... Line 1360...
1204
	WREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
1360
	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
1205
 
1361
 
-
 
1362
	/* Return current update_pending status: */
1206
	/* Return current update_pending status: */
1363
	return !!(RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) &
Line 1207... Line 1364...
1207
	return RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) & EVERGREEN_GRPH_SURFACE_UPDATE_PENDING;
1364
		EVERGREEN_GRPH_SURFACE_UPDATE_PENDING);
1208
}
1365
}
1209
 
1366
 
Line 1386... Line 1543...
1386
	int req_cm_idx = rdev->pm.requested_clock_mode_index;
1543
	int req_cm_idx = rdev->pm.requested_clock_mode_index;
1387
	struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
1544
	struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
1388
	struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
1545
	struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
Line 1389... Line 1546...
1389
 
1546
 
1390
	if (voltage->type == VOLTAGE_SW) {
1547
	if (voltage->type == VOLTAGE_SW) {
1391
		/* 0xff01 is a flag rather then an actual voltage */
1548
		/* 0xff0x are flags rather then an actual voltage */
1392
		if (voltage->voltage == 0xff01)
1549
		if ((voltage->voltage & 0xff00) == 0xff00)
1393
			return;
1550
			return;
1394
		if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) {
1551
		if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) {
1395
			radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
1552
			radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
1396
			rdev->pm.current_vddc = voltage->voltage;
1553
			rdev->pm.current_vddc = voltage->voltage;
Line 1407... Line 1564...
1407
		    ((rdev->pm.profile_index == PM_PROFILE_MID_MH_IDX) ||
1564
		    ((rdev->pm.profile_index == PM_PROFILE_MID_MH_IDX) ||
1408
		     (rdev->pm.profile_index == PM_PROFILE_LOW_MH_IDX)))
1565
		     (rdev->pm.profile_index == PM_PROFILE_LOW_MH_IDX)))
1409
			voltage = &rdev->pm.power_state[req_ps_idx].
1566
			voltage = &rdev->pm.power_state[req_ps_idx].
1410
				clock_info[rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx].voltage;
1567
				clock_info[rdev->pm.profiles[PM_PROFILE_HIGH_MH_IDX].dpms_on_cm_idx].voltage;
Line 1411... Line 1568...
1411
 
1568
 
1412
		/* 0xff01 is a flag rather then an actual voltage */
1569
		/* 0xff0x are flags rather then an actual voltage */
1413
		if (voltage->vddci == 0xff01)
1570
		if ((voltage->vddci & 0xff00) == 0xff00)
1414
			return;
1571
			return;
1415
		if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) {
1572
		if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) {
1416
			radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI);
1573
			radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI);
1417
			rdev->pm.current_vddci = voltage->vddci;
1574
			rdev->pm.current_vddci = voltage->vddci;
Line 1687... Line 1844...
1687
static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev,
1844
static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev,
1688
					struct radeon_crtc *radeon_crtc,
1845
					struct radeon_crtc *radeon_crtc,
1689
					struct drm_display_mode *mode,
1846
					struct drm_display_mode *mode,
1690
					struct drm_display_mode *other_mode)
1847
					struct drm_display_mode *other_mode)
1691
{
1848
{
1692
	u32 tmp;
1849
	u32 tmp, buffer_alloc, i;
-
 
1850
	u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
1693
	/*
1851
	/*
1694
	 * Line Buffer Setup
1852
	 * Line Buffer Setup
1695
	 * There are 3 line buffers, each one shared by 2 display controllers.
1853
	 * There are 3 line buffers, each one shared by 2 display controllers.
1696
	 * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between
1854
	 * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between
1697
	 * the display controllers.  The paritioning is done via one of four
1855
	 * the display controllers.  The paritioning is done via one of four
Line 1710... Line 1868...
1710
	/* this can get tricky if we have two large displays on a paired group
1868
	/* this can get tricky if we have two large displays on a paired group
1711
	 * of crtcs.  Ideally for multiple large displays we'd assign them to
1869
	 * of crtcs.  Ideally for multiple large displays we'd assign them to
1712
	 * non-linked crtcs for maximum line buffer allocation.
1870
	 * non-linked crtcs for maximum line buffer allocation.
1713
	 */
1871
	 */
1714
	if (radeon_crtc->base.enabled && mode) {
1872
	if (radeon_crtc->base.enabled && mode) {
1715
		if (other_mode)
1873
		if (other_mode) {
1716
			tmp = 0; /* 1/2 */
1874
			tmp = 0; /* 1/2 */
-
 
1875
			buffer_alloc = 1;
1717
		else
1876
		} else {
1718
			tmp = 2; /* whole */
1877
			tmp = 2; /* whole */
-
 
1878
			buffer_alloc = 2;
-
 
1879
		}
1719
	} else
1880
	} else {
1720
		tmp = 0;
1881
		tmp = 0;
-
 
1882
		buffer_alloc = 0;
-
 
1883
	}
Line 1721... Line 1884...
1721
 
1884
 
1722
	/* second controller of the pair uses second half of the lb */
1885
	/* second controller of the pair uses second half of the lb */
1723
	if (radeon_crtc->crtc_id % 2)
1886
	if (radeon_crtc->crtc_id % 2)
1724
		tmp += 4;
1887
		tmp += 4;
Line -... Line 1888...
-
 
1888
	WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp);
-
 
1889
 
-
 
1890
	if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) {
-
 
1891
		WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
-
 
1892
		       DMIF_BUFFERS_ALLOCATED(buffer_alloc));
-
 
1893
		for (i = 0; i < rdev->usec_timeout; i++) {
-
 
1894
			if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
-
 
1895
			    DMIF_BUFFERS_ALLOCATED_COMPLETED)
-
 
1896
				break;
-
 
1897
			udelay(1);
-
 
1898
		}
1725
	WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp);
1899
	}
1726
 
1900
 
1727
	if (radeon_crtc->base.enabled && mode) {
1901
	if (radeon_crtc->base.enabled && mode) {
1728
		switch (tmp) {
1902
		switch (tmp) {
1729
		case 0:
1903
		case 0:
Line 2005... Line 2179...
2005
static void evergreen_program_watermarks(struct radeon_device *rdev,
2179
static void evergreen_program_watermarks(struct radeon_device *rdev,
2006
					 struct radeon_crtc *radeon_crtc,
2180
					 struct radeon_crtc *radeon_crtc,
2007
					 u32 lb_size, u32 num_heads)
2181
					 u32 lb_size, u32 num_heads)
2008
{
2182
{
2009
	struct drm_display_mode *mode = &radeon_crtc->base.mode;
2183
	struct drm_display_mode *mode = &radeon_crtc->base.mode;
2010
	struct evergreen_wm_params wm;
2184
	struct evergreen_wm_params wm_low, wm_high;
-
 
2185
	u32 dram_channels;
2011
	u32 pixel_period;
2186
	u32 pixel_period;
2012
	u32 line_time = 0;
2187
	u32 line_time = 0;
2013
	u32 latency_watermark_a = 0, latency_watermark_b = 0;
2188
	u32 latency_watermark_a = 0, latency_watermark_b = 0;
2014
	u32 priority_a_mark = 0, priority_b_mark = 0;
2189
	u32 priority_a_mark = 0, priority_b_mark = 0;
2015
	u32 priority_a_cnt = PRIORITY_OFF;
2190
	u32 priority_a_cnt = PRIORITY_OFF;
Line 2021... Line 2196...
2021
	if (radeon_crtc->base.enabled && num_heads && mode) {
2196
	if (radeon_crtc->base.enabled && num_heads && mode) {
2022
		pixel_period = 1000000 / (u32)mode->clock;
2197
		pixel_period = 1000000 / (u32)mode->clock;
2023
		line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
2198
		line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
2024
		priority_a_cnt = 0;
2199
		priority_a_cnt = 0;
2025
		priority_b_cnt = 0;
2200
		priority_b_cnt = 0;
-
 
2201
		dram_channels = evergreen_get_number_of_dram_channels(rdev);
-
 
2202
 
-
 
2203
		/* watermark for high clocks */
-
 
2204
		if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
-
 
2205
			wm_high.yclk =
-
 
2206
				radeon_dpm_get_mclk(rdev, false) * 10;
-
 
2207
			wm_high.sclk =
-
 
2208
				radeon_dpm_get_sclk(rdev, false) * 10;
-
 
2209
		} else {
-
 
2210
			wm_high.yclk = rdev->pm.current_mclk * 10;
-
 
2211
			wm_high.sclk = rdev->pm.current_sclk * 10;
-
 
2212
		}
Line 2026... Line -...
2026
 
-
 
2027
		wm.yclk = rdev->pm.current_mclk * 10;
-
 
2028
		wm.sclk = rdev->pm.current_sclk * 10;
2213
 
2029
		wm.disp_clk = mode->clock;
2214
		wm_high.disp_clk = mode->clock;
2030
		wm.src_width = mode->crtc_hdisplay;
2215
		wm_high.src_width = mode->crtc_hdisplay;
2031
		wm.active_time = mode->crtc_hdisplay * pixel_period;
2216
		wm_high.active_time = mode->crtc_hdisplay * pixel_period;
2032
		wm.blank_time = line_time - wm.active_time;
2217
		wm_high.blank_time = line_time - wm_high.active_time;
2033
		wm.interlaced = false;
2218
		wm_high.interlaced = false;
2034
		if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2219
		if (mode->flags & DRM_MODE_FLAG_INTERLACE)
2035
			wm.interlaced = true;
2220
			wm_high.interlaced = true;
2036
		wm.vsc = radeon_crtc->vsc;
2221
		wm_high.vsc = radeon_crtc->vsc;
2037
		wm.vtaps = 1;
2222
		wm_high.vtaps = 1;
-
 
2223
		if (radeon_crtc->rmx_type != RMX_OFF)
-
 
2224
			wm_high.vtaps = 2;
-
 
2225
		wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
-
 
2226
		wm_high.lb_size = lb_size;
-
 
2227
		wm_high.dram_channels = dram_channels;
-
 
2228
		wm_high.num_heads = num_heads;
-
 
2229
 
-
 
2230
		/* watermark for low clocks */
-
 
2231
		if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
-
 
2232
			wm_low.yclk =
-
 
2233
				radeon_dpm_get_mclk(rdev, true) * 10;
-
 
2234
			wm_low.sclk =
-
 
2235
				radeon_dpm_get_sclk(rdev, true) * 10;
-
 
2236
		} else {
-
 
2237
			wm_low.yclk = rdev->pm.current_mclk * 10;
-
 
2238
			wm_low.sclk = rdev->pm.current_sclk * 10;
-
 
2239
		}
-
 
2240
 
-
 
2241
		wm_low.disp_clk = mode->clock;
-
 
2242
		wm_low.src_width = mode->crtc_hdisplay;
-
 
2243
		wm_low.active_time = mode->crtc_hdisplay * pixel_period;
-
 
2244
		wm_low.blank_time = line_time - wm_low.active_time;
-
 
2245
		wm_low.interlaced = false;
-
 
2246
		if (mode->flags & DRM_MODE_FLAG_INTERLACE)
-
 
2247
			wm_low.interlaced = true;
-
 
2248
		wm_low.vsc = radeon_crtc->vsc;
-
 
2249
		wm_low.vtaps = 1;
2038
		if (radeon_crtc->rmx_type != RMX_OFF)
2250
		if (radeon_crtc->rmx_type != RMX_OFF)
2039
			wm.vtaps = 2;
2251
			wm_low.vtaps = 2;
2040
		wm.bytes_per_pixel = 4; /* XXX: get this from fb config */
2252
		wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
2041
		wm.lb_size = lb_size;
2253
		wm_low.lb_size = lb_size;
2042
		wm.dram_channels = evergreen_get_number_of_dram_channels(rdev);
2254
		wm_low.dram_channels = dram_channels;
Line 2043... Line 2255...
2043
		wm.num_heads = num_heads;
2255
		wm_low.num_heads = num_heads;
2044
 
2256
 
2045
		/* set for high clocks */
2257
		/* set for high clocks */
2046
		latency_watermark_a = min(evergreen_latency_watermark(&wm), (u32)65535);
-
 
2047
		/* set for low clocks */
2258
		latency_watermark_a = min(evergreen_latency_watermark(&wm_high), (u32)65535);
Line 2048... Line 2259...
2048
		/* wm.yclk = low clk; wm.sclk = low clk */
2259
		/* set for low clocks */
2049
		latency_watermark_b = min(evergreen_latency_watermark(&wm), (u32)65535);
2260
		latency_watermark_b = min(evergreen_latency_watermark(&wm_low), (u32)65535);
2050
 
2261
 
2051
		/* possibly force display priority to high */
2262
		/* possibly force display priority to high */
2052
		/* should really do this at mode validation time... */
2263
		/* should really do this at mode validation time... */
2053
		if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm) ||
2264
		if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
2054
		    !evergreen_average_bandwidth_vs_available_bandwidth(&wm) ||
2265
		    !evergreen_average_bandwidth_vs_available_bandwidth(&wm_high) ||
2055
		    !evergreen_check_latency_hiding(&wm) ||
2266
		    !evergreen_check_latency_hiding(&wm_high) ||
-
 
2267
		    (rdev->disp_priority == 2)) {
-
 
2268
			DRM_DEBUG_KMS("force priority a to high\n");
-
 
2269
			priority_a_cnt |= PRIORITY_ALWAYS_ON;
-
 
2270
		}
-
 
2271
		if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
-
 
2272
		    !evergreen_average_bandwidth_vs_available_bandwidth(&wm_low) ||
2056
		    (rdev->disp_priority == 2)) {
2273
		    !evergreen_check_latency_hiding(&wm_low) ||
2057
			DRM_DEBUG_KMS("force priority to high\n");
2274
		    (rdev->disp_priority == 2)) {
Line 2058... Line 2275...
2058
			priority_a_cnt |= PRIORITY_ALWAYS_ON;
2275
			DRM_DEBUG_KMS("force priority b to high\n");
2059
			priority_b_cnt |= PRIORITY_ALWAYS_ON;
2276
			priority_b_cnt |= PRIORITY_ALWAYS_ON;
Line 2106... Line 2323...
2106
 
2323
 
2107
	/* write the priority marks */
2324
	/* write the priority marks */
2108
	WREG32(PRIORITY_A_CNT + radeon_crtc->crtc_offset, priority_a_cnt);
2325
	WREG32(PRIORITY_A_CNT + radeon_crtc->crtc_offset, priority_a_cnt);
Line -... Line 2326...
-
 
2326
	WREG32(PRIORITY_B_CNT + radeon_crtc->crtc_offset, priority_b_cnt);
-
 
2327
 
-
 
2328
	/* save values for DPM */
-
 
2329
	radeon_crtc->line_time = line_time;
2109
	WREG32(PRIORITY_B_CNT + radeon_crtc->crtc_offset, priority_b_cnt);
2330
	radeon_crtc->wm_high = latency_watermark_a;
Line 2110... Line 2331...
2110
 
2331
	radeon_crtc->wm_low = latency_watermark_b;
2111
}
2332
}
2112
 
2333
 
Line 2201... Line 2422...
2201
		return -EINVAL;
2422
		return -EINVAL;
2202
	}
2423
	}
2203
	r = radeon_gart_table_vram_pin(rdev);
2424
	r = radeon_gart_table_vram_pin(rdev);
2204
	if (r)
2425
	if (r)
2205
		return r;
2426
		return r;
2206
	radeon_gart_restore(rdev);
-
 
2207
	/* Setup L2 cache */
2427
	/* Setup L2 cache */
2208
	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
2428
	WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
2209
				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
2429
				ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
2210
				EFFECTIVE_L2_QUEUE_SIZE(7));
2430
				EFFECTIVE_L2_QUEUE_SIZE(7));
2211
	WREG32(VM_L2_CNTL2, 0);
2431
	WREG32(VM_L2_CNTL2, 0);
Line 2419... Line 2639...
2419
 
2639
 
2420
	/* unlock regs and wait for update */
2640
	/* unlock regs and wait for update */
2421
	for (i = 0; i < rdev->num_crtc; i++) {
2641
	for (i = 0; i < rdev->num_crtc; i++) {
2422
		if (save->crtc_enabled[i]) {
2642
		if (save->crtc_enabled[i]) {
2423
			tmp = RREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i]);
2643
			tmp = RREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i]);
2424
			if ((tmp & 0x3) != 0) {
2644
			if ((tmp & 0x7) != 3) {
-
 
2645
				tmp &= ~0x7;
2425
				tmp &= ~0x3;
2646
				tmp |= 0x3;
2426
				WREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i], tmp);
2647
				WREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i], tmp);
2427
			}
2648
			}
2428
			tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
2649
			tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
2429
			if (tmp & EVERGREEN_GRPH_UPDATE_LOCK) {
2650
			if (tmp & EVERGREEN_GRPH_UPDATE_LOCK) {
Line 2453... Line 2674...
2453
 
2674
 
2454
	for (i = 0; i < rdev->num_crtc; i++) {
2675
	for (i = 0; i < rdev->num_crtc; i++) {
2455
		if (save->crtc_enabled[i]) {
2676
		if (save->crtc_enabled[i]) {
2456
			if (ASIC_IS_DCE6(rdev)) {
2677
			if (ASIC_IS_DCE6(rdev)) {
2457
				tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]);
2678
				tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]);
2458
				tmp |= EVERGREEN_CRTC_BLANK_DATA_EN;
2679
				tmp &= ~EVERGREEN_CRTC_BLANK_DATA_EN;
2459
				WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2680
				WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
2460
				WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
2681
				WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
2461
				WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2682
				WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
2462
			} else {
2683
			} else {
Line 2646... Line 2867...
2646
	radeon_ring_write(ring, 0x0);
2867
	radeon_ring_write(ring, 0x0);
2647
	radeon_ring_write(ring, rdev->config.evergreen.max_hw_contexts - 1);
2868
	radeon_ring_write(ring, rdev->config.evergreen.max_hw_contexts - 1);
2648
	radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
2869
	radeon_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
2649
	radeon_ring_write(ring, 0);
2870
	radeon_ring_write(ring, 0);
2650
	radeon_ring_write(ring, 0);
2871
	radeon_ring_write(ring, 0);
2651
	radeon_ring_unlock_commit(rdev, ring);
2872
	radeon_ring_unlock_commit(rdev, ring, false);
Line 2652... Line 2873...
2652
 
2873
 
2653
	cp_me = 0xff;
2874
	cp_me = 0xff;
Line 2654... Line 2875...
2654
	WREG32(CP_ME_CNTL, cp_me);
2875
	WREG32(CP_ME_CNTL, cp_me);
Line 2689... Line 2910...
2689
	radeon_ring_write(ring, 0xc0026900);
2910
	radeon_ring_write(ring, 0xc0026900);
2690
	radeon_ring_write(ring, 0x00000316);
2911
	radeon_ring_write(ring, 0x00000316);
2691
	radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
2912
	radeon_ring_write(ring, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
2692
	radeon_ring_write(ring, 0x00000010); /*  */
2913
	radeon_ring_write(ring, 0x00000010); /*  */
Line 2693... Line 2914...
2693
 
2914
 
Line 2694... Line 2915...
2694
	radeon_ring_unlock_commit(rdev, ring);
2915
	radeon_ring_unlock_commit(rdev, ring, false);
2695
 
2916
 
Line 2696... Line 2917...
2696
	return 0;
2917
	return 0;
Line 2714... Line 2935...
2714
	mdelay(15);
2935
	mdelay(15);
2715
	WREG32(GRBM_SOFT_RESET, 0);
2936
	WREG32(GRBM_SOFT_RESET, 0);
2716
	RREG32(GRBM_SOFT_RESET);
2937
	RREG32(GRBM_SOFT_RESET);
Line 2717... Line 2938...
2717
 
2938
 
2718
	/* Set ring buffer size */
2939
	/* Set ring buffer size */
2719
	rb_bufsz = drm_order(ring->ring_size / 8);
2940
	rb_bufsz = order_base_2(ring->ring_size / 8);
2720
	tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
2941
	tmp = (order_base_2(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
2721
#ifdef __BIG_ENDIAN
2942
#ifdef __BIG_ENDIAN
2722
	tmp |= BUF_SWAP_32BIT;
2943
	tmp |= BUF_SWAP_32BIT;
2723
#endif
2944
#endif
2724
	WREG32(CP_RB_CNTL, tmp);
2945
	WREG32(CP_RB_CNTL, tmp);
Line 2751... Line 2972...
2751
	WREG32(CP_RB_CNTL, tmp);
2972
	WREG32(CP_RB_CNTL, tmp);
Line 2752... Line 2973...
2752
 
2973
 
2753
	WREG32(CP_RB_BASE, ring->gpu_addr >> 8);
2974
	WREG32(CP_RB_BASE, ring->gpu_addr >> 8);
Line 2754... Line -...
2754
	WREG32(CP_DEBUG, (1 << 27) | (1 << 28));
-
 
2755
 
-
 
2756
	ring->rptr = RREG32(CP_RB_RPTR);
2975
	WREG32(CP_DEBUG, (1 << 27) | (1 << 28));
2757
 
2976
 
2758
	evergreen_cp_start(rdev);
2977
	evergreen_cp_start(rdev);
2759
	ring->ready = true;
2978
	ring->ready = true;
2760
	r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring);
2979
	r = radeon_ring_test(rdev, RADEON_RING_TYPE_GFX_INDEX, ring);
Line 2942... Line 3161...
2942
		rdev->config.evergreen.max_stack_entries = 512;
3161
		rdev->config.evergreen.max_stack_entries = 512;
2943
		rdev->config.evergreen.sx_num_of_sets = 4;
3162
		rdev->config.evergreen.sx_num_of_sets = 4;
2944
		rdev->config.evergreen.sx_max_export_size = 256;
3163
		rdev->config.evergreen.sx_max_export_size = 256;
2945
		rdev->config.evergreen.sx_max_export_pos_size = 64;
3164
		rdev->config.evergreen.sx_max_export_pos_size = 64;
2946
		rdev->config.evergreen.sx_max_export_smx_size = 192;
3165
		rdev->config.evergreen.sx_max_export_smx_size = 192;
2947
		rdev->config.evergreen.max_hw_contexts = 8;
3166
		rdev->config.evergreen.max_hw_contexts = 4;
2948
		rdev->config.evergreen.sq_num_cf_insts = 2;
3167
		rdev->config.evergreen.sq_num_cf_insts = 2;
Line 2949... Line 3168...
2949
 
3168
 
2950
		rdev->config.evergreen.sc_prim_fifo_size = 0x40;
3169
		rdev->config.evergreen.sc_prim_fifo_size = 0x40;
2951
		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
3170
		rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
Line 3089... Line 3308...
3089
 
3308
 
3090
	if ((rdev->family >= CHIP_CEDAR) && (rdev->family <= CHIP_HEMLOCK)) {
3309
	if ((rdev->family >= CHIP_CEDAR) && (rdev->family <= CHIP_HEMLOCK)) {
3091
		u32 efuse_straps_4;
3310
		u32 efuse_straps_4;
Line 3092... Line -...
3092
		u32 efuse_straps_3;
-
 
3093
 
3311
		u32 efuse_straps_3;
3094
		WREG32(RCU_IND_INDEX, 0x204);
-
 
3095
		efuse_straps_4 = RREG32(RCU_IND_DATA);
3312
 
3096
		WREG32(RCU_IND_INDEX, 0x203);
3313
		efuse_straps_4 = RREG32_RCU(0x204);
3097
		efuse_straps_3 = RREG32(RCU_IND_DATA);
3314
		efuse_straps_3 = RREG32_RCU(0x203);
3098
		tmp = (((efuse_straps_4 & 0xf) << 4) |
3315
		tmp = (((efuse_straps_4 & 0xf) << 4) |
3099
		      ((efuse_straps_3 & 0xf0000000) >> 28));
3316
		      ((efuse_straps_3 & 0xf0000000) >> 28));
3100
	} else {
3317
	} else {
Line 3118... Line 3335...
3118
	if ((disabled_rb_mask & tmp) == tmp) {
3335
	if ((disabled_rb_mask & tmp) == tmp) {
3119
		for (i = 0; i < rdev->config.evergreen.max_backends; i++)
3336
		for (i = 0; i < rdev->config.evergreen.max_backends; i++)
3120
			disabled_rb_mask &= ~(1 << i);
3337
			disabled_rb_mask &= ~(1 << i);
3121
	}
3338
	}
Line -... Line 3339...
-
 
3339
 
-
 
3340
	for (i = 0; i < rdev->config.evergreen.num_ses; i++) {
-
 
3341
		u32 simd_disable_bitmap;
-
 
3342
 
-
 
3343
		WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
-
 
3344
		WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i));
-
 
3345
		simd_disable_bitmap = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
-
 
3346
		simd_disable_bitmap |= 0xffffffff << rdev->config.evergreen.max_simds;
-
 
3347
		tmp <<= 16;
-
 
3348
		tmp |= simd_disable_bitmap;
-
 
3349
	}
-
 
3350
	rdev->config.evergreen.active_simds = hweight32(~tmp);
3122
 
3351
 
3123
	WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
3352
	WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
Line 3124... Line 3353...
3124
	WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
3353
	WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES);
3125
 
3354
 
Line 3448... Line 3677...
3448
	}
3677
	}
Line 3449... Line 3678...
3449
 
3678
 
3450
	return true;
3679
	return true;
Line 3451... Line 3680...
3451
}
3680
}
3452
 
3681
 
3453
static u32 evergreen_gpu_check_soft_reset(struct radeon_device *rdev)
3682
u32 evergreen_gpu_check_soft_reset(struct radeon_device *rdev)
3454
{
3683
{
Line 3455... Line 3684...
3455
	u32 reset_mask = 0;
3684
	u32 reset_mask = 0;
Line 3631... Line 3860...
3631
	udelay(50);
3860
	udelay(50);
Line 3632... Line 3861...
3632
 
3861
 
3633
	evergreen_print_gpu_status_regs(rdev);
3862
	evergreen_print_gpu_status_regs(rdev);
Line -... Line 3863...
-
 
3863
}
-
 
3864
 
-
 
3865
void evergreen_gpu_pci_config_reset(struct radeon_device *rdev)
-
 
3866
{
-
 
3867
	struct evergreen_mc_save save;
-
 
3868
	u32 tmp, i;
-
 
3869
 
-
 
3870
	dev_info(rdev->dev, "GPU pci config reset\n");
-
 
3871
 
-
 
3872
	/* disable dpm? */
-
 
3873
 
-
 
3874
	/* Disable CP parsing/prefetching */
-
 
3875
	WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
-
 
3876
	udelay(50);
-
 
3877
	/* Disable DMA */
-
 
3878
	tmp = RREG32(DMA_RB_CNTL);
-
 
3879
	tmp &= ~DMA_RB_ENABLE;
-
 
3880
	WREG32(DMA_RB_CNTL, tmp);
-
 
3881
	/* XXX other engines? */
-
 
3882
 
-
 
3883
	/* halt the rlc */
-
 
3884
	r600_rlc_stop(rdev);
-
 
3885
 
-
 
3886
	udelay(50);
-
 
3887
 
-
 
3888
	/* set mclk/sclk to bypass */
-
 
3889
	rv770_set_clk_bypass_mode(rdev);
-
 
3890
	/* disable BM */
-
 
3891
	pci_clear_master(rdev->pdev);
-
 
3892
	/* disable mem access */
-
 
3893
	evergreen_mc_stop(rdev, &save);
-
 
3894
	if (evergreen_mc_wait_for_idle(rdev)) {
-
 
3895
		dev_warn(rdev->dev, "Wait for MC idle timed out !\n");
-
 
3896
	}
-
 
3897
	/* reset */
-
 
3898
	radeon_pci_config_reset(rdev);
-
 
3899
	/* wait for asic to come out of reset */
-
 
3900
	for (i = 0; i < rdev->usec_timeout; i++) {
-
 
3901
		if (RREG32(CONFIG_MEMSIZE) != 0xffffffff)
-
 
3902
			break;
-
 
3903
		udelay(1);
-
 
3904
	}
3634
}
3905
}
3635
 
3906
 
3636
int evergreen_asic_reset(struct radeon_device *rdev)
3907
int evergreen_asic_reset(struct radeon_device *rdev)
Line 3637... Line 3908...
3637
{
3908
{
Line 3638... Line 3909...
3638
	u32 reset_mask;
3909
	u32 reset_mask;
3639
 
3910
 
Line -... Line 3911...
-
 
3911
	reset_mask = evergreen_gpu_check_soft_reset(rdev);
3640
	reset_mask = evergreen_gpu_check_soft_reset(rdev);
3912
 
Line 3641... Line 3913...
3641
 
3913
	if (reset_mask)
Line -... Line 3914...
-
 
3914
		r600_set_bios_scratch_engine_hung(rdev, true);
-
 
3915
 
-
 
3916
	/* try soft reset */
-
 
3917
	evergreen_gpu_soft_reset(rdev, reset_mask);
-
 
3918
 
-
 
3919
	reset_mask = evergreen_gpu_check_soft_reset(rdev);
3642
	if (reset_mask)
3920
 
3643
		r600_set_bios_scratch_engine_hung(rdev, true);
3921
	/* try pci config reset */
Line 3644... Line 3922...
3644
 
3922
	if (reset_mask && radeon_hard_reset)
3645
	evergreen_gpu_soft_reset(rdev, reset_mask);
3923
		evergreen_gpu_pci_config_reset(rdev);
Line 3666... Line 3944...
3666
	u32 reset_mask = evergreen_gpu_check_soft_reset(rdev);
3944
	u32 reset_mask = evergreen_gpu_check_soft_reset(rdev);
Line 3667... Line 3945...
3667
 
3945
 
3668
	if (!(reset_mask & (RADEON_RESET_GFX |
3946
	if (!(reset_mask & (RADEON_RESET_GFX |
3669
					       RADEON_RESET_COMPUTE |
3947
					       RADEON_RESET_COMPUTE |
3670
			    RADEON_RESET_CP))) {
3948
			    RADEON_RESET_CP))) {
3671
		radeon_ring_lockup_update(ring);
3949
		radeon_ring_lockup_update(rdev, ring);
3672
		return false;
3950
		return false;
3673
	}
-
 
3674
	/* force CP activities */
-
 
3675
	radeon_ring_force_activity(rdev, ring);
3951
	}
3676
	return radeon_ring_test_lockup(rdev, ring);
3952
	return radeon_ring_test_lockup(rdev, ring);
Line 3677... Line 3953...
3677
}
3953
}
3678
 
-
 
3679
/**
-
 
3680
 * evergreen_dma_is_lockup - Check if the DMA engine is locked up
-
 
3681
 *
-
 
3682
 * @rdev: radeon_device pointer
3954
 
3683
 * @ring: radeon_ring structure holding ring information
-
 
3684
 *
-
 
3685
 * Check if the async DMA engine is locked up.
3955
/*
-
 
3956
 * RLC
-
 
3957
 */
-
 
3958
#define RLC_SAVE_RESTORE_LIST_END_MARKER    0x00000000
3686
 * Returns true if the engine appears to be locked up, false if not.
3959
#define RLC_CLEAR_STATE_END_MARKER          0x00000001
3687
 */
3960
 
3688
bool evergreen_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
3961
void sumo_rlc_fini(struct radeon_device *rdev)
Line -... Line 3962...
-
 
3962
{
3689
{
3963
	int r;
-
 
3964
 
-
 
3965
	/* save restore block */
-
 
3966
	if (rdev->rlc.save_restore_obj) {
3690
	u32 reset_mask = evergreen_gpu_check_soft_reset(rdev);
3967
		r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
-
 
3968
		if (unlikely(r != 0))
-
 
3969
			dev_warn(rdev->dev, "(%d) reserve RLC sr bo failed\n", r);
-
 
3970
		radeon_bo_unpin(rdev->rlc.save_restore_obj);
3691
 
3971
		radeon_bo_unreserve(rdev->rlc.save_restore_obj);
3692
	if (!(reset_mask & RADEON_RESET_DMA)) {
3972
 
-
 
3973
		radeon_bo_unref(&rdev->rlc.save_restore_obj);
3693
		radeon_ring_lockup_update(ring);
3974
		rdev->rlc.save_restore_obj = NULL;
-
 
3975
	}
-
 
3976
 
-
 
3977
	/* clear state block */
-
 
3978
	if (rdev->rlc.clear_state_obj) {
-
 
3979
		r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
-
 
3980
		if (unlikely(r != 0))
-
 
3981
			dev_warn(rdev->dev, "(%d) reserve RLC c bo failed\n", r);
3694
		return false;
3982
		radeon_bo_unpin(rdev->rlc.clear_state_obj);
-
 
3983
		radeon_bo_unreserve(rdev->rlc.clear_state_obj);
-
 
3984
 
-
 
3985
		radeon_bo_unref(&rdev->rlc.clear_state_obj);
-
 
3986
		rdev->rlc.clear_state_obj = NULL;
-
 
3987
	}
-
 
3988
 
-
 
3989
	/* clear state block */
-
 
3990
	if (rdev->rlc.cp_table_obj) {
-
 
3991
		r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false);
-
 
3992
		if (unlikely(r != 0))
-
 
3993
			dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r);
-
 
3994
		radeon_bo_unpin(rdev->rlc.cp_table_obj);
-
 
3995
		radeon_bo_unreserve(rdev->rlc.cp_table_obj);
-
 
3996
 
-
 
3997
		radeon_bo_unref(&rdev->rlc.cp_table_obj);
-
 
3998
		rdev->rlc.cp_table_obj = NULL;
-
 
3999
	}
-
 
4000
}
-
 
4001
 
-
 
4002
#define CP_ME_TABLE_SIZE    96
-
 
4003
 
-
 
4004
int sumo_rlc_init(struct radeon_device *rdev)
-
 
4005
{
-
 
4006
	const u32 *src_ptr;
-
 
4007
	volatile u32 *dst_ptr;
-
 
4008
	u32 dws, data, i, j, k, reg_num;
-
 
4009
	u32 reg_list_num, reg_list_hdr_blk_index, reg_list_blk_index = 0;
-
 
4010
	u64 reg_list_mc_addr;
-
 
4011
	const struct cs_section_def *cs_data;
-
 
4012
	int r;
-
 
4013
 
-
 
4014
	src_ptr = rdev->rlc.reg_list;
-
 
4015
	dws = rdev->rlc.reg_list_size;
-
 
4016
	if (rdev->family >= CHIP_BONAIRE) {
-
 
4017
		dws += (5 * 16) + 48 + 48 + 64;
-
 
4018
	}
-
 
4019
	cs_data = rdev->rlc.cs_data;
-
 
4020
 
-
 
4021
	if (src_ptr) {
-
 
4022
		/* save restore block */
-
 
4023
		if (rdev->rlc.save_restore_obj == NULL) {
-
 
4024
			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
-
 
4025
					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
-
 
4026
					     &rdev->rlc.save_restore_obj);
-
 
4027
			if (r) {
-
 
4028
				dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
-
 
4029
				return r;
-
 
4030
			}
-
 
4031
		}
-
 
4032
 
-
 
4033
		r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
-
 
4034
		if (unlikely(r != 0)) {
-
 
4035
			sumo_rlc_fini(rdev);
-
 
4036
			return r;
-
 
4037
		}
-
 
4038
		r = radeon_bo_pin(rdev->rlc.save_restore_obj, RADEON_GEM_DOMAIN_VRAM,
-
 
4039
				  &rdev->rlc.save_restore_gpu_addr);
-
 
4040
		if (r) {
-
 
4041
			radeon_bo_unreserve(rdev->rlc.save_restore_obj);
-
 
4042
			dev_warn(rdev->dev, "(%d) pin RLC sr bo failed\n", r);
-
 
4043
			sumo_rlc_fini(rdev);
-
 
4044
			return r;
-
 
4045
		}
-
 
4046
 
-
 
4047
		r = radeon_bo_kmap(rdev->rlc.save_restore_obj, (void **)&rdev->rlc.sr_ptr);
-
 
4048
		if (r) {
-
 
4049
			dev_warn(rdev->dev, "(%d) map RLC sr bo failed\n", r);
-
 
4050
			sumo_rlc_fini(rdev);
-
 
4051
			return r;
-
 
4052
		}
-
 
4053
		/* write the sr buffer */
-
 
4054
		dst_ptr = rdev->rlc.sr_ptr;
-
 
4055
		if (rdev->family >= CHIP_TAHITI) {
-
 
4056
			/* SI */
-
 
4057
			for (i = 0; i < rdev->rlc.reg_list_size; i++)
-
 
4058
				dst_ptr[i] = cpu_to_le32(src_ptr[i]);
-
 
4059
		} else {
-
 
4060
			/* ON/LN/TN */
-
 
4061
			/* format:
-
 
4062
			 * dw0: (reg2 << 16) | reg1
-
 
4063
			 * dw1: reg1 save space
-
 
4064
			 * dw2: reg2 save space
-
 
4065
 */
-
 
4066
			for (i = 0; i < dws; i++) {
-
 
4067
				data = src_ptr[i] >> 2;
-
 
4068
				i++;
-
 
4069
				if (i < dws)
-
 
4070
					data |= (src_ptr[i] >> 2) << 16;
-
 
4071
				j = (((i - 1) * 3) / 2);
-
 
4072
				dst_ptr[j] = cpu_to_le32(data);
-
 
4073
			}
-
 
4074
			j = ((i * 3) / 2);
-
 
4075
			dst_ptr[j] = cpu_to_le32(RLC_SAVE_RESTORE_LIST_END_MARKER);
-
 
4076
		}
-
 
4077
		radeon_bo_kunmap(rdev->rlc.save_restore_obj);
-
 
4078
		radeon_bo_unreserve(rdev->rlc.save_restore_obj);
-
 
4079
	}
-
 
4080
 
-
 
4081
	if (cs_data) {
-
 
4082
		/* clear state block */
-
 
4083
		if (rdev->family >= CHIP_BONAIRE) {
-
 
4084
			rdev->rlc.clear_state_size = dws = cik_get_csb_size(rdev);
-
 
4085
		} else if (rdev->family >= CHIP_TAHITI) {
-
 
4086
			rdev->rlc.clear_state_size = si_get_csb_size(rdev);
-
 
4087
			dws = rdev->rlc.clear_state_size + (256 / 4);
-
 
4088
		} else {
-
 
4089
			reg_list_num = 0;
-
 
4090
			dws = 0;
-
 
4091
			for (i = 0; cs_data[i].section != NULL; i++) {
-
 
4092
				for (j = 0; cs_data[i].section[j].extent != NULL; j++) {
-
 
4093
					reg_list_num++;
-
 
4094
					dws += cs_data[i].section[j].reg_count;
-
 
4095
				}
-
 
4096
			}
-
 
4097
			reg_list_blk_index = (3 * reg_list_num + 2);
-
 
4098
			dws += reg_list_blk_index;
-
 
4099
			rdev->rlc.clear_state_size = dws;
-
 
4100
		}
-
 
4101
 
-
 
4102
		if (rdev->rlc.clear_state_obj == NULL) {
-
 
4103
			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
-
 
4104
					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
-
 
4105
					     &rdev->rlc.clear_state_obj);
-
 
4106
			if (r) {
-
 
4107
				dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
-
 
4108
				sumo_rlc_fini(rdev);
-
 
4109
				return r;
-
 
4110
			}
-
 
4111
		}
-
 
4112
		r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
-
 
4113
		if (unlikely(r != 0)) {
-
 
4114
			sumo_rlc_fini(rdev);
-
 
4115
			return r;
-
 
4116
		}
-
 
4117
		r = radeon_bo_pin(rdev->rlc.clear_state_obj, RADEON_GEM_DOMAIN_VRAM,
-
 
4118
				  &rdev->rlc.clear_state_gpu_addr);
-
 
4119
		if (r) {
-
 
4120
			radeon_bo_unreserve(rdev->rlc.clear_state_obj);
-
 
4121
			dev_warn(rdev->dev, "(%d) pin RLC c bo failed\n", r);
-
 
4122
			sumo_rlc_fini(rdev);
-
 
4123
			return r;
-
 
4124
		}
-
 
4125
 
-
 
4126
		r = radeon_bo_kmap(rdev->rlc.clear_state_obj, (void **)&rdev->rlc.cs_ptr);
-
 
4127
		if (r) {
-
 
4128
			dev_warn(rdev->dev, "(%d) map RLC c bo failed\n", r);
-
 
4129
			sumo_rlc_fini(rdev);
-
 
4130
			return r;
-
 
4131
		}
-
 
4132
		/* set up the cs buffer */
-
 
4133
		dst_ptr = rdev->rlc.cs_ptr;
-
 
4134
		if (rdev->family >= CHIP_BONAIRE) {
-
 
4135
			cik_get_csb_buffer(rdev, dst_ptr);
-
 
4136
		} else if (rdev->family >= CHIP_TAHITI) {
-
 
4137
			reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + 256;
-
 
4138
			dst_ptr[0] = cpu_to_le32(upper_32_bits(reg_list_mc_addr));
-
 
4139
			dst_ptr[1] = cpu_to_le32(lower_32_bits(reg_list_mc_addr));
-
 
4140
			dst_ptr[2] = cpu_to_le32(rdev->rlc.clear_state_size);
-
 
4141
			si_get_csb_buffer(rdev, &dst_ptr[(256/4)]);
-
 
4142
		} else {
-
 
4143
			reg_list_hdr_blk_index = 0;
-
 
4144
			reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + (reg_list_blk_index * 4);
-
 
4145
			data = upper_32_bits(reg_list_mc_addr);
-
 
4146
			dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
-
 
4147
			reg_list_hdr_blk_index++;
-
 
4148
			for (i = 0; cs_data[i].section != NULL; i++) {
-
 
4149
				for (j = 0; cs_data[i].section[j].extent != NULL; j++) {
-
 
4150
					reg_num = cs_data[i].section[j].reg_count;
-
 
4151
					data = reg_list_mc_addr & 0xffffffff;
-
 
4152
					dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
-
 
4153
					reg_list_hdr_blk_index++;
-
 
4154
 
-
 
4155
					data = (cs_data[i].section[j].reg_index * 4) & 0xffffffff;
-
 
4156
					dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
-
 
4157
					reg_list_hdr_blk_index++;
-
 
4158
 
-
 
4159
					data = 0x08000000 | (reg_num * 4);
-
 
4160
					dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(data);
-
 
4161
					reg_list_hdr_blk_index++;
-
 
4162
 
-
 
4163
					for (k = 0; k < reg_num; k++) {
-
 
4164
						data = cs_data[i].section[j].extent[k];
-
 
4165
						dst_ptr[reg_list_blk_index + k] = cpu_to_le32(data);
-
 
4166
					}
-
 
4167
					reg_list_mc_addr += reg_num * 4;
-
 
4168
					reg_list_blk_index += reg_num;
-
 
4169
				}
-
 
4170
			}
-
 
4171
			dst_ptr[reg_list_hdr_blk_index] = cpu_to_le32(RLC_CLEAR_STATE_END_MARKER);
-
 
4172
		}
-
 
4173
		radeon_bo_kunmap(rdev->rlc.clear_state_obj);
-
 
4174
		radeon_bo_unreserve(rdev->rlc.clear_state_obj);
-
 
4175
	}
-
 
4176
 
-
 
4177
	if (rdev->rlc.cp_table_size) {
-
 
4178
		if (rdev->rlc.cp_table_obj == NULL) {
-
 
4179
			r = radeon_bo_create(rdev, rdev->rlc.cp_table_size,
-
 
4180
					     PAGE_SIZE, true,
-
 
4181
					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
-
 
4182
					     &rdev->rlc.cp_table_obj);
-
 
4183
			if (r) {
-
 
4184
				dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r);
-
 
4185
				sumo_rlc_fini(rdev);
-
 
4186
				return r;
-
 
4187
			}
-
 
4188
		}
-
 
4189
 
-
 
4190
		r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false);
-
 
4191
		if (unlikely(r != 0)) {
-
 
4192
			dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r);
-
 
4193
			sumo_rlc_fini(rdev);
-
 
4194
			return r;
-
 
4195
		}
-
 
4196
		r = radeon_bo_pin(rdev->rlc.cp_table_obj, RADEON_GEM_DOMAIN_VRAM,
-
 
4197
				  &rdev->rlc.cp_table_gpu_addr);
-
 
4198
		if (r) {
-
 
4199
			radeon_bo_unreserve(rdev->rlc.cp_table_obj);
-
 
4200
			dev_warn(rdev->dev, "(%d) pin RLC cp_table bo failed\n", r);
-
 
4201
			sumo_rlc_fini(rdev);
-
 
4202
			return r;
-
 
4203
		}
-
 
4204
		r = radeon_bo_kmap(rdev->rlc.cp_table_obj, (void **)&rdev->rlc.cp_table_ptr);
-
 
4205
		if (r) {
-
 
4206
			dev_warn(rdev->dev, "(%d) map RLC cp table bo failed\n", r);
-
 
4207
			sumo_rlc_fini(rdev);
-
 
4208
			return r;
-
 
4209
		}
-
 
4210
 
-
 
4211
		cik_init_cp_pg_table(rdev);
-
 
4212
 
-
 
4213
		radeon_bo_kunmap(rdev->rlc.cp_table_obj);
-
 
4214
		radeon_bo_unreserve(rdev->rlc.cp_table_obj);
-
 
4215
 
-
 
4216
	}
-
 
4217
 
-
 
4218
	return 0;
-
 
4219
}
-
 
4220
 
-
 
4221
static void evergreen_rlc_start(struct radeon_device *rdev)
-
 
4222
{
-
 
4223
	u32 mask = RLC_ENABLE;
-
 
4224
 
-
 
4225
	if (rdev->flags & RADEON_IS_IGP) {
-
 
4226
		mask |= GFX_POWER_GATING_ENABLE | GFX_POWER_GATING_SRC;
-
 
4227
	}
-
 
4228
 
-
 
4229
	WREG32(RLC_CNTL, mask);
-
 
4230
}
-
 
4231
 
-
 
4232
int evergreen_rlc_resume(struct radeon_device *rdev)
-
 
4233
{
-
 
4234
	u32 i;
-
 
4235
	const __be32 *fw_data;
-
 
4236
 
-
 
4237
	if (!rdev->rlc_fw)
-
 
4238
		return -EINVAL;
-
 
4239
 
-
 
4240
	r600_rlc_stop(rdev);
-
 
4241
 
-
 
4242
	WREG32(RLC_HB_CNTL, 0);
-
 
4243
 
-
 
4244
	if (rdev->flags & RADEON_IS_IGP) {
-
 
4245
		if (rdev->family == CHIP_ARUBA) {
-
 
4246
			u32 always_on_bitmap =
-
 
4247
				3 | (3 << (16 * rdev->config.cayman.max_shader_engines));
-
 
4248
			/* find out the number of active simds */
-
 
4249
			u32 tmp = (RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffff0000) >> 16;
-
 
4250
			tmp |= 0xffffffff << rdev->config.cayman.max_simds_per_se;
-
 
4251
			tmp = hweight32(~tmp);
-
 
4252
			if (tmp == rdev->config.cayman.max_simds_per_se) {
-
 
4253
				WREG32(TN_RLC_LB_ALWAYS_ACTIVE_SIMD_MASK, always_on_bitmap);
-
 
4254
				WREG32(TN_RLC_LB_PARAMS, 0x00601004);
-
 
4255
				WREG32(TN_RLC_LB_INIT_SIMD_MASK, 0xffffffff);
-
 
4256
				WREG32(TN_RLC_LB_CNTR_INIT, 0x00000000);
-
 
4257
				WREG32(TN_RLC_LB_CNTR_MAX, 0x00002000);
-
 
4258
			}
-
 
4259
		} else {
-
 
4260
			WREG32(RLC_HB_WPTR_LSB_ADDR, 0);
-
 
4261
			WREG32(RLC_HB_WPTR_MSB_ADDR, 0);
-
 
4262
		}
-
 
4263
		WREG32(TN_RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
-
 
4264
		WREG32(TN_RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8);
-
 
4265
	} else {
-
 
4266
		WREG32(RLC_HB_BASE, 0);
-
 
4267
		WREG32(RLC_HB_RPTR, 0);
-
 
4268
		WREG32(RLC_HB_WPTR, 0);
-
 
4269
		WREG32(RLC_HB_WPTR_LSB_ADDR, 0);
-
 
4270
		WREG32(RLC_HB_WPTR_MSB_ADDR, 0);
-
 
4271
	}
-
 
4272
	WREG32(RLC_MC_CNTL, 0);
-
 
4273
	WREG32(RLC_UCODE_CNTL, 0);
-
 
4274
 
-
 
4275
	fw_data = (const __be32 *)rdev->rlc_fw->data;
-
 
4276
	if (rdev->family >= CHIP_ARUBA) {
-
 
4277
		for (i = 0; i < ARUBA_RLC_UCODE_SIZE; i++) {
-
 
4278
			WREG32(RLC_UCODE_ADDR, i);
-
 
4279
			WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
-
 
4280
		}
-
 
4281
	} else if (rdev->family >= CHIP_CAYMAN) {
-
 
4282
		for (i = 0; i < CAYMAN_RLC_UCODE_SIZE; i++) {
-
 
4283
			WREG32(RLC_UCODE_ADDR, i);
-
 
4284
			WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
-
 
4285
		}
-
 
4286
	} else {
-
 
4287
		for (i = 0; i < EVERGREEN_RLC_UCODE_SIZE; i++) {
-
 
4288
			WREG32(RLC_UCODE_ADDR, i);
-
 
4289
			WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
-
 
4290
		}
3695
	}
4291
	}
-
 
4292
	WREG32(RLC_UCODE_ADDR, 0);
-
 
4293
 
3696
	/* force ring activities */
4294
	evergreen_rlc_start(rdev);
Line 3697... Line 4295...
3697
	radeon_ring_force_activity(rdev, ring);
4295
 
Line 3698... Line 4296...
3698
	return radeon_ring_test_lockup(rdev, ring);
4296
	return 0;
Line 3744... Line 4342...
3744
	if (rdev->num_crtc >= 6) {
4342
	if (rdev->num_crtc >= 6) {
3745
		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
4343
		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
3746
		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
4344
		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
3747
	}
4345
	}
Line 3748... Line 4346...
3748
 
4346
 
3749
	/* only one DAC on DCE6 */
4347
	/* only one DAC on DCE5 */
3750
	if (!ASIC_IS_DCE6(rdev))
4348
	if (!ASIC_IS_DCE5(rdev))
3751
		WREG32(DACA_AUTODETECT_INT_CONTROL, 0);
4349
		WREG32(DACA_AUTODETECT_INT_CONTROL, 0);
Line 3752... Line 4350...
3752
	WREG32(DACB_AUTODETECT_INT_CONTROL, 0);
4350
	WREG32(DACB_AUTODETECT_INT_CONTROL, 0);
3753
 
4351
 
Line 3771... Line 4369...
3771
	u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE;
4369
	u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE;
3772
	u32 cp_int_cntl1 = 0, cp_int_cntl2 = 0;
4370
	u32 cp_int_cntl1 = 0, cp_int_cntl2 = 0;
3773
	u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
4371
	u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
3774
	u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
4372
	u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
3775
	u32 grbm_int_cntl = 0;
4373
	u32 grbm_int_cntl = 0;
3776
	u32 grph1 = 0, grph2 = 0, grph3 = 0, grph4 = 0, grph5 = 0, grph6 = 0;
-
 
3777
	u32 afmt1 = 0, afmt2 = 0, afmt3 = 0, afmt4 = 0, afmt5 = 0, afmt6 = 0;
4374
	u32 afmt1 = 0, afmt2 = 0, afmt3 = 0, afmt4 = 0, afmt5 = 0, afmt6 = 0;
3778
	u32 dma_cntl, dma_cntl1 = 0;
4375
	u32 dma_cntl, dma_cntl1 = 0;
-
 
4376
	u32 thermal_int = 0;
Line 3779... Line 4377...
3779
 
4377
 
3780
	if (!rdev->irq.installed) {
4378
	if (!rdev->irq.installed) {
3781
		WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
4379
		WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
3782
		return -EINVAL;
4380
		return -EINVAL;
Line 3793... Line 4391...
3793
	hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN;
4391
	hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN;
3794
	hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN;
4392
	hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN;
3795
	hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN;
4393
	hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN;
3796
	hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN;
4394
	hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN;
3797
	hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN;
4395
	hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN;
-
 
4396
	if (rdev->family == CHIP_ARUBA)
-
 
4397
		thermal_int = RREG32(TN_CG_THERMAL_INT_CTRL) &
-
 
4398
			~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
-
 
4399
	else
-
 
4400
		thermal_int = RREG32(CG_THERMAL_INT) &
-
 
4401
			~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
Line 3798... Line 4402...
3798
 
4402
 
3799
	afmt1 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
4403
	afmt1 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
3800
	afmt2 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
4404
	afmt2 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
3801
	afmt3 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
4405
	afmt3 = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) & ~AFMT_AZ_FORMAT_WTRIG_MASK;
Line 3838... Line 4442...
3838
			DRM_DEBUG("r600_irq_set: sw int dma1\n");
4442
			DRM_DEBUG("r600_irq_set: sw int dma1\n");
3839
			dma_cntl1 |= TRAP_ENABLE;
4443
			dma_cntl1 |= TRAP_ENABLE;
3840
		}
4444
		}
3841
	}
4445
	}
Line -... Line 4446...
-
 
4446
 
-
 
4447
	if (rdev->irq.dpm_thermal) {
-
 
4448
		DRM_DEBUG("dpm thermal\n");
-
 
4449
		thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
-
 
4450
	}
3842
 
4451
 
3843
	if (rdev->irq.crtc_vblank_int[0] ||
4452
	if (rdev->irq.crtc_vblank_int[0] ||
3844
	    atomic_read(&rdev->irq.pflip[0])) {
4453
	    atomic_read(&rdev->irq.pflip[0])) {
3845
		DRM_DEBUG("evergreen_irq_set: vblank 0\n");
4454
		DRM_DEBUG("evergreen_irq_set: vblank 0\n");
3846
		crtc1 |= VBLANK_INT_MASK;
4455
		crtc1 |= VBLANK_INT_MASK;
Line 3942... Line 4551...
3942
	if (rdev->num_crtc >= 6) {
4551
	if (rdev->num_crtc >= 6) {
3943
		WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);
4552
		WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);
3944
		WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
4553
		WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
3945
	}
4554
	}
Line 3946... Line 4555...
3946
 
4555
 
-
 
4556
	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET,
3947
	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, grph1);
4557
	       GRPH_PFLIP_INT_MASK);
-
 
4558
	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET,
3948
	WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, grph2);
4559
	       GRPH_PFLIP_INT_MASK);
3949
	if (rdev->num_crtc >= 4) {
4560
	if (rdev->num_crtc >= 4) {
-
 
4561
		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET,
3950
		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3);
4562
		       GRPH_PFLIP_INT_MASK);
-
 
4563
		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET,
3951
		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4);
4564
		       GRPH_PFLIP_INT_MASK);
3952
	}
4565
	}
3953
	if (rdev->num_crtc >= 6) {
4566
	if (rdev->num_crtc >= 6) {
-
 
4567
		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET,
3954
		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5);
4568
		       GRPH_PFLIP_INT_MASK);
-
 
4569
		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET,
3955
		WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6);
4570
		       GRPH_PFLIP_INT_MASK);
Line 3956... Line 4571...
3956
	}
4571
	}
3957
 
4572
 
3958
	WREG32(DC_HPD1_INT_CONTROL, hpd1);
4573
	WREG32(DC_HPD1_INT_CONTROL, hpd1);
3959
	WREG32(DC_HPD2_INT_CONTROL, hpd2);
4574
	WREG32(DC_HPD2_INT_CONTROL, hpd2);
3960
	WREG32(DC_HPD3_INT_CONTROL, hpd3);
4575
	WREG32(DC_HPD3_INT_CONTROL, hpd3);
3961
	WREG32(DC_HPD4_INT_CONTROL, hpd4);
4576
	WREG32(DC_HPD4_INT_CONTROL, hpd4);
-
 
4577
	WREG32(DC_HPD5_INT_CONTROL, hpd5);
-
 
4578
	WREG32(DC_HPD6_INT_CONTROL, hpd6);
-
 
4579
	if (rdev->family == CHIP_ARUBA)
-
 
4580
		WREG32(TN_CG_THERMAL_INT_CTRL, thermal_int);
Line 3962... Line 4581...
3962
	WREG32(DC_HPD5_INT_CONTROL, hpd5);
4581
	else
3963
	WREG32(DC_HPD6_INT_CONTROL, hpd6);
4582
		WREG32(CG_THERMAL_INT, thermal_int);
3964
 
4583
 
3965
	WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, afmt1);
4584
	WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, afmt1);
Line 4138... Line 4757...
4138
			wptr, rdev->ih.rptr, (wptr + 16) + rdev->ih.ptr_mask);
4757
			wptr, rdev->ih.rptr, (wptr + 16) + rdev->ih.ptr_mask);
4139
		rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask;
4758
		rdev->ih.rptr = (wptr + 16) & rdev->ih.ptr_mask;
4140
		tmp = RREG32(IH_RB_CNTL);
4759
		tmp = RREG32(IH_RB_CNTL);
4141
		tmp |= IH_WPTR_OVERFLOW_CLEAR;
4760
		tmp |= IH_WPTR_OVERFLOW_CLEAR;
4142
		WREG32(IH_RB_CNTL, tmp);
4761
		WREG32(IH_RB_CNTL, tmp);
-
 
4762
		wptr &= ~RB_OVERFLOW;
4143
	}
4763
	}
4144
	return (wptr & rdev->ih.ptr_mask);
4764
	return (wptr & rdev->ih.ptr_mask);
4145
}
4765
}
Line 4146... Line 4766...
4146
 
4766
 
Line 4150... Line 4770...
4150
	u32 rptr;
4770
	u32 rptr;
4151
	u32 src_id, src_data;
4771
	u32 src_id, src_data;
4152
	u32 ring_index;
4772
	u32 ring_index;
4153
	bool queue_hotplug = false;
4773
	bool queue_hotplug = false;
4154
	bool queue_hdmi = false;
4774
	bool queue_hdmi = false;
-
 
4775
	bool queue_thermal = false;
-
 
4776
	u32 status, addr;
Line 4155... Line 4777...
4155
 
4777
 
4156
	if (!rdev->ih.enabled || rdev->shutdown)
4778
	if (!rdev->ih.enabled || rdev->shutdown)
Line 4157... Line 4779...
4157
		return IRQ_NONE;
4779
		return IRQ_NONE;
Line 4333... Line 4955...
4333
			default:
4955
			default:
4334
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
4956
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
4335
				break;
4957
				break;
4336
			}
4958
			}
4337
			break;
4959
			break;
-
 
4960
		case 8: /* D1 page flip */
-
 
4961
		case 10: /* D2 page flip */
-
 
4962
		case 12: /* D3 page flip */
-
 
4963
		case 14: /* D4 page flip */
-
 
4964
		case 16: /* D5 page flip */
-
 
4965
		case 18: /* D6 page flip */
-
 
4966
			DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
-
 
4967
			break;
4338
		case 42: /* HPD hotplug */
4968
		case 42: /* HPD hotplug */
4339
			switch (src_data) {
4969
			switch (src_data) {
4340
			case 0:
4970
			case 0:
4341
				if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) {
4971
				if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) {
4342
					rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT;
4972
					rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT;
Line 4436... Line 5066...
4436
			DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
5066
			DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
4437
			radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
5067
			radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
4438
			break;
5068
			break;
4439
		case 146:
5069
		case 146:
4440
		case 147:
5070
		case 147:
-
 
5071
			addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR);
-
 
5072
			status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS);
-
 
5073
			/* reset addr and status */
-
 
5074
			WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
-
 
5075
			if (addr == 0x0 && status == 0x0)
-
 
5076
				break;
4441
			dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data);
5077
			dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data);
4442
			dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
5078
			dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
4443
				RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR));
5079
				addr);
4444
			dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
5080
			dev_err(rdev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
4445
				RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS));
-
 
4446
			/* reset addr and status */
5081
				status);
4447
			WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
5082
			cayman_vm_decode_fault(rdev, status, addr);
4448
			break;
5083
			break;
4449
		case 176: /* CP_INT in ring buffer */
5084
		case 176: /* CP_INT in ring buffer */
4450
		case 177: /* CP_INT in IB1 */
5085
		case 177: /* CP_INT in IB1 */
4451
		case 178: /* CP_INT in IB2 */
5086
		case 178: /* CP_INT in IB2 */
4452
			DRM_DEBUG("IH: CP int: 0x%08x\n", src_data);
5087
			DRM_DEBUG("IH: CP int: 0x%08x\n", src_data);
Line 4471... Line 5106...
4471
			break;
5106
			break;
4472
		case 224: /* DMA trap event */
5107
		case 224: /* DMA trap event */
4473
			DRM_DEBUG("IH: DMA trap\n");
5108
			DRM_DEBUG("IH: DMA trap\n");
4474
			radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX);
5109
			radeon_fence_process(rdev, R600_RING_TYPE_DMA_INDEX);
4475
			break;
5110
			break;
-
 
5111
		case 230: /* thermal low to high */
-
 
5112
			DRM_DEBUG("IH: thermal low to high\n");
-
 
5113
			rdev->pm.dpm.thermal.high_to_low = false;
-
 
5114
			queue_thermal = true;
-
 
5115
			break;
-
 
5116
		case 231: /* thermal high to low */
-
 
5117
			DRM_DEBUG("IH: thermal high to low\n");
-
 
5118
			rdev->pm.dpm.thermal.high_to_low = true;
-
 
5119
			queue_thermal = true;
-
 
5120
			break;
4476
		case 233: /* GUI IDLE */
5121
		case 233: /* GUI IDLE */
4477
			DRM_DEBUG("IH: GUI idle\n");
5122
			DRM_DEBUG("IH: GUI idle\n");
4478
			break;
5123
			break;
4479
		case 244: /* DMA trap event */
5124
		case 244: /* DMA trap event */
4480
			if (rdev->family >= CHIP_CAYMAN) {
5125
			if (rdev->family >= CHIP_CAYMAN) {
Line 4501... Line 5146...
4501
		goto restart_ih;
5146
		goto restart_ih;
Line 4502... Line 5147...
4502
 
5147
 
4503
	return IRQ_HANDLED;
5148
	return IRQ_HANDLED;
Line 4504... Line -...
4504
}
-
 
4505
 
-
 
4506
/**
-
 
4507
 * evergreen_dma_fence_ring_emit - emit a fence on the DMA ring
-
 
4508
 *
-
 
4509
 * @rdev: radeon_device pointer
-
 
4510
 * @fence: radeon fence object
-
 
4511
 *
-
 
4512
 * Add a DMA fence packet to the ring to write
-
 
4513
 * the fence seq number and DMA trap packet to generate
-
 
4514
 * an interrupt if needed (evergreen-SI).
-
 
4515
 */
-
 
4516
void evergreen_dma_fence_ring_emit(struct radeon_device *rdev,
-
 
4517
				   struct radeon_fence *fence)
-
 
4518
{
-
 
4519
	struct radeon_ring *ring = &rdev->ring[fence->ring];
-
 
4520
	u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
-
 
4521
	/* write the fence */
-
 
4522
	radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_FENCE, 0, 0));
-
 
4523
	radeon_ring_write(ring, addr & 0xfffffffc);
-
 
4524
	radeon_ring_write(ring, (upper_32_bits(addr) & 0xff));
-
 
4525
	radeon_ring_write(ring, fence->seq);
-
 
4526
	/* generate an interrupt */
-
 
4527
	radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_TRAP, 0, 0));
-
 
4528
	/* flush HDP */
-
 
4529
	radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0));
-
 
4530
	radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2));
-
 
4531
	radeon_ring_write(ring, 1);
-
 
4532
}
-
 
4533
 
-
 
4534
/**
-
 
4535
 * evergreen_dma_ring_ib_execute - schedule an IB on the DMA engine
-
 
4536
 *
-
 
4537
 * @rdev: radeon_device pointer
-
 
4538
 * @ib: IB object to schedule
-
 
4539
 *
-
 
4540
 * Schedule an IB in the DMA ring (evergreen).
-
 
4541
 */
-
 
4542
void evergreen_dma_ring_ib_execute(struct radeon_device *rdev,
-
 
4543
				   struct radeon_ib *ib)
-
 
4544
{
-
 
4545
	struct radeon_ring *ring = &rdev->ring[ib->ring];
-
 
4546
 
-
 
4547
	if (rdev->wb.enabled) {
-
 
4548
		u32 next_rptr = ring->wptr + 4;
-
 
4549
		while ((next_rptr & 7) != 5)
-
 
4550
			next_rptr++;
-
 
4551
		next_rptr += 3;
-
 
4552
		radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 1));
-
 
4553
		radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
-
 
4554
		radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xff);
-
 
4555
		radeon_ring_write(ring, next_rptr);
-
 
4556
	}
-
 
4557
 
-
 
4558
	/* The indirect buffer packet must end on an 8 DW boundary in the DMA ring.
-
 
4559
	 * Pad as necessary with NOPs.
-
 
4560
	 */
-
 
4561
	while ((ring->wptr & 7) != 5)
-
 
4562
		radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_NOP, 0, 0));
-
 
4563
	radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_INDIRECT_BUFFER, 0, 0));
-
 
4564
	radeon_ring_write(ring, (ib->gpu_addr & 0xFFFFFFE0));
-
 
4565
	radeon_ring_write(ring, (ib->length_dw << 12) | (upper_32_bits(ib->gpu_addr) & 0xFF));
-
 
4566
 
-
 
4567
}
-
 
4568
 
-
 
4569
/**
-
 
4570
 * evergreen_copy_dma - copy pages using the DMA engine
-
 
4571
 *
-
 
4572
 * @rdev: radeon_device pointer
-
 
4573
 * @src_offset: src GPU address
-
 
4574
 * @dst_offset: dst GPU address
-
 
4575
 * @num_gpu_pages: number of GPU pages to xfer
-
 
4576
 * @fence: radeon fence object
-
 
4577
 *
-
 
4578
 * Copy GPU paging using the DMA engine (evergreen-cayman).
-
 
4579
 * Used by the radeon ttm implementation to move pages if
-
 
4580
 * registered as the asic copy callback.
-
 
4581
 */
-
 
4582
int evergreen_copy_dma(struct radeon_device *rdev,
-
 
4583
		       uint64_t src_offset, uint64_t dst_offset,
-
 
4584
		       unsigned num_gpu_pages,
-
 
4585
		       struct radeon_fence **fence)
-
 
4586
{
-
 
4587
	struct radeon_semaphore *sem = NULL;
-
 
4588
	int ring_index = rdev->asic->copy.dma_ring_index;
-
 
4589
	struct radeon_ring *ring = &rdev->ring[ring_index];
-
 
4590
	u32 size_in_dw, cur_size_in_dw;
-
 
4591
	int i, num_loops;
-
 
4592
	int r = 0;
-
 
4593
 
-
 
4594
	r = radeon_semaphore_create(rdev, &sem);
-
 
4595
	if (r) {
-
 
4596
		DRM_ERROR("radeon: moving bo (%d).\n", r);
-
 
4597
		return r;
-
 
4598
	}
-
 
4599
 
-
 
4600
	size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4;
-
 
4601
	num_loops = DIV_ROUND_UP(size_in_dw, 0xfffff);
-
 
4602
	r = radeon_ring_lock(rdev, ring, num_loops * 5 + 11);
-
 
4603
	if (r) {
-
 
4604
		DRM_ERROR("radeon: moving bo (%d).\n", r);
-
 
4605
		radeon_semaphore_free(rdev, &sem, NULL);
-
 
4606
		return r;
-
 
4607
	}
-
 
4608
 
-
 
4609
	if (radeon_fence_need_sync(*fence, ring->idx)) {
-
 
4610
		radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
-
 
4611
					    ring->idx);
-
 
4612
		radeon_fence_note_sync(*fence, ring->idx);
-
 
4613
	} else {
-
 
4614
		radeon_semaphore_free(rdev, &sem, NULL);
-
 
4615
	}
-
 
4616
 
-
 
4617
	for (i = 0; i < num_loops; i++) {
-
 
4618
		cur_size_in_dw = size_in_dw;
-
 
4619
		if (cur_size_in_dw > 0xFFFFF)
-
 
4620
			cur_size_in_dw = 0xFFFFF;
-
 
4621
		size_in_dw -= cur_size_in_dw;
-
 
4622
		radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, cur_size_in_dw));
-
 
4623
		radeon_ring_write(ring, dst_offset & 0xfffffffc);
-
 
4624
		radeon_ring_write(ring, src_offset & 0xfffffffc);
-
 
4625
		radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
-
 
4626
		radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff);
-
 
4627
		src_offset += cur_size_in_dw * 4;
-
 
4628
		dst_offset += cur_size_in_dw * 4;
-
 
4629
	}
-
 
4630
 
-
 
4631
	r = radeon_fence_emit(rdev, fence, ring->idx);
-
 
4632
	if (r) {
-
 
4633
		radeon_ring_unlock_undo(rdev, ring);
-
 
4634
		return r;
-
 
4635
	}
-
 
4636
 
-
 
4637
	radeon_ring_unlock_commit(rdev, ring);
-
 
4638
	radeon_semaphore_free(rdev, &sem, *fence);
-
 
4639
 
-
 
4640
	return r;
-
 
4641
}
5149
}
4642
 
5150
 
4643
static int evergreen_startup(struct radeon_device *rdev)
5151
static int evergreen_startup(struct radeon_device *rdev)
4644
{
5152
{
Line 4645... Line 5153...
4645
	struct radeon_ring *ring;
5153
	struct radeon_ring *ring;
4646
	int r;
5154
	int r;
-
 
5155
 
-
 
5156
	/* enable pcie gen2 link */
Line 4647... Line -...
4647
 
-
 
4648
	/* enable pcie gen2 link */
5157
	evergreen_pcie_gen2_enable(rdev);
4649
	evergreen_pcie_gen2_enable(rdev);
5158
	/* enable aspm */
4650
 
5159
	evergreen_program_aspm(rdev);
4651
	if (ASIC_IS_DCE5(rdev)) {
-
 
4652
		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
5160
 
4653
			r = ni_init_microcode(rdev);
5161
	/* scratch needs to be initialized before MC */
-
 
5162
	r = r600_vram_scratch_init(rdev);
4654
			if (r) {
5163
	if (r)
-
 
5164
		return r;
4655
				DRM_ERROR("Failed to load firmware!\n");
5165
 
4656
				return r;
5166
	evergreen_mc_program(rdev);
4657
			}
5167
 
4658
		}
5168
	if (ASIC_IS_DCE5(rdev) && !rdev->pm.dpm_enabled) {
4659
		r = ni_mc_load_microcode(rdev);
5169
		r = ni_mc_load_microcode(rdev);
4660
		if (r) {
-
 
4661
			DRM_ERROR("Failed to load MC firmware!\n");
-
 
4662
			return r;
-
 
4663
		}
-
 
4664
	} else {
-
 
4665
		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
-
 
4666
			r = r600_init_microcode(rdev);
-
 
4667
			if (r) {
-
 
4668
				DRM_ERROR("Failed to load firmware!\n");
5170
		if (r) {
Line 4669... Line -...
4669
				return r;
-
 
4670
			}
-
 
4671
		}
-
 
4672
	}
-
 
4673
 
-
 
4674
	r = r600_vram_scratch_init(rdev);
5171
			DRM_ERROR("Failed to load MC firmware!\n");
4675
	if (r)
5172
			return r;
4676
		return r;
5173
		}
4677
 
5174
	}
4678
	evergreen_mc_program(rdev);
5175
 
4679
	if (rdev->flags & RADEON_IS_AGP) {
5176
	if (rdev->flags & RADEON_IS_AGP) {
4680
		evergreen_agp_enable(rdev);
5177
		evergreen_agp_enable(rdev);
4681
	} else {
5178
	} else {
Line -... Line 5179...
-
 
5179
		r = evergreen_pcie_gart_enable(rdev);
-
 
5180
		if (r)
-
 
5181
			return r;
-
 
5182
	}
-
 
5183
	evergreen_gpu_init(rdev);
-
 
5184
 
4682
		r = evergreen_pcie_gart_enable(rdev);
5185
	/* allocate rlc buffers */
4683
		if (r)
5186
	if (rdev->flags & RADEON_IS_IGP) {
4684
			return r;
5187
		rdev->rlc.reg_list = sumo_rlc_save_restore_register_list;
4685
	}
5188
		rdev->rlc.reg_list_size =
4686
	evergreen_gpu_init(rdev);
-
 
-
 
5189
			(u32)ARRAY_SIZE(sumo_rlc_save_restore_register_list);
4687
 
5190
		rdev->rlc.cs_data = evergreen_cs_data;
Line 4688... Line 5191...
4688
	r = evergreen_blit_init(rdev);
5191
		r = sumo_rlc_init(rdev);
4689
	if (r) {
5192
	if (r) {
4690
//       r600_blit_fini(rdev);
5193
			DRM_ERROR("Failed to init rlc BOs!\n");
Line 4715... Line 5218...
4715
//                          R600_RING_TYPE_UVD_INDEX);
5218
//                          R600_RING_TYPE_UVD_INDEX);
4716
//       if (r)
5219
//       if (r)
4717
//           dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
5220
//           dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
4718
//   }
5221
//   }
Line 4719... Line 5222...
4719
 
5222
 
4720
//   if (r)
5223
	if (r)
Line 4721... Line 5224...
4721
//       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
5224
		rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
4722
 
5225
 
4723
	/* Enable IRQ */
5226
	/* Enable IRQ */
4724
	if (!rdev->irq.installed) {
5227
	if (!rdev->irq.installed) {
Line 4735... Line 5238...
4735
	}
5238
	}
4736
	evergreen_irq_set(rdev);
5239
	evergreen_irq_set(rdev);
Line 4737... Line 5240...
4737
 
5240
 
4738
	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
5241
	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
4739
	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
-
 
4740
			     R600_CP_RB_RPTR, R600_CP_RB_WPTR,
5242
	r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
4741
			     0, 0xfffff, RADEON_CP_PACKET2);
5243
			     RADEON_CP_PACKET2);
4742
	if (r)
5244
	if (r)
Line 4743... Line 5245...
4743
		return r;
5245
		return r;
4744
 
5246
 
4745
	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
-
 
4746
	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
5247
	ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
4747
			     DMA_RB_RPTR, DMA_RB_WPTR,
5248
	r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
4748
			     2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0));
5249
			     DMA_PACKET(DMA_PACKET_NOP, 0, 0));
Line 4749... Line 5250...
4749
	if (r)
5250
	if (r)
4750
		return r;
5251
		return r;
Line 4757... Line 5258...
4757
		return r;
5258
		return r;
4758
	r = r600_dma_resume(rdev);
5259
	r = r600_dma_resume(rdev);
4759
	if (r)
5260
	if (r)
4760
		return r;
5261
		return r;
Line 4761... Line -...
4761
 
-
 
4762
	ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
-
 
4763
	if (ring->ring_size) {
-
 
4764
		r = radeon_ring_init(rdev, ring, ring->ring_size,
-
 
4765
				     R600_WB_UVD_RPTR_OFFSET,
-
 
4766
				     UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR,
-
 
4767
				     0, 0xfffff, RADEON_CP_PACKET2);
-
 
4768
		if (!r)
-
 
4769
			r = r600_uvd_init(rdev);
-
 
4770
 
-
 
4771
		if (r)
-
 
4772
			DRM_ERROR("radeon: error initializing UVD (%d).\n", r);
-
 
Line 4773... Line 5262...
4773
	}
5262
 
4774
 
5263
 
4775
	r = radeon_ib_pool_init(rdev);
5264
	r = radeon_ib_pool_init(rdev);
4776
	if (r) {
5265
	if (r) {
Line 4781... Line 5270...
4781
	return 0;
5270
	return 0;
4782
}
5271
}
Line 4783... Line -...
4783
 
-
 
4784
 
-
 
4785
 
-
 
4786
#if 0
-
 
4787
 
-
 
4788
int evergreen_copy_blit(struct radeon_device *rdev,
-
 
4789
			uint64_t src_offset, uint64_t dst_offset,
-
 
4790
			unsigned num_pages, struct radeon_fence *fence)
-
 
4791
{
-
 
4792
	int r;
-
 
4793
 
-
 
4794
	mutex_lock(&rdev->r600_blit.mutex);
-
 
4795
	rdev->r600_blit.vb_ib = NULL;
-
 
4796
	r = evergreen_blit_prepare_copy(rdev, num_pages * RADEON_GPU_PAGE_SIZE);
-
 
4797
	if (r) {
-
 
4798
		if (rdev->r600_blit.vb_ib)
-
 
4799
			radeon_ib_free(rdev, &rdev->r600_blit.vb_ib);
-
 
4800
		mutex_unlock(&rdev->r600_blit.mutex);
-
 
4801
		return r;
-
 
4802
	}
-
 
4803
	evergreen_kms_blit_copy(rdev, src_offset, dst_offset, num_pages * RADEON_GPU_PAGE_SIZE);
-
 
4804
	evergreen_blit_done_copy(rdev, fence);
-
 
4805
	mutex_unlock(&rdev->r600_blit.mutex);
-
 
Line 4806... Line 5272...
4806
	return 0;
5272
 
4807
}
5273
 
4808
#endif
5274
 
4809
 
5275
 
Line 4869... Line 5335...
4869
	/* Memory manager */
5335
	/* Memory manager */
4870
	r = radeon_bo_init(rdev);
5336
	r = radeon_bo_init(rdev);
4871
	if (r)
5337
	if (r)
4872
		return r;
5338
		return r;
Line -... Line 5339...
-
 
5339
 
-
 
5340
	if (ASIC_IS_DCE5(rdev)) {
-
 
5341
		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
-
 
5342
			r = ni_init_microcode(rdev);
-
 
5343
			if (r) {
-
 
5344
				DRM_ERROR("Failed to load firmware!\n");
-
 
5345
				return r;
-
 
5346
			}
-
 
5347
		}
-
 
5348
	} else {
-
 
5349
		if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
-
 
5350
			r = r600_init_microcode(rdev);
-
 
5351
			if (r) {
-
 
5352
				DRM_ERROR("Failed to load firmware!\n");
-
 
5353
				return r;
-
 
5354
			}
-
 
5355
		}
-
 
5356
	}
-
 
5357
 
-
 
5358
	/* Initialize power management */
-
 
5359
	radeon_pm_init(rdev);
4873
 
5360
 
4874
	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
5361
	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
Line 4875... Line 5362...
4875
	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
5362
	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
4876
 
5363
 
Line 4973... Line 5460...
4973
		else
5460
		else
4974
			link_width_cntl &= ~LC_UPCONFIGURE_DIS;
5461
			link_width_cntl &= ~LC_UPCONFIGURE_DIS;
4975
		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
5462
		WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
4976
	}
5463
	}
4977
}
5464
}
-
 
5465
 
-
 
5466
void evergreen_program_aspm(struct radeon_device *rdev)
-
 
5467
{
-
 
5468
	u32 data, orig;
-
 
5469
	u32 pcie_lc_cntl, pcie_lc_cntl_old;
-
 
5470
	bool disable_l0s, disable_l1 = false, disable_plloff_in_l1 = false;
-
 
5471
	/* fusion_platform = true
-
 
5472
	 * if the system is a fusion system
-
 
5473
	 * (APU or DGPU in a fusion system).
-
 
5474
	 * todo: check if the system is a fusion platform.
-
 
5475
	 */
-
 
5476
	bool fusion_platform = false;
-
 
5477
 
-
 
5478
	if (radeon_aspm == 0)
-
 
5479
		return;
-
 
5480
 
-
 
5481
	if (!(rdev->flags & RADEON_IS_PCIE))
-
 
5482
		return;
-
 
5483
 
-
 
5484
	switch (rdev->family) {
-
 
5485
	case CHIP_CYPRESS:
-
 
5486
	case CHIP_HEMLOCK:
-
 
5487
	case CHIP_JUNIPER:
-
 
5488
	case CHIP_REDWOOD:
-
 
5489
	case CHIP_CEDAR:
-
 
5490
	case CHIP_SUMO:
-
 
5491
	case CHIP_SUMO2:
-
 
5492
	case CHIP_PALM:
-
 
5493
	case CHIP_ARUBA:
-
 
5494
		disable_l0s = true;
-
 
5495
		break;
-
 
5496
	default:
-
 
5497
		disable_l0s = false;
-
 
5498
		break;
-
 
5499
	}
-
 
5500
 
-
 
5501
	if (rdev->flags & RADEON_IS_IGP)
-
 
5502
		fusion_platform = true; /* XXX also dGPUs in a fusion system */
-
 
5503
 
-
 
5504
	data = orig = RREG32_PIF_PHY0(PB0_PIF_PAIRING);
-
 
5505
	if (fusion_platform)
-
 
5506
		data &= ~MULTI_PIF;
-
 
5507
	else
-
 
5508
		data |= MULTI_PIF;
-
 
5509
	if (data != orig)
-
 
5510
		WREG32_PIF_PHY0(PB0_PIF_PAIRING, data);
-
 
5511
 
-
 
5512
	data = orig = RREG32_PIF_PHY1(PB1_PIF_PAIRING);
-
 
5513
	if (fusion_platform)
-
 
5514
		data &= ~MULTI_PIF;
-
 
5515
	else
-
 
5516
		data |= MULTI_PIF;
-
 
5517
	if (data != orig)
-
 
5518
		WREG32_PIF_PHY1(PB1_PIF_PAIRING, data);
-
 
5519
 
-
 
5520
	pcie_lc_cntl = pcie_lc_cntl_old = RREG32_PCIE_PORT(PCIE_LC_CNTL);
-
 
5521
	pcie_lc_cntl &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
-
 
5522
	if (!disable_l0s) {
-
 
5523
		if (rdev->family >= CHIP_BARTS)
-
 
5524
			pcie_lc_cntl |= LC_L0S_INACTIVITY(7);
-
 
5525
		else
-
 
5526
			pcie_lc_cntl |= LC_L0S_INACTIVITY(3);
-
 
5527
	}
-
 
5528
 
-
 
5529
	if (!disable_l1) {
-
 
5530
		if (rdev->family >= CHIP_BARTS)
-
 
5531
			pcie_lc_cntl |= LC_L1_INACTIVITY(7);
-
 
5532
		else
-
 
5533
			pcie_lc_cntl |= LC_L1_INACTIVITY(8);
-
 
5534
 
-
 
5535
		if (!disable_plloff_in_l1) {
-
 
5536
			data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0);
-
 
5537
			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
-
 
5538
			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
-
 
5539
			if (data != orig)
-
 
5540
				WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data);
-
 
5541
 
-
 
5542
			data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1);
-
 
5543
			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
-
 
5544
			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
-
 
5545
			if (data != orig)
-
 
5546
				WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data);
-
 
5547
 
-
 
5548
			data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0);
-
 
5549
			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
-
 
5550
			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
-
 
5551
			if (data != orig)
-
 
5552
				WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data);
-
 
5553
 
-
 
5554
			data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1);
-
 
5555
			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
-
 
5556
			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
-
 
5557
			if (data != orig)
-
 
5558
				WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data);
-
 
5559
 
-
 
5560
			if (rdev->family >= CHIP_BARTS) {
-
 
5561
				data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0);
-
 
5562
				data &= ~PLL_RAMP_UP_TIME_0_MASK;
-
 
5563
				data |= PLL_RAMP_UP_TIME_0(4);
-
 
5564
				if (data != orig)
-
 
5565
					WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_0, data);
-
 
5566
 
-
 
5567
				data = orig = RREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1);
-
 
5568
				data &= ~PLL_RAMP_UP_TIME_1_MASK;
-
 
5569
				data |= PLL_RAMP_UP_TIME_1(4);
-
 
5570
				if (data != orig)
-
 
5571
					WREG32_PIF_PHY0(PB0_PIF_PWRDOWN_1, data);
-
 
5572
 
-
 
5573
				data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0);
-
 
5574
				data &= ~PLL_RAMP_UP_TIME_0_MASK;
-
 
5575
				data |= PLL_RAMP_UP_TIME_0(4);
-
 
5576
				if (data != orig)
-
 
5577
					WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_0, data);
-
 
5578
 
-
 
5579
				data = orig = RREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1);
-
 
5580
				data &= ~PLL_RAMP_UP_TIME_1_MASK;
-
 
5581
				data |= PLL_RAMP_UP_TIME_1(4);
-
 
5582
				if (data != orig)
-
 
5583
					WREG32_PIF_PHY1(PB1_PIF_PWRDOWN_1, data);
-
 
5584
			}
-
 
5585
 
-
 
5586
			data = orig = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
-
 
5587
			data &= ~LC_DYN_LANES_PWR_STATE_MASK;
-
 
5588
			data |= LC_DYN_LANES_PWR_STATE(3);
-
 
5589
			if (data != orig)
-
 
5590
				WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
-
 
5591
 
-
 
5592
			if (rdev->family >= CHIP_BARTS) {
-
 
5593
				data = orig = RREG32_PIF_PHY0(PB0_PIF_CNTL);
-
 
5594
				data &= ~LS2_EXIT_TIME_MASK;
-
 
5595
				data |= LS2_EXIT_TIME(1);
-
 
5596
				if (data != orig)
-
 
5597
					WREG32_PIF_PHY0(PB0_PIF_CNTL, data);
-
 
5598
 
-
 
5599
				data = orig = RREG32_PIF_PHY1(PB1_PIF_CNTL);
-
 
5600
				data &= ~LS2_EXIT_TIME_MASK;
-
 
5601
				data |= LS2_EXIT_TIME(1);
-
 
5602
				if (data != orig)
-
 
5603
					WREG32_PIF_PHY1(PB1_PIF_CNTL, data);
-
 
5604
			}
-
 
5605
		}
-
 
5606
	}
-
 
5607
 
-
 
5608
	/* evergreen parts only */
-
 
5609
	if (rdev->family < CHIP_BARTS)
-
 
5610
		pcie_lc_cntl |= LC_PMI_TO_L1_DIS;
-
 
5611
 
-
 
5612
	if (pcie_lc_cntl != pcie_lc_cntl_old)
-
 
5613
		WREG32_PCIE_PORT(PCIE_LC_CNTL, pcie_lc_cntl);
-
 
5614
}