Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>

authored by

Hans Verkuil and committed by
Mauro Carvalho Chehab
b3b2dd37 500174a2

+32 -73
+7 -22
drivers/media/common/saa7146/saa7146_core.c
··· 235 235 } 236 236 237 237 int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, 238 - struct scatterlist *list, int sglen ) 238 + struct scatterlist *list, int sglen) 239 239 { 240 + struct sg_dma_page_iter dma_iter; 240 241 __le32 *ptr, fill; 241 242 int nr_pages = 0; 242 - int i,p; 243 + int i; 243 244 244 245 if (WARN_ON(!sglen) || 245 246 WARN_ON(list->offset > PAGE_SIZE)) ··· 251 250 pt->offset = list->offset; 252 251 253 252 ptr = pt->cpu; 254 - for (i = 0; i < sglen; i++, list++) { 255 - /* 256 - pr_debug("i:%d, adr:0x%08x, len:%d, offset:%d\n", 257 - i, sg_dma_address(list), sg_dma_len(list), 258 - list->offset); 259 - */ 260 - for (p = 0; p * 4096 < sg_dma_len(list); p++, ptr++) { 261 - *ptr = cpu_to_le32(sg_dma_address(list) + p * 4096); 262 - nr_pages++; 263 - } 253 + for_each_sg_dma_page(list, &dma_iter, sglen, 0) { 254 + *ptr++ = cpu_to_le32(sg_page_iter_dma_address(&dma_iter)); 255 + nr_pages++; 264 256 } 265 257 266 258 267 259 /* safety; fill the page table up with the last valid page */ 268 260 fill = *(ptr-1); 269 - for(i=nr_pages;i<1024;i++) { 261 + for (i = nr_pages; i < 1024; i++) 270 262 *ptr++ = fill; 271 - } 272 - 273 - /* 274 - ptr = pt->cpu; 275 - pr_debug("offset: %d\n", pt->offset); 276 - for(i=0;i<5;i++) { 277 - pr_debug("ptr1 %d: 0x%08x\n", i, ptr[i]); 278 - } 279 - */ 280 263 return 0; 281 264 } 282 265
+25 -51
drivers/media/common/saa7146/saa7146_video.c
··· 107 107 struct saa7146_pgtable *pt1 = &buf->pt[0]; 108 108 struct saa7146_pgtable *pt2 = &buf->pt[1]; 109 109 struct saa7146_pgtable *pt3 = &buf->pt[2]; 110 + struct sg_dma_page_iter dma_iter; 110 111 __le32 *ptr1, *ptr2, *ptr3; 111 112 __le32 fill; 112 113 113 114 int size = pix->width * pix->height; 114 - int i,p,m1,m2,m3,o1,o2; 115 + int i, m1, m2, m3, o1, o2; 115 116 116 117 switch( sfmt->depth ) { 117 118 case 12: { 118 119 /* create some offsets inside the page table */ 119 - m1 = ((size+PAGE_SIZE)/PAGE_SIZE)-1; 120 - m2 = ((size+(size/4)+PAGE_SIZE)/PAGE_SIZE)-1; 121 - m3 = ((size+(size/2)+PAGE_SIZE)/PAGE_SIZE)-1; 122 - o1 = size%PAGE_SIZE; 123 - o2 = (size+(size/4))%PAGE_SIZE; 120 + m1 = ((size + PAGE_SIZE) / PAGE_SIZE) - 1; 121 + m2 = ((size + (size / 4) + PAGE_SIZE) / PAGE_SIZE) - 1; 122 + m3 = ((size + (size / 2) + PAGE_SIZE) / PAGE_SIZE) - 1; 123 + o1 = size % PAGE_SIZE; 124 + o2 = (size + (size / 4)) % PAGE_SIZE; 124 125 DEB_CAP("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n", 125 126 size, m1, m2, m3, o1, o2); 126 127 break; 127 128 } 128 129 case 16: { 129 130 /* create some offsets inside the page table */ 130 - m1 = ((size+PAGE_SIZE)/PAGE_SIZE)-1; 131 - m2 = ((size+(size/2)+PAGE_SIZE)/PAGE_SIZE)-1; 132 - m3 = ((2*size+PAGE_SIZE)/PAGE_SIZE)-1; 133 - o1 = size%PAGE_SIZE; 134 - o2 = (size+(size/2))%PAGE_SIZE; 131 + m1 = ((size + PAGE_SIZE) / PAGE_SIZE) - 1; 132 + m2 = ((size + (size / 2) + PAGE_SIZE) / PAGE_SIZE) - 1; 133 + m3 = ((2 * size + PAGE_SIZE) / PAGE_SIZE) - 1; 134 + o1 = size % PAGE_SIZE; 135 + o2 = (size + (size / 2)) % PAGE_SIZE; 135 136 DEB_CAP("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n", 136 137 size, m1, m2, m3, o1, o2); 137 138 break; ··· 146 145 ptr2 = pt2->cpu; 147 146 ptr3 = pt3->cpu; 148 147 149 - /* walk all pages, copy all page addresses to ptr1 */ 150 - for (i = 0; i < length; i++, list++) { 151 - for (p = 0; p * 4096 < sg_dma_len(list); p++, ptr1++) 152 - *ptr1 = cpu_to_le32(sg_dma_address(list) - list->offset); 153 - } 154 - /* 155 - ptr1 = pt1->cpu; 156 - for(j=0;j<40;j++) { 157 - printk("ptr1 %d: 0x%08x\n",j,ptr1[j]); 158 - } 159 - */ 148 + for_each_sg_dma_page(list, &dma_iter, length, 0) 149 + *ptr1++ = cpu_to_le32(sg_page_iter_dma_address(&dma_iter) - list->offset); 160 150 161 151 /* if we have a user buffer, the first page may not be 162 152 aligned to a page boundary. */ 163 153 pt1->offset = dma->sglist->offset; 164 - pt2->offset = pt1->offset+o1; 165 - pt3->offset = pt1->offset+o2; 154 + pt2->offset = pt1->offset + o1; 155 + pt3->offset = pt1->offset + o2; 166 156 167 157 /* create video-dma2 page table */ 168 158 ptr1 = pt1->cpu; 169 - for(i = m1; i <= m2 ; i++, ptr2++) { 159 + for (i = m1; i <= m2; i++, ptr2++) 170 160 *ptr2 = ptr1[i]; 171 - } 172 - fill = *(ptr2-1); 173 - for(;i<1024;i++,ptr2++) { 161 + fill = *(ptr2 - 1); 162 + for (; i < 1024; i++, ptr2++) 174 163 *ptr2 = fill; 175 - } 176 164 /* create video-dma3 page table */ 177 165 ptr1 = pt1->cpu; 178 - for(i = m2; i <= m3; i++,ptr3++) { 166 + for (i = m2; i <= m3; i++, ptr3++) 179 167 *ptr3 = ptr1[i]; 180 - } 181 - fill = *(ptr3-1); 182 - for(;i<1024;i++,ptr3++) { 168 + fill = *(ptr3 - 1); 169 + for (; i < 1024; i++, ptr3++) 183 170 *ptr3 = fill; 184 - } 185 171 /* finally: finish up video-dma1 page table */ 186 - ptr1 = pt1->cpu+m1; 172 + ptr1 = pt1->cpu + m1; 187 173 fill = pt1->cpu[m1]; 188 - for(i=m1;i<1024;i++,ptr1++) { 174 + for (i = m1; i < 1024; i++, ptr1++) 189 175 *ptr1 = fill; 190 - } 191 - /* 192 - ptr1 = pt1->cpu; 193 - ptr2 = pt2->cpu; 194 - ptr3 = pt3->cpu; 195 - for(j=0;j<40;j++) { 196 - printk("ptr1 %d: 0x%08x\n",j,ptr1[j]); 197 - } 198 - for(j=0;j<40;j++) { 199 - printk("ptr2 %d: 0x%08x\n",j,ptr2[j]); 200 - } 201 - for(j=0;j<40;j++) { 202 - printk("ptr3 %d: 0x%08x\n",j,ptr3[j]); 203 - } 204 - */ 205 176 } else { 206 177 struct saa7146_pgtable *pt = &buf->pt[0]; 178 + 207 179 return saa7146_pgtable_build_single(pci, pt, list, length); 208 180 } 209 181