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

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

drm/nouveau/imem: improve management of instance memory



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 1de68568
Loading
Loading
Loading
Loading
+12 −21
Original line number Diff line number Diff line
#ifndef __NVKM_GPUOBJ_H__
#define __NVKM_GPUOBJ_H__
#include <core/object.h>
#include <core/memory.h>
#include <core/mm.h>
struct nvkm_vma;
struct nvkm_vm;
@@ -11,13 +12,23 @@ struct nvkm_vm;

struct nvkm_gpuobj {
	struct nvkm_object object;
	struct nvkm_object *parent;
	struct nvkm_memory *memory;
	struct nvkm_gpuobj *parent;
	struct nvkm_mm_node *node;
	struct nvkm_mm heap;

	u32 flags;
	u64 addr;
	u32 size;

	const struct nvkm_gpuobj_func *func;
};

struct nvkm_gpuobj_func {
	void (*acquire)(struct nvkm_gpuobj *);
	void (*release)(struct nvkm_gpuobj *);
	u32 (*rd32)(struct nvkm_gpuobj *, u32 offset);
	void (*wr32)(struct nvkm_gpuobj *, u32 offset, u32 data);
};

static inline struct nvkm_gpuobj *
@@ -60,24 +71,4 @@ int _nvkm_gpuobj_init(struct nvkm_object *);
int  _nvkm_gpuobj_fini(struct nvkm_object *, bool);
u32  _nvkm_gpuobj_rd32(struct nvkm_object *, u64);
void _nvkm_gpuobj_wr32(struct nvkm_object *, u64, u32);

/* accessor macros - kmap()/done() must bracket use of the other accessor
 * macros to guarantee correct behaviour across all chipsets
 */
#define nvkm_kmap(o) do {                                                      \
	struct nvkm_gpuobj *_gpuobj = (o);                                     \
	(void)_gpuobj;                                                         \
} while(0)
#define nvkm_ro32(o,a) ({                                                      \
	u32 _data;                                                             \
	nvkm_object_rd32(&(o)->object, (a), &_data);                           \
	_data;                                                                 \
})
#define nvkm_wo32(o,a,d) nvkm_object_wr32(&(o)->object, (a), (d))
#define nvkm_mo32(o,a,m,d) ({                                                  \
	u32 _addr = (a), _data = nvkm_ro32((o), _addr);                        \
	nvkm_wo32((o), _addr, (_data & ~(m)) | (d));                           \
	_data;                                                                 \
})
#define nvkm_done(o) nvkm_kmap(o)
#endif
+53 −0
Original line number Diff line number Diff line
#ifndef __NVKM_MEMORY_H__
#define __NVKM_MEMORY_H__
#include <core/os.h>
struct nvkm_device;
struct nvkm_vma;
struct nvkm_vm;

enum nvkm_memory_target {
	NVKM_MEM_TARGET_INST,
	NVKM_MEM_TARGET_VRAM,
	NVKM_MEM_TARGET_HOST,
};

struct nvkm_memory {
	const struct nvkm_memory_func *func;
};

struct nvkm_memory_func {
	void *(*dtor)(struct nvkm_memory *);
	enum nvkm_memory_target (*target)(struct nvkm_memory *);
	u64 (*addr)(struct nvkm_memory *);
	u64 (*size)(struct nvkm_memory *);
	void (*boot)(struct nvkm_memory *, struct nvkm_vm *);
	void __iomem *(*acquire)(struct nvkm_memory *);
	void (*release)(struct nvkm_memory *);
	u32 (*rd32)(struct nvkm_memory *, u64 offset);
	void (*wr32)(struct nvkm_memory *, u64 offset, u32 data);
	void (*map)(struct nvkm_memory *, struct nvkm_vma *, u64 offset);
};

void nvkm_memory_ctor(const struct nvkm_memory_func *, struct nvkm_memory *);
int nvkm_memory_new(struct nvkm_device *, enum nvkm_memory_target,
		    u64 size, u32 align, bool zero, struct nvkm_memory **);
