drm-shim: Add io region handling in mmap
This allows to replace mappings of io regions. Signed-off-by: Mary Guillemard <mary.guillemard@collabora.com> Reviewed-by: Brezillon Boris <boris.brezillon@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28241>
This commit is contained in:

committed by
Marge Bot

parent
4d4b1820ca
commit
9c92d92ab9
@@ -413,6 +413,15 @@ drm_shim_bo_get_mmap_offset(struct shim_fd *shim_fd, struct shim_bo *bo)
|
||||
return bo->mem_addr;
|
||||
}
|
||||
|
||||
void
|
||||
drm_shim_init_iomem_region(off64_t offset, size_t size,
|
||||
void *(*mmap_handler)(size_t, int, int, off64_t))
|
||||
{
|
||||
shim_device.iomem_region.mmap = mmap_handler;
|
||||
shim_device.iomem_region.start = offset;
|
||||
shim_device.iomem_region.size = size;
|
||||
}
|
||||
|
||||
/* For mmap() on the DRM fd, look up the BO from the "offset" and map the BO's
|
||||
* fd.
|
||||
*/
|
||||
@@ -420,6 +429,12 @@ void *
|
||||
drm_shim_mmap(struct shim_fd *shim_fd, size_t length, int prot, int flags,
|
||||
int fd, off64_t offset)
|
||||
{
|
||||
if (shim_device.iomem_region.mmap &&
|
||||
offset >= shim_device.iomem_region.start &&
|
||||
offset + length <= shim_device.iomem_region.start + shim_device.iomem_region.size) {
|
||||
return shim_device.iomem_region.mmap(length, prot, flags, offset);
|
||||
}
|
||||
|
||||
mtx_lock(&shim_device.mem_lock);
|
||||
struct shim_bo *bo = _mesa_hash_table_u64_search(shim_device.offset_map, offset);
|
||||
mtx_unlock(&shim_device.mem_lock);
|
||||
|
@@ -44,6 +44,13 @@ struct shim_device {
|
||||
/* Mapping from mmap offset to shim_bo */
|
||||
struct hash_table_u64 *offset_map;
|
||||
|
||||
/* IOMEM region */
|
||||
struct {
|
||||
off64_t start;
|
||||
size_t size;
|
||||
void *(*mmap)(size_t length, int prot, int flags, off64_t offset);
|
||||
} iomem_region;
|
||||
|
||||
mtx_t mem_lock;
|
||||
/* Heap from which shim_bo are allocated */
|
||||
struct util_vma_heap mem_heap;
|
||||
@@ -101,6 +108,8 @@ struct shim_bo *drm_shim_bo_lookup(struct shim_fd *shim_fd, int handle);
|
||||
int drm_shim_bo_get_handle(struct shim_fd *shim_fd, struct shim_bo *bo);
|
||||
uint64_t drm_shim_bo_get_mmap_offset(struct shim_fd *shim_fd,
|
||||
struct shim_bo *bo);
|
||||
void drm_shim_init_iomem_region(off64_t offset, size_t size,
|
||||
void *(*mmap_handler)(size_t, int, int, off64_t));
|
||||
|
||||
/* driver-specific hooks. */
|
||||
void drm_shim_driver_init(void);
|
||||
|
Reference in New Issue
Block a user