diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c | 157 |
1 files changed, 0 insertions, 157 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c deleted file mode 100644 index 828b5167ff12..000000000000 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 2014 Advanced Micro Devices, Inc. - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL - * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE - * USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - */ -/* - * Authors: - * Christian König <christian.koenig@amd.com> - */ - -/** - * DOC: MMU Notifier - * - * For coherent userptr handling registers an MMU notifier to inform the driver - * about updates on the page tables of a process. - * - * When somebody tries to invalidate the page tables we block the update until - * all operations on the pages in question are completed, then those pages are - * marked as accessed and also dirty if it wasn't a read only access. - * - * New command submissions using the userptrs in question are delayed until all - * page table invalidation are completed and we once more see a coherent process - * address space. - */ - -#include <linux/firmware.h> -#include <linux/module.h> -#include <drm/drm.h> - -#include "amdgpu.h" -#include "amdgpu_amdkfd.h" - -/** - * amdgpu_mn_invalidate_gfx - callback to notify about mm change - * - * @mni: the range (mm) is about to update - * @range: details on the invalidation - * @cur_seq: Value to pass to mmu_interval_set_seq() - * - * Block for operations on BOs to finish and mark pages as accessed and - * potentially dirty. - */ -static bool amdgpu_mn_invalidate_gfx(struct mmu_interval_notifier *mni, - const struct mmu_notifier_range *range, - unsigned long cur_seq) -{ - struct amdgpu_bo *bo = container_of(mni, struct amdgpu_bo, notifier); - struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); - long r; - - if (!mmu_notifier_range_blockable(range)) - return false; - - mutex_lock(&adev->notifier_lock); - - mmu_interval_set_seq(mni, cur_seq); - - r = dma_resv_wait_timeout_rcu(bo->tbo.base.resv, true, false, - MAX_SCHEDULE_TIMEOUT); - mutex_unlock(&adev->notifier_lock); - if (r <= 0) - DRM_ERROR("(%ld) failed to wait for user bo\n", r); - return true; -} - -static const struct mmu_interval_notifier_ops amdgpu_mn_gfx_ops = { - .invalidate = amdgpu_mn_invalidate_gfx, -}; - -/** - * amdgpu_mn_invalidate_hsa - callback to notify about mm change - * - * @mni: the range (mm) is about to update - * @range: details on the invalidation - * @cur_seq: Value to pass to mmu_interval_set_seq() - * - * We temporarily evict the BO attached to this range. This necessitates - * evicting all user-mode queues of the process. - */ -static bool amdgpu_mn_invalidate_hsa(struct mmu_interval_notifier *mni, - const struct mmu_notifier_range *range, - unsigned long cur_seq) -{ - struct amdgpu_bo *bo = container_of(mni, struct amdgpu_bo, notifier); - struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); - - if (!mmu_notifier_range_blockable(range)) - return false; - - mutex_lock(&adev->notifier_lock); - - mmu_interval_set_seq(mni, cur_seq); - - amdgpu_amdkfd_evict_userptr(bo->kfd_bo, bo->notifier.mm); - mutex_unlock(&adev->notifier_lock); - - return true; -} - -static const struct mmu_interval_notifier_ops amdgpu_mn_hsa_ops = { - .invalidate = amdgpu_mn_invalidate_hsa, -}; - -/** - * amdgpu_mn_register - register a BO for notifier updates - * - * @bo: amdgpu buffer object - * @addr: userptr addr we should monitor - * - * Registers a mmu_notifier for the given BO at the specified address. - * Returns 0 on success, -ERRNO if anything goes wrong. - */ -int amdgpu_mn_register(struct amdgpu_bo *bo, unsigned long addr) -{ - if (bo->kfd_bo) - return mmu_interval_notifier_insert(&bo->notifier, current->mm, - addr, amdgpu_bo_size(bo), - &amdgpu_mn_hsa_ops); - return mmu_interval_notifier_insert(&bo->notifier, current->mm, addr, - amdgpu_bo_size(bo), - &amdgpu_mn_gfx_ops); -} - -/** - * amdgpu_mn_unregister - unregister a BO for notifier updates - * - * @bo: amdgpu buffer object - * - * Remove any registration of mmu notifier updates from the buffer object. - */ -void amdgpu_mn_unregister(struct amdgpu_bo *bo) -{ - if (!bo->notifier.mm) - return; - mmu_interval_notifier_remove(&bo->notifier); - bo->notifier.mm = NULL; -} |
