Subversion Repositories Kolibri OS

Rev

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

Rev 1404 Rev 1413
Line 1389... Line 1389...
1389
 */
1389
 */
1390
void r600_cp_stop(struct radeon_device *rdev)
1390
void r600_cp_stop(struct radeon_device *rdev)
1391
{
1391
{
1392
	WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1));
1392
	WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1));
1393
}
1393
}
-
 
1394
 
-
 
1395
int r600_init_microcode(struct radeon_device *rdev)
-
 
1396
{
-
 
1397
	struct platform_device *pdev;
-
 
1398
	const char *chip_name;
-
 
1399
	const char *rlc_chip_name;
-
 
1400
	size_t pfp_req_size, me_req_size, rlc_req_size;
-
 
1401
	char fw_name[30];
-
 
1402
	int err;
-
 
1403
 
-
 
1404
	DRM_DEBUG("\n");
-
 
1405
 
-
 
1406
	pdev = platform_device_register_simple("radeon_cp", 0, NULL, 0);
-
 
1407
	err = IS_ERR(pdev);
-
 
1408
	if (err) {
-
 
1409
		printk(KERN_ERR "radeon_cp: Failed to register firmware\n");
-
 
1410
		return -EINVAL;
-
 
1411
	}
-
 
1412
 
-
 
1413
	switch (rdev->family) {
-
 
1414
	case CHIP_R600:
-
 
1415
		chip_name = "R600";
-
 
1416
		rlc_chip_name = "R600";
-
 
1417
		break;
-
 
1418
	case CHIP_RV610:
-
 
1419
		chip_name = "RV610";
-
 
1420
		rlc_chip_name = "R600";
-
 
1421
		break;
-
 
1422
	case CHIP_RV630:
-
 
1423
		chip_name = "RV630";
-
 
1424
		rlc_chip_name = "R600";
-
 
1425
		break;
-
 
1426
	case CHIP_RV620:
-
 
1427
		chip_name = "RV620";
-
 
1428
		rlc_chip_name = "R600";
-
 
1429
		break;
-
 
1430
	case CHIP_RV635:
-
 
1431
		chip_name = "RV635";
-
 
1432
		rlc_chip_name = "R600";
-
 
1433
		break;
-
 
1434
	case CHIP_RV670:
-
 
1435
		chip_name = "RV670";
-
 
1436
		rlc_chip_name = "R600";
-
 
1437
		break;
-
 
1438
	case CHIP_RS780:
-
 
1439
	case CHIP_RS880:
-
 
1440
		chip_name = "RS780";
-
 
1441
		rlc_chip_name = "R600";
-
 
1442
		break;
-
 
1443
	case CHIP_RV770:
-
 
1444
		chip_name = "RV770";
-
 
1445
		rlc_chip_name = "R700";
-
 
1446
		break;
-
 
1447
	case CHIP_RV730:
-
 
1448
	case CHIP_RV740:
-
 
1449
		chip_name = "RV730";
-
 
1450
		rlc_chip_name = "R700";
-
 
1451
		break;
-
 
1452
	case CHIP_RV710:
-
 
1453
		chip_name = "RV710";
-
 
1454
		rlc_chip_name = "R700";
-
 
1455
		break;
-
 
1456
	default: BUG();
-
 
1457
	}
-
 
1458
 
-
 
1459
	if (rdev->family >= CHIP_RV770) {
-
 
1460
		pfp_req_size = R700_PFP_UCODE_SIZE * 4;
-
 
1461
		me_req_size = R700_PM4_UCODE_SIZE * 4;
-
 
1462
		rlc_req_size = R700_RLC_UCODE_SIZE * 4;
-
 
1463
	} else {
-
 
1464
		pfp_req_size = PFP_UCODE_SIZE * 4;
-
 
1465
		me_req_size = PM4_UCODE_SIZE * 12;
-
 
1466
		rlc_req_size = RLC_UCODE_SIZE * 4;
-
 
1467
	}
-
 
1468
 
-
 
1469
	DRM_INFO("Loading %s Microcode\n", chip_name);
-
 
1470
 
-
 
1471
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
-
 
1472
	err = request_firmware(&rdev->pfp_fw, fw_name, &pdev->dev);
-
 
1473
	if (err)
-
 
1474
		goto out;
-
 
1475
	if (rdev->pfp_fw->size != pfp_req_size) {
-
 
1476
		printk(KERN_ERR
-
 
1477
		       "r600_cp: Bogus length %zu in firmware \"%s\"\n",
-
 
1478
		       rdev->pfp_fw->size, fw_name);
-
 
1479
		err = -EINVAL;
-
 
1480
		goto out;
-
 
1481
	}
-
 
1482
 
-
 
1483
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
-
 
1484
	err = request_firmware(&rdev->me_fw, fw_name, &pdev->dev);
-
 
1485
	if (err)
-
 
1486
		goto out;
-
 
1487
	if (rdev->me_fw->size != me_req_size) {
-
 
1488
		printk(KERN_ERR
-
 
1489
		       "r600_cp: Bogus length %zu in firmware \"%s\"\n",
-
 
1490
		       rdev->me_fw->size, fw_name);
-
 
1491
		err = -EINVAL;
-
 
1492
	}
-
 
1493
 
-
 
1494
	snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
-
 
1495
	err = request_firmware(&rdev->rlc_fw, fw_name, &pdev->dev);
-
 
1496
	if (err)
-
 
1497
		goto out;
-
 
1498
	if (rdev->rlc_fw->size != rlc_req_size) {
-
 
1499
		printk(KERN_ERR
-
 
1500
		       "r600_rlc: Bogus length %zu in firmware \"%s\"\n",
-
 
1501
		       rdev->rlc_fw->size, fw_name);
-
 
1502
		err = -EINVAL;
-
 
1503
	}
-
 
1504
 
-
 
1505
out:
-
 
1506
	platform_device_unregister(pdev);
-
 
1507
 
-
 
1508
	if (err) {
-
 
1509
		if (err != -EINVAL)
-
 
1510
			printk(KERN_ERR
-
 
1511
			       "r600_cp: Failed to load firmware \"%s\"\n",
-
 
1512
			       fw_name);
-
 
1513
		release_firmware(rdev->pfp_fw);
-
 
1514
		rdev->pfp_fw = NULL;
-
 
1515
		release_firmware(rdev->me_fw);
-
 
1516
		rdev->me_fw = NULL;
-
 
1517
		release_firmware(rdev->rlc_fw);
-
 
1518
		rdev->rlc_fw = NULL;
-
 
1519
	}
-
 
1520
	return err;
-
 
1521
}
-
 
