r600.c (1614f8b17b8cc3ad143541d41569623d30dbc9ec) r600.c (4c7886791264f03428d5424befb1b96f08fc90f4)
1/*
2 * Copyright 2008 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation

--- 170 unchanged lines hidden (view full) ---

179 r600_pcie_gart_tlb_flush(rdev);
180 rdev->gart.ready = true;
181 return 0;
182}
183
184void r600_pcie_gart_disable(struct radeon_device *rdev)
185{
186 u32 tmp;
1/*
2 * Copyright 2008 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation

--- 170 unchanged lines hidden (view full) ---

179 r600_pcie_gart_tlb_flush(rdev);
180 rdev->gart.ready = true;
181 return 0;
182}
183
184void r600_pcie_gart_disable(struct radeon_device *rdev)
185{
186 u32 tmp;
187 int i;
187 int i, r;
188
189 /* Disable all tables */
190 for (i = 0; i < 7; i++)
191 WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
192
193 /* Disable L2 cache */
194 WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
195 EFFECTIVE_L2_QUEUE_SIZE(7));

--- 11 unchanged lines hidden (view full) ---

207 WREG32(MC_VM_L1_TLB_MCB_WR_PDMA_CNTL, tmp);
208 WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp);
209 WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp);
210 WREG32(MC_VM_L1_TLB_MCB_RD_SYS_CNTL, tmp);
211 WREG32(MC_VM_L1_TLB_MCB_WR_SYS_CNTL, tmp);
212 WREG32(MC_VM_L1_TLB_MCB_RD_HDP_CNTL, tmp);
213 WREG32(MC_VM_L1_TLB_MCB_WR_HDP_CNTL, tmp);
214 if (rdev->gart.table.vram.robj) {
188
189 /* Disable all tables */
190 for (i = 0; i < 7; i++)
191 WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
192
193 /* Disable L2 cache */
194 WREG32(VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING |
195 EFFECTIVE_L2_QUEUE_SIZE(7));

--- 11 unchanged lines hidden (view full) ---

207 WREG32(MC_VM_L1_TLB_MCB_WR_PDMA_CNTL, tmp);
208 WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp);
209 WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp);
210 WREG32(MC_VM_L1_TLB_MCB_RD_SYS_CNTL, tmp);
211 WREG32(MC_VM_L1_TLB_MCB_WR_SYS_CNTL, tmp);
212 WREG32(MC_VM_L1_TLB_MCB_RD_HDP_CNTL, tmp);
213 WREG32(MC_VM_L1_TLB_MCB_WR_HDP_CNTL, tmp);
214 if (rdev->gart.table.vram.robj) {
215 radeon_object_kunmap(rdev->gart.table.vram.robj);
216 radeon_object_unpin(rdev->gart.table.vram.robj);
215 r = radeon_bo_reserve(rdev->gart.table.vram.robj, false);
216 if (likely(r == 0)) {
217 radeon_bo_kunmap(rdev->gart.table.vram.robj);
218 radeon_bo_unpin(rdev->gart.table.vram.robj);
219 radeon_bo_unreserve(rdev->gart.table.vram.robj);
220 }
217 }
218}
219
220void r600_pcie_gart_fini(struct radeon_device *rdev)
221{
222 r600_pcie_gart_disable(rdev);
223 radeon_gart_table_vram_free(rdev);
224 radeon_gart_fini(rdev);

--- 1206 unchanged lines hidden (view full) ---

1431 r = -EINVAL;
1432 }
1433 radeon_scratch_free(rdev, scratch);
1434 return r;
1435}
1436
1437void r600_wb_disable(struct radeon_device *rdev)
1438{
221 }
222}
223
224void r600_pcie_gart_fini(struct radeon_device *rdev)
225{
226 r600_pcie_gart_disable(rdev);
227 radeon_gart_table_vram_free(rdev);
228 radeon_gart_fini(rdev);

--- 1206 unchanged lines hidden (view full) ---

1435 r = -EINVAL;
1436 }
1437 radeon_scratch_free(rdev, scratch);
1438 return r;
1439}
1440
1441void r600_wb_disable(struct radeon_device *rdev)
1442{
1443 int r;
1444
1439 WREG32(SCRATCH_UMSK, 0);
1440 if (rdev->wb.wb_obj) {
1445 WREG32(SCRATCH_UMSK, 0);
1446 if (rdev->wb.wb_obj) {
1441 radeon_object_kunmap(rdev->wb.wb_obj);
1442 radeon_object_unpin(rdev->wb.wb_obj);
1447 r = radeon_bo_reserve(rdev->wb.wb_obj, false);
1448 if (unlikely(r != 0))
1449 return;
1450 radeon_bo_kunmap(rdev->wb.wb_obj);
1451 radeon_bo_unpin(rdev->wb.wb_obj);
1452 radeon_bo_unreserve(rdev->wb.wb_obj);
1443 }
1444}
1445
1446void r600_wb_fini(struct radeon_device *rdev)
1447{
1448 r600_wb_disable(rdev);
1449 if (rdev->wb.wb_obj) {
1453 }
1454}
1455
1456void r600_wb_fini(struct radeon_device *rdev)
1457{
1458 r600_wb_disable(rdev);
1459 if (rdev->wb.wb_obj) {
1450 radeon_object_unref(&rdev->wb.wb_obj);
1460 radeon_bo_unref(&rdev->wb.wb_obj);
1451 rdev->wb.wb = NULL;
1452 rdev->wb.wb_obj = NULL;
1453 }
1454}
1455
1456int r600_wb_enable(struct radeon_device *rdev)
1457{
1458 int r;
1459
1460 if (rdev->wb.wb_obj == NULL) {
1461 rdev->wb.wb = NULL;
1462 rdev->wb.wb_obj = NULL;
1463 }
1464}
1465
1466int r600_wb_enable(struct radeon_device *rdev)
1467{
1468 int r;
1469
1470 if (rdev->wb.wb_obj == NULL) {
1461 r = radeon_object_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, true,
1462 RADEON_GEM_DOMAIN_GTT, false, &rdev->wb.wb_obj);
1471 r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, true,
1472 RADEON_GEM_DOMAIN_GTT, &rdev->wb.wb_obj);
1463 if (r) {
1473 if (r) {
1464 dev_warn(rdev->dev, "failed to create WB buffer (%d).\n", r);
1474 dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
1465 return r;
1466 }
1475 return r;
1476 }
1467 r = radeon_object_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT,
1477 r = radeon_bo_reserve(rdev->wb.wb_obj, false);
1478 if (unlikely(r != 0)) {
1479 r600_wb_fini(rdev);
1480 return r;
1481 }
1482 r = radeon_bo_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT,
1468 &rdev->wb.gpu_addr);
1469 if (r) {
1483 &rdev->wb.gpu_addr);
1484 if (r) {
1470 dev_warn(rdev->dev, "failed to pin WB buffer (%d).\n", r);
1485 radeon_bo_unreserve(rdev->wb.wb_obj);
1486 dev_warn(rdev->dev, "(%d) pin WB bo failed\n", r);
1471 r600_wb_fini(rdev);
1472 return r;
1473 }
1487 r600_wb_fini(rdev);
1488 return r;
1489 }
1474 r = radeon_object_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb);
1490 r = radeon_bo_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb);
1491 radeon_bo_unreserve(rdev->wb.wb_obj);
1475 if (r) {
1492 if (r) {
1476 dev_warn(rdev->dev, "failed to map WB buffer (%d).\n", r);
1493 dev_warn(rdev->dev, "(%d) map WB bo failed\n", r);
1477 r600_wb_fini(rdev);
1478 return r;
1479 }
1480 }
1481 WREG32(SCRATCH_ADDR, (rdev->wb.gpu_addr >> 8) & 0xFFFFFFFF);
1482 WREG32(CP_RB_RPTR_ADDR, (rdev->wb.gpu_addr + 1024) & 0xFFFFFFFC);
1483 WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + 1024) & 0xFF);
1484 WREG32(SCRATCH_UMSK, 0xff);

