* [PATCH 5/5] CABC support for Panel PWM backlight control
@ 2016-03-28 9:40 Deepak M
0 siblings, 0 replies; 3+ messages in thread
From: Deepak M @ 2016-03-28 9:40 UTC (permalink / raw)
To: intel-gfx; +Cc: Deepak M
In CABC (Content Adaptive Brightness Control) content grey level
scale can be increased while simultaneously decreasing
brightness of the backlight to achieve same perceived brightness.
The CABC is not standardized and panel vendors are free to follow
their implementation. The CABC implementaion here assumes that the
panels use standard SW register for control.
CABC is supported only when the PWM source for backlight is
from the panel.
Signed-off-by: Deepak M <m.deepak@intel.com>
---
drivers/gpu/drm/i915/intel_dsi.c | 19 +++++++++++++++++++
drivers/gpu/drm/i915/intel_dsi.h | 3 +++
drivers/gpu/drm/i915/intel_dsi_panel_pwm.c | 30 ++++++++++++++++++++++++++++++
3 files changed, 52 insertions(+)
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index 1ba757a..a7b2949 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -1229,9 +1229,28 @@ void intel_dsi_init(struct drm_device *dev)
default:
intel_dsi->panel_pwm_dcs_ports = BIT(PORT_A) | BIT(PORT_C);
}
+
+ /*
+ * Based on the VBT value assign the ports on
+ * which CABC ON/OFF comands needs to be sent
+ */
+ switch (dev_priv->vbt.dsi.config->dl_cabc_ports) {
+ case CABC_PORT_A:
+ intel_dsi->cabc_dcs_ports = BIT(PORT_A);
+ break;
+ case CABC_PORT_C:
+ intel_dsi->cabc_dcs_ports = BIT(PORT_C);
+ break;
+ case CABC_PORT_A_AND_C:
+ intel_dsi->cabc_dcs_ports = BIT(PORT_A) | BIT(PORT_C);
+ break;
+ default:
+ intel_dsi->cabc_dcs_ports = BIT(PORT_A) | BIT(PORT_C);
+ }
} else {
intel_dsi->ports = BIT(port);
intel_dsi->panel_pwm_dcs_ports = BIT(port);
+ intel_dsi->cabc_dcs_ports = BIT(port);
}
/* Create a DSI host (and a device) for each port. */
diff --git a/drivers/gpu/drm/i915/intel_dsi.h b/drivers/gpu/drm/i915/intel_dsi.h
index dcd2265..322eebd 100644
--- a/drivers/gpu/drm/i915/intel_dsi.h
+++ b/drivers/gpu/drm/i915/intel_dsi.h
@@ -37,6 +37,9 @@
#define PANEL_PWM_PORT_A 0x00
#define PANEL_PWM_PORT_C 0x01
#define PANEL_PWM_PORT_A_AND_C 0x02
+#define CABC_PORT_A 0x00
+#define CABC_PORT_C 0x01
+#define CABC_PORT_A_AND_C 0x02
struct intel_dsi_host;
diff --git a/drivers/gpu/drm/i915/intel_dsi_panel_pwm.c b/drivers/gpu/drm/i915/intel_dsi_panel_pwm.c
index 4d7f0eb..5417f80 100644
--- a/drivers/gpu/drm/i915/intel_dsi_panel_pwm.c
+++ b/drivers/gpu/drm/i915/intel_dsi_panel_pwm.c
@@ -33,6 +33,11 @@
#define PANEL_PWM_DISP_DIMMING (1 << 3)
#define PANEL_PWM_BCTRL (1 << 5)
+#define CABC_OFF (0 << 0)
+#define CABC_USER_INTERFACE_IMAGE (1 << 0)
+#define CABC_STILL_PICTURE (2 << 0)
+#define CABC_VIDEO_MODE (3 << 0)
+
#define PANEL_PWM_MAX_VALUE 0xFF
static u32 panel_pwm_get_backlight(struct intel_connector *connector)
@@ -81,6 +86,8 @@ static void panel_pwm_set_backlight(struct intel_connector *connector, u32 level
static void panel_pwm_disable_backlight(struct intel_connector *connector)
{
+ struct drm_device *dev = connector->base.dev;
+ struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_encoder *encoder = connector->encoder;
struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
struct mipi_dsi_device *dsi_device;
@@ -89,6 +96,16 @@ static void panel_pwm_disable_backlight(struct intel_connector *connector)
panel_pwm_set_backlight(connector, 0);
+ if (dev_priv->vbt.dsi.config->cabc_supported) {
+ data = 0;
+ for_each_dsi_port(port, intel_dsi->cabc_dcs_ports) {
+ dsi_device = intel_dsi->dsi_hosts[port]->device;
+ data = CABC_OFF;
+ mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_POWER_SAVE,
+ &data, sizeof(data));
+ }
+ }
+
for_each_dsi_port(port, intel_dsi->panel_pwm_dcs_ports) {
dsi_device = intel_dsi->dsi_hosts[port]->device;
data &= ~PANEL_PWM_BKL_EN; /* Turn Off Backlight */
@@ -101,6 +118,8 @@ static void panel_pwm_disable_backlight(struct intel_connector *connector)
static void panel_pwm_enable_backlight(struct intel_connector *connector)
{
+ struct drm_device *dev = connector->base.dev;
+ struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_encoder *encoder = connector->encoder;
struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
struct intel_panel *panel = &connector->panel;
@@ -117,6 +136,17 @@ static void panel_pwm_enable_backlight(struct intel_connector *connector)
&data, sizeof(data));
}
+ if (dev_priv->vbt.dsi.config->cabc_supported) {
+ data = 0;
+ for_each_dsi_port(port, intel_dsi->cabc_dcs_ports) {
+ dsi_device = intel_dsi->dsi_hosts[port]->device;
+ /* Enabling CABC in still mode */
+ data = CABC_STILL_PICTURE;
+ mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_POWER_SAVE,
+ &data, sizeof(data));
+ }
+ }
+
panel_pwm_set_backlight(connector, panel->backlight.level);
}
--
1.9.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 3+ messages in thread* [PATCH 0/5] drm/i915: dsi dcs & cabc backlight control
@ 2016-03-29 15:01 Jani Nikula
2016-03-29 15:01 ` [PATCH 5/5] CABC support for Panel PWM " Jani Nikula
0 siblings, 1 reply; 3+ messages in thread
From: Jani Nikula @ 2016-03-29 15:01 UTC (permalink / raw)
To: intel-gfx, Deepak M; +Cc: jani.nikula
This is my review of [1].
BR,
Jani.
[1] https://patchwork.freedesktop.org/series/4993/
Deepak M (5):
drm: Add new DCS commands in the enum list
drm/i915: Parsing the PWM cntrl and CABC ON/OFF fields in VBT
drm/i915: Parse LFP brightness control field in VBT
drm/i915: Add DCS control for Panel PWM
CABC support for Panel PWM backlight control
drivers/gpu/drm/i915/Makefile | 1 +
drivers/gpu/drm/i915/i915_drv.h | 1 +
drivers/gpu/drm/i915/intel_bios.c | 19 +++
drivers/gpu/drm/i915/intel_bios.h | 16 ++-
drivers/gpu/drm/i915/intel_drv.h | 2 +
drivers/gpu/drm/i915/intel_dsi.c | 36 ++++-
drivers/gpu/drm/i915/intel_dsi.h | 4 +
drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c | 179 +++++++++++++++++++++++++
drivers/gpu/drm/i915/intel_panel.c | 4 +
drivers/gpu/drm/i915/intel_vbt_defs.h | 6 +
include/video/mipi_display.h | 8 ++
11 files changed, 273 insertions(+), 3 deletions(-)
create mode 100644 drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
--
2.1.4
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 5/5] CABC support for Panel PWM backlight control
2016-03-29 15:01 [PATCH 0/5] drm/i915: dsi dcs & cabc " Jani Nikula
@ 2016-03-29 15:01 ` Jani Nikula
0 siblings, 0 replies; 3+ messages in thread
From: Jani Nikula @ 2016-03-29 15:01 UTC (permalink / raw)
To: intel-gfx, Deepak M; +Cc: jani.nikula
From: Deepak M <m.deepak@intel.com>
In CABC (Content Adaptive Brightness Control) content grey level
scale can be increased while simultaneously decreasing
brightness of the backlight to achieve same perceived brightness.
The CABC is not standardized and panel vendors are free to follow
their implementation. The CABC implementaion here assumes that the
panels use standard SW register for control.
CABC is supported only when the PWM source for backlight is
from the panel.
v2 by Jani: rebase, renames, check cabc support earlier, etc.
Signed-off-by: Deepak M <m.deepak@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/intel_dsi.c | 17 +++++++++++++++++
drivers/gpu/drm/i915/intel_dsi.h | 1 +
drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c | 22 ++++++++++++++++++++++
3 files changed, 40 insertions(+)
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index 9326e9dcbe50..dc9c30ae9651 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -1235,11 +1235,28 @@ void intel_dsi_init(struct drm_device *dev)
intel_dsi->dcs_backlight_ports = BIT(PORT_A) | BIT(PORT_C);
break;
}
+
+ switch (dev_priv->vbt.dsi.config->dl_dcs_cabc_ports) {
+ case DL_DCS_PORT_A:
+ intel_dsi->dcs_cabc_ports = BIT(PORT_A);
+ break;
+ case DL_DCS_PORT_C:
+ intel_dsi->dcs_cabc_ports = BIT(PORT_C);
+ break;
+ default:
+ case DL_DCS_PORT_A_AND_C:
+ intel_dsi->dcs_cabc_ports = BIT(PORT_A) | BIT(PORT_C);
+ break;
+ }
} else {
intel_dsi->ports = BIT(port);
intel_dsi->dcs_backlight_ports = BIT(port);
+ intel_dsi->dcs_cabc_ports = BIT(port);
}
+ if (!dev_priv->vbt.dsi.config->cabc_supported)
+ intel_dsi->dcs_cabc_ports = 0;
+
/* Create a DSI host (and a device) for each port. */
for_each_dsi_port(port, intel_dsi->ports) {
struct intel_dsi_host *host;
diff --git a/drivers/gpu/drm/i915/intel_dsi.h b/drivers/gpu/drm/i915/intel_dsi.h
index efb07f45316f..6d84de30f289 100644
--- a/drivers/gpu/drm/i915/intel_dsi.h
+++ b/drivers/gpu/drm/i915/intel_dsi.h
@@ -80,6 +80,7 @@ struct intel_dsi {
u8 dual_link;
u16 dcs_backlight_ports;
+ u16 dcs_cabc_ports;
u8 pixel_overlap;
u32 port_bits;
diff --git a/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
index b41efa5cc315..850e1690f47c 100644
--- a/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
+++ b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
@@ -33,6 +33,12 @@
#define CONTROL_DISPLAY_DD (1 << 3)
#define CONTROL_DISPLAY_BL (1 << 2)
+#define POWER_SAVE_OFF (0 << 0)
+#define POWER_SAVE_LOW (1 << 0)
+#define POWER_SAVE_MEDIUM (2 << 0)
+#define POWER_SAVE_HIGH (3 << 0)
+#define POWER_SAVE_OUTDOOR_MODE (4 << 0)
+
#define PANEL_PWM_MAX_VALUE 0xFF
static u32 dcs_get_backlight(struct intel_connector *connector)
@@ -79,6 +85,14 @@ static void dcs_disable_backlight(struct intel_connector *connector)
dcs_set_backlight(connector, 0);
+ for_each_dsi_port(port, intel_dsi->dcs_cabc_ports) {
+ u8 cabc = POWER_SAVE_OFF;
+
+ dsi_device = intel_dsi->dsi_hosts[port]->device;
+ mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_POWER_SAVE,
+ &cabc, sizeof(cabc));
+ }
+
for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
u8 ctrl = 0;
@@ -120,6 +134,14 @@ static void dcs_enable_backlight(struct intel_connector *connector)
&ctrl, sizeof(ctrl));
}
+ for_each_dsi_port(port, intel_dsi->dcs_cabc_ports) {
+ u8 cabc = POWER_SAVE_MEDIUM;
+
+ dsi_device = intel_dsi->dsi_hosts[port]->device;
+ mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_POWER_SAVE,
+ &cabc, sizeof(cabc));
+ }
+
dcs_set_backlight(connector, panel->backlight.level);
}
--
2.1.4
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 1/5] drm: Add new DCS commands in the enum list
@ 2016-03-30 14:03 Jani Nikula
2016-03-30 14:03 ` [PATCH 5/5] CABC support for Panel PWM backlight control Jani Nikula
0 siblings, 1 reply; 3+ messages in thread
From: Jani Nikula @ 2016-03-30 14:03 UTC (permalink / raw)
To: intel-gfx
Cc: Andrzej Hajda, jani.nikula, David Airlie, dri-devel, Deepak M,
Thierry Reding, Daniel Vetter
From: Deepak M <m.deepak@intel.com>
Adding new DCS commands which are specified in the
DCS 1.3 spec related to CABC.
v2: Sorted the Macro`s by value (Andrzej)
v3 by Jani: sort all of enum, refer to MIPI DCS 1.3
Cc: Andrzej Hajda <a.hajda@samsung.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: David Airlie <airlied@linux.ie>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Daniel Vetter <daniel.vetter@intel.com>
Cc: <dri-devel@lists.freedesktop.org>
Suggested-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Deepak M <m.deepak@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
include/video/mipi_display.h | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/include/video/mipi_display.h b/include/video/mipi_display.h
index ddcc8ca7316b..19aa65a35546 100644
--- a/include/video/mipi_display.h
+++ b/include/video/mipi_display.h
@@ -115,6 +115,14 @@ enum {
MIPI_DCS_READ_MEMORY_CONTINUE = 0x3E,
MIPI_DCS_SET_TEAR_SCANLINE = 0x44,
MIPI_DCS_GET_SCANLINE = 0x45,
+ MIPI_DCS_SET_DISPLAY_BRIGHTNESS = 0x51, /* MIPI DCS 1.3 */
+ MIPI_DCS_GET_DISPLAY_BRIGHTNESS = 0x52, /* MIPI DCS 1.3 */
+ MIPI_DCS_WRITE_CONTROL_DISPLAY = 0x53, /* MIPI DCS 1.3 */
+ MIPI_DCS_GET_CONTROL_DISPLAY = 0x54, /* MIPI DCS 1.3 */
+ MIPI_DCS_WRITE_POWER_SAVE = 0x55, /* MIPI DCS 1.3 */
+ MIPI_DCS_GET_POWER_SAVE = 0x56, /* MIPI DCS 1.3 */
+ MIPI_DCS_SET_CABC_MIN_BRIGHTNESS = 0x5E, /* MIPI DCS 1.3 */
+ MIPI_DCS_GET_CABC_MIN_BRIGHTNESS = 0x5F, /* MIPI DCS 1.3 */
MIPI_DCS_READ_DDB_START = 0xA1,
MIPI_DCS_READ_DDB_CONTINUE = 0xA8,
};
--
2.1.4
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 3+ messages in thread* [PATCH 5/5] CABC support for Panel PWM backlight control
2016-03-30 14:03 [PATCH 1/5] drm: Add new DCS commands in the enum list Jani Nikula
@ 2016-03-30 14:03 ` Jani Nikula
0 siblings, 0 replies; 3+ messages in thread
From: Jani Nikula @ 2016-03-30 14:03 UTC (permalink / raw)
To: intel-gfx; +Cc: jani.nikula, Deepak M
From: Deepak M <m.deepak@intel.com>
In CABC (Content Adaptive Brightness Control) content grey level
scale can be increased while simultaneously decreasing
brightness of the backlight to achieve same perceived brightness.
The CABC is not standardized and panel vendors are free to follow
their implementation. The CABC implementaion here assumes that the
panels use standard SW register for control.
CABC is supported only when the PWM source for backlight is
from the panel.
v2 by Jani: rebase, renames, check cabc support earlier, etc.
Signed-off-by: Deepak M <m.deepak@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/intel_dsi.c | 17 +++++++++++++++++
drivers/gpu/drm/i915/intel_dsi.h | 1 +
drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c | 22 ++++++++++++++++++++++
3 files changed, 40 insertions(+)
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index 9326e9dcbe50..6982f0b7dd2d 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -1235,11 +1235,28 @@ void intel_dsi_init(struct drm_device *dev)
intel_dsi->dcs_backlight_ports = BIT(PORT_A) | BIT(PORT_C);
break;
}
+
+ switch (dev_priv->vbt.dsi.config->dl_dcs_cabc_ports) {
+ case DL_DCS_PORT_A:
+ intel_dsi->dcs_cabc_ports = BIT(PORT_A);
+ break;
+ case DL_DCS_PORT_C:
+ intel_dsi->dcs_cabc_ports = BIT(PORT_C);
+ break;
+ default:
+ case DL_DCS_PORT_A_AND_C:
+ intel_dsi->dcs_cabc_ports = BIT(PORT_A) | BIT(PORT_C);
+ break;
+ }
} else {
intel_dsi->ports = BIT(port);
intel_dsi->dcs_backlight_ports = BIT(port);
+ intel_dsi->dcs_cabc_ports = BIT(port);
}
+ if (!dev_priv->vbt.dsi.config->cabc_supported)
+ intel_dsi->dcs_cabc_ports = 0;
+
/* Create a DSI host (and a device) for each port. */
for_each_dsi_port(port, intel_dsi->ports) {
struct intel_dsi_host *host;
diff --git a/drivers/gpu/drm/i915/intel_dsi.h b/drivers/gpu/drm/i915/intel_dsi.h
index efb07f45316f..6d84de30f289 100644
--- a/drivers/gpu/drm/i915/intel_dsi.h
+++ b/drivers/gpu/drm/i915/intel_dsi.h
@@ -80,6 +80,7 @@ struct intel_dsi {
u8 dual_link;
u16 dcs_backlight_ports;
+ u16 dcs_cabc_ports;
u8 pixel_overlap;
u32 port_bits;
diff --git a/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
index bcc10c105c21..9ca74e84c857 100644
--- a/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
+++ b/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
@@ -33,6 +33,12 @@
#define CONTROL_DISPLAY_DD (1 << 3)
#define CONTROL_DISPLAY_BL (1 << 2)
+#define POWER_SAVE_OFF (0 << 0)
+#define POWER_SAVE_LOW (1 << 0)
+#define POWER_SAVE_MEDIUM (2 << 0)
+#define POWER_SAVE_HIGH (3 << 0)
+#define POWER_SAVE_OUTDOOR_MODE (4 << 0)
+
#define PANEL_PWM_MAX_VALUE 0xFF
static u32 dcs_get_backlight(struct intel_connector *connector)
@@ -79,6 +85,14 @@ static void dcs_disable_backlight(struct intel_connector *connector)
dcs_set_backlight(connector, 0);
+ for_each_dsi_port(port, intel_dsi->dcs_cabc_ports) {
+ u8 cabc = POWER_SAVE_OFF;
+
+ dsi_device = intel_dsi->dsi_hosts[port]->device;
+ mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_POWER_SAVE,
+ &cabc, sizeof(cabc));
+ }
+
for_each_dsi_port(port, intel_dsi->dcs_backlight_ports) {
u8 ctrl = 0;
@@ -120,6 +134,14 @@ static void dcs_enable_backlight(struct intel_connector *connector)
&ctrl, sizeof(ctrl));
}
+ for_each_dsi_port(port, intel_dsi->dcs_cabc_ports) {
+ u8 cabc = POWER_SAVE_MEDIUM;
+
+ dsi_device = intel_dsi->dsi_hosts[port]->device;
+ mipi_dsi_dcs_write(dsi_device, MIPI_DCS_WRITE_POWER_SAVE,
+ &cabc, sizeof(cabc));
+ }
+
dcs_set_backlight(connector, panel->backlight.level);
}
--
2.1.4
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2016-03-30 14:04 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-28 9:40 [PATCH 5/5] CABC support for Panel PWM backlight control Deepak M
-- strict thread matches above, loose matches on Subject: below --
2016-03-29 15:01 [PATCH 0/5] drm/i915: dsi dcs & cabc " Jani Nikula
2016-03-29 15:01 ` [PATCH 5/5] CABC support for Panel PWM " Jani Nikula
2016-03-30 14:03 [PATCH 1/5] drm: Add new DCS commands in the enum list Jani Nikula
2016-03-30 14:03 ` [PATCH 5/5] CABC support for Panel PWM backlight control Jani Nikula
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox