drm/nouveau/nvif: replace path-based object identification
authorBen Skeggs <bskeggs@redhat.com>
Thu, 20 Aug 2015 04:54:16 +0000 (14:54 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 28 Aug 2015 02:40:32 +0000 (12:40 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
24 files changed:
drivers/gpu/drm/nouveau/include/nvif/class.h
drivers/gpu/drm/nouveau/include/nvif/ioctl.h
drivers/gpu/drm/nouveau/include/nvif/object.h
drivers/gpu/drm/nouveau/include/nvkm/core/client.h
drivers/gpu/drm/nouveau/include/nvkm/core/handle.h
drivers/gpu/drm/nouveau/include/nvkm/engine/fifo.h
drivers/gpu/drm/nouveau/nouveau_chan.c
drivers/gpu/drm/nouveau/nv50_display.c
drivers/gpu/drm/nouveau/nvif/client.c
drivers/gpu/drm/nouveau/nvif/object.c
drivers/gpu/drm/nouveau/nvkm/core/client.c
drivers/gpu/drm/nouveau/nvkm/core/handle.c
drivers/gpu/drm/nouveau/nvkm/core/ioctl.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.h
drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/g84.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gf100.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv10.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv17.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv40.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.c

index 91e57ba..f7394b9 100644 (file)
@@ -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
index 2eb9b89..9d99768 100644 (file)
@@ -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
index 66d94c7..b46c2f4 100644 (file)
@@ -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) ({                                                    \
index f79f902..d70d28f 100644 (file)
@@ -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)
 {
index 67f384d..64f9e62 100644 (file)
@@ -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);
index 0ec929e..fb8d2b5 100644 (file)
@@ -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 *);
 
index 3027138..9dd2f4f 100644 (file)
@@ -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 {
Simple merge
Simple merge