diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/evergreen_cs.c')
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen_cs.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c index 74c6b42d2597..7a445666e71f 100644 --- a/drivers/gpu/drm/radeon/evergreen_cs.c +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | |||
@@ -2654,6 +2654,35 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p, | |||
2654 | ib[idx+4] = upper_32_bits(offset) & 0xff; | 2654 | ib[idx+4] = upper_32_bits(offset) & 0xff; |
2655 | } | 2655 | } |
2656 | break; | 2656 | break; |
2657 | case PACKET3_MEM_WRITE: | ||
2658 | { | ||
2659 | u64 offset; | ||
2660 | |||
2661 | if (pkt->count != 3) { | ||
2662 | DRM_ERROR("bad MEM_WRITE (invalid count)\n"); | ||
2663 | return -EINVAL; | ||
2664 | } | ||
2665 | r = evergreen_cs_packet_next_reloc(p, &reloc); | ||
2666 | if (r) { | ||
2667 | DRM_ERROR("bad MEM_WRITE (missing reloc)\n"); | ||
2668 | return -EINVAL; | ||
2669 | } | ||
2670 | offset = radeon_get_ib_value(p, idx+0); | ||
2671 | offset += ((u64)(radeon_get_ib_value(p, idx+1) & 0xff)) << 32UL; | ||
2672 | if (offset & 0x7) { | ||
2673 | DRM_ERROR("bad MEM_WRITE (address not qwords aligned)\n"); | ||
2674 | return -EINVAL; | ||
2675 | } | ||
2676 | if ((offset + 8) > radeon_bo_size(reloc->robj)) { | ||
2677 | DRM_ERROR("bad MEM_WRITE bo too small: 0x%llx, 0x%lx\n", | ||
2678 | offset + 8, radeon_bo_size(reloc->robj)); | ||
2679 | return -EINVAL; | ||
2680 | } | ||
2681 | offset += reloc->lobj.gpu_offset; | ||
2682 | ib[idx+0] = offset; | ||
2683 | ib[idx+1] = upper_32_bits(offset) & 0xff; | ||
2684 | break; | ||
2685 | } | ||
2657 | case PACKET3_COPY_DW: | 2686 | case PACKET3_COPY_DW: |
2658 | if (pkt->count != 4) { | 2687 | if (pkt->count != 4) { |
2659 | DRM_ERROR("bad COPY_DW (invalid count)\n"); | 2688 | DRM_ERROR("bad COPY_DW (invalid count)\n"); |
@@ -3287,6 +3316,7 @@ static bool evergreen_vm_reg_valid(u32 reg) | |||
3287 | 3316 | ||
3288 | /* check config regs */ | 3317 | /* check config regs */ |
3289 | switch (reg) { | 3318 | switch (reg) { |
3319 | case WAIT_UNTIL: | ||
3290 | case GRBM_GFX_INDEX: | 3320 | case GRBM_GFX_INDEX: |
3291 | case CP_STRMOUT_CNTL: | 3321 | case CP_STRMOUT_CNTL: |
3292 | case CP_COHER_CNTL: | 3322 | case CP_COHER_CNTL: |