From: Arun R Murthy <arun.r.murthy@intel.com>
To: intel-xe@lists.freedesktop.org, intel-gfx@lists.freedesktop.org,
dri-devel@lists.freedesktop.org
Cc: Arun R Murthy <arun.r.murthy@intel.com>
Subject: [PATCHv5 4/8] drm/i915/histogram: histogram interrupt handling
Date: Thu, 21 Nov 2024 17:55:59 +0530 [thread overview]
Message-ID: <20241121122603.736267-5-arun.r.murthy@intel.com> (raw)
In-Reply-To: <20241121122603.736267-1-arun.r.murthy@intel.com>
Upon enabling histogram an interrupt is trigerred after the generation
of the statistics. This patch registers the histogram interrupt and
handles the interrupt.
v2: Added intel_crtc backpointer to intel_histogram struct (Jani)
Removed histogram_wq and instead use dev_priv->unodered_eq (Jani)
v3: Replaced drm_i915_private with intel_display (Suraj)
Refactored the histogram read code (Jani)
v4: Rebased after addressing comments on patch 1
v5: removed the retry logic and moved to patch7 (Jani)
Signed-off-by: Arun R Murthy <arun.r.murthy@intel.com>
---
.../gpu/drm/i915/display/intel_display_irq.c | 6 +-
.../gpu/drm/i915/display/intel_histogram.c | 87 ++++++++++++++++++-
.../gpu/drm/i915/display/intel_histogram.h | 3 +
drivers/gpu/drm/i915/i915_reg.h | 5 +-
4 files changed, 96 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.c b/drivers/gpu/drm/i915/display/intel_display_irq.c
index f0d3bdb5fc60..cb60c9db4418 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.c
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.c
@@ -20,6 +20,7 @@
#include "intel_fdi_regs.h"
#include "intel_fifo_underrun.h"
#include "intel_gmbus.h"
+#include "intel_histogram.h"
#include "intel_hotplug_irq.h"
#include "intel_pipe_crc_regs.h"
#include "intel_pmdemand.h"
@@ -1179,6 +1180,9 @@ void gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
if (iir & GEN8_PIPE_FIFO_UNDERRUN)
intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe);
+ if (iir & GEN9_PIPE_HISTOGRAM_EVENT)
+ intel_histogram_irq_handler(display, pipe);
+
fault_errors = iir & gen8_de_pipe_fault_mask(dev_priv);
if (fault_errors)
drm_err_ratelimited(&dev_priv->drm,
@@ -1764,7 +1768,7 @@ void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)
struct intel_uncore *uncore = &dev_priv->uncore;
u32 de_pipe_masked = gen8_de_pipe_fault_mask(dev_priv) |
- GEN8_PIPE_CDCLK_CRC_DONE;
+ GEN8_PIPE_CDCLK_CRC_DONE | GEN9_PIPE_HISTOGRAM_EVENT;
u32 de_pipe_enables;
u32 de_port_masked = gen8_de_port_aux_mask(dev_priv);
u32 de_port_enables;
diff --git a/drivers/gpu/drm/i915/display/intel_histogram.c b/drivers/gpu/drm/i915/display/intel_histogram.c
index b2dda88a8093..243469c8ea80 100644
--- a/drivers/gpu/drm/i915/display/intel_histogram.c
+++ b/drivers/gpu/drm/i915/display/intel_histogram.c
@@ -19,7 +19,7 @@
#define HISTOGRAM_GUARDBAND_THRESHOLD_DEFAULT 300
/* Precision factor for threshold guardband */
#define HISTOGRAM_GUARDBAND_PRECISION_FACTOR 10000
-#define HISTOGRAM_DEFAULT_GUARDBAND_DELAY 0x04
+#define HISTOGRAM_BIN_READ_RETRY_COUNT 5
struct intel_histogram {
struct intel_crtc *crtc;
@@ -29,6 +29,84 @@ struct intel_histogram {
u32 bin_data[HISTOGRAM_BIN_COUNT];
};
+static bool intel_histogram_get_data(struct intel_crtc *intel_crtc)
+{
+ struct intel_display *display = to_intel_display(intel_crtc);
+ struct intel_histogram *histogram = intel_crtc->histogram;
+ int index;
+ u32 dpstbin;
+
+ for (index = 0; index < ARRAY_SIZE(histogram->bin_data); index++) {
+ dpstbin = intel_de_read(display, DPST_BIN(intel_crtc->pipe));
+ if (!(dpstbin & DPST_BIN_BUSY)) {
+ histogram->bin_data[index] = dpstbin & DPST_BIN_DATA_MASK;
+ } else
+ return false;
+ }
+ return true;
+}
+
+static void intel_histogram_handle_int_work(struct work_struct *work)
+{
+ struct intel_histogram *histogram = container_of(work,
+ struct intel_histogram, work.work);
+ struct intel_crtc *intel_crtc = histogram->crtc;
+ struct intel_display *display = to_intel_display(intel_crtc);
+ char event[] = "HISTOGRAM=1", pipe_id[21];
+ char *histogram_event[] = { event, pipe_id, NULL };
+ int retry;
+
+ snprintf(pipe_id, sizeof(pipe_id),
+ "PIPE=%u", intel_crtc->base.base.id);
+
+ /*
+ * TODO: PSR to be exited while reading the Histogram data
+ * Set DPST_CTL Bin Reg function select to TC
+ * Set DPST_CTL Bin Register Index to 0
+ */
+ intel_de_rmw(display, DPST_CTL(intel_crtc->pipe),
+ DPST_CTL_BIN_REG_FUNC_SEL | DPST_CTL_BIN_REG_MASK, 0);
+ for (retry = 0; retry < HISTOGRAM_BIN_READ_RETRY_COUNT; retry++) {
+ if (intel_histogram_get_data(intel_crtc)) {
+ /* Notify user for Histogram rediness */
+ if (kobject_uevent_env(&display->drm->primary->kdev->kobj,
+ KOBJ_CHANGE, histogram_event))
+ drm_err(display->drm,
+ "sending HISTOGRAM event failed\n");
+ break;
+ }
+ }
+ if (retry >= HISTOGRAM_BIN_READ_RETRY_COUNT) {
+ drm_err(display->drm, "Histogram bin read failed with max retry\n");
+ return;
+ }
+
+ /* Enable histogram interrupt */
+ intel_de_rmw(display, DPST_GUARD(intel_crtc->pipe), DPST_GUARD_HIST_INT_EN,
+ DPST_GUARD_HIST_INT_EN);
+
+ /* Clear histogram interrupt by setting histogram interrupt status bit*/
+ intel_de_rmw(display, DPST_GUARD(intel_crtc->pipe),
+ DPST_GUARD_HIST_EVENT_STATUS, 1);
+}
+
+void intel_histogram_irq_handler(struct intel_display *display, enum pipe pipe)
+{
+ struct intel_crtc *intel_crtc =
+ to_intel_crtc(drm_crtc_from_index(display->drm, pipe));
+ struct intel_histogram *histogram = intel_crtc->histogram;
+ struct drm_i915_private *i915 = to_i915(intel_crtc->base.dev);
+
+ if (!histogram->enable) {
+ drm_err(display->drm,
+ "spurious interrupt, histogram not enabled\n");
+ return;
+ }
+
+ queue_delayed_work(i915->unordered_wq,
+ &histogram->work, 0);
+}
+
int intel_histogram_atomic_check(struct intel_crtc *intel_crtc)
{
struct intel_histogram *histogram = intel_crtc->histogram;
@@ -81,7 +159,7 @@ static int intel_histogram_enable(struct intel_crtc *intel_crtc)
DPST_GUARD_THRESHOLD_GB_MASK |
DPST_GUARD_INTERRUPT_DELAY_MASK | DPST_GUARD_HIST_INT_EN,
DPST_GUARD_THRESHOLD_GB(gbandthreshold) |
- DPST_GUARD_INTERRUPT_DELAY(HISTOGRAM_DEFAULT_GUARDBAND_DELAY) |
+ DPST_GUARD_INTERRUPT_DELAY(0x04) |
DPST_GUARD_HIST_INT_EN);
/* Clear pending interrupts has to be done on separate write */
@@ -114,6 +192,7 @@ static void intel_histogram_disable(struct intel_crtc *intel_crtc)
intel_de_rmw(display, DPST_CTL(pipe),
DPST_CTL_IE_HIST_EN, 0);
+ cancel_delayed_work(&histogram->work);
histogram->enable = false;
}
@@ -169,6 +248,7 @@ void intel_histogram_finish(struct intel_crtc *intel_crtc)
{
struct intel_histogram *histogram = intel_crtc->histogram;
+ cancel_delayed_work_sync(&histogram->work);
kfree(histogram);
}
@@ -186,5 +266,8 @@ int intel_histogram_init(struct intel_crtc *intel_crtc)
histogram->crtc = intel_crtc;
histogram->can_enable = false;
+ INIT_DEFERRABLE_WORK(&histogram->work,
+ intel_histogram_handle_int_work);
+
return 0;
}
diff --git a/drivers/gpu/drm/i915/display/intel_histogram.h b/drivers/gpu/drm/i915/display/intel_histogram.h
index 9d66724f9c53..14f2425e3038 100644
--- a/drivers/gpu/drm/i915/display/intel_histogram.h
+++ b/drivers/gpu/drm/i915/display/intel_histogram.h
@@ -9,6 +9,8 @@
#include <linux/types.h>
struct intel_crtc;
+struct intel_display;
+enum pipe;
#define HISTOGRAM_BIN_COUNT 32
#define HISTOGRAM_IET_LENGTH 33
@@ -27,6 +29,7 @@ enum intel_global_hist_lut {
};
int intel_histogram_atomic_check(struct intel_crtc *intel_crtc);
+void intel_histogram_irq_handler(struct intel_display *display, enum pipe pipe);
int intel_histogram_update(struct intel_crtc *intel_crtc, bool enable);
int intel_histogram_set_iet_lut(struct intel_crtc *intel_crtc, u32 *data);
int intel_histogram_init(struct intel_crtc *intel_crtc);
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 7a35be56b7ef..40a7c6a77bcc 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -1605,7 +1605,7 @@
#define PIPE_HOTPLUG_INTERRUPT_ENABLE (1UL << 26)
#define PIPE_VSYNC_INTERRUPT_ENABLE (1UL << 25)
#define PIPE_DISPLAY_LINE_COMPARE_ENABLE (1UL << 24)
-#define PIPE_DPST_EVENT_ENABLE (1UL << 23)
+#define PIPE_HISTOGRAM_EVENT_ENABLE (1UL << 23)
#define SPRITE0_FLIP_DONE_INT_EN_VLV (1UL << 22)
#define PIPE_LEGACY_BLC_EVENT_ENABLE (1UL << 22)
#define PIPE_ODD_FIELD_INTERRUPT_ENABLE (1UL << 21)
@@ -1628,7 +1628,7 @@
#define PIPE_HOTPLUG_INTERRUPT_STATUS (1UL << 10)
#define PIPE_VSYNC_INTERRUPT_STATUS (1UL << 9)
#define PIPE_DISPLAY_LINE_COMPARE_STATUS (1UL << 8)
-#define PIPE_DPST_EVENT_STATUS (1UL << 7)
+#define PIPE_HISTOGRAM_EVENT_STATUS (1UL << 7)
#define PIPE_A_PSR_STATUS_VLV (1UL << 6)
#define PIPE_LEGACY_BLC_EVENT_STATUS (1UL << 6)
#define PIPE_ODD_FIELD_INTERRUPT_STATUS (1UL << 5)
@@ -2470,6 +2470,7 @@
#define GEN12_DSB_1_INT REG_BIT(14) /* tgl+ */
#define GEN12_DSB_0_INT REG_BIT(13) /* tgl+ */
#define GEN12_DSB_INT(dsb_id) REG_BIT(13 + (dsb_id))
+#define GEN9_PIPE_HISTOGRAM_EVENT REG_BIT(12) /* skl+ */
#define GEN9_PIPE_CURSOR_FAULT REG_BIT(11) /* skl+ */
#define GEN9_PIPE_PLANE4_FAULT REG_BIT(10) /* skl+ */
#define GEN8_PIPE_CURSOR_FAULT REG_BIT(10) /* bdw */
--
2.25.1
next prev parent reply other threads:[~2024-11-21 12:35 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-21 12:25 [PATCH 0/8] Display Global Histogram Arun R Murthy
2024-11-21 12:25 ` [PATCHv2 1/8] drm/i915/histogram: Define registers for histogram Arun R Murthy
2024-11-21 12:25 ` [PATCHv5 2/8] drm/i915/histogram: Add support " Arun R Murthy
2024-11-21 13:44 ` Kandpal, Suraj
2024-11-21 14:22 ` Murthy, Arun R
2024-11-21 12:25 ` [PATCH 3/8] drm/xe: Add histogram support to Xe builds Arun R Murthy
2024-11-21 12:25 ` Arun R Murthy [this message]
2024-11-21 12:26 ` [PATCHv6 5/8] drm/i915/histogram: Add crtc properties for global histogram Arun R Murthy
2024-11-21 23:13 ` Dmitry Baryshkov
2024-11-22 4:24 ` Murthy, Arun R
2024-11-22 8:09 ` Dmitry Baryshkov
2024-11-22 8:19 ` Murthy, Arun R
2024-11-25 8:14 ` Murthy, Arun R
2024-11-21 12:26 ` [PATCHv2 6/8] drm/i915/histogram: histogram delay counter doesnt reset Arun R Murthy
2024-11-21 14:13 ` Kandpal, Suraj
2024-11-21 12:26 ` [PATCHv6 7/8] drm/i915/histogram: Histogram changes for Display 20+ Arun R Murthy
2024-11-21 14:09 ` Kandpal, Suraj
2024-11-21 14:39 ` Murthy, Arun R
2024-11-22 8:06 ` Kandpal, Suraj
2024-11-22 8:18 ` Murthy, Arun R
2024-11-23 4:55 ` Kandpal, Suraj
2024-11-21 12:26 ` [PATCH 8/8] drm/i915/histogram: Enable pipe dithering Arun R Murthy
2024-11-21 13:07 ` ✓ CI.Patch_applied: success for Display Global Histogram (rev4) Patchwork
2024-11-21 13:07 ` ✗ CI.checkpatch: warning " Patchwork
2024-11-21 13:09 ` ✓ CI.KUnit: success " Patchwork
2024-11-21 13:26 ` ✓ CI.Build: " Patchwork
2024-11-21 13:29 ` ✗ CI.Hooks: failure " Patchwork
2024-11-21 13:30 ` ✗ CI.checksparse: warning " Patchwork
2024-11-21 13:33 ` ✗ Fi.CI.CHECKPATCH: warning for Display Global Histogram (rev7) Patchwork
2024-11-21 13:33 ` ✗ Fi.CI.SPARSE: " Patchwork
2024-11-21 13:40 ` [PATCH 0/8] Display Global Histogram Daniel Stone
2024-11-21 14:13 ` Murthy, Arun R
2024-11-21 13:50 ` ✓ Xe.CI.BAT: success for Display Global Histogram (rev4) Patchwork
2024-11-21 19:02 ` ✗ Xe.CI.Full: failure " Patchwork
2024-11-25 8:15 ` ✗ Fi.CI.CHECKPATCH: warning for Display Global Histogram (rev8) Patchwork
2024-11-25 8:15 ` ✗ Fi.CI.SPARSE: " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241121122603.736267-5-arun.r.murthy@intel.com \
--to=arun.r.murthy@intel.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.