Subversion Repositories Kolibri OS

Rev

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

Rev 5271 Rev 6104
Line 25... Line 25...
25
#include 
25
#include 
26
#include 
26
#include 
27
#include 
27
#include 
28
#include "radeon.h"
28
#include "radeon.h"
29
#include "radeon_asic.h"
29
#include "radeon_asic.h"
-
 
30
#include "radeon_audio.h"
30
#include 
31
#include 
31
#include "sid.h"
32
#include "sid.h"
32
#include "atom.h"
33
#include "atom.h"
33
#include "si_blit_shaders.h"
34
#include "si_blit_shaders.h"
34
#include "clearstate_si.h"
35
#include "clearstate_si.h"
Line 1261... Line 1262...
1261
	default:
1262
	default:
1262
		break;
1263
		break;
1263
	}
1264
	}
1264
}
1265
}
Line -... Line 1266...
-
 
1266
 
-
 
1267
/**
-
 
1268
 * si_get_allowed_info_register - fetch the register for the info ioctl
-
 
1269
 *
-
 
1270
 * @rdev: radeon_device pointer
-
 
1271
 * @reg: register offset in bytes
-
 
1272
 * @val: register value
-
 
1273
 *
-
 
1274
 * Returns 0 for success or -EINVAL for an invalid register
-
 
1275
 *
-
 
1276
 */
-
 
1277
int si_get_allowed_info_register(struct radeon_device *rdev,
-
 
1278
				 u32 reg, u32 *val)
-
 
1279
{
-
 
1280
	switch (reg) {
-
 
1281
	case GRBM_STATUS:
-
 
1282
	case GRBM_STATUS2:
-
 
1283
	case GRBM_STATUS_SE0:
-
 
1284
	case GRBM_STATUS_SE1:
-
 
1285
	case SRBM_STATUS:
-
 
1286
	case SRBM_STATUS2:
-
 
1287
	case (DMA_STATUS_REG + DMA0_REGISTER_OFFSET):
-
 
1288
	case (DMA_STATUS_REG + DMA1_REGISTER_OFFSET):
-
 
1289
	case UVD_STATUS:
-
 
1290
		*val = RREG32(reg);
-
 
1291
		return 0;
-
 
1292
	default:
-
 
1293
		return -EINVAL;
-
 
1294
	}
-
 
1295
}
1265
 
1296
 
1266
#define PCIE_BUS_CLK                10000
1297
#define PCIE_BUS_CLK                10000
Line 1267... Line 1298...
1267
#define TCLK                        (PCIE_BUS_CLK / 10)
1298
#define TCLK                        (PCIE_BUS_CLK / 10)
1268
 
1299
 
Line 2343... Line 2374...
2343
		c.full = dfixed_div(c, a);
2374
		c.full = dfixed_div(c, a);
2344
		a.full = dfixed_const(16);
2375
		a.full = dfixed_const(16);
2345
		c.full = dfixed_div(c, a);
2376
		c.full = dfixed_div(c, a);
2346
		priority_b_mark = dfixed_trunc(c);
2377
		priority_b_mark = dfixed_trunc(c);
2347
		priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK;
2378
		priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK;
-
 
2379
 
-
 
2380
		/* Save number of lines the linebuffer leads before the scanout */
-
 
2381
		radeon_crtc->lb_vblank_lead_lines = DIV_ROUND_UP(lb_size, mode->crtc_hdisplay);
2348
	}
2382
	}
Line 2349... Line 2383...
2349
 
2383
 
2350
	/* select wm A */
2384
	/* select wm A */
2351
	arb_control3 = RREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset);
2385
	arb_control3 = RREG32(DPG_PIPE_ARBITRATION_CONTROL3 + radeon_crtc->crtc_offset);
Line 3159... Line 3193...
3159
		WREG32((0x2c20 + j), 0x00000000);
3193
		WREG32((0x2c20 + j), 0x00000000);
3160
		WREG32((0x2c24 + j), 0x00000000);
3194
		WREG32((0x2c24 + j), 0x00000000);
3161
	}
3195
	}
Line 3162... Line 3196...
3162
 
3196
 
-
 
3197
	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
-
 
3198
	WREG32(SRBM_INT_CNTL, 1);
Line 3163... Line 3199...
3163
	WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
3199
	WREG32(SRBM_INT_ACK, 1);
Line 3164... Line 3200...
3164
 
3200
 
Line 4283... Line 4319...
4283
	WREG32(0x15DC, 0);
4319
	WREG32(0x15DC, 0);
Line 4284... Line 4320...
4284
 
4320
 
4285
	/* empty context1-15 */
4321
	/* empty context1-15 */
4286
	/* set vm size, must be a multiple of 4 */
4322
	/* set vm size, must be a multiple of 4 */
4287
	WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
4323
	WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
4288
	WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn);
4324
	WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn - 1);
4289
	/* Assign the pt base to something valid for now; the pts used for
4325
	/* Assign the pt base to something valid for now; the pts used for
4290
	 * the VMs are determined by the application and setup and assigned
4326
	 * the VMs are determined by the application and setup and assigned
4291
	 * on the fly in the vm part of radeon_gart.c
4327
	 * on the fly in the vm part of radeon_gart.c
4292
	 */
4328
	 */
Line 4358... Line 4394...
4358
 
4394
 
4359
static void si_pcie_gart_fini(struct radeon_device *rdev)
4395
static void si_pcie_gart_fini(struct radeon_device *rdev)
4360
{
4396
{
4361
	si_pcie_gart_disable(rdev);
4397
	si_pcie_gart_disable(rdev);
4362
	radeon_gart_table_vram_free(rdev);
4398
	radeon_gart_table_vram_free(rdev);
4363
//   radeon_gart_fini(rdev);
4399
	radeon_gart_fini(rdev);
Line 4364... Line 4400...
4364
}
4400
}
4365
 
4401
 
4366
/* vm parser */
4402
/* vm parser */
Line 4696... Line 4732...
4696
		pkt.count = RADEON_CP_PACKET_GET_COUNT(ib->ptr[idx]);
4732
		pkt.count = RADEON_CP_PACKET_GET_COUNT(ib->ptr[idx]);
4697
		pkt.one_reg_wr = 0;
4733
		pkt.one_reg_wr = 0;
