Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d36a99d2 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/fb: transition nvkm_ram away from being based on nvkm_object



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent a8dae9fe
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ struct nvkm_mm {
static inline bool
nvkm_mm_initialised(struct nvkm_mm *mm)
{
	return mm->block_size != 0;
	return mm->heap_nodes;
}

int  nvkm_mm_init(struct nvkm_mm *, u32 offset, u32 length, u32 block);
@@ -37,4 +37,5 @@ int nvkm_mm_head(struct nvkm_mm *, u8 heap, u8 type, u32 size_max,
int  nvkm_mm_tail(struct nvkm_mm *, u8 heap, u8 type, u32 size_max,
		  u32 size_min, u32 align, struct nvkm_mm_node **);
void nvkm_mm_free(struct nvkm_mm *, struct nvkm_mm_node **);
void nvkm_mm_dump(struct nvkm_mm *, const char *);
#endif
+36 −27
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@
#define NV_MEM_TARGET_VM          3
#define NV_MEM_TARGET_GART        4

#define NV_MEM_TYPE_VM 0x7f
#define NVKM_RAM_TYPE_VM 0x7f
#define NV_MEM_COMP_VM 0x03

struct nvkm_mem {
@@ -52,9 +52,6 @@ struct nvkm_fb {

	struct nvkm_ram *ram;

	struct nvkm_mm vram;
	struct nvkm_mm tags;

	struct {
		struct nvkm_fb_tile region[16];
		int regions;
@@ -112,36 +109,35 @@ struct nvkm_ram_data {
	u32 freq;
};

enum nvkm_ram_type {
	NVKM_RAM_TYPE_UNKNOWN = 0,
	NVKM_RAM_TYPE_STOLEN,
	NVKM_RAM_TYPE_SGRAM,
	NVKM_RAM_TYPE_SDRAM,
	NVKM_RAM_TYPE_DDR1,
	NVKM_RAM_TYPE_DDR2,
	NVKM_RAM_TYPE_DDR3,
	NVKM_RAM_TYPE_GDDR2,
	NVKM_RAM_TYPE_GDDR3,
	NVKM_RAM_TYPE_GDDR4,
	NVKM_RAM_TYPE_GDDR5
};

struct nvkm_ram {
	struct nvkm_object base;
	enum {
		NV_MEM_TYPE_UNKNOWN = 0,
		NV_MEM_TYPE_STOLEN,
		NV_MEM_TYPE_SGRAM,
		NV_MEM_TYPE_SDRAM,
		NV_MEM_TYPE_DDR1,
		NV_MEM_TYPE_DDR2,
		NV_MEM_TYPE_DDR3,
		NV_MEM_TYPE_GDDR2,
		NV_MEM_TYPE_GDDR3,
		NV_MEM_TYPE_GDDR4,
		NV_MEM_TYPE_GDDR5
	} type;
	u64 stolen;
	const struct nvkm_ram_func *func;
	struct nvkm_fb *fb;
	enum nvkm_ram_type type;
	u64 size;
	u32 tags;

#define NVKM_RAM_MM_SHIFT 12
	struct nvkm_mm vram;
	struct nvkm_mm tags;
	u64 stolen;

	int ranks;
	int parts;
	int part_mask;

	int  (*get)(struct nvkm_fb *, u64 size, u32 align, u32 size_nc,
		    u32 type, struct nvkm_mem **);
	void (*put)(struct nvkm_fb *, struct nvkm_mem **);

	int  (*calc)(struct nvkm_fb *, u32 freq);
	int  (*prog)(struct nvkm_fb *);
	void (*tidy)(struct nvkm_fb *);
	u32 freq;
	u32 mr[16];
	u32 mr1_nuts;
@@ -151,4 +147,17 @@ struct nvkm_ram {
	struct nvkm_ram_data xition;
	struct nvkm_ram_data target;
};

struct nvkm_ram_func {
	void *(*dtor)(struct nvkm_ram *);
	int (*init)(struct nvkm_ram *);

	int (*get)(struct nvkm_ram *, u64 size, u32 align, u32 size_nc,
		   u32 type, struct nvkm_mem **);
	void (*put)(struct nvkm_ram *, struct nvkm_mem **);

	int (*calc)(struct nvkm_ram *, u32 freq);
	int (*prog)(struct nvkm_ram *);
	void (*tidy)(struct nvkm_ram *);
};
#endif
+6 −33
Original line number Diff line number Diff line
@@ -64,9 +64,9 @@ nouveau_vram_manager_del(struct ttm_mem_type_manager *man,
			 struct ttm_mem_reg *mem)
{
	struct nouveau_drm *drm = nouveau_bdev(man->bdev);
	struct nvkm_fb *fb = nvxx_fb(&drm->device);
	struct nvkm_ram *ram = nvxx_fb(&drm->device)->ram;
	nvkm_mem_node_cleanup(mem->mm_node);
	fb->ram->put(fb, (struct nvkm_mem **)&mem->mm_node);
	ram->func->put(ram, (struct nvkm_mem **)&mem->mm_node);
}

static int
@@ -76,7 +76,7 @@ nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
			 struct ttm_mem_reg *mem)
{
	struct nouveau_drm *drm = nouveau_bdev(man->bdev);
	struct nvkm_fb *fb = nvxx_fb(&drm->device);
	struct nvkm_ram *ram = nvxx_fb(&drm->device)->ram;
	struct nouveau_bo *nvbo = nouveau_bo(bo);
	struct nvkm_mem *node;
	u32 size_nc = 0;
@@ -88,7 +88,7 @@ nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
	if (nvbo->tile_flags & NOUVEAU_GEM_TILE_NONCONTIG)
		size_nc = 1 << nvbo->page_shift;

	ret = fb->ram->get(fb, mem->num_pages << PAGE_SHIFT,
	ret = ram->func->get(ram, mem->num_pages << PAGE_SHIFT,
			     mem->page_alignment << PAGE_SHIFT, size_nc,
			     (nvbo->tile_flags >> 8) & 0x3ff, &node);
	if (ret) {
@@ -103,38 +103,11 @@ nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
	return 0;
}

static void
nouveau_vram_manager_debug(struct ttm_mem_type_manager *man, const char *prefix)
{
	struct nvkm_fb *fb = man->priv;
	struct nvkm_mm *mm = &fb->vram;
	struct nvkm_mm_node *r;
	u32 total = 0, free = 0;

	mutex_lock(&nv_subdev(fb)->mutex);
	list_for_each_entry(r, &mm->nodes, nl_entry) {
		printk(KERN_DEBUG "%s %d: 0x%010llx 0x%010llx\n",
		       prefix, r->type, ((u64)r->offset << 12),
		       (((u64)r->offset + r->length) << 12));

		total += r->length;
		if (!r->type)
			free += r->length;
	}
	mutex_unlock(&nv_subdev(fb)->mutex);

	printk(KERN_DEBUG "%s  total: 0x%010llx free: 0x%010llx\n",
	       prefix, (u64)total << 12, (u64)free << 12);
	printk(KERN_DEBUG "%s  block: 0x%08x\n",
	       prefix, mm->block_size << 12);
}

const struct ttm_mem_type_manager_func nouveau_vram_manager = {
	nouveau_vram_manager_init,
	nouveau_vram_manager_fini,
	nouveau_vram_manager_new,
	nouveau_vram_manager_del,
	nouveau_vram_manager_debug
};

static int
+1 −1
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@
#define node(root, dir) ((root)->nl_entry.dir == &mm->nodes) ? NULL :          \
	list_entry((root)->nl_entry.dir, struct nvkm_mm_node, nl_entry)

static void
void
nvkm_mm_dump(struct nvkm_mm *mm, const char *header)
{
	struct nvkm_mm_node *node;
+1 −1
Original line number Diff line number Diff line
@@ -569,7 +569,7 @@ nv50_gr_construct_mmio(struct nvkm_grctx *ctx)
		else if (device->chipset < 0xa0)
			gr_def(ctx, 0x407d08, 0x00390040);
		else {
			if (nvkm_fb(device)->ram->type != NV_MEM_TYPE_GDDR5)
			if (nvkm_fb(device)->ram->type != NVKM_RAM_TYPE_GDDR5)
				gr_def(ctx, 0x407d08, 0x003d0040);
			else
				gr_def(ctx, 0x407d08, 0x003c0040);
Loading