osd: add meson-hwc repodution rate support [1/2]

PD#SWPL-1810

Problem:
osd blend repodution rate not supported

Solution:
add meson-hwc repodution rate support

Verify:
verified on u212 dev board

Change-Id: Ied10393e240e8d3f2a1eefe17a2d4d3c965e3383
Signed-off-by: pengcheng chen <pengcheng.chen@amlogic.com>
This commit is contained in:
pengcheng chen
2018-10-30 14:55:40 +08:00
committed by Dongjin Kim
parent 4d06c778e9
commit b6e329587f
5 changed files with 486 additions and 379 deletions

View File

@@ -583,32 +583,24 @@ struct layer_blend_s {
struct dispdata_s input1_data;
struct dispdata_s input2_data;
struct dispdata_s output_data;
u32 background_w;
u32 background_h;
u32 blend_core1_bypass;
};
struct hw_osd_blending_s {
u8 osd_blend_mode;
u8 osd_to_bdin_table[OSD_BLEND_LAYERS];
u8 reorder[HW_OSD_COUNT];
u8 blend_din;
u32 din_reoder_sel;
u32 layer_cnt;
bool change_order;
bool b_exchange_din;
bool b_exchange_blend_in;
bool osd1_freescale_used;
bool osd1_freescale_disable;
bool bscaler_down[HW_OSD_COUNT];
u32 background_w;
u32 background_h;
u32 vinfo_width;
u32 vinfo_height;
u32 screen1_ratio_w;
u32 screen1_ratio_h;
u32 screen2_ratio_w;
u32 screen2_ratio_h;
u32 pic_w_ratio;
u32 pic_h_ratio;
u32 screen_ratio_w;
u32 screen_ratio_h;
struct dispdata_s dst_data;
struct layer_blend_reg_s blend_reg;
struct layer_blend_s layer_blend;
};
@@ -738,7 +730,6 @@ struct hw_para_s {
u32 osd_clear[HW_OSD_COUNT];
u32 vinfo_width;
u32 vinfo_height;
u32 b_interlaced;
u32 fb_drvier_probe;
u32 afbc_force_reset;
u32 afbc_regs_backup;
@@ -750,8 +741,6 @@ struct hw_para_s {
u32 hw_rdma_en;
u32 blend_bypass;
u32 hdr_used;
u32 workaround_hdr;
u32 workaround_not_hdr;
u32 basic_urgent;
u32 two_ports;
u32 afbc_err_cnt;

View File

@@ -74,9 +74,6 @@ static void osd_debug_dump_value(void)
osd_get_blending_para(&blend_para);
if (blend_para != NULL) {
osd_log_info("OSD LAYER: %d\n", blend_para->layer_cnt);
osd_log_info("OSD background size: %d, %d\n",
blend_para->background_w,
blend_para->background_h);
osd_log_info("|index\t|order\t|src axis\t|dst axis\n");
for (index = 0; index < HW_OSD_COUNT; index++) {
osd_log_info("%2d\t%2d\t(%4d,%4d,%4d,%4d)\t(%4d,%4d,%4d,%4d)\n",

View File

@@ -1675,6 +1675,116 @@ int osd_notify_callback(struct notifier_block *block, unsigned long cmd,
return -1;
osd_hw.vinfo_width = vinfo->width;
osd_hw.vinfo_height = vinfo->field_height;
osd_hw.field_out_en = is_interlaced(vinfo);
switch (cmd) {
case VOUT_EVENT_MODE_CHANGE:
set_osd_logo_freescaler();
if ((osd_meson_dev.osd_ver == OSD_NORMAL)
|| (osd_meson_dev.osd_ver == OSD_SIMPLE)
|| (osd_hw.hwc_enable == 0)) {
for (i = 0; i < osd_meson_dev.viu1_osd_count; i++) {
fb_dev = gp_fbdev_list[i];
if (fb_dev == NULL)
continue;
set_default_display_axis(&fb_dev->fb_info->var,
&fb_dev->osd_ctl, vinfo);
console_lock();
osddev_update_disp_axis(fb_dev, 1);
osd_set_antiflicker_hw(DEV_OSD1, vinfo,
gp_fbdev_list[DEV_OSD1]->fb_info->var.yres);
osd_reg_write(VPP_POSTBLEND_H_SIZE, vinfo->width);
console_unlock();
}
}
break;
case VOUT_EVENT_OSD_BLANK:
blank = *(int *)para;
for (i = 0; i < osd_meson_dev.viu1_osd_count; i++) {
fb_dev = gp_fbdev_list[i];
if (fb_dev == NULL)
continue;
console_lock();
osd_blank(blank, fb_dev->fb_info);
console_unlock();
}
break;
case VOUT_EVENT_OSD_DISP_AXIS:
if ((osd_meson_dev.osd_ver == OSD_NORMAL)
|| (osd_meson_dev.osd_ver == OSD_SIMPLE)
|| (osd_hw.hwc_enable == 0)) {
disp_rect = (struct disp_rect_s *)para;
for (i = 0; i < osd_meson_dev.viu1_osd_count; i++) {
if (!disp_rect)
break;
/* vout serve send only two layer axis */
if (i >= 2)
break;
fb_dev = gp_fbdev_list[i];
/*
* if osd layer preblend,
* it's position is controlled by vpp.
if (fb_dev->preblend_enable)
break;
*/
fb_dev->osd_ctl.disp_start_x = disp_rect->x;
fb_dev->osd_ctl.disp_start_y = disp_rect->y;
osd_log_dbg("set disp axis: x:%d y:%d w:%d h:%d\n",
disp_rect->x, disp_rect->y,
disp_rect->w, disp_rect->h);
if (disp_rect->x + disp_rect->w > vinfo->width)
fb_dev->osd_ctl.disp_end_x = vinfo->width - 1;
else
fb_dev->osd_ctl.disp_end_x =
fb_dev->osd_ctl.disp_start_x +
disp_rect->w - 1;
if (disp_rect->y + disp_rect->h > vinfo->height)
fb_dev->osd_ctl.disp_end_y = vinfo->height - 1;
else
fb_dev->osd_ctl.disp_end_y =
fb_dev->osd_ctl.disp_start_y +
disp_rect->h - 1;
disp_rect++;
osd_log_dbg("new disp axis: x0:%d y0:%d x1:%d y1:%d\n",
fb_dev->osd_ctl.disp_start_x,
fb_dev->osd_ctl.disp_start_y,
fb_dev->osd_ctl.disp_end_x,
fb_dev->osd_ctl.disp_end_y);
console_lock();
osddev_update_disp_axis(fb_dev, 0);
console_unlock();
}
}
break;
}
return 0;
}
#if 0
int osd_notify_callback(struct notifier_block *block, unsigned long cmd,
void *para)
{
struct vinfo_s *vinfo;
struct osd_fb_dev_s *fb_dev;
int i, blank;
struct disp_rect_s *disp_rect;
vinfo = get_current_vinfo();
if (!vinfo) {
osd_log_err("current vinfo NULL\n");
return -1;
}
osd_log_info("current vmode=%s, cmd: 0x%lx\n",
vinfo->name, cmd);
if ((!strcmp(vinfo->name, "invalid")) ||
(!strcmp(vinfo->name, "null")))
return -1;
osd_hw.vinfo_width = vinfo->width;
osd_hw.vinfo_height = vinfo->field_height;
osd_hw.field_out_en = is_interlaced(vinfo);
switch (cmd) {
case VOUT_EVENT_MODE_CHANGE:
set_osd_logo_freescaler();
@@ -1757,7 +1867,7 @@ int osd_notify_callback(struct notifier_block *block, unsigned long cmd,
}
return 0;
}
#endif
int osd_notify_callback_viu2(struct notifier_block *block, unsigned long cmd,
void *para)
{

File diff suppressed because it is too large Load Diff

View File

@@ -173,6 +173,7 @@ int logo_work_init(void);
int get_logo_loaded(void);
void set_logo_loaded(void);
int set_osd_logo_freescaler(void);
int is_interlaced(struct vinfo_s *vinfo);
void osd_get_display_debug(u32 *osd_display_debug_enable);
void osd_set_display_debug(u32 osd_display_debug_enable);
void osd_get_background_size(struct display_flip_info_s *disp_info);