From patchwork Wed Dec 10 23:53:09 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Todd Previte X-Patchwork-Id: 5473341 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 86F38BEEBA for ; Wed, 10 Dec 2014 23:54:15 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id A995F2018E for ; Wed, 10 Dec 2014 23:54:14 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id BEA1B201C8 for ; Wed, 10 Dec 2014 23:54:13 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 37AC56E709; Wed, 10 Dec 2014 15:54:13 -0800 (PST) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-pa0-f45.google.com (mail-pa0-f45.google.com [209.85.220.45]) by gabe.freedesktop.org (Postfix) with ESMTP id AC4B16E709 for ; Wed, 10 Dec 2014 15:54:11 -0800 (PST) Received: by mail-pa0-f45.google.com with SMTP id lf10so3195679pab.4 for ; Wed, 10 Dec 2014 15:54:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=CzzRNwtZsb1WUezx99e+bnC1nBBmb7WEHTcqBC8W7Eg=; b=y8Q/ZYAOquj3p4ALWliZRenTjku2+196Ln2D2/iltMyrvf0aZTXciuJT5Bpr5n1U2S tTvORVbWObDJw5yzj0cTlmSqLaZG2YOA7MpfjipaRzD/SIIM3WG3ixzVqud6hu62hkNo XbBYhLAlGu6XjRVMYc+RnxHB5/F8dCtvXSE/MbmzJ7Tr0+jclIZa55IYYfJCThXutOK/ eqBWO0JfQNyI7LSibSHH24OJvVNQp/k+r6CM97m9TOjS7lMHkvZGISAR3vyhpon5U02A 5PstrCXVu/QAsZco6Sa1F/YAbMoWLtXlnoHqkaHMqqXYYXJLvZDLdnjGhdd0l7E1YSAm Gu+A== X-Received: by 10.70.103.74 with SMTP id fu10mr11581367pdb.53.1418255651483; Wed, 10 Dec 2014 15:54:11 -0800 (PST) Received: from localhost.localdomain (ip68-3-234-27.ph.ph.cox.net. [68.3.234.27]) by mx.google.com with ESMTPSA id gy10sm5164958pbd.67.2014.12.10.15.54.09 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Dec 2014 15:54:10 -0800 (PST) From: Todd Previte To: intel-gfx@lists.freedesktop.org Date: Wed, 10 Dec 2014 16:53:09 -0700 Message-Id: <1418255597-4716-10-git-send-email-tprevite@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1418255597-4716-1-git-send-email-tprevite@gmail.com> References: <1418255597-4716-1-git-send-email-tprevite@gmail.com> Subject: [Intel-gfx] [PATCH 09/17] drm/i915: Add config parsing utilities in debugfs for Displayport compliance X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, T_DKIM_INVALID, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch was previously part of "[PATCH 05/10] drm/i915: Add debugfs interface for Displayport debug and compliance testing". This patch adds two functions to handle parsing of Displayport configuration information as it formatted in the debugfs file. It is used to process incoming configuration changes from the userspace compliance application during testing. Signed-off-by: Todd Previte --- drivers/gpu/drm/i915/i915_debugfs.c | 128 ++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 184797d..55b6da5 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -3792,6 +3792,134 @@ int value_for_config_param(enum dp_config_param param, return status; } +int tokenize_dp_config(char *input_buffer, char *output[]) +{ + char *base = input_buffer, *index, *end; + int line_count = 0; + int i = 0, len = 0; + int done = 0; + + if (!input_buffer) + return 0; + + while (!done) { + index = strpbrk(base, ":"); + if (index) { + len = index - base; + *index = '\0'; + index++; + /* Save the type string */ + output[i] = base; + i++; + line_count++; + end = strpbrk(index, "\n\0"); + if (end) { + *end = '\0'; + /* Eat up whitespace */ + while (*index <= 0x20) + index++; + output[i] = index; + i++; + line_count++; + } else + done = 1; + /* Move to the next section of the string */ + base = end + 1; + } else + done = 1; + } + return line_count; +} + +static int displayport_parse_config(char *input_buffer, + ssize_t buffer_size, + struct intel_dp *intel_dp) +{ + int status = 0; + char *lines[MAX_DP_CONFIG_LINE_COUNT]; + int i = 0; + struct dp_config parms[DP_PARAMETER_COUNT]; + int line_count = 0; + char *buffer = input_buffer; + enum dp_config_param parm_type; + unsigned long parm_value; + + line_count = tokenize_dp_config(buffer, lines); + + if (line_count == 0) { + DRM_DEBUG_DRIVER("No lines to process\n"); + return 0; + } + + for (i = 0; i < line_count; i += 2) { + parm_type = displayport_get_config_param_type(lines[i]); + if (parm_type != DP_CONFIG_PARAM_INVALID) { + status = value_for_config_param(parm_type, + lines[i+1], + &parm_value); + if (status == 0) { + parms[parm_type].type = parm_type; + parms[parm_type].value = parm_value; + } + } + } + + if (parms[DP_CONFIG_PARAM_LINK_RATE].value == 0x06 || + parms[DP_CONFIG_PARAM_LINK_RATE].value == 0x0a || + parms[DP_CONFIG_PARAM_LINK_RATE].value == 0x14) { + intel_dp->compliance_config.link_rate = + parms[DP_CONFIG_PARAM_LINK_RATE].value; + } else + return -EINVAL; + + if (parms[DP_CONFIG_PARAM_LANE_COUNT].value == 0x01 || + parms[DP_CONFIG_PARAM_LANE_COUNT].value == 0x02 || + parms[DP_CONFIG_PARAM_LANE_COUNT].value == 0x04) { + intel_dp->compliance_config.lane_count = + parms[DP_CONFIG_PARAM_LANE_COUNT].value; + } else + return -EINVAL; + + if (parms[DP_CONFIG_PARAM_VOLTAGE_SWING].value <= 0x03 && + parms[DP_CONFIG_PARAM_VOLTAGE_SWING].value >= 0x00) { + intel_dp->compliance_config.vswing_level = + parms[DP_CONFIG_PARAM_VOLTAGE_SWING].value; + } else + return -EINVAL; + + if (parms[DP_CONFIG_PARAM_PREEMPHASIS].value <= 0x03 && + parms[DP_CONFIG_PARAM_PREEMPHASIS].value >= 0x00) { + intel_dp->compliance_config.preemp_level = + parms[DP_CONFIG_PARAM_PREEMPHASIS].value; + } else + return -EINVAL; + + if (parms[DP_CONFIG_PARAM_BPP].value == 18 || + parms[DP_CONFIG_PARAM_BPP].value == 24 || + parms[DP_CONFIG_PARAM_BPP].value == 30 || + parms[DP_CONFIG_PARAM_BPP].value == 36) { + intel_dp->compliance_config.bits_per_pixel = + parms[DP_CONFIG_PARAM_PREEMPHASIS].value; + } else + return -EINVAL; + + if (parms[DP_CONFIG_PARAM_HRES].value > 0 && + parms[DP_CONFIG_PARAM_HRES].value <= 8192) { + intel_dp->compliance_config.hres = + parms[DP_CONFIG_PARAM_HRES].value; + } else + return -EINVAL; + + if (parms[DP_CONFIG_PARAM_VRES].value > 0 && + parms[DP_CONFIG_PARAM_VRES].value <= 8192) { + intel_dp->compliance_config.vres = + parms[DP_CONFIG_PARAM_VRES].value; + } else + return -EINVAL; + + return status; +} + static int displayport_config_ctl_show(struct seq_file *m, void *data) { struct drm_device *dev = m->private;