From: Ben Skeggs Date: Thu, 20 Aug 2015 04:54:16 +0000 (+1000) Subject: drm/nouveau/nvif: replace path-based object identification X-Git-Tag: omap-for-v4.3/fixes-rc1~89^2~11^2~99 X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bf81df9be28657eea4aca8c6ab4ed3e69f8a051c;p=pandora-kernel.git drm/nouveau/nvif: replace path-based object identification Signed-off-by: Ben Skeggs --- diff --git a/drivers/gpu/drm/nouveau/include/nvif/class.h b/drivers/gpu/drm/nouveau/include/nvif/class.h index 91e57ba85503..f7394b9a1047 100644 --- a/drivers/gpu/drm/nouveau/include/nvif/class.h +++ b/drivers/gpu/drm/nouveau/include/nvif/class.h @@ -354,8 +354,8 @@ struct nvif_control_pstate_user_v0 { struct nv03_channel_dma_v0 { __u8 version; __u8 chid; - __u8 pad02[2]; - __u32 pushbuf; + __u8 pad02[6]; + __u64 pushbuf; __u64 offset; }; @@ -368,10 +368,10 @@ struct nv03_channel_dma_v0 { struct nv50_channel_gpfifo_v0 { __u8 version; __u8 chid; - __u8 pad01[6]; - __u32 pushbuf; + __u8 pad02[2]; __u32 ilength; __u64 ioffset; + __u64 pushbuf; }; struct kepler_channel_gpfifo_a_v0 { @@ -385,10 +385,9 @@ struct kepler_channel_gpfifo_a_v0 { #define KEPLER_CHANNEL_GPFIFO_A_V0_ENGINE_ENC 0x40 __u8 engine; __u16 chid; - __u8 pad04[4]; - __u32 pushbuf; __u32 ilength; __u64 ioffset; + __u64 pushbuf; }; /******************************************************************************* @@ -509,8 +508,8 @@ struct nv50_disp_pior_pwr_v0 { /* core */ struct nv50_disp_core_channel_dma_v0 { __u8 version; - __u8 pad01[3]; - __u32 pushbuf; + __u8 pad01[7]; + __u64 pushbuf; }; #define NV50_DISP_CORE_CHANNEL_DMA_V0_NTFY_UEVENT 0x00 @@ -527,9 +526,9 @@ struct nv50_disp_cursor_v0 { /* base */ struct nv50_disp_base_channel_dma_v0 { __u8 version; - __u8 pad01[2]; __u8 head; - __u32 pushbuf; + __u8 pad02[6]; + __u64 pushbuf; }; #define NV50_DISP_BASE_CHANNEL_DMA_V0_NTFY_UEVENT 0x00 @@ -537,9 +536,9 @@ struct nv50_disp_base_channel_dma_v0 { /* overlay */ struct nv50_disp_overlay_channel_dma_v0 { __u8 version; - __u8 pad01[2]; __u8 head; - __u32 pushbuf; + __u8 pad02[6]; + __u64 pushbuf; }; #define NV50_DISP_OVERLAY_CHANNEL_DMA_V0_NTFY_UEVENT 0x00 diff --git a/drivers/gpu/drm/nouveau/include/nvif/ioctl.h b/drivers/gpu/drm/nouveau/include/nvif/ioctl.h index 2eb9b899ab36..9d99768f1a35 100644 --- a/drivers/gpu/drm/nouveau/include/nvif/ioctl.h +++ b/drivers/gpu/drm/nouveau/include/nvif/ioctl.h @@ -3,9 +3,6 @@ struct nvif_ioctl_v0 { __u8 version; -#define NVIF_IOCTL_V0_OWNER_NVIF 0x00 -#define NVIF_IOCTL_V0_OWNER_ANY 0xff - __u8 owner; #define NVIF_IOCTL_V0_NOP 0x00 #define NVIF_IOCTL_V0_SCLASS 0x01 #define NVIF_IOCTL_V0_NEW 0x02 @@ -20,13 +17,15 @@ struct nvif_ioctl_v0 { #define NVIF_IOCTL_V0_NTFY_GET 0x0b #define NVIF_IOCTL_V0_NTFY_PUT 0x0c __u8 type; - __u8 path_nr; + __u8 pad02[4]; +#define NVIF_IOCTL_V0_OWNER_NVIF 0x00 +#define NVIF_IOCTL_V0_OWNER_ANY 0xff + __u8 owner; #define NVIF_IOCTL_V0_ROUTE_NVIF 0x00 #define NVIF_IOCTL_V0_ROUTE_HIDDEN 0xff - __u8 pad04[3]; __u8 route; __u64 token; - __u32 path[8]; /* in reverse */ + __u64 object; __u8 data[]; /* ioctl data (below) */ }; @@ -47,6 +46,7 @@ struct nvif_ioctl_new_v0 { __u8 pad01[6]; __u8 route; __u64 token; + __u64 object; __u32 handle; /* these class numbers are made up by us, and not nvidia-assigned */ #define NVIF_IOCTL_NEW_V0_PERFMON 0x0000ffff diff --git a/drivers/gpu/drm/nouveau/include/nvif/object.h b/drivers/gpu/drm/nouveau/include/nvif/object.h index 66d94c74b351..b46c2f4aa0db 100644 --- a/drivers/gpu/drm/nouveau/include/nvif/object.h +++ b/drivers/gpu/drm/nouveau/include/nvif/object.h @@ -5,7 +5,6 @@ struct nvif_object { struct nvif_client *client; - struct nvif_object *parent; u32 handle; u32 oclass; void *priv; /*XXX: hack */ @@ -26,6 +25,7 @@ int nvif_object_mthd(struct nvif_object *, u32, void *, u32); int nvif_object_map(struct nvif_object *); void nvif_object_unmap(struct nvif_object *); +#define nvif_handle(a) (unsigned long)(void *)(a) #define nvif_object(a) (a)->object #define nvif_rd(a,f,b,c) ({ \ diff --git a/drivers/gpu/drm/nouveau/include/nvkm/core/client.h b/drivers/gpu/drm/nouveau/include/nvkm/core/client.h index f79f9025d1c5..d70d28f90285 100644 --- a/drivers/gpu/drm/nouveau/include/nvkm/core/client.h +++ b/drivers/gpu/drm/nouveau/include/nvkm/core/client.h @@ -14,8 +14,14 @@ struct nvkm_client { int (*ntfy)(const void *, u32, const void *, u32); struct nvkm_client_notify *notify[16]; + + struct rb_root objroot; }; +bool nvkm_client_insert(struct nvkm_client *, struct nvkm_handle *); +void nvkm_client_remove(struct nvkm_client *, struct nvkm_handle *); +struct nvkm_handle *nvkm_client_search(struct nvkm_client *, u64 handle); + static inline struct nvkm_client * nv_client(void *obj) { diff --git a/drivers/gpu/drm/nouveau/include/nvkm/core/handle.h b/drivers/gpu/drm/nouveau/include/nvkm/core/handle.h index 67f384d0916c..64f9e62168ff 100644 --- a/drivers/gpu/drm/nouveau/include/nvkm/core/handle.h +++ b/drivers/gpu/drm/nouveau/include/nvkm/core/handle.h @@ -17,6 +17,9 @@ struct nvkm_handle { struct nvkm_handle *parent; struct nvkm_object *object; + + struct rb_node rb; + u64 handle; }; int nvkm_handle_create(struct nvkm_object *, u32 parent, u32 handle, @@ -25,8 +28,6 @@ void nvkm_handle_destroy(struct nvkm_handle *); int nvkm_handle_init(struct nvkm_handle *); int nvkm_handle_fini(struct nvkm_handle *, bool suspend); -struct nvkm_object *nvkm_handle_ref(struct nvkm_object *, u32 name); - struct nvkm_handle *nvkm_handle_get_class(struct nvkm_object *, u16); struct nvkm_handle *nvkm_handle_get_vinst(struct nvkm_object *, u64); struct nvkm_handle *nvkm_handle_get_cinst(struct nvkm_object *, u32); diff --git a/drivers/gpu/drm/nouveau/include/nvkm/engine/fifo.h b/drivers/gpu/drm/nouveau/include/nvkm/engine/fifo.h index 0ec929e00b36..fb8d2b5a0567 100644 --- a/drivers/gpu/drm/nouveau/include/nvkm/engine/fifo.h +++ b/drivers/gpu/drm/nouveau/include/nvkm/engine/fifo.h @@ -4,7 +4,6 @@ struct nvkm_fifo_chan { struct nvkm_namedb namedb; - struct nvkm_dmaobj *pushdma; struct nvkm_gpuobj *pushgpu; void __iomem *user; u64 addr; @@ -30,7 +29,7 @@ nvkm_fifo_chan(void *obj) int nvkm_fifo_channel_create_(struct nvkm_object *, struct nvkm_object *, struct nvkm_oclass *, - int bar, u32 addr, u32 size, u32 push, + int bar, u32 addr, u32 size, u64 push, u64 engmask, int len, void **); void nvkm_fifo_channel_destroy(struct nvkm_fifo_chan *); diff --git a/drivers/gpu/drm/nouveau/nouveau_chan.c b/drivers/gpu/drm/nouveau/nouveau_chan.c index 302713821f08..9dd2f4f8e127 100644 --- a/drivers/gpu/drm/nouveau/nouveau_chan.c +++ b/drivers/gpu/drm/nouveau/nouveau_chan.c @@ -209,13 +209,13 @@ nouveau_channel_ind(struct nouveau_drm *drm, struct nvif_device *device, if (oclass[0] >= KEPLER_CHANNEL_GPFIFO_A) { args.kepler.version = 0; args.kepler.engine = engine; - args.kepler.pushbuf = chan->push.ctxdma.handle; + args.kepler.pushbuf = nvif_handle(&chan->push.ctxdma); args.kepler.ilength = 0x02000; args.kepler.ioffset = 0x10000 + chan->push.vma.offset; size = sizeof(args.kepler); } else { args.nv50.version = 0; - args.nv50.pushbuf = chan->push.ctxdma.handle; + args.nv50.pushbuf = nvif_handle(&chan->push.ctxdma); args.nv50.ilength = 0x02000; args.nv50.ioffset = 0x10000 + chan->push.vma.offset; size = sizeof(args.nv50); @@ -258,7 +258,7 @@ nouveau_channel_dma(struct nouveau_drm *drm, struct nvif_device *device, /* create channel object */ args.version = 0; - args.pushbuf = chan->push.ctxdma.handle; + args.pushbuf = nvif_handle(&chan->push.ctxdma); args.offset = chan->push.vma.offset; do { Reading git-diff-tree failed