[PATCHv2 2/2] drm/omap: fix primary-plane's possible_crtcs
Tomi Valkeinen
tomi.valkeinen at ti.com
Fri Dec 2 14:22:18 UTC 2016
On 02/12/16 16:16, Laurent Pinchart wrote:
> Hi Tomi,
>
> Thank you for the patch.
>
> On Friday 02 Dec 2016 16:07:11 Tomi Valkeinen wrote:
>> We set the possible_crtc for all planes to "(1 << priv->num_crtcs) - 1",
>> which is fine as the HW planes can be used fro all crtcs. However, when
>> we're doing that, we are still incrementing 'num_crtcs', and we'll end
>> up with bad possible_crtcs, preventing the use of the primary planes.
>>
>> This patch passes a possible_crtcs mask to plane init function so that
>> we get correct possible_crtc.
>>
>> Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ti.com>
>> ---
>>
>> v2: use correct possible_crtcs value
>>
>> drivers/gpu/drm/omapdrm/omap_drv.c | 17 ++++++++++++-----
>> drivers/gpu/drm/omapdrm/omap_drv.h | 3 ++-
>> drivers/gpu/drm/omapdrm/omap_plane.c | 6 +++---
>> 3 files changed, 17 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c
>> b/drivers/gpu/drm/omapdrm/omap_drv.c index 39c5312b466c..fdc83cbcde61
>> 100644
>> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
>> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
>> @@ -267,13 +267,15 @@ static int omap_connect_dssdevs(void)
>> }
>>
>> static int omap_modeset_create_crtc(struct drm_device *dev, int id,
>> - enum omap_channel channel)
>> + enum omap_channel channel,
>> + u32 possible_crtcs)
>> {
>> struct omap_drm_private *priv = dev->dev_private;
>> struct drm_plane *plane;
>> struct drm_crtc *crtc;
>>
>> - plane = omap_plane_init(dev, id, DRM_PLANE_TYPE_PRIMARY);
>> + plane = omap_plane_init(dev, id, DRM_PLANE_TYPE_PRIMARY,
>> + possible_crtcs);
>> if (IS_ERR(plane))
>> return PTR_ERR(plane);
>
> If you removed the priv->num_crtcs++ a bit below in this function...
>
>> @@ -309,6 +311,7 @@ static int omap_modeset_init(struct drm_device *dev)
>> int num_crtcs;
>> int i, id = 0;
>> int ret;
>> + u32 possible_crtcs;
>>
>> drm_mode_config_init(dev);
>>
>> @@ -325,6 +328,7 @@ static int omap_modeset_init(struct drm_device *dev)
>> * We use the num_crtc argument to limit the number of crtcs we
> create.
>> */
>> num_crtcs = min3(num_crtc, num_mgrs, num_ovls);
>
> and assigned priv->num_crtcs here and replaced the channel_used() function
> with a simple bitmask private to omap_modeset_init() you would end up with a
> much simpler implementation that wouldn't require passing possible_crtcs
> through a bunch of functions.
Yes, I almost did that.
But priv-num_crtcs tells the amount of crtcs in priv->crtcs. If we set
priv->num_crtcs before actually creating those crtcs, I fear we could
easily create a bug. The crtc+plane creation code is not the shortest
one, so even if we wouldn't have a bug right now, I imagine it could be
easy to write a helper func or such later, which uses priv->num_crtcs,
and which gets called at some point when creating crtcs and planes...
So I went the safe way.
Tomi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20161202/b0084dd5/attachment.sig>
More information about the dri-devel
mailing list