Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: set cp fw address set for gfx v12

Split PFF/ME/MEC firmware address setting function
from related load microcode funtion, as it's also
needed for rlc autolad.

Signed-off-by: Likun Gao <Likun.Gao@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Likun Gao and committed by
Alex Deucher
af204b76 52cb80c1

+122 -64
+122 -64
drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
··· 1749 1749 WREG32_SOC15(GC, 0, regCP_MEC_RS64_CNTL, tmp); 1750 1750 } 1751 1751 1752 + static void gfx_v12_0_set_pfp_ucode_start_addr(struct amdgpu_device *adev) 1753 + { 1754 + const struct gfx_firmware_header_v2_0 *cp_hdr; 1755 + unsigned pipe_id, tmp; 1756 + 1757 + cp_hdr = (const struct gfx_firmware_header_v2_0 *) 1758 + adev->gfx.pfp_fw->data; 1759 + mutex_lock(&adev->srbm_mutex); 1760 + for (pipe_id = 0; pipe_id < adev->gfx.me.num_pipe_per_me; pipe_id++) { 1761 + soc24_grbm_select(adev, 0, pipe_id, 0, 0); 1762 + WREG32_SOC15(GC, 0, regCP_PFP_PRGRM_CNTR_START, 1763 + (cp_hdr->ucode_start_addr_hi << 30) | 1764 + (cp_hdr->ucode_start_addr_lo >> 2)); 1765 + WREG32_SOC15(GC, 0, regCP_PFP_PRGRM_CNTR_START_HI, 1766 + cp_hdr->ucode_start_addr_hi>>2); 1767 + 1768 + /* 1769 + * Program CP_ME_CNTL to reset given PIPE to take 1770 + * effect of CP_PFP_PRGRM_CNTR_START. 1771 + */ 1772 + tmp = RREG32_SOC15(GC, 0, regCP_ME_CNTL); 1773 + if (pipe_id == 0) 1774 + tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 1775 + PFP_PIPE0_RESET, 1); 1776 + else 1777 + tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 1778 + PFP_PIPE1_RESET, 1); 1779 + WREG32_SOC15(GC, 0, regCP_ME_CNTL, tmp); 1780 + 1781 + /* Clear pfp pipe0 reset bit. */ 1782 + if (pipe_id == 0) 1783 + tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 1784 + PFP_PIPE0_RESET, 0); 1785 + else 1786 + tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 1787 + PFP_PIPE1_RESET, 0); 1788 + WREG32_SOC15(GC, 0, regCP_ME_CNTL, tmp); 1789 + } 1790 + soc24_grbm_select(adev, 0, 0, 0, 0); 1791 + mutex_unlock(&adev->srbm_mutex); 1792 + } 1793 + 1794 + static void gfx_v12_0_set_me_ucode_start_addr(struct amdgpu_device *adev) 1795 + { 1796 + const struct gfx_firmware_header_v2_0 *cp_hdr; 1797 + unsigned pipe_id, tmp; 1798 + 1799 + cp_hdr = (const struct gfx_firmware_header_v2_0 *) 1800 + adev->gfx.me_fw->data; 1801 + mutex_lock(&adev->srbm_mutex); 1802 + for (pipe_id = 0; pipe_id < adev->gfx.me.num_pipe_per_me; pipe_id++) { 1803 + soc24_grbm_select(adev, 0, pipe_id, 0, 0); 1804 + WREG32_SOC15(GC, 0, regCP_ME_PRGRM_CNTR_START, 1805 + (cp_hdr->ucode_start_addr_hi << 30) | 1806 + (cp_hdr->ucode_start_addr_lo >> 2) ); 1807 + WREG32_SOC15(GC, 0, regCP_ME_PRGRM_CNTR_START_HI, 1808 + cp_hdr->ucode_start_addr_hi>>2); 1809 + 1810 + /* 1811 + * Program CP_ME_CNTL to reset given PIPE to take 1812 + * effect of CP_ME_PRGRM_CNTR_START. 1813 + */ 1814 + tmp = RREG32_SOC15(GC, 0, regCP_ME_CNTL); 1815 + if (pipe_id == 0) 1816 + tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 1817 + ME_PIPE0_RESET, 1); 1818 + else 1819 + tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 1820 + ME_PIPE1_RESET, 1); 1821 + WREG32_SOC15(GC, 0, regCP_ME_CNTL, tmp); 1822 + 1823 + /* Clear pfp pipe0 reset bit. */ 1824 + if (pipe_id == 0) 1825 + tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 1826 + ME_PIPE0_RESET, 0); 1827 + else 1828 + tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 1829 + ME_PIPE1_RESET, 0); 1830 + WREG32_SOC15(GC, 0, regCP_ME_CNTL, tmp); 1831 + } 1832 + soc24_grbm_select(adev, 0, 0, 0, 0); 1833 + mutex_unlock(&adev->srbm_mutex); 1834 + } 1835 + 1836 + static void gfx_v12_0_set_mec_ucode_start_addr(struct amdgpu_device *adev) 1837 + { 1838 + const struct gfx_firmware_header_v2_0 *cp_hdr; 1839 + unsigned pipe_id; 1840 + 1841 + cp_hdr = (const struct gfx_firmware_header_v2_0 *) 1842 + adev->gfx.mec_fw->data; 1843 + mutex_lock(&adev->srbm_mutex); 1844 + for (pipe_id = 0; pipe_id < adev->gfx.mec.num_pipe_per_mec; pipe_id++) { 1845 + soc24_grbm_select(adev, 1, pipe_id, 0, 0); 1846 + WREG32_SOC15(GC, 0, regCP_MEC_RS64_PRGRM_CNTR_START, 1847 + cp_hdr->ucode_start_addr_lo >> 2 | 1848 + cp_hdr->ucode_start_addr_hi << 30); 1849 + WREG32_SOC15(GC, 0, regCP_MEC_RS64_PRGRM_CNTR_START_HI, 1850 + cp_hdr->ucode_start_addr_hi >> 2); 1851 + } 1852 + soc24_grbm_select(adev, 0, 0, 0, 0); 1853 + mutex_unlock(&adev->srbm_mutex); 1854 + } 1855 + 1752 1856 static int gfx_v12_0_wait_for_rlc_autoload_complete(struct amdgpu_device *adev) 1753 1857 { 1754 1858 uint32_t cp_status; ··· 1876 1772 if (i >= adev->usec_timeout) { 1877 1773 dev_err(adev->dev, "rlc autoload: gc ucode autoload timeout\n"); 1878 1774 return -ETIMEDOUT; 1775 + } 1776 + 1777 + if (adev->firmware.load_type == AMDGPU_FW_LOAD_RLC_BACKDOOR_AUTO) { 1778 + gfx_v12_0_set_pfp_ucode_start_addr(adev); 1779 + gfx_v12_0_set_me_ucode_start_addr(adev); 1780 + gfx_v12_0_set_mec_ucode_start_addr(adev); 1879 1781 } 1880 1782 1881 1783 return 0; ··· 2015 1905 mutex_lock(&adev->srbm_mutex); 2016 1906 for (pipe_id = 0; pipe_id < adev->gfx.me.num_pipe_per_me; pipe_id++) { 2017 1907 soc24_grbm_select(adev, 0, pipe_id, 0, 0); 2018 - WREG32_SOC15(GC, 0, regCP_PFP_PRGRM_CNTR_START, 2019 - (pfp_hdr->ucode_start_addr_hi << 30) | 2020 - (pfp_hdr->ucode_start_addr_lo >> 2)); 2021 - WREG32_SOC15(GC, 0, regCP_PFP_PRGRM_CNTR_START_HI, 2022 - pfp_hdr->ucode_start_addr_hi>>2); 2023 - 2024 - /* 2025 - * Program CP_ME_CNTL to reset given PIPE to take 2026 - * effect of CP_PFP_PRGRM_CNTR_START. 2027 - */ 2028 - tmp = RREG32_SOC15(GC, 0, regCP_ME_CNTL); 2029 - if (pipe_id == 0) 2030 - tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 2031 - PFP_PIPE0_RESET, 1); 2032 - else 2033 - tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 2034 - PFP_PIPE1_RESET, 1); 2035 - WREG32_SOC15(GC, 0, regCP_ME_CNTL, tmp); 2036 - 2037 - /* Clear pfp pipe0 reset bit. */ 2038 - if (pipe_id == 0) 2039 - tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 2040 - PFP_PIPE0_RESET, 0); 2041 - else 2042 - tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 2043 - PFP_PIPE1_RESET, 0); 2044 - WREG32_SOC15(GC, 0, regCP_ME_CNTL, tmp); 2045 1908 2046 1909 WREG32_SOC15(GC, 0, regCP_GFX_RS64_DC_BASE0_LO, 2047 1910 lower_32_bits(adev->gfx.pfp.pfp_fw_data_gpu_addr)); ··· 2046 1963 dev_err(adev->dev, "failed to invalidate RS64 data cache\n"); 2047 1964 return -EINVAL; 2048 1965 } 1966 + 1967 + gfx_v12_0_set_pfp_ucode_start_addr(adev); 2049 1968 2050 1969 return 0; 2051 1970 } ··· 2160 2075 mutex_lock(&adev->srbm_mutex); 2161 2076 for (pipe_id = 0; pipe_id < adev->gfx.me.num_pipe_per_me; pipe_id++) { 2162 2077 soc24_grbm_select(adev, 0, pipe_id, 0, 0); 2163 - WREG32_SOC15(GC, 0, regCP_ME_PRGRM_CNTR_START, 2164 - (me_hdr->ucode_start_addr_hi << 30) | 2165 - (me_hdr->ucode_start_addr_lo >> 2)); 2166 - WREG32_SOC15(GC, 0, regCP_ME_PRGRM_CNTR_START_HI, 2167 - me_hdr->ucode_start_addr_hi>>2); 2168 - 2169 - /* 2170 - * Program CP_ME_CNTL to reset given PIPE to take 2171 - * effect of CP_PFP_PRGRM_CNTR_START. 2172 - */ 2173 - tmp = RREG32_SOC15(GC, 0, regCP_ME_CNTL); 2174 - if (pipe_id == 0) 2175 - tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 2176 - ME_PIPE0_RESET, 1); 2177 - else 2178 - tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 2179 - ME_PIPE1_RESET, 1); 2180 - WREG32_SOC15(GC, 0, regCP_ME_CNTL, tmp); 2181 - 2182 - /* Clear pfp pipe0 reset bit. */ 2183 - if (pipe_id == 0) 2184 - tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 2185 - ME_PIPE0_RESET, 0); 2186 - else 2187 - tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, 2188 - ME_PIPE1_RESET, 0); 2189 - WREG32_SOC15(GC, 0, regCP_ME_CNTL, tmp); 2190 2078 2191 2079 WREG32_SOC15(GC, 0, regCP_GFX_RS64_DC_BASE1_LO, 2192 2080 lower_32_bits(adev->gfx.me.me_fw_data_gpu_addr)); ··· 2191 2133 dev_err(adev->dev, "failed to invalidate RS64 data cache\n"); 2192 2134 return -EINVAL; 2193 2135 } 2136 + 2137 + gfx_v12_0_set_me_ucode_start_addr(adev); 2194 2138 2195 2139 return 0; 2196 2140 } ··· 2442 2382 for (i = 0; i < adev->gfx.mec.num_pipe_per_mec; i++) { 2443 2383 soc24_grbm_select(adev, 1, i, 0, 0); 2444 2384 2445 - WREG32_SOC15(GC, 0, regCP_MEC_MDBASE_LO, adev->gfx.mec.mec_fw_data_gpu_addr); 2385 + WREG32_SOC15(GC, 0, regCP_MEC_MDBASE_LO, 2386 + lower_32_bits(adev->gfx.mec.mec_fw_data_gpu_addr)); 2446 2387 WREG32_SOC15(GC, 0, regCP_MEC_MDBASE_HI, 2447 - upper_32_bits(adev->gfx.mec.mec_fw_data_gpu_addr)); 2388 + upper_32_bits(adev->gfx.mec.mec_fw_data_gpu_addr)); 2448 2389 2449 - WREG32_SOC15(GC, 0, regCP_MEC_RS64_PRGRM_CNTR_START, 2450 - mec_hdr->ucode_start_addr_lo >> 2 | 2451 - mec_hdr->ucode_start_addr_hi << 30); 2452 - WREG32_SOC15(GC, 0, regCP_MEC_RS64_PRGRM_CNTR_START_HI, 2453 - mec_hdr->ucode_start_addr_hi >> 2); 2454 - 2455 - WREG32_SOC15(GC, 0, regCP_CPC_IC_BASE_LO, adev->gfx.mec.mec_fw_gpu_addr); 2390 + WREG32_SOC15(GC, 0, regCP_CPC_IC_BASE_LO, 2391 + lower_32_bits(adev->gfx.mec.mec_fw_gpu_addr)); 2456 2392 WREG32_SOC15(GC, 0, regCP_CPC_IC_BASE_HI, 2457 - upper_32_bits(adev->gfx.mec.mec_fw_gpu_addr)); 2393 + upper_32_bits(adev->gfx.mec.mec_fw_gpu_addr)); 2458 2394 } 2459 2395 mutex_unlock(&adev->srbm_mutex); 2460 2396 soc24_grbm_select(adev, 0, 0, 0, 0); ··· 2492 2436 dev_err(adev->dev, "failed to invalidate instruction cache\n"); 2493 2437 return -EINVAL; 2494 2438 } 2439 + 2440 + gfx_v12_0_set_mec_ucode_start_addr(adev); 2495 2441 2496 2442 return 0; 2497 2443 }