diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2012-12-14 00:23:06 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2012-12-14 10:45:28 -0500 |
commit | 9d89d78e3a20980205966fba6345645547e59ceb (patch) | |
tree | 723101dfc37771a3db6a9df8186278cf15a9390b | |
parent | 8696e33f06b0c52195152cc6a0e3d52233f486c1 (diff) |
drm/radeon: add more pedantic checks in the CP DMA checker
non-mem-to-mem transfers require dw aligned byte count.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen_cs.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c index 9a9d3ae6c188..74c6b42d2597 100644 --- a/drivers/gpu/drm/radeon/evergreen_cs.c +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | |||
@@ -2256,6 +2256,18 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p, | |||
2256 | command = radeon_get_ib_value(p, idx+4); | 2256 | command = radeon_get_ib_value(p, idx+4); |
2257 | size = command & 0x1fffff; | 2257 | size = command & 0x1fffff; |
2258 | info = radeon_get_ib_value(p, idx+1); | 2258 | info = radeon_get_ib_value(p, idx+1); |
2259 | if ((((info & 0x60000000) >> 29) != 0) || /* src = GDS or DATA */ | ||
2260 | (((info & 0x00300000) >> 20) != 0) || /* dst = GDS */ | ||
2261 | ((((info & 0x00300000) >> 20) == 0) && | ||
2262 | (command & PACKET3_CP_DMA_CMD_DAS)) || /* dst = register */ | ||
2263 | ((((info & 0x60000000) >> 29) == 0) && | ||
2264 | (command & PACKET3_CP_DMA_CMD_SAS))) { /* src = register */ | ||
2265 | /* non mem to mem copies requires dw aligned count */ | ||
2266 | if (size % 4) { | ||
2267 | DRM_ERROR("CP DMA command requires dw count alignment\n"); | ||
2268 | return -EINVAL; | ||
2269 | } | ||
2270 | } | ||
2259 | if (command & PACKET3_CP_DMA_CMD_SAS) { | 2271 | if (command & PACKET3_CP_DMA_CMD_SAS) { |
2260 | /* src address space is register */ | 2272 | /* src address space is register */ |
2261 | /* GDS is ok */ | 2273 | /* GDS is ok */ |
@@ -3472,6 +3484,18 @@ static int evergreen_vm_packet3_check(struct radeon_device *rdev, | |||
3472 | case PACKET3_CP_DMA: | 3484 | case PACKET3_CP_DMA: |
3473 | command = ib[idx + 4]; | 3485 | command = ib[idx + 4]; |
3474 | info = ib[idx + 1]; | 3486 | info = ib[idx + 1]; |
3487 | if ((((info & 0x60000000) >> 29) != 0) || /* src = GDS or DATA */ | ||
3488 | (((info & 0x00300000) >> 20) != 0) || /* dst = GDS */ | ||
3489 | ((((info & 0x00300000) >> 20) == 0) && | ||
3490 | (command & PACKET3_CP_DMA_CMD_DAS)) || /* dst = register */ | ||
3491 | ((((info & 0x60000000) >> 29) == 0) && | ||
3492 | (command & PACKET3_CP_DMA_CMD_SAS))) { /* src = register */ | ||
3493 | /* non mem to mem copies requires dw aligned count */ | ||
3494 | if ((command & 0x1fffff) % 4) { | ||
3495 | DRM_ERROR("CP DMA command requires dw count alignment\n"); | ||
3496 | return -EINVAL; | ||
3497 | } | ||
3498 | } | ||
3475 | if (command & PACKET3_CP_DMA_CMD_SAS) { | 3499 | if (command & PACKET3_CP_DMA_CMD_SAS) { |
3476 | /* src address space is register */ | 3500 | /* src address space is register */ |
3477 | if (((info & 0x60000000) >> 29) == 0) { | 3501 | if (((info & 0x60000000) >> 29) == 0) { |