4698
		switch (pkt.type) {
4734
		switch (pkt.type) {
4699
		case RADEON_PACKET_TYPE0:
4735
		case RADEON_PACKET_TYPE0:
4700
			dev_err(rdev->dev, "Packet0 not allowed!\n");
4736
			dev_err(rdev->dev, "Packet0 not allowed!\n");
4701
			for (i = 0; i < ib->length_dw; i++) {
-
 
4702
				if (i == idx)
-
 
4703
					printk("\t0x%08x <---\n", ib->ptr[i]);
-
 
4704
				else
-
 
4705
					printk("\t0x%08x\n", ib->ptr[i]);
-
 
4706
			}
-
 
4707
			ret = -EINVAL;
4737
			ret = -EINVAL;
4708
			break;
4738
			break;
4709
		case RADEON_PACKET_TYPE2:
4739
		case RADEON_PACKET_TYPE2:
4710
			idx += 1;
4740
			idx += 1;
4711
			break;
4741
			break;
Line 4733... Line 4763...
4733
		default:
4763
		default:
4734
			dev_err(rdev->dev, "Unknown packet type %d !\n", pkt.type);
4764
			dev_err(rdev->dev, "Unknown packet type %d !\n", pkt.type);
4735
			ret = -EINVAL;
4765
			ret = -EINVAL;
4736
			break;
4766
			break;
4737
		}
4767
		}
4738
		if (ret)
4768
		if (ret) {
-
 
4769
			for (i = 0; i < ib->length_dw; i++) {
-
 
4770
				if (i == idx)
-
 
4771
					printk("\t0x%08x <---\n", ib->ptr[i]);
-
 
4772
				else
-
 
4773
					printk("\t0x%08x\n", ib->ptr[i]);
-
 
4774
			}
4739
			break;
4775
			break;
-
 
4776
		}
4740
	} while (idx < ib->length_dw);
4777
	} while (idx < ib->length_dw);
Line 4741... Line 4778...
4741
 
4778
 
4742
	return ret;
4779
	return ret;
Line 5055... Line 5092...
5055
				 WRITE_DATA_DST_SEL(0)));
5092
				 WRITE_DATA_DST_SEL(0)));
5056
	radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
5093
	radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
5057
	radeon_ring_write(ring, 0);
5094
	radeon_ring_write(ring, 0);
5058
	radeon_ring_write(ring, 1 << vm_id);
5095
	radeon_ring_write(ring, 1 << vm_id);
Line -... Line 5096...
-
 
5096
 
-
 
5097
	/* wait for the invalidate to complete */
-
 
5098
	radeon_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
-
 
5099
	radeon_ring_write(ring, (WAIT_REG_MEM_FUNCTION(0) |  /* always */
-
 
5100
				 WAIT_REG_MEM_ENGINE(0))); /* me */
-
 
5101
	radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
-
 
5102
	radeon_ring_write(ring, 0);
-
 
5103
	radeon_ring_write(ring, 0); /* ref */
-
 
5104
	radeon_ring_write(ring, 0); /* mask */
-
 
5105
	radeon_ring_write(ring, 0x20); /* poll interval */
5059
 
5106
 
5060
	/* sync PFP to ME, otherwise we might get invalid PFP reads */
5107
	/* sync PFP to ME, otherwise we might get invalid PFP reads */
5061
	radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
5108
	radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
5062
	radeon_ring_write(ring, 0x0);
5109
	radeon_ring_write(ring, 0x0);
Line 5897... Line 5944...
5897
	tmp = RREG32(DMA_CNTL + DMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
5944
	tmp = RREG32(DMA_CNTL + DMA0_REGISTER_OFFSET) & ~TRAP_ENABLE;
5898
	WREG32(DMA_CNTL + DMA0_REGISTER_OFFSET, tmp);
5945
	WREG32(DMA_CNTL + DMA0_REGISTER_OFFSET, tmp);
5899
	tmp = RREG32(DMA_CNTL + DMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
5946
	tmp = RREG32(DMA_CNTL + DMA1_REGISTER_OFFSET) & ~TRAP_ENABLE;
5900
	WREG32(DMA_CNTL + DMA1_REGISTER_OFFSET, tmp);
5947
	WREG32(DMA_CNTL + DMA1_REGISTER_OFFSET, tmp);
5901
	WREG32(GRBM_INT_CNTL, 0);
5948
	WREG32(GRBM_INT_CNTL, 0);
-
 
5949
	WREG32(SRBM_INT_CNTL, 0);
5902
	if (rdev->num_crtc >= 2) {
5950
	if (rdev->num_crtc >= 2) {
5903
	WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
5951
		WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
5904
	WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
5952
		WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
5905
	}
5953
	}
5906
	if (rdev->num_crtc >= 4) {
5954
	if (rdev->num_crtc >= 4) {
Line 6038... Line 6086...
6038
 
6086
 
6039
	cp_int_cntl = RREG32(CP_INT_CNTL_RING0) &
6087
	cp_int_cntl = RREG32(CP_INT_CNTL_RING0) &
Line 6040... Line 6088...
6040
		(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
6088
		(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
6041
 
6089
 
6042
	if (!ASIC_IS_NODCE(rdev)) {
6090
	if (!ASIC_IS_NODCE(rdev)) {
6043
	hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN;
6091
		hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
6044
	hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN;
6092
		hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
6045
	hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN;
6093
		hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
6046
	hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN;
6094
		hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
6047
	hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN;
6095
		hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
Line 6048... Line 6096...
6048
	hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN;
6096
		hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
6049
	}
6097
	}
Line 6106... Line 6154...
6106
		DRM_DEBUG("si_irq_set: vblank 5\n");
6154
		DRM_DEBUG("si_irq_set: vblank 5\n");
6107
		crtc6 |= VBLANK_INT_MASK;
6155
		crtc6 |= VBLANK_INT_MASK;
6108
	}
6156
	}
6109
	if (rdev->irq.hpd[0]) {
6157
	if (rdev->irq.hpd[0]) {
6110
		DRM_DEBUG("si_irq_set: hpd 1\n");
6158
		DRM_DEBUG("si_irq_set: hpd 1\n");
6111
		hpd1 |= DC_HPDx_INT_EN;
6159
		hpd1 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
6112
	}
6160
	}
6113
	if (rdev->irq.hpd[1]) {
6161
	if (rdev->irq.hpd[1]) {
6114
		DRM_DEBUG("si_irq_set: hpd 2\n");
6162
		DRM_DEBUG("si_irq_set: hpd 2\n");
6115
		hpd2 |= DC_HPDx_INT_EN;
6163
		hpd2 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
6116
	}
6164
	}
6117
	if (rdev->irq.hpd[2]) {
6165
	if (rdev->irq.hpd[2]) {
6118
		DRM_DEBUG("si_irq_set: hpd 3\n");
6166
		DRM_DEBUG("si_irq_set: hpd 3\n");
6119
		hpd3 |= DC_HPDx_INT_EN;
6167
		hpd3 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
6120
	}
6168
	}
6121
	if (rdev->irq.hpd[3]) {
6169
	if (rdev->irq.hpd[3]) {
6122
		DRM_DEBUG("si_irq_set: hpd 4\n");
6170
		DRM_DEBUG("si_irq_set: hpd 4\n");
6123
		hpd4 |= DC_HPDx_INT_EN;
6171
		hpd4 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
6124
	}
6172
	}
6125
	if (rdev->irq.hpd[4]) {
6173
	if (rdev->irq.hpd[4]) {
6126
		DRM_DEBUG("si_irq_set: hpd 5\n");
6174
		DRM_DEBUG("si_irq_set: hpd 5\n");
6127
		hpd5 |= DC_HPDx_INT_EN;
6175
		hpd5 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
6128
	}
6176
	}
6129
	if (rdev->irq.hpd[5]) {
6177
	if (rdev->irq.hpd[5]) {
6130
		DRM_DEBUG("si_irq_set: hpd 6\n");
6178
		DRM_DEBUG("si_irq_set: hpd 6\n");
6131
		hpd6 |= DC_HPDx_INT_EN;
6179
		hpd6 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN;
6132
	}
6180
	}
Line 6133... Line 6181...
6133
 
6181
 
6134
	WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
6182
	WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
6135
	WREG32(CP_INT_CNTL_RING1, cp_int_cntl1);
6183
	WREG32(CP_INT_CNTL_RING1, cp_int_cntl1);
Line 6186... Line 6234...
6186
	WREG32(DC_HPD6_INT_CONTROL, hpd6);
6234
		WREG32(DC_HPD6_INT_CONTROL, hpd6);
6187
	}
6235
	}
Line 6188... Line 6236...
6188
 
6236
 
Line -... Line 6237...
-
 
6237
	WREG32(CG_THERMAL_INT, thermal_int);
-
 
6238
 
-
 
6239
	/* posting read */
6189
	WREG32(CG_THERMAL_INT, thermal_int);
6240
	RREG32(SRBM_STATUS);
6190
 
6241
 
Line 6191... Line 6242...
6191
	return 0;
6242
	return 0;
6192
}
6243
}
Line 6286... Line 6337...
6286
	if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) {
6337
	if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) {
6287
		tmp = RREG32(DC_HPD5_INT_CONTROL);
6338
		tmp = RREG32(DC_HPD5_INT_CONTROL);
6288
		tmp |= DC_HPDx_INT_ACK;
6339
		tmp |= DC_HPDx_INT_ACK;
6289
		WREG32(DC_HPD6_INT_CONTROL, tmp);
6340
		WREG32(DC_HPD6_INT_CONTROL, tmp);
6290
	}
