.. | .. |
---|
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) |
---|