From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Anholt Subject: Re: [Intel-gfx] [PATCH 1/3] drm: Make sure at least one plane supports the fb format Date: Mon, 05 Mar 2018 12:59:00 -0800 Message-ID: <87y3j6utm3.fsf@anholt.net> References: <20180305144919.2881-1-ville.syrjala@linux.intel.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1783298893==" Return-path: In-Reply-To: <20180305144919.2881-1-ville.syrjala@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Ville Syrjala , dri-devel@lists.freedesktop.org Cc: intel-gfx@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org --===============1783298893== Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Ville Syrjala writes: > From: Ville Syrj=C3=A4l=C3=A4 > > To make life easier for drivers, let's have the core check that the > requested pixel format is supported by at least one plane when creating > a new framebuffer. > > Signed-off-by: Ville Syrj=C3=A4l=C3=A4 > --- > drivers/gpu/drm/drm_framebuffer.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_fram= ebuffer.c > index c0530a1af5e3..155b21e579c4 100644 > --- a/drivers/gpu/drm/drm_framebuffer.c > +++ b/drivers/gpu/drm/drm_framebuffer.c > @@ -152,6 +152,23 @@ static int fb_plane_height(int height, > return DIV_ROUND_UP(height, format->vsub); > } >=20=20 > +static bool planes_have_format(struct drm_device *dev, u32 format) > +{ > + struct drm_plane *plane; > + > + /* TODO: maybe maintain a device level format list? */ > + drm_for_each_plane(plane, dev) { > + int i; > + > + for (i =3D 0; i < plane->format_count; i++) { > + if (plane->format_types[i] =3D=3D format) > + return true; > + } > + } > + > + return false; > +} > + > static int framebuffer_check(struct drm_device *dev, > const struct drm_mode_fb_cmd2 *r) > { > @@ -168,6 +185,15 @@ static int framebuffer_check(struct drm_device *dev, > return -EINVAL; > } >=20=20 > + if (!planes_have_format(dev, r->pixel_format)) { > + struct drm_format_name_buf format_name; > + > + DRM_DEBUG_KMS("unsupported framebuffer format %s\n", > + drm_get_format_name(r->pixel_format, > + &format_name)); > + return -EINVAL; > + } > + Won't this break KMS on things like the radeon driver, which doesn't do planes? Maybe check if any universal planes have been registered and only do the check in that case? Also, "any_planes_have_format()" might be slightly more descriptive. --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEE/JuuFDWp9/ZkuCBXtdYpNtH8nugFAlqdr5QACgkQtdYpNtH8 nuie3xAAifcUH0kmXjgivWDmmbbVTl1YhiMBLz+It85QlIvKdUnNZ8rXEddGAjg1 FlZ1+XEhvPrEbcSlShVyGfdbfbqxL1E2wVw1x2bxUE8FF5o41aQquEiLxoTWn0DB ki+zAQFdAZFhGKVAUSkP8fZz8CmGsWEqb/ESYcqKbzGAgeLiN9OrAZSRDGi5zHpb 5RsYsDQxNCE7FUra2eUwpCn51XtNboXxu4XO5PVnBUwpjASXPZfwCTxbc+XOjbyH I26luZF/o/Fq6tN83RkJ0DehLFJbYzljqWip718FgkXgqQ/ncfenPhVo8d/L8i4e FNbhVWyx09eUKRP2tZH3eT0ZrtAfZpP1Lmwvih8D7bufgBd6z49ZzyGjMVTT2wNN XiP0en/cmnLps+PbGo46+MKZXm1Le2kCuwslHbcOa2KWZExv4SNKsTN2l4hm9VSr LF5GqRR2r0aQDrx7fM3DYHW0siTwuMNP/pYUtMP7pSCwD2uzICE79/0eLsmc0T4x IiJDqkyzh5pkYAYW26hM2jZBrZG/i2Dzzh6VhLXDf7fjO0cjYb+akiqusMhhnauG WMZlvhPXs47vhSC+YIdyACfrZiRp1p9EQAA148fGoPcRSomx77tJ2kw3cEDrsVjP ZcoglkmJLi3+5t+sQNu3VAn4M5kslP3eARb7LHSL+cjOyEShzfI= =Vgzm -----END PGP SIGNATURE----- --=-=-=-- --===============1783298893== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: inline X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVs IG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlz dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg== --===============1783298893==--