| .. | .. |
|---|
| 21 | 21 | * |
|---|
| 22 | 22 | */ |
|---|
| 23 | 23 | #include <linux/firmware.h> |
|---|
| 24 | +#include <linux/module.h> |
|---|
| 25 | + |
|---|
| 24 | 26 | #include "amdgpu.h" |
|---|
| 25 | 27 | #include "amdgpu_ih.h" |
|---|
| 26 | 28 | #include "amdgpu_gfx.h" |
|---|
| .. | .. |
|---|
| 782 | 784 | BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
|---|
| 783 | 785 | BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
|---|
| 784 | 786 | MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2); |
|---|
| 787 | + tilemode[18] = MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) | |
|---|
| 788 | + ARRAY_MODE(ARRAY_1D_TILED_THICK) | |
|---|
| 789 | + PIPE_CONFIG(ADDR_SURF_P4_8x16); |
|---|
| 790 | + tilemode[19] = MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) | |
|---|
| 791 | + ARRAY_MODE(ARRAY_2D_TILED_XTHICK) | |
|---|
| 792 | + PIPE_CONFIG(ADDR_SURF_P4_8x16) | |
|---|
| 793 | + BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
|---|
| 794 | + BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
|---|
| 795 | + MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
|---|
| 796 | + NUM_BANKS(ADDR_SURF_16_BANK) | |
|---|
| 797 | + TILE_SPLIT(split_equal_to_row_size); |
|---|
| 798 | + tilemode[20] = MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) | |
|---|
| 799 | + ARRAY_MODE(ARRAY_2D_TILED_THICK) | |
|---|
| 800 | + PIPE_CONFIG(ADDR_SURF_P4_8x16) | |
|---|
| 801 | + BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) | |
|---|
| 802 | + BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) | |
|---|
| 803 | + MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) | |
|---|
| 804 | + NUM_BANKS(ADDR_SURF_16_BANK) | |
|---|
| 805 | + TILE_SPLIT(split_equal_to_row_size); |
|---|
| 785 | 806 | tilemode[21] = MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) | |
|---|
| 786 | 807 | ARRAY_MODE(ARRAY_2D_TILED_THIN1) | |
|---|
| 787 | 808 | PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) | |
|---|
| .. | .. |
|---|
| 1552 | 1573 | adev->gfx.config.double_offchip_lds_buf = 0; |
|---|
| 1553 | 1574 | } |
|---|
| 1554 | 1575 | |
|---|
| 1555 | | -static void gfx_v6_0_gpu_init(struct amdgpu_device *adev) |
|---|
| 1576 | +static void gfx_v6_0_constants_init(struct amdgpu_device *adev) |
|---|
| 1556 | 1577 | { |
|---|
| 1557 | 1578 | u32 gb_addr_config = 0; |
|---|
| 1558 | | - u32 mc_shared_chmap, mc_arb_ramcfg; |
|---|
| 1579 | + u32 mc_arb_ramcfg; |
|---|
| 1559 | 1580 | u32 sx_debug_1; |
|---|
| 1560 | 1581 | u32 hdp_host_path_cntl; |
|---|
| 1561 | 1582 | u32 tmp; |
|---|
| .. | .. |
|---|
| 1657 | 1678 | |
|---|
| 1658 | 1679 | WREG32(mmBIF_FB_EN, BIF_FB_EN__FB_READ_EN_MASK | BIF_FB_EN__FB_WRITE_EN_MASK); |
|---|
| 1659 | 1680 | |
|---|
| 1660 | | - mc_shared_chmap = RREG32(mmMC_SHARED_CHMAP); |
|---|
| 1661 | 1681 | adev->gfx.config.mc_arb_ramcfg = RREG32(mmMC_ARB_RAMCFG); |
|---|
| 1662 | 1682 | mc_arb_ramcfg = adev->gfx.config.mc_arb_ramcfg; |
|---|
| 1663 | 1683 | |
|---|
| .. | .. |
|---|
| 1775 | 1795 | int r; |
|---|
| 1776 | 1796 | |
|---|
| 1777 | 1797 | r = amdgpu_gfx_scratch_get(adev, &scratch); |
|---|
| 1778 | | - if (r) { |
|---|
| 1779 | | - DRM_ERROR("amdgpu: cp failed to get scratch reg (%d).\n", r); |
|---|
| 1798 | + if (r) |
|---|
| 1780 | 1799 | return r; |
|---|
| 1781 | | - } |
|---|
| 1800 | + |
|---|
| 1782 | 1801 | WREG32(scratch, 0xCAFEDEAD); |
|---|
| 1783 | 1802 | |
|---|
| 1784 | 1803 | r = amdgpu_ring_alloc(ring, 3); |
|---|
| 1785 | | - if (r) { |
|---|
| 1786 | | - DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n", ring->idx, r); |
|---|
| 1787 | | - amdgpu_gfx_scratch_free(adev, scratch); |
|---|
| 1788 | | - return r; |
|---|
| 1789 | | - } |
|---|
| 1804 | + if (r) |
|---|
| 1805 | + goto error_free_scratch; |
|---|
| 1806 | + |
|---|
| 1790 | 1807 | amdgpu_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); |
|---|
| 1791 | 1808 | amdgpu_ring_write(ring, (scratch - PACKET3_SET_CONFIG_REG_START)); |
|---|
| 1792 | 1809 | amdgpu_ring_write(ring, 0xDEADBEEF); |
|---|
| .. | .. |
|---|
| 1796 | 1813 | tmp = RREG32(scratch); |
|---|
| 1797 | 1814 | if (tmp == 0xDEADBEEF) |
|---|
| 1798 | 1815 | break; |
|---|
| 1799 | | - DRM_UDELAY(1); |
|---|
| 1816 | + udelay(1); |
|---|
| 1800 | 1817 | } |
|---|
| 1801 | | - if (i < adev->usec_timeout) { |
|---|
| 1802 | | - DRM_DEBUG("ring test on %d succeeded in %d usecs\n", ring->idx, i); |
|---|
| 1803 | | - } else { |
|---|
| 1804 | | - DRM_ERROR("amdgpu: ring %d test failed (scratch(0x%04X)=0x%08X)\n", |
|---|
| 1805 | | - ring->idx, scratch, tmp); |
|---|
| 1806 | | - r = -EINVAL; |
|---|
| 1807 | | - } |
|---|
| 1818 | + |
|---|
| 1819 | + if (i >= adev->usec_timeout) |
|---|
| 1820 | + r = -ETIMEDOUT; |
|---|
| 1821 | + |
|---|
| 1822 | +error_free_scratch: |
|---|
| 1808 | 1823 | amdgpu_gfx_scratch_free(adev, scratch); |
|---|
| 1809 | 1824 | return r; |
|---|
| 1810 | 1825 | } |
|---|
| .. | .. |
|---|
| 1845 | 1860 | } |
|---|
| 1846 | 1861 | |
|---|
| 1847 | 1862 | static void gfx_v6_0_ring_emit_ib(struct amdgpu_ring *ring, |
|---|
| 1863 | + struct amdgpu_job *job, |
|---|
| 1848 | 1864 | struct amdgpu_ib *ib, |
|---|
| 1849 | | - unsigned vmid, bool ctx_switch) |
|---|
| 1865 | + uint32_t flags) |
|---|
| 1850 | 1866 | { |
|---|
| 1867 | + unsigned vmid = AMDGPU_JOB_GET_VMID(job); |
|---|
| 1851 | 1868 | u32 header, control = 0; |
|---|
| 1852 | 1869 | |
|---|
| 1853 | 1870 | /* insert SWITCH_BUFFER packet before first IB in the ring frame */ |
|---|
| 1854 | | - if (ctx_switch) { |
|---|
| 1871 | + if (flags & AMDGPU_HAVE_CTX_SWITCH) { |
|---|
| 1855 | 1872 | amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); |
|---|
| 1856 | 1873 | amdgpu_ring_write(ring, 0); |
|---|
| 1857 | 1874 | } |
|---|
| .. | .. |
|---|
| 1892 | 1909 | long r; |
|---|
| 1893 | 1910 | |
|---|
| 1894 | 1911 | r = amdgpu_gfx_scratch_get(adev, &scratch); |
|---|
| 1895 | | - if (r) { |
|---|
| 1896 | | - DRM_ERROR("amdgpu: failed to get scratch reg (%ld).\n", r); |
|---|
| 1912 | + if (r) |
|---|
| 1897 | 1913 | return r; |
|---|
| 1898 | | - } |
|---|
| 1914 | + |
|---|
| 1899 | 1915 | WREG32(scratch, 0xCAFEDEAD); |
|---|
| 1900 | 1916 | memset(&ib, 0, sizeof(ib)); |
|---|
| 1901 | | - r = amdgpu_ib_get(adev, NULL, 256, &ib); |
|---|
| 1902 | | - if (r) { |
|---|
| 1903 | | - DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r); |
|---|
| 1917 | + r = amdgpu_ib_get(adev, NULL, 256, |
|---|
| 1918 | + AMDGPU_IB_POOL_DIRECT, &ib); |
|---|
| 1919 | + if (r) |
|---|
| 1904 | 1920 | goto err1; |
|---|
| 1905 | | - } |
|---|
| 1921 | + |
|---|
| 1906 | 1922 | ib.ptr[0] = PACKET3(PACKET3_SET_CONFIG_REG, 1); |
|---|
| 1907 | 1923 | ib.ptr[1] = ((scratch - PACKET3_SET_CONFIG_REG_START)); |
|---|
| 1908 | 1924 | ib.ptr[2] = 0xDEADBEEF; |
|---|
| .. | .. |
|---|
| 1914 | 1930 | |
|---|
| 1915 | 1931 | r = dma_fence_wait_timeout(f, false, timeout); |
|---|
| 1916 | 1932 | if (r == 0) { |
|---|
| 1917 | | - DRM_ERROR("amdgpu: IB test timed out\n"); |
|---|
| 1918 | 1933 | r = -ETIMEDOUT; |
|---|
| 1919 | 1934 | goto err2; |
|---|
| 1920 | 1935 | } else if (r < 0) { |
|---|
| 1921 | | - DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r); |
|---|
| 1922 | 1936 | goto err2; |
|---|
| 1923 | 1937 | } |
|---|
| 1924 | 1938 | tmp = RREG32(scratch); |
|---|
| 1925 | | - if (tmp == 0xDEADBEEF) { |
|---|
| 1926 | | - DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx); |
|---|
| 1939 | + if (tmp == 0xDEADBEEF) |
|---|
| 1927 | 1940 | r = 0; |
|---|
| 1928 | | - } else { |
|---|
| 1929 | | - DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n", |
|---|
| 1930 | | - scratch, tmp); |
|---|
| 1941 | + else |
|---|
| 1931 | 1942 | r = -EINVAL; |
|---|
| 1932 | | - } |
|---|
| 1933 | 1943 | |
|---|
| 1934 | 1944 | err2: |
|---|
| 1935 | 1945 | amdgpu_ib_free(adev, &ib, NULL); |
|---|
| .. | .. |
|---|
| 1941 | 1951 | |
|---|
| 1942 | 1952 | static void gfx_v6_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable) |
|---|
| 1943 | 1953 | { |
|---|
| 1944 | | - int i; |
|---|
| 1945 | 1954 | if (enable) { |
|---|
| 1946 | 1955 | WREG32(mmCP_ME_CNTL, 0); |
|---|
| 1947 | 1956 | } else { |
|---|
| .. | .. |
|---|
| 1949 | 1958 | CP_ME_CNTL__PFP_HALT_MASK | |
|---|
| 1950 | 1959 | CP_ME_CNTL__CE_HALT_MASK)); |
|---|
| 1951 | 1960 | WREG32(mmSCRATCH_UMSK, 0); |
|---|
| 1952 | | - for (i = 0; i < adev->gfx.num_gfx_rings; i++) |
|---|
| 1953 | | - adev->gfx.gfx_ring[i].ready = false; |
|---|
| 1954 | | - for (i = 0; i < adev->gfx.num_compute_rings; i++) |
|---|
| 1955 | | - adev->gfx.compute_ring[i].ready = false; |
|---|
| 1956 | 1961 | } |
|---|
| 1957 | 1962 | udelay(50); |
|---|
| 1958 | 1963 | } |
|---|
| .. | .. |
|---|
| 2124 | 2129 | |
|---|
| 2125 | 2130 | /* start the rings */ |
|---|
| 2126 | 2131 | gfx_v6_0_cp_gfx_start(adev); |
|---|
| 2127 | | - ring->ready = true; |
|---|
| 2128 | | - r = amdgpu_ring_test_ring(ring); |
|---|
| 2129 | | - if (r) { |
|---|
| 2130 | | - ring->ready = false; |
|---|
| 2132 | + r = amdgpu_ring_test_helper(ring); |
|---|
| 2133 | + if (r) |
|---|
| 2131 | 2134 | return r; |
|---|
| 2132 | | - } |
|---|
| 2133 | 2135 | |
|---|
| 2134 | 2136 | return 0; |
|---|
| 2135 | 2137 | } |
|---|
| .. | .. |
|---|
| 2227 | 2229 | WREG32(mmCP_RB2_CNTL, tmp); |
|---|
| 2228 | 2230 | WREG32(mmCP_RB2_BASE, ring->gpu_addr >> 8); |
|---|
| 2229 | 2231 | |
|---|
| 2230 | | - adev->gfx.compute_ring[0].ready = false; |
|---|
| 2231 | | - adev->gfx.compute_ring[1].ready = false; |
|---|
| 2232 | 2232 | |
|---|
| 2233 | 2233 | for (i = 0; i < 2; i++) { |
|---|
| 2234 | | - r = amdgpu_ring_test_ring(&adev->gfx.compute_ring[i]); |
|---|
| 2234 | + r = amdgpu_ring_test_helper(&adev->gfx.compute_ring[i]); |
|---|
| 2235 | 2235 | if (r) |
|---|
| 2236 | 2236 | return r; |
|---|
| 2237 | | - adev->gfx.compute_ring[i].ready = true; |
|---|
| 2238 | 2237 | } |
|---|
| 2239 | 2238 | |
|---|
| 2240 | 2239 | return 0; |
|---|
| .. | .. |
|---|
| 2368 | 2367 | amdgpu_ring_write(ring, val); |
|---|
| 2369 | 2368 | } |
|---|
| 2370 | 2369 | |
|---|
| 2371 | | -static void gfx_v6_0_rlc_fini(struct amdgpu_device *adev) |
|---|
| 2372 | | -{ |
|---|
| 2373 | | - amdgpu_bo_free_kernel(&adev->gfx.rlc.save_restore_obj, NULL, NULL); |
|---|
| 2374 | | - amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, NULL, NULL); |
|---|
| 2375 | | - amdgpu_bo_free_kernel(&adev->gfx.rlc.cp_table_obj, NULL, NULL); |
|---|
| 2376 | | -} |
|---|
| 2377 | | - |
|---|
| 2378 | 2370 | static int gfx_v6_0_rlc_init(struct amdgpu_device *adev) |
|---|
| 2379 | 2371 | { |
|---|
| 2380 | 2372 | const u32 *src_ptr; |
|---|
| 2381 | 2373 | volatile u32 *dst_ptr; |
|---|
| 2382 | | - u32 dws, i; |
|---|
| 2374 | + u32 dws; |
|---|
| 2383 | 2375 | u64 reg_list_mc_addr; |
|---|
| 2384 | 2376 | const struct cs_section_def *cs_data; |
|---|
| 2385 | 2377 | int r; |
|---|
| .. | .. |
|---|
| 2394 | 2386 | cs_data = adev->gfx.rlc.cs_data; |
|---|
| 2395 | 2387 | |
|---|
| 2396 | 2388 | if (src_ptr) { |
|---|
| 2397 | | - /* save restore block */ |
|---|
| 2398 | | - r = amdgpu_bo_create_reserved(adev, dws * 4, PAGE_SIZE, |
|---|
| 2399 | | - AMDGPU_GEM_DOMAIN_VRAM, |
|---|
| 2400 | | - &adev->gfx.rlc.save_restore_obj, |
|---|
| 2401 | | - &adev->gfx.rlc.save_restore_gpu_addr, |
|---|
| 2402 | | - (void **)&adev->gfx.rlc.sr_ptr); |
|---|
| 2403 | | - if (r) { |
|---|
| 2404 | | - dev_warn(adev->dev, "(%d) create RLC sr bo failed\n", |
|---|
| 2405 | | - r); |
|---|
| 2406 | | - gfx_v6_0_rlc_fini(adev); |
|---|
| 2389 | + /* init save restore block */ |
|---|
| 2390 | + r = amdgpu_gfx_rlc_init_sr(adev, dws); |
|---|
| 2391 | + if (r) |
|---|
| 2407 | 2392 | return r; |
|---|
| 2408 | | - } |
|---|
| 2409 | | - |
|---|
| 2410 | | - /* write the sr buffer */ |
|---|
| 2411 | | - dst_ptr = adev->gfx.rlc.sr_ptr; |
|---|
| 2412 | | - for (i = 0; i < adev->gfx.rlc.reg_list_size; i++) |
|---|
| 2413 | | - dst_ptr[i] = cpu_to_le32(src_ptr[i]); |
|---|
| 2414 | | - |
|---|
| 2415 | | - amdgpu_bo_kunmap(adev->gfx.rlc.save_restore_obj); |
|---|
| 2416 | | - amdgpu_bo_unreserve(adev->gfx.rlc.save_restore_obj); |
|---|
| 2417 | 2393 | } |
|---|
| 2418 | 2394 | |
|---|
| 2419 | 2395 | if (cs_data) { |
|---|
| .. | .. |
|---|
| 2428 | 2404 | (void **)&adev->gfx.rlc.cs_ptr); |
|---|
| 2429 | 2405 | if (r) { |
|---|
| 2430 | 2406 | dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r); |
|---|
| 2431 | | - gfx_v6_0_rlc_fini(adev); |
|---|
| 2407 | + amdgpu_gfx_rlc_fini(adev); |
|---|
| 2432 | 2408 | return r; |
|---|
| 2433 | 2409 | } |
|---|
| 2434 | 2410 | |
|---|
| .. | .. |
|---|
| 2549 | 2525 | if (!adev->gfx.rlc_fw) |
|---|
| 2550 | 2526 | return -EINVAL; |
|---|
| 2551 | 2527 | |
|---|
| 2552 | | - gfx_v6_0_rlc_stop(adev); |
|---|
| 2553 | | - gfx_v6_0_rlc_reset(adev); |
|---|
| 2528 | + adev->gfx.rlc.funcs->stop(adev); |
|---|
| 2529 | + adev->gfx.rlc.funcs->reset(adev); |
|---|
| 2554 | 2530 | gfx_v6_0_init_pg(adev); |
|---|
| 2555 | 2531 | gfx_v6_0_init_cg(adev); |
|---|
| 2556 | 2532 | |
|---|
| .. | .. |
|---|
| 2578 | 2554 | WREG32(mmRLC_UCODE_ADDR, 0); |
|---|
| 2579 | 2555 | |
|---|
| 2580 | 2556 | gfx_v6_0_enable_lbpw(adev, gfx_v6_0_lbpw_supported(adev)); |
|---|
| 2581 | | - gfx_v6_0_rlc_start(adev); |
|---|
| 2557 | + adev->gfx.rlc.funcs->start(adev); |
|---|
| 2582 | 2558 | |
|---|
| 2583 | 2559 | return 0; |
|---|
| 2584 | 2560 | } |
|---|
| .. | .. |
|---|
| 3062 | 3038 | } |
|---|
| 3063 | 3039 | |
|---|
| 3064 | 3040 | static void gfx_v6_0_select_me_pipe_q(struct amdgpu_device *adev, |
|---|
| 3065 | | - u32 me, u32 pipe, u32 q) |
|---|
| 3041 | + u32 me, u32 pipe, u32 q, u32 vm) |
|---|
| 3066 | 3042 | { |
|---|
| 3067 | 3043 | DRM_INFO("Not implemented\n"); |
|---|
| 3068 | 3044 | } |
|---|
| .. | .. |
|---|
| 3075 | 3051 | .select_me_pipe_q = &gfx_v6_0_select_me_pipe_q |
|---|
| 3076 | 3052 | }; |
|---|
| 3077 | 3053 | |
|---|
| 3054 | +static const struct amdgpu_rlc_funcs gfx_v6_0_rlc_funcs = { |
|---|
| 3055 | + .init = gfx_v6_0_rlc_init, |
|---|
| 3056 | + .resume = gfx_v6_0_rlc_resume, |
|---|
| 3057 | + .stop = gfx_v6_0_rlc_stop, |
|---|
| 3058 | + .reset = gfx_v6_0_rlc_reset, |
|---|
| 3059 | + .start = gfx_v6_0_rlc_start |
|---|
| 3060 | +}; |
|---|
| 3061 | + |
|---|
| 3078 | 3062 | static int gfx_v6_0_early_init(void *handle) |
|---|
| 3079 | 3063 | { |
|---|
| 3080 | 3064 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
|---|
| .. | .. |
|---|
| 3082 | 3066 | adev->gfx.num_gfx_rings = GFX6_NUM_GFX_RINGS; |
|---|
| 3083 | 3067 | adev->gfx.num_compute_rings = GFX6_NUM_COMPUTE_RINGS; |
|---|
| 3084 | 3068 | adev->gfx.funcs = &gfx_v6_0_gfx_funcs; |
|---|
| 3069 | + adev->gfx.rlc.funcs = &gfx_v6_0_rlc_funcs; |
|---|
| 3085 | 3070 | gfx_v6_0_set_ring_funcs(adev); |
|---|
| 3086 | 3071 | gfx_v6_0_set_irq_funcs(adev); |
|---|
| 3087 | 3072 | |
|---|
| .. | .. |
|---|
| 3094 | 3079 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
|---|
| 3095 | 3080 | int i, r; |
|---|
| 3096 | 3081 | |
|---|
| 3097 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 181, &adev->gfx.eop_irq); |
|---|
| 3082 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 181, &adev->gfx.eop_irq); |
|---|
| 3098 | 3083 | if (r) |
|---|
| 3099 | 3084 | return r; |
|---|
| 3100 | 3085 | |
|---|
| 3101 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 184, &adev->gfx.priv_reg_irq); |
|---|
| 3086 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 184, &adev->gfx.priv_reg_irq); |
|---|
| 3102 | 3087 | if (r) |
|---|
| 3103 | 3088 | return r; |
|---|
| 3104 | 3089 | |
|---|
| 3105 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 185, &adev->gfx.priv_inst_irq); |
|---|
| 3090 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 185, &adev->gfx.priv_inst_irq); |
|---|
| 3106 | 3091 | if (r) |
|---|
| 3107 | 3092 | return r; |
|---|
| 3108 | 3093 | |
|---|
| .. | .. |
|---|
| 3114 | 3099 | return r; |
|---|
| 3115 | 3100 | } |
|---|
| 3116 | 3101 | |
|---|
| 3117 | | - r = gfx_v6_0_rlc_init(adev); |
|---|
| 3102 | + r = adev->gfx.rlc.funcs->init(adev); |
|---|
| 3118 | 3103 | if (r) { |
|---|
| 3119 | 3104 | DRM_ERROR("Failed to init rlc BOs!\n"); |
|---|
| 3120 | 3105 | return r; |
|---|
| .. | .. |
|---|
| 3125 | 3110 | ring->ring_obj = NULL; |
|---|
| 3126 | 3111 | sprintf(ring->name, "gfx"); |
|---|
| 3127 | 3112 | r = amdgpu_ring_init(adev, ring, 1024, |
|---|
| 3128 | | - &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_EOP); |
|---|
| 3113 | + &adev->gfx.eop_irq, |
|---|
| 3114 | + AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP, |
|---|
| 3115 | + AMDGPU_RING_PRIO_DEFAULT); |
|---|
| 3129 | 3116 | if (r) |
|---|
| 3130 | 3117 | return r; |
|---|
| 3131 | 3118 | } |
|---|
| .. | .. |
|---|
| 3147 | 3134 | sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue); |
|---|
| 3148 | 3135 | irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe; |
|---|
| 3149 | 3136 | r = amdgpu_ring_init(adev, ring, 1024, |
|---|
| 3150 | | - &adev->gfx.eop_irq, irq_type); |
|---|
| 3137 | + &adev->gfx.eop_irq, irq_type, |
|---|
| 3138 | + AMDGPU_RING_PRIO_DEFAULT); |
|---|
| 3151 | 3139 | if (r) |
|---|
| 3152 | 3140 | return r; |
|---|
| 3153 | 3141 | } |
|---|
| .. | .. |
|---|
| 3165 | 3153 | for (i = 0; i < adev->gfx.num_compute_rings; i++) |
|---|
| 3166 | 3154 | amdgpu_ring_fini(&adev->gfx.compute_ring[i]); |
|---|
| 3167 | 3155 | |
|---|
| 3168 | | - gfx_v6_0_rlc_fini(adev); |
|---|
| 3156 | + amdgpu_gfx_rlc_fini(adev); |
|---|
| 3169 | 3157 | |
|---|
| 3170 | 3158 | return 0; |
|---|
| 3171 | 3159 | } |
|---|
| .. | .. |
|---|
| 3175 | 3163 | int r; |
|---|
| 3176 | 3164 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
|---|
| 3177 | 3165 | |
|---|
| 3178 | | - gfx_v6_0_gpu_init(adev); |
|---|
| 3166 | + gfx_v6_0_constants_init(adev); |
|---|
| 3179 | 3167 | |
|---|
| 3180 | | - r = gfx_v6_0_rlc_resume(adev); |
|---|
| 3168 | + r = adev->gfx.rlc.funcs->resume(adev); |
|---|
| 3181 | 3169 | if (r) |
|---|
| 3182 | 3170 | return r; |
|---|
| 3183 | 3171 | |
|---|
| .. | .. |
|---|
| 3195 | 3183 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
|---|
| 3196 | 3184 | |
|---|
| 3197 | 3185 | gfx_v6_0_cp_enable(adev, false); |
|---|
| 3198 | | - gfx_v6_0_rlc_stop(adev); |
|---|
| 3186 | + adev->gfx.rlc.funcs->stop(adev); |
|---|
| 3199 | 3187 | gfx_v6_0_fini_pg(adev); |
|---|
| 3200 | 3188 | |
|---|
| 3201 | 3189 | return 0; |
|---|
| .. | .. |
|---|
| 3360 | 3348 | enum amdgpu_interrupt_state state) |
|---|
| 3361 | 3349 | { |
|---|
| 3362 | 3350 | switch (type) { |
|---|
| 3363 | | - case AMDGPU_CP_IRQ_GFX_EOP: |
|---|
| 3351 | + case AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP: |
|---|
| 3364 | 3352 | gfx_v6_0_set_gfx_eop_interrupt_state(adev, state); |
|---|
| 3365 | 3353 | break; |
|---|
| 3366 | 3354 | case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP: |
|---|
| .. | .. |
|---|
| 3393 | 3381 | return 0; |
|---|
| 3394 | 3382 | } |
|---|
| 3395 | 3383 | |
|---|
| 3384 | +static void gfx_v6_0_fault(struct amdgpu_device *adev, |
|---|
| 3385 | + struct amdgpu_iv_entry *entry) |
|---|
| 3386 | +{ |
|---|
| 3387 | + struct amdgpu_ring *ring; |
|---|
| 3388 | + |
|---|
| 3389 | + switch (entry->ring_id) { |
|---|
| 3390 | + case 0: |
|---|
| 3391 | + ring = &adev->gfx.gfx_ring[0]; |
|---|
| 3392 | + break; |
|---|
| 3393 | + case 1: |
|---|
| 3394 | + case 2: |
|---|
| 3395 | + ring = &adev->gfx.compute_ring[entry->ring_id - 1]; |
|---|
| 3396 | + break; |
|---|
| 3397 | + default: |
|---|
| 3398 | + return; |
|---|
| 3399 | + } |
|---|
| 3400 | + drm_sched_fault(&ring->sched); |
|---|
| 3401 | +} |
|---|
| 3402 | + |
|---|
| 3396 | 3403 | static int gfx_v6_0_priv_reg_irq(struct amdgpu_device *adev, |
|---|
| 3397 | 3404 | struct amdgpu_irq_src *source, |
|---|
| 3398 | 3405 | struct amdgpu_iv_entry *entry) |
|---|
| 3399 | 3406 | { |
|---|
| 3400 | 3407 | DRM_ERROR("Illegal register access in command stream\n"); |
|---|
| 3401 | | - schedule_work(&adev->reset_work); |
|---|
| 3408 | + gfx_v6_0_fault(adev, entry); |
|---|
| 3402 | 3409 | return 0; |
|---|
| 3403 | 3410 | } |
|---|
| 3404 | 3411 | |
|---|
| .. | .. |
|---|
| 3407 | 3414 | struct amdgpu_iv_entry *entry) |
|---|
| 3408 | 3415 | { |
|---|
| 3409 | 3416 | DRM_ERROR("Illegal instruction in command stream\n"); |
|---|
| 3410 | | - schedule_work(&adev->reset_work); |
|---|
| 3417 | + gfx_v6_0_fault(adev, entry); |
|---|
| 3411 | 3418 | return 0; |
|---|
| 3412 | 3419 | } |
|---|
| 3413 | 3420 | |
|---|
| .. | .. |
|---|
| 3458 | 3465 | return 0; |
|---|
| 3459 | 3466 | } |
|---|
| 3460 | 3467 | |
|---|
| 3468 | +static void gfx_v6_0_emit_mem_sync(struct amdgpu_ring *ring) |
|---|
| 3469 | +{ |
|---|
| 3470 | + amdgpu_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); |
|---|
| 3471 | + amdgpu_ring_write(ring, PACKET3_TCL1_ACTION_ENA | |
|---|
| 3472 | + PACKET3_TC_ACTION_ENA | |
|---|
| 3473 | + PACKET3_SH_KCACHE_ACTION_ENA | |
|---|
| 3474 | + PACKET3_SH_ICACHE_ACTION_ENA); /* CP_COHER_CNTL */ |
|---|
| 3475 | + amdgpu_ring_write(ring, 0xffffffff); /* CP_COHER_SIZE */ |
|---|
| 3476 | + amdgpu_ring_write(ring, 0); /* CP_COHER_BASE */ |
|---|
| 3477 | + amdgpu_ring_write(ring, 0x0000000A); /* poll interval */ |
|---|
| 3478 | +} |
|---|
| 3479 | + |
|---|
| 3461 | 3480 | static const struct amd_ip_funcs gfx_v6_0_ip_funcs = { |
|---|
| 3462 | 3481 | .name = "gfx_v6_0", |
|---|
| 3463 | 3482 | .early_init = gfx_v6_0_early_init, |
|---|
| .. | .. |
|---|
| 3488 | 3507 | 14 + 14 + 14 + /* gfx_v6_0_ring_emit_fence x3 for user fence, vm fence */ |
|---|
| 3489 | 3508 | 7 + 4 + /* gfx_v6_0_ring_emit_pipeline_sync */ |
|---|
| 3490 | 3509 | SI_FLUSH_GPU_TLB_NUM_WREG * 5 + 7 + 6 + /* gfx_v6_0_ring_emit_vm_flush */ |
|---|
| 3491 | | - 3 + 2, /* gfx_v6_ring_emit_cntxcntl including vgt flush */ |
|---|
| 3510 | + 3 + 2 + /* gfx_v6_ring_emit_cntxcntl including vgt flush */ |
|---|
| 3511 | + 5, /* SURFACE_SYNC */ |
|---|
| 3492 | 3512 | .emit_ib_size = 6, /* gfx_v6_0_ring_emit_ib */ |
|---|
| 3493 | 3513 | .emit_ib = gfx_v6_0_ring_emit_ib, |
|---|
| 3494 | 3514 | .emit_fence = gfx_v6_0_ring_emit_fence, |
|---|
| .. | .. |
|---|
| 3499 | 3519 | .insert_nop = amdgpu_ring_insert_nop, |
|---|
| 3500 | 3520 | .emit_cntxcntl = gfx_v6_ring_emit_cntxcntl, |
|---|
| 3501 | 3521 | .emit_wreg = gfx_v6_0_ring_emit_wreg, |
|---|
| 3522 | + .emit_mem_sync = gfx_v6_0_emit_mem_sync, |
|---|
| 3502 | 3523 | }; |
|---|
| 3503 | 3524 | |
|---|
| 3504 | 3525 | static const struct amdgpu_ring_funcs gfx_v6_0_ring_funcs_compute = { |
|---|
| .. | .. |
|---|
| 3512 | 3533 | 5 + 5 + /* hdp flush / invalidate */ |
|---|
| 3513 | 3534 | 7 + /* gfx_v6_0_ring_emit_pipeline_sync */ |
|---|
| 3514 | 3535 | SI_FLUSH_GPU_TLB_NUM_WREG * 5 + 7 + /* gfx_v6_0_ring_emit_vm_flush */ |
|---|
| 3515 | | - 14 + 14 + 14, /* gfx_v6_0_ring_emit_fence x3 for user fence, vm fence */ |
|---|
| 3536 | + 14 + 14 + 14 + /* gfx_v6_0_ring_emit_fence x3 for user fence, vm fence */ |
|---|
| 3537 | + 5, /* SURFACE_SYNC */ |
|---|
| 3516 | 3538 | .emit_ib_size = 6, /* gfx_v6_0_ring_emit_ib */ |
|---|
| 3517 | 3539 | .emit_ib = gfx_v6_0_ring_emit_ib, |
|---|
| 3518 | 3540 | .emit_fence = gfx_v6_0_ring_emit_fence, |
|---|
| .. | .. |
|---|
| 3522 | 3544 | .test_ib = gfx_v6_0_ring_test_ib, |
|---|
| 3523 | 3545 | .insert_nop = amdgpu_ring_insert_nop, |
|---|
| 3524 | 3546 | .emit_wreg = gfx_v6_0_ring_emit_wreg, |
|---|
| 3547 | + .emit_mem_sync = gfx_v6_0_emit_mem_sync, |
|---|
| 3525 | 3548 | }; |
|---|
| 3526 | 3549 | |
|---|
| 3527 | 3550 | static void gfx_v6_0_set_ring_funcs(struct amdgpu_device *adev) |
|---|