1522
 
-
 
1523
static int r600_cp_load_microcode(struct radeon_device *rdev)
-
 
1524
{
-
 
1525
	const __be32 *fw_data;
-
 
1526
	int i;
-
 
1527
 
-
 
1528
	if (!rdev->me_fw || !rdev->pfp_fw)
-
 
1529
		return -EINVAL;
-
 
1530
 
-
 
1531
	r600_cp_stop(rdev);
-
 
1532
 
-
 
1533
	WREG32(CP_RB_CNTL, RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
-
 
1534
 
-
 
1535
	/* Reset cp */
-
 
1536
	WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
-
 
1537
	RREG32(GRBM_SOFT_RESET);
-
 
1538
	mdelay(15);
-
 
1539
	WREG32(GRBM_SOFT_RESET, 0);
-
 
1540
 
-
 
1541
	WREG32(CP_ME_RAM_WADDR, 0);
-
 
1542
 
-
 
1543
	fw_data = (const __be32 *)rdev->me_fw->data;
-
 
1544
	WREG32(CP_ME_RAM_WADDR, 0);
-
 
1545
	for (i = 0; i < PM4_UCODE_SIZE * 3; i++)
-
 
1546
		WREG32(CP_ME_RAM_DATA,
-
 
1547
		       be32_to_cpup(fw_data++));
-
 
1548
 
-
 
1549
	fw_data = (const __be32 *)rdev->pfp_fw->data;
-
 
1550
	WREG32(CP_PFP_UCODE_ADDR, 0);
-
 
1551
	for (i = 0; i < PFP_UCODE_SIZE; i++)
-
 
1552
		WREG32(CP_PFP_UCODE_DATA,
-
 
1553
		       be32_to_cpup(fw_data++));
-
 
1554
 
-
 
1555
	WREG32(CP_PFP_UCODE_ADDR, 0);
-
 
1556
	WREG32(CP_ME_RAM_WADDR, 0);
-
 
1557
	WREG32(CP_ME_RAM_RADDR, 0);
-
 
1558
	return 0;
-
 
1559
}
-
 
1560
 
1394
int r600_cp_start(struct radeon_device *rdev)
1561
int r600_cp_start(struct radeon_device *rdev)
1395
{
1562
{
1396
	int r;
1563
	int r;
1397
	uint32_t cp_me;
1564
	uint32_t cp_me;
Line 1417... Line 1584...
1417
 
1584
 
1418
	cp_me = 0xff;
1585
	cp_me = 0xff;
1419
	WREG32(R_0086D8_CP_ME_CNTL, cp_me);
1586
	WREG32(R_0086D8_CP_ME_CNTL, cp_me);
1420
	return 0;
1587
	return 0;
-
 
1588
}
-
 
1589
 
-
 
1590
int r600_cp_resume(struct radeon_device *rdev)
-
 
1591
{
-
 
1592
	u32 tmp;
-
 
1593
	u32 rb_bufsz;
-
 
1594
	int r;
-
 
1595
 
-
 
1596
	/* Reset cp */
-
 
1597
	WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
-
 
1598
	RREG32(GRBM_SOFT_RESET);
-
 
1599
	mdelay(15);
-
 
1600
	WREG32(GRBM_SOFT_RESET, 0);
-
 
1601
 
-
 
1602
	/* Set ring buffer size */
-
 
1603
	rb_bufsz = drm_order(rdev->cp.ring_size / 8);
-
 
1604
	tmp = RB_NO_UPDATE | (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
-
 
1605
#ifdef __BIG_ENDIAN
-
 
1606
	tmp |= BUF_SWAP_32BIT;
-
 
1607
#endif
-
 
1608
	WREG32(CP_RB_CNTL, tmp);
-
 
1609
	WREG32(CP_SEM_WAIT_TIMER, 0x4);
-
 
1610
 
-
 
1611
	/* Set the write pointer delay */
-
 
1612
	WREG32(CP_RB_WPTR_DELAY, 0);
-
 
1613
 
-
 
1614
	/* Initialize the ring buffer's read and write pointers */
-
 
1615
	WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA);
-
 
1616
	WREG32(CP_RB_RPTR_WR, 0);
-
 
1617
	WREG32(CP_RB_WPTR, 0);
-
 
1618
	WREG32(CP_RB_RPTR_ADDR, rdev->cp.gpu_addr & 0xFFFFFFFF);
-
 
1619
	WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->cp.gpu_addr));
-
 
1620
	mdelay(1);
-
 
1621
	WREG32(CP_RB_CNTL, tmp);
-
 
1622
 
-
 
1623
	WREG32(CP_RB_BASE, rdev->cp.gpu_addr >> 8);
-
 
1624
	WREG32(CP_DEBUG, (1 << 27) | (1 << 28));
-
 
1625
 
-
 
1626
	rdev->cp.rptr = RREG32(CP_RB_RPTR);
-
 
1627
	rdev->cp.wptr = RREG32(CP_RB_WPTR);
-
 
1628
 
-
 
1629
	r600_cp_start(rdev);
-
 
1630
	rdev->cp.ready = true;
-
 
1631
	r = radeon_ring_test(rdev);
-
 
1632
	if (r) {
-
 
1633
		rdev->cp.ready = false;
-
 
1634
		return r;
-
 
1635
	}
-
 
1636
	return 0;
-
 
1637
}
1421
}
1638
 
1422
void r600_cp_commit(struct radeon_device *rdev)
1639
void r600_cp_commit(struct radeon_device *rdev)
1423
{
1640
{
1424
	WREG32(CP_RB_WPTR, rdev->cp.wptr);
1641
	WREG32(CP_RB_WPTR, rdev->cp.wptr);
1425
	(void)RREG32(CP_RB_WPTR);
1642
	(void)RREG32(CP_RB_WPTR);
Line 1448... Line 1665...
1448
	for (i = 0; i < rdev->scratch.num_reg; i++) {
1665
	for (i = 0; i < rdev->scratch.num_reg; i++) {
1449
		rdev->scratch.free[i] = true;
1666
		rdev->scratch.free[i] = true;
1450
		rdev->scratch.reg[i] = SCRATCH_REG0 + (i * 4);
1667
		rdev->scratch.reg[i] = SCRATCH_REG0 + (i * 4);
1451
	}
1668
	}
1452
}
1669
}
-
 
1670
 
-
 
1671
int r600_ring_test(struct radeon_device *rdev)
-
 
1672
{
-
 
1673
	uint32_t scratch;
-
 
1674
	uint32_t tmp = 0;
-
 
1675
	unsigned i;
-
 
1676
	int r;
-
 
1677
 
-
 
1678
	r = radeon_scratch_get(rdev, &scratch);
-
 
1679
	if (r) {
-
 
1680
		DRM_ERROR("radeon: cp failed to get scratch reg (%d).\n", r);
-
 
1681
		return r;
-
 
1682
	}
-
 
1683
	WREG32(scratch, 0xCAFEDEAD);
-
 
1684
	r = radeon_ring_lock(rdev, 3);
-
 
1685
	if (r) {
-
 
1686
		DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
-
 
1687
		radeon_scratch_free(rdev, scratch);
-
 
1688
		return r;
-
 
1689
	}
-
 
1690
	radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1));
