*参照元 [#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]