msm: sde: cleanup format validation for sbuf mode
Add rotator operating mode to format validation logic
and define h/w version specific format table for each
operating mode. Update base format lookup table for
missing rgb565/rgb ubwc/rgb565 tile to rgb565 tile.
Change-Id: I0146fdd9423114903f40873d4a0e10c19ca8e38a
Signed-off-by: Alan Kwong <akwong@codeaurora.org>
diff --git a/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c b/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c
index 205eeef..3c47dd7 100644
--- a/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c
+++ b/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c
@@ -11,7 +11,7 @@
*
*/
-#define pr_fmt(fmt) "%s: " fmt, __func__
+#define pr_fmt(fmt) "%s:%d: " fmt, __func__, __LINE__
#include <linux/platform_device.h>
#include <linux/module.h>
@@ -107,7 +107,7 @@
#define SDE_ROTREG_READ(base, off) \
readl_relaxed(base + (off))
-static u32 sde_hw_rotator_v3_inpixfmts[] = {
+static const u32 sde_hw_rotator_v3_inpixfmts[] = {
SDE_PIX_FMT_XRGB_8888,
SDE_PIX_FMT_ARGB_8888,
SDE_PIX_FMT_ABGR_8888,
@@ -167,7 +167,7 @@
SDE_PIX_FMT_Y_CBCR_H2V2_TP10_UBWC,
};
-static u32 sde_hw_rotator_v3_outpixfmts[] = {
+static const u32 sde_hw_rotator_v3_outpixfmts[] = {
SDE_PIX_FMT_XRGB_8888,
SDE_PIX_FMT_ARGB_8888,
SDE_PIX_FMT_ABGR_8888,
@@ -227,7 +227,7 @@
SDE_PIX_FMT_Y_CBCR_H2V2_TP10_UBWC,
};
-static u32 sde_hw_rotator_v4_inpixfmts[] = {
+static const u32 sde_hw_rotator_v4_inpixfmts[] = {
SDE_PIX_FMT_XRGB_8888,
SDE_PIX_FMT_ARGB_8888,
SDE_PIX_FMT_ABGR_8888,
@@ -307,7 +307,7 @@
SDE_PIX_FMT_XBGR_2101010_TILE,
};
-static u32 sde_hw_rotator_v4_outpixfmts[] = {
+static const u32 sde_hw_rotator_v4_outpixfmts[] = {
SDE_PIX_FMT_XRGB_8888,
SDE_PIX_FMT_ARGB_8888,
SDE_PIX_FMT_ABGR_8888,
@@ -387,6 +387,23 @@
SDE_PIX_FMT_XBGR_2101010_TILE,
};
+static const u32 sde_hw_rotator_v4_inpixfmts_sbuf[] = {
+ SDE_PIX_FMT_Y_CBCR_H2V2_P010,
+ SDE_PIX_FMT_Y_CBCR_H2V2,
+ SDE_PIX_FMT_Y_CBCR_H2V2_TP10_UBWC,
+ SDE_PIX_FMT_Y_CBCR_H2V2_P010_UBWC,
+ SDE_PIX_FMT_Y_CBCR_H2V2_UBWC,
+ SDE_PIX_FMT_Y_CBCR_H2V2_TP10,
+ SDE_PIX_FMT_Y_CBCR_H2V2_P010_TILE,
+ SDE_PIX_FMT_Y_CBCR_H2V2_TILE,
+};
+
+static const u32 sde_hw_rotator_v4_outpixfmts_sbuf[] = {
+ SDE_PIX_FMT_Y_CBCR_H2V2_TP10,
+ SDE_PIX_FMT_Y_CBCR_H2V2_P010_TILE,
+ SDE_PIX_FMT_Y_CBCR_H2V2_TILE,
+};
+
static struct sde_rot_vbif_debug_bus nrt_vbif_dbg_bus_r3[] = {
{0x214, 0x21c, 16, 1, 0x200}, /* arb clients main */
{0x214, 0x21c, 0, 12, 0x13}, /* xin blocks - axi side */
@@ -2637,17 +2654,33 @@
set_bit(SDE_CAPS_SBUF_1, mdata->sde_caps_map);
set_bit(SDE_CAPS_UBWC_2, mdata->sde_caps_map);
set_bit(SDE_CAPS_PARTIALWR, mdata->sde_caps_map);
- rot->inpixfmts = sde_hw_rotator_v4_inpixfmts;
- rot->num_inpixfmt = ARRAY_SIZE(sde_hw_rotator_v4_inpixfmts);
- rot->outpixfmts = sde_hw_rotator_v4_outpixfmts;
- rot->num_outpixfmt = ARRAY_SIZE(sde_hw_rotator_v4_outpixfmts);
+ rot->inpixfmts[SDE_ROTATOR_MODE_OFFLINE] =
+ sde_hw_rotator_v4_inpixfmts;
+ rot->num_inpixfmt[SDE_ROTATOR_MODE_OFFLINE] =
+ ARRAY_SIZE(sde_hw_rotator_v4_inpixfmts);
+ rot->outpixfmts[SDE_ROTATOR_MODE_OFFLINE] =
+ sde_hw_rotator_v4_outpixfmts;
+ rot->num_outpixfmt[SDE_ROTATOR_MODE_OFFLINE] =
+ ARRAY_SIZE(sde_hw_rotator_v4_outpixfmts);
+ rot->inpixfmts[SDE_ROTATOR_MODE_SBUF] =
+ sde_hw_rotator_v4_inpixfmts_sbuf;
+ rot->num_inpixfmt[SDE_ROTATOR_MODE_SBUF] =
+ ARRAY_SIZE(sde_hw_rotator_v4_inpixfmts_sbuf);
+ rot->outpixfmts[SDE_ROTATOR_MODE_SBUF] =
+ sde_hw_rotator_v4_outpixfmts_sbuf;
+ rot->num_outpixfmt[SDE_ROTATOR_MODE_SBUF] =
+ ARRAY_SIZE(sde_hw_rotator_v4_outpixfmts_sbuf);
rot->downscale_caps =
"LINEAR/1.5/2/4/8/16/32/64 TILE/1.5/2/4 TP10/1.5/2";
} else {
- rot->inpixfmts = sde_hw_rotator_v3_inpixfmts;
- rot->num_inpixfmt = ARRAY_SIZE(sde_hw_rotator_v3_inpixfmts);
- rot->outpixfmts = sde_hw_rotator_v3_outpixfmts;
- rot->num_outpixfmt = ARRAY_SIZE(sde_hw_rotator_v3_outpixfmts);
+ rot->inpixfmts[SDE_ROTATOR_MODE_OFFLINE] =
+ sde_hw_rotator_v3_inpixfmts;
+ rot->num_inpixfmt[SDE_ROTATOR_MODE_OFFLINE] =
+ ARRAY_SIZE(sde_hw_rotator_v3_inpixfmts);
+ rot->outpixfmts[SDE_ROTATOR_MODE_OFFLINE] =
+ sde_hw_rotator_v3_outpixfmts;
+ rot->num_outpixfmt[SDE_ROTATOR_MODE_OFFLINE] =
+ ARRAY_SIZE(sde_hw_rotator_v3_outpixfmts);
rot->downscale_caps = (hw_version == SDE_ROT_TYPE_V1_0) ?
"LINEAR/2/4/8/16/32/64 TILE/2/4 TP10/2" :
"LINEAR/1.5/2/4/8/16/32/64 TILE/1.5/2/4 TP10/1.5/2";
@@ -3055,9 +3088,10 @@
* @mgr: Pointer to rotator manager
* @index: index of pixel format
* @input: true for input port; false for output port
+ * @mode: operating mode
*/
static u32 sde_hw_rotator_get_pixfmt(struct sde_rot_mgr *mgr,
- int index, bool input)
+ int index, bool input, u32 mode)
{
struct sde_hw_rotator *rot;
@@ -3068,14 +3102,19 @@
rot = mgr->hw_data;
+ if (mode >= SDE_ROTATOR_MODE_MAX) {
+ SDEROT_ERR("invalid rotator mode %d\n", mode);
+ return 0;
+ }
+
if (input) {
- if ((index < rot->num_inpixfmt) && rot->inpixfmts)
- return rot->inpixfmts[index];
+ if ((index < rot->num_inpixfmt[mode]) && rot->inpixfmts[mode])
+ return rot->inpixfmts[mode][index];
else
return 0;
} else {
- if ((index < rot->num_outpixfmt) && rot->outpixfmts)
- return rot->outpixfmts[index];
+ if ((index < rot->num_outpixfmt[mode]) && rot->outpixfmts[mode])
+ return rot->outpixfmts[mode][index];
else
return 0;
}
@@ -3086,12 +3125,13 @@
* @mgr: Pointer to rotator manager
* @pixfmt: pixel format to be verified
* @input: true for input port; false for output port
+ * @mode: operating mode
*/
static int sde_hw_rotator_is_valid_pixfmt(struct sde_rot_mgr *mgr, u32 pixfmt,
- bool input)
+ bool input, u32 mode)
{
struct sde_hw_rotator *rot;
- u32 *pixfmts;
+ const u32 *pixfmts;
u32 num_pixfmt;
int i;
@@ -3102,12 +3142,17 @@
rot = mgr->hw_data;
+ if (mode >= SDE_ROTATOR_MODE_MAX) {
+ SDEROT_ERR("invalid rotator mode %d\n", mode);
+ return false;
+ }
+
if (input) {
- pixfmts = rot->inpixfmts;
- num_pixfmt = rot->num_inpixfmt;
+ pixfmts = rot->inpixfmts[mode];
+ num_pixfmt = rot->num_inpixfmt[mode];
} else {
- pixfmts = rot->outpixfmts;
- num_pixfmt = rot->num_outpixfmt;
+ pixfmts = rot->outpixfmts[mode];
+ num_pixfmt = rot->num_outpixfmt[mode];
}
if (!pixfmts || !num_pixfmt) {