From patchwork Mon Feb 18 19:50:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Ville Syrjala X-Patchwork-Id: 10818729 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 720C8139A for ; Mon, 18 Feb 2019 19:50:59 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5DBDD2BAD5 for ; Mon, 18 Feb 2019 19:50:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4F69A2BAD7; Mon, 18 Feb 2019 19:50:59 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id D843D2BAD5 for ; Mon, 18 Feb 2019 19:50:58 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 4271A89203; Mon, 18 Feb 2019 19:50:57 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by gabe.freedesktop.org (Postfix) with ESMTPS id F3D3B89203 for ; Mon, 18 Feb 2019 19:50:55 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 18 Feb 2019 11:50:55 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,385,1544515200"; d="scan'208";a="117161887" Received: from stinkbox.fi.intel.com (HELO stinkbox) ([10.237.72.174]) by orsmga006.jf.intel.com with SMTP; 18 Feb 2019 11:50:53 -0800 Received: by stinkbox (sSMTP sendmail emulation); Mon, 18 Feb 2019 21:50:52 +0200 From: Ville Syrjala To: intel-gfx@lists.freedesktop.org Date: Mon, 18 Feb 2019 21:50:51 +0200 Message-Id: <20190218195052.1729-1-ville.syrjala@linux.intel.com> X-Mailer: git-send-email 2.19.2 MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH xf86-video-intel 1/2] sna: Refactor property parsing X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP From: Ville Syrjälä Generalize the code that parses the plane properties to be useable for crtc (or any kms object) properties as well. Cc: Mario Kleiner Signed-off-by: Ville Syrjälä --- src/sna/sna_display.c | 67 +++++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 19 deletions(-) diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c index fe67f85b62f1..916cc3c04e07 100644 --- a/src/sna/sna_display.c +++ b/src/sna/sna_display.c @@ -215,6 +215,7 @@ struct sna_crtc { uint32_t rotation; struct plane { uint32_t id; + uint32_t type; struct { uint32_t prop; uint32_t supported; @@ -3391,33 +3392,40 @@ void sna_crtc_set_sprite_colorspace(xf86CrtcPtr crtc, p->color_encoding.values[colorspace]); } -static int plane_details(struct sna *sna, struct plane *p) +typedef void (*parse_prop_func)(struct sna *sna, + struct drm_mode_get_property *prop, + uint64_t value, + void *data); +static void parse_props(struct sna *sna, + uint32_t obj_type, uint32_t obj_id, + parse_prop_func parse_prop, + void *data) { #define N_STACK_PROPS 32 /* must be a multiple of 2 */ struct local_mode_obj_get_properties arg; uint64_t stack[N_STACK_PROPS + N_STACK_PROPS/2]; uint64_t *values = stack; uint32_t *props = (uint32_t *)(values + N_STACK_PROPS); - int i, type = DRM_PLANE_TYPE_OVERLAY; + int i; memset(&arg, 0, sizeof(struct local_mode_obj_get_properties)); - arg.obj_id = p->id; - arg.obj_type = LOCAL_MODE_OBJECT_PLANE; + arg.obj_id = obj_id; + arg.obj_type = obj_type; arg.props_ptr = (uintptr_t)props; arg.prop_values_ptr = (uintptr_t)values; arg.count_props = N_STACK_PROPS; if (drmIoctl(sna->kgem.fd, LOCAL_IOCTL_MODE_OBJ_GETPROPERTIES, &arg)) - return -1; + return; DBG(("%s: object %d (type %x) has %d props\n", __FUNCTION__, - p->id, LOCAL_MODE_OBJECT_PLANE, arg.count_props)); + obj_id, obj_type, arg.count_props)); if (arg.count_props > N_STACK_PROPS) { values = malloc(2*sizeof(uint64_t)*arg.count_props); if (values == NULL) - return -1; + return; props = (uint32_t *)(values + arg.count_props); @@ -3444,25 +3452,46 @@ static int plane_details(struct sna *sna, struct plane *p) DBG(("%s: prop[%d] .id=%ld, .name=%s, .flags=%x, .value=%ld\n", __FUNCTION__, i, (long)props[i], prop.name, (unsigned)prop.flags, (long)values[i])); - if (strcmp(prop.name, "type") == 0) { - type = values[i]; - } else if (prop_is_rotation(&prop)) { - parse_rotation_prop(sna, p, &prop, values[i]); - } else if (prop_is_color_encoding(&prop)) { - parse_color_encoding_prop(sna, p, &prop, values[i]); - } + parse_prop(sna, &prop, values[i], data); } + if (values != stack) + free(values); + +#undef N_STACK_PROPS +} + +static bool prop_is_type(const struct drm_mode_get_property *prop) +{ + return prop_has_type_and_name(prop, 1, "type"); +} + +static void plane_parse_prop(struct sna *sna, + struct drm_mode_get_property *prop, + uint64_t value, void *data) +{ + struct plane *p = data; + + if (prop_is_type(prop)) + p->type = value; + else if (prop_is_rotation(prop)) + parse_rotation_prop(sna, p, prop, value); + else if (prop_is_color_encoding(prop)) + parse_color_encoding_prop(sna, p, prop, value); +} + +static int plane_details(struct sna *sna, struct plane *p) +{ + parse_props(sna, LOCAL_MODE_OBJECT_PLANE, p->id, + plane_parse_prop, p); + p->rotation.supported &= DBG_NATIVE_ROTATION; if (!xf86ReturnOptValBool(sna->Options, OPTION_ROTATION, TRUE)) p->rotation.supported = RR_Rotate_0; - if (values != stack) - free(values); + DBG(("%s: plane=%d type=%d\n", __FUNCTION__, p->id, p->type)); - DBG(("%s: plane=%d type=%d\n", __FUNCTION__, p->id, type)); - return type; -#undef N_STACK_PROPS + return p->type; } static void add_sprite_plane(struct sna_crtc *crtc,