mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	Extend pvr_device_addr_and_size_are_valid() by the corresponding GPUVM
sanity checks. This includes a, previously missing, overflow check for
the base address and size of the requested mapping.
Fixes: ff5f643de0 ("drm/imagination: Add GEM and VM related code")
Signed-off-by: Danilo Krummrich <dakr@redhat.com>
Reviewed-by: Donald Robson <donald.robson@imgtec.com>
Tested-by: Frank Binns <frank.binns@imgtec.com>
Signed-off-by: Maxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20231124233650.152653-3-dakr@redhat.com
		
	
			
		
			
				
	
	
		
			66 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0-only OR MIT */
 | 
						|
/* Copyright (c) 2023 Imagination Technologies Ltd. */
 | 
						|
 | 
						|
#ifndef PVR_VM_H
 | 
						|
#define PVR_VM_H
 | 
						|
 | 
						|
#include "pvr_rogue_mmu_defs.h"
 | 
						|
 | 
						|
#include <uapi/drm/pvr_drm.h>
 | 
						|
 | 
						|
#include <linux/types.h>
 | 
						|
 | 
						|
/* Forward declaration from "pvr_device.h" */
 | 
						|
struct pvr_device;
 | 
						|
struct pvr_file;
 | 
						|
 | 
						|
/* Forward declaration from "pvr_gem.h" */
 | 
						|
struct pvr_gem_object;
 | 
						|
 | 
						|
/* Forward declaration from "pvr_vm.c" */
 | 
						|
struct pvr_vm_context;
 | 
						|
 | 
						|
/* Forward declaration from <uapi/drm/pvr_drm.h> */
 | 
						|
struct drm_pvr_ioctl_get_heap_info_args;
 | 
						|
 | 
						|
/* Forward declaration from <drm/drm_exec.h> */
 | 
						|
struct drm_exec;
 | 
						|
 | 
						|
/* Functions defined in pvr_vm.c */
 | 
						|
 | 
						|
bool pvr_device_addr_is_valid(u64 device_addr);
 | 
						|
bool pvr_device_addr_and_size_are_valid(struct pvr_vm_context *vm_ctx,
 | 
						|
					u64 device_addr, u64 size);
 | 
						|
 | 
						|
struct pvr_vm_context *pvr_vm_create_context(struct pvr_device *pvr_dev,
 | 
						|
					     bool is_userspace_context);
 | 
						|
 | 
						|
int pvr_vm_map(struct pvr_vm_context *vm_ctx,
 | 
						|
	       struct pvr_gem_object *pvr_obj, u64 pvr_obj_offset,
 | 
						|
	       u64 device_addr, u64 size);
 | 
						|
int pvr_vm_unmap(struct pvr_vm_context *vm_ctx, u64 device_addr, u64 size);
 | 
						|
 | 
						|
dma_addr_t pvr_vm_get_page_table_root_addr(struct pvr_vm_context *vm_ctx);
 | 
						|
struct dma_resv *pvr_vm_get_dma_resv(struct pvr_vm_context *vm_ctx);
 | 
						|
 | 
						|
int pvr_static_data_areas_get(const struct pvr_device *pvr_dev,
 | 
						|
			      struct drm_pvr_ioctl_dev_query_args *args);
 | 
						|
int pvr_heap_info_get(const struct pvr_device *pvr_dev,
 | 
						|
		      struct drm_pvr_ioctl_dev_query_args *args);
 | 
						|
const struct drm_pvr_heap *pvr_find_heap_containing(struct pvr_device *pvr_dev,
 | 
						|
						    u64 addr, u64 size);
 | 
						|
 | 
						|
struct pvr_gem_object *pvr_vm_find_gem_object(struct pvr_vm_context *vm_ctx,
 | 
						|
					      u64 device_addr,
 | 
						|
					      u64 *mapped_offset_out,
 | 
						|
					      u64 *mapped_size_out);
 | 
						|
 | 
						|
struct pvr_fw_object *
 | 
						|
pvr_vm_get_fw_mem_context(struct pvr_vm_context *vm_ctx);
 | 
						|
 | 
						|
struct pvr_vm_context *pvr_vm_context_lookup(struct pvr_file *pvr_file, u32 handle);
 | 
						|
struct pvr_vm_context *pvr_vm_context_get(struct pvr_vm_context *vm_ctx);
 | 
						|
bool pvr_vm_context_put(struct pvr_vm_context *vm_ctx);
 | 
						|
void pvr_destroy_vm_contexts_for_file(struct pvr_file *pvr_file);
 | 
						|
 | 
						|
#endif /* PVR_VM_H */
 |