diff options
author | Marek Olšák <maraeo@gmail.com> | 2012-03-18 22:09:34 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-03-20 04:44:35 -0400 |
commit | 7e9fa5f69f56454facade70e3c1fece3353b0118 (patch) | |
tree | 19cbe927e7f95858a74afb6d2c6d4b12d7fb1f01 /drivers | |
parent | 788571313870610bd7eb444e0fdc86f7e5541ee2 (diff) |
drm/radeon/kms: optimize streamout checking for evergreen
Signed-off-by: Marek Olšák <maraeo@gmail.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen_cs.c | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c index b39a089a15c3..0427b966ef37 100644 --- a/drivers/gpu/drm/radeon/evergreen_cs.c +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | |||
@@ -797,27 +797,32 @@ static int evergreen_cs_track_validate_texture(struct radeon_cs_parser *p, | |||
797 | static int evergreen_cs_track_check(struct radeon_cs_parser *p) | 797 | static int evergreen_cs_track_check(struct radeon_cs_parser *p) |
798 | { | 798 | { |
799 | struct evergreen_cs_track *track = p->track; | 799 | struct evergreen_cs_track *track = p->track; |
800 | unsigned tmp, i, j; | 800 | unsigned tmp, i; |
801 | int r; | 801 | int r; |
802 | unsigned buffer_mask = 0; | ||
802 | 803 | ||
803 | /* check streamout */ | 804 | /* check streamout */ |
804 | for (i = 0; i < 4; i++) { | 805 | if (track->vgt_strmout_config) { |
805 | if (track->vgt_strmout_config & (1 << i)) { | 806 | for (i = 0; i < 4; i++) { |
806 | for (j = 0; j < 4; j++) { | 807 | if (track->vgt_strmout_config & (1 << i)) { |
807 | if ((track->vgt_strmout_buffer_config >> (i * 4)) & (1 << j)) { | 808 | buffer_mask |= (track->vgt_strmout_buffer_config >> (i * 4)) & 0xf; |
808 | if (track->vgt_strmout_bo[j]) { | 809 | } |
809 | u64 offset = (u64)track->vgt_strmout_bo_offset[j] + | 810 | } |
810 | (u64)track->vgt_strmout_size[j]; | 811 | |
811 | if (offset > radeon_bo_size(track->vgt_strmout_bo[i])) { | 812 | for (i = 0; i < 4; i++) { |
812 | DRM_ERROR("streamout %d bo too small: 0x%llx, 0x%lx\n", | 813 | if (buffer_mask & (1 << i)) { |
813 | j, offset, | 814 | if (track->vgt_strmout_bo[i]) { |
814 | radeon_bo_size(track->vgt_strmout_bo[j])); | 815 | u64 offset = (u64)track->vgt_strmout_bo_offset[i] + |
815 | return -EINVAL; | 816 | (u64)track->vgt_strmout_size[i]; |
816 | } | 817 | if (offset > radeon_bo_size(track->vgt_strmout_bo[i])) { |
817 | } else { | 818 | DRM_ERROR("streamout %d bo too small: 0x%llx, 0x%lx\n", |
818 | dev_warn(p->dev, "No buffer for streamout %d\n", j); | 819 | i, offset, |
820 | radeon_bo_size(track->vgt_strmout_bo[i])); | ||
819 | return -EINVAL; | 821 | return -EINVAL; |
820 | } | 822 | } |
823 | } else { | ||
824 | dev_warn(p->dev, "No buffer for streamout %d\n", i); | ||
825 | return -EINVAL; | ||
821 | } | 826 | } |
822 | } | 827 | } |
823 | } | 828 | } |