From patchwork Mon Nov 12 17:32:41 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Ville Syrjala X-Patchwork-Id: 1729351 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by patchwork1.kernel.org (Postfix) with ESMTP id CDC0E3FCDE for ; Mon, 12 Nov 2012 17:36:35 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2C31E9F0F3 for ; Mon, 12 Nov 2012 09:36:35 -0800 (PST) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by gabe.freedesktop.org (Postfix) with ESMTP id D15589F302 for ; Mon, 12 Nov 2012 09:33:17 -0800 (PST) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP; 12 Nov 2012 09:33:17 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.80,764,1344236400"; d="scan'208";a="240805278" Received: from stinkbox.fi.intel.com (HELO stinkbox) ([10.237.72.168]) by orsmga002.jf.intel.com with SMTP; 12 Nov 2012 09:33:14 -0800 Received: by stinkbox (sSMTP sendmail emulation); Mon, 12 Nov 2012 19:33:14 +0200 From: ville.syrjala@linux.intel.com To: dri-devel@lists.freedesktop.org Subject: [PATCH 03/22] drm/i915: Refactor property handling in atomic code Date: Mon, 12 Nov 2012 19:32:41 +0200 Message-Id: <1352741580-12141-4-git-send-email-ville.syrjala@linux.intel.com> X-Mailer: git-send-email 1.7.8.6 In-Reply-To: <1352741580-12141-1-git-send-email-ville.syrjala@linux.intel.com> References: <1352741580-12141-1-git-send-email-ville.syrjala@linux.intel.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org Errors-To: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org From: Ville Syrjälä Move the property code around a bit to make it easier to move it out to the drm core later. Signed-off-by: Ville Syrjälä --- drivers/gpu/drm/i915/intel_atomic.c | 423 ++++++++++++++++++++--------------- drivers/gpu/drm/i915/intel_drv.h | 3 + include/drm/drm_crtc.h | 12 + 3 files changed, 252 insertions(+), 186 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_atomic.c b/drivers/gpu/drm/i915/intel_atomic.c index 41fd0d5..0e37cf5 100644 --- a/drivers/gpu/drm/i915/intel_atomic.c +++ b/drivers/gpu/drm/i915/intel_atomic.c @@ -1473,87 +1473,6 @@ static int intel_atomic_check(struct drm_device *dev, void *state) return 0; } -static void update_plane_props(struct drm_plane *plane) -{ - struct drm_mode_object *obj = &plane->base; - - drm_object_property_set_value(obj, prop_src_x, plane->src_x); - drm_object_property_set_value(obj, prop_src_y, plane->src_y); - drm_object_property_set_value(obj, prop_src_w, plane->src_w); - drm_object_property_set_value(obj, prop_src_h, plane->src_h); - - drm_object_property_set_value(obj, prop_crtc_x, plane->crtc_x); - drm_object_property_set_value(obj, prop_crtc_y, plane->crtc_y); - drm_object_property_set_value(obj, prop_crtc_w, plane->crtc_w); - drm_object_property_set_value(obj, prop_crtc_h, plane->crtc_h); - - drm_object_property_set_value(obj, prop_fb_id, plane->fb ? plane->fb->base.id : 0); - drm_object_property_set_value(obj, prop_crtc_id, plane->crtc ? plane->crtc->base.id : 0); -} - -static int update_prop_connector_ids(struct drm_crtc *crtc) -{ - struct drm_device *dev = crtc->dev; - struct drm_connector *connector; - uint64_t value = 0; - int i = 0; - uint32_t connector_ids[dev->mode_config.num_connector]; - - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { - if (connector->encoder && connector->encoder->crtc == crtc) - connector_ids[i++] = connector->base.id; - } - - if (i) { - drm_property_blob_replace_data(crtc->connector_ids_blob, - i * sizeof connector_ids[0], connector_ids); - value = crtc->connector_ids_blob->base.id; - } else - drm_property_blob_replace_data(crtc->connector_ids_blob, 0, NULL); - - drm_object_property_set_value(&crtc->base, prop_connector_ids, value); - - return 0; -} - -static int update_prop_mode(struct drm_crtc *crtc) -{ - uint64_t value = 0; - - if (crtc->enabled) { - struct drm_mode_modeinfo umode; - - drm_crtc_convert_to_umode(&umode, &crtc->mode); - drm_property_blob_replace_data(crtc->mode_blob, sizeof umode, &umode); - value = crtc->mode_blob->base.id; - } else - drm_property_blob_replace_data(crtc->mode_blob, 0, NULL); - - drm_object_property_set_value(&crtc->base, prop_mode, value); - - return 0; -} - -static void update_crtc_props(struct drm_crtc *crtc) -{ - struct drm_mode_object *obj = &crtc->base; - struct intel_crtc *intel_crtc = to_intel_crtc(crtc); - - drm_object_property_set_value(obj, prop_src_x, crtc->x); - drm_object_property_set_value(obj, prop_src_y, crtc->y); - - drm_object_property_set_value(obj, prop_fb_id, crtc->fb ? crtc->fb->base.id : 0); - - drm_object_property_set_value(obj, prop_cursor_id, intel_crtc->cursor_handle); - drm_object_property_set_value(obj, prop_cursor_x, intel_crtc->cursor_x); - drm_object_property_set_value(obj, prop_cursor_y, intel_crtc->cursor_y); - drm_object_property_set_value(obj, prop_cursor_w, intel_crtc->cursor_width); - drm_object_property_set_value(obj, prop_cursor_h, intel_crtc->cursor_height); - - update_prop_mode(crtc); - update_prop_connector_ids(crtc); -} - static void update_props(struct drm_device *dev, struct intel_atomic_state *s) { @@ -1565,7 +1484,7 @@ static void update_props(struct drm_device *dev, if (!st->fb_dirty && !st->mode_dirty) continue; - update_crtc_props(st->crtc); + intel_crtc_update_properties(st->crtc); } for (i = 0; i < dev->mode_config.num_plane; i++) { @@ -1574,7 +1493,7 @@ static void update_props(struct drm_device *dev, if (!st->dirty) continue; - update_plane_props(st->plane); + drm_plane_update_properties(st->plane); } } @@ -1829,32 +1748,6 @@ static const struct drm_atomic_funcs intel_atomic_funcs = { .end = intel_atomic_end, }; -static struct { - struct drm_property **prop; - const char *name; - uint64_t min; - uint64_t max; -} props[] = { - { &prop_src_x, "SRC_X", 0, UINT_MAX }, - { &prop_src_y, "SRC_Y", 0, UINT_MAX }, - { &prop_src_w, "SRC_W", 0, UINT_MAX }, - { &prop_src_h, "SRC_H", 0, UINT_MAX }, - - { &prop_crtc_x, "CRTC_X", INT_MIN, INT_MAX }, - { &prop_crtc_y, "CRTC_Y", INT_MIN, INT_MAX }, - { &prop_crtc_w, "CRTC_W", 0, INT_MAX }, - { &prop_crtc_h, "CRTC_H", 0, INT_MAX }, - - { &prop_fb_id, "FB_ID", 0, UINT_MAX }, - { &prop_crtc_id, "CRTC_ID", 0, UINT_MAX }, - - { &prop_cursor_id, "CURSOR_ID", 0, UINT_MAX }, - { &prop_cursor_w, "CURSOR_W", 0, UINT_MAX }, - { &prop_cursor_h, "CURSOR_H", 0, UINT_MAX }, - { &prop_cursor_x, "CURSOR_X", INT_MIN, INT_MAX }, - { &prop_cursor_y, "CURSOR_Y", INT_MIN, INT_MAX }, -}; - static void intel_flip_init(struct drm_device *dev); static void intel_flip_fini(struct drm_device *dev); @@ -1862,71 +1755,25 @@ int intel_atomic_init(struct drm_device *dev) { struct drm_crtc *crtc; struct drm_plane *plane; - int ret = -ENOMEM; - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(props); i++) { - *props[i].prop = - drm_property_create_range(dev, 0, props[i].name, - props[i].min, props[i].max); - if (!*props[i].prop) - goto out; - } - - /* FIXME create special object ID list property type? */ - prop_connector_ids = drm_property_create(dev, DRM_MODE_PROP_BLOB, "CONNECTOR_IDS", 0); - if (!prop_connector_ids) - goto out; + int ret; - prop_mode = drm_property_create(dev, DRM_MODE_PROP_BLOB, "MODE", 0); - if (!prop_mode) + ret = drm_mode_create_properties(dev); + if (ret) goto out; list_for_each_entry(plane, &dev->mode_config.plane_list, head) { - struct drm_mode_object *obj = &plane->base; - - drm_object_attach_property(obj, prop_src_x, 0); - drm_object_attach_property(obj, prop_src_y, 0); - drm_object_attach_property(obj, prop_src_w, 0); - drm_object_attach_property(obj, prop_src_h, 0); - - drm_object_attach_property(obj, prop_crtc_x, 0); - drm_object_attach_property(obj, prop_crtc_y, 0); - drm_object_attach_property(obj, prop_crtc_w, 0); - drm_object_attach_property(obj, prop_crtc_h, 0); - - drm_object_attach_property(obj, prop_fb_id, 0); - drm_object_attach_property(obj, prop_crtc_id, 0); - - update_plane_props(plane); + drm_plane_attach_properties(plane); + drm_plane_update_properties(plane); } list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { - struct drm_mode_object *obj = &crtc->base; - - drm_object_attach_property(obj, prop_src_x, 0); - drm_object_attach_property(obj, prop_src_y, 0); + intel_crtc_attach_properties(crtc); - drm_object_attach_property(obj, prop_fb_id, 0); - drm_object_attach_property(obj, prop_mode, 0); - drm_object_attach_property(obj, prop_connector_ids, 0); - - drm_object_attach_property(obj, prop_cursor_id, 0); - drm_object_attach_property(obj, prop_cursor_x, 0); - drm_object_attach_property(obj, prop_cursor_y, 0); - drm_object_attach_property(obj, prop_cursor_w, 0); - drm_object_attach_property(obj, prop_cursor_h, 0); - - crtc->mode_blob = drm_property_create_blob(dev, 0, sizeof(struct drm_mode_modeinfo), NULL); - if (!crtc->mode_blob) - goto out; - - crtc->connector_ids_blob = drm_property_create_blob(dev, 0, - dev->mode_config.num_connector * sizeof(uint32_t), NULL); - if (!crtc->connector_ids_blob) - goto out; + ret = drm_crtc_create_blobs(crtc); + if (ret) + goto destroy_props; - update_crtc_props(crtc); + intel_crtc_update_properties(crtc); } dev->driver->atomic_funcs = &intel_atomic_funcs; @@ -1935,12 +1782,9 @@ int intel_atomic_init(struct drm_device *dev) return 0; + destroy_props: + drm_mode_destroy_properties(dev); out: - drm_property_destroy(dev, prop_mode); - drm_property_destroy(dev, prop_connector_ids); - - while (i--) - drm_property_destroy(dev, *props[i].prop); return ret; } @@ -1952,24 +1796,10 @@ void intel_atomic_fini(struct drm_device *dev) intel_flip_fini(dev); list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { - drm_property_destroy_blob(dev, crtc->mode_blob); - drm_property_destroy_blob(dev, crtc->connector_ids_blob); + drm_crtc_destroy_blobs(crtc); } - drm_property_destroy(dev, prop_connector_ids); - drm_property_destroy(dev, prop_mode); - drm_property_destroy(dev, prop_crtc_id); - drm_property_destroy(dev, prop_fb_id); - - drm_property_destroy(dev, prop_crtc_h); - drm_property_destroy(dev, prop_crtc_w); - drm_property_destroy(dev, prop_crtc_y); - drm_property_destroy(dev, prop_crtc_x); - - drm_property_destroy(dev, prop_src_h); - drm_property_destroy(dev, prop_src_w); - drm_property_destroy(dev, prop_src_y); - drm_property_destroy(dev, prop_src_x); + drm_mode_destroy_properties(dev); } enum { @@ -2464,3 +2294,224 @@ void intel_atomic_clear_flips(struct drm_crtc *crtc) drm_flip_helper_clear(&intel_plane->flip_helper); } } + +static void drm_crtc_update_connector_ids_property(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_connector *connector; + uint64_t value = 0; + int i = 0; + uint32_t connector_ids[dev->mode_config.num_connector]; + + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + if (connector->encoder && connector->encoder->crtc == crtc) + connector_ids[i++] = connector->base.id; + } + + if (i) { + drm_property_blob_replace_data(crtc->connector_ids_blob, + i * sizeof connector_ids[0], connector_ids); + value = crtc->connector_ids_blob->base.id; + } else + drm_property_blob_replace_data(crtc->connector_ids_blob, 0, NULL); + + drm_object_property_set_value(&crtc->base, prop_connector_ids, value); +} + +static void drm_crtc_update_mode_property(struct drm_crtc *crtc) +{ + uint64_t value = 0; + + if (crtc->enabled) { + struct drm_mode_modeinfo umode; + + drm_crtc_convert_to_umode(&umode, &crtc->mode); + drm_property_blob_replace_data(crtc->mode_blob, sizeof umode, &umode); + value = crtc->mode_blob->base.id; + } else + drm_property_blob_replace_data(crtc->mode_blob, 0, NULL); + + drm_object_property_set_value(&crtc->base, prop_mode, value); +} + +void drm_crtc_update_properties(struct drm_crtc *crtc) +{ + struct drm_mode_object *obj = &crtc->base; + + drm_object_property_set_value(obj, prop_src_x, crtc->x); + drm_object_property_set_value(obj, prop_src_y, crtc->y); + drm_object_property_set_value(obj, prop_fb_id, crtc->fb ? crtc->fb->base.id : 0); + + drm_crtc_update_mode_property(crtc); + drm_crtc_update_connector_ids_property(crtc); +} + +void intel_crtc_update_properties(struct drm_crtc *crtc) +{ + struct drm_mode_object *obj = &crtc->base; + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + + drm_crtc_update_properties(crtc); + + drm_object_property_set_value(obj, prop_cursor_id, intel_crtc->cursor_handle); + drm_object_property_set_value(obj, prop_cursor_x, intel_crtc->cursor_x); + drm_object_property_set_value(obj, prop_cursor_y, intel_crtc->cursor_y); + drm_object_property_set_value(obj, prop_cursor_w, intel_crtc->cursor_width); + drm_object_property_set_value(obj, prop_cursor_h, intel_crtc->cursor_height); +} + +void drm_plane_update_properties(struct drm_plane *plane) +{ + struct drm_mode_object *obj = &plane->base; + + drm_object_property_set_value(obj, prop_src_x, plane->src_x); + drm_object_property_set_value(obj, prop_src_y, plane->src_y); + drm_object_property_set_value(obj, prop_src_w, plane->src_w); + drm_object_property_set_value(obj, prop_src_h, plane->src_h); + + drm_object_property_set_value(obj, prop_crtc_x, plane->crtc_x); + drm_object_property_set_value(obj, prop_crtc_y, plane->crtc_y); + drm_object_property_set_value(obj, prop_crtc_w, plane->crtc_w); + drm_object_property_set_value(obj, prop_crtc_h, plane->crtc_h); + + drm_object_property_set_value(obj, prop_fb_id, plane->fb ? plane->fb->base.id : 0); + drm_object_property_set_value(obj, prop_crtc_id, plane->crtc ? plane->crtc->base.id : 0); +} + +int drm_crtc_create_blobs(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + + crtc->mode_blob = drm_property_create_blob(dev, 0, sizeof(struct drm_mode_modeinfo), NULL); + if (!crtc->mode_blob) + return -ENOMEM; + + crtc->connector_ids_blob = drm_property_create_blob(dev, 0, dev->mode_config.num_connector * sizeof(uint32_t), NULL); + if (!crtc->connector_ids_blob) + return -ENOMEM; + + return 0; +} + +void drm_crtc_destroy_blobs(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + + drm_property_destroy_blob(dev, crtc->mode_blob); + drm_property_destroy_blob(dev, crtc->connector_ids_blob); +} + +void drm_mode_destroy_properties(struct drm_device *dev) +{ + drm_property_destroy(dev, prop_connector_ids); + drm_property_destroy(dev, prop_mode); + drm_property_destroy(dev, prop_crtc_id); + drm_property_destroy(dev, prop_fb_id); + + drm_property_destroy(dev, prop_crtc_h); + drm_property_destroy(dev, prop_crtc_w); + drm_property_destroy(dev, prop_crtc_y); + drm_property_destroy(dev, prop_crtc_x); + + drm_property_destroy(dev, prop_src_h); + drm_property_destroy(dev, prop_src_w); + drm_property_destroy(dev, prop_src_y); + drm_property_destroy(dev, prop_src_x); +} + +static struct { + struct drm_property **prop; + const char *name; + uint64_t min; + uint64_t max; +} props[] = { + { &prop_src_x, "SRC_X", 0, UINT_MAX }, + { &prop_src_y, "SRC_Y", 0, UINT_MAX }, + { &prop_src_w, "SRC_W", 0, UINT_MAX }, + { &prop_src_h, "SRC_H", 0, UINT_MAX }, + + { &prop_crtc_x, "CRTC_X", INT_MIN, INT_MAX }, + { &prop_crtc_y, "CRTC_Y", INT_MIN, INT_MAX }, + { &prop_crtc_w, "CRTC_W", 0, INT_MAX }, + { &prop_crtc_h, "CRTC_H", 0, INT_MAX }, + + { &prop_fb_id, "FB_ID", 0, UINT_MAX }, + { &prop_crtc_id, "CRTC_ID", 0, UINT_MAX }, + + { &prop_cursor_id, "CURSOR_ID", 0, UINT_MAX }, + { &prop_cursor_w, "CURSOR_W", 0, UINT_MAX }, + { &prop_cursor_h, "CURSOR_H", 0, UINT_MAX }, + { &prop_cursor_x, "CURSOR_X", INT_MIN, INT_MAX }, + { &prop_cursor_y, "CURSOR_Y", INT_MIN, INT_MAX }, +}; + +int drm_mode_create_properties(struct drm_device *dev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(props); i++) { + *props[i].prop = drm_property_create_range(dev, 0, props[i].name, props[i].min, props[i].max); + if (!*props[i].prop) + goto out; + } + + /* FIXME create special object ID list property type? */ + prop_connector_ids = drm_property_create(dev, DRM_MODE_PROP_BLOB, "CONNECTOR_IDS", 0); + if (!prop_connector_ids) + goto out; + + prop_mode = drm_property_create(dev, DRM_MODE_PROP_BLOB, "MODE", 0); + if (!prop_mode) + goto out; + + return 0; + + out: + drm_property_destroy(dev, prop_mode); + drm_property_destroy(dev, prop_connector_ids); + + while (i--) + drm_property_destroy(dev, *props[i].prop); + + return -ENOMEM; /* FIXME? */ +} + +void drm_plane_attach_properties(struct drm_plane *plane) +{ + struct drm_mode_object *obj = &plane->base; + + drm_object_attach_property(obj, prop_src_x, 0); + drm_object_attach_property(obj, prop_src_y, 0); + drm_object_attach_property(obj, prop_src_w, 0); + drm_object_attach_property(obj, prop_src_h, 0); + drm_object_attach_property(obj, prop_crtc_x, 0); + drm_object_attach_property(obj, prop_crtc_y, 0); + drm_object_attach_property(obj, prop_crtc_w, 0); + drm_object_attach_property(obj, prop_crtc_h, 0); + drm_object_attach_property(obj, prop_fb_id, 0); + drm_object_attach_property(obj, prop_crtc_id, 0); +} + +void drm_crtc_attach_properties(struct drm_crtc *crtc) +{ + struct drm_mode_object *obj = &crtc->base; + + drm_object_attach_property(obj, prop_src_x, 0); + drm_object_attach_property(obj, prop_src_y, 0); + drm_object_attach_property(obj, prop_fb_id, 0); + drm_object_attach_property(obj, prop_mode, 0); + drm_object_attach_property(obj, prop_connector_ids, 0); +} + +void intel_crtc_attach_properties(struct drm_crtc *crtc) +{ + struct drm_mode_object *obj = &crtc->base; + + drm_crtc_attach_properties(crtc); + + drm_object_attach_property(obj, prop_cursor_id, 0); + drm_object_attach_property(obj, prop_cursor_x, 0); + drm_object_attach_property(obj, prop_cursor_y, 0); + drm_object_attach_property(obj, prop_cursor_w, 0); + drm_object_attach_property(obj, prop_cursor_h, 0); +} diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 8580ddd..a229680 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -641,4 +641,7 @@ extern void intel_atomic_clear_flips(struct drm_crtc *crtc); extern void intel_enable_primary(struct drm_crtc *crtc); extern void intel_disable_primary(struct drm_crtc *crtc); +extern void intel_crtc_attach_properties(struct drm_crtc *crtc); +extern void intel_crtc_update_properties(struct drm_crtc *crtc); + #endif /* __INTEL_DRV_H__ */ diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index f37e8a7..13fb30a 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -1144,4 +1144,16 @@ struct drm_atomic_funcs { void (*end)(struct drm_device *dev, void *state); }; +extern int drm_mode_create_properties(struct drm_device *dev); +extern void drm_mode_destroy_properties(struct drm_device *dev); + +extern int drm_crtc_create_blobs(struct drm_crtc *crtc); +extern void drm_crtc_destroy_blobs(struct drm_crtc *crtc); + +extern void drm_crtc_attach_properties(struct drm_crtc *crtc); +extern void drm_plane_attach_properties(struct drm_plane *plane); + +extern void drm_crtc_update_properties(struct drm_crtc *crtc); +extern void drm_plane_update_properties(struct drm_plane *plane); + #endif /* __DRM_CRTC_H__ */