6341
	}
-
 
6342
 
-
 
6343
	if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT) {
-
 
6344
		tmp = RREG32(DC_HPD1_INT_CONTROL);
-
 
6345
		tmp |= DC_HPDx_RX_INT_ACK;
-
 
6346
		WREG32(DC_HPD1_INT_CONTROL, tmp);
-
 
6347
	}
-
 
6348
	if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT) {
-
 
6349
		tmp = RREG32(DC_HPD2_INT_CONTROL);
-
 
6350
		tmp |= DC_HPDx_RX_INT_ACK;
-
 
6351
		WREG32(DC_HPD2_INT_CONTROL, tmp);
-
 
6352
	}
-
 
6353
	if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT) {
-
 
6354
		tmp = RREG32(DC_HPD3_INT_CONTROL);
-
 
6355
		tmp |= DC_HPDx_RX_INT_ACK;
-
 
6356
		WREG32(DC_HPD3_INT_CONTROL, tmp);
-
 
6357
	}
-
 
6358
	if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT) {
-
 
6359
		tmp = RREG32(DC_HPD4_INT_CONTROL);
-
 
6360
		tmp |= DC_HPDx_RX_INT_ACK;
-
 
6361
		WREG32(DC_HPD4_INT_CONTROL, tmp);
-
 
6362
	}
-
 
6363
	if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT) {
-
 
6364
		tmp = RREG32(DC_HPD5_INT_CONTROL);
-
 
6365
		tmp |= DC_HPDx_RX_INT_ACK;
-
 
6366
		WREG32(DC_HPD5_INT_CONTROL, tmp);
-
 
6367
	}
-
 
6368
	if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) {
-
 
6369
		tmp = RREG32(DC_HPD5_INT_CONTROL);
-
 
6370
		tmp |= DC_HPDx_RX_INT_ACK;
-
 
6371
		WREG32(DC_HPD6_INT_CONTROL, tmp);
-
 
6372
	}
6291
}
6373
}
Line 6292... Line 6374...
6292
 
6374
 
6293
static void si_irq_disable(struct radeon_device *rdev)
6375
static void si_irq_disable(struct radeon_device *rdev)
6294
{
6376
{
Line 6351... Line 6433...
6351
	u32 wptr;
6433
	u32 wptr;
6352
	u32 rptr;
6434
	u32 rptr;
6353
	u32 src_id, src_data, ring_id;
6435
	u32 src_id, src_data, ring_id;
6354
	u32 ring_index;
6436
	u32 ring_index;
6355
	bool queue_hotplug = false;
6437
	bool queue_hotplug = false;
-
 
6438
	bool queue_dp = false;
6356
	bool queue_thermal = false;
6439
	bool queue_thermal = false;
6357
	u32 status, addr;
6440
	u32 status, addr;
Line 6358... Line 6441...
6358
 
6441
 
6359
	if (!rdev->ih.enabled || rdev->shutdown)
6442
	if (!rdev->ih.enabled || rdev->shutdown)
Line 6384... Line 6467...
6384
 
6467
 
6385
		switch (src_id) {
6468
		switch (src_id) {
6386
		case 1: /* D1 vblank/vline */
6469
		case 1: /* D1 vblank/vline */
6387
			switch (src_data) {
6470
			switch (src_data) {
6388
			case 0: /* D1 vblank */
6471
			case 0: /* D1 vblank */
-
 
6472
				if (!(rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT))
-
 
6473
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
6389
				if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT) {
6474
 
6390
					if (rdev->irq.crtc_vblank_int[0]) {
6475
				if (rdev->irq.crtc_vblank_int[0]) {
6391
//                       drm_handle_vblank(rdev->ddev, 0);
6476
					drm_handle_vblank(rdev->ddev, 0);
6392
						rdev->pm.vblank_sync = true;
6477
					rdev->pm.vblank_sync = true;
6393
//                       wake_up(&rdev->irq.vblank_queue);
6478
					wake_up(&rdev->irq.vblank_queue);
6394
					}
6479
				}
6395
//                   if (atomic_read(&rdev->irq.pflip[0]))
6480
				if (atomic_read(&rdev->irq.pflip[0]))
6396
//                       radeon_crtc_handle_flip(rdev, 0);
6481
					radeon_crtc_handle_vblank(rdev, 0);
6397
					rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VBLANK_INTERRUPT;
6482
				rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VBLANK_INTERRUPT;
6398
					DRM_DEBUG("IH: D1 vblank\n");
6483
				DRM_DEBUG("IH: D1 vblank\n");
6399
				}
6484
 
6400
				break;
6485
				break;
6401
			case 1: /* D1 vline */
6486
			case 1: /* D1 vline */
-
 
6487
				if (!(rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT))
-
 
6488
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
6402
				if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT) {
6489
 
6403
					rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VLINE_INTERRUPT;
6490
				rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VLINE_INTERRUPT;
6404
					DRM_DEBUG("IH: D1 vline\n");
6491
				DRM_DEBUG("IH: D1 vline\n");
6405
				}
6492
 
6406
				break;
6493
				break;
6407
			default:
6494
			default:
6408
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6495
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6409
				break;
6496
				break;
6410
			}
6497
			}
6411
			break;
6498
			break;
6412
		case 2: /* D2 vblank/vline */
6499
		case 2: /* D2 vblank/vline */
6413
			switch (src_data) {
6500
			switch (src_data) {
6414
			case 0: /* D2 vblank */
6501
			case 0: /* D2 vblank */
-
 
6502
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT))
-
 
6503
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
6415
				if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT) {
6504
 
6416
					if (rdev->irq.crtc_vblank_int[1]) {
6505
				if (rdev->irq.crtc_vblank_int[1]) {
6417
//                       drm_handle_vblank(rdev->ddev, 1);
6506
					drm_handle_vblank(rdev->ddev, 1);
6418
						rdev->pm.vblank_sync = true;
6507
					rdev->pm.vblank_sync = true;
6419
//                       wake_up(&rdev->irq.vblank_queue);
6508
					wake_up(&rdev->irq.vblank_queue);
6420
					}
6509
				}
6421
//                   if (atomic_read(&rdev->irq.pflip[1]))
6510
				if (atomic_read(&rdev->irq.pflip[1]))
6422
//                       radeon_crtc_handle_flip(rdev, 1);
6511
					radeon_crtc_handle_vblank(rdev, 1);
6423
					rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT;
6512
				rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT;
6424
					DRM_DEBUG("IH: D2 vblank\n");
6513
				DRM_DEBUG("IH: D2 vblank\n");
6425
				}
6514
 
6426
				break;
6515
				break;
6427
			case 1: /* D2 vline */
6516
			case 1: /* D2 vline */
-
 
6517
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT))
-
 
6518
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
6428
				if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT) {
6519
 
6429
					rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT;
6520
				rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT;
6430
					DRM_DEBUG("IH: D2 vline\n");
6521
				DRM_DEBUG("IH: D2 vline\n");
6431
				}
6522
 
6432
				break;
6523
				break;
6433
			default:
6524
			default:
6434
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6525
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6435
				break;
6526
				break;
6436
			}
6527
			}
6437
			break;
6528
			break;
6438
		case 3: /* D3 vblank/vline */
6529
		case 3: /* D3 vblank/vline */
6439
			switch (src_data) {
6530
			switch (src_data) {
6440
			case 0: /* D3 vblank */
6531
			case 0: /* D3 vblank */
-
 
6532
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT))
-
 
6533
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
6441
				if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) {
6534
 
6442
					if (rdev->irq.crtc_vblank_int[2]) {
6535
				if (rdev->irq.crtc_vblank_int[2]) {
6443
//                       drm_handle_vblank(rdev->ddev, 2);
6536
					drm_handle_vblank(rdev->ddev, 2);
6444
						rdev->pm.vblank_sync = true;
6537
					rdev->pm.vblank_sync = true;
6445
//                       wake_up(&rdev->irq.vblank_queue);
6538
					wake_up(&rdev->irq.vblank_queue);
6446
					}
6539
				}
6447
//                   if (atomic_read(&rdev->irq.pflip[2]))
6540
				if (atomic_read(&rdev->irq.pflip[2]))
6448
//                       radeon_crtc_handle_flip(rdev, 2);
6541
					radeon_crtc_handle_vblank(rdev, 2);
6449
					rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT;
6542
				rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT;
6450
					DRM_DEBUG("IH: D3 vblank\n");
6543
				DRM_DEBUG("IH: D3 vblank\n");
6451
				}
6544
 
6452
				break;
6545
				break;
6453
			case 1: /* D3 vline */
6546
			case 1: /* D3 vline */
-
 
6547
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT))
-
 
6548
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
6454
				if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) {
6549
 
6455
					rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT;
6550
				rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT;
6456
					DRM_DEBUG("IH: D3 vline\n");
6551
				DRM_DEBUG("IH: D3 vline\n");
6457
				}
6552
 
6458
				break;
6553
				break;
6459
			default:
6554
			default:
6460
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6555
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6461
				break;
6556
				break;
6462
			}
6557
			}
6463
			break;
6558
			break;
6464
		case 4: /* D4 vblank/vline */
6559
		case 4: /* D4 vblank/vline */
6465
			switch (src_data) {
6560
			switch (src_data) {
6466
			case 0: /* D4 vblank */
6561
			case 0: /* D4 vblank */
-
 
6562
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT))
-
 
6563
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
6467
				if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) {
6564
 
6468
					if (rdev->irq.crtc_vblank_int[3]) {
6565
				if (rdev->irq.crtc_vblank_int[3]) {
6469
//                       drm_handle_vblank(rdev->ddev, 3);
6566
					drm_handle_vblank(rdev->ddev, 3);
6470
						rdev->pm.vblank_sync = true;
6567
					rdev->pm.vblank_sync = true;
6471
//                       wake_up(&rdev->irq.vblank_queue);
6568
					wake_up(&rdev->irq.vblank_queue);
6472
					}
6569
				}
6473
//                   if (atomic_read(&rdev->irq.pflip[3]))
6570
				if (atomic_read(&rdev->irq.pflip[3]))
6474
//                       radeon_crtc_handle_flip(rdev, 3);
6571
					radeon_crtc_handle_vblank(rdev, 3);
6475
					rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT;
6572
				rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT;
6476
					DRM_DEBUG("IH: D4 vblank\n");
6573
				DRM_DEBUG("IH: D4 vblank\n");
6477
				}
