diff options
author | Thierry Reding <treding@nvidia.com> | 2013-10-10 04:24:04 -0400 |
---|---|---|
committer | Thierry Reding <treding@nvidia.com> | 2013-10-31 04:20:08 -0400 |
commit | d77563ff5615f730457ce2bc333053bbaca909b4 (patch) | |
tree | 71b815bd4e796288ba3899b19185cf58c37abb13 /drivers | |
parent | d7fbcf477ac87c6d049fa72f21ee193b2d95f137 (diff) |
gpu: host1x: firewall: Refactor register check
The same code sequence is used in various places to validate a register
access in the command stream. This can be refactored into a separate
function.
Signed-off-by: Thierry Reding <treding@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/host1x/job.c | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/drivers/gpu/host1x/job.c b/drivers/gpu/host1x/job.c index bf5100e9b053..d1b72f4c744d 100644 --- a/drivers/gpu/host1x/job.c +++ b/drivers/gpu/host1x/job.c | |||
@@ -291,25 +291,37 @@ struct host1x_firewall { | |||
291 | u32 count; | 291 | u32 count; |
292 | }; | 292 | }; |
293 | 293 | ||
294 | static int check_register(struct host1x_firewall *fw, unsigned long offset) | ||
295 | { | ||
296 | if (fw->job->is_addr_reg(fw->dev, fw->class, offset)) { | ||
297 | if (!fw->num_relocs) | ||
298 | return -EINVAL; | ||
299 | |||
300 | if (!check_reloc(fw->reloc, fw->cmdbuf, fw->offset)) | ||
301 | return -EINVAL; | ||
302 | |||
303 | fw->num_relocs--; | ||
304 | fw->reloc++; | ||
305 | } | ||
306 | |||
307 | return 0; | ||
308 | } | ||
309 | |||
294 | static int check_mask(struct host1x_firewall *fw) | 310 | static int check_mask(struct host1x_firewall *fw) |
295 | { | 311 | { |
296 | u32 mask = fw->mask; | 312 | u32 mask = fw->mask; |
297 | u32 reg = fw->reg; | 313 | u32 reg = fw->reg; |
314 | int ret; | ||
298 | 315 | ||
299 | while (mask) { | 316 | while (mask) { |
300 | if (fw->words == 0) | 317 | if (fw->words == 0) |
301 | return -EINVAL; | 318 | return -EINVAL; |
302 | 319 | ||
303 | if (mask & 1) { | 320 | if (mask & 1) { |
304 | if (fw->job->is_addr_reg(fw->dev, fw->class, reg)) { | 321 | ret = check_register(fw, reg); |
305 | if (!fw->num_relocs) | 322 | if (ret < 0) |
306 | return -EINVAL; | 323 | return ret; |
307 | if (!check_reloc(fw->reloc, fw->cmdbuf, | 324 | |
308 | fw->offset)) | ||
309 | return -EINVAL; | ||
310 | fw->reloc++; | ||
311 | fw->num_relocs--; | ||
312 | } | ||
313 | fw->words--; | 325 | fw->words--; |
314 | fw->offset++; | 326 | fw->offset++; |
315 | } | 327 | } |
@@ -324,19 +336,16 @@ static int check_incr(struct host1x_firewall *fw) | |||
324 | { | 336 | { |
325 | u32 count = fw->count; | 337 | u32 count = fw->count; |
326 | u32 reg = fw->reg; | 338 | u32 reg = fw->reg; |
339 | int ret; | ||
327 | 340 | ||
328 | while (count) { | 341 | while (count) { |
329 | if (fw->words == 0) | 342 | if (fw->words == 0) |
330 | return -EINVAL; | 343 | return -EINVAL; |
331 | 344 | ||
332 | if (fw->job->is_addr_reg(fw->dev, fw->class, reg)) { | 345 | ret = check_register(fw, reg); |
333 | if (!fw->num_relocs) | 346 | if (ret < 0) |
334 | return -EINVAL; | 347 | return ret; |
335 | if (!check_reloc(fw->reloc, fw->cmdbuf, fw->offset)) | 348 | |
336 | return -EINVAL; | ||
337 | fw->reloc++; | ||
338 | fw->num_relocs--; | ||
339 | } | ||
340 | reg++; | 349 | reg++; |
341 | fw->words--; | 350 | fw->words--; |
342 | fw->offset++; | 351 | fw->offset++; |
@@ -348,21 +357,17 @@ static int check_incr(struct host1x_firewall *fw) | |||
348 | 357 | ||
349 | static int check_nonincr(struct host1x_firewall *fw) | 358 | static int check_nonincr(struct host1x_firewall *fw) |
350 | { | 359 | { |
351 | int is_addr_reg = fw->job->is_addr_reg(fw->dev, fw->class, fw->reg); | ||
352 | u32 count = fw->count; | 360 | u32 count = fw->count; |
361 | int ret; | ||
353 | 362 | ||
354 | while (count) { | 363 | while (count) { |
355 | if (fw->words == 0) | 364 | if (fw->words == 0) |
356 | return -EINVAL; | 365 | return -EINVAL; |
357 | 366 | ||
358 | if (is_addr_reg) { | 367 | ret = check_register(fw, fw->reg); |
359 | if (!fw->num_relocs) | 368 | if (ret < 0) |
360 | return -EINVAL; | 369 | return ret; |
361 | if (!check_reloc(fw->reloc, fw->cmdbuf, fw->offset)) | 370 | |
362 | return -EINVAL; | ||
363 | fw->reloc++; | ||
364 | fw->num_relocs--; | ||
365 | } | ||
366 | fw->words--; | 371 | fw->words--; |
367 | fw->offset++; | 372 | fw->offset++; |
368 | count--; | 373 | count--; |