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

drm/amdgpu: separate JPEG1.0 code out from VCN1.0

For VCN1.0, the separation is just in code wise, JPEG1.0 HW is still
included in the VCN1.0 HW.

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
bb0db70f 9d9cc9b8

+630 -470
+2 -1
drivers/gpu/drm/amd/amdgpu/Makefile
··· 153 153 vcn_v1_0.o \ 154 154 vcn_v2_0.o \ 155 155 vcn_v2_5.o \ 156 - amdgpu_jpeg.o 156 + amdgpu_jpeg.o \ 157 + jpeg_v1_0.o 157 158 158 159 # add ATHUB block 159 160 amdgpu-y += \
+584
drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.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 + 29 + #include "vcn/vcn_1_0_offset.h" 30 + #include "vcn/vcn_1_0_sh_mask.h" 31 + 32 + static void jpeg_v1_0_set_dec_ring_funcs(struct amdgpu_device *adev); 33 + static void jpeg_v1_0_set_irq_funcs(struct amdgpu_device *adev); 34 + 35 + static void jpeg_v1_0_decode_ring_patch_wreg(struct amdgpu_ring *ring, uint32_t *ptr, uint32_t reg_offset, uint32_t val) 36 + { 37 + struct amdgpu_device *adev = ring->adev; 38 + ring->ring[(*ptr)++] = PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0); 39 + if (((reg_offset >= 0x1f800) && (reg_offset <= 0x21fff)) || 40 + ((reg_offset >= 0x1e000) && (reg_offset <= 0x1e1ff))) { 41 + ring->ring[(*ptr)++] = 0; 42 + ring->ring[(*ptr)++] = PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE0); 43 + } else { 44 + ring->ring[(*ptr)++] = reg_offset; 45 + ring->ring[(*ptr)++] = PACKETJ(0, 0, 0, PACKETJ_TYPE0); 46 + } 47 + ring->ring[(*ptr)++] = val; 48 + } 49 + 50 + static void jpeg_v1_0_decode_ring_set_patch_ring(struct amdgpu_ring *ring, uint32_t ptr) 51 + { 52 + struct amdgpu_device *adev = ring->adev; 53 + 54 + uint32_t reg, reg_offset, val, mask, i; 55 + 56 + // 1st: program mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW 57 + reg = SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW); 58 + reg_offset = (reg << 2); 59 + val = lower_32_bits(ring->gpu_addr); 60 + jpeg_v1_0_decode_ring_patch_wreg(ring, &ptr, reg_offset, val); 61 + 62 + // 2nd: program mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH 63 + reg = SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH); 64 + reg_offset = (reg << 2); 65 + val = upper_32_bits(ring->gpu_addr); 66 + jpeg_v1_0_decode_ring_patch_wreg(ring, &ptr, reg_offset, val); 67 + 68 + // 3rd to 5th: issue MEM_READ commands 69 + for (i = 0; i <= 2; i++) { 70 + ring->ring[ptr++] = PACKETJ(0, 0, 0, PACKETJ_TYPE2); 71 + ring->ring[ptr++] = 0; 72 + } 73 + 74 + // 6th: program mmUVD_JRBC_RB_CNTL register to enable NO_FETCH and RPTR write ability 75 + reg = SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_CNTL); 76 + reg_offset = (reg << 2); 77 + val = 0x13; 78 + jpeg_v1_0_decode_ring_patch_wreg(ring, &ptr, reg_offset, val); 79 + 80 + // 7th: program mmUVD_JRBC_RB_REF_DATA 81 + reg = SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_REF_DATA); 82 + reg_offset = (reg << 2); 83 + val = 0x1; 84 + jpeg_v1_0_decode_ring_patch_wreg(ring, &ptr, reg_offset, val); 85 + 86 + // 8th: issue conditional register read mmUVD_JRBC_RB_CNTL 87 + reg = SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_CNTL); 88 + reg_offset = (reg << 2); 89 + val = 0x1; 90 + mask = 0x1; 91 + 92 + ring->ring[ptr++] = PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_COND_RD_TIMER), 0, 0, PACKETJ_TYPE0); 93 + ring->ring[ptr++] = 0x01400200; 94 + ring->ring[ptr++] = PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_REF_DATA), 0, 0, PACKETJ_TYPE0); 95 + ring->ring[ptr++] = val; 96 + ring->ring[ptr++] = PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0); 97 + if (((reg_offset >= 0x1f800) && (reg_offset <= 0x21fff)) || 98 + ((reg_offset >= 0x1e000) && (reg_offset <= 0x1e1ff))) { 99 + ring->ring[ptr++] = 0; 100 + ring->ring[ptr++] = PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE3); 101 + } else { 102 + ring->ring[ptr++] = reg_offset; 103 + ring->ring[ptr++] = PACKETJ(0, 0, 0, PACKETJ_TYPE3); 104 + } 105 + ring->ring[ptr++] = mask; 106 + 107 + //9th to 21st: insert no-op 108 + for (i = 0; i <= 12; i++) { 109 + ring->ring[ptr++] = PACKETJ(0, 0, 0, PACKETJ_TYPE6); 110 + ring->ring[ptr++] = 0; 111 + } 112 + 113 + //22nd: reset mmUVD_JRBC_RB_RPTR 114 + reg = SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_RPTR); 115 + reg_offset = (reg << 2); 116 + val = 0; 117 + jpeg_v1_0_decode_ring_patch_wreg(ring, &ptr, reg_offset, val); 118 + 119 + //23rd: program mmUVD_JRBC_RB_CNTL to disable no_fetch 120 + reg = SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_CNTL); 121 + reg_offset = (reg << 2); 122 + val = 0x12; 123 + jpeg_v1_0_decode_ring_patch_wreg(ring, &ptr, reg_offset, val); 124 + } 125 + 126 + /** 127 + * jpeg_v1_0_decode_ring_get_rptr - get read pointer 128 + * 129 + * @ring: amdgpu_ring pointer 130 + * 131 + * Returns the current hardware read pointer 132 + */ 133 + static uint64_t jpeg_v1_0_decode_ring_get_rptr(struct amdgpu_ring *ring) 134 + { 135 + struct amdgpu_device *adev = ring->adev; 136 + 137 + return RREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_RPTR); 138 + } 139 + 140 + /** 141 + * jpeg_v1_0_decode_ring_get_wptr - get write pointer 142 + * 143 + * @ring: amdgpu_ring pointer 144 + * 145 + * Returns the current hardware write pointer 146 + */ 147 + static uint64_t jpeg_v1_0_decode_ring_get_wptr(struct amdgpu_ring *ring) 148 + { 149 + struct amdgpu_device *adev = ring->adev; 150 + 151 + return RREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_WPTR); 152 + } 153 + 154 + /** 155 + * jpeg_v1_0_decode_ring_set_wptr - set write pointer 156 + * 157 + * @ring: amdgpu_ring pointer 158 + * 159 + * Commits the write pointer to the hardware 160 + */ 161 + static void jpeg_v1_0_decode_ring_set_wptr(struct amdgpu_ring *ring) 162 + { 163 + struct amdgpu_device *adev = ring->adev; 164 + 165 + WREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_WPTR, lower_32_bits(ring->wptr)); 166 + } 167 + 168 + /** 169 + * jpeg_v1_0_decode_ring_insert_start - insert a start command 170 + * 171 + * @ring: amdgpu_ring pointer 172 + * 173 + * Write a start command to the ring. 174 + */ 175 + static void jpeg_v1_0_decode_ring_insert_start(struct amdgpu_ring *ring) 176 + { 177 + struct amdgpu_device *adev = ring->adev; 178 + 179 + amdgpu_ring_write(ring, 180 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0)); 181 + amdgpu_ring_write(ring, 0x68e04); 182 + 183 + amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE0)); 184 + amdgpu_ring_write(ring, 0x80010000); 185 + } 186 + 187 + /** 188 + * jpeg_v1_0_decode_ring_insert_end - insert a end command 189 + * 190 + * @ring: amdgpu_ring pointer 191 + * 192 + * Write a end command to the ring. 193 + */ 194 + static void jpeg_v1_0_decode_ring_insert_end(struct amdgpu_ring *ring) 195 + { 196 + struct amdgpu_device *adev = ring->adev; 197 + 198 + amdgpu_ring_write(ring, 199 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0)); 200 + amdgpu_ring_write(ring, 0x68e04); 201 + 202 + amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE0)); 203 + amdgpu_ring_write(ring, 0x00010000); 204 + } 205 + 206 + /** 207 + * jpeg_v1_0_decode_ring_emit_fence - emit an fence & trap command 208 + * 209 + * @ring: amdgpu_ring pointer 210 + * @fence: fence to emit 211 + * 212 + * Write a fence and a trap command to the ring. 213 + */ 214 + static void jpeg_v1_0_decode_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, 215 + unsigned flags) 216 + { 217 + struct amdgpu_device *adev = ring->adev; 218 + 219 + WARN_ON(flags & AMDGPU_FENCE_FLAG_64BIT); 220 + 221 + amdgpu_ring_write(ring, 222 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JPEG_GPCOM_DATA0), 0, 0, PACKETJ_TYPE0)); 223 + amdgpu_ring_write(ring, seq); 224 + 225 + amdgpu_ring_write(ring, 226 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JPEG_GPCOM_DATA1), 0, 0, PACKETJ_TYPE0)); 227 + amdgpu_ring_write(ring, seq); 228 + 229 + amdgpu_ring_write(ring, 230 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW), 0, 0, PACKETJ_TYPE0)); 231 + amdgpu_ring_write(ring, lower_32_bits(addr)); 232 + 233 + amdgpu_ring_write(ring, 234 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH), 0, 0, PACKETJ_TYPE0)); 235 + amdgpu_ring_write(ring, upper_32_bits(addr)); 236 + 237 + amdgpu_ring_write(ring, 238 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JPEG_GPCOM_CMD), 0, 0, PACKETJ_TYPE0)); 239 + amdgpu_ring_write(ring, 0x8); 240 + 241 + amdgpu_ring_write(ring, 242 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JPEG_GPCOM_CMD), 0, PACKETJ_CONDITION_CHECK0, PACKETJ_TYPE4)); 243 + amdgpu_ring_write(ring, 0); 244 + 245 + amdgpu_ring_write(ring, 246 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_COND_RD_TIMER), 0, 0, PACKETJ_TYPE0)); 247 + amdgpu_ring_write(ring, 0x01400200); 248 + 249 + amdgpu_ring_write(ring, 250 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_REF_DATA), 0, 0, PACKETJ_TYPE0)); 251 + amdgpu_ring_write(ring, seq); 252 + 253 + amdgpu_ring_write(ring, 254 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW), 0, 0, PACKETJ_TYPE0)); 255 + amdgpu_ring_write(ring, lower_32_bits(addr)); 256 + 257 + amdgpu_ring_write(ring, 258 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH), 0, 0, PACKETJ_TYPE0)); 259 + amdgpu_ring_write(ring, upper_32_bits(addr)); 260 + 261 + amdgpu_ring_write(ring, 262 + PACKETJ(0, 0, PACKETJ_CONDITION_CHECK3, PACKETJ_TYPE2)); 263 + amdgpu_ring_write(ring, 0xffffffff); 264 + 265 + amdgpu_ring_write(ring, 266 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0)); 267 + amdgpu_ring_write(ring, 0x3fbc); 268 + 269 + amdgpu_ring_write(ring, 270 + PACKETJ(0, 0, 0, PACKETJ_TYPE0)); 271 + amdgpu_ring_write(ring, 0x1); 272 + 273 + /* emit trap */ 274 + amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE7)); 275 + amdgpu_ring_write(ring, 0); 276 + } 277 + 278 + /** 279 + * jpeg_v1_0_decode_ring_emit_ib - execute indirect buffer 280 + * 281 + * @ring: amdgpu_ring pointer 282 + * @ib: indirect buffer to execute 283 + * 284 + * Write ring commands to execute the indirect buffer. 285 + */ 286 + static void jpeg_v1_0_decode_ring_emit_ib(struct amdgpu_ring *ring, 287 + struct amdgpu_job *job, 288 + struct amdgpu_ib *ib, 289 + uint32_t flags) 290 + { 291 + struct amdgpu_device *adev = ring->adev; 292 + unsigned vmid = AMDGPU_JOB_GET_VMID(job); 293 + 294 + amdgpu_ring_write(ring, 295 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_IB_VMID), 0, 0, PACKETJ_TYPE0)); 296 + amdgpu_ring_write(ring, (vmid | (vmid << 4))); 297 + 298 + amdgpu_ring_write(ring, 299 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JPEG_VMID), 0, 0, PACKETJ_TYPE0)); 300 + amdgpu_ring_write(ring, (vmid | (vmid << 4))); 301 + 302 + amdgpu_ring_write(ring, 303 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_IB_64BIT_BAR_LOW), 0, 0, PACKETJ_TYPE0)); 304 + amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); 305 + 306 + amdgpu_ring_write(ring, 307 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_IB_64BIT_BAR_HIGH), 0, 0, PACKETJ_TYPE0)); 308 + amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr)); 309 + 310 + amdgpu_ring_write(ring, 311 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_IB_SIZE), 0, 0, PACKETJ_TYPE0)); 312 + amdgpu_ring_write(ring, ib->length_dw); 313 + 314 + amdgpu_ring_write(ring, 315 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW), 0, 0, PACKETJ_TYPE0)); 316 + amdgpu_ring_write(ring, lower_32_bits(ring->gpu_addr)); 317 + 318 + amdgpu_ring_write(ring, 319 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH), 0, 0, PACKETJ_TYPE0)); 320 + amdgpu_ring_write(ring, upper_32_bits(ring->gpu_addr)); 321 + 322 + amdgpu_ring_write(ring, 323 + PACKETJ(0, 0, PACKETJ_CONDITION_CHECK0, PACKETJ_TYPE2)); 324 + amdgpu_ring_write(ring, 0); 325 + 326 + amdgpu_ring_write(ring, 327 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_COND_RD_TIMER), 0, 0, PACKETJ_TYPE0)); 328 + amdgpu_ring_write(ring, 0x01400200); 329 + 330 + amdgpu_ring_write(ring, 331 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_REF_DATA), 0, 0, PACKETJ_TYPE0)); 332 + amdgpu_ring_write(ring, 0x2); 333 + 334 + amdgpu_ring_write(ring, 335 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_STATUS), 0, PACKETJ_CONDITION_CHECK3, PACKETJ_TYPE3)); 336 + amdgpu_ring_write(ring, 0x2); 337 + } 338 + 339 + static void jpeg_v1_0_decode_ring_emit_reg_wait(struct amdgpu_ring *ring, 340 + uint32_t reg, uint32_t val, 341 + uint32_t mask) 342 + { 343 + struct amdgpu_device *adev = ring->adev; 344 + uint32_t reg_offset = (reg << 2); 345 + 346 + amdgpu_ring_write(ring, 347 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_COND_RD_TIMER), 0, 0, PACKETJ_TYPE0)); 348 + amdgpu_ring_write(ring, 0x01400200); 349 + 350 + amdgpu_ring_write(ring, 351 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_RB_REF_DATA), 0, 0, PACKETJ_TYPE0)); 352 + amdgpu_ring_write(ring, val); 353 + 354 + amdgpu_ring_write(ring, 355 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0)); 356 + if (((reg_offset >= 0x1f800) && (reg_offset <= 0x21fff)) || 357 + ((reg_offset >= 0x1e000) && (reg_offset <= 0x1e1ff))) { 358 + amdgpu_ring_write(ring, 0); 359 + amdgpu_ring_write(ring, 360 + PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE3)); 361 + } else { 362 + amdgpu_ring_write(ring, reg_offset); 363 + amdgpu_ring_write(ring, 364 + PACKETJ(0, 0, 0, PACKETJ_TYPE3)); 365 + } 366 + amdgpu_ring_write(ring, mask); 367 + } 368 + 369 + static void jpeg_v1_0_decode_ring_emit_vm_flush(struct amdgpu_ring *ring, 370 + unsigned vmid, uint64_t pd_addr) 371 + { 372 + struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; 373 + uint32_t data0, data1, mask; 374 + 375 + pd_addr = amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr); 376 + 377 + /* wait for register write */ 378 + data0 = hub->ctx0_ptb_addr_lo32 + vmid * 2; 379 + data1 = lower_32_bits(pd_addr); 380 + mask = 0xffffffff; 381 + jpeg_v1_0_decode_ring_emit_reg_wait(ring, data0, data1, mask); 382 + } 383 + 384 + static void jpeg_v1_0_decode_ring_emit_wreg(struct amdgpu_ring *ring, 385 + uint32_t reg, uint32_t val) 386 + { 387 + struct amdgpu_device *adev = ring->adev; 388 + uint32_t reg_offset = (reg << 2); 389 + 390 + amdgpu_ring_write(ring, 391 + PACKETJ(SOC15_REG_OFFSET(JPEG, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0)); 392 + if (((reg_offset >= 0x1f800) && (reg_offset <= 0x21fff)) || 393 + ((reg_offset >= 0x1e000) && (reg_offset <= 0x1e1ff))) { 394 + amdgpu_ring_write(ring, 0); 395 + amdgpu_ring_write(ring, 396 + PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE0)); 397 + } else { 398 + amdgpu_ring_write(ring, reg_offset); 399 + amdgpu_ring_write(ring, 400 + PACKETJ(0, 0, 0, PACKETJ_TYPE0)); 401 + } 402 + amdgpu_ring_write(ring, val); 403 + } 404 + 405 + static void jpeg_v1_0_decode_ring_nop(struct amdgpu_ring *ring, uint32_t count) 406 + { 407 + int i; 408 + 409 + WARN_ON(ring->wptr % 2 || count % 2); 410 + 411 + for (i = 0; i < count / 2; i++) { 412 + amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE6)); 413 + amdgpu_ring_write(ring, 0); 414 + } 415 + } 416 + 417 + static int jpeg_v1_0_set_interrupt_state(struct amdgpu_device *adev, 418 + struct amdgpu_irq_src *source, 419 + unsigned type, 420 + enum amdgpu_interrupt_state state) 421 + { 422 + return 0; 423 + } 424 + 425 + static int jpeg_v1_0_process_interrupt(struct amdgpu_device *adev, 426 + struct amdgpu_irq_src *source, 427 + struct amdgpu_iv_entry *entry) 428 + { 429 + DRM_DEBUG("IH: JPEG decode TRAP\n"); 430 + 431 + switch (entry->src_id) { 432 + case 126: 433 + amdgpu_fence_process(&adev->jpeg.inst->ring_dec); 434 + break; 435 + default: 436 + DRM_ERROR("Unhandled interrupt: %d %d\n", 437 + entry->src_id, entry->src_data[0]); 438 + break; 439 + } 440 + 441 + return 0; 442 + } 443 + 444 + /** 445 + * jpeg_v1_0_early_init - set function pointers 446 + * 447 + * @handle: amdgpu_device pointer 448 + * 449 + * Set ring and irq function pointers 450 + */ 451 + int jpeg_v1_0_early_init(void *handle) 452 + { 453 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 454 + 455 + adev->jpeg.num_jpeg_inst = 1; 456 + 457 + jpeg_v1_0_set_dec_ring_funcs(adev); 458 + jpeg_v1_0_set_irq_funcs(adev); 459 + 460 + return 0; 461 + } 462 + 463 + /** 464 + * jpeg_v1_0_sw_init - sw init for JPEG block 465 + * 466 + * @handle: amdgpu_device pointer 467 + * 468 + */ 469 + int jpeg_v1_0_sw_init(void *handle) 470 + { 471 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 472 + struct amdgpu_ring *ring; 473 + int r; 474 + 475 + /* JPEG TRAP */ 476 + r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, 126, &adev->jpeg.inst->irq); 477 + if (r) 478 + return r; 479 + 480 + ring = &adev->jpeg.inst->ring_dec; 481 + sprintf(ring->name, "jpeg_dec"); 482 + r = amdgpu_ring_init(adev, ring, 512, &adev->jpeg.inst->irq, 0); 483 + if (r) 484 + return r; 485 + 486 + adev->jpeg.internal.jpeg_pitch = adev->jpeg.inst->external.jpeg_pitch = 487 + SOC15_REG_OFFSET(JPEG, 0, mmUVD_JPEG_PITCH); 488 + 489 + return 0; 490 + } 491 + 492 + /** 493 + * jpeg_v1_0_sw_fini - sw fini for JPEG block 494 + * 495 + * @handle: amdgpu_device pointer 496 + * 497 + * JPEG free up sw allocation 498 + */ 499 + void jpeg_v1_0_sw_fini(void *handle) 500 + { 501 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 502 + 503 + amdgpu_ring_fini(&adev->jpeg.inst[0].ring_dec); 504 + } 505 + 506 + /** 507 + * jpeg_v1_0_start - start JPEG block 508 + * 509 + * @adev: amdgpu_device pointer 510 + * 511 + * Setup and start the JPEG block 512 + */ 513 + void jpeg_v1_0_start(struct amdgpu_device *adev, int mode) 514 + { 515 + struct amdgpu_ring *ring = &adev->jpeg.inst->ring_dec; 516 + 517 + if (mode == 0) { 518 + WREG32_SOC15(JPEG, 0, mmUVD_LMI_JRBC_RB_VMID, 0); 519 + WREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_CNTL, UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK | 520 + UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK); 521 + WREG32_SOC15(JPEG, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_LOW, lower_32_bits(ring->gpu_addr)); 522 + WREG32_SOC15(JPEG, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_HIGH, upper_32_bits(ring->gpu_addr)); 523 + WREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_RPTR, 0); 524 + WREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_WPTR, 0); 525 + } WREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_CNTL, UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK); 526 + 527 + /* initialize wptr */ 528 + ring->wptr = RREG32_SOC15(JPEG, 0, mmUVD_JRBC_RB_WPTR); 529 + 530 + /* copy patch commands to the jpeg ring */ 531 + jpeg_v1_0_decode_ring_set_patch_ring(ring, 532 + (ring->wptr + ring->max_dw * amdgpu_sched_hw_submission)); 533 + } 534 + 535 + static const struct amdgpu_ring_funcs jpeg_v1_0_decode_ring_vm_funcs = { 536 + .type = AMDGPU_RING_TYPE_VCN_JPEG, 537 + .align_mask = 0xf, 538 + .nop = PACKET0(0x81ff, 0), 539 + .support_64bit_ptrs = false, 540 + .no_user_fence = true, 541 + .vmhub = AMDGPU_MMHUB_0, 542 + .extra_dw = 64, 543 + .get_rptr = jpeg_v1_0_decode_ring_get_rptr, 544 + .get_wptr = jpeg_v1_0_decode_ring_get_wptr, 545 + .set_wptr = jpeg_v1_0_decode_ring_set_wptr, 546 + .emit_frame_size = 547 + 6 + 6 + /* hdp invalidate / flush */ 548 + SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 + 549 + SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 + 550 + 8 + /* jpeg_v1_0_decode_ring_emit_vm_flush */ 551 + 26 + 26 + /* jpeg_v1_0_decode_ring_emit_fence x2 vm fence */ 552 + 6, 553 + .emit_ib_size = 22, /* jpeg_v1_0_decode_ring_emit_ib */ 554 + .emit_ib = jpeg_v1_0_decode_ring_emit_ib, 555 + .emit_fence = jpeg_v1_0_decode_ring_emit_fence, 556 + .emit_vm_flush = jpeg_v1_0_decode_ring_emit_vm_flush, 557 + .test_ring = amdgpu_jpeg_dec_ring_test_ring, 558 + .test_ib = amdgpu_jpeg_dec_ring_test_ib, 559 + .insert_nop = jpeg_v1_0_decode_ring_nop, 560 + .insert_start = jpeg_v1_0_decode_ring_insert_start, 561 + .insert_end = jpeg_v1_0_decode_ring_insert_end, 562 + .pad_ib = amdgpu_ring_generic_pad_ib, 563 + .begin_use = amdgpu_vcn_ring_begin_use, 564 + .end_use = amdgpu_vcn_ring_end_use, 565 + .emit_wreg = jpeg_v1_0_decode_ring_emit_wreg, 566 + .emit_reg_wait = jpeg_v1_0_decode_ring_emit_reg_wait, 567 + .emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper, 568 + }; 569 + 570 + static void jpeg_v1_0_set_dec_ring_funcs(struct amdgpu_device *adev) 571 + { 572 + adev->jpeg.inst->ring_dec.funcs = &jpeg_v1_0_decode_ring_vm_funcs; 573 + DRM_INFO("JPEG decode is enabled in VM mode\n"); 574 + } 575 + 576 + static const struct amdgpu_irq_src_funcs jpeg_v1_0_irq_funcs = { 577 + .set = jpeg_v1_0_set_interrupt_state, 578 + .process = jpeg_v1_0_process_interrupt, 579 + }; 580 + 581 + static void jpeg_v1_0_set_irq_funcs(struct amdgpu_device *adev) 582 + { 583 + adev->jpeg.inst->irq.funcs = &jpeg_v1_0_irq_funcs; 584 + }
+32
drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.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_V1_0_H__ 25 + #define __JPEG_V1_0_H__ 26 + 27 + int jpeg_v1_0_early_init(void *handle); 28 + int jpeg_v1_0_sw_init(void *handle); 29 + void jpeg_v1_0_sw_fini(void *handle); 30 + void jpeg_v1_0_start(struct amdgpu_device *adev, int mode); 31 + 32 + #endif /*__JPEG_V1_0_H__*/
+12 -469
drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
··· 36 36 #include "mmhub/mmhub_9_1_sh_mask.h" 37 37 38 38 #include "ivsrcid/vcn/irqsrcs_vcn_1_0.h" 39 + #include "jpeg_v1_0.h" 39 40 40 41 #define mmUVD_RBC_XX_IB_REG_CHECK 0x05ab 41 42 #define mmUVD_RBC_XX_IB_REG_CHECK_BASE_IDX 1 ··· 46 45 static int vcn_v1_0_stop(struct amdgpu_device *adev); 47 46 static void vcn_v1_0_set_dec_ring_funcs(struct amdgpu_device *adev); 48 47 static void vcn_v1_0_set_enc_ring_funcs(struct amdgpu_device *adev); 49 - static void vcn_v1_0_set_jpeg_ring_funcs(struct amdgpu_device *adev); 50 48 static void vcn_v1_0_set_irq_funcs(struct amdgpu_device *adev); 51 - static void vcn_v1_0_jpeg_ring_set_patch_ring(struct amdgpu_ring *ring, uint32_t ptr); 52 49 static int vcn_v1_0_set_powergating_state(void *handle, enum amd_powergating_state state); 53 50 static int vcn_v1_0_pause_dpg_mode(struct amdgpu_device *adev, 54 51 struct dpg_pause_state *new_state); ··· 67 68 68 69 vcn_v1_0_set_dec_ring_funcs(adev); 69 70 vcn_v1_0_set_enc_ring_funcs(adev); 70 - vcn_v1_0_set_jpeg_ring_funcs(adev); 71 71 vcn_v1_0_set_irq_funcs(adev); 72 + 73 + jpeg_v1_0_early_init(handle); 72 74 73 75 return 0; 74 76 } ··· 100 100 if (r) 101 101 return r; 102 102 } 103 - 104 - /* VCN JPEG TRAP */ 105 - r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, 126, &adev->vcn.inst->irq); 106 - if (r) 107 - return r; 108 103 109 104 r = amdgpu_vcn_sw_init(adev); 110 105 if (r) ··· 144 149 return r; 145 150 } 146 151 147 - ring = &adev->vcn.inst->ring_jpeg; 148 - sprintf(ring->name, "vcn_jpeg"); 149 - r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0); 150 - if (r) 151 - return r; 152 - 153 152 adev->vcn.pause_dpg_mode = vcn_v1_0_pause_dpg_mode; 154 - adev->vcn.internal.jpeg_pitch = adev->vcn.inst->external.jpeg_pitch = 155 - SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_PITCH); 156 153 157 - return 0; 154 + r = jpeg_v1_0_sw_init(handle); 155 + 156 + return r; 158 157 } 159 158 160 159 /** ··· 166 177 r = amdgpu_vcn_suspend(adev); 167 178 if (r) 168 179 return r; 180 + 181 + jpeg_v1_0_sw_fini(handle); 169 182 170 183 r = amdgpu_vcn_sw_fini(adev); 171 184 ··· 198 207 goto done; 199 208 } 200 209 201 - ring = &adev->vcn.inst->ring_jpeg; 210 + ring = &adev->jpeg.inst->ring_dec; 202 211 r = amdgpu_ring_test_helper(ring); 203 212 if (r) 204 213 goto done; ··· 938 947 WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); 939 948 WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE2, ring->ring_size / 4); 940 949 941 - ring = &adev->vcn.inst->ring_jpeg; 942 - WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_VMID, 0); 943 - WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL, UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK | 944 - UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK); 945 - WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_LOW, lower_32_bits(ring->gpu_addr)); 946 - WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_HIGH, upper_32_bits(ring->gpu_addr)); 947 - WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_RPTR, 0); 948 - WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR, 0); 949 - WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL, UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK); 950 - 951 - /* initialize wptr */ 952 - ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR); 953 - 954 - /* copy patch commands to the jpeg ring */ 955 - vcn_v1_0_jpeg_ring_set_patch_ring(ring, 956 - (ring->wptr + ring->max_dw * amdgpu_sched_hw_submission)); 950 + jpeg_v1_0_start(adev, 0); 957 951 958 952 return 0; 959 953 } ··· 1082 1106 WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_CNTL), 0, 1083 1107 ~UVD_RBC_RB_CNTL__RB_NO_FETCH_MASK); 1084 1108 1085 - /* initialize JPEG wptr */ 1086 - ring = &adev->vcn.inst->ring_jpeg; 1087 - ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR); 1088 - 1089 - /* copy patch commands to the jpeg ring */ 1090 - vcn_v1_0_jpeg_ring_set_patch_ring(ring, 1091 - (ring->wptr + ring->max_dw * amdgpu_sched_hw_submission)); 1109 + jpeg_v1_0_start(adev, 1); 1092 1110 1093 1111 return 0; 1094 1112 } ··· 1286 1316 UVD_DPG_PAUSE__JPEG_PAUSE_DPG_ACK_MASK, ret_code); 1287 1317 1288 1318 /* Restore */ 1289 - ring = &adev->vcn.inst->ring_jpeg; 1319 + ring = &adev->jpeg.inst->ring_dec; 1290 1320 WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_VMID, 0); 1291 1321 WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL, 1292 1322 UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK | ··· 1686 1716 amdgpu_ring_write(ring, val); 1687 1717 } 1688 1718 1689 - 1690 - /** 1691 - * vcn_v1_0_jpeg_ring_get_rptr - get read pointer 1692 - * 1693 - * @ring: amdgpu_ring pointer 1694 - * 1695 - * Returns the current hardware read pointer 1696 - */ 1697 - static uint64_t vcn_v1_0_jpeg_ring_get_rptr(struct amdgpu_ring *ring) 1698 - { 1699 - struct amdgpu_device *adev = ring->adev; 1700 - 1701 - return RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_RPTR); 1702 - } 1703 - 1704 - /** 1705 - * vcn_v1_0_jpeg_ring_get_wptr - get write pointer 1706 - * 1707 - * @ring: amdgpu_ring pointer 1708 - * 1709 - * Returns the current hardware write pointer 1710 - */ 1711 - static uint64_t vcn_v1_0_jpeg_ring_get_wptr(struct amdgpu_ring *ring) 1712 - { 1713 - struct amdgpu_device *adev = ring->adev; 1714 - 1715 - return RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR); 1716 - } 1717 - 1718 - /** 1719 - * vcn_v1_0_jpeg_ring_set_wptr - set write pointer 1720 - * 1721 - * @ring: amdgpu_ring pointer 1722 - * 1723 - * Commits the write pointer to the hardware 1724 - */ 1725 - static void vcn_v1_0_jpeg_ring_set_wptr(struct amdgpu_ring *ring) 1726 - { 1727 - struct amdgpu_device *adev = ring->adev; 1728 - 1729 - WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR, lower_32_bits(ring->wptr)); 1730 - } 1731 - 1732 - /** 1733 - * vcn_v1_0_jpeg_ring_insert_start - insert a start command 1734 - * 1735 - * @ring: amdgpu_ring pointer 1736 - * 1737 - * Write a start command to the ring. 1738 - */ 1739 - static void vcn_v1_0_jpeg_ring_insert_start(struct amdgpu_ring *ring) 1740 - { 1741 - struct amdgpu_device *adev = ring->adev; 1742 - 1743 - amdgpu_ring_write(ring, 1744 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0)); 1745 - amdgpu_ring_write(ring, 0x68e04); 1746 - 1747 - amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE0)); 1748 - amdgpu_ring_write(ring, 0x80010000); 1749 - } 1750 - 1751 - /** 1752 - * vcn_v1_0_jpeg_ring_insert_end - insert a end command 1753 - * 1754 - * @ring: amdgpu_ring pointer 1755 - * 1756 - * Write a end command to the ring. 1757 - */ 1758 - static void vcn_v1_0_jpeg_ring_insert_end(struct amdgpu_ring *ring) 1759 - { 1760 - struct amdgpu_device *adev = ring->adev; 1761 - 1762 - amdgpu_ring_write(ring, 1763 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0)); 1764 - amdgpu_ring_write(ring, 0x68e04); 1765 - 1766 - amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE0)); 1767 - amdgpu_ring_write(ring, 0x00010000); 1768 - } 1769 - 1770 - /** 1771 - * vcn_v1_0_jpeg_ring_emit_fence - emit an fence & trap command 1772 - * 1773 - * @ring: amdgpu_ring pointer 1774 - * @fence: fence to emit 1775 - * 1776 - * Write a fence and a trap command to the ring. 1777 - */ 1778 - static void vcn_v1_0_jpeg_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, 1779 - unsigned flags) 1780 - { 1781 - struct amdgpu_device *adev = ring->adev; 1782 - 1783 - WARN_ON(flags & AMDGPU_FENCE_FLAG_64BIT); 1784 - 1785 - amdgpu_ring_write(ring, 1786 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_GPCOM_DATA0), 0, 0, PACKETJ_TYPE0)); 1787 - amdgpu_ring_write(ring, seq); 1788 - 1789 - amdgpu_ring_write(ring, 1790 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_GPCOM_DATA1), 0, 0, PACKETJ_TYPE0)); 1791 - amdgpu_ring_write(ring, seq); 1792 - 1793 - amdgpu_ring_write(ring, 1794 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW), 0, 0, PACKETJ_TYPE0)); 1795 - amdgpu_ring_write(ring, lower_32_bits(addr)); 1796 - 1797 - amdgpu_ring_write(ring, 1798 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH), 0, 0, PACKETJ_TYPE0)); 1799 - amdgpu_ring_write(ring, upper_32_bits(addr)); 1800 - 1801 - amdgpu_ring_write(ring, 1802 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_GPCOM_CMD), 0, 0, PACKETJ_TYPE0)); 1803 - amdgpu_ring_write(ring, 0x8); 1804 - 1805 - amdgpu_ring_write(ring, 1806 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_GPCOM_CMD), 0, PACKETJ_CONDITION_CHECK0, PACKETJ_TYPE4)); 1807 - amdgpu_ring_write(ring, 0); 1808 - 1809 - amdgpu_ring_write(ring, 1810 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_RB_COND_RD_TIMER), 0, 0, PACKETJ_TYPE0)); 1811 - amdgpu_ring_write(ring, 0x01400200); 1812 - 1813 - amdgpu_ring_write(ring, 1814 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_RB_REF_DATA), 0, 0, PACKETJ_TYPE0)); 1815 - amdgpu_ring_write(ring, seq); 1816 - 1817 - amdgpu_ring_write(ring, 1818 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW), 0, 0, PACKETJ_TYPE0)); 1819 - amdgpu_ring_write(ring, lower_32_bits(addr)); 1820 - 1821 - amdgpu_ring_write(ring, 1822 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH), 0, 0, PACKETJ_TYPE0)); 1823 - amdgpu_ring_write(ring, upper_32_bits(addr)); 1824 - 1825 - amdgpu_ring_write(ring, 1826 - PACKETJ(0, 0, PACKETJ_CONDITION_CHECK3, PACKETJ_TYPE2)); 1827 - amdgpu_ring_write(ring, 0xffffffff); 1828 - 1829 - amdgpu_ring_write(ring, 1830 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0)); 1831 - amdgpu_ring_write(ring, 0x3fbc); 1832 - 1833 - amdgpu_ring_write(ring, 1834 - PACKETJ(0, 0, 0, PACKETJ_TYPE0)); 1835 - amdgpu_ring_write(ring, 0x1); 1836 - 1837 - /* emit trap */ 1838 - amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE7)); 1839 - amdgpu_ring_write(ring, 0); 1840 - } 1841 - 1842 - /** 1843 - * vcn_v1_0_jpeg_ring_emit_ib - execute indirect buffer 1844 - * 1845 - * @ring: amdgpu_ring pointer 1846 - * @ib: indirect buffer to execute 1847 - * 1848 - * Write ring commands to execute the indirect buffer. 1849 - */ 1850 - static void vcn_v1_0_jpeg_ring_emit_ib(struct amdgpu_ring *ring, 1851 - struct amdgpu_job *job, 1852 - struct amdgpu_ib *ib, 1853 - uint32_t flags) 1854 - { 1855 - struct amdgpu_device *adev = ring->adev; 1856 - unsigned vmid = AMDGPU_JOB_GET_VMID(job); 1857 - 1858 - amdgpu_ring_write(ring, 1859 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_JRBC_IB_VMID), 0, 0, PACKETJ_TYPE0)); 1860 - amdgpu_ring_write(ring, (vmid | (vmid << 4))); 1861 - 1862 - amdgpu_ring_write(ring, 1863 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_JPEG_VMID), 0, 0, PACKETJ_TYPE0)); 1864 - amdgpu_ring_write(ring, (vmid | (vmid << 4))); 1865 - 1866 - amdgpu_ring_write(ring, 1867 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_JRBC_IB_64BIT_BAR_LOW), 0, 0, PACKETJ_TYPE0)); 1868 - amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); 1869 - 1870 - amdgpu_ring_write(ring, 1871 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_JRBC_IB_64BIT_BAR_HIGH), 0, 0, PACKETJ_TYPE0)); 1872 - amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr)); 1873 - 1874 - amdgpu_ring_write(ring, 1875 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_IB_SIZE), 0, 0, PACKETJ_TYPE0)); 1876 - amdgpu_ring_write(ring, ib->length_dw); 1877 - 1878 - amdgpu_ring_write(ring, 1879 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW), 0, 0, PACKETJ_TYPE0)); 1880 - amdgpu_ring_write(ring, lower_32_bits(ring->gpu_addr)); 1881 - 1882 - amdgpu_ring_write(ring, 1883 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH), 0, 0, PACKETJ_TYPE0)); 1884 - amdgpu_ring_write(ring, upper_32_bits(ring->gpu_addr)); 1885 - 1886 - amdgpu_ring_write(ring, 1887 - PACKETJ(0, 0, PACKETJ_CONDITION_CHECK0, PACKETJ_TYPE2)); 1888 - amdgpu_ring_write(ring, 0); 1889 - 1890 - amdgpu_ring_write(ring, 1891 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_RB_COND_RD_TIMER), 0, 0, PACKETJ_TYPE0)); 1892 - amdgpu_ring_write(ring, 0x01400200); 1893 - 1894 - amdgpu_ring_write(ring, 1895 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_RB_REF_DATA), 0, 0, PACKETJ_TYPE0)); 1896 - amdgpu_ring_write(ring, 0x2); 1897 - 1898 - amdgpu_ring_write(ring, 1899 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_STATUS), 0, PACKETJ_CONDITION_CHECK3, PACKETJ_TYPE3)); 1900 - amdgpu_ring_write(ring, 0x2); 1901 - } 1902 - 1903 - static void vcn_v1_0_jpeg_ring_emit_reg_wait(struct amdgpu_ring *ring, 1904 - uint32_t reg, uint32_t val, 1905 - uint32_t mask) 1906 - { 1907 - struct amdgpu_device *adev = ring->adev; 1908 - uint32_t reg_offset = (reg << 2); 1909 - 1910 - amdgpu_ring_write(ring, 1911 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_RB_COND_RD_TIMER), 0, 0, PACKETJ_TYPE0)); 1912 - amdgpu_ring_write(ring, 0x01400200); 1913 - 1914 - amdgpu_ring_write(ring, 1915 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_RB_REF_DATA), 0, 0, PACKETJ_TYPE0)); 1916 - amdgpu_ring_write(ring, val); 1917 - 1918 - amdgpu_ring_write(ring, 1919 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0)); 1920 - if (((reg_offset >= 0x1f800) && (reg_offset <= 0x21fff)) || 1921 - ((reg_offset >= 0x1e000) && (reg_offset <= 0x1e1ff))) { 1922 - amdgpu_ring_write(ring, 0); 1923 - amdgpu_ring_write(ring, 1924 - PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE3)); 1925 - } else { 1926 - amdgpu_ring_write(ring, reg_offset); 1927 - amdgpu_ring_write(ring, 1928 - PACKETJ(0, 0, 0, PACKETJ_TYPE3)); 1929 - } 1930 - amdgpu_ring_write(ring, mask); 1931 - } 1932 - 1933 - static void vcn_v1_0_jpeg_ring_emit_vm_flush(struct amdgpu_ring *ring, 1934 - unsigned vmid, uint64_t pd_addr) 1935 - { 1936 - struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub]; 1937 - uint32_t data0, data1, mask; 1938 - 1939 - pd_addr = amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr); 1940 - 1941 - /* wait for register write */ 1942 - data0 = hub->ctx0_ptb_addr_lo32 + vmid * 2; 1943 - data1 = lower_32_bits(pd_addr); 1944 - mask = 0xffffffff; 1945 - vcn_v1_0_jpeg_ring_emit_reg_wait(ring, data0, data1, mask); 1946 - } 1947 - 1948 - static void vcn_v1_0_jpeg_ring_emit_wreg(struct amdgpu_ring *ring, 1949 - uint32_t reg, uint32_t val) 1950 - { 1951 - struct amdgpu_device *adev = ring->adev; 1952 - uint32_t reg_offset = (reg << 2); 1953 - 1954 - amdgpu_ring_write(ring, 1955 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0)); 1956 - if (((reg_offset >= 0x1f800) && (reg_offset <= 0x21fff)) || 1957 - ((reg_offset >= 0x1e000) && (reg_offset <= 0x1e1ff))) { 1958 - amdgpu_ring_write(ring, 0); 1959 - amdgpu_ring_write(ring, 1960 - PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE0)); 1961 - } else { 1962 - amdgpu_ring_write(ring, reg_offset); 1963 - amdgpu_ring_write(ring, 1964 - PACKETJ(0, 0, 0, PACKETJ_TYPE0)); 1965 - } 1966 - amdgpu_ring_write(ring, val); 1967 - } 1968 - 1969 - static void vcn_v1_0_jpeg_ring_nop(struct amdgpu_ring *ring, uint32_t count) 1970 - { 1971 - int i; 1972 - 1973 - WARN_ON(ring->wptr % 2 || count % 2); 1974 - 1975 - for (i = 0; i < count / 2; i++) { 1976 - amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE6)); 1977 - amdgpu_ring_write(ring, 0); 1978 - } 1979 - } 1980 - 1981 - static void vcn_v1_0_jpeg_ring_patch_wreg(struct amdgpu_ring *ring, uint32_t *ptr, uint32_t reg_offset, uint32_t val) 1982 - { 1983 - struct amdgpu_device *adev = ring->adev; 1984 - ring->ring[(*ptr)++] = PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0); 1985 - if (((reg_offset >= 0x1f800) && (reg_offset <= 0x21fff)) || 1986 - ((reg_offset >= 0x1e000) && (reg_offset <= 0x1e1ff))) { 1987 - ring->ring[(*ptr)++] = 0; 1988 - ring->ring[(*ptr)++] = PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE0); 1989 - } else { 1990 - ring->ring[(*ptr)++] = reg_offset; 1991 - ring->ring[(*ptr)++] = PACKETJ(0, 0, 0, PACKETJ_TYPE0); 1992 - } 1993 - ring->ring[(*ptr)++] = val; 1994 - } 1995 - 1996 - static void vcn_v1_0_jpeg_ring_set_patch_ring(struct amdgpu_ring *ring, uint32_t ptr) 1997 - { 1998 - struct amdgpu_device *adev = ring->adev; 1999 - 2000 - uint32_t reg, reg_offset, val, mask, i; 2001 - 2002 - // 1st: program mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW 2003 - reg = SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW); 2004 - reg_offset = (reg << 2); 2005 - val = lower_32_bits(ring->gpu_addr); 2006 - vcn_v1_0_jpeg_ring_patch_wreg(ring, &ptr, reg_offset, val); 2007 - 2008 - // 2nd: program mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH 2009 - reg = SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH); 2010 - reg_offset = (reg << 2); 2011 - val = upper_32_bits(ring->gpu_addr); 2012 - vcn_v1_0_jpeg_ring_patch_wreg(ring, &ptr, reg_offset, val); 2013 - 2014 - // 3rd to 5th: issue MEM_READ commands 2015 - for (i = 0; i <= 2; i++) { 2016 - ring->ring[ptr++] = PACKETJ(0, 0, 0, PACKETJ_TYPE2); 2017 - ring->ring[ptr++] = 0; 2018 - } 2019 - 2020 - // 6th: program mmUVD_JRBC_RB_CNTL register to enable NO_FETCH and RPTR write ability 2021 - reg = SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_RB_CNTL); 2022 - reg_offset = (reg << 2); 2023 - val = 0x13; 2024 - vcn_v1_0_jpeg_ring_patch_wreg(ring, &ptr, reg_offset, val); 2025 - 2026 - // 7th: program mmUVD_JRBC_RB_REF_DATA 2027 - reg = SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_RB_REF_DATA); 2028 - reg_offset = (reg << 2); 2029 - val = 0x1; 2030 - vcn_v1_0_jpeg_ring_patch_wreg(ring, &ptr, reg_offset, val); 2031 - 2032 - // 8th: issue conditional register read mmUVD_JRBC_RB_CNTL 2033 - reg = SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_RB_CNTL); 2034 - reg_offset = (reg << 2); 2035 - val = 0x1; 2036 - mask = 0x1; 2037 - 2038 - ring->ring[ptr++] = PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_RB_COND_RD_TIMER), 0, 0, PACKETJ_TYPE0); 2039 - ring->ring[ptr++] = 0x01400200; 2040 - ring->ring[ptr++] = PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_RB_REF_DATA), 0, 0, PACKETJ_TYPE0); 2041 - ring->ring[ptr++] = val; 2042 - ring->ring[ptr++] = PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_EXTERNAL_REG_BASE), 0, 0, PACKETJ_TYPE0); 2043 - if (((reg_offset >= 0x1f800) && (reg_offset <= 0x21fff)) || 2044 - ((reg_offset >= 0x1e000) && (reg_offset <= 0x1e1ff))) { 2045 - ring->ring[ptr++] = 0; 2046 - ring->ring[ptr++] = PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE3); 2047 - } else { 2048 - ring->ring[ptr++] = reg_offset; 2049 - ring->ring[ptr++] = PACKETJ(0, 0, 0, PACKETJ_TYPE3); 2050 - } 2051 - ring->ring[ptr++] = mask; 2052 - 2053 - //9th to 21st: insert no-op 2054 - for (i = 0; i <= 12; i++) { 2055 - ring->ring[ptr++] = PACKETJ(0, 0, 0, PACKETJ_TYPE6); 2056 - ring->ring[ptr++] = 0; 2057 - } 2058 - 2059 - //22nd: reset mmUVD_JRBC_RB_RPTR 2060 - reg = SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_RB_RPTR); 2061 - reg_offset = (reg << 2); 2062 - val = 0; 2063 - vcn_v1_0_jpeg_ring_patch_wreg(ring, &ptr, reg_offset, val); 2064 - 2065 - //23rd: program mmUVD_JRBC_RB_CNTL to disable no_fetch 2066 - reg = SOC15_REG_OFFSET(UVD, 0, mmUVD_JRBC_RB_CNTL); 2067 - reg_offset = (reg << 2); 2068 - val = 0x12; 2069 - vcn_v1_0_jpeg_ring_patch_wreg(ring, &ptr, reg_offset, val); 2070 - } 2071 - 2072 1719 static int vcn_v1_0_set_interrupt_state(struct amdgpu_device *adev, 2073 1720 struct amdgpu_irq_src *source, 2074 1721 unsigned type, ··· 1709 2122 break; 1710 2123 case 120: 1711 2124 amdgpu_fence_process(&adev->vcn.inst->ring_enc[1]); 1712 - break; 1713 - case 126: 1714 - amdgpu_fence_process(&adev->vcn.inst->ring_jpeg); 1715 2125 break; 1716 2126 default: 1717 2127 DRM_ERROR("Unhandled interrupt: %d %d\n", ··· 1843 2259 .emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper, 1844 2260 }; 1845 2261 1846 - static const struct amdgpu_ring_funcs vcn_v1_0_jpeg_ring_vm_funcs = { 1847 - .type = AMDGPU_RING_TYPE_VCN_JPEG, 1848 - .align_mask = 0xf, 1849 - .nop = PACKET0(0x81ff, 0), 1850 - .support_64bit_ptrs = false, 1851 - .no_user_fence = true, 1852 - .vmhub = AMDGPU_MMHUB_0, 1853 - .extra_dw = 64, 1854 - .get_rptr = vcn_v1_0_jpeg_ring_get_rptr, 1855 - .get_wptr = vcn_v1_0_jpeg_ring_get_wptr, 1856 - .set_wptr = vcn_v1_0_jpeg_ring_set_wptr, 1857 - .emit_frame_size = 1858 - 6 + 6 + /* hdp invalidate / flush */ 1859 - SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 + 1860 - SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 + 1861 - 8 + /* vcn_v1_0_jpeg_ring_emit_vm_flush */ 1862 - 26 + 26 + /* vcn_v1_0_jpeg_ring_emit_fence x2 vm fence */ 1863 - 6, 1864 - .emit_ib_size = 22, /* vcn_v1_0_jpeg_ring_emit_ib */ 1865 - .emit_ib = vcn_v1_0_jpeg_ring_emit_ib, 1866 - .emit_fence = vcn_v1_0_jpeg_ring_emit_fence, 1867 - .emit_vm_flush = vcn_v1_0_jpeg_ring_emit_vm_flush, 1868 - .test_ring = amdgpu_vcn_jpeg_ring_test_ring, 1869 - .test_ib = amdgpu_vcn_jpeg_ring_test_ib, 1870 - .insert_nop = vcn_v1_0_jpeg_ring_nop, 1871 - .insert_start = vcn_v1_0_jpeg_ring_insert_start, 1872 - .insert_end = vcn_v1_0_jpeg_ring_insert_end, 1873 - .pad_ib = amdgpu_ring_generic_pad_ib, 1874 - .begin_use = amdgpu_vcn_ring_begin_use, 1875 - .end_use = amdgpu_vcn_ring_end_use, 1876 - .emit_wreg = vcn_v1_0_jpeg_ring_emit_wreg, 1877 - .emit_reg_wait = vcn_v1_0_jpeg_ring_emit_reg_wait, 1878 - .emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper, 1879 - }; 1880 - 1881 2262 static void vcn_v1_0_set_dec_ring_funcs(struct amdgpu_device *adev) 1882 2263 { 1883 2264 adev->vcn.inst->ring_dec.funcs = &vcn_v1_0_dec_ring_vm_funcs; ··· 1857 2308 adev->vcn.inst->ring_enc[i].funcs = &vcn_v1_0_enc_ring_vm_funcs; 1858 2309 1859 2310 DRM_INFO("VCN encode is enabled in VM mode\n"); 1860 - } 1861 - 1862 - static void vcn_v1_0_set_jpeg_ring_funcs(struct amdgpu_device *adev) 1863 - { 1864 - adev->vcn.inst->ring_jpeg.funcs = &vcn_v1_0_jpeg_ring_vm_funcs; 1865 - DRM_INFO("VCN jpeg decode is enabled in VM mode\n"); 1866 2311 } 1867 2312 1868 2313 static const struct amdgpu_irq_src_funcs vcn_v1_0_irq_funcs = {