6574
 
6478
				break;
6575
				break;
6479
			case 1: /* D4 vline */
6576
			case 1: /* D4 vline */
-
 
6577
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT))
-
 
6578
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
6480
				if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) {
6579
 
6481
					rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT;
6580
				rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT;
6482
					DRM_DEBUG("IH: D4 vline\n");
6581
				DRM_DEBUG("IH: D4 vline\n");
6483
				}
6582
 
6484
				break;
6583
				break;
6485
			default:
6584
			default:
6486
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6585
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6487
				break;
6586
				break;
6488
			}
6587
			}
6489
			break;
6588
			break;
6490
		case 5: /* D5 vblank/vline */
6589
		case 5: /* D5 vblank/vline */
6491
			switch (src_data) {
6590
			switch (src_data) {
6492
			case 0: /* D5 vblank */
6591
			case 0: /* D5 vblank */
-
 
6592
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT))
-
 
6593
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
6493
				if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) {
6594
 
6494
					if (rdev->irq.crtc_vblank_int[4]) {
6595
				if (rdev->irq.crtc_vblank_int[4]) {
6495
//                       drm_handle_vblank(rdev->ddev, 4);
6596
					drm_handle_vblank(rdev->ddev, 4);
6496
						rdev->pm.vblank_sync = true;
6597
					rdev->pm.vblank_sync = true;
6497
//                       wake_up(&rdev->irq.vblank_queue);
6598
					wake_up(&rdev->irq.vblank_queue);
6498
					}
6599
				}
6499
//                   if (atomic_read(&rdev->irq.pflip[4]))
6600
				if (atomic_read(&rdev->irq.pflip[4]))
6500
//                       radeon_crtc_handle_flip(rdev, 4);
6601
					radeon_crtc_handle_vblank(rdev, 4);
6501
					rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT;
6602
				rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT;
6502
					DRM_DEBUG("IH: D5 vblank\n");
6603
				DRM_DEBUG("IH: D5 vblank\n");
6503
				}
6604
 
6504
				break;
6605
				break;
6505
			case 1: /* D5 vline */
6606
			case 1: /* D5 vline */
-
 
6607
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT))
-
 
6608
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
6506
				if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) {
6609
 
6507
					rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT;
6610
				rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT;
6508
					DRM_DEBUG("IH: D5 vline\n");
6611
				DRM_DEBUG("IH: D5 vline\n");
6509
				}
6612
 
6510
				break;
6613
				break;
6511
			default:
6614
			default:
6512
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6615
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6513
				break;
6616
				break;
6514
			}
6617
			}
6515
			break;
6618
			break;
6516
		case 6: /* D6 vblank/vline */
6619
		case 6: /* D6 vblank/vline */
6517
			switch (src_data) {
6620
			switch (src_data) {
6518
			case 0: /* D6 vblank */
6621
			case 0: /* D6 vblank */
-
 
6622
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT))
-
 
6623
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
6519
				if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) {
6624
 
6520
					if (rdev->irq.crtc_vblank_int[5]) {
6625
				if (rdev->irq.crtc_vblank_int[5]) {
6521
//                       drm_handle_vblank(rdev->ddev, 5);
6626
					drm_handle_vblank(rdev->ddev, 5);
6522
						rdev->pm.vblank_sync = true;
6627
					rdev->pm.vblank_sync = true;
6523
//                       wake_up(&rdev->irq.vblank_queue);
6628
					wake_up(&rdev->irq.vblank_queue);
6524
					}
6629
				}
6525
//                   if (atomic_read(&rdev->irq.pflip[5]))
6630
				if (atomic_read(&rdev->irq.pflip[5]))
6526
//                       radeon_crtc_handle_flip(rdev, 5);
6631
					radeon_crtc_handle_vblank(rdev, 5);
6527
					rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT;
6632
				rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT;
6528
					DRM_DEBUG("IH: D6 vblank\n");
6633
				DRM_DEBUG("IH: D6 vblank\n");
6529
				}
6634
 
6530
				break;
6635
				break;
6531
			case 1: /* D6 vline */
6636
			case 1: /* D6 vline */
-
 
6637
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT))
-
 
6638
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
6532
				if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) {
6639
 
6533
					rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT;
6640
				rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT;
6534
					DRM_DEBUG("IH: D6 vline\n");
6641
				DRM_DEBUG("IH: D6 vline\n");
6535
				}
6642
 
6536
				break;
6643
				break;
6537
			default:
6644
			default:
6538
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6645
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6539
				break;
6646
				break;
Line 6548... Line 6655...
6548
			DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
6655
			DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
6549
			break;
6656
			break;
6550
		case 42: /* HPD hotplug */
6657
		case 42: /* HPD hotplug */
6551
			switch (src_data) {
6658
			switch (src_data) {
6552
			case 0:
6659
			case 0:
6553
				if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) {
6660
				if (!(rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT))
-
 
6661
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
-
 
6662
 
6554
					rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT;
6663
				rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT;
6555
					queue_hotplug = true;
6664
				queue_hotplug = true;
6556
					DRM_DEBUG("IH: HPD1\n");
6665
				DRM_DEBUG("IH: HPD1\n");
6557
				}
6666
 
6558
				break;
6667
				break;
6559
			case 1:
6668
			case 1:
6560
				if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT) {
6669
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT))
-
 
6670
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
-
 
6671
 
6561
					rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_INTERRUPT;
6672
				rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_INTERRUPT;
6562
					queue_hotplug = true;
6673
				queue_hotplug = true;
6563
					DRM_DEBUG("IH: HPD2\n");
6674
				DRM_DEBUG("IH: HPD2\n");
6564
				}
6675
 
6565
				break;
6676
				break;
6566
			case 2:
6677
			case 2:
6567
				if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT) {
6678
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT))
-
 
6679
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
-
 
6680
 
6568
					rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_INTERRUPT;
6681
				rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_INTERRUPT;
6569
					queue_hotplug = true;
6682
				queue_hotplug = true;
6570
					DRM_DEBUG("IH: HPD3\n");
6683
				DRM_DEBUG("IH: HPD3\n");
6571
				}
6684
 
6572
				break;
6685
				break;
6573
			case 3:
6686
			case 3:
6574
				if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT) {
6687
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT))
-
 
6688
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
-
 
6689
 
6575
					rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_INTERRUPT;
6690
				rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_INTERRUPT;
6576
					queue_hotplug = true;
6691
				queue_hotplug = true;
6577
					DRM_DEBUG("IH: HPD4\n");
6692
				DRM_DEBUG("IH: HPD4\n");
6578
				}
6693
 
