Am 07.06.21 um 09:52 schrieb Pekka Paalanen: > On Fri, 4 Jun 2021 19:17:21 +0200 > Werner Sembach wrote: > >> Add a new general drm property "active bpc" which can be used by graphic drivers >> to report the applied bit depth per pixel back to userspace. >> >> While "max bpc" can be used to change the color depth, there was no way to check >> which one actually got used. While in theory the driver chooses the best/highest >> color depth within the max bpc setting a user might not be fully aware what his >> hardware is or isn't capable off. This is meant as a quick way to double check >> the setup. >> >> In the future, automatic color calibration for screens might also depend on this >> information available. >> >> Signed-off-by: Werner Sembach >> --- >> drivers/gpu/drm/drm_atomic_uapi.c | 2 ++ >> drivers/gpu/drm/drm_connector.c | 40 +++++++++++++++++++++++++++++++ >> include/drm/drm_connector.h | 15 ++++++++++++ >> 3 files changed, 57 insertions(+) >> >> diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c >> index 268bb69c2e2f..7ae4e40936b5 100644 >> --- a/drivers/gpu/drm/drm_atomic_uapi.c >> +++ b/drivers/gpu/drm/drm_atomic_uapi.c >> @@ -873,6 +873,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector, >> *val = 0; >> } else if (property == connector->max_bpc_property) { >> *val = state->max_requested_bpc; >> + } else if (property == connector->active_bpc_property) { >> + *val = state->active_bpc; >> } else if (connector->funcs->atomic_get_property) { >> return connector->funcs->atomic_get_property(connector, >> state, property, val); >> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c >> index 7631f76e7f34..5f42a5be5822 100644 >> --- a/drivers/gpu/drm/drm_connector.c >> +++ b/drivers/gpu/drm/drm_connector.c >> @@ -1195,6 +1195,13 @@ static const struct drm_prop_enum_list dp_colorspaces[] = { >> * drm_connector_attach_max_bpc_property() to create and attach the >> * property to the connector during initialization. >> * >> + * active bpc: >> + * This read-only range property is used by userspace check the bit depth >> + * actually applied by the GPU driver after evaluation all hardware >> + * capabilities and max bpc. Drivers to use the function >> + * drm_connector_attach_active_bpc_property() to create and attach the >> + * property to the connector during initialization. >> + * > Hi Werner, > > the idea looks good to me, but the above doc could be a little more > fluent. May I suggest something like: > > This read-only range property tells userspace the pixel color > bit depth actually used by the hardware display engine on "the > cable" on a connector. The chosen value depends on hardware > capabilities, both display engine and connected monitor, and > the "max bpc" property. Drivers shall use > drm_connector_attach_active_bpc_property() to install this > property. > > There should also be something said about dithering done by the display > engine (not monitor), but I'm not sure how that should be worded. It > may also depend on if and how userspace can know about dithering. So if > a dithering related property is added later, maybe add a note here too > in that patch. For this, and the DSC that Ville Syrjälä mentioned, I guess "the same behavior as max bpc" would be the most intuitive. But I don't know what that is and it's also not mentioned in the documentation. > > > Thanks, > pq > > >> * Connectors also have one standardized atomic property: >> * >> * CRTC_ID: >> @@ -2150,6 +2157,39 @@ int drm_connector_attach_max_bpc_property(struct drm_connector *connector, >> } >> EXPORT_SYMBOL(drm_connector_attach_max_bpc_property); >> >> +/** >> + * drm_connector_attach_active_bpc_property - attach "active bpc" property >> + * @connector: connector to attach active bpc property on. >> + * @min: The minimum bit depth supported by the connector. >> + * @max: The maximum bit depth supported by the connector. >> + * >> + * This is used to check the applied bit depth on a connector. >> + * >> + * Returns: >> + * Zero on success, negative errno on failure. >> + */ >> +int drm_connector_attach_active_bpc_property(struct drm_connector *connector, >> + int min, int max) >> +{ >> + struct drm_device *dev = connector->dev; >> + struct drm_property *prop; >> + >> + prop = connector->active_bpc_property; >> + if (!prop) { >> + prop = drm_property_create_range(dev, 0, "active bpc", min, max); >> + if (!prop) >> + return -ENOMEM; >> + >> + connector->active_bpc_property = prop; >> + } >> + >> + drm_object_attach_property(&connector->base, prop, 0); >> + connector->state->active_bpc = 0; >> + >> + return 0; >> +} >> +EXPORT_SYMBOL(drm_connector_attach_active_bpc_property); >> + >> /** >> * drm_connector_set_vrr_capable_property - sets the variable refresh rate >> * capable property for a connector >> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h >> index 1922b278ffad..c58cba2b6afe 100644 >> --- a/include/drm/drm_connector.h >> +++ b/include/drm/drm_connector.h >> @@ -781,6 +781,13 @@ struct drm_connector_state { >> */ >> u8 max_bpc; >> >> + /** >> + * @active_bpc: Read only property set by the GPU driver to the actually >> + * applied bit depth of the pixels after evaluating all hardware >> + * limitations. >> + */ >> + u8 active_bpc; >> + >> /** >> * @hdr_output_metadata: >> * DRM blob property for HDR output metadata >> @@ -1380,6 +1387,12 @@ struct drm_connector { >> */ >> struct drm_property *max_bpc_property; >> >> + /** >> + * @active_bpc_property: Default connector property for the active bpc >> + * to be driven out of the connector. >> + */ >> + struct drm_property *active_bpc_property; >> + >> #define DRM_CONNECTOR_POLL_HPD (1 << 0) >> #define DRM_CONNECTOR_POLL_CONNECT (1 << 1) >> #define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2) >> @@ -1698,6 +1711,8 @@ int drm_connector_set_panel_orientation_with_quirk( >> int width, int height); >> int drm_connector_attach_max_bpc_property(struct drm_connector *connector, >> int min, int max); >> +int drm_connector_attach_active_bpc_property(struct drm_connector *connector, >> + int min, int max); >> >> /** >> * struct drm_tile_group - Tile group metadata > > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx