diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_cs.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_cs.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index ccaa243c1442..29afd71e0840 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
| @@ -93,7 +93,7 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) | |||
| 93 | { | 93 | { |
| 94 | struct drm_radeon_cs *cs = data; | 94 | struct drm_radeon_cs *cs = data; |
| 95 | uint64_t *chunk_array_ptr; | 95 | uint64_t *chunk_array_ptr; |
| 96 | unsigned size, i; | 96 | unsigned size, i, flags = 0; |
| 97 | 97 | ||
| 98 | if (!cs->num_chunks) { | 98 | if (!cs->num_chunks) { |
| 99 | return 0; | 99 | return 0; |
| @@ -140,6 +140,10 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) | |||
| 140 | if (p->chunks[i].length_dw == 0) | 140 | if (p->chunks[i].length_dw == 0) |
| 141 | return -EINVAL; | 141 | return -EINVAL; |
| 142 | } | 142 | } |
| 143 | if (p->chunks[i].chunk_id == RADEON_CHUNK_ID_FLAGS && | ||
| 144 | !p->chunks[i].length_dw) { | ||
| 145 | return -EINVAL; | ||
| 146 | } | ||
| 143 | 147 | ||
| 144 | p->chunks[i].length_dw = user_chunk.length_dw; | 148 | p->chunks[i].length_dw = user_chunk.length_dw; |
| 145 | p->chunks[i].user_ptr = (void __user *)(unsigned long)user_chunk.chunk_data; | 149 | p->chunks[i].user_ptr = (void __user *)(unsigned long)user_chunk.chunk_data; |
| @@ -155,6 +159,9 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) | |||
| 155 | p->chunks[i].user_ptr, size)) { | 159 | p->chunks[i].user_ptr, size)) { |
| 156 | return -EFAULT; | 160 | return -EFAULT; |
| 157 | } | 161 | } |
| 162 | if (p->chunks[i].chunk_id == RADEON_CHUNK_ID_FLAGS) { | ||
| 163 | flags = p->chunks[i].kdata[0]; | ||
| 164 | } | ||
| 158 | } else { | 165 | } else { |
| 159 | p->chunks[i].kpage[0] = kmalloc(PAGE_SIZE, GFP_KERNEL); | 166 | p->chunks[i].kpage[0] = kmalloc(PAGE_SIZE, GFP_KERNEL); |
| 160 | p->chunks[i].kpage[1] = kmalloc(PAGE_SIZE, GFP_KERNEL); | 167 | p->chunks[i].kpage[1] = kmalloc(PAGE_SIZE, GFP_KERNEL); |
| @@ -174,6 +181,8 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) | |||
| 174 | p->chunks[p->chunk_ib_idx].length_dw); | 181 | p->chunks[p->chunk_ib_idx].length_dw); |
| 175 | return -EINVAL; | 182 | return -EINVAL; |
| 176 | } | 183 | } |
| 184 | |||
| 185 | p->keep_tiling_flags = (flags & RADEON_CS_KEEP_TILING_FLAGS) != 0; | ||
| 177 | return 0; | 186 | return 0; |
| 178 | } | 187 | } |
| 179 | 188 | ||
