brintos

brintos / linux-shallow public Read only

0
0
Text · 1.9 KiB · bd87002 Raw
92 lines · c
1// SPDX-License-Identifier: MIT2#include <linux/pagemap.h>3#include <linux/slab.h>4#include <drm/ttm/ttm_tt.h>5 6#include "nouveau_drv.h"7#include "nouveau_mem.h"8#include "nouveau_ttm.h"9#include "nouveau_bo.h"10 11struct nouveau_sgdma_be {12	/* this has to be the first field so populate/unpopulated in13	 * nouve_bo.c works properly, otherwise have to move them here14	 */15	struct ttm_tt ttm;16	struct nouveau_mem *mem;17};18 19void20nouveau_sgdma_destroy(struct ttm_device *bdev, struct ttm_tt *ttm)21{22	struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;23 24	if (ttm) {25		ttm_tt_fini(&nvbe->ttm);26		kfree(nvbe);27	}28}29 30int31nouveau_sgdma_bind(struct ttm_device *bdev, struct ttm_tt *ttm, struct ttm_resource *reg)32{33	struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;34	struct nouveau_drm *drm = nouveau_bdev(bdev);35	struct nouveau_mem *mem = nouveau_mem(reg);36	int ret;37 38	if (nvbe->mem)39		return 0;40 41	ret = nouveau_mem_host(reg, &nvbe->ttm);42	if (ret)43		return ret;44 45	if (drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA) {46		ret = nouveau_mem_map(mem, &drm->client.vmm.vmm, &mem->vma[0]);47		if (ret) {48			nouveau_mem_fini(mem);49			return ret;50		}51	}52 53	nvbe->mem = mem;54	return 0;55}56 57void58nouveau_sgdma_unbind(struct ttm_device *bdev, struct ttm_tt *ttm)59{60	struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)ttm;61	if (nvbe->mem) {62		nouveau_mem_fini(nvbe->mem);63		nvbe->mem = NULL;64	}65}66 67struct ttm_tt *68nouveau_sgdma_create_ttm(struct ttm_buffer_object *bo, uint32_t page_flags)69{70	struct nouveau_drm *drm = nouveau_bdev(bo->bdev);71	struct nouveau_bo *nvbo = nouveau_bo(bo);72	struct nouveau_sgdma_be *nvbe;73	enum ttm_caching caching;74 75	if (nvbo->force_coherent)76		caching = ttm_uncached;77	else if (drm->agp.bridge)78		caching = ttm_write_combined;79	else80		caching = ttm_cached;81 82	nvbe = kzalloc(sizeof(*nvbe), GFP_KERNEL);83	if (!nvbe)84		return NULL;85 86	if (ttm_sg_tt_init(&nvbe->ttm, bo, page_flags, caching)) {87		kfree(nvbe);88		return NULL;89	}90	return &nvbe->ttm;91}92