6579
				break;
6694
				break;
6580
			case 4:
6695
			case 4:
6581
				if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT) {
6696
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT))
-
 
6697
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
-
 
6698
 
6582
					rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_INTERRUPT;
6699
				rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_INTERRUPT;
6583
					queue_hotplug = true;
6700
				queue_hotplug = true;
6584
					DRM_DEBUG("IH: HPD5\n");
6701
				DRM_DEBUG("IH: HPD5\n");
6585
				}
6702
 
6586
				break;
6703
				break;
6587
			case 5:
6704
			case 5:
6588
				if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) {
6705
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT))
-
 
6706
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
-
 
6707
 
6589
					rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_INTERRUPT;
6708
				rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_INTERRUPT;
6590
					queue_hotplug = true;
6709
				queue_hotplug = true;
6591
					DRM_DEBUG("IH: HPD6\n");
6710
				DRM_DEBUG("IH: HPD6\n");
-
 
6711
 
-
 
6712
				break;
-
 
6713
			case 6:
-
 
6714
				if (!(rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT))
-
 
6715
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
-
 
6716
 
-
 
6717
				rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_RX_INTERRUPT;
-
 
6718
				queue_dp = true;
-
 
6719
				DRM_DEBUG("IH: HPD_RX 1\n");
-
 
6720
 
-
 
6721
				break;
-
 
6722
			case 7:
-
 
6723
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT))
-
 
6724
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
-
 
6725
 
-
 
6726
				rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_RX_INTERRUPT;
-
 
6727
				queue_dp = true;
-
 
6728
				DRM_DEBUG("IH: HPD_RX 2\n");
-
 
6729
 
-
 
6730
				break;
-
 
6731
			case 8:
-
 
6732
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT))
-
 
6733
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
-
 
6734
 
-
 
6735
				rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_RX_INTERRUPT;
-
 
6736
				queue_dp = true;
-
 
6737
				DRM_DEBUG("IH: HPD_RX 3\n");
-
 
6738
 
-
 
6739
				break;
-
 
6740
			case 9:
-
 
6741
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT))
-
 
6742
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
-
 
6743
 
-
 
6744
				rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_RX_INTERRUPT;
-
 
6745
				queue_dp = true;
-
 
6746
				DRM_DEBUG("IH: HPD_RX 4\n");
-
 
6747
 
-
 
6748
				break;
-
 
6749
			case 10:
-
 
6750
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT))
-
 
6751
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
-
 
6752
 
-
 
6753
				rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_RX_INTERRUPT;
-
 
6754
				queue_dp = true;
-
 
6755
				DRM_DEBUG("IH: HPD_RX 5\n");
-
 
6756
 
6592
				}
6757
				break;
-
 
6758
			case 11:
-
 
6759
				if (!(rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT))
-
 
6760
					DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
-
 
6761
 
-
 
6762
				rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_RX_INTERRUPT;
-
 
6763
				queue_dp = true;
-
 
6764
				DRM_DEBUG("IH: HPD_RX 6\n");
-
 
6765
 
6593
				break;
6766
				break;
6594
			default:
6767
			default:
6595
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6768
				DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
6596
				break;
6769
				break;
6597
			}
6770
			}
6598
			break;
6771
			break;
-
 
6772
		case 96:
-
 
6773
			DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR));
-
 
6774
			WREG32(SRBM_INT_ACK, 0x1);
-
 
6775
			break;
6599
		case 124: /* UVD */
6776
		case 124: /* UVD */
6600
			DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
6777
			DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
6601
			radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
6778
			radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
6602
			break;
6779
			break;
6603
		case 146:
6780
		case 146:
Line 6773... Line 6950...
6773
		}
6950
		}
6774
		if (r)
6951
		if (r)
6775
			rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
6952
			rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
6776
	}
6953
	}
Line -... Line 6954...
-
 
6954
 
-
 
6955
	r = radeon_vce_resume(rdev);
-
 
6956
	if (!r) {
-
 
6957
		r = vce_v1_0_resume(rdev);
-
 
6958
		if (!r)
-
 
6959
			r = radeon_fence_driver_start_ring(rdev,
-
 
6960
							   TN_RING_TYPE_VCE1_INDEX);
-
 
6961
		if (!r)
-
 
6962
			r = radeon_fence_driver_start_ring(rdev,
-
 
6963
							   TN_RING_TYPE_VCE2_INDEX);
-
 
6964
	}
-
 
6965
	if (r) {
-
 
6966
		dev_err(rdev->dev, "VCE init error (%d).\n", r);
-
 
6967
		rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
-
 
6968
		rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
-
 
6969
	}
6777
 
6970
 
6778
	/* Enable IRQ */
6971
	/* Enable IRQ */
6779
	if (!rdev->irq.installed) {
6972
	if (!rdev->irq.installed) {
6780
		r = radeon_irq_kms_init(rdev);
6973
		r = radeon_irq_kms_init(rdev);
6781
		if (r)
6974
		if (r)
Line 6841... Line 7034...
6841
			if (r)
7034
			if (r)
6842
				DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
7035
				DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
6843
		}
7036
		}
6844
	}
7037
	}
Line -... Line 7038...
-
 
7038
 
-
 
7039
	r = -ENOENT;
-
 
7040
 
-
 
7041
	ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
-
 
7042
	if (ring->ring_size)
-
 
7043
		r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
-
 
7044
				     VCE_CMD_NO_OP);
-
 
7045
 
-
 
7046
	ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
-
 
7047
	if (ring->ring_size)
-
 
7048
		r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
-
 
7049
				     VCE_CMD_NO_OP);
-
 
7050
 
-
 
7051
	if (!r)
-
 
7052
		r = vce_v1_0_init(rdev);
-
 
7053
	else if (r != -ENOENT)
-
 
7054
		DRM_ERROR("radeon: failed initializing VCE (%d).\n", r);
6845
 
7055
 
6846
	r = radeon_ib_pool_init(rdev);
7056
	r = radeon_ib_pool_init(rdev);
6847
	if (r) {
7057
	if (r) {
6848
		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
7058
		dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
6849
		return r;
7059
		return r;
Line 6853... Line 7063...
6853
	if (r) {
7063
	if (r) {
6854
		dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
7064
		dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r);
6855
		return r;
7065
		return r;
6856
	}
7066
	}
Line 6857... Line 7067...
6857
 
7067
 
6858
	r = dce6_audio_init(rdev);
7068
	r = radeon_audio_init(rdev);
6859
	if (r)
7069
	if (r)
Line 6860... Line 7070...
6860
		return r;
7070
		return r;
6861
 
7071
 
Line -... Line 7072...
-
 
7072
	return 0;
-
 
7073
}
-
 
