|
23 | 23 |
|
24 | 24 | #include "amdgpu.h" |
25 | 25 | #include "amdgpu_jpeg.h" |
| 26 | +#include "amdgpu_cs.h" |
26 | 27 | #include "soc15.h" |
27 | 28 | #include "soc15d.h" |
28 | 29 | #include "jpeg_v4_0_3.h" |
@@ -782,7 +783,11 @@ void jpeg_v4_0_3_dec_ring_emit_ib(struct amdgpu_ring *ring, |
782 | 783 |
|
783 | 784 | amdgpu_ring_write(ring, PACKETJ(regUVD_LMI_JRBC_IB_VMID_INTERNAL_OFFSET, |
784 | 785 | 0, 0, PACKETJ_TYPE0)); |
785 | | - amdgpu_ring_write(ring, (vmid | (vmid << 4) | (vmid << 8))); |
| 786 | + |
| 787 | + if (ring->funcs->parse_cs) |
| 788 | + amdgpu_ring_write(ring, 0); |
| 789 | + else |
| 790 | + amdgpu_ring_write(ring, (vmid | (vmid << 4) | (vmid << 8))); |
786 | 791 |
|
787 | 792 | amdgpu_ring_write(ring, PACKETJ(regUVD_LMI_JPEG_VMID_INTERNAL_OFFSET, |
788 | 793 | 0, 0, PACKETJ_TYPE0)); |
@@ -1084,6 +1089,7 @@ static const struct amdgpu_ring_funcs jpeg_v4_0_3_dec_ring_vm_funcs = { |
1084 | 1089 | .get_rptr = jpeg_v4_0_3_dec_ring_get_rptr, |
1085 | 1090 | .get_wptr = jpeg_v4_0_3_dec_ring_get_wptr, |
1086 | 1091 | .set_wptr = jpeg_v4_0_3_dec_ring_set_wptr, |
| 1092 | + .parse_cs = jpeg_v4_0_3_dec_ring_parse_cs, |
1087 | 1093 | .emit_frame_size = |
1088 | 1094 | SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 + |
1089 | 1095 | SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 + |
@@ -1248,3 +1254,56 @@ static void jpeg_v4_0_3_set_ras_funcs(struct amdgpu_device *adev) |
1248 | 1254 | { |
1249 | 1255 | adev->jpeg.ras = &jpeg_v4_0_3_ras; |
1250 | 1256 | } |
| 1257 | + |
| 1258 | +/** |
| 1259 | + * jpeg_v4_0_3_dec_ring_parse_cs - command submission parser |
| 1260 | + * |
| 1261 | + * @parser: Command submission parser context |
| 1262 | + * @job: the job to parse |
| 1263 | + * @ib: the IB to parse |
| 1264 | + * |
| 1265 | + * Parse the command stream, return -EINVAL for invalid packet, |
| 1266 | + * 0 otherwise |
| 1267 | + */ |
| 1268 | +int jpeg_v4_0_3_dec_ring_parse_cs(struct amdgpu_cs_parser *parser, |
| 1269 | + struct amdgpu_job *job, |
| 1270 | + struct amdgpu_ib *ib) |
| 1271 | +{ |
| 1272 | + uint32_t i, reg, res, cond, type; |
| 1273 | + struct amdgpu_device *adev = parser->adev; |
| 1274 | + |
| 1275 | + for (i = 0; i < ib->length_dw ; i += 2) { |
| 1276 | + reg = CP_PACKETJ_GET_REG(ib->ptr[i]); |
| 1277 | + res = CP_PACKETJ_GET_RES(ib->ptr[i]); |
| 1278 | + cond = CP_PACKETJ_GET_COND(ib->ptr[i]); |
| 1279 | + type = CP_PACKETJ_GET_TYPE(ib->ptr[i]); |
| 1280 | + |
| 1281 | + if (res) /* only support 0 at the moment */ |
| 1282 | + return -EINVAL; |
| 1283 | + |
| 1284 | + switch (type) { |
| 1285 | + case PACKETJ_TYPE0: |
| 1286 | + if (cond != PACKETJ_CONDITION_CHECK0 || reg < JPEG_REG_RANGE_START || reg > JPEG_REG_RANGE_END) { |
| 1287 | + dev_err(adev->dev, "Invalid packet [0x%08x]!\n", ib->ptr[i]); |
| 1288 | + return -EINVAL; |
| 1289 | + } |
| 1290 | + break; |
| 1291 | + case PACKETJ_TYPE3: |
| 1292 | + if (cond != PACKETJ_CONDITION_CHECK3 || reg < JPEG_REG_RANGE_START || reg > JPEG_REG_RANGE_END) { |
| 1293 | + dev_err(adev->dev, "Invalid packet [0x%08x]!\n", ib->ptr[i]); |
| 1294 | + return -EINVAL; |
| 1295 | + } |
| 1296 | + break; |
| 1297 | + case PACKETJ_TYPE6: |
| 1298 | + if (ib->ptr[i] == CP_PACKETJ_NOP) |
| 1299 | + continue; |
| 1300 | + dev_err(adev->dev, "Invalid packet [0x%08x]!\n", ib->ptr[i]); |
| 1301 | + return -EINVAL; |
| 1302 | + default: |
| 1303 | + dev_err(adev->dev, "Unknown packet type %d !\n", type); |
| 1304 | + return -EINVAL; |
| 1305 | + } |
| 1306 | + } |
| 1307 | + |
| 1308 | + return 0; |
| 1309 | +} |
0 commit comments