summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleg Matcovschi <omatcovschi@google.com>2023-06-08 00:43:27 +0000
committerLeo Chen <yinchiuan@google.com>2023-06-08 04:33:20 +0000
commit10257b6c36f6aa404385dbd72ea69b865e9fb5f4 (patch)
tree5364cc75b77f766407071bb1249b3c79f857cd24
parentf3deb4be40c0d55b5c676c47acb65d8605111a5f (diff)
downloaddisplay-10257b6c36f6aa404385dbd72ea69b865e9fb5f4.tar.gz
This reverts commit f3deb4be40c0d55b5c676c47acb65d8605111a5f. Reason for revert: b/285587335 Bug: 285587335 Signed-off-by: Oleg Matcovschi <omatcovschi@google.com> Change-Id: I959256cc689a75fe1ed96cedead254a6a6da7218
-rw-r--r--samsung/exynos_drm_decon.c3
-rw-r--r--samsung/exynos_drm_dqe.c140
-rw-r--r--samsung/exynos_drm_dqe.h19
3 files changed, 25 insertions, 137 deletions
diff --git a/samsung/exynos_drm_decon.c b/samsung/exynos_drm_decon.c
index 1aad899..5fababb 100644
--- a/samsung/exynos_drm_decon.c
+++ b/samsung/exynos_drm_decon.c
@@ -1382,7 +1382,6 @@ static void decon_enter_hibernation(struct decon_device *decon)
reset = _decon_wait_for_framedone(decon);
spin_lock_irqsave(&decon->slock, flags);
- exynos_dqe_hibernation_enter(decon->dqe);
_decon_disable_locked(decon, reset);
pm_runtime_put(decon->dev);
decon->state = DECON_STATE_HIBERNATION;
@@ -1666,9 +1665,9 @@ static irqreturn_t decon_irq_handler(int irq, void *dev_data)
DPU_ATRACE_INT_PID("frame_transfer", 0, decon->thread->pid);
DPU_EVENT_LOG(DPU_EVT_DECON_FRAMEDONE, decon->id, decon);
exynos_dqe_save_lpd_data(decon->dqe);
- atomic_dec_if_positive(&decon->frames_pending);
if (decon->dqe)
handle_histogram_event(decon->dqe);
+ atomic_dec_if_positive(&decon->frames_pending);
wake_up_all(&decon->framedone_wait);
decon_debug(decon, "%s: frame done\n", __func__);
}
diff --git a/samsung/exynos_drm_dqe.c b/samsung/exynos_drm_dqe.c
index cc00562..ee7116f 100644
--- a/samsung/exynos_drm_dqe.c
+++ b/samsung/exynos_drm_dqe.c
@@ -67,50 +67,6 @@ exynos_atc_update(struct exynos_dqe *dqe, struct exynos_dqe_state *state)
dqe_reg_print_atc(id, &p);
}
-/*
- * emmits event (called should protect)
- */
-static void histogram_emmit_event(struct exynos_dqe *dqe)
-{
- struct drm_device *dev = dqe->decon->drm_dev;
- struct exynos_drm_pending_histogram_event *e = dqe->state.event;
- uint32_t crtc_id = dqe->decon->crtc->base.base.id;
-
- e->event.crtc_id = crtc_id;
- drm_send_event(dev, &e->base);
- dqe->state.event = NULL;
-}
-
-static void histogram_collect_bins(struct exynos_dqe *dqe, struct histogram_bins *bins)
-{
- uint32_t id = dqe->decon->id;
- /* collect data from bins */
- dqe_reg_get_histogram_bins(id, bins);
-}
-
-static const char *str_run_state(enum histogram_run_state state)
-{
- switch (state) {
- case HSTATE_DISABLED:
- return "disabled";
- case HSTATE_HIBERNATION:
- return "hibernation";
- case HSTATE_PENDING_FRAMEDONE:
- return "pending_framedone";
- case HSTATE_IDLE:
- return "idle";
- default:
- return "";
- }
-}
-
-static void histogram_set_run_state(struct exynos_dqe *dqe, enum histogram_run_state state)
-{
- pr_debug("histogram: run_state: %s -> %s\n",
- str_run_state(dqe->state.hist_run_state), str_run_state(state));
- dqe->state.hist_run_state = state;
-}
-
static struct exynos_drm_pending_histogram_event *create_histogram_event(
struct drm_device *dev, struct drm_file *file)
{
@@ -160,6 +116,7 @@ int histogram_request_ioctl(struct drm_device *dev, void *data,
return -ENODEV;
}
+
e = create_histogram_event(dev, file);
if (IS_ERR(e)) {
pr_err("failed to create a histogram event\n");
@@ -177,24 +134,11 @@ int histogram_request_ioctl(struct drm_device *dev, void *data,
spin_unlock_irqrestore(&dqe->state.histogram_slock, flags);
return -EBUSY;
}
-
dqe->state.event = e;
-
- /* check cached state */
- if (dqe->state.hist_run_state == HSTATE_HIBERNATION) {
- if (dqe->verbose_hist)
- pr_info("histogram: use cached data\n");
- memcpy(&e->event.bins, &dqe->state.histogram_cached_bins, sizeof(e->event.bins));
- histogram_emmit_event(dqe);
- } else if (dqe->state.hist_run_state == HSTATE_IDLE) {
- if (dqe->verbose_hist)
- pr_info("histogram: idle, query now\n");
- histogram_collect_bins(dqe, &dqe->state.event->event.bins);
- histogram_emmit_event(dqe);
- }
spin_unlock_irqrestore(&dqe->state.histogram_slock, flags);
- pr_debug("histogram: created event(0x%pK) of decon%u\n", dqe->state.event, decon->id);
+ pr_debug("created histogram event(0x%pK) of decon%u\n",
+ dqe->state.event, decon->id);
return 0;
}
@@ -238,33 +182,25 @@ int histogram_cancel_ioctl(struct drm_device *dev, void *data,
return 0;
}
-/* This function runs in interrupt context */
void handle_histogram_event(struct exynos_dqe *dqe)
{
- spin_lock(&dqe->state.histogram_slock);
-
- /* return immediately if histogram disabled */
- if (dqe->state.hist_run_state == HSTATE_DISABLED) {
- spin_unlock(&dqe->state.histogram_slock);
- return;
- }
+ /* This function runs in interrupt context */
+ struct exynos_drm_pending_histogram_event *e;
+ struct drm_device *dev = dqe->decon->drm_dev;
+ uint32_t id, crtc_id;
- /*
- * histogram engine data is available after first frame done.
- */
- if (dqe->state.event) {
- pr_debug("histogram: handle event(0x%pK), rstate(%s)\n",
- dqe->state.event, str_run_state(dqe->state.hist_run_state));
- histogram_collect_bins(dqe, &dqe->state.event->event.bins);
- histogram_emmit_event(dqe);
+ spin_lock(&dqe->state.histogram_slock);
+ crtc_id = dqe->decon->crtc->base.base.id;
+ id = dqe->decon->id;
+ e = dqe->state.event;
+ if (e) {
+ pr_debug("Histogram event(0x%pK) will be handled\n", dqe->state.event);
+ dqe_reg_get_histogram_bins(id, &e->event.bins);
+ e->event.crtc_id = crtc_id;
+ drm_send_event(dev, &e->base);
+ pr_debug("histogram event of decon%u signalled\n", dqe->decon->id);
+ dqe->state.event = NULL;
}
-
- if ((atomic_read(&dqe->decon->frames_pending) == 0) &&
- (dqe->decon->config.mode.op_mode != DECON_VIDEO_MODE))
- histogram_set_run_state(dqe, HSTATE_IDLE);
- else
- histogram_set_run_state(dqe, HSTATE_PENDING_FRAMEDONE);
-
spin_unlock(&dqe->state.histogram_slock);
}
@@ -454,7 +390,6 @@ exynos_histogram_update(struct exynos_dqe *dqe, struct exynos_dqe_state *state)
struct decon_device *decon = dqe->decon;
struct drm_printer p = drm_info_printer(decon->dev);
u32 id = decon->id;
- unsigned long flags;
if (dqe->state.roi != state->roi) {
dqe_reg_set_histogram_roi(id, state->roi);
@@ -476,21 +411,14 @@ exynos_histogram_update(struct exynos_dqe *dqe, struct exynos_dqe_state *state)
dqe->state.histogram_pos = state->histogram_pos;
}
- if (state->weights && state->roi)
+ if (dqe->state.event && state->roi)
hist_state = HISTOGRAM_ROI;
- else if (state->weights)
+ else if (dqe->state.event && !state->roi)
hist_state = HISTOGRAM_FULL;
else
hist_state = HISTOGRAM_OFF;
- spin_lock_irqsave(&dqe->state.histogram_slock, flags);
- if (hist_state == HISTOGRAM_OFF)
- histogram_set_run_state(dqe, HSTATE_DISABLED);
- else
- histogram_set_run_state(dqe, HSTATE_PENDING_FRAMEDONE);
- dqe->state.hist_state = hist_state;
dqe_reg_set_histogram(id, hist_state);
- spin_unlock_irqrestore(&dqe->state.histogram_slock, flags);
if (dqe->verbose_hist)
dqe_reg_print_hist(id, &p);
@@ -604,31 +532,8 @@ void exynos_dqe_update(struct exynos_dqe *dqe, struct exynos_dqe_state *state,
dqe->funcs->update(dqe, state, width, height);
}
-/*
- * operations prior to enter hibernation
- */
-void exynos_dqe_hibernation_enter(struct exynos_dqe *dqe)
-{
- unsigned long flags;
-
- if (!dqe->state.enabled)
- return;
-
- spin_lock_irqsave(&dqe->state.histogram_slock, flags);
- if (dqe->state.hist_run_state == HSTATE_IDLE) {
- histogram_collect_bins(dqe, &dqe->state.histogram_cached_bins);
- histogram_set_run_state(dqe, HSTATE_HIBERNATION);
- } else if (dqe->state.hist_run_state == HSTATE_PENDING_FRAMEDONE) {
- WARN(1, "pending histogram during hibernation\n");
- histogram_set_run_state(dqe, HSTATE_DISABLED);
- }
- spin_unlock_irqrestore(&dqe->state.histogram_slock, flags);
-}
-
void exynos_dqe_reset(struct exynos_dqe *dqe)
{
- unsigned long flags;
-
dqe->initialized = false;
dqe->state.gamma_matrix = NULL;
dqe->state.degamma_lut = NULL;
@@ -639,13 +544,8 @@ void exynos_dqe_reset(struct exynos_dqe *dqe)
dqe->state.cgc_dither_config = NULL;
dqe->cgc.first_write = false;
dqe->force_atc_config.dirty = true;
- spin_lock_irqsave(&dqe->state.histogram_slock, flags);
dqe->state.histogram_threshold = 0;
dqe->state.histogram_pos = POST_DQE;
- dqe->state.hist_state = HISTOGRAM_OFF;
- if (dqe->state.hist_run_state != HSTATE_HIBERNATION)
- histogram_set_run_state(dqe, HSTATE_DISABLED);
- spin_unlock_irqrestore(&dqe->state.histogram_slock, flags);
dqe->state.roi = NULL;
dqe->state.weights = NULL;
dqe->state.rcd_enabled = false;
diff --git a/samsung/exynos_drm_dqe.h b/samsung/exynos_drm_dqe.h
index 5760adb..d578114 100644
--- a/samsung/exynos_drm_dqe.h
+++ b/samsung/exynos_drm_dqe.h
@@ -26,13 +26,6 @@ struct exynos_dqe_funcs {
u32 width, u32 height);
};
-enum histogram_run_state {
- HSTATE_DISABLED, /* histogram is disabled */
- HSTATE_HIBERNATION, /* histogram is disabled due hibernation */
- HSTATE_PENDING_FRAMEDONE, /* histogram is enabled, can be read on frame done */
- HSTATE_IDLE, /* histogram is enabled, can be read at any time*/
-};
-
struct exynos_dqe_state {
const struct drm_color_lut *degamma_lut;
const struct exynos_matrix *linear_matrix;
@@ -42,18 +35,15 @@ struct exynos_dqe_state {
struct dither_config *disp_dither_config;
struct dither_config *cgc_dither_config;
bool enabled;
- bool rcd_enabled;
- struct drm_gem_object *cgc_gem;
- spinlock_t histogram_slock;
- struct exynos_drm_pending_histogram_event *event;
struct histogram_roi *roi;
struct histogram_weights *weights;
struct histogram_bins *bins;
+ struct exynos_drm_pending_histogram_event *event;
u32 histogram_threshold;
+ spinlock_t histogram_slock;
enum exynos_prog_pos histogram_pos;
- enum histogram_state hist_state;
- enum histogram_run_state hist_run_state;
- struct histogram_bins histogram_cached_bins;
+ bool rcd_enabled;
+ struct drm_gem_object *cgc_gem;
};
struct dither_debug_override {
@@ -161,7 +151,6 @@ void handle_histogram_event(struct exynos_dqe *dqe);
void exynos_dqe_update(struct exynos_dqe *dqe, struct exynos_dqe_state *state,
u32 width, u32 height);
void exynos_dqe_reset(struct exynos_dqe *dqe);
-void exynos_dqe_hibernation_enter(struct exynos_dqe *dqe);
struct exynos_dqe *exynos_dqe_register(struct decon_device *decon);
void exynos_dqe_save_lpd_data(struct exynos_dqe *dqe);
void exynos_dqe_restore_lpd_data(struct exynos_dqe *dqe);