Merge "drm/msm/sde: move vbif functions to their own file" into msm-4.8
diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile
index 87b06c5..26b6bc8 100644
--- a/drivers/gpu/drm/msm/Makefile
+++ b/drivers/gpu/drm/msm/Makefile
@@ -44,6 +44,7 @@
sde/sde_plane.o \
sde/sde_connector.o \
sde/sde_color_processing.o \
+ sde/sde_vbif.o \
msm_atomic.o \
msm_debugfs.o \
msm_drv.o \
@@ -132,7 +133,7 @@
sde/sde_hw_top.o \
sde/sde_hw_interrupts.o \
sde/sde_hw_vbif.o \
- sde/sde_formats.o
+ sde/sde_formats.o \
obj-$(CONFIG_DRM_MSM) += display-manager/display_manager.o
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c b/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c
index 649805a..3600e44 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c
+++ b/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015-2017 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -23,6 +23,7 @@
#include "sde_hw_interrupts.h"
#include "sde_core_irq.h"
#include "sde_wb.h"
+#include "sde_vbif.h"
/* wait for at most 2 vsync for lowest refresh rate (24hz) */
#define WAIT_TIMEOUT_MSEC 84
diff --git a/drivers/gpu/drm/msm/sde/sde_kms.c b/drivers/gpu/drm/msm/sde/sde_kms.c
index 62b4b33..3ca6114 100644
--- a/drivers/gpu/drm/msm/sde/sde_kms.c
+++ b/drivers/gpu/drm/msm/sde/sde_kms.c
@@ -462,198 +462,6 @@ static void core_hw_rev_init(struct sde_kms *sde_kms)
sde_kms->core_rev = readl_relaxed(sde_kms->mmio + 0x0);
}
-/**
- * _sde_vbif_wait_for_xin_halt - wait for the xin to halt
- * @vbif: Pointer to hardware vbif driver
- * @xin_id: Client interface identifier
- * @return: 0 if success; error code otherwise
- */
-static int _sde_vbif_wait_for_xin_halt(struct sde_hw_vbif *vbif, u32 xin_id)
-{
- ktime_t timeout;
- bool status;
- int rc;
-
- if (!vbif || !vbif->cap || !vbif->ops.get_halt_ctrl) {
- SDE_ERROR("invalid arguments vbif %d\n", vbif != 0);
- return -EINVAL;
- }
-
- timeout = ktime_add_us(ktime_get(), vbif->cap->xin_halt_timeout);
- for (;;) {
- status = vbif->ops.get_halt_ctrl(vbif, xin_id);
- if (status)
- break;
- if (ktime_compare_safe(ktime_get(), timeout) > 0) {
- status = vbif->ops.get_halt_ctrl(vbif, xin_id);
- break;
- }
- usleep_range(501, 1000);
- }
-
- if (!status) {
- rc = -ETIMEDOUT;
- SDE_ERROR("VBIF %d client %d not halting. TIMEDOUT.\n",
- vbif->idx - VBIF_0, xin_id);
- } else {
- rc = 0;
- SDE_DEBUG("VBIF %d client %d is halted\n",
- vbif->idx - VBIF_0, xin_id);
- }
-
- return rc;
-}
-
-/**
- * _sde_vbif_apply_dynamic_ot_limit - determine OT based on usecase parameters
- * @vbif: Pointer to hardware vbif driver
- * @ot_lim: Pointer to OT limit to be modified
- * @params: Pointer to usecase parameters
- */
-static void _sde_vbif_apply_dynamic_ot_limit(struct sde_hw_vbif *vbif,
- u32 *ot_lim, struct sde_vbif_set_ot_params *params)
-{
- u64 pps;
- const struct sde_vbif_dynamic_ot_tbl *tbl;
- u32 i;
-
- if (!vbif || !(vbif->cap->features & BIT(SDE_VBIF_QOS_OTLIM)))
- return;
-
- /* Dynamic OT setting done only for WFD */
- if (!params->is_wfd)
- return;
-
- pps = params->frame_rate;
- pps *= params->width;
- pps *= params->height;
-
- tbl = params->rd ? &vbif->cap->dynamic_ot_rd_tbl :
- &vbif->cap->dynamic_ot_wr_tbl;
-
- for (i = 0; i < tbl->count; i++) {
- if (pps <= tbl->cfg[i].pps) {
- *ot_lim = tbl->cfg[i].ot_limit;
- break;
- }
- }
-
- SDE_DEBUG("vbif:%d xin:%d w:%d h:%d fps:%d pps:%llu ot:%u\n",
- vbif->idx - VBIF_0, params->xin_id,
- params->width, params->height, params->frame_rate,
- pps, *ot_lim);
-}
-
-/**
- * _sde_vbif_get_ot_limit - get OT based on usecase & configuration parameters
- * @vbif: Pointer to hardware vbif driver
- * @params: Pointer to usecase parameters
- * @return: OT limit
- */
-static u32 _sde_vbif_get_ot_limit(struct sde_hw_vbif *vbif,
- struct sde_vbif_set_ot_params *params)
-{
- u32 ot_lim = 0;
- u32 val;
-
- if (!vbif || !vbif->cap) {
- SDE_ERROR("invalid arguments vbif %d\n", vbif != 0);
- return -EINVAL;
- }
-
- if (vbif->cap->default_ot_wr_limit && !params->rd)
- ot_lim = vbif->cap->default_ot_wr_limit;
- else if (vbif->cap->default_ot_rd_limit && params->rd)
- ot_lim = vbif->cap->default_ot_rd_limit;
-
- /*
- * If default ot is not set from dt/catalog,
- * then do not configure it.
- */
- if (ot_lim == 0)
- goto exit;
-
- /* Modify the limits if the target and the use case requires it */
- _sde_vbif_apply_dynamic_ot_limit(vbif, &ot_lim, params);
-
- if (vbif && vbif->ops.get_limit_conf) {
- val = vbif->ops.get_limit_conf(vbif,
- params->xin_id, params->rd);
- if (val == ot_lim)
- ot_lim = 0;
- }
-
-exit:
- SDE_DEBUG("vbif:%d xin:%d ot_lim:%d\n",
- vbif->idx - VBIF_0, params->xin_id, ot_lim);
- return ot_lim;
-}
-
-/**
- * sde_vbif_set_ot_limit - set OT based on usecase & configuration parameters
- * @vbif: Pointer to hardware vbif driver
- * @params: Pointer to usecase parameters
- *
- * Note this function would block waiting for bus halt.
- */
-void sde_vbif_set_ot_limit(struct sde_kms *sde_kms,
- struct sde_vbif_set_ot_params *params)
-{
- struct sde_hw_vbif *vbif = NULL;
- struct sde_hw_mdp *mdp;
- bool forced_on = false;
- u32 ot_lim;
- int ret, i;
-
- if (!sde_kms) {
- SDE_ERROR("invalid arguments\n");
- return;
- }
- mdp = sde_kms->hw_mdp;
-
- for (i = 0; i < ARRAY_SIZE(sde_kms->hw_vbif); i++) {
- if (sde_kms->hw_vbif[i] &&
- sde_kms->hw_vbif[i]->idx == params->vbif_idx)
- vbif = sde_kms->hw_vbif[i];
- }
-
- if (!vbif || !mdp) {
- SDE_DEBUG("invalid arguments vbif %d mdp %d\n",
- vbif != 0, mdp != 0);
- return;
- }
-
- if (!mdp->ops.setup_clk_force_ctrl ||
- !vbif->ops.set_limit_conf ||
- !vbif->ops.set_halt_ctrl)
- return;
-
- ot_lim = _sde_vbif_get_ot_limit(vbif, params) & 0xFF;
-
- if (ot_lim == 0)
- goto exit;
-
- trace_sde_perf_set_ot(params->num, params->xin_id, ot_lim,
- params->vbif_idx);
-
- forced_on = mdp->ops.setup_clk_force_ctrl(mdp, params->clk_ctrl, true);
-
- vbif->ops.set_limit_conf(vbif, params->xin_id, params->rd, ot_lim);
-
- vbif->ops.set_halt_ctrl(vbif, params->xin_id, true);
-
- ret = _sde_vbif_wait_for_xin_halt(vbif, params->xin_id);
- if (ret)
- MSM_EVT(sde_kms->dev, vbif->idx, params->xin_id);
-
- vbif->ops.set_halt_ctrl(vbif, params->xin_id, false);
-
- if (forced_on)
- mdp->ops.setup_clk_force_ctrl(mdp, params->clk_ctrl, false);
-exit:
- return;
-}
-
int sde_mmu_init(struct sde_kms *sde_kms)
{
struct msm_mmu *mmu;
diff --git a/drivers/gpu/drm/msm/sde/sde_kms.h b/drivers/gpu/drm/msm/sde/sde_kms.h
index 8b626e6..3ac9f22 100644
--- a/drivers/gpu/drm/msm/sde/sde_kms.h
+++ b/drivers/gpu/drm/msm/sde/sde_kms.h
@@ -149,18 +149,6 @@ struct vsync_info {
#define to_sde_kms(x) container_of(x, struct sde_kms, base)
-struct sde_vbif_set_ot_params {
- u32 xin_id;
- u32 num;
- u32 width;
- u32 height;
- u32 frame_rate;
- bool rd;
- bool is_wfd;
- u32 vbif_idx;
- u32 clk_ctrl;
-};
-
struct sde_plane_state {
struct drm_plane_state base;
@@ -509,12 +497,4 @@ int sde_encoder_wait_for_commit_done(struct drm_encoder *drm_encoder);
*/
void sde_encoders_init(struct drm_device *dev);
-/**
- * sde_vbif_set_ot_limit - set OT limit for vbif client
- * @sde_kms: SDE handler
- * @params: Pointer to OT configuration parameters
- */
-void sde_vbif_set_ot_limit(struct sde_kms *sde_kms,
- struct sde_vbif_set_ot_params *params);
-
#endif /* __sde_kms_H__ */
diff --git a/drivers/gpu/drm/msm/sde/sde_plane.c b/drivers/gpu/drm/msm/sde/sde_plane.c
index 78ac3b7..5257b8d 100644
--- a/drivers/gpu/drm/msm/sde/sde_plane.c
+++ b/drivers/gpu/drm/msm/sde/sde_plane.c
@@ -23,6 +23,7 @@
#include "sde_hw_sspp.h"
#include "sde_trace.h"
#include "sde_crtc.h"
+#include "sde_vbif.h"
#define SDE_DEBUG_PLANE(pl, fmt, ...) SDE_DEBUG("plane%d " fmt,\
(pl) ? (pl)->base.base.id : -1, ##__VA_ARGS__)
diff --git a/drivers/gpu/drm/msm/sde/sde_vbif.c b/drivers/gpu/drm/msm/sde/sde_vbif.c
new file mode 100644
index 0000000..6060bde
--- /dev/null
+++ b/drivers/gpu/drm/msm/sde/sde_vbif.c
@@ -0,0 +1,209 @@
+/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__
+
+#include "sde_vbif.h"
+#include "sde_hw_vbif.h"
+#include "sde_trace.h"
+
+/**
+ * _sde_vbif_wait_for_xin_halt - wait for the xin to halt
+ * @vbif: Pointer to hardware vbif driver
+ * @xin_id: Client interface identifier
+ * @return: 0 if success; error code otherwise
+ */
+static int _sde_vbif_wait_for_xin_halt(struct sde_hw_vbif *vbif, u32 xin_id)
+{
+ ktime_t timeout;
+ bool status;
+ int rc;
+
+ if (!vbif || !vbif->cap || !vbif->ops.get_halt_ctrl) {
+ SDE_ERROR("invalid arguments vbif %d\n", vbif != 0);
+ return -EINVAL;
+ }
+
+ timeout = ktime_add_us(ktime_get(), vbif->cap->xin_halt_timeout);
+ for (;;) {
+ status = vbif->ops.get_halt_ctrl(vbif, xin_id);
+ if (status)
+ break;
+ if (ktime_compare_safe(ktime_get(), timeout) > 0) {
+ status = vbif->ops.get_halt_ctrl(vbif, xin_id);
+ break;
+ }
+ usleep_range(501, 1000);
+ }
+
+ if (!status) {
+ rc = -ETIMEDOUT;
+ SDE_ERROR("VBIF %d client %d not halting. TIMEDOUT.\n",
+ vbif->idx - VBIF_0, xin_id);
+ } else {
+ rc = 0;
+ SDE_DEBUG("VBIF %d client %d is halted\n",
+ vbif->idx - VBIF_0, xin_id);
+ }
+
+ return rc;
+}
+
+/**
+ * _sde_vbif_apply_dynamic_ot_limit - determine OT based on usecase parameters
+ * @vbif: Pointer to hardware vbif driver
+ * @ot_lim: Pointer to OT limit to be modified
+ * @params: Pointer to usecase parameters
+ */
+static void _sde_vbif_apply_dynamic_ot_limit(struct sde_hw_vbif *vbif,
+ u32 *ot_lim, struct sde_vbif_set_ot_params *params)
+{
+ u64 pps;
+ const struct sde_vbif_dynamic_ot_tbl *tbl;
+ u32 i;
+
+ if (!vbif || !(vbif->cap->features & BIT(SDE_VBIF_QOS_OTLIM)))
+ return;
+
+ /* Dynamic OT setting done only for WFD */
+ if (!params->is_wfd)
+ return;
+
+ pps = params->frame_rate;
+ pps *= params->width;
+ pps *= params->height;
+
+ tbl = params->rd ? &vbif->cap->dynamic_ot_rd_tbl :
+ &vbif->cap->dynamic_ot_wr_tbl;
+
+ for (i = 0; i < tbl->count; i++) {
+ if (pps <= tbl->cfg[i].pps) {
+ *ot_lim = tbl->cfg[i].ot_limit;
+ break;
+ }
+ }
+
+ SDE_DEBUG("vbif:%d xin:%d w:%d h:%d fps:%d pps:%llu ot:%u\n",
+ vbif->idx - VBIF_0, params->xin_id,
+ params->width, params->height, params->frame_rate,
+ pps, *ot_lim);
+}
+
+/**
+ * _sde_vbif_get_ot_limit - get OT based on usecase & configuration parameters
+ * @vbif: Pointer to hardware vbif driver
+ * @params: Pointer to usecase parameters
+ * @return: OT limit
+ */
+static u32 _sde_vbif_get_ot_limit(struct sde_hw_vbif *vbif,
+ struct sde_vbif_set_ot_params *params)
+{
+ u32 ot_lim = 0;
+ u32 val;
+
+ if (!vbif || !vbif->cap) {
+ SDE_ERROR("invalid arguments vbif %d\n", vbif != 0);
+ return -EINVAL;
+ }
+
+ if (vbif->cap->default_ot_wr_limit && !params->rd)
+ ot_lim = vbif->cap->default_ot_wr_limit;
+ else if (vbif->cap->default_ot_rd_limit && params->rd)
+ ot_lim = vbif->cap->default_ot_rd_limit;
+
+ /*
+ * If default ot is not set from dt/catalog,
+ * then do not configure it.
+ */
+ if (ot_lim == 0)
+ goto exit;
+
+ /* Modify the limits if the target and the use case requires it */
+ _sde_vbif_apply_dynamic_ot_limit(vbif, &ot_lim, params);
+
+ if (vbif && vbif->ops.get_limit_conf) {
+ val = vbif->ops.get_limit_conf(vbif,
+ params->xin_id, params->rd);
+ if (val == ot_lim)
+ ot_lim = 0;
+ }
+
+exit:
+ SDE_DEBUG("vbif:%d xin:%d ot_lim:%d\n",
+ vbif->idx - VBIF_0, params->xin_id, ot_lim);
+ return ot_lim;
+}
+
+/**
+ * sde_vbif_set_ot_limit - set OT based on usecase & configuration parameters
+ * @vbif: Pointer to hardware vbif driver
+ * @params: Pointer to usecase parameters
+ *
+ * Note this function would block waiting for bus halt.
+ */
+void sde_vbif_set_ot_limit(struct sde_kms *sde_kms,
+ struct sde_vbif_set_ot_params *params)
+{
+ struct sde_hw_vbif *vbif = NULL;
+ struct sde_hw_mdp *mdp;
+ bool forced_on = false;
+ u32 ot_lim;
+ int ret, i;
+
+ if (!sde_kms) {
+ SDE_ERROR("invalid arguments\n");
+ return;
+ }
+ mdp = sde_kms->hw_mdp;
+
+ for (i = 0; i < ARRAY_SIZE(sde_kms->hw_vbif); i++) {
+ if (sde_kms->hw_vbif[i] &&
+ sde_kms->hw_vbif[i]->idx == params->vbif_idx)
+ vbif = sde_kms->hw_vbif[i];
+ }
+
+ if (!vbif || !mdp) {
+ SDE_DEBUG("invalid arguments vbif %d mdp %d\n",
+ vbif != 0, mdp != 0);
+ return;
+ }
+
+ if (!mdp->ops.setup_clk_force_ctrl ||
+ !vbif->ops.set_limit_conf ||
+ !vbif->ops.set_halt_ctrl)
+ return;
+
+ ot_lim = _sde_vbif_get_ot_limit(vbif, params) & 0xFF;
+
+ if (ot_lim == 0)
+ goto exit;
+
+ trace_sde_perf_set_ot(params->num, params->xin_id, ot_lim,
+ params->vbif_idx);
+
+ forced_on = mdp->ops.setup_clk_force_ctrl(mdp, params->clk_ctrl, true);
+
+ vbif->ops.set_limit_conf(vbif, params->xin_id, params->rd, ot_lim);
+
+ vbif->ops.set_halt_ctrl(vbif, params->xin_id, true);
+
+ ret = _sde_vbif_wait_for_xin_halt(vbif, params->xin_id);
+ if (ret)
+ MSM_EVT(sde_kms->dev, vbif->idx, params->xin_id);
+
+ vbif->ops.set_halt_ctrl(vbif, params->xin_id, false);
+
+ if (forced_on)
+ mdp->ops.setup_clk_force_ctrl(mdp, params->clk_ctrl, false);
+exit:
+ return;
+}
diff --git a/drivers/gpu/drm/msm/sde/sde_vbif.h b/drivers/gpu/drm/msm/sde/sde_vbif.h
new file mode 100644
index 0000000..703befa
--- /dev/null
+++ b/drivers/gpu/drm/msm/sde/sde_vbif.h
@@ -0,0 +1,38 @@
+/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __SDE_VBIF_H__
+#define __SDE_VBIF_H__
+
+#include "sde_kms.h"
+
+struct sde_vbif_set_ot_params {
+ u32 xin_id;
+ u32 num;
+ u32 width;
+ u32 height;
+ u32 frame_rate;
+ bool rd;
+ bool is_wfd;
+ u32 vbif_idx;
+ u32 clk_ctrl;
+};
+
+/**
+ * sde_vbif_set_ot_limit - set OT limit for vbif client
+ * @sde_kms: SDE handler
+ * @params: Pointer to OT configuration parameters
+ */
+void sde_vbif_set_ot_limit(struct sde_kms *sde_kms,
+ struct sde_vbif_set_ot_params *params);
+
+#endif /* __SDE_VBIF_H__ */