Commit 959314c4 authored by Mohamed Ahmed's avatar Mohamed Ahmed Committed by Danilo Krummrich
Browse files

drm/nouveau: use tile_mode and pte_kind for VM_BIND bo allocations

Allow PTE kind and tile mode on BO create with VM_BIND, and add a
GETPARAM to indicate this change. This is needed to support modifiers in
NVK and ensure correctness when dealing with the nouveau GL driver.

The userspace modifiers implementation this is for can be found here:
https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24795



Fixes: b88baab8 ("drm/nouveau: implement new VM_BIND uAPI")
Signed-off-by: default avatarMohamed Ahmed <mohamedahmedegypt2001@gmail.com>
Reviewed-by: default avatarFaith Ekstrand <faith.ekstrand@collabora.com>
Signed-off-by: default avatarDanilo Krummrich <dakr@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240509204352.7597-1-mohamedahmedegypt2001@gmail.com
parent 3ce4322b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -272,6 +272,9 @@ nouveau_abi16_ioctl_getparam(ABI16_IOCTL_ARGS)
		getparam->value = (u64)ttm_resource_manager_usage(vram_mgr);
		break;
	}
	case NOUVEAU_GETPARAM_HAS_VMA_TILEMODE:
		getparam->value = 1;
		break;
	default:
		NV_PRINTK(dbg, cli, "unknown parameter %lld\n", getparam->param);
		return -EINVAL;
+19 −25
Original line number Diff line number Diff line
@@ -241,8 +241,7 @@ nouveau_bo_alloc(struct nouveau_cli *cli, u64 *size, int *align, u32 domain,
	}

	nvbo->contig = !(tile_flags & NOUVEAU_GEM_TILE_NONCONTIG);
	if (!nouveau_cli_uvmm(cli) || internal) {
		/* for BO noVM allocs, don't assign kinds */

	if (cli->device.info.family >= NV_DEVICE_INFO_V0_FERMI) {
		nvbo->kind = (tile_flags & 0x0000ff00) >> 8;
		if (!nvif_mmu_kind_valid(mmu, nvbo->kind)) {
@@ -263,6 +262,7 @@ nouveau_bo_alloc(struct nouveau_cli *cli, u64 *size, int *align, u32 domain,
	}
	nvbo->mode = tile_mode;

	if (!nouveau_cli_uvmm(cli) || internal) {
		/* Determine the desirable target GPU page size for the buffer. */
		for (i = 0; i < vmm->page_nr; i++) {
			/* Because we cannot currently allow VMM maps to fail
@@ -304,12 +304,6 @@ nouveau_bo_alloc(struct nouveau_cli *cli, u64 *size, int *align, u32 domain,
		}
		nvbo->page = vmm->page[pi].shift;
	} else {
		/* reject other tile flags when in VM mode. */
		if (tile_mode)
			return ERR_PTR(-EINVAL);
		if (tile_flags & ~NOUVEAU_GEM_TILE_NONCONTIG)
			return ERR_PTR(-EINVAL);

		/* Determine the desirable target GPU page size for the buffer. */
		for (i = 0; i < vmm->page_nr; i++) {
			/* Because we cannot currently allow VMM maps to fail
+7 −0
Original line number Diff line number Diff line
@@ -68,6 +68,13 @@ extern "C" {
 */
#define NOUVEAU_GETPARAM_VRAM_USED 19

/*
 * NOUVEAU_GETPARAM_HAS_VMA_TILEMODE
 *
 * Query whether tile mode and PTE kind are accepted with VM allocs or not.
 */
#define NOUVEAU_GETPARAM_HAS_VMA_TILEMODE 20

struct drm_nouveau_getparam {
	__u64 param;
	__u64 value;