[PATCH 06/17] drm: helpers to find mode objects
Rob Clark
robdclark at gmail.com
Mon May 26 04:12:16 PDT 2014
On Mon, May 26, 2014 at 4:37 AM, Daniel Vetter <daniel at ffwll.ch> wrote:
> On Sat, May 24, 2014 at 02:30:15PM -0400, Rob Clark wrote:
>> Add a few more useful helpers to find mode objects.
>>
>> Signed-off-by: Rob Clark <robdclark at gmail.com>
>
> There's a pile more in drivers for these. I like this, but imo we should
> also convert drivers while at it. Also, docbook is missing. And since it's
> a cleanup I think it's better to do this first, directly on top of
> drm-next. The patch itself looks good.
Yeah, the intent was to go back and add missing docbook as follow-up
patches, to try to get this into a shape where it could be merged
earlier.
I can have a go at coccinelle too for follow-up patches.
BR,
-R
> -Daniel
>
>> ---
>> drivers/gpu/drm/drm_crtc.c | 97 ++++++++++++++--------------------------------
>> include/drm/drm_crtc.h | 33 ++++++++++++++++
>> 2 files changed, 63 insertions(+), 67 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
>> index fa86fba..bd12185 100644
>> --- a/drivers/gpu/drm/drm_crtc.c
>> +++ b/drivers/gpu/drm/drm_crtc.c
>> @@ -1736,7 +1736,6 @@ int drm_mode_getcrtc(struct drm_device *dev,
>> {
>> struct drm_mode_crtc *crtc_resp = data;
>> struct drm_crtc *crtc;
>> - struct drm_mode_object *obj;
>> int ret = 0;
>>
>> if (!drm_core_check_feature(dev, DRIVER_MODESET))
>> @@ -1744,13 +1743,11 @@ int drm_mode_getcrtc(struct drm_device *dev,
>>
>> drm_modeset_lock_all(dev);
>>
>> - obj = drm_mode_object_find(dev, crtc_resp->crtc_id,
>> - DRM_MODE_OBJECT_CRTC);
>> - if (!obj) {
>> + crtc = drm_crtc_find(dev, crtc_resp->crtc_id);
>> + if (!crtc) {
>> ret = -ENOENT;
>> goto out;
>> }
>> - crtc = obj_to_crtc(obj);
>>
>> crtc_resp->x = crtc->x;
>> crtc_resp->y = crtc->y;
>> @@ -1804,7 +1801,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
>> struct drm_file *file_priv)
>> {
>> struct drm_mode_get_connector *out_resp = data;
>> - struct drm_mode_object *obj;
>> struct drm_connector *connector;
>> struct drm_display_mode *mode;
>> int mode_count = 0;
>> @@ -1828,13 +1824,11 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
>>
>> drm_modeset_lock(&dev->mode_config.mutex, NULL);
>>
>> - obj = drm_mode_object_find(dev, out_resp->connector_id,
>> - DRM_MODE_OBJECT_CONNECTOR);
>> - if (!obj) {
>> + connector = drm_connector_find(dev, out_resp->connector_id);
>> + if (!connector) {
>> ret = -ENOENT;
>> goto out;
>> }
>> - connector = obj_to_connector(obj);
>>
>> props_count = connector->properties.count;
>>
>> @@ -1949,7 +1943,6 @@ int drm_mode_getencoder(struct drm_device *dev, void *data,
>> struct drm_file *file_priv)
>> {
>> struct drm_mode_get_encoder *enc_resp = data;
>> - struct drm_mode_object *obj;
>> struct drm_encoder *encoder;
>> int ret = 0;
>>
>> @@ -1957,13 +1950,11 @@ int drm_mode_getencoder(struct drm_device *dev, void *data,
>> return -EINVAL;
>>
>> drm_modeset_lock_all(dev);
>> - obj = drm_mode_object_find(dev, enc_resp->encoder_id,
>> - DRM_MODE_OBJECT_ENCODER);
>> - if (!obj) {
>> + encoder = drm_encoder_find(dev, enc_resp->encoder_id);
>> + if (!encoder) {
>> ret = -ENOENT;
>> goto out;
>> }
>> - encoder = obj_to_encoder(obj);
>>
>> if (encoder->crtc)
>> enc_resp->crtc_id = encoder->crtc->base.id;
>> @@ -2061,7 +2052,6 @@ int drm_mode_getplane(struct drm_device *dev, void *data,
>> struct drm_file *file_priv)
>> {
>> struct drm_mode_get_plane *plane_resp = data;
>> - struct drm_mode_object *obj;
>> struct drm_plane *plane;
>> uint32_t __user *format_ptr;
>> int ret = 0;
>> @@ -2070,13 +2060,11 @@ int drm_mode_getplane(struct drm_device *dev, void *data,
>> return -EINVAL;
>>
>> drm_modeset_lock_all(dev);
>> - obj = drm_mode_object_find(dev, plane_resp->plane_id,
>> - DRM_MODE_OBJECT_PLANE);
>> - if (!obj) {
>> + plane = drm_plane_find(dev, plane_resp->plane_id);
>> + if (!plane) {
>> ret = -ENOENT;
>> goto out;
>> }
>> - plane = obj_to_plane(obj);
>>
>> if (plane->crtc)
>> plane_resp->crtc_id = plane->crtc->base.id;
>> @@ -2129,7 +2117,6 @@ int drm_mode_setplane(struct drm_device *dev, void *data,
>> struct drm_file *file_priv)
>> {
>> struct drm_mode_set_plane *plane_req = data;
>> - struct drm_mode_object *obj;
>> struct drm_plane *plane;
>> struct drm_crtc *crtc;
>> struct drm_framebuffer *fb = NULL, *old_fb = NULL;
>> @@ -2144,14 +2131,12 @@ int drm_mode_setplane(struct drm_device *dev, void *data,
>> * First, find the plane, crtc, and fb objects. If not available,
>> * we don't bother to call the driver.
>> */
>> - obj = drm_mode_object_find(dev, plane_req->plane_id,
>> - DRM_MODE_OBJECT_PLANE);
>> - if (!obj) {
>> + plane = drm_plane_find(dev, plane_req->plane_id);
>> + if (!plane) {
>> DRM_DEBUG_KMS("Unknown plane ID %d\n",
>> plane_req->plane_id);
>> return -ENOENT;
>> }
>> - plane = obj_to_plane(obj);
>>
>> /* No fb means shut it down */
>> if (!plane_req->fb_id) {
>> @@ -2168,15 +2153,13 @@ int drm_mode_setplane(struct drm_device *dev, void *data,
>> goto out;
>> }
>>
>> - obj = drm_mode_object_find(dev, plane_req->crtc_id,
>> - DRM_MODE_OBJECT_CRTC);
>> - if (!obj) {
>> + crtc = drm_crtc_find(dev, plane_req->crtc_id);
>> + if (!crtc) {
>> DRM_DEBUG_KMS("Unknown crtc ID %d\n",
>> plane_req->crtc_id);
>> ret = -ENOENT;
>> goto out;
>> }
>> - crtc = obj_to_crtc(obj);
>>
>> fb = drm_framebuffer_lookup(dev, plane_req->fb_id);
>> if (!fb) {
>> @@ -2363,7 +2346,6 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
>> {
>> struct drm_mode_config *config = &dev->mode_config;
>> struct drm_mode_crtc *crtc_req = data;
>> - struct drm_mode_object *obj;
>> struct drm_crtc *crtc;
>> struct drm_connector **connector_set = NULL, *connector;
>> struct drm_framebuffer *fb = NULL;
>> @@ -2381,14 +2363,12 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
>> return -ERANGE;
>>
>> drm_modeset_lock_all(dev);
>> - obj = drm_mode_object_find(dev, crtc_req->crtc_id,
>> - DRM_MODE_OBJECT_CRTC);
>> - if (!obj) {
>> + crtc = drm_crtc_find(dev, crtc_req->crtc_id);
>> + if (!crtc) {
>> DRM_DEBUG_KMS("Unknown CRTC ID %d\n", crtc_req->crtc_id);
>> ret = -ENOENT;
>> goto out;
>> }
>> - crtc = obj_to_crtc(obj);
>> DRM_DEBUG_KMS("[CRTC:%d]\n", crtc->base.id);
>>
>> if (crtc_req->mode_valid) {
>> @@ -2471,15 +2451,13 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
>> goto out;
>> }
>>
>> - obj = drm_mode_object_find(dev, out_id,
>> - DRM_MODE_OBJECT_CONNECTOR);
>> - if (!obj) {
>> + connector = drm_connector_find(dev, out_id);
>> + if (!connector) {
>> DRM_DEBUG_KMS("Connector id %d unknown\n",
>> out_id);
>> ret = -ENOENT;
>> goto out;
>> }
>> - connector = obj_to_connector(obj);
>> DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
>> connector->base.id,
>> drm_get_connector_name(connector));
>> @@ -2511,7 +2489,6 @@ static int drm_mode_cursor_common(struct drm_device *dev,
>> struct drm_mode_cursor2 *req,
>> struct drm_file *file_priv)
>> {
>> - struct drm_mode_object *obj;
>> struct drm_crtc *crtc;
>> int ret = 0;
>>
>> @@ -2521,12 +2498,11 @@ static int drm_mode_cursor_common(struct drm_device *dev,
>> if (!req->flags || (~DRM_MODE_CURSOR_FLAGS & req->flags))
>> return -EINVAL;
>>
>> - obj = drm_mode_object_find(dev, req->crtc_id, DRM_MODE_OBJECT_CRTC);
>> - if (!obj) {
>> + crtc = drm_crtc_find(dev, req->crtc_id);
>> + if (!crtc) {
>> DRM_DEBUG_KMS("Unknown CRTC ID %d\n", req->crtc_id);
>> return -ENOENT;
>> }
>> - crtc = obj_to_crtc(obj);
>>
>> drm_modeset_lock(&crtc->mutex, NULL);
>> if (req->flags & DRM_MODE_CURSOR_BO) {
>> @@ -3522,7 +3498,6 @@ EXPORT_SYMBOL(drm_object_property_get_value);
>> int drm_mode_getproperty_ioctl(struct drm_device *dev,
>> void *data, struct drm_file *file_priv)
>> {
>> - struct drm_mode_object *obj;
>> struct drm_mode_get_property *out_resp = data;
>> struct drm_property *property;
>> int enum_count = 0;
>> @@ -3541,12 +3516,11 @@ int drm_mode_getproperty_ioctl(struct drm_device *dev,
>> return -EINVAL;
>>
>> drm_modeset_lock_all(dev);
>> - obj = drm_mode_object_find(dev, out_resp->prop_id, DRM_MODE_OBJECT_PROPERTY);
>> - if (!obj) {
>> + property = drm_property_find(dev, out_resp->prop_id);
>> + if (!property) {
>> ret = -ENOENT;
>> goto done;
>> }
>> - property = obj_to_property(obj);
>>
>> if (drm_property_type_is(property, DRM_MODE_PROP_ENUM) ||
>> drm_property_type_is(property, DRM_MODE_PROP_BITMASK)) {
>> @@ -3676,7 +3650,6 @@ static void drm_property_destroy_blob(struct drm_device *dev,
>> int drm_mode_getblob_ioctl(struct drm_device *dev,
>> void *data, struct drm_file *file_priv)
>> {
>> - struct drm_mode_object *obj;
>> struct drm_mode_get_blob *out_resp = data;
>> struct drm_property_blob *blob;
>> int ret = 0;
>> @@ -3686,12 +3659,11 @@ int drm_mode_getblob_ioctl(struct drm_device *dev,
>> return -EINVAL;
>>
>> drm_modeset_lock_all(dev);
>> - obj = drm_mode_object_find(dev, out_resp->blob_id, DRM_MODE_OBJECT_BLOB);
>> - if (!obj) {
>> + blob = drm_property_blob_find(dev, out_resp->blob_id);
>> + if (!blob) {
>> ret = -ENOENT;
>> goto done;
>> }
>> - blob = obj_to_blob(obj);
>>
>> if (out_resp->length == blob->length) {
>> blob_ptr = (void __user *)(unsigned long)out_resp->data;
>> @@ -3898,7 +3870,6 @@ static int drm_mode_set_obj_prop_id(struct drm_device *dev,
>> uint32_t prop_id, uint64_t value, void *blob_data)
>> {
>> struct drm_mode_object *arg_obj;
>> - struct drm_mode_object *prop_obj;
>> struct drm_property *property;
>> int i;
>>
>> @@ -3915,11 +3886,9 @@ static int drm_mode_set_obj_prop_id(struct drm_device *dev,
>> if (i == arg_obj->properties->count)
>> return -EINVAL;
>>
>> - prop_obj = drm_mode_object_find(dev, prop_id,
>> - DRM_MODE_OBJECT_PROPERTY);
>> - if (!prop_obj)
>> + property = drm_property_find(dev, prop_id);
>> + if (!property)
>> return -ENOENT;
>> - property = obj_to_property(prop_obj);
>>
>> return drm_mode_set_obj_prop(arg_obj, state, property,
>> value, blob_data);
>> @@ -4126,7 +4095,6 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev,
>> void *data, struct drm_file *file_priv)
>> {
>> struct drm_mode_crtc_lut *crtc_lut = data;
>> - struct drm_mode_object *obj;
>> struct drm_crtc *crtc;
>> void *r_base, *g_base, *b_base;
>> int size;
>> @@ -4136,12 +4104,11 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev,
>> return -EINVAL;
>>
>> drm_modeset_lock_all(dev);
>> - obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC);
>> - if (!obj) {
>> + crtc = drm_crtc_find(dev, crtc_lut->crtc_id);
>> + if (!crtc) {
>> ret = -ENOENT;
>> goto out;
>> }
>> - crtc = obj_to_crtc(obj);
>>
>> if (crtc->funcs->gamma_set == NULL) {
>> ret = -ENOSYS;
>> @@ -4200,7 +4167,6 @@ int drm_mode_gamma_get_ioctl(struct drm_device *dev,
>> void *data, struct drm_file *file_priv)
>> {
>> struct drm_mode_crtc_lut *crtc_lut = data;
>> - struct drm_mode_object *obj;
>> struct drm_crtc *crtc;
>> void *r_base, *g_base, *b_base;
>> int size;
>> @@ -4210,12 +4176,11 @@ int drm_mode_gamma_get_ioctl(struct drm_device *dev,
>> return -EINVAL;
>>
>> drm_modeset_lock_all(dev);
>> - obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC);
>> - if (!obj) {
>> + crtc = drm_crtc_find(dev, crtc_lut->crtc_id);
>> + if (!crtc) {
>> ret = -ENOENT;
>> goto out;
>> }
>> - crtc = obj_to_crtc(obj);
>>
>> /* memcpy into gamma store */
>> if (crtc_lut->gamma_size != crtc->gamma_size) {
>> @@ -4268,7 +4233,6 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev,
>> void *data, struct drm_file *file_priv)
>> {
>> struct drm_mode_crtc_page_flip *page_flip = data;
>> - struct drm_mode_object *obj;
>> struct drm_crtc *crtc;
>> struct drm_framebuffer *fb = NULL, *old_fb = NULL;
>> struct drm_pending_vblank_event *e = NULL;
>> @@ -4282,10 +4246,9 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev,
>> if ((page_flip->flags & DRM_MODE_PAGE_FLIP_ASYNC) && !dev->mode_config.async_page_flip)
>> return -EINVAL;
>>
>> - obj = drm_mode_object_find(dev, page_flip->crtc_id, DRM_MODE_OBJECT_CRTC);
>> - if (!obj)
>> + crtc = drm_crtc_find(dev, page_flip->crtc_id);
>> + if (!crtc)
>> return -ENOENT;
>> - crtc = obj_to_crtc(obj);
>>
>> drm_modeset_lock(&crtc->mutex, NULL);
>> if (crtc->primary->fb == NULL) {
>> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
>> index cd4a61a..b940a29 100644
>> --- a/include/drm/drm_crtc.h
>> +++ b/include/drm/drm_crtc.h
>> @@ -1112,6 +1112,15 @@ extern int drm_format_vert_chroma_subsampling(uint32_t format);
>> extern const char *drm_get_format_name(uint32_t format);
>>
>> /* Helpers */
>> +
>> +static inline struct drm_plane *drm_plane_find(struct drm_device *dev,
>> + uint32_t id)
>> +{
>> + struct drm_mode_object *mo;
>> + mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_PLANE);
>> + return mo ? obj_to_plane(mo) : NULL;
>> +}
>> +
>> static inline struct drm_crtc *drm_crtc_find(struct drm_device *dev,
>> uint32_t id)
>> {
>> @@ -1128,6 +1137,30 @@ static inline struct drm_encoder *drm_encoder_find(struct drm_device *dev,
>> return mo ? obj_to_encoder(mo) : NULL;
>> }
>>
>> +static inline struct drm_connector *drm_connector_find(struct drm_device *dev,
>> + uint32_t id)
>> +{
>> + struct drm_mode_object *mo;
>> + mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_CONNECTOR);
>> + return mo ? obj_to_connector(mo) : NULL;
>> +}
>> +
>> +static inline struct drm_property *drm_property_find(struct drm_device *dev,
>> + uint32_t id)
>> +{
>> + struct drm_mode_object *mo;
>> + mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_PROPERTY);
>> + return mo ? obj_to_property(mo) : NULL;
>> +}
>> +
>> +static inline struct drm_property_blob *
>> +drm_property_blob_find(struct drm_device *dev, uint32_t id)
>> +{
>> + struct drm_mode_object *mo;
>> + mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_BLOB);
>> + return mo ? obj_to_blob(mo) : NULL;
>> +}
>> +
>> /* Plane list iterator for legacy (overlay only) planes. */
>> #define drm_for_each_legacy_plane(plane, planelist) \
>> list_for_each_entry(plane, planelist, head) \
>> --
>> 1.9.0
>>
>
> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> +41 (0) 79 365 57 48 - http://blog.ffwll.ch
More information about the dri-devel
mailing list