void nvkm_memory_del(struct nvkm_memory **);
#define nvkm_memory_target(p) (p)->func->target(p)
#define nvkm_memory_addr(p) (p)->func->addr(p)
#define nvkm_memory_size(p) (p)->func->size(p)
#define nvkm_memory_boot(p,v) (p)->func->boot((p),(v))
#define nvkm_memory_map(p,v,o) (p)->func->map((p),(v),(o))

/* accessor macros - kmap()/done() must bracket use of the other accessor
 * macros to guarantee correct behaviour across all chipsets
 */
#define nvkm_kmap(o)     (o)->func->acquire(o)
#define nvkm_ro32(o,a)   (o)->func->rd32((o), (a))
#define nvkm_wo32(o,a,d) (o)->func->wr32((o), (a), (d))
#define nvkm_mo32(o,a,m,d) ({                                                  \
	u32 _addr = (a), _data = nvkm_ro32((o), _addr);                        \
	nvkm_wo32((o), _addr, (_data & ~(m)) | (d));                           \
	_data;                                                                 \
})
#define nvkm_done(o)     (o)->func->release(o)
#endif
+2 −7
Original line number Diff line number Diff line
@@ -7,13 +7,8 @@ struct nvkm_vma;
struct nvkm_bar {
	struct nvkm_subdev subdev;

	int  (*alloc)(struct nvkm_bar *, struct nvkm_object *,
		      struct nvkm_mem *, struct nvkm_object **);

	int  (*kmap)(struct nvkm_bar *, struct nvkm_mem *, u32 flags,
		     struct nvkm_vma *);
	int  (*umap)(struct nvkm_bar *, struct nvkm_mem *, u32 flags,
		     struct nvkm_vma *);
	struct nvkm_vm *(*kmap)(struct nvkm_bar *);
	int  (*umap)(struct nvkm_bar *, u64 size, int type, struct nvkm_vma *);
	void (*unmap)(struct nvkm_bar *, struct nvkm_vma *);
	void (*flush)(struct nvkm_bar *);

+8 −19
Original line number Diff line number Diff line
#ifndef __NVKM_INSTMEM_H__
#define __NVKM_INSTMEM_H__
#include <core/subdev.h>

struct nvkm_instobj {
	struct nvkm_object object;
	struct list_head head;
	u32 *suspend;
	u64 addr;
	u32 size;
};

static inline struct nvkm_instobj *
nv_memobj(void *obj)
{
#if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA
	BUG_ON(!nv_iclass(obj, NV_MEMOBJ_CLASS));
#endif
	return obj;
}
struct nvkm_memory;

struct nvkm_instmem {
	struct nvkm_subdev subdev;
	struct list_head list;

	u32 reserved;
	int (*alloc)(struct nvkm_instmem *, struct nvkm_object *,
		     u32 size, u32 align, struct nvkm_object **);
	int (*alloc)(struct nvkm_instmem *, u32 size, u32 align, bool zero,
		     struct nvkm_memory **);

	const struct nvkm_instmem_func *func;

	struct nvkm_gpuobj *vbios;
	struct nvkm_ramht  *ramht;
	struct nvkm_gpuobj *ramro;
	struct nvkm_gpuobj *ramfc;
};

struct nvkm_instmem_func {
+1 −0
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@ int nvkm_vm_create(struct nvkm_mmu *, u64 offset, u64 length, u64 mm_offset,
int  nvkm_vm_new(struct nvkm_device *, u64 offset, u64 length, u64 mm_offset,
		 struct lock_class_key *, struct nvkm_vm **);
int  nvkm_vm_ref(struct nvkm_vm *, struct nvkm_vm **, struct nvkm_gpuobj *pgd);
int  nvkm_vm_boot(struct nvkm_vm *, u64 size);
int  nvkm_vm_get(struct nvkm_vm *, u64 size, u32 page_shift, u32 access,
		 struct nvkm_vma *);
void nvkm_vm_put(struct nvkm_vma *);
Loading