Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/external/bsd/drm2/dist/drm/nouveau Kludge to pass bus_sp...



details:   https://anonhg.NetBSD.org/src/rev/8bc24600223c
branches:  trunk
changeset: 835103:8bc24600223c
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Mon Aug 27 07:35:56 2018 +0000

description:
Kludge to pass bus_space_tag through nvif mappings.

- New `ioctl' NVIF_IOCTL_V0_MAP_NETBSD returns bus_space_tag_t too.
  . Blocked from userland.  (Would only disclose a kernel virtual
    address, so not terribly serious.)
- struct nvif_driver::map function takes bus_sapce_tag, returns
  bus_space_handle in addition to kva pointer.
- struct nvif_driver::unmap function takes bus_space_tag and
  bus_space_handle rather than kva pointer.
- Teach various nvkm object types to return bus space tags too.
- Map them all with BUS_SPACE_MAP_LINEAR so the vaddr works.

XXX The fifo channel might need to be mapped with a subregion.
XXX What to do?

diffstat:

 sys/external/bsd/drm2/dist/drm/nouveau/include/nvif/driver.h                                |   9 ++-
 sys/external/bsd/drm2/dist/drm/nouveau/include/nvif/ioctl.h                                 |  16 +++++-
 sys/external/bsd/drm2/dist/drm/nouveau/include/nvif/object.h                                |   6 +-
 sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h                           |  10 ++-
 sys/external/bsd/drm2/dist/drm/nouveau/nouveau_nvif.c                                       |  29 +++++++++-
 sys/external/bsd/drm2/dist/drm/nouveau/nouveau_usif.c                                       |   7 +-
 sys/external/bsd/drm2/dist/drm/nouveau/nvif/nouveau_nvif_object.c                           |  25 +++++++-
 sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_ioctl.c                  |  28 ++++++++-
 sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_object.c                 |   9 +-
 sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_oproxy.c                 |   9 +-
 sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/device/nouveau_nvkm_engine_device_user.c |   8 +-
 sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/disp/nouveau_nvkm_engine_disp_channv50.c |  10 ++-
 sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/fifo/nouveau_nvkm_engine_fifo_chan.c     |   9 ++-
 13 files changed, 142 insertions(+), 33 deletions(-)

diffs (truncated from 483 to 300 lines):

diff -r a19ca822aa50 -r 8bc24600223c sys/external/bsd/drm2/dist/drm/nouveau/include/nvif/driver.h
--- a/sys/external/bsd/drm2/dist/drm/nouveau/include/nvif/driver.h      Mon Aug 27 07:35:41 2018 +0000
+++ b/sys/external/bsd/drm2/dist/drm/nouveau/include/nvif/driver.h      Mon Aug 27 07:35:56 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: driver.h,v 1.3 2018/08/27 07:32:59 riastradh Exp $     */
+/*     $NetBSD: driver.h,v 1.4 2018/08/27 07:35:56 riastradh Exp $     */
 
 #ifndef __NVIF_DRIVER_H__
 #define __NVIF_DRIVER_H__
@@ -16,8 +16,15 @@
        int (*suspend)(void *priv);
        int (*resume)(void *priv);
        int (*ioctl)(void *priv, bool super, void *data, u32 size, void **hack);
+#ifdef __NetBSD__
+       int (*map)(void *priv, bus_space_tag_t tag, u64 handle, u32 size,
+           bus_space_handle_t *handlep, void __iomem **ptrp);
+       void (*unmap)(void *priv, bus_space_tag_t tag,
+           bus_space_handle_t handle, u32 size);
+#else
        void __iomem *(*map)(void *priv, u64 handle, u32 size);
        void (*unmap)(void *priv, void __iomem *ptr, u32 size);
+#endif
        bool keep;
 };
 
diff -r a19ca822aa50 -r 8bc24600223c sys/external/bsd/drm2/dist/drm/nouveau/include/nvif/ioctl.h
--- a/sys/external/bsd/drm2/dist/drm/nouveau/include/nvif/ioctl.h       Mon Aug 27 07:35:41 2018 +0000
+++ b/sys/external/bsd/drm2/dist/drm/nouveau/include/nvif/ioctl.h       Mon Aug 27 07:35:56 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ioctl.h,v 1.2 2018/08/27 04:58:30 riastradh Exp $      */
+/*     $NetBSD: ioctl.h,v 1.3 2018/08/27 07:35:56 riastradh Exp $      */
 
 #ifndef __NVIF_IOCTL_H__
 #define __NVIF_IOCTL_H__
@@ -20,6 +20,7 @@
 #define NVIF_IOCTL_V0_NTFY_DEL                                             0x0a
 #define NVIF_IOCTL_V0_NTFY_GET                                             0x0b
 #define NVIF_IOCTL_V0_NTFY_PUT                                             0x0c
+#define NVIF_IOCTL_V0_MAP_NETBSD                                          0x0d
        __u8  type;
        __u8  pad02[4];
 #define NVIF_IOCTL_V0_OWNER_NVIF                                           0x00
@@ -98,6 +99,19 @@
        __u64 handle;
 };
 
+#ifdef __NetBSD__
+/* XXX Kludge for NetBSD kernel-only use.  */
+#include <sys/bus.h>
+struct nvif_ioctl_map_netbsd_v0 {
+       /* nvif_ioctl ... */
+       __u8  version;
+       __u8  pad01[3];
+       bus_space_tag_t tag;
+       __u32 length;
+       __u64 handle;
+};
+#endif
+
 struct nvif_ioctl_unmap {
 };
 
diff -r a19ca822aa50 -r 8bc24600223c sys/external/bsd/drm2/dist/drm/nouveau/include/nvif/object.h
--- a/sys/external/bsd/drm2/dist/drm/nouveau/include/nvif/object.h      Mon Aug 27 07:35:41 2018 +0000
+++ b/sys/external/bsd/drm2/dist/drm/nouveau/include/nvif/object.h      Mon Aug 27 07:35:56 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: object.h,v 1.3 2018/08/27 07:32:59 riastradh Exp $     */
+/*     $NetBSD: object.h,v 1.4 2018/08/27 07:35:56 riastradh Exp $     */
 
 #ifndef __NVIF_OBJECT_H__
 #define __NVIF_OBJECT_H__
@@ -67,6 +67,10 @@
        s32 oclass;
        void *priv; /*XXX: hack */
        struct {
+#ifdef __NetBSD__
+               bus_space_tag_t tag;
+               bus_space_handle_t handle;
+#endif
                void __iomem *ptr;
                u32 size;
        } map;
diff -r a19ca822aa50 -r 8bc24600223c sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h
--- a/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h Mon Aug 27 07:35:41 2018 +0000
+++ b/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/core/object.h Mon Aug 27 07:35:56 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: object.h,v 1.2 2018/08/27 04:58:30 riastradh Exp $     */
+/*     $NetBSD: object.h,v 1.3 2018/08/27 07:35:56 riastradh Exp $     */
 
 #ifndef __NVKM_OBJECT_H__
 #define __NVKM_OBJECT_H__
@@ -29,7 +29,12 @@
        int (*fini)(struct nvkm_object *, bool suspend);
        int (*mthd)(struct nvkm_object *, u32 mthd, void *data, u32 size);
        int (*ntfy)(struct nvkm_object *, u32 mthd, struct nvkm_event **);
+#ifdef __NetBSD__
+       int (*map)(struct nvkm_object *, bus_space_tag_t *tagp, u64 *addr,
+           u32 *size);
+#else
        int (*map)(struct nvkm_object *, u64 *addr, u32 *size);
+#endif
        int (*rd08)(struct nvkm_object *, u64 addr, u8 *data);
        int (*rd16)(struct nvkm_object *, u64 addr, u16 *data);
        int (*rd32)(struct nvkm_object *, u64 addr, u32 *data);
@@ -54,7 +59,8 @@
 int nvkm_object_fini(struct nvkm_object *, bool suspend);
 int nvkm_object_mthd(struct nvkm_object *, u32 mthd, void *data, u32 size);
 int nvkm_object_ntfy(struct nvkm_object *, u32 mthd, struct nvkm_event **);
-int nvkm_object_map(struct nvkm_object *, u64 *addr, u32 *size);
+int nvkm_object_map(struct nvkm_object *, bus_space_tag_t *, u64 *addr,
+    u32 *size);
 int nvkm_object_rd08(struct nvkm_object *, u64 addr, u8  *data);
 int nvkm_object_rd16(struct nvkm_object *, u64 addr, u16 *data);
 int nvkm_object_rd32(struct nvkm_object *, u64 addr, u32 *data);
diff -r a19ca822aa50 -r 8bc24600223c sys/external/bsd/drm2/dist/drm/nouveau/nouveau_nvif.c
--- a/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_nvif.c     Mon Aug 27 07:35:41 2018 +0000
+++ b/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_nvif.c     Mon Aug 27 07:35:56 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: nouveau_nvif.c,v 1.2 2018/08/27 04:58:24 riastradh Exp $       */
+/*     $NetBSD: nouveau_nvif.c,v 1.3 2018/08/27 07:35:56 riastradh Exp $       */
 
 /*
  * Copyright 2014 Red Hat Inc.
@@ -29,7 +29,7 @@
  ******************************************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_nvif.c,v 1.2 2018/08/27 04:58:24 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_nvif.c,v 1.3 2018/08/27 07:35:56 riastradh Exp $");
 
 #include <core/client.h>
 #include <core/notify.h>
@@ -44,6 +44,30 @@
 #include "nouveau_drm.h"
 #include "nouveau_usif.h"
 
+#ifdef __NetBSD__
+#define        __iomem __nvif_iomem
+static int
+nvkm_client_map(void *priv, bus_space_tag_t tag, u64 busaddr, u32 size,
+    bus_space_handle_t *handlep, void __iomem **ptrp)
+{
+       int ret;
+
+       ret = -bus_space_map(tag, busaddr, size, BUS_SPACE_MAP_LINEAR,
+           handlep);
+       if (ret)
+               return ret;
+       *ptrp = bus_space_vaddr(tag, *handlep);
+       return 0;
+}
+
+static void
+nvkm_client_unmap(void *priv, bus_space_tag_t tag, bus_space_handle_t handle,
+    u32 size)
+{
+
+       bus_space_unmap(tag, handle, size);
+}
+#else
 static void
 nvkm_client_unmap(void *priv, void __iomem *ptr, u32 size)
 {
@@ -55,6 +79,7 @@
 {
        return ioremap(handle, size);
 }
+#endif
 
 static int
 nvkm_client_ioctl(void *priv, bool super, void *data, u32 size, void **hack)
diff -r a19ca822aa50 -r 8bc24600223c sys/external/bsd/drm2/dist/drm/nouveau/nouveau_usif.c
--- a/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_usif.c     Mon Aug 27 07:35:41 2018 +0000
+++ b/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_usif.c     Mon Aug 27 07:35:56 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: nouveau_usif.c,v 1.2 2018/08/27 04:58:24 riastradh Exp $       */
+/*     $NetBSD: nouveau_usif.c,v 1.3 2018/08/27 07:35:56 riastradh Exp $       */
 
 /*
  * Copyright 2014 Red Hat Inc.
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_usif.c,v 1.2 2018/08/27 04:58:24 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_usif.c,v 1.3 2018/08/27 07:35:56 riastradh Exp $");
 
 #include "nouveau_drm.h"
 #include "nouveau_usif.h"
@@ -355,6 +355,9 @@
        case NVIF_IOCTL_V0_NTFY_PUT:
                ret = usif_notify_put(filp, data, size, argv, argc);
                break;
+       case NVIF_IOCTL_V0_MAP_NETBSD:
+               /* Kernel-only kludge.  */
+               ret = -EINVAL;
        default:
                ret = nvif_client_ioctl(client, argv, argc);
                break;
diff -r a19ca822aa50 -r 8bc24600223c sys/external/bsd/drm2/dist/drm/nouveau/nvif/nouveau_nvif_object.c
--- a/sys/external/bsd/drm2/dist/drm/nouveau/nvif/nouveau_nvif_object.c Mon Aug 27 07:35:41 2018 +0000
+++ b/sys/external/bsd/drm2/dist/drm/nouveau/nvif/nouveau_nvif_object.c Mon Aug 27 07:35:56 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: nouveau_nvif_object.c,v 1.2 2018/08/27 04:58:30 riastradh Exp $        */
+/*     $NetBSD: nouveau_nvif_object.c,v 1.3 2018/08/27 07:35:56 riastradh Exp $        */
 
 /*
  * Copyright 2014 Red Hat Inc.
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_nvif_object.c,v 1.2 2018/08/27 04:58:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_nvif_object.c,v 1.3 2018/08/27 07:35:56 riastradh Exp $");
 
 #include <nvif/object.h>
 #include <nvif/client.h>
@@ -183,7 +183,8 @@
                };
 
                if (object->map.ptr) {
-                       client->driver->unmap(client, object->map.ptr,
+                       client->driver->unmap(client, object->map.tag,
+                                                     object->map.handle,
                                                      object->map.size);
                        object->map.ptr = NULL;
                }
@@ -199,18 +200,36 @@
        struct nvif_client *client = object->client;
        struct {
                struct nvif_ioctl_v0 ioctl;
+#ifdef __NetBSD__
+               struct nvif_ioctl_map_netbsd_v0 map;
+#else
                struct nvif_ioctl_map_v0 map;
+#endif
        } args = {
+#ifdef __NetBSD__
+               .ioctl.type = NVIF_IOCTL_V0_MAP_NETBSD,
+#else
                .ioctl.type = NVIF_IOCTL_V0_MAP,
+#endif
        };
        int ret = nvif_object_ioctl(object, &args, sizeof(args), NULL);
        if (ret == 0) {
                object->map.size = args.map.length;
+#ifdef __NetBSD__
+               ret = client->driver->map(client, args.map.tag,
+                   args.map.handle, object->map.size, &object->map.handle,
+                   &object->map.ptr);
+               if (ret) {
+                       nvif_object_unmap(object);
+                       return -ENOMEM;
+               }
+#else
                object->map.ptr = client->driver->map(client, args.map.handle,
                                                      object->map.size);
                if (ret = -ENOMEM, object->map.ptr)
                        return 0;
                nvif_object_unmap(object);
+#endif
        }
        return ret;
 }
diff -r a19ca822aa50 -r 8bc24600223c sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_ioctl.c
--- a/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_ioctl.c        Mon Aug 27 07:35:41 2018 +0000
+++ b/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/core/nouveau_nvkm_core_ioctl.c        Mon Aug 27 07:35:56 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: nouveau_nvkm_core_ioctl.c,v 1.2 2018/08/27 04:58:30 riastradh Exp $    */
+/*     $NetBSD: nouveau_nvkm_core_ioctl.c,v 1.3 2018/08/27 07:35:56 riastradh Exp $    */
 
 /*
  * Copyright 2014 Red Hat Inc.
@@ -24,7 +24,7 @@
  * Authors: Ben Skeggs <bskeggs%redhat.com@localhost>
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_ioctl.c,v 1.2 2018/08/27 04:58:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_core_ioctl.c,v 1.3 2018/08/27 07:35:56 riastradh Exp $");
 
 #include <core/ioctl.h>
 #include <core/client.h>
@@ -260,8 +260,29 @@
 
        nvif_ioctl(object, "map size %d\n", size);
        if (nvif_unpack(args->v0, 0, 0, false)) {
+               bus_space_tag_t dummy __unused;
                nvif_ioctl(object, "map vers %d\n", args->v0.version);
-               ret = nvkm_object_map(object, &args->v0.handle,
+               ret = nvkm_object_map(object, &dummy,
+                                             &args->v0.handle,
+                                             &args->v0.length);
+       }
+
+       return ret;
+}
+
+static int
+nvkm_ioctl_map_netbsd(struct nvkm_object *object, void *data, u32 size)
+{



Home | Main Index | Thread Index | Old Index