Subversion Repositories Kolibri OS

Rev

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

Rev 2997 Rev 3120
Line 535... Line 535...
535
				   RADEON_DAC_PDWN_G |
535
				   RADEON_DAC_PDWN_G |
536
				   RADEON_DAC_PDWN_B);
536
				   RADEON_DAC_PDWN_B);
537
		break;
537
		break;
538
	}
538
	}
Line -... Line 539...
-
 
539
 
-
 
540
	/* handled in radeon_crtc_dpms() */
539
 
541
	if (!(rdev->flags & RADEON_SINGLE_CRTC))
540
	WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl);
542
	WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl);
541
	WREG32(RADEON_DAC_CNTL, dac_cntl);
543
	WREG32(RADEON_DAC_CNTL, dac_cntl);
Line 542... Line 544...
542
	WREG32(RADEON_DAC_MACRO_CNTL, dac_macro_cntl);
544
	WREG32(RADEON_DAC_MACRO_CNTL, dac_macro_cntl);
Line 660... Line 662...
660
	else
662
	else
661
		tmp |= RADEON_DAC_FORCE_DATA_SEL_G;
663
		tmp |= RADEON_DAC_FORCE_DATA_SEL_G;
Line 662... Line 664...
662
 
664
 
663
	if (ASIC_IS_R300(rdev))
665
	if (ASIC_IS_R300(rdev))
-
 
666
		tmp |= (0x1b6 << RADEON_DAC_FORCE_DATA_SHIFT);
-
 
667
	else if (ASIC_IS_RV100(rdev))
664
		tmp |= (0x1b6 << RADEON_DAC_FORCE_DATA_SHIFT);
668
		tmp |= (0x1ac << RADEON_DAC_FORCE_DATA_SHIFT);
665
	else
669
	else
Line 666... Line 670...
666
		tmp |= (0x180 << RADEON_DAC_FORCE_DATA_SHIFT);
670
		tmp |= (0x180 << RADEON_DAC_FORCE_DATA_SHIFT);
Line 667... Line 671...
667
 
671
 
668
	WREG32(RADEON_DAC_EXT_CNTL, tmp);
672
	WREG32(RADEON_DAC_EXT_CNTL, tmp);
669
 
673
 
Line -... Line 674...
-
 
674
	tmp = dac_cntl & ~(RADEON_DAC_RANGE_CNTL_MASK | RADEON_DAC_PDWN);
670
	tmp = dac_cntl & ~(RADEON_DAC_RANGE_CNTL_MASK | RADEON_DAC_PDWN);
675
	tmp |= RADEON_DAC_RANGE_CNTL_PS2 | RADEON_DAC_CMP_EN;
671
	tmp |= RADEON_DAC_RANGE_CNTL_PS2 | RADEON_DAC_CMP_EN;
676
	WREG32(RADEON_DAC_CNTL, tmp);
672
	WREG32(RADEON_DAC_CNTL, tmp);
677
 
Line 673... Line 678...
673
 
678
	tmp = dac_macro_cntl;
Line 1090... Line 1095...
1090
	if (rdev->family == CHIP_R200) {
1095
	if (rdev->family == CHIP_R200) {
1091
		WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl);
1096
		WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl);
1092
	} else {
1097
	} else {
1093
		if (is_tv)
1098
		if (is_tv)
1094
			WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl);
1099
			WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl);
1095
		else
1100
		/* handled in radeon_crtc_dpms() */
-
 
1101
		else if (!(rdev->flags & RADEON_SINGLE_CRTC))
1096
		WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
1102
		WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
1097
		WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
1103
		WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
1098
	}
1104
	}
Line 1099... Line 1105...
1099
 
1105
 
Line 1414... Line 1420...
1414
	WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl);
1420
	WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl);
1415
	WREG32(RADEON_DAC_CNTL2, dac_cntl2);
1421
	WREG32(RADEON_DAC_CNTL2, dac_cntl2);
