*参照元 [#vda0b1ea]
#backlinks

*説明 [#yfeb084c]
-パス: [[linux-4.4.1/arch/arm/mm/dma-mapping.c]]

-FIXME: これは何?
--説明


**引数 [#t0eed486]
-struct page *page
--
--[[linux-4.4.1/page]]
-unsigned long offset
--
-size_t size
--
-enum dma_data_direction dir
--
--[[linux-4.4.1/dma_data_direction]]
-void (*op)(const void *, size_t, int)
--


**返り値 [#w1989c40]
-なし


**参考 [#m0e3b954]


*実装 [#ced84061]
 static void dma_cache_maint_page(struct page *page, unsigned long offset,
         size_t size, enum dma_data_direction dir,
         void (*op)(const void *, size_t, int))
 {
         unsigned long pfn;
         size_t left = size;
 
         pfn = page_to_pfn(page) + offset / PAGE_SIZE;
         offset %= PAGE_SIZE;
 
-
--[[linux-4.4.1/page_to_pfn()]]
--[[linux-4.4.1/PAGE_SIZE]]

         /*
          * A single sg entry may refer to multiple physically contiguous
          * pages.  But we still need to process highmem pages individually.
          * If highmem is not configured then the bulk of this loop gets
          * optimized out.
          */
         do {
                 size_t len = left;
                 void *vaddr;
 
                 page = pfn_to_page(pfn);
 
-
--[[linux-4.4.1/pfn_to_page()]]

                 if (PageHighMem(page)) {
-
--[[linux-4.4.1/PageHighMem()]]

                         if (len + offset > PAGE_SIZE)
                                 len = PAGE_SIZE - offset;
 
                         if (cache_is_vipt_nonaliasing()) {
                                 vaddr = kmap_atomic(page);
                                 op(vaddr + offset, len, dir);
                                 kunmap_atomic(vaddr);
-
--[[linux-4.4.1/cache_is_vipt_nonaliasing()]]
--[[linux-4.4.1/kmap_atomic()]]
--[[linux-4.4.1/kunmap_atomic()]]

                         } else {
                                 vaddr = kmap_high_get(page);
                                 if (vaddr) {
                                         op(vaddr + offset, len, dir);
                                         kunmap_high(page);
                                 }
-
--[[linux-4.4.1/kmap_high_get()]]
--[[linux-4.4.1/kunmap_high()]]

                         }
                 } else {
                         vaddr = page_address(page) + offset;
                         op(vaddr, len, dir);
-
--[[linux-4.4.1/page_address()]]

                 }
                 offset = 0;
                 pfn++;
                 left -= len;
         } while (left);
 }


*コメント [#qdefd662]


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS