mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-16 15:34:48 +08:00
3bf3710e37
The internal ttm_bo_util memcpy uses ioremap functionality, and while it probably might be possible to use it for copying in- and out of sglist represented io memory, using io_mem_reserve() / io_mem_free() callbacks, that would cause problems with fault(). Instead, implement a method mapping page-by-page using kmap_local() semantics. As an additional benefit we then avoid the occasional global TLB flushes of ioremap() and consuming ioremap space, elimination of a critical point of failure and with a slight change of semantics we could also push the memcpy out async for testing and async driver development purposes. A special linear iomem iterator is introduced internally to mimic the old ioremap behaviour for code-paths that can't immediately be ported over. This adds to the code size and should be considered a temporary solution. Looking at the code we have a lot of checks for iomap tagged pointers. Ideally we should extend the core memremap functions to also accept uncached memory and kmap_local functionality. Then we could strip a lot of code. Cc: Christian König <christian.koenig@amd.com> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com> Reviewed-by: Christian König <christian.koenig@amd.com> Link: https://lore.kernel.org/r/20210602083818.241793-4-thomas.hellstrom@linux.intel.com
62 lines
1.8 KiB
C
62 lines
1.8 KiB
C
/* SPDX-License-Identifier: MIT */
|
|
/*
|
|
* Copyright © 2021 Intel Corporation
|
|
*/
|
|
#ifndef __TTM_KMAP_ITER_H__
|
|
#define __TTM_KMAP_ITER_H__
|
|
|
|
#include <linux/types.h>
|
|
|
|
struct ttm_kmap_iter;
|
|
struct dma_buf_map;
|
|
|
|
/**
|
|
* struct ttm_kmap_iter_ops - Ops structure for a struct
|
|
* ttm_kmap_iter.
|
|
* @maps_tt: Whether the iterator maps TT memory directly, as opposed
|
|
* mapping a TT through an aperture. Both these modes have
|
|
* struct ttm_resource_manager::use_tt set, but the latter typically
|
|
* returns is_iomem == true from ttm_mem_io_reserve.
|
|
*/
|
|
struct ttm_kmap_iter_ops {
|
|
/**
|
|
* kmap_local() - Map a PAGE_SIZE part of the resource using
|
|
* kmap_local semantics.
|
|
* @res_iter: Pointer to the struct ttm_kmap_iter representing
|
|
* the resource.
|
|
* @dmap: The struct dma_buf_map holding the virtual address after
|
|
* the operation.
|
|
* @i: The location within the resource to map. PAGE_SIZE granularity.
|
|
*/
|
|
void (*map_local)(struct ttm_kmap_iter *res_iter,
|
|
struct dma_buf_map *dmap, pgoff_t i);
|
|
/**
|
|
* unmap_local() - Unmap a PAGE_SIZE part of the resource previously
|
|
* mapped using kmap_local.
|
|
* @res_iter: Pointer to the struct ttm_kmap_iter representing
|
|
* the resource.
|
|
* @dmap: The struct dma_buf_map holding the virtual address after
|
|
* the operation.
|
|
*/
|
|
void (*unmap_local)(struct ttm_kmap_iter *res_iter,
|
|
struct dma_buf_map *dmap);
|
|
bool maps_tt;
|
|
};
|
|
|
|
/**
|
|
* struct ttm_kmap_iter - Iterator for kmap_local type operations on a
|
|
* resource.
|
|
* @ops: Pointer to the operations struct.
|
|
*
|
|
* This struct is intended to be embedded in a resource-specific specialization
|
|
* implementing operations for the resource.
|
|
*
|
|
* Nothing stops us from extending the operations to vmap, vmap_pfn etc,
|
|
* replacing some or parts of the ttm_bo_util. cpu-map functionality.
|
|
*/
|
|
struct ttm_kmap_iter {
|
|
const struct ttm_kmap_iter_ops *ops;
|
|
};
|
|
|
|
#endif /* __TTM_KMAP_ITER_H__ */
|