1416
	return found;
1422
	return found;
1417
}
1423
}
Line -... Line 1424...
-
 
1424
 
-
 
1425
static bool radeon_legacy_ext_dac_detect(struct drm_encoder *encoder,
-
 
1426
					 struct drm_connector *connector)
-
 
1427
{
-
 
1428
	struct drm_device *dev = encoder->dev;
-
 
1429
	struct radeon_device *rdev = dev->dev_private;
-
 
1430
	uint32_t gpio_monid, fp2_gen_cntl, disp_output_cntl, crtc2_gen_cntl;
-
 
1431
	uint32_t disp_lin_trans_grph_a, disp_lin_trans_grph_b, disp_lin_trans_grph_c;
-
 
1432
	uint32_t disp_lin_trans_grph_d, disp_lin_trans_grph_e, disp_lin_trans_grph_f;
-
 
1433
	uint32_t tmp, crtc2_h_total_disp, crtc2_v_total_disp;
-
 
1434
	uint32_t crtc2_h_sync_strt_wid, crtc2_v_sync_strt_wid;
-
 
1435
	bool found = false;
-
 
1436
	int i;
-
 
1437
 
-
 
1438
	/* save the regs we need */
-
 
1439
	gpio_monid = RREG32(RADEON_GPIO_MONID);
-
 
1440
	fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL);
-
 
1441
	disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL);
-
 
1442
	crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL);
-
 
1443
	disp_lin_trans_grph_a = RREG32(RADEON_DISP_LIN_TRANS_GRPH_A);
-
 
1444
	disp_lin_trans_grph_b = RREG32(RADEON_DISP_LIN_TRANS_GRPH_B);
-
 
1445
	disp_lin_trans_grph_c = RREG32(RADEON_DISP_LIN_TRANS_GRPH_C);
-
 
1446
	disp_lin_trans_grph_d = RREG32(RADEON_DISP_LIN_TRANS_GRPH_D);
-
 
1447
	disp_lin_trans_grph_e = RREG32(RADEON_DISP_LIN_TRANS_GRPH_E);
-
 
1448
	disp_lin_trans_grph_f = RREG32(RADEON_DISP_LIN_TRANS_GRPH_F);
-
 
1449
	crtc2_h_total_disp = RREG32(RADEON_CRTC2_H_TOTAL_DISP);
-
 
1450
	crtc2_v_total_disp = RREG32(RADEON_CRTC2_V_TOTAL_DISP);
-
 
1451
	crtc2_h_sync_strt_wid = RREG32(RADEON_CRTC2_H_SYNC_STRT_WID);
-
 
1452
	crtc2_v_sync_strt_wid = RREG32(RADEON_CRTC2_V_SYNC_STRT_WID);
-
 
1453
 
-
 
1454
	tmp = RREG32(RADEON_GPIO_MONID);
-
 
1455
	tmp &= ~RADEON_GPIO_A_0;
-
 
1456
	WREG32(RADEON_GPIO_MONID, tmp);
-
 
1457
 
-
 
1458
	WREG32(RADEON_FP2_GEN_CNTL, (RADEON_FP2_ON |
-
 
1459
				     RADEON_FP2_PANEL_FORMAT |
-
 
1460
				     R200_FP2_SOURCE_SEL_TRANS_UNIT |
-
 
1461
				     RADEON_FP2_DVO_EN |
-
 
1462
				     R200_FP2_DVO_RATE_SEL_SDR));
-
 
1463
 
-
 
1464
	WREG32(RADEON_DISP_OUTPUT_CNTL, (RADEON_DISP_DAC_SOURCE_RMX |
-
 
1465
					 RADEON_DISP_TRANS_MATRIX_GRAPHICS));
-
 
1466
 
-
 
1467
	WREG32(RADEON_CRTC2_GEN_CNTL, (RADEON_CRTC2_EN |
-
 
1468
				       RADEON_CRTC2_DISP_REQ_EN_B));
-
 
1469
 
-
 
1470
	WREG32(RADEON_DISP_LIN_TRANS_GRPH_A, 0x00000000);
-
 
1471
	WREG32(RADEON_DISP_LIN_TRANS_GRPH_B, 0x000003f0);
-
 
1472
	WREG32(RADEON_DISP_LIN_TRANS_GRPH_C, 0x00000000);
-
 
1473
	WREG32(RADEON_DISP_LIN_TRANS_GRPH_D, 0x000003f0);
-
 
1474
	WREG32(RADEON_DISP_LIN_TRANS_GRPH_E, 0x00000000);
-
 
1475
	WREG32(RADEON_DISP_LIN_TRANS_GRPH_F, 0x000003f0);
-
 
1476
 
-
 
1477
	WREG32(RADEON_CRTC2_H_TOTAL_DISP, 0x01000008);
-
 
1478
	WREG32(RADEON_CRTC2_H_SYNC_STRT_WID, 0x00000800);
-
 
1479
	WREG32(RADEON_CRTC2_V_TOTAL_DISP, 0x00080001);
-
 
1480
	WREG32(RADEON_CRTC2_V_SYNC_STRT_WID, 0x00000080);
-
 
1481
 
-
 
1482
	for (i = 0; i < 200; i++) {
-
 
1483
		tmp = RREG32(RADEON_GPIO_MONID);
-
 
1484
		if (tmp & RADEON_GPIO_Y_0)
-
 
1485
			found = true;
-
 
1486
 
-
 
1487
		if (found)
-
 
1488
			break;
-
 
1489
 
-
 
1490
			msleep(1);
-
 
1491
	}
-
 
1492
 
-
 
1493
	/* restore the regs we used */
-
 
1494
	WREG32(RADEON_DISP_LIN_TRANS_GRPH_A, disp_lin_trans_grph_a);
-
 
1495
	WREG32(RADEON_DISP_LIN_TRANS_GRPH_B, disp_lin_trans_grph_b);
-
 
1496
	WREG32(RADEON_DISP_LIN_TRANS_GRPH_C, disp_lin_trans_grph_c);
-
 
1497
	WREG32(RADEON_DISP_LIN_TRANS_GRPH_D, disp_lin_trans_grph_d);
-
 
1498
	WREG32(RADEON_DISP_LIN_TRANS_GRPH_E, disp_lin_trans_grph_e);
-
 
1499
	WREG32(RADEON_DISP_LIN_TRANS_GRPH_F, disp_lin_trans_grph_f);
-
 
1500
	WREG32(RADEON_CRTC2_H_TOTAL_DISP, crtc2_h_total_disp);
-
 
1501
	WREG32(RADEON_CRTC2_V_TOTAL_DISP, crtc2_v_total_disp);
-
 
1502
	WREG32(RADEON_CRTC2_H_SYNC_STRT_WID, crtc2_h_sync_strt_wid);
-
 
1503
	WREG32(RADEON_CRTC2_V_SYNC_STRT_WID, crtc2_v_sync_strt_wid);
-
 
1504
	WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
-
 
1505
	WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl);
-
 
1506
	WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl);
-
 
1507
	WREG32(RADEON_GPIO_MONID, gpio_monid);
-
 
1508
 
-
 
1509
	return found;
-
 
1510
}
1418
 
1511
 
1419
static enum drm_connector_status radeon_legacy_tv_dac_detect(struct drm_encoder *encoder,
1512
static enum drm_connector_status radeon_legacy_tv_dac_detect(struct drm_encoder *encoder,
1420
							     struct drm_connector *connector)
1513
							     struct drm_connector *connector)