--- 73 unchanged lines hidden (view full) ---

1558 r600_agp_enable(rdev);
1559 } else {
1560 r = r600_pcie_gart_enable(rdev);
1561 if (r)
1562 return r;
1563 }
1564 r600_gpu_init(rdev);
1565
1494 r600_wb_fini(rdev);
1495 return r;
1496 }
1497 }
1498 WREG32(SCRATCH_ADDR, (rdev->wb.gpu_addr >> 8) & 0xFFFFFFFF);
1499 WREG32(CP_RB_RPTR_ADDR, (rdev->wb.gpu_addr + 1024) & 0xFFFFFFFC);
1500 WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + 1024) & 0xFF);
1501 WREG32(SCRATCH_UMSK, 0xff);

--- 73 unchanged lines hidden (view full) ---

1575 r600_agp_enable(rdev);
1576 } else {
1577 r = r600_pcie_gart_enable(rdev);
1578 if (r)
1579 return r;
1580 }
1581 r600_gpu_init(rdev);
1582
1566 r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM,
1567 &rdev->r600_blit.shader_gpu_addr);
1583 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
1584 if (unlikely(r != 0))
1585 return r;
1586 r = radeon_bo_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM,
1587 &rdev->r600_blit.shader_gpu_addr);
1588 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
1568 if (r) {
1589 if (r) {
1569 DRM_ERROR("failed to pin blit object %d\n", r);
1590 dev_err(rdev->dev, "(%d) pin blit object failed\n", r);
1570 return r;
1571 }
1572
1573 /* Enable IRQ */
1574 r = r600_irq_init(rdev);
1575 if (r) {
1576 DRM_ERROR("radeon: IH init failed (%d).\n", r);
1577 radeon_irq_kms_fini(rdev);

--- 56 unchanged lines hidden (view full) ---

1634 DRM_ERROR("radeon: failled testing IB (%d).\n", r);
1635 return r;
1636 }
1637 return r;
1638}
1639
1640int r600_suspend(struct radeon_device *rdev)
1641{
1591 return r;
1592 }
1593
1594 /* Enable IRQ */
1595 r = r600_irq_init(rdev);
1596 if (r) {
1597 DRM_ERROR("radeon: IH init failed (%d).\n", r);
1598 radeon_irq_kms_fini(rdev);

--- 56 unchanged lines hidden (view full) ---

1655 DRM_ERROR("radeon: failled testing IB (%d).\n", r);
1656 return r;
1657 }
1658 return r;
1659}
1660
1661int r600_suspend(struct radeon_device *rdev)
1662{
1663 int r;
1664
1642 /* FIXME: we should wait for ring to be empty */
1643 r600_cp_stop(rdev);
1644 rdev->cp.ready = false;
1645 r600_wb_disable(rdev);
1646 r600_pcie_gart_disable(rdev);
1647 /* unpin shaders bo */
1665 /* FIXME: we should wait for ring to be empty */
1666 r600_cp_stop(rdev);
1667 rdev->cp.ready = false;
1668 r600_wb_disable(rdev);
1669 r600_pcie_gart_disable(rdev);
1670 /* unpin shaders bo */
1648 radeon_object_unpin(rdev->r600_blit.shader_obj);
1671 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
1672 if (unlikely(r != 0))
1673 return r;
1674 radeon_bo_unpin(rdev->r600_blit.shader_obj);
1675 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
1649 return 0;
1650}
1651
1652/* Plan is to move initialization in that function and use
1653 * helper function so that radeon_device_init pretty much
1654 * do nothing more than calling asic specific function. This
1655 * should also allow to remove a bunch of callback function
1656 * like vram_info.

--- 48 unchanged lines hidden (view full) ---

1705 /* Fence driver */
1706 r = radeon_fence_driver_init(rdev);
1707 if (r)
1708 return r;
1709 r = r600_mc_init(rdev);
1710 if (r)
1711 return r;
1712 /* Memory manager */
1676 return 0;
1677}
1678
1679/* Plan is to move initialization in that function and use
1680 * helper function so that radeon_device_init pretty much
1681 * do nothing more than calling asic specific function. This
1682 * should also allow to remove a bunch of callback function
1683 * like vram_info.

--- 48 unchanged lines hidden (view full) ---

1732 /* Fence driver */
1733 r = radeon_fence_driver_init(rdev);
1734 if (r)
1735 return r;
1736 r = r600_mc_init(rdev);
1737 if (r)
1738 return r;
1739 /* Memory manager */
1713 r = radeon_object_init(rdev);
1740 r = radeon_bo_init(rdev);
1714 if (r)
1715 return r;
1716
1717 r = radeon_irq_kms_init(rdev);
1718 if (r)
1719 return r;
1720
1721 rdev->cp.ring_obj = NULL;

