Commit bf32a3a1 authored by Danilo Krummrich's avatar Danilo Krummrich
Browse files

drm/nouveau: use GEM references instead of TTMs



TTM wants to get rid of the duplicate refcounting of the embedded GEM
object and its own reference count.

Hence, use of GEM object references where possible.

Also get rid of nouveau_bo_ref() and replace it with nouveau_bo_fini(),
which drops the initial reference we get from initializing a ttm_bo.

Reviewed-by: default avatarBen Skeggs <bskeggs@nvidia.com>
Acked-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarDanilo Krummrich <dakr@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240718165959.3983-4-dakr@kernel.org
parent b26d9ddd
Loading
Loading
Loading
Loading
+31 −12
Original line number Diff line number Diff line
@@ -617,9 +617,15 @@ nv_crtc_swap_fbs(struct drm_crtc *crtc, struct drm_framebuffer *old_fb)

	ret = nouveau_bo_pin(nvbo, NOUVEAU_GEM_DOMAIN_VRAM, false);
	if (ret == 0) {
		if (disp->image[nv_crtc->index])
			nouveau_bo_unpin(disp->image[nv_crtc->index]);
		nouveau_bo_ref(nvbo, &disp->image[nv_crtc->index]);
		if (disp->image[nv_crtc->index]) {
			struct nouveau_bo *bo = disp->image[nv_crtc->index];

			nouveau_bo_unpin(bo);
			drm_gem_object_put(&bo->bo.base);
		}

		drm_gem_object_get(&nvbo->bo.base);
		disp->image[nv_crtc->index] = nvbo;
	}

	return ret;
@@ -754,13 +760,17 @@ static void nv_crtc_destroy(struct drm_crtc *crtc)

	drm_crtc_cleanup(crtc);

	if (disp->image[nv_crtc->index])
		nouveau_bo_unpin(disp->image[nv_crtc->index]);
	nouveau_bo_ref(NULL, &disp->image[nv_crtc->index]);
	if (disp->image[nv_crtc->index]) {
		struct nouveau_bo *bo = disp->image[nv_crtc->index];

		nouveau_bo_unpin(bo);
		drm_gem_object_put(&bo->bo.base);
		disp->image[nv_crtc->index] = NULL;
	}

	nouveau_bo_unmap(nv_crtc->cursor.nvbo);
	nouveau_bo_unpin(nv_crtc->cursor.nvbo);
	nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo);
	nouveau_bo_fini(nv_crtc->cursor.nvbo);
	nvif_event_dtor(&nv_crtc->vblank);
	nvif_head_dtor(&nv_crtc->head);
	kfree(nv_crtc);
@@ -794,9 +804,14 @@ nv_crtc_disable(struct drm_crtc *crtc)
{
	struct nv04_display *disp = nv04_display(crtc->dev);
	struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
	if (disp->image[nv_crtc->index])
		nouveau_bo_unpin(disp->image[nv_crtc->index]);
	nouveau_bo_ref(NULL, &disp->image[nv_crtc->index]);

	if (disp->image[nv_crtc->index]) {
		struct nouveau_bo *bo = disp->image[nv_crtc->index];

		nouveau_bo_unpin(bo);
		drm_gem_object_put(&bo->bo.base);
		disp->image[nv_crtc->index] = NULL;
	}
}

static int
@@ -1210,7 +1225,11 @@ nv04_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
		PUSH_NVSQ(push, NV05F, 0x0130, 0);
	}

	nouveau_bo_ref(new_bo, &dispnv04->image[head]);
	if (dispnv04->image[head])
		drm_gem_object_put(&dispnv04->image[head]->bo.base);

	drm_gem_object_get(&new_bo->bo.base);
	dispnv04->image[head] = new_bo;

	ret = nv04_page_flip_emit(chan, old_bo, new_bo, s, &fence);
	if (ret)
@@ -1329,7 +1348,7 @@ nv04_crtc_create(struct drm_device *dev, int crtc_num)
				nouveau_bo_unpin(nv_crtc->cursor.nvbo);
		}
		if (ret)
			nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo);
			nouveau_bo_fini(nv_crtc->cursor.nvbo);
	}

	nv04_cursor_init(nv_crtc);
+2 −2
Original line number Diff line number Diff line
@@ -2819,7 +2819,7 @@ nv50_display_destroy(struct drm_device *dev)
	nouveau_bo_unmap(disp->sync);
	if (disp->sync)
		nouveau_bo_unpin(disp->sync);
	nouveau_bo_ref(NULL, &disp->sync);
	nouveau_bo_fini(disp->sync);

	nouveau_display(dev)->priv = NULL;
	kfree(disp);
@@ -2862,7 +2862,7 @@ nv50_display_create(struct drm_device *dev)
				nouveau_bo_unpin(disp->sync);
		}
		if (ret)
			nouveau_bo_ref(NULL, &disp->sync);
			nouveau_bo_fini(disp->sync);
	}

	if (ret)
+3 −18
Original line number Diff line number Diff line
@@ -53,25 +53,10 @@ nouveau_bo(struct ttm_buffer_object *bo)
	return container_of(bo, struct nouveau_bo, bo);
}

static inline int
nouveau_bo_ref(struct nouveau_bo *ref, struct nouveau_bo **pnvbo)
static inline void
nouveau_bo_fini(struct nouveau_bo *bo)
{
	struct nouveau_bo *prev;

	if (!pnvbo)
		return -EINVAL;
	prev = *pnvbo;

	if (ref) {
		ttm_bo_get(&ref->bo);
		*pnvbo = nouveau_bo(&ref->bo);
	} else {
		*pnvbo = NULL;
	}
	if (prev)
		ttm_bo_put(&prev->bo);

	return 0;
	ttm_bo_put(&bo->bo);
}

extern struct ttm_device_funcs nouveau_bo_driver;
+1 −1
Original line number Diff line number Diff line
@@ -110,7 +110,7 @@ nouveau_channel_del(struct nouveau_channel **pchan)
		nouveau_bo_unmap(chan->push.buffer);
		if (chan->push.buffer && chan->push.buffer->bo.pin_count)
			nouveau_bo_unpin(chan->push.buffer);
		nouveau_bo_ref(NULL, &chan->push.buffer);
		nouveau_bo_fini(chan->push.buffer);
		kfree(chan);
	}
	*pchan = NULL;
+2 −2
Original line number Diff line number Diff line
@@ -294,7 +294,7 @@ nouveau_dmem_chunk_alloc(struct nouveau_drm *drm, struct page **ppage)
out_bo_unpin:
	nouveau_bo_unpin(chunk->bo);
out_bo_free:
	nouveau_bo_ref(NULL, &chunk->bo);
	nouveau_bo_fini(chunk->bo);
out_release:
	release_mem_region(chunk->pagemap.range.start, range_len(&chunk->pagemap.range));
out_free:
@@ -426,7 +426,7 @@ nouveau_dmem_fini(struct nouveau_drm *drm)
	list_for_each_entry_safe(chunk, tmp, &drm->dmem->chunks, list) {
		nouveau_dmem_evict_chunk(chunk);
		nouveau_bo_unpin(chunk->bo);
		nouveau_bo_ref(NULL, &chunk->bo);
		nouveau_bo_fini(chunk->bo);
		WARN_ON(chunk->callocated);
		list_del(&chunk->list);
		memunmap_pages(&chunk->pagemap);
Loading