1421
{
1514
{
1422
	struct drm_device *dev = encoder->dev;
1515
	struct drm_device *dev = encoder->dev;
1423
	struct radeon_device *rdev = dev->dev_private;
1516
	struct radeon_device *rdev = dev->dev_private;
1424
	uint32_t crtc2_gen_cntl, tv_dac_cntl, dac_cntl2, dac_ext_cntl;
1517
	uint32_t crtc2_gen_cntl = 0, tv_dac_cntl, dac_cntl2, dac_ext_cntl;
-
 
1518
	uint32_t gpiopad_a = 0, pixclks_cntl, tmp;
1425
	uint32_t disp_hw_debug, disp_output_cntl, gpiopad_a, pixclks_cntl, tmp;
1519
	uint32_t disp_output_cntl = 0, disp_hw_debug = 0, crtc_ext_cntl = 0;
1426
	enum drm_connector_status found = connector_status_disconnected;
1520
	enum drm_connector_status found = connector_status_disconnected;
1427
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1521
	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1428
	struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
1522
	struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
1429
	bool color = true;
1523
	bool color = true;
Line 1457... Line 1551...
1457
	if (radeon_encoder->active_device && !(radeon_encoder->active_device & ATOM_DEVICE_CRT_SUPPORT)) {
1551
	if (radeon_encoder->active_device && !(radeon_encoder->active_device & ATOM_DEVICE_CRT_SUPPORT)) {
1458
		DRM_INFO("not detecting due to %08x\n", radeon_encoder->active_device);
1552
		DRM_INFO("not detecting due to %08x\n", radeon_encoder->active_device);
1459
		return connector_status_disconnected;
1553
		return connector_status_disconnected;
1460
	}
1554
	}
Line -... Line 1555...
-
 
1555
 
-
 
1556
	/* R200 uses an external DAC for secondary DAC */
-
 
1557
	if (rdev->family == CHIP_R200) {
-
 
1558
		if (radeon_legacy_ext_dac_detect(encoder, connector))
-
 
1559
			found = connector_status_connected;
-
 
1560
		return found;
-
 
1561
	}
1461
 
1562
 
1462
	/* save the regs we need */
1563
	/* save the regs we need */
-
 
1564
	pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL);
-
 
1565
 
-
 
1566
	if (rdev->flags & RADEON_SINGLE_CRTC) {
-
 
1567
		crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
-
 
1568
	} else {
1463
	pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL);
1569
		if (ASIC_IS_R300(rdev)) {
1464
	gpiopad_a = ASIC_IS_R300(rdev) ? RREG32(RADEON_GPIOPAD_A) : 0;
1570
			gpiopad_a = RREG32(RADEON_GPIOPAD_A);
-
 
1571
			disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL);
1465
	disp_output_cntl = ASIC_IS_R300(rdev) ? RREG32(RADEON_DISP_OUTPUT_CNTL) : 0;
1572
		} else {
-
 
1573
			disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG);
1466
	disp_hw_debug = ASIC_IS_R300(rdev) ? 0 : RREG32(RADEON_DISP_HW_DEBUG);
1574
		}
-
 
1575
	crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL);
1467
	crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL);
1576
	}
1468
	tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL);
1577
	tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL);
1469
	dac_ext_cntl = RREG32(RADEON_DAC_EXT_CNTL);
1578
	dac_ext_cntl = RREG32(RADEON_DAC_EXT_CNTL);
Line 1470... Line 1579...
1470
	dac_cntl2 = RREG32(RADEON_DAC_CNTL2);
1579
	dac_cntl2 = RREG32(RADEON_DAC_CNTL2);
1471
 
1580
 
1472
	tmp = pixclks_cntl & ~(RADEON_PIX2CLK_ALWAYS_ONb
1581
	tmp = pixclks_cntl & ~(RADEON_PIX2CLK_ALWAYS_ONb
Line 1473... Line 1582...
1473
			       | RADEON_PIX2CLK_DAC_ALWAYS_ONb);
1582
			       | RADEON_PIX2CLK_DAC_ALWAYS_ONb);
