mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-05-02 21:33:58 +00:00
drm/ttm: add io_mem_pfn callback
This allows the driver to handle io_mem mappings on their own. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Michel Dänzer <michel.daenzer@amd.com> Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
018b7fc3a9
commit
ea642c3216
13 changed files with 39 additions and 1 deletions
|
@ -1089,6 +1089,7 @@ static struct ttm_bo_driver amdgpu_bo_driver = {
|
||||||
.fault_reserve_notify = &amdgpu_bo_fault_reserve_notify,
|
.fault_reserve_notify = &amdgpu_bo_fault_reserve_notify,
|
||||||
.io_mem_reserve = &amdgpu_ttm_io_mem_reserve,
|
.io_mem_reserve = &amdgpu_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &amdgpu_ttm_io_mem_free,
|
.io_mem_free = &amdgpu_ttm_io_mem_free,
|
||||||
|
.io_mem_pfn = ttm_bo_default_io_mem_pfn,
|
||||||
};
|
};
|
||||||
|
|
||||||
int amdgpu_ttm_init(struct amdgpu_device *adev)
|
int amdgpu_ttm_init(struct amdgpu_device *adev)
|
||||||
|
|
|
@ -236,6 +236,7 @@ struct ttm_bo_driver ast_bo_driver = {
|
||||||
.verify_access = ast_bo_verify_access,
|
.verify_access = ast_bo_verify_access,
|
||||||
.io_mem_reserve = &ast_ttm_io_mem_reserve,
|
.io_mem_reserve = &ast_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &ast_ttm_io_mem_free,
|
.io_mem_free = &ast_ttm_io_mem_free,
|
||||||
|
.io_mem_pfn = ttm_bo_default_io_mem_pfn,
|
||||||
};
|
};
|
||||||
|
|
||||||
int ast_mm_init(struct ast_private *ast)
|
int ast_mm_init(struct ast_private *ast)
|
||||||
|
|
|
@ -205,6 +205,7 @@ struct ttm_bo_driver bochs_bo_driver = {
|
||||||
.verify_access = bochs_bo_verify_access,
|
.verify_access = bochs_bo_verify_access,
|
||||||
.io_mem_reserve = &bochs_ttm_io_mem_reserve,
|
.io_mem_reserve = &bochs_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &bochs_ttm_io_mem_free,
|
.io_mem_free = &bochs_ttm_io_mem_free,
|
||||||
|
.io_mem_pfn = ttm_bo_default_io_mem_pfn,
|
||||||
};
|
};
|
||||||
|
|
||||||
int bochs_mm_init(struct bochs_device *bochs)
|
int bochs_mm_init(struct bochs_device *bochs)
|
||||||
|
|
|
@ -236,6 +236,7 @@ struct ttm_bo_driver cirrus_bo_driver = {
|
||||||
.verify_access = cirrus_bo_verify_access,
|
.verify_access = cirrus_bo_verify_access,
|
||||||
.io_mem_reserve = &cirrus_ttm_io_mem_reserve,
|
.io_mem_reserve = &cirrus_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &cirrus_ttm_io_mem_free,
|
.io_mem_free = &cirrus_ttm_io_mem_free,
|
||||||
|
.io_mem_pfn = ttm_bo_default_io_mem_pfn,
|
||||||
};
|
};
|
||||||
|
|
||||||
int cirrus_mm_init(struct cirrus_device *cirrus)
|
int cirrus_mm_init(struct cirrus_device *cirrus)
|
||||||
|
|
|
@ -236,6 +236,7 @@ struct ttm_bo_driver mgag200_bo_driver = {
|
||||||
.verify_access = mgag200_bo_verify_access,
|
.verify_access = mgag200_bo_verify_access,
|
||||||
.io_mem_reserve = &mgag200_ttm_io_mem_reserve,
|
.io_mem_reserve = &mgag200_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &mgag200_ttm_io_mem_free,
|
.io_mem_free = &mgag200_ttm_io_mem_free,
|
||||||
|
.io_mem_pfn = ttm_bo_default_io_mem_pfn,
|
||||||
};
|
};
|
||||||
|
|
||||||
int mgag200_mm_init(struct mga_device *mdev)
|
int mgag200_mm_init(struct mga_device *mdev)
|
||||||
|
|
|
@ -1574,6 +1574,7 @@ struct ttm_bo_driver nouveau_bo_driver = {
|
||||||
.fault_reserve_notify = &nouveau_ttm_fault_reserve_notify,
|
.fault_reserve_notify = &nouveau_ttm_fault_reserve_notify,
|
||||||
.io_mem_reserve = &nouveau_ttm_io_mem_reserve,
|
.io_mem_reserve = &nouveau_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &nouveau_ttm_io_mem_free,
|
.io_mem_free = &nouveau_ttm_io_mem_free,
|
||||||
|
.io_mem_pfn = ttm_bo_default_io_mem_pfn,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nvkm_vma *
|
struct nvkm_vma *
|
||||||
|
|
|
@ -393,6 +393,7 @@ static struct ttm_bo_driver qxl_bo_driver = {
|
||||||
.verify_access = &qxl_verify_access,
|
.verify_access = &qxl_verify_access,
|
||||||
.io_mem_reserve = &qxl_ttm_io_mem_reserve,
|
.io_mem_reserve = &qxl_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &qxl_ttm_io_mem_free,
|
.io_mem_free = &qxl_ttm_io_mem_free,
|
||||||
|
.io_mem_pfn = ttm_bo_default_io_mem_pfn,
|
||||||
.move_notify = &qxl_bo_move_notify,
|
.move_notify = &qxl_bo_move_notify,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -873,6 +873,7 @@ static struct ttm_bo_driver radeon_bo_driver = {
|
||||||
.fault_reserve_notify = &radeon_bo_fault_reserve_notify,
|
.fault_reserve_notify = &radeon_bo_fault_reserve_notify,
|
||||||
.io_mem_reserve = &radeon_ttm_io_mem_reserve,
|
.io_mem_reserve = &radeon_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &radeon_ttm_io_mem_free,
|
.io_mem_free = &radeon_ttm_io_mem_free,
|
||||||
|
.io_mem_pfn = ttm_bo_default_io_mem_pfn,
|
||||||
};
|
};
|
||||||
|
|
||||||
int radeon_ttm_init(struct radeon_device *rdev)
|
int radeon_ttm_init(struct radeon_device *rdev)
|
||||||
|
|
|
@ -231,7 +231,7 @@ static int ttm_bo_vm_fault(struct vm_fault *vmf)
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < TTM_BO_VM_NUM_PREFAULT; ++i) {
|
for (i = 0; i < TTM_BO_VM_NUM_PREFAULT; ++i) {
|
||||||
if (bo->mem.bus.is_iomem)
|
if (bo->mem.bus.is_iomem)
|
||||||
pfn = ((bo->mem.bus.base + bo->mem.bus.offset) >> PAGE_SHIFT) + page_offset;
|
pfn = bdev->driver->io_mem_pfn(bo, page_offset);
|
||||||
else {
|
else {
|
||||||
page = ttm->pages[page_offset];
|
page = ttm->pages[page_offset];
|
||||||
if (unlikely(!page && i == 0)) {
|
if (unlikely(!page && i == 0)) {
|
||||||
|
@ -324,6 +324,14 @@ static struct ttm_buffer_object *ttm_bo_vm_lookup(struct ttm_bo_device *bdev,
|
||||||
return bo;
|
return bo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long ttm_bo_default_io_mem_pfn(struct ttm_buffer_object *bo,
|
||||||
|
unsigned long page_offset)
|
||||||
|
{
|
||||||
|
return ((bo->mem.bus.base + bo->mem.bus.offset) >> PAGE_SHIFT)
|
||||||
|
+ page_offset;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(ttm_bo_default_io_mem_pfn);
|
||||||
|
|
||||||
int ttm_bo_mmap(struct file *filp, struct vm_area_struct *vma,
|
int ttm_bo_mmap(struct file *filp, struct vm_area_struct *vma,
|
||||||
struct ttm_bo_device *bdev)
|
struct ttm_bo_device *bdev)
|
||||||
{
|
{
|
||||||
|
|
|
@ -431,6 +431,7 @@ static struct ttm_bo_driver virtio_gpu_bo_driver = {
|
||||||
.verify_access = &virtio_gpu_verify_access,
|
.verify_access = &virtio_gpu_verify_access,
|
||||||
.io_mem_reserve = &virtio_gpu_ttm_io_mem_reserve,
|
.io_mem_reserve = &virtio_gpu_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &virtio_gpu_ttm_io_mem_free,
|
.io_mem_free = &virtio_gpu_ttm_io_mem_free,
|
||||||
|
.io_mem_pfn = ttm_bo_default_io_mem_pfn,
|
||||||
.move_notify = &virtio_gpu_bo_move_notify,
|
.move_notify = &virtio_gpu_bo_move_notify,
|
||||||
.swap_notify = &virtio_gpu_bo_swap_notify,
|
.swap_notify = &virtio_gpu_bo_swap_notify,
|
||||||
};
|
};
|
||||||
|
|
|
@ -859,4 +859,5 @@ struct ttm_bo_driver vmw_bo_driver = {
|
||||||
.fault_reserve_notify = &vmw_ttm_fault_reserve_notify,
|
.fault_reserve_notify = &vmw_ttm_fault_reserve_notify,
|
||||||
.io_mem_reserve = &vmw_ttm_io_mem_reserve,
|
.io_mem_reserve = &vmw_ttm_io_mem_reserve,
|
||||||
.io_mem_free = &vmw_ttm_io_mem_free,
|
.io_mem_free = &vmw_ttm_io_mem_free,
|
||||||
|
.io_mem_pfn = ttm_bo_default_io_mem_pfn,
|
||||||
};
|
};
|
||||||
|
|
|
@ -710,6 +710,17 @@ extern void ttm_bo_kunmap(struct ttm_bo_kmap_obj *map);
|
||||||
extern int ttm_fbdev_mmap(struct vm_area_struct *vma,
|
extern int ttm_fbdev_mmap(struct vm_area_struct *vma,
|
||||||
struct ttm_buffer_object *bo);
|
struct ttm_buffer_object *bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ttm_bo_default_iomem_pfn - get a pfn for a page offset
|
||||||
|
*
|
||||||
|
* @bo: the BO we need to look up the pfn for
|
||||||
|
* @page_offset: offset inside the BO to look up.
|
||||||
|
*
|
||||||
|
* Calculate the PFN for iomem based mappings during page fault
|
||||||
|
*/
|
||||||
|
unsigned long ttm_bo_default_io_mem_pfn(struct ttm_buffer_object *bo,
|
||||||
|
unsigned long page_offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ttm_bo_mmap - mmap out of the ttm device address space.
|
* ttm_bo_mmap - mmap out of the ttm device address space.
|
||||||
*
|
*
|
||||||
|
|
|
@ -462,6 +462,15 @@ struct ttm_bo_driver {
|
||||||
struct ttm_mem_reg *mem);
|
struct ttm_mem_reg *mem);
|
||||||
void (*io_mem_free)(struct ttm_bo_device *bdev,
|
void (*io_mem_free)(struct ttm_bo_device *bdev,
|
||||||
struct ttm_mem_reg *mem);
|
struct ttm_mem_reg *mem);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the pfn for a given page_offset inside the BO.
|
||||||
|
*
|
||||||
|
* @bo: the BO to look up the pfn for
|
||||||
|
* @page_offset: the offset to look up
|
||||||
|
*/
|
||||||
|
unsigned long (*io_mem_pfn)(struct ttm_buffer_object *bo,
|
||||||
|
unsigned long page_offset);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue