mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
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:
committed by
Dongjin Kim
parent
4d06c778e9
commit
b6e329587f
@@ -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;
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user