@@ -163,18 +163,22 @@ static void xen_grant_dma_free_pages(struct device *dev, size_t size,
163163 xen_grant_dma_free (dev , size , page_to_virt (vaddr ), dma_handle , 0 );
164164}
165165
166- static dma_addr_t xen_grant_dma_map_page (struct device * dev , struct page * page ,
167- unsigned long offset , size_t size ,
166+ static dma_addr_t xen_grant_dma_map_phys (struct device * dev , phys_addr_t phys ,
167+ size_t size ,
168168 enum dma_data_direction dir ,
169169 unsigned long attrs )
170170{
171171 struct xen_grant_dma_data * data ;
172+ unsigned long offset = offset_in_page (phys );
172173 unsigned long dma_offset = xen_offset_in_page (offset ),
173174 pfn_offset = XEN_PFN_DOWN (offset );
174175 unsigned int i , n_pages = XEN_PFN_UP (dma_offset + size );
175176 grant_ref_t grant ;
176177 dma_addr_t dma_handle ;
177178
179+ if (unlikely (attrs & DMA_ATTR_MMIO ))
180+ return DMA_MAPPING_ERROR ;
181+
178182 if (WARN_ON (dir == DMA_NONE ))
179183 return DMA_MAPPING_ERROR ;
180184
@@ -190,7 +194,7 @@ static dma_addr_t xen_grant_dma_map_page(struct device *dev, struct page *page,
190194
191195 for (i = 0 ; i < n_pages ; i ++ ) {
192196 gnttab_grant_foreign_access_ref (grant + i , data -> backend_domid ,
193- pfn_to_gfn (page_to_xen_pfn (page ) + i + pfn_offset ),
197+ pfn_to_gfn (page_to_xen_pfn (phys_to_page ( phys ) ) + i + pfn_offset ),
194198 dir == DMA_TO_DEVICE );
195199 }
196200
@@ -199,7 +203,7 @@ static dma_addr_t xen_grant_dma_map_page(struct device *dev, struct page *page,
199203 return dma_handle ;
200204}
201205
202- static void xen_grant_dma_unmap_page (struct device * dev , dma_addr_t dma_handle ,
206+ static void xen_grant_dma_unmap_phys (struct device * dev , dma_addr_t dma_handle ,
203207 size_t size , enum dma_data_direction dir ,
204208 unsigned long attrs )
205209{
@@ -242,7 +246,7 @@ static void xen_grant_dma_unmap_sg(struct device *dev, struct scatterlist *sg,
242246 return ;
243247
244248 for_each_sg (sg , s , nents , i )
245- xen_grant_dma_unmap_page (dev , s -> dma_address , sg_dma_len (s ), dir ,
249+ xen_grant_dma_unmap_phys (dev , s -> dma_address , sg_dma_len (s ), dir ,
246250 attrs );
247251}
248252
@@ -257,7 +261,7 @@ static int xen_grant_dma_map_sg(struct device *dev, struct scatterlist *sg,
257261 return - EINVAL ;
258262
259263 for_each_sg (sg , s , nents , i ) {
260- s -> dma_address = xen_grant_dma_map_page (dev , sg_page (s ), s -> offset ,
264+ s -> dma_address = xen_grant_dma_map_phys (dev , sg_phys (s ),
261265 s -> length , dir , attrs );
262266 if (s -> dma_address == DMA_MAPPING_ERROR )
263267 goto out ;
@@ -286,8 +290,8 @@ static const struct dma_map_ops xen_grant_dma_ops = {
286290 .free_pages = xen_grant_dma_free_pages ,
287291 .mmap = dma_common_mmap ,
288292 .get_sgtable = dma_common_get_sgtable ,
289- .map_page = xen_grant_dma_map_page ,
290- .unmap_page = xen_grant_dma_unmap_page ,
293+ .map_phys = xen_grant_dma_map_phys ,
294+ .unmap_phys = xen_grant_dma_unmap_phys ,
291295 .map_sg = xen_grant_dma_map_sg ,
292296 .unmap_sg = xen_grant_dma_unmap_sg ,
293297 .dma_supported = xen_grant_dma_supported ,
0 commit comments