> -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of Nemesa > Garg > Sent: Friday, October 27, 2023 3:24 PM > To: intel-gfx@xxxxxxxxxxxxxxxxxxxxx > Subject: [v2 1/2] drm/i915/display: Add support for darskscreen > detection > > Darkscreen detection checks if all the pixels of the frame are less then or equal > to the comparision value. The comparision value is set to 256 i.e black. So upon > getting black pixels from the pipe, the dark screen detect bit is set and an error > message will be printed. > > v2: Addressed review comments (Jani) > > Signed-off-by: Nemesa Garg <nemesa.garg@xxxxxxxxx> > --- > drivers/gpu/drm/i915/Makefile | 1 + > .../gpu/drm/i915/display/intel_darkscreen.c | 87 +++++++++++++++++++ > .../gpu/drm/i915/display/intel_darkscreen.h | 26 ++++++ > .../drm/i915/display/intel_display_types.h | 2 + > drivers/gpu/drm/i915/i915_reg.h | 8 ++ > 5 files changed, 124 insertions(+) > create mode 100644 drivers/gpu/drm/i915/display/intel_darkscreen.c > create mode 100644 drivers/gpu/drm/i915/display/intel_darkscreen.h > > diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile > index 88b2bb005014..538d5a42f9e3 100644 > --- a/drivers/gpu/drm/i915/Makefile > +++ b/drivers/gpu/drm/i915/Makefile > @@ -254,6 +254,7 @@ i915-y += \ > display/intel_crtc.o \ > display/intel_crtc_state_dump.o \ > display/intel_cursor.o \ > + display/intel_darkscreen.o \ > display/intel_display.o \ > display/intel_display_driver.o \ > display/intel_display_irq.o \ > diff --git a/drivers/gpu/drm/i915/display/intel_darkscreen.c > b/drivers/gpu/drm/i915/display/intel_darkscreen.c > new file mode 100644 > index 000000000000..0be719c76c4e > --- /dev/null > +++ b/drivers/gpu/drm/i915/display/intel_darkscreen.c > @@ -0,0 +1,87 @@ > +// SPDX-License-Identifier: MIT > +/* > + * Copyright © 2023 Intel Corporation > + * > + */ > + > +#include "i915_reg.h" > +#include "intel_de.h" > +#include "intel_display_types.h" > + > +#define COLOR_DEPTH_6BPC 6 > +#define COLOR_DEPTH_8BPC 8 > +#define COLOR_DEPTH_10BPC 10 > +#define COLOR_DEPTH_12BPC 12 > + > +#define COMPARE_VALUE_6_BPC 4 > +#define COMPARE_VALUE_8_BPC 16 > +#define COMPARE_VALUE_10_BPC 64 > +#define COMPARE_VALUE_12_BPC 256 > + > +#define COMPARE_VALUE_CALCULATION_FACTOR 12 > + > +/* > + * Checks the color format and compute the comapre value based on bpc. > + */ Can we have this in proper kernel doc format? > +void intel_dark_screen_enable(struct intel_crtc_state *crtc_state) { > + enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; > + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); > + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); > + u32 comparevalue; > + > + if (!crtc->dark_screen.enable) > + return; > + > + if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB) > + return; Better to have an error print saying not supported. Thanks and Regards, Arun R Murthy ------------------- > + > + switch (crtc_state->pipe_bpp / 3) { > + case COLOR_DEPTH_6BPC: > + comparevalue = COMPARE_VALUE_6_BPC; > + break; > + case COLOR_DEPTH_8BPC: > + comparevalue = COMPARE_VALUE_8_BPC; > + break; > + case COLOR_DEPTH_10BPC: > + comparevalue = COMPARE_VALUE_10_BPC; > + break; > + case COLOR_DEPTH_12BPC: > + comparevalue = COMPARE_VALUE_12_BPC; > + break; > + default: > + drm_dbg(&dev_priv->drm, > + "Bpc value is incorrect:%d\n", > + crtc_state->pipe_bpp / 3); > + return; > + } > + > + comparevalue = comparevalue << > + (COMPARE_VALUE_CALCULATION_FACTOR - crtc_state- > >pipe_bpp / 3); > + > + intel_de_write(dev_priv, DARK_SCREEN(cpu_transcoder), > + DARK_SCREEN_ENABLE | DARK_SCREEN_DETECT | > + DARK_SCREEN_DONE | > DARK_SCREEN_COMPARE_VAL(comparevalue)); > + > + intel_de_wait_for_set(dev_priv, > + DARK_SCREEN(crtc->config->cpu_transcoder), > DARK_SCREEN_DONE, > +1); > + > + if (intel_de_read(dev_priv, DARK_SCREEN(crtc->config- > >cpu_transcoder)) & > + DARK_SCREEN_DETECT) { > + drm_err(&dev_priv->drm, > + "Dark Screen detected:%c\n", > + pipe_name(crtc->pipe)); > + } > + > + intel_de_rmw(dev_priv, DARK_SCREEN(crtc->config->cpu_transcoder), > 1, DARK_SCREEN_DETECT | > + DARK_SCREEN_DONE); > +} > + > +void intel_dark_screen_disable(struct intel_crtc_state *crtc_state) { > + enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; > + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); > + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); > + > + intel_de_write(dev_priv, DARK_SCREEN(cpu_transcoder), 0); } > diff --git a/drivers/gpu/drm/i915/display/intel_darkscreen.h > b/drivers/gpu/drm/i915/display/intel_darkscreen.h > new file mode 100644 > index 000000000000..366e43499fc4 > --- /dev/null > +++ b/drivers/gpu/drm/i915/display/intel_darkscreen.h > @@ -0,0 +1,26 @@ > +/* SPDX-License-Identifier: MIT */ > +/* > + * Copyright © 2023 Intel Corporation > + * > + */ > + > +#ifndef __INTEL_DARKSCREEN_H__ > +#define __INTEL_DARKSCREEN_H__ > + > +#include <linux/types.h> > + > +struct intel_crtc_state; > +struct intel_crtc; > + > +struct intel_darkscreen { > + bool enable; > +}; > + > +#ifdef CONFIG_DEBUG_FS > +void intel_dark_screen_enable(struct intel_crtc_state *crtc_state); > +void intel_dark_screen_disable(struct intel_crtc_state *crtc_state); > +void intel_darkscreen_crtc_debugfs_add(struct intel_crtc *crtc); > + > +#endif > + > +#endif /* __INTEL_DARKSCREEN_H_ */ > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h > b/drivers/gpu/drm/i915/display/intel_display_types.h > index 65ea37fe8cff..bd0306e9318f 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_types.h > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h > @@ -49,6 +49,7 @@ > #include "i915_vma.h" > #include "i915_vma_types.h" > #include "intel_bios.h" > +#include "intel_darkscreen.h" > #include "intel_display.h" > #include "intel_display_limits.h" > #include "intel_display_power.h" > @@ -1517,6 +1518,7 @@ struct intel_crtc { > > #ifdef CONFIG_DEBUG_FS > struct intel_pipe_crc pipe_crc; > + struct intel_darkscreen dark_screen; > #endif > }; > > diff --git a/drivers/gpu/drm/i915/i915_reg.h > b/drivers/gpu/drm/i915/i915_reg.h index 135e8d8dbdf0..a9f7b80a56cf > 100644 > --- a/drivers/gpu/drm/i915/i915_reg.h > +++ b/drivers/gpu/drm/i915/i915_reg.h > @@ -2097,6 +2097,14 @@ > #define TRANS_PUSH_EN REG_BIT(31) > #define TRANS_PUSH_SEND REG_BIT(30) > > +#define _DARK_SCREEN_PIPE_A 0x60120 > +#define DARK_SCREEN(trans) _MMIO_TRANS2(trans, > _DARK_SCREEN_PIPE_A) > +#define DARK_SCREEN_ENABLE REG_BIT(31) > +#define DARK_SCREEN_DETECT REG_BIT(29) > +#define DARK_SCREEN_DONE REG_BIT(28) > +#define DARK_SCREEN_COMPARE_MASK REG_GENMASK(9, 0) > +#define DARK_SCREEN_COMPARE_VAL(x) > REG_FIELD_PREP(DARK_SCREEN_COMPARE_MASK, (x)) > + > /* VGA port control */ > #define ADPA _MMIO(0x61100) > #define PCH_ADPA _MMIO(0xe1100) > -- > 2.25.1