7074
 
-
 
7075
int si_resume(struct radeon_device *rdev)
-
 
7076
{
-
 
7077
	int r;
-
 
7078
 
-
 
7079
	/* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
-
 
7080
	 * posting will perform necessary task to bring back GPU into good
-
 
7081
	 * shape.
-
 
7082
	 */
-
 
7083
	/* post card */
-
 
7084
	atom_asic_init(rdev->mode_info.atom_context);
-
 
7085
 
-
 
7086
	/* init golden registers */
-
 
7087
	si_init_golden_registers(rdev);
-
 
7088
 
-
 
7089
	if (rdev->pm.pm_method == PM_METHOD_DPM)
-
 
7090
		radeon_pm_resume(rdev);
-
 
7091
 
-
 
7092
	rdev->accel_working = true;
-
 
7093
	r = si_startup(rdev);
-
 
7094
	if (r) {
-
 
7095
		DRM_ERROR("si startup failed on resume\n");
Line -... Line 7096...
-
 
7096
		rdev->accel_working = false;
Line -... Line 7097...
-
 
7097
		return r;
Line 6862... Line 7098...
6862
	return 0;
7098
	}
6863
}
7099
 
6864
 
7100
	return r;
6865
 
7101
 
Line 6961... Line 7197...
6961
			ring->ring_obj = NULL;
7197
			ring->ring_obj = NULL;
6962
			r600_ring_init(rdev, ring, 4096);
7198
			r600_ring_init(rdev, ring, 4096);
6963
		}
7199
		}
6964
	}
7200
	}
Line -... Line 7201...
-
 
7201
 
-
 
7202
	r = radeon_vce_init(rdev);
-
 
7203
	if (!r) {
-
 
7204
		ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
-
 
7205
		ring->ring_obj = NULL;
-
 
7206
		r600_ring_init(rdev, ring, 4096);
-
 
7207
 
-
 
7208
		ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
-
 
7209
		ring->ring_obj = NULL;
-
 
7210
		r600_ring_init(rdev, ring, 4096);
-
 
7211
	}
6965
 
7212
 
6966
    rdev->ih.ring_obj = NULL;
7213
	rdev->ih.ring_obj = NULL;
Line 6967... Line 7214...
6967
	r600_ih_ring_init(rdev, 64 * 1024);
7214
	r600_ih_ring_init(rdev, 64 * 1024);
6968
 
7215
 
Line 6973... Line 7220...
6973
	rdev->accel_working = true;
7220
	rdev->accel_working = true;
6974
    r = si_startup(rdev);
7221
	r = si_startup(rdev);
6975
	if (r) {
7222
	if (r) {
6976
		dev_err(rdev->dev, "disabling GPU acceleration\n");
7223
		dev_err(rdev->dev, "disabling GPU acceleration\n");
6977
		si_cp_fini(rdev);
7224
		si_cp_fini(rdev);
-
 
7225
		cayman_dma_fini(rdev);
6978
//       si_irq_fini(rdev);
7226
		si_irq_fini(rdev);
6979
//       si_rlc_fini(rdev);
7227
		sumo_rlc_fini(rdev);
6980
//       radeon_wb_fini(rdev);
7228
		radeon_wb_fini(rdev);
6981
//       radeon_ib_pool_fini(rdev);
7229
		radeon_ib_pool_fini(rdev);
6982
//       radeon_vm_manager_fini(rdev);
7230
		radeon_vm_manager_fini(rdev);
6983
//       radeon_irq_kms_fini(rdev);
7231
		radeon_irq_kms_fini(rdev);
6984
//       si_pcie_gart_fini(rdev);
7232
		si_pcie_gart_fini(rdev);
6985
		rdev->accel_working = false;
7233
		rdev->accel_working = false;
6986
	}
7234
	}
Line 6987... Line 7235...
6987
 
7235
 
6988
	/* Don't start up if the MC ucode is missing.
7236
	/* Don't start up if the MC ucode is missing.
Line 6995... Line 7243...
6995
	}
7243
	}
Line 6996... Line 7244...
6996
 
7244
 
6997
	return 0;
7245
	return 0;
Line -... Line 7246...
-
 
7246
}
-
 
7247
 
-
 
7248
void si_fini(struct radeon_device *rdev)
-
 
7249
{
-
 
7250
	radeon_pm_fini(rdev);
-
 
7251
	si_cp_fini(rdev);
-
 
7252
	cayman_dma_fini(rdev);
-
 
7253
	si_fini_pg(rdev);
-
 
7254
	si_fini_cg(rdev);
-
 
7255
	si_irq_fini(rdev);
-
 
7256
	sumo_rlc_fini(rdev);
-
 
7257
	radeon_wb_fini(rdev);
-
 
7258
	radeon_vm_manager_fini(rdev);
-
 
7259
	radeon_ib_pool_fini(rdev);
-
 
7260
	radeon_irq_kms_fini(rdev);
-
 
7261
	if (rdev->has_uvd) {
-
 
7262
		uvd_v1_0_fini(rdev);
-
 
7263
		radeon_uvd_fini(rdev);
-
 
7264
		radeon_vce_fini(rdev);
-
 
7265
	}
-
 
7266
	si_pcie_gart_fini(rdev);
-
 
7267
	r600_vram_scratch_fini(rdev);
-
 
7268
	radeon_gem_fini(rdev);
-
 
7269
	radeon_fence_driver_fini(rdev);
-
 
7270
	radeon_bo_fini(rdev);
-
 
7271
	radeon_atombios_fini(rdev);
-
 
7272
	kfree(rdev->bios);
-
 
7273
	rdev->bios = NULL;
6998
}
7274
}
6999
 
7275
 
7000
/**
7276
/**
7001
 * si_get_gpu_clock_counter - return GPU clock counter snapshot
7277
 * si_get_gpu_clock_counter - return GPU clock counter snapshot
7002
 *
7278
 *
Line 7029... Line 7305...
7029
 
7305
 
7030
	/* put PLL in bypass mode */
7306
	/* put PLL in bypass mode */
Line 7031... Line 7307...
7031
	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
7307
	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
7032
 
7308
 
7033
	if (!vclk || !dclk) {
-
 
7034
		/* keep the Bypass mode, put PLL to sleep */
7309
	if (!vclk || !dclk) {
7035
		WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
7310
		/* keep the Bypass mode */
Line 7036... Line 7311...
7036
		return 0;
7311
		return 0;
7037
	}
7312
	}
