drm/nouveau/disp: implement nvif event sources for vblank/connector notifiers
authorBen Skeggs <bskeggs@redhat.com>
Sat, 9 Aug 2014 18:10:28 +0000 (04:10 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Sat, 9 Aug 2014 19:28:12 +0000 (05:28 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/core/engine/disp/base.c
drivers/gpu/drm/nouveau/core/engine/disp/nv04.c
drivers/gpu/drm/nouveau/core/engine/disp/nv50.c
drivers/gpu/drm/nouveau/core/engine/disp/nvd0.c
drivers/gpu/drm/nouveau/core/engine/disp/priv.h
drivers/gpu/drm/nouveau/nouveau_connector.c
drivers/gpu/drm/nouveau/nouveau_connector.h
drivers/gpu/drm/nouveau/nouveau_crtc.h
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/nouveau/nvif/class.h
drivers/gpu/drm/nouveau/nvif/device.h

index d1df0ce990e9e91a85e628202a4117742ca23bba..22d55f6cde5011f34c19bc938066d1306fcbd7e7 100644 (file)
@@ -24,6 +24,7 @@
 
 #include <core/os.h>
 #include <nvif/unpack.h>
+#include <nvif/class.h>
 #include <nvif/event.h>
 
 #include "priv.h"
@@ -92,6 +93,24 @@ nouveau_disp_hpd_func = {
        .ctor = nouveau_disp_hpd_ctor
 };
 
+int
+nouveau_disp_ntfy(struct nouveau_object *object, u32 type,
+                 struct nvkm_event **event)
+{
+       struct nouveau_disp *disp = (void *)object->engine;
+       switch (type) {
+       case NV04_DISP_NTFY_VBLANK:
+               *event = &disp->vblank;
+               return 0;
+       case NV04_DISP_NTFY_CONN:
+               *event = &disp->hpd;
+               return 0;
+       default:
+               break;
+       }
+       return -EINVAL;
+}
+
 int
 _nouveau_disp_fini(struct nouveau_object *object, bool suspend)
 {
index 9f0ae05f7d3750795f2462dc0d8057f9863b1370..366f315fc9a5349b3c1d5aa648e81b95b6d63755 100644 (file)
@@ -112,6 +112,7 @@ nv04_disp_ofuncs = {
        .init = nouveau_object_init,
        .fini = nouveau_object_fini,
        .mthd = nv04_disp_mthd,
+       .ntfy = nouveau_disp_ntfy,
 };
 
 static struct nouveau_oclass
index 858386bdd4bd4739cdb87c0e884ca4f7f8d78697..2703910a02111c09e7a656d2d3288cf0469bec92 100644 (file)
@@ -1142,6 +1142,7 @@ nv50_disp_base_ofuncs = {
        .init = nv50_disp_base_init,
        .fini = nv50_disp_base_fini,
        .mthd = nv50_disp_base_mthd,
+       .ntfy = nouveau_disp_ntfy,
 };
 
 static struct nouveau_oclass
index 9c2ac1390ef6dfd3448b4c7a92976ddc44c34fc6..a4bb3c774ee1f6a853289003ab98a73cc2a78c5a 100644 (file)
@@ -716,6 +716,7 @@ nvd0_disp_base_ofuncs = {
        .init = nvd0_disp_base_init,
        .fini = nvd0_disp_base_fini,
        .mthd = nv50_disp_base_mthd,
+       .ntfy = nouveau_disp_ntfy,
 };
 
 static struct nouveau_oclass
index 5506d119b144a7aa2a2b83ace0e0ea91c6a85597..dbd43ae9df81af3e3978f798793334349027f631 100644 (file)
@@ -42,5 +42,6 @@ extern struct nouveau_oclass *nvkm_connector_oclass;
 
 int  nouveau_disp_vblank_ctor(void *data, u32 size, struct nvkm_notify *);
 void nouveau_disp_vblank(struct nouveau_disp *, int head);
+int  nouveau_disp_ntfy(struct nouveau_object *, u32, struct nvkm_event **);
 
 #endif
index 1b009f73e85f680bf83d6c96d8d33722b38d21e0..1ec44c83e91932ffe82237143ea93ca6b94546c4 100644 (file)
@@ -100,7 +100,7 @@ static void
 nouveau_connector_destroy(struct drm_connector *connector)
 {
        struct nouveau_connector *nv_connector = nouveau_connector(connector);
-       nvkm_notify_fini(&nv_connector->hpd);
+       nvif_notify_fini(&nv_connector->hpd);
        kfree(nv_connector->edid);
        drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
@@ -937,7 +937,7 @@ nouveau_connector_funcs_dp = {
 };
 
 static int
-nouveau_connector_hotplug(struct nvkm_notify *notify)
+nouveau_connector_hotplug(struct nvif_notify *notify)
 {
        struct nouveau_connector *nv_connector =
                container_of(notify, typeof(*nv_connector), hpd);
@@ -959,7 +959,7 @@ nouveau_connector_hotplug(struct nvkm_notify *notify)
                drm_helper_hpd_irq_event(connector->dev);
        }
 
-       return NVKM_NOTIFY_KEEP;
+       return NVIF_NOTIFY_KEEP;
 }
 
 static ssize_t
@@ -1029,7 +1029,6 @@ nouveau_connector_create(struct drm_device *dev, int index)
        struct nouveau_drm *drm = nouveau_drm(dev);
        struct nouveau_display *disp = nouveau_display(dev);
        struct nouveau_connector *nv_connector = NULL;
-       struct nouveau_disp *pdisp = nvkm_disp(&drm->device);
        struct drm_connector *connector;
        int type, ret = 0;
        bool dummy;
@@ -1215,7 +1214,8 @@ nouveau_connector_create(struct drm_device *dev, int index)
                break;
        }
 
-       ret = nvkm_notify_init(&pdisp->hpd, nouveau_connector_hotplug, true,
+       ret = nvif_notify_init(&disp->disp, NULL, nouveau_connector_hotplug,
+                               true, NV04_DISP_NTFY_CONN,
                               &(struct nvif_notify_conn_req_v0) {
                                .mask = NVIF_NOTIFY_CONN_V0_ANY,
                                .conn = index,
index a64f4629628d17e0934a3377189f013fdd9de713..68029d041dd2fd856e636fe6e6b48a0971c625c4 100644 (file)
@@ -27,6 +27,8 @@
 #ifndef __NOUVEAU_CONNECTOR_H__
 #define __NOUVEAU_CONNECTOR_H__
 
+#include <nvif/notify.h>
+
 #include <drm/drm_edid.h>
 #include <drm/drm_dp_helper.h>
 #include "nouveau_crtc.h"
@@ -63,7 +65,7 @@ struct nouveau_connector {
        u8 index;
        u8 *dcb;
 
-       struct nvkm_notify hpd;
+       struct nvif_notify hpd;
 
        struct drm_dp_aux aux;
 
index 6358640387b88ae151ed819dc70490e09cb3b68c..f19cb1c5fc5a678e37ec79ba6762708540adb99c 100644 (file)
 #ifndef __NOUVEAU_CRTC_H__
 #define __NOUVEAU_CRTC_H__
 
+#include <nvif/notify.h>
+
 struct nouveau_crtc {
        struct drm_crtc base;
 
        int index;
-       struct nvkm_notify vblank;
+       struct nvif_notify vblank;
 
        uint32_t dpms_saved_fp_control;
        uint32_t fp_users;
index a5a1f298c00156667c7eca9c20f3f7b26b98716e..62f969608c2f26d7b9d02fba978e2b8ca88277e1 100644 (file)
 #include <nvif/event.h>
 
 static int
-nouveau_display_vblank_handler(struct nvkm_notify *notify)
+nouveau_display_vblank_handler(struct nvif_notify *notify)
 {
        struct nouveau_crtc *nv_crtc =
                container_of(notify, typeof(*nv_crtc), vblank);
        drm_handle_vblank(nv_crtc->base.dev, nv_crtc->index);
-       return NVKM_NOTIFY_KEEP;
+       return NVIF_NOTIFY_KEEP;
 }
 
 int
@@ -57,7 +57,7 @@ nouveau_display_vblank_enable(struct drm_device *dev, int head)
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
                struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
                if (nv_crtc->index == head) {
-                       nvkm_notify_get(&nv_crtc->vblank);
+                       nvif_notify_get(&nv_crtc->vblank);
                        return 0;
                }
        }
@@ -71,7 +71,7 @@ nouveau_display_vblank_disable(struct drm_device *dev, int head)
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
                struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
                if (nv_crtc->index == head) {
-                       nvkm_notify_put(&nv_crtc->vblank);
+                       nvif_notify_put(&nv_crtc->vblank);
                        return;
                }
        }
@@ -172,22 +172,22 @@ nouveau_display_vblank_fini(struct drm_device *dev)
 
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
                struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
-               nvkm_notify_fini(&nv_crtc->vblank);
+               nvif_notify_fini(&nv_crtc->vblank);
        }
 }
 
 static int
 nouveau_display_vblank_init(struct drm_device *dev)
 {
-       struct nouveau_drm *drm = nouveau_drm(dev);
-       struct nouveau_disp *pdisp = nvkm_disp(&drm->device);
+       struct nouveau_display *disp = nouveau_display(dev);
        struct drm_crtc *crtc;
        int ret;
 
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
                struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
-               ret = nvkm_notify_init(&pdisp->vblank,
+               ret = nvif_notify_init(&disp->disp, NULL,
                                       nouveau_display_vblank_handler, false,
+                                      NV04_DISP_NTFY_VBLANK,
                                       &(struct nvif_notify_head_req_v0) {
                                        .head = nv_crtc->index,
                                       },
@@ -371,7 +371,7 @@ nouveau_display_init(struct drm_device *dev)
        /* enable hotplug interrupts */
        list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
                struct nouveau_connector *conn = nouveau_connector(connector);
-               nvkm_notify_get(&conn->hpd);
+               nvif_notify_get(&conn->hpd);
        }
 
        return ret;
@@ -391,7 +391,7 @@ nouveau_display_fini(struct drm_device *dev)
        /* disable hotplug interrupts */
        list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
                struct nouveau_connector *conn = nouveau_connector(connector);
-               nvkm_notify_put(&conn->hpd);
+               nvif_notify_put(&conn->hpd);
        }
 
        drm_kms_helper_poll_disable(dev);
index 15dc6a35589e46c69042d0d8ff1c904f3a7d62e4..c9897f4003a9ad1568b76e5a08be3a97aba80bc2 100644 (file)
@@ -343,6 +343,9 @@ struct kepler_channel_gpfifo_a_v0 {
  * legacy display
  ******************************************************************************/
 
+#define NV04_DISP_NTFY_VBLANK                                              0x00
+#define NV04_DISP_NTFY_CONN                                                0x01
+
 struct nv04_disp_mthd_v0 {
        __u8  version;
 #define NV04_DISP_SCANOUTPOS                                               0x00
@@ -365,7 +368,6 @@ struct nv04_disp_scanoutpos_v0 {
        __u16 hline;
 };
 
-
 /*******************************************************************************
  * display
  ******************************************************************************/
index c208bad984b3fe2ea0a893c9fa1ee6794cee835e..b3928765f659d6970507ba92fa6c459770852f6f 100644 (file)
@@ -54,13 +54,11 @@ void nvif_device_ref(struct nvif_device *, struct nvif_device **);
 
 #include <engine/device.h>
 #include <engine/fifo.h>
-#include <engine/disp.h>
 #include <engine/graph.h>
 #include <engine/software.h>
 
 #define nvkm_fifo(a) nouveau_fifo(nvkm_device(a))
 #define nvkm_fifo_chan(a) ((struct nouveau_fifo_chan *)nvkm_object(a))
-#define nvkm_disp(a) nouveau_disp(nvkm_device(a))
 #define nvkm_gr(a) ((struct nouveau_graph *)nouveau_engine(nvkm_object(a), NVDEV_ENGINE_GR))
 
 #endif