diff options
| author | Stu Hsieh <stu.hsieh@mediatek.com> | 2018-08-08 22:15:41 -0400 |
|---|---|---|
| committer | CK Hu <ck.hu@mediatek.com> | 2018-08-26 23:24:36 -0400 |
| commit | b428391ed6bd5e3cb8ea9d1738ef4bd16af6cdb2 (patch) | |
| tree | 410ffbc71a390c49b948277d3d7979d12d0f04c7 | |
| parent | 182add0b1b9170a1f8f2a049fe2e298222cf405a (diff) | |
drm/mediatek: add RGB color format support for RDMA
This patch add RGB color format support for RDMA,
including RGB565, RGB888, RGBA8888 and ARGB8888.
Signed-off-by: Stu Hsieh <stu.hsieh@mediatek.com>
Signed-off-by: CK Hu <ck.hu@mediatek.com>
| -rw-r--r-- | drivers/gpu/drm/mediatek/mtk_disp_rdma.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_rdma.c b/drivers/gpu/drm/mediatek/mtk_disp_rdma.c index 08866550740f..091e48e51501 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_rdma.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_rdma.c | |||
| @@ -35,6 +35,12 @@ | |||
| 35 | #define DISP_REG_RDMA_SIZE_CON_0 0x0014 | 35 | #define DISP_REG_RDMA_SIZE_CON_0 0x0014 |
| 36 | #define DISP_REG_RDMA_SIZE_CON_1 0x0018 | 36 | #define DISP_REG_RDMA_SIZE_CON_1 0x0018 |
| 37 | #define DISP_REG_RDMA_TARGET_LINE 0x001c | 37 | #define DISP_REG_RDMA_TARGET_LINE 0x001c |
| 38 | #define DISP_RDMA_MEM_CON 0x0024 | ||
| 39 | #define MEM_MODE_INPUT_FORMAT_RGB565 (0x000 << 4) | ||
| 40 | #define MEM_MODE_INPUT_FORMAT_RGB888 (0x001 << 4) | ||
| 41 | #define MEM_MODE_INPUT_FORMAT_RGBA8888 (0x002 << 4) | ||
| 42 | #define MEM_MODE_INPUT_FORMAT_ARGB8888 (0x003 << 4) | ||
| 43 | #define MEM_MODE_INPUT_SWAP BIT(8) | ||
| 38 | #define DISP_RDMA_MEM_SRC_PITCH 0x002c | 44 | #define DISP_RDMA_MEM_SRC_PITCH 0x002c |
| 39 | #define DISP_RDMA_MEM_GMC_SETTING_0 0x0030 | 45 | #define DISP_RDMA_MEM_GMC_SETTING_0 0x0030 |
| 40 | #define DISP_REG_RDMA_FIFO_CON 0x0040 | 46 | #define DISP_REG_RDMA_FIFO_CON 0x0040 |
| @@ -144,12 +150,51 @@ static void mtk_rdma_config(struct mtk_ddp_comp *comp, unsigned int width, | |||
| 144 | writel(reg, comp->regs + DISP_REG_RDMA_FIFO_CON); | 150 | writel(reg, comp->regs + DISP_REG_RDMA_FIFO_CON); |
| 145 | } | 151 | } |
| 146 | 152 | ||
| 153 | static unsigned int rdma_fmt_convert(struct mtk_disp_rdma *rdma, | ||
| 154 | unsigned int fmt) | ||
| 155 | { | ||
| 156 | /* The return value in switch "MEM_MODE_INPUT_FORMAT_XXX" | ||
| 157 | * is defined in mediatek HW data sheet. | ||
| 158 | * The alphabet order in XXX is no relation to data | ||
| 159 | * arrangement in memory. | ||
| 160 | */ | ||
| 161 | switch (fmt) { | ||
| 162 | default: | ||
| 163 | case DRM_FORMAT_RGB565: | ||
| 164 | return MEM_MODE_INPUT_FORMAT_RGB565; | ||
| 165 | case DRM_FORMAT_BGR565: | ||
| 166 | return MEM_MODE_INPUT_FORMAT_RGB565 | MEM_MODE_INPUT_SWAP; | ||
| 167 | case DRM_FORMAT_RGB888: | ||
| 168 | return MEM_MODE_INPUT_FORMAT_RGB888; | ||
| 169 | case DRM_FORMAT_BGR888: | ||
| 170 | return MEM_MODE_INPUT_FORMAT_RGB888 | MEM_MODE_INPUT_SWAP; | ||
| 171 | case DRM_FORMAT_RGBX8888: | ||
| 172 | case DRM_FORMAT_RGBA8888: | ||
| 173 | return MEM_MODE_INPUT_FORMAT_ARGB8888; | ||
| 174 | case DRM_FORMAT_BGRX8888: | ||
| 175 | case DRM_FORMAT_BGRA8888: | ||
| 176 | return MEM_MODE_INPUT_FORMAT_ARGB8888 | MEM_MODE_INPUT_SWAP; | ||
| 177 | case DRM_FORMAT_XRGB8888: | ||
| 178 | case DRM_FORMAT_ARGB8888: | ||
| 179 | return MEM_MODE_INPUT_FORMAT_RGBA8888; | ||
| 180 | case DRM_FORMAT_XBGR8888: | ||
| 181 | case DRM_FORMAT_ABGR8888: | ||
| 182 | return MEM_MODE_INPUT_FORMAT_RGBA8888 | MEM_MODE_INPUT_SWAP; | ||
| 183 | } | ||
| 184 | } | ||
| 185 | |||
| 147 | static void mtk_rdma_layer_config(struct mtk_ddp_comp *comp, unsigned int idx, | 186 | static void mtk_rdma_layer_config(struct mtk_ddp_comp *comp, unsigned int idx, |
| 148 | struct mtk_plane_state *state) | 187 | struct mtk_plane_state *state) |
| 149 | { | 188 | { |
| 189 | struct mtk_disp_rdma *rdma = comp_to_rdma(comp); | ||
| 150 | struct mtk_plane_pending_state *pending = &state->pending; | 190 | struct mtk_plane_pending_state *pending = &state->pending; |
| 151 | unsigned int addr = pending->addr; | 191 | unsigned int addr = pending->addr; |
| 152 | unsigned int pitch = pending->pitch & 0xffff; | 192 | unsigned int pitch = pending->pitch & 0xffff; |
| 193 | unsigned int fmt = pending->format; | ||
| 194 | unsigned int con; | ||
| 195 | |||
| 196 | con = rdma_fmt_convert(rdma, fmt); | ||
| 197 | writel_relaxed(con, comp->regs + DISP_RDMA_MEM_CON); | ||
| 153 | 198 | ||
| 154 | writel_relaxed(addr, comp->regs + DISP_RDMA_MEM_START_ADDR); | 199 | writel_relaxed(addr, comp->regs + DISP_RDMA_MEM_START_ADDR); |
| 155 | writel_relaxed(pitch, comp->regs + DISP_RDMA_MEM_SRC_PITCH); | 200 | writel_relaxed(pitch, comp->regs + DISP_RDMA_MEM_SRC_PITCH); |