Line 7046... Line 7321...
7046
	WREG32_P(CG_UPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
7321
	WREG32_P(CG_UPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
Line 7047... Line 7322...
7047
 
7322
 
7048
	/* set VCO_MODE to 1 */
7323
	/* set VCO_MODE to 1 */
Line 7049... Line 7324...
7049
	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK);
7324
	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK);
7050
 
-
 
7051
	/* toggle UPLL_SLEEP to 1 then back to 0 */
7325
 
Line 7052... Line 7326...
7052
	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK);
7326
	/* disable sleep mode */
7053
	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK);
7327
	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK);
Line 7466... Line 7740...
7466
					WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
7740
					WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
7467
			}
7741
			}
7468
		}
7742
		}
7469
	}
7743
	}
7470
}
7744
}
-
 
7745
 
-
 
7746
int si_vce_send_vcepll_ctlreq(struct radeon_device *rdev)
-
 
7747
{
-
 
7748
        unsigned i;
-
 
7749
 
-
 
7750
        /* make sure VCEPLL_CTLREQ is deasserted */
-
 
7751
        WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK);
-
 
7752
 
-
 
7753
        mdelay(10);
-
 
7754
 
-
 
7755
        /* assert UPLL_CTLREQ */
-
 
7756
        WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, UPLL_CTLREQ_MASK, ~UPLL_CTLREQ_MASK);
-
 
7757
 
-
 
7758
        /* wait for CTLACK and CTLACK2 to get asserted */
-
 
7759
        for (i = 0; i < 100; ++i) {
-
 
7760
                uint32_t mask = UPLL_CTLACK_MASK | UPLL_CTLACK2_MASK;
-
 
7761
                if ((RREG32_SMC(CG_VCEPLL_FUNC_CNTL) & mask) == mask)
-
 
7762
                        break;
-
 
7763
                mdelay(10);
-
 
7764
        }
-
 
7765
 
-
 
7766
        /* deassert UPLL_CTLREQ */
-
 
7767
        WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK);
-
 
7768
 
-
 
7769
        if (i == 100) {
-
 
7770
                DRM_ERROR("Timeout setting UVD clocks!\n");
-
 
7771
                return -ETIMEDOUT;
-
 
7772
        }
-
 
7773
 
-
 
7774
        return 0;
-
 
7775
}
-
 
7776
 
-
 
7777
int si_set_vce_clocks(struct radeon_device *rdev, u32 evclk, u32 ecclk)
-
 
7778
{
-
 
7779
	unsigned fb_div = 0, evclk_div = 0, ecclk_div = 0;
-
 
7780
	int r;
-
 
7781
 
-
 
7782
	/* bypass evclk and ecclk with bclk */
-
 
7783
	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
-
 
7784
		     EVCLK_SRC_SEL(1) | ECCLK_SRC_SEL(1),
-
 
7785
		     ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK));
-
 
7786
 
-
 
7787
	/* put PLL in bypass mode */
-
 
7788
	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_BYPASS_EN_MASK,
-
 
7789
		     ~VCEPLL_BYPASS_EN_MASK);
-
 
7790
 
-
 
7791
	if (!evclk || !ecclk) {
-
 
7792
		/* keep the Bypass mode, put PLL to sleep */
-
 
7793
		WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK,
-
 
7794
			     ~VCEPLL_SLEEP_MASK);
-
 
7795
		return 0;
-
 
7796
	}
-
 
7797
 
-
 
7798
	r = radeon_uvd_calc_upll_dividers(rdev, evclk, ecclk, 125000, 250000,
-
 
7799
					  16384, 0x03FFFFFF, 0, 128, 5,
-
 
7800
					  &fb_div, &evclk_div, &ecclk_div);
-
 
7801
	if (r)
-
 
7802
		return r;
-
 
7803
 
-
 
7804
	/* set RESET_ANTI_MUX to 0 */
-
 
7805
	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
-
 
7806
 
-
 
7807
	/* set VCO_MODE to 1 */
-
 
7808
	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_VCO_MODE_MASK,
-
 
7809
		     ~VCEPLL_VCO_MODE_MASK);
-
 
7810
 
-
 
7811
	/* toggle VCEPLL_SLEEP to 1 then back to 0 */
-
 
7812
	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK,
-
 
7813
		     ~VCEPLL_SLEEP_MASK);
-
 
7814
	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_SLEEP_MASK);
-
 
7815
 
-
 
7816
	/* deassert VCEPLL_RESET */
-
 
7817
	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK);
-
 
7818
 
-
 
7819
	mdelay(1);
-
 
7820
 
-
 
7821
	r = si_vce_send_vcepll_ctlreq(rdev);
-
 
7822
	if (r)
-
 
7823
		return r;
-
 
7824
 
-
 
7825
	/* assert VCEPLL_RESET again */
-
 
7826
	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_RESET_MASK, ~VCEPLL_RESET_MASK);
-
 
7827
 
-
 
7828
	/* disable spread spectrum. */
-
 
7829
	WREG32_SMC_P(CG_VCEPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
-
 
7830
 
-
 
7831
	/* set feedback divider */
-
 
7832
	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_3, VCEPLL_FB_DIV(fb_div), ~VCEPLL_FB_DIV_MASK);
-
 
7833
 
-
 
7834
	/* set ref divider to 0 */
-
 
7835
	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_REF_DIV_MASK);
-
 
7836
 
-
 
7837
	/* set PDIV_A and PDIV_B */
-
 
7838
	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
-
 
7839
		     VCEPLL_PDIV_A(evclk_div) | VCEPLL_PDIV_B(ecclk_div),
-
 
7840
		     ~(VCEPLL_PDIV_A_MASK | VCEPLL_PDIV_B_MASK));
-
 
7841
 
-
 
7842
	/* give the PLL some time to settle */
-
 
7843
	mdelay(15);
-
 
7844
 
-
 
7845
	/* deassert PLL_RESET */
-
 
7846
	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK);
-
 
7847
 
-
 
7848
	mdelay(15);
-
 
7849
 
-
 
7850
	/* switch from bypass mode to normal mode */
-
 
7851
	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_BYPASS_EN_MASK);
-
 
7852
 
-
 
7853
	r = si_vce_send_vcepll_ctlreq(rdev);
-
 
7854
	if (r)
-
 
7855
		return r;
-
 
7856
 
-
 
7857
	/* switch VCLK and DCLK selection */
-
 
7858
	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
-
 
7859
		     EVCLK_SRC_SEL(16) | ECCLK_SRC_SEL(16),
-
 
7860
		     ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK));
-
 
7861
 
-
 
7862
	mdelay(100);
-
 
7863
 
-
 
7864
	return 0;
-
 
7865
}