From patchwork Tue Jan 16 13:40:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Ivanov X-Patchwork-Id: 10167045 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id D5B5860325 for ; Tue, 16 Jan 2018 13:51:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B421B2870F for ; Tue, 16 Jan 2018 13:51:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id ADA1C28802; Tue, 16 Jan 2018 13:51:05 +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=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, T_DKIM_INVALID 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 F3F9628753 for ; Tue, 16 Jan 2018 13:50:29 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A425989EB4; Tue, 16 Jan 2018 13:50:28 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org X-Greylist: delayed 575 seconds by postgrey-1.36 at gabe; Tue, 16 Jan 2018 13:50:26 UTC Received: from forward103j.mail.yandex.net (forward103j.mail.yandex.net [5.45.198.246]) by gabe.freedesktop.org (Postfix) with ESMTPS id AF2B989E75 for ; Tue, 16 Jan 2018 13:50:26 +0000 (UTC) Received: from mxback10g.mail.yandex.net (mxback10g.mail.yandex.net [IPv6:2a02:6b8:0:1472:2741:0:8b7:171]) by forward103j.mail.yandex.net (Yandex) with ESMTP id 2424534C0E4D for ; Tue, 16 Jan 2018 16:40:46 +0300 (MSK) Received: from smtp3o.mail.yandex.net (smtp3o.mail.yandex.net [2a02:6b8:0:1a2d::27]) by mxback10g.mail.yandex.net (nwsmtp/Yandex) with ESMTP id sGxE7Hm9Bz-ekxeIPBC; Tue, 16 Jan 2018 16:40:46 +0300 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ya.ru; s=mail; t=1516110046; bh=PwQFWsFSZOtmX7Fx4RspODhF5S07sYGR+eLfUb4fkOs=; h=From:To:Subject:Date:Message-Id; b=sT3Zxcj/EDmzEEYPx6nU2olojOQy9jzXiBy4maTId2j/ABN5P9fbuhteARON5WiHW DBTn4pZwHDBUn4lVj9KJ2LkY8lo2/g6r3507OngwomJ58OJgTPBi8E0YL/pwQN30IJ OUl0uOmtFXUVVKx0EwPpJaX+ENyszWJd0h7SYnmo= Received: by smtp3o.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id Npie7WCGom-ejm8LJEL; Tue, 16 Jan 2018 16:40:45 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client certificate not present) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ya.ru; s=mail; t=1516110045; bh=PwQFWsFSZOtmX7Fx4RspODhF5S07sYGR+eLfUb4fkOs=; h=From:To:Subject:Date:Message-Id; b=A4Am4JnOYc7+Cku47aORTDIVDs07WtD2QM9tI4pjiNH4R8/cE5o83DO3DuD7jiqsq Py9BOa3iBQtsEGSKWPuKHZgWr4pTm22xYK/SvklWtWk5zqva9Wxc8AcZTtZ0bsPpas 43p0UX2A5mJx2g8NTkM3Ubq4EpbwGjknRqQOaJWU= Authentication-Results: smtp3o.mail.yandex.net; dkim=pass header.i=@ya.ru From: Alex Ivanov To: intel-gfx@lists.freedesktop.org Date: Tue, 16 Jan 2018 16:40:39 +0300 Message-Id: <20180116134039.24178-1-gnidorah@ya.ru> X-Mailer: git-send-email 2.15.1 Subject: [Intel-gfx] [PATCH] drm/i915: Allow user to override PWM backlight frequency and duty cycle 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-Virus-Scanned: ClamAV using ClamSMTP Since vendor may set bad defaults or user just generally may prefer her health over display life. 1. Allow overriding of PWM frequency otherwise people use solutions like http://devbraindom.blogspot.ru/2013/03/eliminate-led-screen-flicker-with-intel.html which are bad because I. frequency convertation logic varies from chip to chip, so people set totally wrong frequences in most cases II. writing to backlight control registers directly goes into conflict with i915 driver doing the same 2. Allow to override minimal brightness. Even if vendor limit was totally correct, it may be too bright to use in night, plus the default will become most likely wrong now, since frequency was overriden --- drivers/gpu/drm/i915/i915_params.c | 6 ++++++ drivers/gpu/drm/i915/i915_params.h | 2 ++ drivers/gpu/drm/i915/intel_panel.c | 17 +++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c index b4faeb6aa2bd..ba37257846b0 100644 --- a/drivers/gpu/drm/i915/i915_params.c +++ b/drivers/gpu/drm/i915/i915_params.c @@ -190,3 +190,9 @@ i915_param_named(enable_dpcd_backlight, bool, 0600, i915_param_named(enable_gvt, bool, 0400, "Enable support for Intel GVT-g graphics virtualization host support(default:false)"); + +i915_param_named_unsafe(backlight_freq, uint, 0400, + "Override PWM backlight frequency (set in Hz, 0=ignore [default])"); + +i915_param_named_unsafe(backlight_min_level, uint, 0400, + "Override PWM backlight minimum level (duty cycle, 0=ignore [default])"); diff --git a/drivers/gpu/drm/i915/i915_params.h b/drivers/gpu/drm/i915/i915_params.h index c7292268ed43..7aba85db3da2 100644 --- a/drivers/gpu/drm/i915/i915_params.h +++ b/drivers/gpu/drm/i915/i915_params.h @@ -53,6 +53,8 @@ param(int, edp_vswing, 0) \ param(int, reset, 2) \ param(unsigned int, inject_load_failure, 0) \ + param(unsigned int, backlight_freq, 0) \ + param(unsigned int, backlight_min_level, 0) \ /* leave bools at the end to not create holes */ \ param(bool, alpha_support, IS_ENABLED(CONFIG_DRM_I915_ALPHA_SUPPORT)) \ param(bool, enable_cmd_parser, true) \ diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index adc51e452e3e..f188d7c1d2de 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c @@ -1479,6 +1479,12 @@ static u32 get_backlight_min_vbt(struct intel_connector *connector) WARN_ON(panel->backlight.max == 0); + if (i915_modparams.backlight_min_level) { + DRM_DEBUG_KMS("Override backlight duty cycle %u\n", + i915_modparams.backlight_min_level); + return i915_modparams.backlight_min_level; + } + /* * XXX: If the vbt value is 255, it makes min equal to max, which leads * to problems. There are such machines out there. Either our @@ -1795,6 +1801,7 @@ int intel_panel_setup_backlight(struct drm_connector *connector, enum pipe pipe) struct intel_connector *intel_connector = to_intel_connector(connector); struct intel_panel *panel = &intel_connector->panel; int ret; + u32 pwm; if (!dev_priv->vbt.backlight.present) { if (dev_priv->quirks & QUIRK_BACKLIGHT_PRESENT) { @@ -1812,6 +1819,16 @@ int intel_panel_setup_backlight(struct drm_connector *connector, enum pipe pipe) /* set level and max in panel struct */ mutex_lock(&dev_priv->backlight_lock); ret = panel->backlight.setup(intel_connector, pipe); + if (i915_modparams.backlight_freq) { + if (panel->backlight.hz_to_pwm && + (pwm = panel->backlight.hz_to_pwm(intel_connector, i915_modparams.backlight_freq))) { + panel->backlight.max = pwm; + DRM_DEBUG_KMS("Override backlight frequency %u Hz\n", + i915_modparams.backlight_freq); + } else { + DRM_DEBUG_KMS("failed to override backlight frequency\n"); + } + } mutex_unlock(&dev_priv->backlight_lock); if (ret) {