Commit 5c1354bd authored by Chunming Zhou's avatar Chunming Zhou Committed by Alex Deucher
Browse files

drm/amdgpu: link all gtt when binding them V2



V2:
spin lock instead of mutex for gtt list

Signed-off-by: default avatarChunming Zhou <David1.Zhou@amd.com>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 78fbb685
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -2121,6 +2121,10 @@ struct amdgpu_device {
	/* link all shadow bo */
	struct list_head                shadow_list;
	struct mutex                    shadow_list_lock;
	/* link all gtt */
	spinlock_t			gtt_list_lock;
	struct list_head                gtt_list;

};

bool amdgpu_device_is_px(struct drm_device *dev);
+4 −0
Original line number Diff line number Diff line
@@ -1577,6 +1577,9 @@ int amdgpu_device_init(struct amdgpu_device *adev,
	INIT_LIST_HEAD(&adev->shadow_list);
	mutex_init(&adev->shadow_list_lock);

	INIT_LIST_HEAD(&adev->gtt_list);
	spin_lock_init(&adev->gtt_list_lock);

	if (adev->asic_type >= CHIP_BONAIRE) {
		adev->rmmio_base = pci_resource_start(adev->pdev, 5);
		adev->rmmio_size = pci_resource_len(adev->pdev, 5);
@@ -1584,6 +1587,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
		adev->rmmio_base = pci_resource_start(adev->pdev, 2);
		adev->rmmio_size = pci_resource_len(adev->pdev, 2);
	}

	adev->rmmio = ioremap(adev->rmmio_base, adev->rmmio_size);
	if (adev->rmmio == NULL) {
		return -ENOMEM;
+9 −0
Original line number Diff line number Diff line
@@ -520,6 +520,7 @@ struct amdgpu_ttm_tt {
	spinlock_t              guptasklock;
	struct list_head        guptasks;
	atomic_t		mmu_invalidations;
	struct list_head        list;
};

int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages)
@@ -666,6 +667,9 @@ static int amdgpu_ttm_backend_bind(struct ttm_tt *ttm,
			  ttm->num_pages, (unsigned)gtt->offset);
		return r;
	}
	spin_lock(&gtt->adev->gtt_list_lock);
	list_add_tail(&gtt->list, &gtt->adev->gtt_list);
	spin_unlock(&gtt->adev->gtt_list_lock);
	return 0;
}

@@ -680,6 +684,10 @@ static int amdgpu_ttm_backend_unbind(struct ttm_tt *ttm)
	if (gtt->userptr)
		amdgpu_ttm_tt_unpin_userptr(ttm);

	spin_lock(&gtt->adev->gtt_list_lock);
	list_del_init(&gtt->list);
	spin_unlock(&gtt->adev->gtt_list_lock);

	return 0;
}

@@ -716,6 +724,7 @@ static struct ttm_tt *amdgpu_ttm_tt_create(struct ttm_bo_device *bdev,
		kfree(gtt);
		return NULL;
	}
	INIT_LIST_HEAD(&gtt->list);
	return &gtt->ttm.ttm;
}