aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMarek Olšák <maraeo@gmail.com>2012-03-18 22:09:34 -0400
committerDave Airlie <airlied@redhat.com>2012-03-20 04:44:35 -0400
commit7e9fa5f69f56454facade70e3c1fece3353b0118 (patch)
tree19cbe927e7f95858a74afb6d2c6d4b12d7fb1f01 /drivers
parent788571313870610bd7eb444e0fdc86f7e5541ee2 (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.c37
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,
797static int evergreen_cs_track_check(struct radeon_cs_parser *p) 797static 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 }