drm/tegra: plane: Use proper possible_crtcs mask
authorThierry Reding <treding@nvidia.com>
Tue, 16 Dec 2014 17:04:08 +0000 (18:04 +0100)
committerThierry Reding <treding@nvidia.com>
Tue, 27 Jan 2015 09:14:35 +0000 (10:14 +0100)
The possible_crtcs mask needs to be a mask of CRTC indices. There is no
guarantee that the DRM indices match the hardware pipe number, so the
mask must be computed from the CRTC index.

Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/drm/tegra/dc.c

index 3a8a7c2270517deb5ecd0af7a4d61aa44c77c029..5bab53e0f990e5c4812a9cc2f9b1201619670bf9 100644 (file)
@@ -435,6 +435,19 @@ static const struct drm_plane_funcs tegra_primary_plane_funcs = {
 static struct drm_plane *tegra_dc_primary_plane_create(struct drm_device *drm,
                                                       struct tegra_dc *dc)
 {
+       /*
+        * Ideally this would use drm_crtc_mask(), but that would require the
+        * CRTC to already be in the mode_config's list of CRTCs. However, it
+        * will only be added to that list in the drm_crtc_init_with_planes()
+        * (in tegra_dc_init()), which in turn requires registration of these
+        * planes. So we have ourselves a nice little chicken and egg problem
+        * here.
+        *
+        * We work around this by manually creating the mask from the number
+        * of CRTCs that have been registered, and should therefore always be
+        * the same as drm_crtc_index() after registration.
+        */
+       unsigned long possible_crtcs = 1 << drm->mode_config.num_crtc;
        struct tegra_plane *plane;
        unsigned int num_formats;
        const u32 *formats;
@@ -447,7 +460,7 @@ static struct drm_plane *tegra_dc_primary_plane_create(struct drm_device *drm,
        num_formats = ARRAY_SIZE(tegra_primary_plane_formats);
        formats = tegra_primary_plane_formats;
 
-       err = drm_universal_plane_init(drm, &plane->base, 1 << dc->pipe,
+       err = drm_universal_plane_init(drm, &plane->base, possible_crtcs,
                                       &tegra_primary_plane_funcs, formats,
                                       num_formats, DRM_PLANE_TYPE_PRIMARY);
        if (err < 0) {