drm/nouveau: store vblank event handler data in nv_crtc
authorBen Skeggs <bskeggs@redhat.com>
Sat, 9 Aug 2014 18:10:19 +0000 (04:10 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Sat, 9 Aug 2014 19:12:58 +0000 (05:12 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_crtc.h
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/nouveau/nouveau_display.h

index a7cbbe9..6af9b58 100644 (file)
@@ -31,6 +31,7 @@ struct nouveau_crtc {
        struct drm_crtc base;
 
        int index;
+       struct nouveau_eventh *vblank;
 
        uint32_t dpms_saved_fp_control;
        uint32_t fp_users;
index b6e258f..a1247f2 100644 (file)
 static int
 nouveau_display_vblank_handler(void *data, u32 type, int head)
 {
-       struct nouveau_drm *drm = data;
-       drm_handle_vblank(drm->dev, head);
+       struct nouveau_crtc *nv_crtc = data;
+       drm_handle_vblank(nv_crtc->base.dev, nv_crtc->index);
        return NVKM_EVENT_KEEP;
 }
 
 int
 nouveau_display_vblank_enable(struct drm_device *dev, int head)
 {
-       struct nouveau_display *disp = nouveau_display(dev);
-       if (disp) {
-               nouveau_event_get(disp->vblank[head]);
-               return 0;
+       struct drm_crtc *crtc;
+       list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
+               struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
+               if (nv_crtc->index == head) {
+                       nouveau_event_get(nv_crtc->vblank);
+                       return 0;
+               }
        }
-       return -EIO;
+       return -EINVAL;
 }
 
 void
 nouveau_display_vblank_disable(struct drm_device *dev, int head)
 {
-       struct nouveau_display *disp = nouveau_display(dev);
-       if (disp)
-               nouveau_event_put(disp->vblank[head]);
+       struct drm_crtc *crtc;
+       list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
+               struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
+               if (nv_crtc->index == head) {
+                       nouveau_event_put(nv_crtc->vblank);
+                       return;
+               }
+       }
 }
 
 static inline int
@@ -151,36 +159,29 @@ nouveau_display_vblstamp(struct drm_device *dev, int head, int *max_error,
 static void
 nouveau_display_vblank_fini(struct drm_device *dev)
 {
-       struct nouveau_display *disp = nouveau_display(dev);
-       int i;
+       struct drm_crtc *crtc;
 
        drm_vblank_cleanup(dev);
 
-       if (disp->vblank) {
-               for (i = 0; i < dev->mode_config.num_crtc; i++)
-                       nouveau_event_ref(NULL, &disp->vblank[i]);
-               kfree(disp->vblank);
-               disp->vblank = NULL;
+       list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
+               struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
+               nouveau_event_ref(NULL, &nv_crtc->vblank);
        }
 }
 
 static int
 nouveau_display_vblank_init(struct drm_device *dev)
 {
-       struct nouveau_display *disp = nouveau_display(dev);
        struct nouveau_drm *drm = nouveau_drm(dev);
        struct nouveau_disp *pdisp = nouveau_disp(drm->device);
-       int ret, i;
-
-       disp->vblank = kzalloc(dev->mode_config.num_crtc *
-                              sizeof(*disp->vblank), GFP_KERNEL);
-       if (!disp->vblank)
-               return -ENOMEM;
+       struct drm_crtc *crtc;
+       int ret;
 
-       for (i = 0; i < dev->mode_config.num_crtc; i++) {
-               ret = nouveau_event_new(pdisp->vblank, 1, i,
+       list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
+               struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
+               ret = nouveau_event_new(pdisp->vblank, 1, nv_crtc->index,
                                        nouveau_display_vblank_handler,
-                                       drm, &disp->vblank[i]);
+                                       nv_crtc, &nv_crtc->vblank);
                if (ret) {
                        nouveau_display_vblank_fini(dev);
                        return ret;
index a21fd2d..37bf0d2 100644 (file)
@@ -40,8 +40,6 @@ struct nouveau_display {
        void (*fb_dtor)(struct drm_framebuffer *);
 
        struct nouveau_object *core;
-       struct nouveau_eventh **vblank;
-
 
        struct drm_property *dithering_mode;
        struct drm_property *dithering_depth;