diff options
Diffstat (limited to 'drivers/media/video/bttv-risc.c')
-rw-r--r-- | drivers/media/video/bttv-risc.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/media/video/bttv-risc.c b/drivers/media/video/bttv-risc.c index b40e9734bf08..344f84e9af04 100644 --- a/drivers/media/video/bttv-risc.c +++ b/drivers/media/video/bttv-risc.c | |||
@@ -51,8 +51,10 @@ bttv_risc_packed(struct bttv *btv, struct btcx_riscmem *risc, | |||
51 | int rc; | 51 | int rc; |
52 | 52 | ||
53 | /* estimate risc mem: worst case is one write per page border + | 53 | /* estimate risc mem: worst case is one write per page border + |
54 | one write per scan line + sync + jump (all 2 dwords) */ | 54 | one write per scan line + sync + jump (all 2 dwords). padding |
55 | instructions = (bpl * lines) / PAGE_SIZE + lines; | 55 | can cause next bpl to start close to a page border. First DMA |
56 | region may be smaller than PAGE_SIZE */ | ||
57 | instructions = 1 + ((bpl + padding) * lines) / PAGE_SIZE + lines; | ||
56 | instructions += 2; | 58 | instructions += 2; |
57 | if ((rc = btcx_riscmem_alloc(btv->c.pci,risc,instructions*8)) < 0) | 59 | if ((rc = btcx_riscmem_alloc(btv->c.pci,risc,instructions*8)) < 0) |
58 | return rc; | 60 | return rc; |
@@ -104,7 +106,7 @@ bttv_risc_packed(struct bttv *btv, struct btcx_riscmem *risc, | |||
104 | 106 | ||
105 | /* save pointer to jmp instruction address */ | 107 | /* save pointer to jmp instruction address */ |
106 | risc->jmp = rp; | 108 | risc->jmp = rp; |
107 | BUG_ON((risc->jmp - risc->cpu + 2) / 4 > risc->size); | 109 | BUG_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size); |
108 | return 0; | 110 | return 0; |
109 | } | 111 | } |
110 | 112 | ||
@@ -222,7 +224,7 @@ bttv_risc_planar(struct bttv *btv, struct btcx_riscmem *risc, | |||
222 | 224 | ||
223 | /* save pointer to jmp instruction address */ | 225 | /* save pointer to jmp instruction address */ |
224 | risc->jmp = rp; | 226 | risc->jmp = rp; |
225 | BUG_ON((risc->jmp - risc->cpu + 2) / 4 > risc->size); | 227 | BUG_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size); |
226 | return 0; | 228 | return 0; |
227 | } | 229 | } |
228 | 230 | ||
@@ -274,6 +276,8 @@ bttv_risc_overlay(struct bttv *btv, struct btcx_riscmem *risc, | |||
274 | if (line > maxy) | 276 | if (line > maxy) |
275 | btcx_calc_skips(line, ov->w.width, &maxy, | 277 | btcx_calc_skips(line, ov->w.width, &maxy, |
276 | skips, &nskips, ov->clips, ov->nclips); | 278 | skips, &nskips, ov->clips, ov->nclips); |
279 | else | ||
280 | nskips = 0; | ||
277 | 281 | ||
278 | /* write out risc code */ | 282 | /* write out risc code */ |
279 | for (start = 0, skip = 0; start < ov->w.width; start = end) { | 283 | for (start = 0, skip = 0; start < ov->w.width; start = end) { |
@@ -307,7 +311,7 @@ bttv_risc_overlay(struct bttv *btv, struct btcx_riscmem *risc, | |||
307 | 311 | ||
308 | /* save pointer to jmp instruction address */ | 312 | /* save pointer to jmp instruction address */ |
309 | risc->jmp = rp; | 313 | risc->jmp = rp; |
310 | BUG_ON((risc->jmp - risc->cpu + 2) / 4 > risc->size); | 314 | BUG_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size); |
311 | kfree(skips); | 315 | kfree(skips); |
312 | return 0; | 316 | return 0; |
313 | } | 317 | } |
@@ -507,8 +511,7 @@ bttv_risc_hook(struct bttv *btv, int slot, struct btcx_riscmem *risc, | |||
507 | void | 511 | void |
508 | bttv_dma_free(struct bttv *btv, struct bttv_buffer *buf) | 512 | bttv_dma_free(struct bttv *btv, struct bttv_buffer *buf) |
509 | { | 513 | { |
510 | if (in_interrupt()) | 514 | BUG_ON(in_interrupt()); |
511 | BUG(); | ||
512 | videobuf_waiton(&buf->vb,0,0); | 515 | videobuf_waiton(&buf->vb,0,0); |
513 | videobuf_dma_pci_unmap(btv->c.pci, &buf->vb.dma); | 516 | videobuf_dma_pci_unmap(btv->c.pci, &buf->vb.dma); |
514 | videobuf_dma_free(&buf->vb.dma); | 517 | videobuf_dma_free(&buf->vb.dma); |