-
 
1583
	WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
1474
	WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
1584
 
1475
 
1585
	if (rdev->flags & RADEON_SINGLE_CRTC) {
1476
	if (ASIC_IS_R300(rdev))
1586
		tmp = crtc_ext_cntl | RADEON_CRTC_CRT_ON;
1477
		WREG32_P(RADEON_GPIOPAD_A, 1, ~1);
1587
		WREG32(RADEON_CRTC_EXT_CNTL, tmp);
1478
 
1588
	} else {
1479
	tmp = crtc2_gen_cntl & ~RADEON_CRTC2_PIX_WIDTH_MASK;
-
 
1480
	tmp |= RADEON_CRTC2_CRT2_ON |
1589
	tmp = crtc2_gen_cntl & ~RADEON_CRTC2_PIX_WIDTH_MASK;
Line 1481... Line 1590...
1481
		(2 << RADEON_CRTC2_PIX_WIDTH_SHIFT);
1590
	tmp |= RADEON_CRTC2_CRT2_ON |
-
 
1591
		(2 << RADEON_CRTC2_PIX_WIDTH_SHIFT);
1482
 
1592
	WREG32(RADEON_CRTC2_GEN_CNTL, tmp);
1483
	WREG32(RADEON_CRTC2_GEN_CNTL, tmp);
1593
 
1484
 
1594
	if (ASIC_IS_R300(rdev)) {
1485
	if (ASIC_IS_R300(rdev)) {
1595
			WREG32_P(RADEON_GPIOPAD_A, 1, ~1);
1486
		tmp = disp_output_cntl & ~RADEON_DISP_TVDAC_SOURCE_MASK;
1596
		tmp = disp_output_cntl & ~RADEON_DISP_TVDAC_SOURCE_MASK;
1487
		tmp |= RADEON_DISP_TVDAC_SOURCE_CRTC2;
1597
		tmp |= RADEON_DISP_TVDAC_SOURCE_CRTC2;
1488
		WREG32(RADEON_DISP_OUTPUT_CNTL, tmp);
1598
		WREG32(RADEON_DISP_OUTPUT_CNTL, tmp);
-
 
1599
	} else {
Line 1489... Line 1600...
1489
	} else {
1600
		tmp = disp_hw_debug & ~RADEON_CRT2_DISP1_SEL;
1490
		tmp = disp_hw_debug & ~RADEON_CRT2_DISP1_SEL;
1601
		WREG32(RADEON_DISP_HW_DEBUG, tmp);
1491
		WREG32(RADEON_DISP_HW_DEBUG, tmp);
1602
	}
1492
	}
1603
	}
Line 1528... Line 1639...
1528
 
1639
 
1529
	/* restore regs we used */
1640
	/* restore regs we used */
1530
	WREG32(RADEON_DAC_CNTL2, dac_cntl2);
1641
	WREG32(RADEON_DAC_CNTL2, dac_cntl2);
1531
	WREG32(RADEON_DAC_EXT_CNTL, dac_ext_cntl);
1642
	WREG32(RADEON_DAC_EXT_CNTL, dac_ext_cntl);
1532
	WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
-
 
Line -... Line 1643...
-
 
1643
	WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
-
 
1644
 
-
 
1645
	if (rdev->flags & RADEON_SINGLE_CRTC) {
-
 
1646
		WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl);
1533
	WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
1647
	} else {
1534
 
1648
	WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
1535
	if (ASIC_IS_R300(rdev)) {
1649
	if (ASIC_IS_R300(rdev)) {
1536
		WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl);
1650
		WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl);
1537
		WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1);
1651
		WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1);
1538
	} else {
1652
	} else {
-
 
1653
		WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug);
-
 
1654
	}
1539
		WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug);
1655
	}
Line 1540... Line 1656...
1540
	}
1656
 
Line 1541... Line 1657...
1541
	WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
1657
	WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);