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

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
Loading
Loading
Loading
Loading
+7 −22
Original line number Diff line number Diff line
@@ -237,9 +237,10 @@ 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,
				 struct scatterlist *list, int sglen)
{
	struct sg_dma_page_iter dma_iter;
	__le32 *ptr, fill;
	int nr_pages = 0;
	int i,p;
	int i;

	if (WARN_ON(!sglen) ||
	    WARN_ON(list->offset > PAGE_SIZE))
@@ -250,32 +251,16 @@ int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt
	pt->offset = list->offset;

	ptr = pt->cpu;
	for (i = 0; i < sglen; i++, list++) {
/*
		pr_debug("i:%d, adr:0x%08x, len:%d, offset:%d\n",
			 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);
	for_each_sg_dma_page(list, &dma_iter, sglen, 0) {
		*ptr++ = cpu_to_le32(sg_page_iter_dma_address(&dma_iter));
		nr_pages++;
	}
	}


	/* safety; fill the page table up with the last valid page */
	fill = *(ptr-1);
	for(i=nr_pages;i<1024;i++) {
	for (i = nr_pages; i < 1024; i++)
		*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;
}

+25 −51
Original line number Diff line number Diff line
@@ -107,11 +107,12 @@ static int saa7146_pgtable_build(struct saa7146_dev *dev, struct saa7146_buf *bu
		struct saa7146_pgtable *pt1 = &buf->pt[0];
		struct saa7146_pgtable *pt2 = &buf->pt[1];
		struct saa7146_pgtable *pt3 = &buf->pt[2];
		struct sg_dma_page_iter dma_iter;
		__le32  *ptr1, *ptr2, *ptr3;
		__le32 fill;

		int size = pix->width * pix->height;
		int i,p,m1,m2,m3,o1,o2;
		int i, m1, m2, m3, o1, o2;

		switch( sfmt->depth ) {
			case 12: {
@@ -145,17 +146,8 @@ static int saa7146_pgtable_build(struct saa7146_dev *dev, struct saa7146_buf *bu
		ptr2 = pt2->cpu;
		ptr3 = pt3->cpu;

		/* walk all pages, copy all page addresses to ptr1 */
		for (i = 0; i < length; i++, list++) {
			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]);
		}
*/
		for_each_sg_dma_page(list, &dma_iter, length, 0)
			*ptr1++ = cpu_to_le32(sg_page_iter_dma_address(&dma_iter) - list->offset);

		/* if we have a user buffer, the first page may not be
		   aligned to a page boundary. */
@@ -165,44 +157,26 @@ static int saa7146_pgtable_build(struct saa7146_dev *dev, struct saa7146_buf *bu

		/* create video-dma2 page table */
		ptr1 = pt1->cpu;
		for(i = m1; i <= m2 ; i++, ptr2++) {
		for (i = m1; i <= m2; i++, ptr2++)
			*ptr2 = ptr1[i];
		}
		fill = *(ptr2 - 1);
		for(;i<1024;i++,ptr2++) {
		for (; i < 1024; i++, ptr2++)
			*ptr2 = fill;
		}
		/* create video-dma3 page table */
		ptr1 = pt1->cpu;
		for(i = m2; i <= m3; i++,ptr3++) {
		for (i = m2; i <= m3; i++, ptr3++)
			*ptr3 = ptr1[i];
		}
		fill = *(ptr3 - 1);
		for(;i<1024;i++,ptr3++) {
		for (; i < 1024; i++, ptr3++)
			*ptr3 = fill;
		}
		/* finally: finish up video-dma1 page table */
		ptr1 = pt1->cpu + m1;
		fill = pt1->cpu[m1];
		for(i=m1;i<1024;i++,ptr1++) {
		for (i = m1; i < 1024; i++, ptr1++)
			*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 {
		struct saa7146_pgtable *pt = &buf->pt[0];

		return saa7146_pgtable_build_single(pci, pt, list, length);
	}