drm/plane: modify create_in_formats to acommodate async

create_in_formats creates the list of supported format/modifiers for
synchronous flips, modify the same function so as to take the
format_mod_supported as argument and create list of format/modifier for
async as well.

v5: create_in_formats can return -ve value in failure case, correct the
if condition to check the creation of blob <Chaitanya>
Dont add the modifier for which none of the formats is not supported.
v6: Remove the code for masking the unsupported modifiers as UMD can
leave with it. (Naveen/Chaitanya)
v7: Retain the unsupported modifiers, userspace should have no
impact, return pointer to blob instead of blob_id(Ville)

Signed-off-by: Arun R Murthy <arun.r.murthy@intel.com>
Acked-by: Xaver Hugl <xaver.hugl@kde.org>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Reviewed-by: Chaitanya Kumar Borah <chaitanya.kumar.borah@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Tested-by: Naveen Kumar <naveen1.kumar@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Link: https://lore.kernel.org/r/20250407-asyn-v13-2-b93ef83076c5@intel.com
This commit is contained in:
Arun R Murthy
2025-04-07 11:13:46 +05:30
committed by Suraj Kandpal
parent 9cd5cc9da7
commit 0d6dcd741c

View File

@@ -193,9 +193,13 @@ modifiers_ptr(struct drm_format_modifier_blob *blob)
return (struct drm_format_modifier *)(((char *)blob) + blob->modifiers_offset); return (struct drm_format_modifier *)(((char *)blob) + blob->modifiers_offset);
} }
static int create_in_format_blob(struct drm_device *dev, struct drm_plane *plane) static struct drm_property_blob *create_in_format_blob(struct drm_device *dev,
struct drm_plane *plane,
bool (*format_mod_supported)
(struct drm_plane *plane,
u32 format,
u64 modifier))
{ {
const struct drm_mode_config *config = &dev->mode_config;
struct drm_property_blob *blob; struct drm_property_blob *blob;
struct drm_format_modifier *mod; struct drm_format_modifier *mod;
size_t blob_size, formats_size, modifiers_size; size_t blob_size, formats_size, modifiers_size;
@@ -221,7 +225,7 @@ static int create_in_format_blob(struct drm_device *dev, struct drm_plane *plane
blob = drm_property_create_blob(dev, blob_size, NULL); blob = drm_property_create_blob(dev, blob_size, NULL);
if (IS_ERR(blob)) if (IS_ERR(blob))
return -1; return NULL;
blob_data = blob->data; blob_data = blob->data;
blob_data->version = FORMAT_BLOB_CURRENT; blob_data->version = FORMAT_BLOB_CURRENT;
@@ -237,8 +241,8 @@ static int create_in_format_blob(struct drm_device *dev, struct drm_plane *plane
mod = modifiers_ptr(blob_data); mod = modifiers_ptr(blob_data);
for (i = 0; i < plane->modifier_count; i++) { for (i = 0; i < plane->modifier_count; i++) {
for (j = 0; j < plane->format_count; j++) { for (j = 0; j < plane->format_count; j++) {
if (!plane->funcs->format_mod_supported || if (!format_mod_supported ||
plane->funcs->format_mod_supported(plane, format_mod_supported(plane,
plane->format_types[j], plane->format_types[j],
plane->modifiers[i])) { plane->modifiers[i])) {
mod->formats |= 1ULL << j; mod->formats |= 1ULL << j;
@@ -251,10 +255,7 @@ static int create_in_format_blob(struct drm_device *dev, struct drm_plane *plane
mod++; mod++;
} }
drm_object_attach_property(&plane->base, config->modifiers_property, return blob;
blob->base.id);
return 0;
} }
/** /**
@@ -366,6 +367,7 @@ static int __drm_universal_plane_init(struct drm_device *dev,
const char *name, va_list ap) const char *name, va_list ap)
{ {
struct drm_mode_config *config = &dev->mode_config; struct drm_mode_config *config = &dev->mode_config;
struct drm_property_blob *blob;
static const uint64_t default_modifiers[] = { static const uint64_t default_modifiers[] = {
DRM_FORMAT_MOD_LINEAR, DRM_FORMAT_MOD_LINEAR,
}; };
@@ -477,8 +479,24 @@ static int __drm_universal_plane_init(struct drm_device *dev,
drm_plane_create_hotspot_properties(plane); drm_plane_create_hotspot_properties(plane);
} }
if (format_modifier_count) if (format_modifier_count) {
create_in_format_blob(dev, plane); blob = create_in_format_blob(dev, plane,
plane->funcs->format_mod_supported);
if (!IS_ERR(blob))
drm_object_attach_property(&plane->base,
config->modifiers_property,
blob->base.id);
}
if (plane->funcs->format_mod_supported_async) {
blob = create_in_format_blob(dev, plane,
plane->funcs->format_mod_supported_async);
if (!IS_ERR(blob))
drm_object_attach_property(&plane->base,
config->async_modifiers_property,
blob->base.id);
}
return 0; return 0;
} }