Commit b3b2dd37 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

media: common: saa7146: use for_each_sg_dma_page

When building the pgtables, use for_each_sg_dma_page.

Also clean up the code a bit.
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent 500174a2
...@@ -235,11 +235,12 @@ int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt) ...@@ -235,11 +235,12 @@ int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt)
} }
int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt,
struct scatterlist *list, int sglen ) struct scatterlist *list, int sglen)
{ {
struct sg_dma_page_iter dma_iter;
__le32 *ptr, fill; __le32 *ptr, fill;
int nr_pages = 0; int nr_pages = 0;
int i,p; int i;
if (WARN_ON(!sglen) || if (WARN_ON(!sglen) ||
WARN_ON(list->offset > PAGE_SIZE)) WARN_ON(list->offset > PAGE_SIZE))
...@@ -250,32 +251,16 @@ int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt ...@@ -250,32 +251,16 @@ int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt
pt->offset = list->offset; pt->offset = list->offset;
ptr = pt->cpu; ptr = pt->cpu;
for (i = 0; i < sglen; i++, list++) { for_each_sg_dma_page(list, &dma_iter, sglen, 0) {
/* *ptr++ = cpu_to_le32(sg_page_iter_dma_address(&dma_iter));
pr_debug("i:%d, adr:0x%08x, len:%d, offset:%d\n", nr_pages++;
i, sg_dma_address(list), sg_dma_len(list),
list->offset);
*/
for (p = 0; p * 4096 < sg_dma_len(list); p++, ptr++) {
*ptr = cpu_to_le32(sg_dma_address(list) + p * 4096);
nr_pages++;
}
} }
/* safety; fill the page table up with the last valid page */ /* safety; fill the page table up with the last valid page */
fill = *(ptr-1); fill = *(ptr-1);
for(i=nr_pages;i<1024;i++) { for (i = nr_pages; i < 1024; i++)
*ptr++ = fill; *ptr++ = fill;
}
/*
ptr = pt->cpu;
pr_debug("offset: %d\n", pt->offset);
for(i=0;i<5;i++) {
pr_debug("ptr1 %d: 0x%08x\n", i, ptr[i]);
}
*/
return 0; return 0;
} }
......
...@@ -107,31 +107,32 @@ static int saa7146_pgtable_build(struct saa7146_dev *dev, struct saa7146_buf *bu ...@@ -107,31 +107,32 @@ static int saa7146_pgtable_build(struct saa7146_dev *dev, struct saa7146_buf *bu
struct saa7146_pgtable *pt1 = &buf->pt[0]; struct saa7146_pgtable *pt1 = &buf->pt[0];
struct saa7146_pgtable *pt2 = &buf->pt[1]; struct saa7146_pgtable *pt2 = &buf->pt[1];
struct saa7146_pgtable *pt3 = &buf->pt[2]; struct saa7146_pgtable *pt3 = &buf->pt[2];
struct sg_dma_page_iter dma_iter;
__le32 *ptr1, *ptr2, *ptr3; __le32 *ptr1, *ptr2, *ptr3;
__le32 fill; __le32 fill;
int size = pix->width * pix->height; int size = pix->width * pix->height;
int i,p,m1,m2,m3,o1,o2; int i, m1, m2, m3, o1, o2;
switch( sfmt->depth ) { switch( sfmt->depth ) {
case 12: { case 12: {
/* create some offsets inside the page table */ /* create some offsets inside the page table */
m1 = ((size+PAGE_SIZE)/PAGE_SIZE)-1; m1 = ((size + PAGE_SIZE) / PAGE_SIZE) - 1;
m2 = ((size+(size/4)+PAGE_SIZE)/PAGE_SIZE)-1; m2 = ((size + (size / 4) + PAGE_SIZE) / PAGE_SIZE) - 1;
m3 = ((size+(size/2)+PAGE_SIZE)/PAGE_SIZE)-1; m3 = ((size + (size / 2) + PAGE_SIZE) / PAGE_SIZE) - 1;
o1 = size%PAGE_SIZE; o1 = size % PAGE_SIZE;
o2 = (size+(size/4))%PAGE_SIZE; o2 = (size + (size / 4)) % PAGE_SIZE;
DEB_CAP("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n", DEB_CAP("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",
size, m1, m2, m3, o1, o2); size, m1, m2, m3, o1, o2);
break; break;
} }
case 16: { case 16: {
/* create some offsets inside the page table */ /* create some offsets inside the page table */
m1 = ((size+PAGE_SIZE)/PAGE_SIZE)-1; m1 = ((size + PAGE_SIZE) / PAGE_SIZE) - 1;
m2 = ((size+(size/2)+PAGE_SIZE)/PAGE_SIZE)-1; m2 = ((size + (size / 2) + PAGE_SIZE) / PAGE_SIZE) - 1;
m3 = ((2*size+PAGE_SIZE)/PAGE_SIZE)-1; m3 = ((2 * size + PAGE_SIZE) / PAGE_SIZE) - 1;
o1 = size%PAGE_SIZE; o1 = size % PAGE_SIZE;
o2 = (size+(size/2))%PAGE_SIZE; o2 = (size + (size / 2)) % PAGE_SIZE;
DEB_CAP("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n", DEB_CAP("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",
size, m1, m2, m3, o1, o2); size, m1, m2, m3, o1, o2);
break; break;
...@@ -145,64 +146,37 @@ static int saa7146_pgtable_build(struct saa7146_dev *dev, struct saa7146_buf *bu ...@@ -145,64 +146,37 @@ static int saa7146_pgtable_build(struct saa7146_dev *dev, struct saa7146_buf *bu
ptr2 = pt2->cpu; ptr2 = pt2->cpu;
ptr3 = pt3->cpu; ptr3 = pt3->cpu;
/* walk all pages, copy all page addresses to ptr1 */ for_each_sg_dma_page(list, &dma_iter, length, 0)
for (i = 0; i < length; i++, list++) { *ptr1++ = cpu_to_le32(sg_page_iter_dma_address(&dma_iter) - list->offset);
for (p = 0; p * 4096 < sg_dma_len(list); p++, ptr1++)
*ptr1 = cpu_to_le32(sg_dma_address(list) - list->offset);
}
/*
ptr1 = pt1->cpu;
for(j=0;j<40;j++) {
printk("ptr1 %d: 0x%08x\n",j,ptr1[j]);
}
*/
/* if we have a user buffer, the first page may not be /* if we have a user buffer, the first page may not be
aligned to a page boundary. */ aligned to a page boundary. */
pt1->offset = dma->sglist->offset; pt1->offset = dma->sglist->offset;
pt2->offset = pt1->offset+o1; pt2->offset = pt1->offset + o1;
pt3->offset = pt1->offset+o2; pt3->offset = pt1->offset + o2;
/* create video-dma2 page table */ /* create video-dma2 page table */
ptr1 = pt1->cpu; ptr1 = pt1->cpu;
for(i = m1; i <= m2 ; i++, ptr2++) { for (i = m1; i <= m2; i++, ptr2++)
*ptr2 = ptr1[i]; *ptr2 = ptr1[i];
} fill = *(ptr2 - 1);
fill = *(ptr2-1); for (; i < 1024; i++, ptr2++)
for(;i<1024;i++,ptr2++) {
*ptr2 = fill; *ptr2 = fill;
}
/* create video-dma3 page table */ /* create video-dma3 page table */
ptr1 = pt1->cpu; ptr1 = pt1->cpu;
for(i = m2; i <= m3; i++,ptr3++) { for (i = m2; i <= m3; i++, ptr3++)
*ptr3 = ptr1[i]; *ptr3 = ptr1[i];
} fill = *(ptr3 - 1);
fill = *(ptr3-1); for (; i < 1024; i++, ptr3++)
for(;i<1024;i++,ptr3++) {
*ptr3 = fill; *ptr3 = fill;
}
/* finally: finish up video-dma1 page table */ /* finally: finish up video-dma1 page table */
ptr1 = pt1->cpu+m1; ptr1 = pt1->cpu + m1;
fill = pt1->cpu[m1]; fill = pt1->cpu[m1];
for(i=m1;i<1024;i++,ptr1++) { for (i = m1; i < 1024; i++, ptr1++)
*ptr1 = fill; *ptr1 = fill;
}
/*
ptr1 = pt1->cpu;
ptr2 = pt2->cpu;
ptr3 = pt3->cpu;
for(j=0;j<40;j++) {
printk("ptr1 %d: 0x%08x\n",j,ptr1[j]);
}
for(j=0;j<40;j++) {
printk("ptr2 %d: 0x%08x\n",j,ptr2[j]);
}
for(j=0;j<40;j++) {
printk("ptr3 %d: 0x%08x\n",j,ptr3[j]);
}
*/
} else { } else {
struct saa7146_pgtable *pt = &buf->pt[0]; struct saa7146_pgtable *pt = &buf->pt[0];
return saa7146_pgtable_build_single(pci, pt, list, length); return saa7146_pgtable_build_single(pci, pt, list, length);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment