Revert "video/drm: logo: fix show 8bit bmp logo failed"
This reverts commit 78d830ca5b.
Change-Id: Ic2996614b9cddc1835b079c2e7ac784daa99ad3a
Signed-off-by: Sandy Huang <hjc@rock-chips.com>
This commit is contained in:
parent
0a9c335c55
commit
55e2f86dd4
|
|
@ -163,13 +163,14 @@ static void dump_bmp_dib_head(void *bmp_addr)
|
||||||
bmp->header.colors_used);
|
bmp->header.colors_used);
|
||||||
}
|
}
|
||||||
|
|
||||||
int bmpdecoder(void *bmp_addr, void *pdst, int dst_bpp, bool flip)
|
int bmpdecoder(void *bmp_addr, void *pdst, int dst_bpp)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
int stride, padded_width, bpp, width, height;
|
int stride, padded_width, bpp, width, height;
|
||||||
struct bmp_image *bmp = bmp_addr;
|
struct bmp_image *bmp = bmp_addr;
|
||||||
uint8_t *src = bmp_addr;
|
uint8_t *src = bmp_addr;
|
||||||
uint8_t *dst = pdst;
|
uint8_t *dst = pdst;
|
||||||
|
bool flip = false;
|
||||||
uint16_t *cmap;
|
uint16_t *cmap;
|
||||||
uint8_t *cmap_base;
|
uint8_t *cmap_base;
|
||||||
|
|
||||||
|
|
@ -184,10 +185,11 @@ int bmpdecoder(void *bmp_addr, void *pdst, int dst_bpp, bool flip)
|
||||||
bpp = get_unaligned_le16(&bmp->header.bit_count);
|
bpp = get_unaligned_le16(&bmp->header.bit_count);
|
||||||
padded_width = width & 0x3 ? (width & ~0x3) + 4 : width;
|
padded_width = width & 0x3 ? (width & ~0x3) + 4 : width;
|
||||||
|
|
||||||
if (height < 0) {
|
if (height < 0)
|
||||||
height = 0 - height;
|
height = 0 - height;
|
||||||
flip = false;
|
else
|
||||||
}
|
flip = true;
|
||||||
|
|
||||||
cmap_base = src + sizeof(bmp->header);
|
cmap_base = src + sizeof(bmp->header);
|
||||||
src = bmp_addr + get_unaligned_le32(&bmp->header.data_offset);
|
src = bmp_addr + get_unaligned_le32(&bmp->header.data_offset);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,5 +15,5 @@
|
||||||
|
|
||||||
#define range(x, min, max) ((x) < (min)) ? (min) : (((x) > (max)) ? (max) : (x))
|
#define range(x, min, max) ((x) < (min)) ? (min) : (((x) > (max)) ? (max) : (x))
|
||||||
|
|
||||||
int bmpdecoder(void *bmp_addr, void *dst, int dst_bpp, bool flip);
|
int bmpdecoder(void *bmp_addr, void *dst, int dst_bpp);
|
||||||
#endif /* _BMP_HELPER_H_ */
|
#endif /* _BMP_HELPER_H_ */
|
||||||
|
|
|
||||||
|
|
@ -166,11 +166,6 @@ static unsigned long get_display_size(void)
|
||||||
return memory_end - memory_start;
|
return memory_end - memory_start;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool bmp_can_disp_direct(struct logo_info *logo)
|
|
||||||
{
|
|
||||||
return logo->bpp == 24 || logo->bpp == 32;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* vop_support_ymirror - ensure whethere vop support the feature of ymirror.
|
* vop_support_ymirror - ensure whethere vop support the feature of ymirror.
|
||||||
* @logo: the pointer to the logo information.
|
* @logo: the pointer to the logo information.
|
||||||
|
|
@ -184,23 +179,21 @@ static bool vop_support_ymirror(struct logo_info *logo)
|
||||||
|
|
||||||
ret = false;
|
ret = false;
|
||||||
state = container_of(logo, struct display_state, logo);
|
state = container_of(logo, struct display_state, logo);
|
||||||
|
if (state->crtc_state.crtc->data) {
|
||||||
vop_data = (struct vop_data *)state->crtc_state.crtc->data;
|
vop_data = (struct vop_data *)state->crtc_state.crtc->data;
|
||||||
if (vop_data) {
|
|
||||||
printf("VOP hardware version v%d.%d, ",
|
printf("VOP hardware version v%d.%d, ",
|
||||||
VOP_MAJOR(vop_data->version),
|
VOP_MAJOR(vop_data->version),
|
||||||
VOP_MINOR(vop_data->version));
|
VOP_MINOR(vop_data->version));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* if the version of VOP is higher than v3.0,
|
* if the version of VOP is higher than v3.0,
|
||||||
* which means that the VOP support ymirror,
|
* which means that the VOP support ymirror,
|
||||||
* so it isn't need to mirror image by ourself.
|
* so it isn't need to mirror image by ourself.
|
||||||
*/
|
*/
|
||||||
if (VOP_WIN_SUPPORT(vop_data, vop_data->win, ymirror)) {
|
if (vop_data->version >= VOP_VERSION(3, 0)) {
|
||||||
printf("support mirror mode.\n");
|
printf("Support mirror mode.\n");
|
||||||
ret = true;
|
ret = true;
|
||||||
} else {
|
} else {
|
||||||
printf("not support mirror mode.\n");
|
printf("Not support mirror mode.\n");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
printf("Error: CRTC drivers is not ready.\n");
|
printf("Error: CRTC drivers is not ready.\n");
|
||||||
|
|
@ -972,14 +965,12 @@ static int display_logo(struct display_state *state)
|
||||||
printf("can't support bmp bits[%d]\n", logo->bpp);
|
printf("can't support bmp bits[%d]\n", logo->bpp);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
hdisplay = conn_state->mode.hdisplay;
|
hdisplay = conn_state->mode.hdisplay;
|
||||||
vdisplay = conn_state->mode.vdisplay;
|
vdisplay = conn_state->mode.vdisplay;
|
||||||
crtc_state->src_w = logo->width;
|
crtc_state->src_w = logo->width;
|
||||||
crtc_state->src_h = logo->height;
|
crtc_state->src_h = logo->height;
|
||||||
crtc_state->src_x = 0;
|
crtc_state->src_x = 0;
|
||||||
crtc_state->src_y = 0;
|
crtc_state->src_y = 0;
|
||||||
crtc_state->rb_swap = logo->rb_swap;
|
|
||||||
crtc_state->ymirror = logo->ymirror;
|
crtc_state->ymirror = logo->ymirror;
|
||||||
|
|
||||||
crtc_state->dma_addr = (u32)(unsigned long)logo->mem + logo->offset;
|
crtc_state->dma_addr = (u32)(unsigned long)logo->mem + logo->offset;
|
||||||
|
|
@ -1134,8 +1125,6 @@ static int load_bmp_logo(struct logo_info *logo, const char *bmp_name)
|
||||||
struct rockchip_logo_cache *logo_cache;
|
struct rockchip_logo_cache *logo_cache;
|
||||||
struct bmp_header *header;
|
struct bmp_header *header;
|
||||||
void *dst = NULL, *pdst;
|
void *dst = NULL, *pdst;
|
||||||
bool bmp_disp_direct = false;
|
|
||||||
bool vop_supp_ymirror = false;
|
|
||||||
int size, len;
|
int size, len;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
|
@ -1180,24 +1169,22 @@ static int load_bmp_logo(struct logo_info *logo, const char *bmp_name)
|
||||||
ret = -ENOENT;
|
ret = -ENOENT;
|
||||||
goto free_header;
|
goto free_header;
|
||||||
}
|
}
|
||||||
vop_supp_ymirror = vop_support_ymirror(logo);
|
|
||||||
bmp_disp_direct = bmp_can_disp_direct(logo);
|
if (!vop_support_ymirror(logo)) {
|
||||||
if (!vop_supp_ymirror || !bmp_disp_direct) {
|
|
||||||
int dst_size;
|
int dst_size;
|
||||||
/*
|
/*
|
||||||
* TODO: force use 16bpp if bpp less than 16;
|
* TODO: force use 16bpp if bpp less than 16;
|
||||||
*/
|
*/
|
||||||
logo->rb_swap = (logo->bpp == 8 ? true : false);
|
|
||||||
logo->bpp = (logo->bpp <= 16) ? 16 : logo->bpp;
|
logo->bpp = (logo->bpp <= 16) ? 16 : logo->bpp;
|
||||||
dst_size = logo->width * logo->height * logo->bpp >> 3;
|
dst_size = logo->width * logo->height * logo->bpp >> 3;
|
||||||
|
|
||||||
dst = get_display_buffer(dst_size);
|
dst = get_display_buffer(dst_size);
|
||||||
if (!dst) {
|
if (!dst) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto free_header;
|
goto free_header;
|
||||||
}
|
}
|
||||||
memset(dst, 0, dst_size);
|
memset(dst, 0, dst_size);
|
||||||
if (bmpdecoder(pdst, dst, logo->bpp,
|
if (bmpdecoder(pdst, dst, logo->bpp)) {
|
||||||
!vop_supp_ymirror)) {
|
|
||||||
printf("failed to decode bmp %s\n", bmp_name);
|
printf("failed to decode bmp %s\n", bmp_name);
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto free_header;
|
goto free_header;
|
||||||
|
|
@ -1205,12 +1192,12 @@ static int load_bmp_logo(struct logo_info *logo, const char *bmp_name)
|
||||||
flush_dcache_range((ulong)dst,
|
flush_dcache_range((ulong)dst,
|
||||||
ALIGN((ulong)dst + dst_size,
|
ALIGN((ulong)dst + dst_size,
|
||||||
CONFIG_SYS_CACHELINE_SIZE));
|
CONFIG_SYS_CACHELINE_SIZE));
|
||||||
|
|
||||||
logo->offset = 0;
|
logo->offset = 0;
|
||||||
logo->ymirror = vop_supp_ymirror;
|
logo->ymirror = 0;
|
||||||
} else {
|
} else {
|
||||||
logo->offset = get_unaligned_le32(&header->data_offset);
|
logo->offset = get_unaligned_le32(&header->data_offset);
|
||||||
logo->rb_swap = (logo->bpp != 32 ? true : false);
|
logo->ymirror = 1;
|
||||||
logo->ymirror = true;
|
|
||||||
}
|
}
|
||||||
logo->mem = dst;
|
logo->mem = dst;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -130,7 +130,6 @@ struct connector_state {
|
||||||
struct logo_info {
|
struct logo_info {
|
||||||
int mode;
|
int mode;
|
||||||
char *mem;
|
char *mem;
|
||||||
bool rb_swap;
|
|
||||||
bool ymirror;
|
bool ymirror;
|
||||||
u32 offset;
|
u32 offset;
|
||||||
u32 width;
|
u32 width;
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@ static const struct vop_win rk3288_win01_data = {
|
||||||
.enable = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 0),
|
.enable = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 0),
|
||||||
.format = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 1),
|
.format = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 1),
|
||||||
.rb_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 12),
|
.rb_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 12),
|
||||||
.ymirror = VOP_REG_VER(RK3288_DSP_CTRL0, 0x1, 23, 3, 1, -1),
|
.ymirror = VOP_REG_VER(RK3368_WIN0_CTRL0, 0x1, 22, 3, 2, -1),
|
||||||
.act_info = VOP_REG(RK3288_WIN0_ACT_INFO, 0x1fff1fff, 0),
|
.act_info = VOP_REG(RK3288_WIN0_ACT_INFO, 0x1fff1fff, 0),
|
||||||
.dsp_info = VOP_REG(RK3288_WIN0_DSP_INFO, 0x0fff0fff, 0),
|
.dsp_info = VOP_REG(RK3288_WIN0_DSP_INFO, 0x0fff0fff, 0),
|
||||||
.dsp_st = VOP_REG(RK3288_WIN0_DSP_ST, 0x1fff1fff, 0),
|
.dsp_st = VOP_REG(RK3288_WIN0_DSP_ST, 0x1fff1fff, 0),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue