@@ -181,18 +181,20 @@ static void iommu_flush_iotlb(iopte_t *iopte, unsigned int niopte)
181181 }
182182}
183183
184- static dma_addr_t __sbus_iommu_map_page (struct device * dev , struct page * page ,
185- unsigned long offset , size_t len , bool per_page_flush )
184+ static dma_addr_t __sbus_iommu_map_phys (struct device * dev , phys_addr_t paddr ,
185+ size_t len , bool per_page_flush , unsigned long attrs )
186186{
187187 struct iommu_struct * iommu = dev -> archdata .iommu ;
188- phys_addr_t paddr = page_to_phys (page ) + offset ;
189- unsigned long off = paddr & ~PAGE_MASK ;
188+ unsigned long off = offset_in_page (paddr );
190189 unsigned long npages = (off + len + PAGE_SIZE - 1 ) >> PAGE_SHIFT ;
191190 unsigned long pfn = __phys_to_pfn (paddr );
192191 unsigned int busa , busa0 ;
193192 iopte_t * iopte , * iopte0 ;
194193 int ioptex , i ;
195194
195+ if (unlikely (attrs & DMA_ATTR_MMIO ))
196+ return DMA_MAPPING_ERROR ;
197+
196198 /* XXX So what is maxphys for us and how do drivers know it? */
197199 if (!len || len > 256 * 1024 )
198200 return DMA_MAPPING_ERROR ;
@@ -202,10 +204,10 @@ static dma_addr_t __sbus_iommu_map_page(struct device *dev, struct page *page,
202204 * XXX Is this a good assumption?
203205 * XXX What if someone else unmaps it here and races us?
204206 */
205- if (per_page_flush && !PageHighMem ( page )) {
207+ if (per_page_flush && !PhysHighMem ( paddr )) {
206208 unsigned long vaddr , p ;
207209
208- vaddr = (unsigned long )page_address ( page ) + offset ;
210+ vaddr = (unsigned long )phys_to_virt ( paddr ) ;
209211 for (p = vaddr & PAGE_MASK ; p < vaddr + len ; p += PAGE_SIZE )
210212 flush_page_for_dma (p );
211213 }
@@ -231,19 +233,19 @@ static dma_addr_t __sbus_iommu_map_page(struct device *dev, struct page *page,
231233 return busa0 + off ;
232234}
233235
234- static dma_addr_t sbus_iommu_map_page_gflush (struct device * dev ,
235- struct page * page , unsigned long offset , size_t len ,
236- enum dma_data_direction dir , unsigned long attrs )
236+ static dma_addr_t sbus_iommu_map_phys_gflush (struct device * dev ,
237+ phys_addr_t phys , size_t len , enum dma_data_direction dir ,
238+ unsigned long attrs )
237239{
238240 flush_page_for_dma (0 );
239- return __sbus_iommu_map_page (dev , page , offset , len , false);
241+ return __sbus_iommu_map_phys (dev , phys , len , false, attrs );
240242}
241243
242- static dma_addr_t sbus_iommu_map_page_pflush (struct device * dev ,
243- struct page * page , unsigned long offset , size_t len ,
244- enum dma_data_direction dir , unsigned long attrs )
244+ static dma_addr_t sbus_iommu_map_phys_pflush (struct device * dev ,
245+ phys_addr_t phys , size_t len , enum dma_data_direction dir ,
246+ unsigned long attrs )
245247{
246- return __sbus_iommu_map_page (dev , page , offset , len , true);
248+ return __sbus_iommu_map_phys (dev , phys , len , true, attrs );
247249}
248250
249251static int __sbus_iommu_map_sg (struct device * dev , struct scatterlist * sgl ,
@@ -254,8 +256,8 @@ static int __sbus_iommu_map_sg(struct device *dev, struct scatterlist *sgl,
254256 int j ;
255257
256258 for_each_sg (sgl , sg , nents , j ) {
257- sg -> dma_address = __sbus_iommu_map_page (dev , sg_page (sg ),
258- sg -> offset , sg -> length , per_page_flush );
259+ sg -> dma_address = __sbus_iommu_map_phys (dev , sg_phys (sg ),
260+ sg -> length , per_page_flush , attrs );
259261 if (sg -> dma_address == DMA_MAPPING_ERROR )
260262 return - EIO ;
261263 sg -> dma_length = sg -> length ;
@@ -277,7 +279,7 @@ static int sbus_iommu_map_sg_pflush(struct device *dev, struct scatterlist *sgl,
277279 return __sbus_iommu_map_sg (dev , sgl , nents , dir , attrs , true);
278280}
279281
280- static void sbus_iommu_unmap_page (struct device * dev , dma_addr_t dma_addr ,
282+ static void sbus_iommu_unmap_phys (struct device * dev , dma_addr_t dma_addr ,
281283 size_t len , enum dma_data_direction dir , unsigned long attrs )
282284{
283285 struct iommu_struct * iommu = dev -> archdata .iommu ;
@@ -303,7 +305,7 @@ static void sbus_iommu_unmap_sg(struct device *dev, struct scatterlist *sgl,
303305 int i ;
304306
305307 for_each_sg (sgl , sg , nents , i ) {
306- sbus_iommu_unmap_page (dev , sg -> dma_address , sg -> length , dir ,
308+ sbus_iommu_unmap_phys (dev , sg -> dma_address , sg -> length , dir ,
307309 attrs );
308310 sg -> dma_address = 0x21212121 ;
309311 }
@@ -426,8 +428,8 @@ static const struct dma_map_ops sbus_iommu_dma_gflush_ops = {
426428 .alloc = sbus_iommu_alloc ,
427429 .free = sbus_iommu_free ,
428430#endif
429- .map_page = sbus_iommu_map_page_gflush ,
430- .unmap_page = sbus_iommu_unmap_page ,
431+ .map_phys = sbus_iommu_map_phys_gflush ,
432+ .unmap_phys = sbus_iommu_unmap_phys ,
431433 .map_sg = sbus_iommu_map_sg_gflush ,
432434 .unmap_sg = sbus_iommu_unmap_sg ,
433435};
@@ -437,8 +439,8 @@ static const struct dma_map_ops sbus_iommu_dma_pflush_ops = {
437439 .alloc = sbus_iommu_alloc ,
438440 .free = sbus_iommu_free ,
439441#endif
440- .map_page = sbus_iommu_map_page_pflush ,
441- .unmap_page = sbus_iommu_unmap_page ,
442+ .map_phys = sbus_iommu_map_phys_pflush ,
443+ .unmap_phys = sbus_iommu_unmap_phys ,
442444 .map_sg = sbus_iommu_map_sg_pflush ,
443445 .unmap_sg = sbus_iommu_unmap_sg ,
444446};
0 commit comments