--- 55 unchanged lines hidden (view full) ---

1777 radeon_ring_fini(rdev);
1778 r600_wb_fini(rdev);
1779 r600_pcie_gart_fini(rdev);
1780 radeon_gem_fini(rdev);
1781 radeon_fence_driver_fini(rdev);
1782 radeon_clocks_fini(rdev);
1783 if (rdev->flags & RADEON_IS_AGP)
1784 radeon_agp_fini(rdev);
1741 if (r)
1742 return r;
1743
1744 r = radeon_irq_kms_init(rdev);
1745 if (r)
1746 return r;
1747
1748 rdev->cp.ring_obj = NULL;

--- 55 unchanged lines hidden (view full) ---

1804 radeon_ring_fini(rdev);
1805 r600_wb_fini(rdev);
1806 r600_pcie_gart_fini(rdev);
1807 radeon_gem_fini(rdev);
1808 radeon_fence_driver_fini(rdev);
1809 radeon_clocks_fini(rdev);
1810 if (rdev->flags & RADEON_IS_AGP)
1811 radeon_agp_fini(rdev);
1785 radeon_object_fini(rdev);
1812 radeon_bo_fini(rdev);
1786 radeon_atombios_fini(rdev);
1787 kfree(rdev->bios);
1788 rdev->bios = NULL;
1789 radeon_dummy_page_fini(rdev);
1790}
1791
1792
1793/*

--- 98 unchanged lines hidden (view full) ---

1892
1893static int r600_ih_ring_alloc(struct radeon_device *rdev, unsigned ring_size)
1894{
1895 int r;
1896
1897 rdev->ih.ring_size = ring_size;
1898 /* Allocate ring buffer */
1899 if (rdev->ih.ring_obj == NULL) {
1813 radeon_atombios_fini(rdev);
1814 kfree(rdev->bios);
1815 rdev->bios = NULL;
1816 radeon_dummy_page_fini(rdev);
1817}
1818
1819
1820/*

--- 98 unchanged lines hidden (view full) ---

1919
1920static int r600_ih_ring_alloc(struct radeon_device *rdev, unsigned ring_size)
1921{
1922 int r;
1923
1924 rdev->ih.ring_size = ring_size;
1925 /* Allocate ring buffer */
1926 if (rdev->ih.ring_obj == NULL) {
1900 r = radeon_object_create(rdev, NULL, rdev->ih.ring_size,
1901 true,
1902 RADEON_GEM_DOMAIN_GTT,
1903 false,
1904 &rdev->ih.ring_obj);
1927 r = radeon_bo_create(rdev, NULL, rdev->ih.ring_size,
1928 true,
1929 RADEON_GEM_DOMAIN_GTT,
1930 &rdev->ih.ring_obj);
1905 if (r) {
1906 DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r);
1907 return r;
1908 }
1931 if (r) {
1932 DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r);
1933 return r;
1934 }
1909 r = radeon_object_pin(rdev->ih.ring_obj,
1910 RADEON_GEM_DOMAIN_GTT,
1911 &rdev->ih.gpu_addr);
1935 r = radeon_bo_reserve(rdev->ih.ring_obj, false);
1936 if (unlikely(r != 0))
1937 return r;
1938 r = radeon_bo_pin(rdev->ih.ring_obj,
1939 RADEON_GEM_DOMAIN_GTT,
1940 &rdev->ih.gpu_addr);
1912 if (r) {
1941 if (r) {
1942 radeon_bo_unreserve(rdev->ih.ring_obj);
1913 DRM_ERROR("radeon: failed to pin ih ring buffer (%d).\n", r);
1914 return r;
1915 }
1943 DRM_ERROR("radeon: failed to pin ih ring buffer (%d).\n", r);
1944 return r;
1945 }
1916 r = radeon_object_kmap(rdev->ih.ring_obj,
1917 (void **)&rdev->ih.ring);
1946 r = radeon_bo_kmap(rdev->ih.ring_obj,
1947 (void **)&rdev->ih.ring);
1948 radeon_bo_unreserve(rdev->ih.ring_obj);
1918 if (r) {
1919 DRM_ERROR("radeon: failed to map ih ring buffer (%d).\n", r);
1920 return r;
1921 }
1922 }
1923 rdev->ih.ptr_mask = (rdev->cp.ring_size / 4) - 1;
1924 rdev->ih.rptr = 0;
1925
1926 return 0;
1927}
1928
1929static void r600_ih_ring_fini(struct radeon_device *rdev)
1930{
1949 if (r) {
1950 DRM_ERROR("radeon: failed to map ih ring buffer (%d).\n", r);
1951 return r;
1952 }
1953 }
1954 rdev->ih.ptr_mask = (rdev->cp.ring_size / 4) - 1;
1955 rdev->ih.rptr = 0;
1956
1957 return 0;
1958}
1959
1960static void r600_ih_ring_fini(struct radeon_device *rdev)
1961{
1962 int r;
1931 if (rdev->ih.ring_obj) {
1963 if (rdev->ih.ring_obj) {
1932 radeon_object_kunmap(rdev->ih.ring_obj);
1933 radeon_object_unpin(rdev->ih.ring_obj);
1934 radeon_object_unref(&rdev->ih.ring_obj);
1964 r = radeon_bo_reserve(rdev->ih.ring_obj, false);
1965 if (likely(r == 0)) {
1966 radeon_bo_kunmap(rdev->ih.ring_obj);
1967 radeon_bo_unpin(rdev->ih.ring_obj);
1968 radeon_bo_unreserve(rdev->ih.ring_obj);
1969 }
1970 radeon_bo_unref(&rdev->ih.ring_obj);
1935 rdev->ih.ring = NULL;
1936 rdev->ih.ring_obj = NULL;
1937 }
1938}
1939
1940static void r600_rlc_stop(struct radeon_device *rdev)
1941{
1942

--- 429 unchanged lines hidden ---
1971 rdev->ih.ring = NULL;
1972 rdev->ih.ring_obj = NULL;
1973 }
1974}
1975
1976static void r600_rlc_stop(struct radeon_device *rdev)
1977{
1978

--- 429 unchanged lines hidden ---