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

drm/amdgpu: move JPEG2.5 out from VCN2.5

And clean up the duplicated stuff

Signed-off-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Leo Liu and committed by
Alex Deucher
14f43e8f 5be45a26

+679 -602
+2 -1
drivers/gpu/drm/amd/amdgpu/Makefile
··· 155 155 vcn_v2_5.o \ 156 156 amdgpu_jpeg.o \ 157 157 jpeg_v1_0.o \ 158 - jpeg_v2_0.o 158 + jpeg_v2_0.o \ 159 + jpeg_v2_5.o 159 160 160 161 # add ATHUB block 161 162 amdgpu-y += \
+3
drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.h
··· 26 26 27 27 #define AMDGPU_MAX_JPEG_INSTANCES 2 28 28 29 + #define AMDGPU_JPEG_HARVEST_JPEG0 (1 << 0) 30 + #define AMDGPU_JPEG_HARVEST_JPEG1 (1 << 1) 31 + 29 32 struct amdgpu_jpeg_reg{ 30 33 unsigned jpeg_pitch; 31 34 };
-105
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
··· 706 706 amdgpu_bo_unref(&bo); 707 707 return r; 708 708 } 709 - 710 - int amdgpu_vcn_jpeg_ring_test_ring(struct amdgpu_ring *ring) 711 - { 712 - struct amdgpu_device *adev = ring->adev; 713 - uint32_t tmp = 0; 714 - unsigned i; 715 - int r; 716 - 717 - WREG32(adev->vcn.inst[ring->me].external.jpeg_pitch, 0xCAFEDEAD); 718 - r = amdgpu_ring_alloc(ring, 3); 719 - if (r) 720 - return r; 721 - 722 - amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.jpeg_pitch, 0)); 723 - amdgpu_ring_write(ring, 0xDEADBEEF); 724 - amdgpu_ring_commit(ring); 725 - 726 - for (i = 0; i < adev->usec_timeout; i++) { 727 - tmp = RREG32(adev->vcn.inst[ring->me].external.jpeg_pitch); 728 - if (tmp == 0xDEADBEEF) 729 - break; 730 - udelay(1); 731 - } 732 - 733 - if (i >= adev->usec_timeout) 734 - r = -ETIMEDOUT; 735 - 736 - return r; 737 - } 738 - 739 - static int amdgpu_vcn_jpeg_set_reg(struct amdgpu_ring *ring, uint32_t handle, 740 - struct dma_fence **fence) 741 - { 742 - struct amdgpu_device *adev = ring->adev; 743 - struct amdgpu_job *job; 744 - struct amdgpu_ib *ib; 745 - struct dma_fence *f = NULL; 746 - const unsigned ib_size_dw = 16; 747 - int i, r; 748 - 749 - r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); 750 - if (r) 751 - return r; 752 - 753 - ib = &job->ibs[0]; 754 - 755 - ib->ptr[0] = PACKETJ(adev->vcn.internal.jpeg_pitch, 0, 0, PACKETJ_TYPE0); 756 - ib->ptr[1] = 0xDEADBEEF; 757 - for (i = 2; i < 16; i += 2) { 758 - ib->ptr[i] = PACKETJ(0, 0, 0, PACKETJ_TYPE6); 759 - ib->ptr[i+1] = 0; 760 - } 761 - ib->length_dw = 16; 762 - 763 - r = amdgpu_job_submit_direct(job, ring, &f); 764 - if (r) 765 - goto err; 766 - 767 - if (fence) 768 - *fence = dma_fence_get(f); 769 - dma_fence_put(f); 770 - 771 - return 0; 772 - 773 - err: 774 - amdgpu_job_free(job); 775 - return r; 776 - } 777 - 778 - int amdgpu_vcn_jpeg_ring_test_ib(struct amdgpu_ring *ring, long timeout) 779 - { 780 - struct amdgpu_device *adev = ring->adev; 781 - uint32_t tmp = 0; 782 - unsigned i; 783 - struct dma_fence *fence = NULL; 784 - long r = 0; 785 - 786 - r = amdgpu_vcn_jpeg_set_reg(ring, 1, &fence); 787 - if (r) 788 - goto error; 789 - 790 - r = dma_fence_wait_timeout(fence, false, timeout); 791 - if (r == 0) { 792 - r = -ETIMEDOUT; 793 - goto error; 794 - } else if (r < 0) { 795 - goto error; 796 - } else { 797 - r = 0; 798 - } 799 - 800 - for (i = 0; i < adev->usec_timeout; i++) { 801 - tmp = RREG32(adev->vcn.inst[ring->me].external.jpeg_pitch); 802 - if (tmp == 0xDEADBEEF) 803 - break; 804 - udelay(1); 805 - } 806 - 807 - if (i >= adev->usec_timeout) 808 - r = -ETIMEDOUT; 809 - 810 - dma_fence_put(fence); 811 - error: 812 - return r; 813 - }
-5
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
··· 158 158 unsigned ib_size; 159 159 unsigned gp_scratch8; 160 160 unsigned scratch9; 161 - unsigned jpeg_pitch; 162 161 }; 163 162 164 163 struct amdgpu_vcn_inst { ··· 167 168 void *saved_bo; 168 169 struct amdgpu_ring ring_dec; 169 170 struct amdgpu_ring ring_enc[AMDGPU_VCN_MAX_ENC_RINGS]; 170 - struct amdgpu_ring ring_jpeg; 171 171 struct amdgpu_irq_src irq; 172 172 struct amdgpu_vcn_reg external; 173 173 }; ··· 206 208 207 209 int amdgpu_vcn_enc_ring_test_ring(struct amdgpu_ring *ring); 208 210 int amdgpu_vcn_enc_ring_test_ib(struct amdgpu_ring *ring, long timeout); 209 - 210 - int amdgpu_vcn_jpeg_ring_test_ring(struct amdgpu_ring *ring); 211 - int amdgpu_vcn_jpeg_ring_test_ib(struct amdgpu_ring *ring, long timeout); 212 211 213 212 #endif
+641
drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
··· 1 + /* 2 + * Copyright 2019 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + */ 23 + 24 + #include "amdgpu.h" 25 + #include "amdgpu_jpeg.h" 26 + #include "soc15.h" 27 + #include "soc15d.h" 28 + #include "jpeg_v2_0.h" 29 + 30 + #include "vcn/vcn_2_5_offset.h" 31 + #include "vcn/vcn_2_5_sh_mask.h" 32 + #include "ivsrcid/vcn/irqsrcs_vcn_2_0.h" 33 + 34 + #define mmUVD_JPEG_PITCH_INTERNAL_OFFSET 0x401f 35 + 36 + #define JPEG25_MAX_HW_INSTANCES_ARCTURUS 2 37 + 38 + static void jpeg_v2_5_set_dec_ring_funcs(struct amdgpu_device *adev); 39 + static void jpeg_v2_5_set_irq_funcs(struct amdgpu_device *adev); 40 + static int jpeg_v2_5_set_powergating_state(void *handle, 41 + enum amd_powergating_state state); 42 + 43 + static int amdgpu_ih_clientid_jpeg[] = { 44 + SOC15_IH_CLIENTID_VCN, 45 + SOC15_IH_CLIENTID_VCN1 46 + }; 47 + 48 + /** 49 + * jpeg_v2_5_early_init - set function pointers 50 + * 51 + * @handle: amdgpu_device pointer 52 + * 53 + * Set ring and irq function pointers 54 + */ 55 + static int jpeg_v2_5_early_init(void *handle) 56 + { 57 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 58 + if (adev->asic_type == CHIP_ARCTURUS) { 59 + u32 harvest; 60 + int i; 61 + 62 + adev->jpeg.num_jpeg_inst = JPEG25_MAX_HW_INSTANCES_ARCTURUS; 63 + for (i = 0; i < adev->jpeg.num_jpeg_inst; i++) { 64 + harvest = RREG32_SOC15(JPEG, i, mmCC_UVD_HARVESTING); 65 + if (harvest & CC_UVD_HARVESTING__UVD_DISABLE_MASK) 66 + adev->jpeg.harvest_config |= 1 << i; 67 + } 68 + 69 + if (adev->jpeg.harvest_config == (AMDGPU_JPEG_HARVEST_JPEG0 | 70 + AMDGPU_JPEG_HARVEST_JPEG1)) 71 + return -ENOENT; 72 + } else 73 + adev->jpeg.num_jpeg_inst = 1; 74 + 75 + jpeg_v2_5_set_dec_ring_funcs(adev); 76 + jpeg_v2_5_set_irq_funcs(adev); 77 + 78 + return 0; 79 + } 80 + 81 + /** 82 + * jpeg_v2_5_sw_init - sw init for JPEG block 83 + * 84 + * @handle: amdgpu_device pointer 85 + * 86 + * Load firmware and sw initialization 87 + */ 88 + static int jpeg_v2_5_sw_init(void *handle) 89 + { 90 + struct amdgpu_ring *ring; 91 + int i, r; 92 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 93 + 94 + for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { 95 + if (adev->jpeg.harvest_config & (1 << i)) 96 + continue; 97 + 98 + /* JPEG TRAP */ 99 + r = amdgpu_irq_add_id(adev, amdgpu_ih_clientid_jpeg[i], 100 + VCN_2_0__SRCID__JPEG_DECODE, &adev->jpeg.inst[i].irq); 101 + if (r) 102 + return r; 103 + } 104 + 105 + r = amdgpu_jpeg_sw_init(adev); 106 + if (r) 107 + return r; 108 + 109 + r = amdgpu_jpeg_resume(adev); 110 + if (r) 111 + return r; 112 + 113 + for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { 114 + if (adev->jpeg.harvest_config & (1 << i)) 115 + continue; 116 + 117 + ring = &adev->jpeg.inst[i].ring_dec; 118 + ring->use_doorbell = true; 119 + ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 1 + 8 * i; 120 + sprintf(ring->name, "jpeg_dec_%d", i); 121 + r = amdgpu_ring_init(adev, ring, 512, &adev->jpeg.inst[i].irq, 0); 122 + if (r) 123 + return r; 124 + 125 + adev->jpeg.internal.jpeg_pitch = mmUVD_JPEG_PITCH_INTERNAL_OFFSET; 126 + adev->jpeg.inst[i].external.jpeg_pitch = SOC15_REG_OFFSET(JPEG, i, mmUVD_JPEG_PITCH); 127 + } 128 + 129 + return 0; 130 + } 131 + 132 + /** 133 + * jpeg_v2_5_sw_fini - sw fini for JPEG block 134 + * 135 + * @handle: amdgpu_device pointer 136 + * 137 + * JPEG suspend and free up sw allocation 138 + */ 139 + static int jpeg_v2_5_sw_fini(void *handle) 140 + { 141 + int r; 142 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 143 + 144 + r = amdgpu_jpeg_suspend(adev); 145 + if (r) 146 + return r; 147 + 148 + r = amdgpu_jpeg_sw_fini(adev); 149 + 150 + return r; 151 + } 152 + 153 + /** 154 + * jpeg_v2_5_hw_init - start and test JPEG block 155 + * 156 + * @handle: amdgpu_device pointer 157 + * 158 + */ 159 + static int jpeg_v2_5_hw_init(void *handle) 160 + { 161 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 162 + struct amdgpu_ring *ring; 163 + int i, r; 164 + 165 + for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { 166 + if (adev->jpeg.harvest_config & (1 << i)) 167 + continue; 168 + 169 + ring = &adev->jpeg.inst[i].ring_dec; 170 + adev->nbio.funcs->vcn_doorbell_range(adev, ring->use_doorbell, 171 + (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 8 * i, i); 172 + 173 + r = amdgpu_ring_test_helper(ring); 174 + if (r) 175 + return r; 176 + } 177 + 178 + DRM_INFO("JPEG decode initialized successfully.\n"); 179 + 180 + return 0; 181 + } 182 + 183 + /** 184 + * jpeg_v2_5_hw_fini - stop the hardware block 185 + * 186 + * @handle: amdgpu_device pointer 187 + * 188 + * Stop the JPEG block, mark ring as not ready any more 189 + */ 190 + static int jpeg_v2_5_hw_fini(void *handle) 191 + { 192 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 193 + struct amdgpu_ring *ring; 194 + int i; 195 + 196 + for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { 197 + if (adev->jpeg.harvest_config & (1 << i)) 198 + continue; 199 + 200 + ring = &adev->jpeg.inst[i].ring_dec; 201 + if (adev->jpeg.cur_state != AMD_PG_STATE_GATE && 202 + RREG32_SOC15(JPEG, i, mmUVD_JRBC_STATUS)) 203 + jpeg_v2_5_set_powergating_state(adev, AMD_PG_STATE_GATE); 204 + 205 + ring->sched.ready = false; 206 + } 207 + 208 + return 0; 209 + } 210 + 211 + /** 212 + * jpeg_v2_5_suspend - suspend JPEG block 213 + * 214 + * @handle: amdgpu_device pointer 215 + * 216 + * HW fini and suspend JPEG block 217 + */ 218 + static int jpeg_v2_5_suspend(void *handle) 219 + { 220 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 221 + int r; 222 + 223 + r = jpeg_v2_5_hw_fini(adev); 224 + if (r) 225 + return r; 226 + 227 + r = amdgpu_jpeg_suspend(adev); 228 + 229 + return r; 230 + } 231 + 232 + /** 233 + * jpeg_v2_5_resume - resume JPEG block 234 + * 235 + * @handle: amdgpu_device pointer 236 + * 237 + * Resume firmware and hw init JPEG block 238 + */ 239 + static int jpeg_v2_5_resume(void *handle) 240 + { 241 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 242 + int r; 243 + 244 + r = amdgpu_jpeg_resume(adev); 245 + if (r) 246 + return r; 247 + 248 + r = jpeg_v2_5_hw_init(adev); 249 + 250 + return r; 251 + } 252 + 253 + static void jpeg_v2_5_disable_clock_gating(struct amdgpu_device* adev, int inst) 254 + { 255 + uint32_t data; 256 + 257 + data = RREG32_SOC15(JPEG, inst, mmJPEG_CGC_CTRL); 258 + if (adev->cg_flags & AMD_CG_SUPPORT_JPEG_MGCG) 259 + data |= 1 << JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT; 260 + else 261 + data &= ~JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT; 262 + 263 + data |= 1 << JPEG_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT; 264 + data |= 4 << JPEG_CGC_CTRL__CLK_OFF_DELAY__SHIFT; 265 + WREG32_SOC15(JPEG, inst, mmJPEG_CGC_CTRL, data); 266 + 267 + data = RREG32_SOC15(JPEG, inst, mmJPEG_CGC_GATE); 268 + data &= ~(JPEG_CGC_GATE__JPEG_DEC_MASK 269 + | JPEG_CGC_GATE__JPEG2_DEC_MASK 270 + | JPEG_CGC_GATE__JPEG_ENC_MASK 271 + | JPEG_CGC_GATE__JMCIF_MASK 272 + | JPEG_CGC_GATE__JRBBM_MASK); 273 + WREG32_SOC15(JPEG, inst, mmJPEG_CGC_GATE, data); 274 + 275 + data = RREG32_SOC15(JPEG, inst, mmJPEG_CGC_CTRL); 276 + data &= ~(JPEG_CGC_CTRL__JPEG_DEC_MODE_MASK 277 + | JPEG_CGC_CTRL__JPEG2_DEC_MODE_MASK 278 + | JPEG_CGC_CTRL__JMCIF_MODE_MASK 279 + | JPEG_CGC_CTRL__JRBBM_MODE_MASK); 280 + WREG32_SOC15(JPEG, inst, mmJPEG_CGC_CTRL, data); 281 + } 282 + 283 + static void jpeg_v2_5_enable_clock_gating(struct amdgpu_device* adev, int inst) 284 + { 285 + uint32_t data; 286 + 287 + data = RREG32_SOC15(JPEG, inst, mmJPEG_CGC_GATE); 288 + data |= (JPEG_CGC_GATE__JPEG_DEC_MASK 289 + |JPEG_CGC_GATE__JPEG2_DEC_MASK 290 + |JPEG_CGC_GATE__JPEG_ENC_MASK 291 + |JPEG_CGC_GATE__JMCIF_MASK 292 + |JPEG_CGC_GATE__JRBBM_MASK); 293 + WREG32_SOC15(JPEG, inst, mmJPEG_CGC_GATE, data); 294 + } 295 + 296 + /** 297 + * jpeg_v2_5_start - start JPEG block 298 + * 299 + * @adev: amdgpu_device pointer 300 + * 301 + * Setup and start the JPEG block 302 + */ 303 + static int jpeg_v2_5_start(struct amdgpu_device *adev) 304 + { 305 + struct amdgpu_ring *ring; 306 + int i; 307 + 308 + for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { 309 + if (adev->jpeg.harvest_config & (1 << i)) 310 + continue; 311 + 312 + ring = &adev->jpeg.inst[i].ring_dec; 313 + /* disable anti hang mechanism */ 314 + WREG32_P(SOC15_REG_OFFSET(JPEG, i, mmUVD_JPEG_POWER_STATUS), 0, 315 + ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK); 316 + 317 + /* JPEG disable CGC */ 318 + jpeg_v2_5_disable_clock_gating(adev, i); 319 + 320 + /* MJPEG global tiling registers */ 321 + WREG32_SOC15(JPEG, i, mmJPEG_DEC_GFX8_ADDR_CONFIG, 322 + adev->gfx.config.gb_addr_config); 323 + WREG32_SOC15(JPEG, i, mmJPEG_DEC_GFX10_ADDR_CONFIG, 324 + adev->gfx.config.gb_addr_config); 325 + 326 + /* enable JMI channel */ 327 + WREG32_P(SOC15_REG_OFFSET(JPEG, i, mmUVD_JMI_CNTL), 0, 328 + ~UVD_JMI_CNTL__SOFT_RESET_MASK); 329 + 330 + /* enable System Interrupt for JRBC */ 331 + WREG32_P(SOC15_REG_OFFSET(JPEG, i, mmJPEG_SYS_INT_EN), 332 + JPEG_SYS_INT_EN__DJRBC_MASK, 333 + ~JPEG_SYS_INT_EN__DJRBC_MASK); 334 + 335 + WREG32_SOC15(JPEG, i, mmUVD_LMI_JRBC_RB_VMID, 0); 336 + WREG32_SOC15(JPEG, i, mmUVD_JRBC_RB_CNTL, (0x00000001L | 0x00000002L)); 337 + WREG32_SOC15(JPEG, i, mmUVD_LMI_JRBC_RB_64BIT_BAR_LOW, 338 + lower_32_bits(ring->gpu_addr)); 339 + WREG32_SOC15(JPEG, i, mmUVD_LMI_JRBC_RB_64BIT_BAR_HIGH, 340 + upper_32_bits(ring->gpu_addr)); 341 + WREG32_SOC15(JPEG, i, mmUVD_JRBC_RB_RPTR, 0); 342 + WREG32_SOC15(JPEG, i, mmUVD_JRBC_RB_WPTR, 0); 343 + WREG32_SOC15(JPEG, i, mmUVD_JRBC_RB_CNTL, 0x00000002L); 344 + WREG32_SOC15(JPEG, i, mmUVD_JRBC_RB_SIZE, ring->ring_size / 4); 345 + ring->wptr = RREG32_SOC15(JPEG, i, mmUVD_JRBC_RB_WPTR); 346 + } 347 + 348 + return 0; 349 + } 350 + 351 + /** 352 + * jpeg_v2_5_stop - stop JPEG block 353 + * 354 + * @adev: amdgpu_device pointer 355 + * 356 + * stop the JPEG block 357 + */ 358 + static int jpeg_v2_5_stop(struct amdgpu_device *adev) 359 + { 360 + int i; 361 + 362 + for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { 363 + if (adev->jpeg.harvest_config & (1 << i)) 364 + continue; 365 + 366 + /* reset JMI */ 367 + WREG32_P(SOC15_REG_OFFSET(JPEG, i, mmUVD_JMI_CNTL), 368 + UVD_JMI_CNTL__SOFT_RESET_MASK, 369 + ~UVD_JMI_CNTL__SOFT_RESET_MASK); 370 + 371 + jpeg_v2_5_enable_clock_gating(adev, i); 372 + 373 + /* enable anti hang mechanism */ 374 + WREG32_P(SOC15_REG_OFFSET(JPEG, i, mmUVD_JPEG_POWER_STATUS), 375 + UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK, 376 + ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK); 377 + } 378 + 379 + return 0; 380 + } 381 + 382 + /** 383 + * jpeg_v2_5_dec_ring_get_rptr - get read pointer 384 + * 385 + * @ring: amdgpu_ring pointer 386 + * 387 + * Returns the current hardware read pointer 388 + */ 389 + static uint64_t jpeg_v2_5_dec_ring_get_rptr(struct amdgpu_ring *ring) 390 + { 391 + struct amdgpu_device *adev = ring->adev; 392 + 393 + return RREG32_SOC15(JPEG, ring->me, mmUVD_JRBC_RB_RPTR); 394 + } 395 + 396 + /** 397 + * jpeg_v2_5_dec_ring_get_wptr - get write pointer 398 + * 399 + * @ring: amdgpu_ring pointer 400 + * 401 + * Returns the current hardware write pointer 402 + */ 403 + static uint64_t jpeg_v2_5_dec_ring_get_wptr(struct amdgpu_ring *ring) 404 + { 405 + struct amdgpu_device *adev = ring->adev; 406 + 407 + if (ring->use_doorbell) 408 + return adev->wb.wb[ring->wptr_offs]; 409 + else 410 + return RREG32_SOC15(JPEG, ring->me, mmUVD_JRBC_RB_WPTR); 411 + } 412 + 413 + /** 414 + * jpeg_v2_5_dec_ring_set_wptr - set write pointer 415 + * 416 + * @ring: amdgpu_ring pointer 417 + * 418 + * Commits the write pointer to the hardware 419 + */ 420 + static void jpeg_v2_5_dec_ring_set_wptr(struct amdgpu_ring *ring) 421 + { 422 + struct amdgpu_device *adev = ring->adev; 423 + 424 + if (ring->use_doorbell) { 425 + adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr); 426 + WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr)); 427 + } else { 428 + WREG32_SOC15(JPEG, ring->me, mmUVD_JRBC_RB_WPTR, lower_32_bits(ring->wptr)); 429 + } 430 + } 431 + 432 + static bool jpeg_v2_5_is_idle(void *handle) 433 + { 434 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 435 + int i, ret = 1; 436 + 437 + for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { 438 + if (adev->jpeg.harvest_config & (1 << i)) 439 + continue; 440 + 441 + ret &= (((RREG32_SOC15(JPEG, i, mmUVD_JRBC_STATUS) & 442 + UVD_JRBC_STATUS__RB_JOB_DONE_MASK) == 443 + UVD_JRBC_STATUS__RB_JOB_DONE_MASK)); 444 + } 445 + 446 + return ret; 447 + } 448 + 449 + static int jpeg_v2_5_wait_for_idle(void *handle) 450 + { 451 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 452 + int i, ret = 0; 453 + 454 + for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { 455 + if (adev->jpeg.harvest_config & (1 << i)) 456 + continue; 457 + 458 + SOC15_WAIT_ON_RREG(JPEG, i, mmUVD_JRBC_STATUS, 459 + UVD_JRBC_STATUS__RB_JOB_DONE_MASK, 460 + UVD_JRBC_STATUS__RB_JOB_DONE_MASK, ret); 461 + if (ret) 462 + return ret; 463 + } 464 + 465 + return ret; 466 + } 467 + 468 + static int jpeg_v2_5_set_clockgating_state(void *handle, 469 + enum amd_clockgating_state state) 470 + { 471 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 472 + bool enable = (state == AMD_CG_STATE_GATE) ? true : false; 473 + int i; 474 + 475 + for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { 476 + if (adev->jpeg.harvest_config & (1 << i)) 477 + continue; 478 + 479 + if (enable) { 480 + if (jpeg_v2_5_is_idle(handle)) 481 + return -EBUSY; 482 + jpeg_v2_5_enable_clock_gating(adev, i); 483 + } else { 484 + jpeg_v2_5_disable_clock_gating(adev, i); 485 + } 486 + } 487 + 488 + return 0; 489 + } 490 + 491 + static int jpeg_v2_5_set_powergating_state(void *handle, 492 + enum amd_powergating_state state) 493 + { 494 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 495 + int ret; 496 + 497 + if(state == adev->jpeg.cur_state) 498 + return 0; 499 + 500 + if (state == AMD_PG_STATE_GATE) 501 + ret = jpeg_v2_5_stop(adev); 502 + else 503 + ret = jpeg_v2_5_start(adev); 504 + 505 + if(!ret) 506 + adev->jpeg.cur_state = state; 507 + 508 + return ret; 509 + } 510 + 511 + static int jpeg_v2_5_set_interrupt_state(struct amdgpu_device *adev, 512 + struct amdgpu_irq_src *source, 513 + unsigned type, 514 + enum amdgpu_interrupt_state state) 515 + { 516 + return 0; 517 + } 518 + 519 + static int jpeg_v2_5_process_interrupt(struct amdgpu_device *adev, 520 + struct amdgpu_irq_src *source, 521 + struct amdgpu_iv_entry *entry) 522 + { 523 + uint32_t ip_instance; 524 + 525 + switch (entry->client_id) { 526 + case SOC15_IH_CLIENTID_VCN: 527 + ip_instance = 0; 528 + break; 529 + case SOC15_IH_CLIENTID_VCN1: 530 + ip_instance = 1; 531 + break; 532 + default: 533 + DRM_ERROR("Unhandled client id: %d\n", entry->client_id); 534 + return 0; 535 + } 536 + 537 + DRM_DEBUG("IH: JPEG TRAP\n"); 538 + 539 + switch (entry->src_id) { 540 + case VCN_2_0__SRCID__JPEG_DECODE: 541 + amdgpu_fence_process(&adev->jpeg.inst[ip_instance].ring_dec); 542 + break; 543 + default: 544 + DRM_ERROR("Unhandled interrupt: %d %d\n", 545 + entry->src_id, entry->src_data[0]); 546 + break; 547 + } 548 + 549 + return 0; 550 + } 551 + 552 + static const struct amd_ip_funcs jpeg_v2_5_ip_funcs = { 553 + .name = "jpeg_v2_5", 554 + .early_init = jpeg_v2_5_early_init, 555 + .late_init = NULL, 556 + .sw_init = jpeg_v2_5_sw_init, 557 + .sw_fini = jpeg_v2_5_sw_fini, 558 + .hw_init = jpeg_v2_5_hw_init, 559 + .hw_fini = jpeg_v2_5_hw_fini, 560 + .suspend = jpeg_v2_5_suspend, 561 + .resume = jpeg_v2_5_resume, 562 + .is_idle = jpeg_v2_5_is_idle, 563 + .wait_for_idle = jpeg_v2_5_wait_for_idle, 564 + .check_soft_reset = NULL, 565 + .pre_soft_reset = NULL, 566 + .soft_reset = NULL, 567 + .post_soft_reset = NULL, 568 + .set_clockgating_state = jpeg_v2_5_set_clockgating_state, 569 + .set_powergating_state = jpeg_v2_5_set_powergating_state, 570 + }; 571 + 572 + static const struct amdgpu_ring_funcs jpeg_v2_5_dec_ring_vm_funcs = { 573 + .type = AMDGPU_RING_TYPE_VCN_JPEG, 574 + .align_mask = 0xf, 575 + .vmhub = AMDGPU_MMHUB_1, 576 + .get_rptr = jpeg_v2_5_dec_ring_get_rptr, 577 + .get_wptr = jpeg_v2_5_dec_ring_get_wptr, 578 + .set_wptr = jpeg_v2_5_dec_ring_set_wptr, 579 + .emit_frame_size = 580 + SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 + 581 + SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 + 582 + 8 + /* jpeg_v2_5_dec_ring_emit_vm_flush */ 583 + 18 + 18 + /* jpeg_v2_5_dec_ring_emit_fence x2 vm fence */ 584 + 8 + 16, 585 + .emit_ib_size = 22, /* jpeg_v2_5_dec_ring_emit_ib */ 586 + .emit_ib = jpeg_v2_0_dec_ring_emit_ib, 587 + .emit_fence = jpeg_v2_0_dec_ring_emit_fence, 588 + .emit_vm_flush = jpeg_v2_0_dec_ring_emit_vm_flush, 589 + .test_ring = amdgpu_jpeg_dec_ring_test_ring, 590 + .test_ib = amdgpu_jpeg_dec_ring_test_ib, 591 + .insert_nop = jpeg_v2_0_dec_ring_nop, 592 + .insert_start = jpeg_v2_0_dec_ring_insert_start, 593 + .insert_end = jpeg_v2_0_dec_ring_insert_end, 594 + .pad_ib = amdgpu_ring_generic_pad_ib, 595 + .begin_use = amdgpu_jpeg_ring_begin_use, 596 + .end_use = amdgpu_jpeg_ring_end_use, 597 + .emit_wreg = jpeg_v2_0_dec_ring_emit_wreg, 598 + .emit_reg_wait = jpeg_v2_0_dec_ring_emit_reg_wait, 599 + .emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper, 600 + }; 601 + 602 + static void jpeg_v2_5_set_dec_ring_funcs(struct amdgpu_device *adev) 603 + { 604 + int i; 605 + 606 + for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { 607 + if (adev->jpeg.harvest_config & (1 << i)) 608 + continue; 609 + 610 + adev->jpeg.inst[i].ring_dec.funcs = &jpeg_v2_5_dec_ring_vm_funcs; 611 + adev->jpeg.inst[i].ring_dec.me = i; 612 + DRM_INFO("JPEG(%d) JPEG decode is enabled in VM mode\n", i); 613 + } 614 + } 615 + 616 + static const struct amdgpu_irq_src_funcs jpeg_v2_5_irq_funcs = { 617 + .set = jpeg_v2_5_set_interrupt_state, 618 + .process = jpeg_v2_5_process_interrupt, 619 + }; 620 + 621 + static void jpeg_v2_5_set_irq_funcs(struct amdgpu_device *adev) 622 + { 623 + int i; 624 + 625 + for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { 626 + if (adev->jpeg.harvest_config & (1 << i)) 627 + continue; 628 + 629 + adev->jpeg.inst[i].irq.num_types = 1; 630 + adev->jpeg.inst[i].irq.funcs = &jpeg_v2_5_irq_funcs; 631 + } 632 + } 633 + 634 + const struct amdgpu_ip_block_version jpeg_v2_5_ip_block = 635 + { 636 + .type = AMD_IP_BLOCK_TYPE_JPEG, 637 + .major = 2, 638 + .minor = 5, 639 + .rev = 0, 640 + .funcs = &jpeg_v2_5_ip_funcs, 641 + };
+29
drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.h
··· 1 + /* 2 + * Copyright 2019 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + */ 23 + 24 + #ifndef __JPEG_V2_5_H__ 25 + #define __JPEG_V2_5_H__ 26 + 27 + extern const struct amdgpu_ip_block_version jpeg_v2_5_ip_block; 28 + 29 + #endif /* __JPEG_V2_5_H__ */
-236
drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
··· 47 47 #define mmUVD_LMI_RBC_IB_64BIT_BAR_LOW_INTERNAL_OFFSET 0x5a7 48 48 #define mmUVD_RBC_IB_SIZE_INTERNAL_OFFSET 0x1e2 49 49 50 - #define mmUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET 0x1bfff 51 - #define mmUVD_JPEG_GPCOM_CMD_INTERNAL_OFFSET 0x4029 52 - #define mmUVD_JPEG_GPCOM_DATA0_INTERNAL_OFFSET 0x402a 53 - #define mmUVD_JPEG_GPCOM_DATA1_INTERNAL_OFFSET 0x402b 54 - #define mmUVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW_INTERNAL_OFFSET 0x40ea 55 - #define mmUVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH_INTERNAL_OFFSET 0x40eb 56 - #define mmUVD_LMI_JRBC_IB_VMID_INTERNAL_OFFSET 0x40cf 57 - #define mmUVD_LMI_JPEG_VMID_INTERNAL_OFFSET 0x40d1 58 - #define mmUVD_LMI_JRBC_IB_64BIT_BAR_LOW_INTERNAL_OFFSET 0x40e8 59 - #define mmUVD_LMI_JRBC_IB_64BIT_BAR_HIGH_INTERNAL_OFFSET 0x40e9 60 - #define mmUVD_JRBC_IB_SIZE_INTERNAL_OFFSET 0x4082 61 - #define mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW_INTERNAL_OFFSET 0x40ec 62 - #define mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH_INTERNAL_OFFSET 0x40ed 63 - #define mmUVD_JRBC_RB_COND_RD_TIMER_INTERNAL_OFFSET 0x4085 64 - #define mmUVD_JRBC_RB_REF_DATA_INTERNAL_OFFSET 0x4084 65 - #define mmUVD_JRBC_STATUS_INTERNAL_OFFSET 0x4089 66 - #define mmUVD_JPEG_PITCH_INTERNAL_OFFSET 0x401f 67 - 68 - #define JRBC_DEC_EXTERNAL_REG_WRITE_ADDR 0x18000 69 - 70 50 #define mmUVD_RBC_XX_IB_REG_CHECK 0x026b 71 51 #define mmUVD_RBC_XX_IB_REG_CHECK_BASE_IDX 1 72 52 #define mmUVD_REG_XX_MASK 0x026c ··· 1594 1614 amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WRITE); 1595 1615 amdgpu_ring_write(ring, reg << 2); 1596 1616 amdgpu_ring_write(ring, val); 1597 - } 1598 - 1599 - /** 1600 - * vcn_v2_0_jpeg_ring_insert_start - insert a start command 1601 - * 1602 - * @ring: amdgpu_ring pointer 1603 - * 1604 - * Write a start command to the ring. 1605 - */ 1606 - void vcn_v2_0_jpeg_ring_insert_start(struct amdgpu_ring *ring) 1607 - { 1608 - amdgpu_ring_write(ring, PACKETJ(mmUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET, 1609 - 0, 0, PACKETJ_TYPE0)); 1610 - amdgpu_ring_write(ring, 0x68e04); 1611 - 1612 - amdgpu_ring_write(ring, PACKETJ(JRBC_DEC_EXTERNAL_REG_WRITE_ADDR, 1613 - 0, 0, PACKETJ_TYPE0)); 1614 - amdgpu_ring_write(ring, 0x80010000); 1615 - } 1616 - 1617 - /** 1618 - * vcn_v2_0_jpeg_ring_insert_end - insert a end command 1619 - * 1620 - * @ring: amdgpu_ring pointer 1621 - * 1622 - * Write a end command to the ring. 1623 - */ 1624 - void vcn_v2_0_jpeg_ring_insert_end(struct amdgpu_ring *ring) 1625 - { 1626 - amdgpu_ring_write(ring, PACKETJ(mmUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET, 1627 - 0, 0, PACKETJ_TYPE0)); 1628 - amdgpu_ring_write(ring, 0x68e04); 1629 - 1630 - amdgpu_ring_write(ring, PACKETJ(JRBC_DEC_EXTERNAL_REG_WRITE_ADDR, 1631 - 0, 0, PACKETJ_TYPE0)); 1632 - amdgpu_ring_write(ring, 0x00010000); 1633 - } 1634 - 1635 - /** 1636 - * vcn_v2_0_jpeg_ring_emit_fence - emit an fence & trap command 1637 - * 1638 - * @ring: amdgpu_ring pointer 1639 - * @fence: fence to emit 1640 - * 1641 - * Write a fence and a trap command to the ring. 1642 - */ 1643 - void vcn_v2_0_jpeg_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, 1644 - unsigned flags) 1645 - { 1646 - WARN_ON(flags & AMDGPU_FENCE_FLAG_64BIT); 1647 - 1648 - amdgpu_ring_write(ring, PACKETJ(mmUVD_JPEG_GPCOM_DATA0_INTERNAL_OFFSET, 1649 - 0, 0, PACKETJ_TYPE0)); 1650 - amdgpu_ring_write(ring, seq); 1651 - 1652 - amdgpu_ring_write(ring, PACKETJ(mmUVD_JPEG_GPCOM_DATA1_INTERNAL_OFFSET, 1653 - 0, 0, PACKETJ_TYPE0)); 1654 - amdgpu_ring_write(ring, seq); 1655 - 1656 - amdgpu_ring_write(ring, PACKETJ(mmUVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW_INTERNAL_OFFSET, 1657 - 0, 0, PACKETJ_TYPE0)); 1658 - amdgpu_ring_write(ring, lower_32_bits(addr)); 1659 - 1660 - amdgpu_ring_write(ring, PACKETJ(mmUVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH_INTERNAL_OFFSET, 1661 - 0, 0, PACKETJ_TYPE0)); 1662 - amdgpu_ring_write(ring, upper_32_bits(addr)); 1663 - 1664 - amdgpu_ring_write(ring, PACKETJ(mmUVD_JPEG_GPCOM_CMD_INTERNAL_OFFSET, 1665 - 0, 0, PACKETJ_TYPE0)); 1666 - amdgpu_ring_write(ring, 0x8); 1667 - 1668 - amdgpu_ring_write(ring, PACKETJ(mmUVD_JPEG_GPCOM_CMD_INTERNAL_OFFSET, 1669 - 0, PACKETJ_CONDITION_CHECK0, PACKETJ_TYPE4)); 1670 - amdgpu_ring_write(ring, 0); 1671 - 1672 - amdgpu_ring_write(ring, PACKETJ(mmUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET, 1673 - 0, 0, PACKETJ_TYPE0)); 1674 - amdgpu_ring_write(ring, 0x3fbc); 1675 - 1676 - amdgpu_ring_write(ring, PACKETJ(JRBC_DEC_EXTERNAL_REG_WRITE_ADDR, 1677 - 0, 0, PACKETJ_TYPE0)); 1678 - amdgpu_ring_write(ring, 0x1); 1679 - 1680 - amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE7)); 1681 - amdgpu_ring_write(ring, 0); 1682 - } 1683 - 1684 - /** 1685 - * vcn_v2_0_jpeg_ring_emit_ib - execute indirect buffer 1686 - * 1687 - * @ring: amdgpu_ring pointer 1688 - * @ib: indirect buffer to execute 1689 - * 1690 - * Write ring commands to execute the indirect buffer. 1691 - */ 1692 - void vcn_v2_0_jpeg_ring_emit_ib(struct amdgpu_ring *ring, 1693 - struct amdgpu_job *job, 1694 - struct amdgpu_ib *ib, 1695 - uint32_t flags) 1696 - { 1697 - unsigned vmid = AMDGPU_JOB_GET_VMID(job); 1698 - 1699 - amdgpu_ring_write(ring, PACKETJ(mmUVD_LMI_JRBC_IB_VMID_INTERNAL_OFFSET, 1700 - 0, 0, PACKETJ_TYPE0)); 1701 - amdgpu_ring_write(ring, (vmid | (vmid << 4))); 1702 - 1703 - amdgpu_ring_write(ring, PACKETJ(mmUVD_LMI_JPEG_VMID_INTERNAL_OFFSET, 1704 - 0, 0, PACKETJ_TYPE0)); 1705 - amdgpu_ring_write(ring, (vmid | (vmid << 4))); 1706 - 1707 - amdgpu_ring_write(ring, PACKETJ(mmUVD_LMI_JRBC_IB_64BIT_BAR_LOW_INTERNAL_OFFSET, 1708 - 0, 0, PACKETJ_TYPE0)); 1709 - amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); 1710 - 1711 - amdgpu_ring_write(ring, PACKETJ(mmUVD_LMI_JRBC_IB_64BIT_BAR_HIGH_INTERNAL_OFFSET, 1712 - 0, 0, PACKETJ_TYPE0)); 1713 - amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr)); 1714 - 1715 - amdgpu_ring_write(ring, PACKETJ(mmUVD_JRBC_IB_SIZE_INTERNAL_OFFSET, 1716 - 0, 0, PACKETJ_TYPE0)); 1717 - amdgpu_ring_write(ring, ib->length_dw); 1718 - 1719 - amdgpu_ring_write(ring, PACKETJ(mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW_INTERNAL_OFFSET, 1720 - 0, 0, PACKETJ_TYPE0)); 1721 - amdgpu_ring_write(ring, lower_32_bits(ring->gpu_addr)); 1722 - 1723 - amdgpu_ring_write(ring, PACKETJ(mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH_INTERNAL_OFFSET, 1724 - 0, 0, PACKETJ_TYPE0)); 1725 - amdgpu_ring_write(ring, upper_32_bits(ring->gpu_addr)); 1726 - 1727 - amdgpu_ring_write(ring, PACKETJ(0, 0, PACKETJ_CONDITION_CHECK0, PACKETJ_TYPE2)); 1728 - amdgpu_ring_write(ring, 0); 1729 - 1730 - amdgpu_ring_write(ring, PACKETJ(mmUVD_JRBC_RB_COND_RD_TIMER_INTERNAL_OFFSET, 1731 - 0, 0, PACKETJ_TYPE0)); 1732 - amdgpu_ring_write(ring, 0x01400200); 1733 - 1734 - amdgpu_ring_write(ring, PACKETJ(mmUVD_JRBC_RB_REF_DATA_INTERNAL_OFFSET, 1735 - 0, 0, PACKETJ_TYPE0)); 1736 - amdgpu_ring_write(ring, 0x2); 1737 - 1738 - amdgpu_ring_write(ring, PACKETJ(mmUVD_JRBC_STATUS_INTERNAL_OFFSET, 1739 - 0, PACKETJ_CONDITION_CHECK3, PACKETJ_TYPE3)); 1740 - amdgpu_ring_write(ring, 0x2); 1741 - } 1742 - 1743 - void vcn_v2_0_jpeg_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg, 1744 - uint32_t val, uint32_t mask) 1745 - { 1746 - uint32_t reg_offset = (reg << 2); 1747 - 1748 - amdgpu_ring_write(ring, PACKETJ(mmUVD_JRBC_RB_COND_RD_TIMER_INTERNAL_OFFSET, 1749 - 0, 0, PACKETJ_TYPE0)); 1750 - amdgpu_ring_write(ring, 0x01400200); 1751 - 1752 - amdgpu_ring_write(ring, PACKETJ(mmUVD_JRBC_RB_REF_DATA_INTERNAL_OFFSET, 1753 - 0, 0, PACKETJ_TYPE0)); 1754 - amdgpu_ring_write(ring, val); 1755 - 1756 - amdgpu_ring_write(ring, PACKETJ(mmUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET, 1757 - 0, 0, PACKETJ_TYPE0)); 1758 - if (reg_offset >= 0x10000 && reg_offset <= 0x105ff) { 1759 - amdgpu_ring_write(ring, 0); 1760 - amdgpu_ring_write(ring, 1761 - PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE3)); 1762 - } else { 1763 - amdgpu_ring_write(ring, reg_offset); 1764 - amdgpu_ring_write(ring, PACKETJ(JRBC_DEC_EXTERNAL_REG_WRITE_ADDR, 1765 - 0, 0, PACKETJ_TYPE3)); 1766 - } 1767 - amdgpu_ring_write(ring, mask); 1768 - } 1769 - 1770 - void vcn_v2_0_jpeg_ring_emit_vm_flush(struct amdgpu_ring *ring, 1771 - unsigned vmid, uint64_t pd_addr) 1772 - { 1773 - struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; 1774 - uint32_t data0, data1, mask; 1775 - 1776 - pd_addr = amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr); 1777 - 1778 - /* wait for register write */ 1779 - data0 = hub->ctx0_ptb_addr_lo32 + vmid * 2; 1780 - data1 = lower_32_bits(pd_addr); 1781 - mask = 0xffffffff; 1782 - vcn_v2_0_jpeg_ring_emit_reg_wait(ring, data0, data1, mask); 1783 - } 1784 - 1785 - void vcn_v2_0_jpeg_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint32_t val) 1786 - { 1787 - uint32_t reg_offset = (reg << 2); 1788 - 1789 - amdgpu_ring_write(ring, PACKETJ(mmUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET, 1790 - 0, 0, PACKETJ_TYPE0)); 1791 - if (reg_offset >= 0x10000 && reg_offset <= 0x105ff) { 1792 - amdgpu_ring_write(ring, 0); 1793 - amdgpu_ring_write(ring, 1794 - PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE0)); 1795 - } else { 1796 - amdgpu_ring_write(ring, reg_offset); 1797 - amdgpu_ring_write(ring, PACKETJ(JRBC_DEC_EXTERNAL_REG_WRITE_ADDR, 1798 - 0, 0, PACKETJ_TYPE0)); 1799 - } 1800 - amdgpu_ring_write(ring, val); 1801 - } 1802 - 1803 - void vcn_v2_0_jpeg_ring_nop(struct amdgpu_ring *ring, uint32_t count) 1804 - { 1805 - int i; 1806 - 1807 - WARN_ON(ring->wptr % 2 || count % 2); 1808 - 1809 - for (i = 0; i < count / 2; i++) { 1810 - amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE6)); 1811 - amdgpu_ring_write(ring, 0); 1812 - } 1813 1617 } 1814 1618 1815 1619 static int vcn_v2_0_set_interrupt_state(struct amdgpu_device *adev,
-13
drivers/gpu/drm/amd/amdgpu/vcn_v2_0.h
··· 49 49 unsigned int vmid, uint64_t pd_addr); 50 50 extern void vcn_v2_0_enc_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint32_t val); 51 51 52 - extern void vcn_v2_0_jpeg_ring_insert_start(struct amdgpu_ring *ring); 53 - extern void vcn_v2_0_jpeg_ring_insert_end(struct amdgpu_ring *ring); 54 - extern void vcn_v2_0_jpeg_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, 55 - unsigned flags); 56 - extern void vcn_v2_0_jpeg_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_job *job, 57 - struct amdgpu_ib *ib, uint32_t flags); 58 - extern void vcn_v2_0_jpeg_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg, 59 - uint32_t val, uint32_t mask); 60 - extern void vcn_v2_0_jpeg_ring_emit_vm_flush(struct amdgpu_ring *ring, 61 - unsigned vmid, uint64_t pd_addr); 62 - extern void vcn_v2_0_jpeg_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint32_t val); 63 - extern void vcn_v2_0_jpeg_ring_nop(struct amdgpu_ring *ring, uint32_t count); 64 - 65 52 extern const struct amdgpu_ip_block_version vcn_v2_0_ip_block; 66 53 67 54 #endif /* __VCN_V2_0_H__ */
+4 -242
drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
··· 47 47 #define mmUVD_LMI_RBC_IB_64BIT_BAR_HIGH_INTERNAL_OFFSET 0x3b5 48 48 #define mmUVD_RBC_IB_SIZE_INTERNAL_OFFSET 0x25c 49 49 50 - #define mmUVD_JPEG_PITCH_INTERNAL_OFFSET 0x401f 51 - 52 - #define VCN25_MAX_HW_INSTANCES_ARCTURUS 2 50 + #define VCN25_MAX_HW_INSTANCES_ARCTURUS 2 53 51 54 52 static void vcn_v2_5_set_dec_ring_funcs(struct amdgpu_device *adev); 55 53 static void vcn_v2_5_set_enc_ring_funcs(struct amdgpu_device *adev); 56 - static void vcn_v2_5_set_jpeg_ring_funcs(struct amdgpu_device *adev); 57 54 static void vcn_v2_5_set_irq_funcs(struct amdgpu_device *adev); 58 55 static int vcn_v2_5_set_powergating_state(void *handle, 59 56 enum amd_powergating_state state); ··· 92 95 93 96 vcn_v2_5_set_dec_ring_funcs(adev); 94 97 vcn_v2_5_set_enc_ring_funcs(adev); 95 - vcn_v2_5_set_jpeg_ring_funcs(adev); 96 98 vcn_v2_5_set_irq_funcs(adev); 97 99 98 100 return 0; ··· 126 130 if (r) 127 131 return r; 128 132 } 129 - 130 - /* VCN JPEG TRAP */ 131 - r = amdgpu_irq_add_id(adev, amdgpu_ih_clientid_vcns[j], 132 - VCN_2_0__SRCID__JPEG_DECODE, &adev->vcn.inst[j].irq); 133 - if (r) 134 - return r; 135 133 } 136 134 137 135 r = amdgpu_vcn_sw_init(adev); ··· 174 184 adev->vcn.internal.nop = mmUVD_NO_OP_INTERNAL_OFFSET; 175 185 adev->vcn.inst[j].external.nop = SOC15_REG_OFFSET(UVD, j, mmUVD_NO_OP); 176 186 177 - adev->vcn.internal.jpeg_pitch = mmUVD_JPEG_PITCH_INTERNAL_OFFSET; 178 - adev->vcn.inst[j].external.jpeg_pitch = SOC15_REG_OFFSET(UVD, j, mmUVD_JPEG_PITCH); 179 - 180 187 ring = &adev->vcn.inst[j].ring_dec; 181 188 ring->use_doorbell = true; 182 189 ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 8*j; ··· 191 204 if (r) 192 205 return r; 193 206 } 194 - 195 - ring = &adev->vcn.inst[j].ring_jpeg; 196 - ring->use_doorbell = true; 197 - ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 1 + 8*j; 198 - sprintf(ring->name, "vcn_jpeg_%d", j); 199 - r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst[j].irq, 0); 200 - if (r) 201 - return r; 202 207 } 203 208 204 209 return 0; ··· 248 269 if (r) 249 270 goto done; 250 271 } 251 - 252 - ring = &adev->vcn.inst[j].ring_jpeg; 253 - r = amdgpu_ring_test_helper(ring); 254 - if (r) 255 - goto done; 256 272 } 273 + 257 274 done: 258 275 if (!r) 259 276 DRM_INFO("VCN decode and encode initialized successfully.\n"); ··· 284 309 ring = &adev->vcn.inst[i].ring_enc[i]; 285 310 ring->sched.ready = false; 286 311 } 287 - 288 - ring = &adev->vcn.inst[i].ring_jpeg; 289 - ring->sched.ready = false; 290 312 } 291 313 292 314 return 0; ··· 564 592 } 565 593 } 566 594 567 - /** 568 - * jpeg_v2_5_start - start JPEG block 569 - * 570 - * @adev: amdgpu_device pointer 571 - * 572 - * Setup and start the JPEG block 573 - */ 574 - static int jpeg_v2_5_start(struct amdgpu_device *adev) 575 - { 576 - struct amdgpu_ring *ring; 577 - uint32_t tmp; 578 - int i; 579 - 580 - for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { 581 - if (adev->vcn.harvest_config & (1 << i)) 582 - continue; 583 - ring = &adev->vcn.inst[i].ring_jpeg; 584 - /* disable anti hang mechanism */ 585 - WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_JPEG_POWER_STATUS), 0, 586 - ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK); 587 - 588 - /* JPEG disable CGC */ 589 - tmp = RREG32_SOC15(VCN, i, mmJPEG_CGC_CTRL); 590 - tmp |= 1 << JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT; 591 - tmp |= 1 << JPEG_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT; 592 - tmp |= 4 << JPEG_CGC_CTRL__CLK_OFF_DELAY__SHIFT; 593 - WREG32_SOC15(VCN, i, mmJPEG_CGC_CTRL, tmp); 594 - 595 - tmp = RREG32_SOC15(VCN, i, mmJPEG_CGC_GATE); 596 - tmp &= ~(JPEG_CGC_GATE__JPEG_DEC_MASK 597 - | JPEG_CGC_GATE__JPEG2_DEC_MASK 598 - | JPEG_CGC_GATE__JMCIF_MASK 599 - | JPEG_CGC_GATE__JRBBM_MASK); 600 - WREG32_SOC15(VCN, i, mmJPEG_CGC_GATE, tmp); 601 - 602 - tmp = RREG32_SOC15(VCN, i, mmJPEG_CGC_CTRL); 603 - tmp &= ~(JPEG_CGC_CTRL__JPEG_DEC_MODE_MASK 604 - | JPEG_CGC_CTRL__JPEG2_DEC_MODE_MASK 605 - | JPEG_CGC_CTRL__JMCIF_MODE_MASK 606 - | JPEG_CGC_CTRL__JRBBM_MODE_MASK); 607 - WREG32_SOC15(VCN, i, mmJPEG_CGC_CTRL, tmp); 608 - 609 - /* MJPEG global tiling registers */ 610 - WREG32_SOC15(UVD, i, mmJPEG_DEC_GFX8_ADDR_CONFIG, 611 - adev->gfx.config.gb_addr_config); 612 - WREG32_SOC15(UVD, i, mmJPEG_DEC_GFX10_ADDR_CONFIG, 613 - adev->gfx.config.gb_addr_config); 614 - 615 - /* enable JMI channel */ 616 - WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_JMI_CNTL), 0, 617 - ~UVD_JMI_CNTL__SOFT_RESET_MASK); 618 - 619 - /* enable System Interrupt for JRBC */ 620 - WREG32_P(SOC15_REG_OFFSET(VCN, i, mmJPEG_SYS_INT_EN), 621 - JPEG_SYS_INT_EN__DJRBC_MASK, 622 - ~JPEG_SYS_INT_EN__DJRBC_MASK); 623 - 624 - WREG32_SOC15(UVD, i, mmUVD_LMI_JRBC_RB_VMID, 0); 625 - WREG32_SOC15(UVD, i, mmUVD_JRBC_RB_CNTL, (0x00000001L | 0x00000002L)); 626 - WREG32_SOC15(UVD, i, mmUVD_LMI_JRBC_RB_64BIT_BAR_LOW, 627 - lower_32_bits(ring->gpu_addr)); 628 - WREG32_SOC15(UVD, i, mmUVD_LMI_JRBC_RB_64BIT_BAR_HIGH, 629 - upper_32_bits(ring->gpu_addr)); 630 - WREG32_SOC15(UVD, i, mmUVD_JRBC_RB_RPTR, 0); 631 - WREG32_SOC15(UVD, i, mmUVD_JRBC_RB_WPTR, 0); 632 - WREG32_SOC15(UVD, i, mmUVD_JRBC_RB_CNTL, 0x00000002L); 633 - WREG32_SOC15(UVD, i, mmUVD_JRBC_RB_SIZE, ring->ring_size / 4); 634 - ring->wptr = RREG32_SOC15(UVD, i, mmUVD_JRBC_RB_WPTR); 635 - } 636 - 637 - return 0; 638 - } 639 - 640 - /** 641 - * jpeg_v2_5_stop - stop JPEG block 642 - * 643 - * @adev: amdgpu_device pointer 644 - * 645 - * stop the JPEG block 646 - */ 647 - static int jpeg_v2_5_stop(struct amdgpu_device *adev) 648 - { 649 - uint32_t tmp; 650 - int i; 651 - 652 - for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { 653 - if (adev->vcn.harvest_config & (1 << i)) 654 - continue; 655 - /* reset JMI */ 656 - WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_JMI_CNTL), 657 - UVD_JMI_CNTL__SOFT_RESET_MASK, 658 - ~UVD_JMI_CNTL__SOFT_RESET_MASK); 659 - 660 - tmp = RREG32_SOC15(VCN, i, mmJPEG_CGC_GATE); 661 - tmp |= (JPEG_CGC_GATE__JPEG_DEC_MASK 662 - |JPEG_CGC_GATE__JPEG2_DEC_MASK 663 - |JPEG_CGC_GATE__JMCIF_MASK 664 - |JPEG_CGC_GATE__JRBBM_MASK); 665 - WREG32_SOC15(VCN, i, mmJPEG_CGC_GATE, tmp); 666 - 667 - /* enable anti hang mechanism */ 668 - WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_JPEG_POWER_STATUS), 669 - UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK, 670 - ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK); 671 - } 672 - 673 - return 0; 674 - } 675 - 676 595 static int vcn_v2_5_start(struct amdgpu_device *adev) 677 596 { 678 597 struct amdgpu_ring *ring; ··· 737 874 WREG32_SOC15(UVD, i, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); 738 875 WREG32_SOC15(UVD, i, mmUVD_RB_SIZE2, ring->ring_size / 4); 739 876 } 740 - r = jpeg_v2_5_start(adev); 741 877 742 - return r; 878 + return 0; 743 879 } 744 880 745 881 static int vcn_v2_5_stop(struct amdgpu_device *adev) 746 882 { 747 883 uint32_t tmp; 748 - int i, r; 749 - 750 - r = jpeg_v2_5_stop(adev); 751 - if (r) 752 - return r; 884 + int i, r = 0; 753 885 754 886 for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { 755 887 if (adev->vcn.harvest_config & (1 << i)) ··· 983 1125 .emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper, 984 1126 }; 985 1127 986 - /** 987 - * vcn_v2_5_jpeg_ring_get_rptr - get read pointer 988 - * 989 - * @ring: amdgpu_ring pointer 990 - * 991 - * Returns the current hardware read pointer 992 - */ 993 - static uint64_t vcn_v2_5_jpeg_ring_get_rptr(struct amdgpu_ring *ring) 994 - { 995 - struct amdgpu_device *adev = ring->adev; 996 - 997 - return RREG32_SOC15(UVD, ring->me, mmUVD_JRBC_RB_RPTR); 998 - } 999 - 1000 - /** 1001 - * vcn_v2_5_jpeg_ring_get_wptr - get write pointer 1002 - * 1003 - * @ring: amdgpu_ring pointer 1004 - * 1005 - * Returns the current hardware write pointer 1006 - */ 1007 - static uint64_t vcn_v2_5_jpeg_ring_get_wptr(struct amdgpu_ring *ring) 1008 - { 1009 - struct amdgpu_device *adev = ring->adev; 1010 - 1011 - if (ring->use_doorbell) 1012 - return adev->wb.wb[ring->wptr_offs]; 1013 - else 1014 - return RREG32_SOC15(UVD, ring->me, mmUVD_JRBC_RB_WPTR); 1015 - } 1016 - 1017 - /** 1018 - * vcn_v2_5_jpeg_ring_set_wptr - set write pointer 1019 - * 1020 - * @ring: amdgpu_ring pointer 1021 - * 1022 - * Commits the write pointer to the hardware 1023 - */ 1024 - static void vcn_v2_5_jpeg_ring_set_wptr(struct amdgpu_ring *ring) 1025 - { 1026 - struct amdgpu_device *adev = ring->adev; 1027 - 1028 - if (ring->use_doorbell) { 1029 - adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr); 1030 - WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr)); 1031 - } else { 1032 - WREG32_SOC15(UVD, ring->me, mmUVD_JRBC_RB_WPTR, lower_32_bits(ring->wptr)); 1033 - } 1034 - } 1035 - 1036 - static const struct amdgpu_ring_funcs vcn_v2_5_jpeg_ring_vm_funcs = { 1037 - .type = AMDGPU_RING_TYPE_VCN_JPEG, 1038 - .align_mask = 0xf, 1039 - .vmhub = AMDGPU_MMHUB_1, 1040 - .get_rptr = vcn_v2_5_jpeg_ring_get_rptr, 1041 - .get_wptr = vcn_v2_5_jpeg_ring_get_wptr, 1042 - .set_wptr = vcn_v2_5_jpeg_ring_set_wptr, 1043 - .emit_frame_size = 1044 - SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 + 1045 - SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 + 1046 - 8 + /* vcn_v2_0_jpeg_ring_emit_vm_flush */ 1047 - 18 + 18 + /* vcn_v2_0_jpeg_ring_emit_fence x2 vm fence */ 1048 - 8 + 16, 1049 - .emit_ib_size = 22, /* vcn_v2_0_jpeg_ring_emit_ib */ 1050 - .emit_ib = vcn_v2_0_jpeg_ring_emit_ib, 1051 - .emit_fence = vcn_v2_0_jpeg_ring_emit_fence, 1052 - .emit_vm_flush = vcn_v2_0_jpeg_ring_emit_vm_flush, 1053 - .test_ring = amdgpu_vcn_jpeg_ring_test_ring, 1054 - .test_ib = amdgpu_vcn_jpeg_ring_test_ib, 1055 - .insert_nop = vcn_v2_0_jpeg_ring_nop, 1056 - .insert_start = vcn_v2_0_jpeg_ring_insert_start, 1057 - .insert_end = vcn_v2_0_jpeg_ring_insert_end, 1058 - .pad_ib = amdgpu_ring_generic_pad_ib, 1059 - .begin_use = amdgpu_vcn_ring_begin_use, 1060 - .end_use = amdgpu_vcn_ring_end_use, 1061 - .emit_wreg = vcn_v2_0_jpeg_ring_emit_wreg, 1062 - .emit_reg_wait = vcn_v2_0_jpeg_ring_emit_reg_wait, 1063 - .emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper, 1064 - }; 1065 - 1066 1128 static void vcn_v2_5_set_dec_ring_funcs(struct amdgpu_device *adev) 1067 1129 { 1068 1130 int i; ··· 1008 1230 adev->vcn.inst[j].ring_enc[i].me = j; 1009 1231 } 1010 1232 DRM_INFO("VCN(%d) encode is enabled in VM mode\n", j); 1011 - } 1012 - } 1013 - 1014 - static void vcn_v2_5_set_jpeg_ring_funcs(struct amdgpu_device *adev) 1015 - { 1016 - int i; 1017 - 1018 - for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { 1019 - if (adev->vcn.harvest_config & (1 << i)) 1020 - continue; 1021 - adev->vcn.inst[i].ring_jpeg.funcs = &vcn_v2_5_jpeg_ring_vm_funcs; 1022 - adev->vcn.inst[i].ring_jpeg.me = i; 1023 - DRM_INFO("VCN(%d) jpeg decode is enabled in VM mode\n", i); 1024 1233 } 1025 1234 } 1026 1235 ··· 1116 1351 break; 1117 1352 case VCN_2_0__SRCID__UVD_ENC_LOW_LATENCY: 1118 1353 amdgpu_fence_process(&adev->vcn.inst[ip_instance].ring_enc[1]); 1119 - break; 1120 - case VCN_2_0__SRCID__JPEG_DECODE: 1121 - amdgpu_fence_process(&adev->vcn.inst[ip_instance].ring_jpeg); 1122 1354 break; 1123 1355 default: 1124 1356 DRM_ERROR("Unhandled interrupt: %d %d\n",