diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2012-05-30 10:09:30 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-06-01 12:00:21 -0400 |
commit | 9b00147d9f2ba137ce74b66b768a8312be0b6781 (patch) | |
tree | bc37f50072056deb5bfa586db8aeae67cd20afcf /drivers/gpu/drm | |
parent | 0824db38e515644f8d1bfd64adbd7cb2c6ea7c62 (diff) |
drm/radeon: fix regression in UMS CS ioctl
radeon_cs_parser_init is called by both the legacy UMS
CS ioctl and the KMS CS ioctl. Protect KMS specific
pieces of the code by checking that rdev is not NULL.
Reported-by: Michael Burian <michael.burian@sbg.at>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Cc: stable@vger.kernel.org
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_cs.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index 0137689ed461..142f89462aa4 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
@@ -147,6 +147,7 @@ static int radeon_cs_sync_rings(struct radeon_cs_parser *p) | |||
147 | sync_to_ring, p->ring); | 147 | sync_to_ring, p->ring); |
148 | } | 148 | } |
149 | 149 | ||
150 | /* XXX: note that this is called from the legacy UMS CS ioctl as well */ | ||
150 | int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) | 151 | int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) |
151 | { | 152 | { |
152 | struct drm_radeon_cs *cs = data; | 153 | struct drm_radeon_cs *cs = data; |
@@ -245,22 +246,24 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) | |||
245 | } | 246 | } |
246 | } | 247 | } |
247 | 248 | ||
248 | if ((p->cs_flags & RADEON_CS_USE_VM) && | 249 | /* these are KMS only */ |
249 | !p->rdev->vm_manager.enabled) { | 250 | if (p->rdev) { |
250 | DRM_ERROR("VM not active on asic!\n"); | 251 | if ((p->cs_flags & RADEON_CS_USE_VM) && |
251 | return -EINVAL; | 252 | !p->rdev->vm_manager.enabled) { |
252 | } | 253 | DRM_ERROR("VM not active on asic!\n"); |
253 | 254 | return -EINVAL; | |
254 | /* we only support VM on SI+ */ | 255 | } |
255 | if ((p->rdev->family >= CHIP_TAHITI) && | ||
256 | ((p->cs_flags & RADEON_CS_USE_VM) == 0)) { | ||
257 | DRM_ERROR("VM required on SI+!\n"); | ||
258 | return -EINVAL; | ||
259 | } | ||
260 | 256 | ||
261 | if (radeon_cs_get_ring(p, ring, priority)) | 257 | /* we only support VM on SI+ */ |
262 | return -EINVAL; | 258 | if ((p->rdev->family >= CHIP_TAHITI) && |
259 | ((p->cs_flags & RADEON_CS_USE_VM) == 0)) { | ||
260 | DRM_ERROR("VM required on SI+!\n"); | ||
261 | return -EINVAL; | ||
262 | } | ||
263 | 263 | ||
264 | if (radeon_cs_get_ring(p, ring, priority)) | ||
265 | return -EINVAL; | ||
266 | } | ||
264 | 267 | ||
265 | /* deal with non-vm */ | 268 | /* deal with non-vm */ |
266 | if ((p->chunk_ib_idx != -1) && | 269 | if ((p->chunk_ib_idx != -1) && |