-
 
1691
	radeon_ring_write(rdev, ((scratch - PACKET3_SET_CONFIG_REG_OFFSET) >> 2));
-
 
1692
	radeon_ring_write(rdev, 0xDEADBEEF);
-
 
1693
	radeon_ring_unlock_commit(rdev);
-
 
1694
	for (i = 0; i < rdev->usec_timeout; i++) {
-
 
1695
		tmp = RREG32(scratch);
-
 
1696
		if (tmp == 0xDEADBEEF)
-
 
1697
			break;
-
 
1698
		DRM_UDELAY(1);
-
 
1699
	}
-
 
1700
	if (i < rdev->usec_timeout) {
-
 
1701
		DRM_INFO("ring test succeeded in %d usecs\n", i);
-
 
1702
	} else {
-
 
1703
		DRM_ERROR("radeon: ring test failed (scratch(0x%04X)=0x%08X)\n",
-
 
1704
			  scratch, tmp);
-
 
1705
		r = -EINVAL;
-
 
1706
	}
-
 
1707
	radeon_scratch_free(rdev, scratch);
-
 
1708
	return r;
-
 
1709
}
-
 
1710
void r600_fence_ring_emit(struct radeon_device *rdev,
-
 
1711
			  struct radeon_fence *fence)
-
 
1712
{
-
 
1713
	/* Also consider EVENT_WRITE_EOP.  it handles the interrupts + timestamps + events */
-
 
1714
	/* Emit fence sequence & fire IRQ */
-
 
1715
	radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1));
-
 
1716
	radeon_ring_write(rdev, ((rdev->fence_drv.scratch_reg - PACKET3_SET_CONFIG_REG_OFFSET) >> 2));
-
 
1717
	radeon_ring_write(rdev, fence->seq);
-
 
1718
	radeon_ring_write(rdev, PACKET0(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0));
-
 
1719
	radeon_ring_write(rdev, 1);
-
 
1720
	/* CP_INTERRUPT packet 3 no longer exists, use packet 0 */
-
 
1721
	radeon_ring_write(rdev, PACKET0(CP_INT_STATUS, 0));
-
 
1722
	radeon_ring_write(rdev, RB_INT_STAT);
-
 
1723
}
1453
int r600_set_surface_reg(struct radeon_device *rdev, int reg,
1724
int r600_set_surface_reg(struct radeon_device *rdev, int reg,
1454
			 uint32_t tiling_flags, uint32_t pitch,
1725
			 uint32_t tiling_flags, uint32_t pitch,
1455
			 uint32_t offset, uint32_t obj_size)
1726
			 uint32_t offset, uint32_t obj_size)
1456
{
1727
{
1457
	/* FIXME: implement */
1728
	/* FIXME: implement */
Line 1483... Line 1754...
1483
 
1754
 
1484
int r600_startup(struct radeon_device *rdev)
1755
int r600_startup(struct radeon_device *rdev)
1485
{
1756
{
Line -... Line 1757...
-
 
1757
	int r;
-
 
1758
 
-
 
1759
	if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
-
 
1760
		r = r600_init_microcode(rdev);
-
 
1761
		if (r) {
-
 
1762
			DRM_ERROR("Failed to load firmware!\n");
-
 
1763
			return r;
-
 
1764
		}
1486
	int r;
1765
	}
1487
 
1766
 
1488
	r600_mc_program(rdev);
1767
	r600_mc_program(rdev);
1489
	if (rdev->flags & RADEON_IS_AGP) {
1768
	if (rdev->flags & RADEON_IS_AGP) {
1490
		r600_agp_enable(rdev);
1769
		r600_agp_enable(rdev);
1491
	} else {
1770
	} else {
1492
		r = r600_pcie_gart_enable(rdev);
1771
		r = r600_pcie_gart_enable(rdev);
1493
		if (r)
1772
		if (r)
1494
			return r;
1773
			return r;
Line 1495... Line -...
1495
	}
-
 
1496
	r600_gpu_init(rdev);
-
 
1497
 
-
 
1498
//	r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM,
-
 
1499
//			      &rdev->r600_blit.shader_gpu_addr);
-
 
1500
//	if (r) {
-
 
1501
//		DRM_ERROR("failed to pin blit object %d\n", r);
-
 
1502
//		return r;
1774
	}
1503
//	}
1775
	r600_gpu_init(rdev);
1504
 
1776
 
1505
//	r = radeon_ring_init(rdev, rdev->cp.ring_size);
1777
	r = radeon_ring_init(rdev, rdev->cp.ring_size);
1506
//	if (r)
1778
	if (r)
1507
//		return r;
1779
		return r;
1508
//	r = r600_cp_load_microcode(rdev);
1780
	r = r600_cp_load_microcode(rdev);
1509
//	if (r)
1781
	if (r)
1510
//		return r;
1782
		return r;
1511
//	r = r600_cp_resume(rdev);
1783
	r = r600_cp_resume(rdev);
1512
//	if (r)
1784
	if (r)
1513
//		return r;
1785
		return r;
1514
	/* write back buffer are not vital so don't worry about failure */
1786
	/* write back buffer are not vital so don't worry about failure */
Line 1607... Line 1879...
1607
 
1879
 
1608
//	r = radeon_irq_kms_init(rdev);
1880
//	r = radeon_irq_kms_init(rdev);
1609
//	if (r)
1881
//	if (r)
Line 1610... Line 1882...
1610
//		return r;
1882
//		return r;
1611
 
1883
 
Line 1612... Line 1884...
1612
//	rdev->cp.ring_obj = NULL;
1884
	rdev->cp.ring_obj = NULL;
1613
//	r600_ring_init(rdev, 1024 * 1024);
1885
	r600_ring_init(rdev, 1024 * 1024);
Line 1614... Line 1886...
1614
 
1886
 
1615
//	rdev->ih.ring_obj = NULL;
1887
//	rdev->ih.ring_obj = NULL;
1616
//	r600_ih_ring_init(rdev, 64 * 1024);
1888
//	r600_ih_ring_init(rdev, 64 * 1024);
Line 1617... Line -...
1617
 
-
 
1618
	r = r600_pcie_gart_init(rdev);
-
 
1619
	if (r)
-
 
1620
		return r;
-
 
1621
 
-
 
1622
//	r = r600_blit_init(rdev);
-
 
1623
//	if (r) {
1889
 
1624
//		DRM_ERROR("radeon: failled blitter (%d).\n", r);
1890
	r = r600_pcie_gart_init(rdev);
1625
//		return r;
1891
	if (r)
1626
//	}
1892
		return r;
1627
 
1893