osd: add viu2 fence support [1/1]

PD#SWPL-6384

Problem:
viu2 not support fence

Solution:
add viu2 fence support.

Verify:
test pass on tl1

Change-Id: I94a5e483c88cace79b7386bb918c203ada6b8274
Signed-off-by: Pengcheng Chen <pengcheng.chen@amlogic.com>
This commit is contained in:
Pengcheng Chen
2019-02-15 16:52:52 +08:00
committed by Jianxin Pan
parent 867de9cdfb
commit 6862fb2e96
6 changed files with 689 additions and 578 deletions

View File

@@ -106,7 +106,6 @@ enum color_index_e {
#define FBIOPUT_OSD_CURSOR \
_IOWR(FB_IOC_MAGIC, 0x0, struct fb_cursor_user)
/* OSD color definition */
#define KEYCOLOR_FLAG_TARGET 1
#define KEYCOLOR_FLAG_ONHOLD 2
@@ -114,6 +113,8 @@ enum color_index_e {
#define HW_OSD_COUNT 4
#define OSD_BLEND_LAYERS 4
#define VIU_COUNT 2
/* OSD block definition */
#define HW_OSD_BLOCK_COUNT 4
#define HW_OSD_BLOCK_REG_COUNT (HW_OSD_BLOCK_COUNT*2)
@@ -706,7 +707,7 @@ struct hw_para_s {
u32 scan_mode[HW_OSD_COUNT];
u32 order[HW_OSD_COUNT];
u32 premult_en[HW_OSD_COUNT];
struct display_flip_info_s disp_info;
struct display_flip_info_s disp_info[VIU_COUNT];
struct osd_3d_mode_s mode_3d[HW_OSD_COUNT];
u32 updated[HW_OSD_COUNT];
/* u32 block_windows[HW_OSD_COUNT][HW_OSD_BLOCK_REG_COUNT]; */
@@ -721,7 +722,7 @@ struct hw_para_s {
int use_h_filter_mode[HW_OSD_COUNT];
int use_v_filter_mode[HW_OSD_COUNT];
struct hw_list_s reg[HW_REG_INDEX_MAX];
u32 field_out_en;
u32 field_out_en[VIU_COUNT];
u32 scale_workaround;
u32 fb_for_4k2k;
u32 antiflicker_mode;
@@ -733,21 +734,21 @@ struct hw_para_s {
struct osd_device_data_s osd_meson_dev;
u32 urgent[HW_OSD_COUNT];
u32 osd_deband_enable;
u32 osd_fps;
u32 osd_fps_start;
u32 osd_fps[VIU_COUNT];
u32 osd_fps_start[VIU_COUNT];
u32 osd_display_debug;
ulong screen_base[HW_OSD_COUNT];
ulong screen_size[HW_OSD_COUNT];
ulong screen_base_backup[HW_OSD_COUNT];
ulong screen_size_backup[HW_OSD_COUNT];
u32 vinfo_width;
u32 vinfo_height;
u32 vinfo_width[VIU_COUNT];
u32 vinfo_height[VIU_COUNT];
u32 fb_drvier_probe;
u32 afbc_force_reset;
u32 afbc_regs_backup;
u32 afbc_status_err_reset;
u32 afbc_use_latch;
u32 hwc_enable;
u32 hwc_enable[VIU_COUNT];
u32 osd_use_latch[HW_OSD_COUNT];
u32 hw_cursor_en;
u32 hw_rdma_en;
@@ -760,8 +761,8 @@ struct hw_para_s {
u32 viu_type;
u32 line_n_rdma;
struct hw_debug_s osd_debug;
int out_fence_fd;
int out_fence_fd[VIU_COUNT];
int in_fd[HW_OSD_COUNT];
struct osd_fence_fun_s osd_fence[2];
struct osd_fence_fun_s osd_fence[VIU_COUNT][2];
};
#endif /* _OSD_H_ */

View File

@@ -66,7 +66,9 @@ static void osd_debug_dump_value(void)
osd_log_info("--- OSD ---\n");
osd_log_info("bot_type: %d\n", hwpara->bot_type);
osd_log_info("field_out_en: %d\n", hwpara->field_out_en);
osd_log_info("field_out_en: %d\n", hwpara->field_out_en[VIU1]);
if (osd_hw.osd_meson_dev.has_viu2)
osd_log_info("field_out_en: %d\n", hwpara->field_out_en[VIU2]);
if (hwpara->osd_meson_dev.osd_ver == OSD_HIGH_ONE) {
struct hw_osd_blending_s *blend_para = NULL;

View File

@@ -563,11 +563,13 @@ static ssize_t osd_hwc_enable_read_file(struct file *file,
char __user *userbuf,
size_t count, loff_t *ppos)
{
struct seq_file *s = file->private_data;
int osd_id = *(int *)s;
char buf[128];
ssize_t len;
unsigned int hwc_enable = 0;
osd_get_hwc_enable(&hwc_enable);
osd_get_hwc_enable(osd_id, &hwc_enable);
len = snprintf(buf, 128, "%d\n", hwc_enable);
return simple_read_from_buffer(userbuf, count, ppos, buf, len);
}
@@ -576,6 +578,8 @@ static ssize_t osd_hwc_enable_write_file(struct file *file,
const char __user *userbuf,
size_t count, loff_t *ppos)
{
struct seq_file *s = file->private_data;
int osd_id = *(int *)s;
char buf[128];
unsigned int hwc_enable = 0;
int ret = 0;
@@ -586,7 +590,7 @@ static ssize_t osd_hwc_enable_write_file(struct file *file,
buf[count] = 0;
ret = kstrtoint(buf, 0, &hwc_enable);
osd_log_info("hwc enable: %d\n", hwc_enable);
osd_set_hwc_enable(hwc_enable);
osd_set_hwc_enable(osd_id, hwc_enable);
return count;
}
@@ -594,6 +598,8 @@ static ssize_t osd_do_hwc_write_file(struct file *file,
const char __user *userbuf,
size_t count, loff_t *ppos)
{
struct seq_file *s = file->private_data;
int osd_id = *(int *)s;
char buf[128];
unsigned int do_hwc = 0;
int ret = 0;
@@ -605,7 +611,7 @@ static ssize_t osd_do_hwc_write_file(struct file *file,
ret = kstrtoint(buf, 0, &do_hwc);
osd_log_info("do_hwc: %d\n", do_hwc);
if (do_hwc)
osd_do_hwc();
osd_do_hwc(osd_id);
return count;
}

View File

@@ -652,10 +652,13 @@ static int osd_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
static int osd_set_par(struct fb_info *info)
{
const struct vinfo_s *vinfo;
const struct vinfo_s *vinfo = NULL;
struct osd_fb_dev_s *fbdev = (struct osd_fb_dev_s *)info->par;
struct osd_ctl_s *osd_ctrl = &fbdev->osd_ctl;
u32 virt_end_x, virt_end_y;
u32 output_index;
output_index = get_output_device_id(fbdev->fb_index);
if (fbdev->fb_index < osd_hw.osd_meson_dev.viu1_osd_count) {
vinfo = get_current_vinfo();
@@ -664,7 +667,9 @@ static int osd_set_par(struct fb_info *info)
return -1;
}
} else {
#ifdef CONFIG_AMLOGIC_VOUT2_SERVE
vinfo = get_current_vinfo2();
#endif
if (!vinfo) {
osd_log_err("current vinfo NULL\n");
return -1;
@@ -849,7 +854,7 @@ static int osd_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
arg & 0xffff ? 1 : 0);
break;
case FBIOGET_OSD_FLUSH_RATE:
osd_get_flush_rate_hw(&flush_rate);
osd_get_flush_rate_hw(info->node, &flush_rate);
if (copy_to_user(argp, &flush_rate, sizeof(u32)))
return -EFAULT;
break;
@@ -1059,12 +1064,12 @@ static int osd_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
#endif
break;
case FBIOPUT_OSD_HWC_ENABLE:
osd_set_hwc_enable(hwc_enable);
osd_set_hwc_enable(info->node, hwc_enable);
ret = 0;
break;
case FBIOPUT_OSD_DO_HWC:
do_hwc_cmd.out_fen_fd =
osd_sync_do_hwc(&do_hwc_cmd);
osd_sync_do_hwc(info->node, &do_hwc_cmd);
ret = copy_to_user(argp,
&do_hwc_cmd,
sizeof(struct do_hwc_cmd_s));
@@ -1853,13 +1858,14 @@ static int osd_cursor(struct fb_info *fbi, struct fb_cursor *var)
{
s16 startx = 0, starty = 0;
struct osd_fb_dev_s *fb_dev = gp_fbdev_list[1];
u32 output_index;
if (fb_dev) {
startx = fb_dev->osd_ctl.disp_start_x;
starty = fb_dev->osd_ctl.disp_start_y;
}
if (osd_hw.hwc_enable)
output_index = get_output_device_id(fbi->node);
if (osd_hw.hwc_enable[output_index])
osd_cursor_hw_no_scale(fbi->node, (s16)var->hot.x,
(s16)var->hot.y, (s16)startx, (s16)starty,
fbi->var.xres, fbi->var.yres);
@@ -1944,9 +1950,9 @@ int osd_notify_callback(struct notifier_block *block, unsigned long 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);
osd_hw.vinfo_width[VIU1] = vinfo->width;
osd_hw.vinfo_height[VIU1] = vinfo->field_height;
osd_hw.field_out_en[VIU1] = is_interlaced(vinfo);
switch (cmd) {
case VOUT_EVENT_MODE_CHANGE:
set_osd_logo_freescaler();
@@ -1955,7 +1961,7 @@ int osd_notify_callback(struct notifier_block *block, unsigned long cmd,
set_reset_rdma_trigger_line();
if ((osd_meson_dev.osd_ver == OSD_NORMAL)
|| (osd_meson_dev.osd_ver == OSD_SIMPLE)
|| (osd_hw.hwc_enable == 0)) {
|| (osd_hw.hwc_enable[VIU1] == 0)) {
for (i = 0; i < osd_meson_dev.viu1_osd_count; i++) {
fb_dev = gp_fbdev_list[i];
if (fb_dev == NULL)
@@ -1986,7 +1992,7 @@ int osd_notify_callback(struct notifier_block *block, unsigned long cmd,
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)) {
|| (osd_hw.hwc_enable[VIU1] == 0)) {
disp_rect = (struct disp_rect_s *)para;
for (i = 0; i < osd_meson_dev.viu1_osd_count; i++) {
@@ -2037,111 +2043,6 @@ int osd_notify_callback(struct notifier_block *block, unsigned long cmd,
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();
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);
if ((osd_meson_dev.osd_ver == OSD_NORMAL)
|| (osd_meson_dev.osd_ver == OSD_SIMPLE))
osd_set_antiflicker_hw(DEV_OSD1, vinfo,
gp_fbdev_list
[DEV_OSD1]->fb_info->var.yres);
else if (osd_meson_dev.osd_ver == OSD_HIGH_ONE)
osd_set_antiflicker_hw(i, vinfo,
gp_fbdev_list[i]->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:
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;
}
#endif
int osd_notify_callback_viu2(struct notifier_block *block, unsigned long cmd,
void *para)
{
@@ -2162,6 +2063,8 @@ int osd_notify_callback_viu2(struct notifier_block *block, unsigned long cmd,
vinfo->name, cmd);
if (!strcmp(vinfo->name, "invalid"))
return -1;
osd_hw.vinfo_width[VIU2] = vinfo->width;
osd_hw.vinfo_height[VIU2] = vinfo->field_height;
i = osd_meson_dev.viu2_index;
switch (cmd) {
case VOUT_EVENT_MODE_CHANGE:
@@ -2796,9 +2699,10 @@ static ssize_t show_flush_rate(struct device *device,
struct device_attribute *attr,
char *buf)
{
struct fb_info *fb_info = dev_get_drvdata(device);
u32 flush_rate = 0;
osd_get_flush_rate_hw(&flush_rate);
osd_get_flush_rate_hw(fb_info->node, &flush_rate);
return snprintf(buf, PAGE_SIZE, "flush_rate:[%d]\n", flush_rate);
}
@@ -2850,15 +2754,22 @@ static ssize_t store_antiflicker(struct device *device,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct vinfo_s *vinfo;
struct vinfo_s *vinfo = NULL;
unsigned int osd_antiflicker = 0;
struct fb_info *fb_info = dev_get_drvdata(device);
int res = 0;
int ret = 0;
u32 output_index;
ret = kstrtoint(buf, 0, &res);
osd_antiflicker = res;
vinfo = get_current_vinfo();
output_index = get_output_device_id(fb_info->node);
if (output_index == VIU1)
vinfo = get_current_vinfo();
#ifdef CONFIG_AMLOGIC_VOUT2_SERVE
else if (output_index == VIU2)
vinfo = get_current_vinfo2();
#endif
if (!vinfo) {
osd_log_err("get current vinfo NULL\n");
return 0;
@@ -2974,9 +2885,10 @@ static ssize_t show_osd_fps(struct device *device,
struct device_attribute *attr,
char *buf)
{
struct fb_info *fb_info = dev_get_drvdata(device);
u32 osd_fps;
osd_get_fps(&osd_fps);
osd_get_fps(fb_info->node, &osd_fps);
return snprintf(buf, 40, "%d\n",
osd_fps);
}
@@ -2985,11 +2897,12 @@ static ssize_t store_osd_fps(struct device *device,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct fb_info *fb_info = dev_get_drvdata(device);
int res = 0;
int ret = 0;
ret = kstrtoint(buf, 0, &res);
osd_set_fps(res);
osd_set_fps(fb_info->node, res);
return count;
}
@@ -3076,9 +2989,10 @@ static ssize_t show_osd_background_size(struct device *device,
struct device_attribute *attr,
char *buf)
{
struct fb_info *fb_info = dev_get_drvdata(device);
struct display_flip_info_s disp_info;
osd_get_background_size(&disp_info);
osd_get_background_size(fb_info->node, &disp_info);
return snprintf(buf, 80, "%d %d %d %d %d %d %d %d\n",
disp_info.background_w,
disp_info.background_h,
@@ -3094,12 +3008,14 @@ static ssize_t store_osd_background_size(struct device *device,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct fb_info *fb_info = dev_get_drvdata(device);
int parsed[8];
if (likely(parse_para(buf, 8, parsed) == 8)) {
if (likely(parse_para(buf, 8, parsed) == 8))
osd_set_background_size(
fb_info->node,
(struct display_flip_info_s *)&parsed);
} else
else
osd_log_err("set background size error\n");
return count;
@@ -3162,9 +3078,10 @@ static ssize_t show_osd_hwc_enalbe(struct device *device,
struct device_attribute *attr,
char *buf)
{
struct fb_info *fb_info = dev_get_drvdata(device);
u32 hwc_enalbe;
osd_get_hwc_enable(&hwc_enalbe);
osd_get_hwc_enable(fb_info->node, &hwc_enalbe);
return snprintf(buf, 40, "%d\n",
hwc_enalbe);
}
@@ -3173,13 +3090,14 @@ static ssize_t store_osd_hwc_enalbe(struct device *device,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct fb_info *fb_info = dev_get_drvdata(device);
int res = 0;
int ret = 0;
ret = kstrtoint(buf, 0, &res);
if (ret < 0)
return -EINVAL;
osd_set_hwc_enable(res);
osd_set_hwc_enable(fb_info->node, res);
return count;
}
@@ -3188,6 +3106,7 @@ static ssize_t store_do_hwc(struct device *device,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct fb_info *fb_info = dev_get_drvdata(device);
int res = 0;
int ret = 0;
@@ -3195,7 +3114,7 @@ static ssize_t store_do_hwc(struct device *device,
if (ret < 0)
return -EINVAL;
if (res)
osd_do_hwc();
osd_do_hwc(fb_info->node);
return count;
}
@@ -3229,13 +3148,14 @@ static ssize_t store_osd_single_step_mode(struct device *device,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct fb_info *fb_info = dev_get_drvdata(device);
int res = 0;
int ret = 0;
ret = kstrtoint(buf, 0, &res);
if (ret < 0)
return -EINVAL;
osd_set_single_step_mode(res);
osd_set_single_step_mode(fb_info->node, res);
return count;
}
@@ -3244,13 +3164,14 @@ static ssize_t store_osd_single_step(struct device *device,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct fb_info *fb_info = dev_get_drvdata(device);
int res = 0;
int ret = 0;
ret = kstrtoint(buf, 0, &res);
if (ret < 0)
return -EINVAL;
osd_set_single_step(res);
osd_set_single_step(fb_info->node, res);
return count;
}

File diff suppressed because it is too large Load Diff

View File

@@ -102,7 +102,7 @@ extern void osd_set_block_mode_hw(u32 index, u32 mode);
extern void osd_enable_3d_mode_hw(u32 index, u32 enable);
extern void osd_set_2x_scale_hw(u32 index, u16 h_scale_enable,
u16 v_scale_enable);
extern void osd_get_flush_rate_hw(u32 *break_rate);
extern void osd_get_flush_rate_hw(u32 index, u32 *break_rate);
extern void osd_set_reverse_hw(u32 index, u32 reverse, u32 update);
extern void osd_get_reverse_hw(u32 index, u32 *reverse);
extern void osd_set_antiflicker_hw(u32 index, struct vinfo_s *vinfo, u32 yres);
@@ -126,7 +126,7 @@ extern int osd_sync_request_render(u32 index, u32 yres,
struct sync_req_render_s *request,
u32 phys_addr,
size_t len);
extern int osd_sync_do_hwc(struct do_hwc_cmd_s *hwc_cmd);
int osd_sync_do_hwc(u32 output_index, struct do_hwc_cmd_s *hwc_cmd);
extern s64 osd_wait_vsync_event(void);
extern void osd_cursor_hw(u32 index, s16 x, s16 y, s16 xstart, s16 ystart,
u32 osd_w, u32 osd_h);
@@ -165,8 +165,8 @@ extern void osd_get_urgent(u32 index, u32 *urgent);
extern void osd_set_urgent(u32 index, u32 urgent);
void osd_get_deband(u32 *osd_deband_enable);
void osd_set_deband(u32 osd_deband_enable);
void osd_get_fps(u32 *osd_fps);
void osd_set_fps(u32 osd_fps_start);
void osd_get_fps(u32 index, u32 *osd_fps);
void osd_set_fps(u32 index, u32 osd_fps_start);
extern void osd_get_info(u32 index, u32 *addr, u32 *width, u32 *height);
void osd_update_scan_mode(void);
void osd_update_3d_mode(void);
@@ -180,15 +180,15 @@ 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);
void osd_set_background_size(struct display_flip_info_s *disp_info);
void osd_get_background_size(u32 index, struct display_flip_info_s *disp_info);
void osd_set_background_size(u32 index, struct display_flip_info_s *disp_info);
void osd_get_hdr_used(u32 *val);
void osd_set_hdr_used(u32 val);
void osd_get_afbc_format(u32 index, u32 *format, u32 *inter_format);
void osd_set_afbc_format(u32 index, u32 format, u32 inter_format);
void osd_get_hwc_enable(u32 *hwc_enable);
void osd_set_hwc_enable(u32 hwc_enable);
void osd_do_hwc(void);
void osd_get_hwc_enable(u32 index, u32 *hwc_enable);
void osd_set_hwc_enable(u32 index, u32 hwc_enable);
void osd_do_hwc(u32 index);
int osd_get_capbility(u32 index);
void osd_backup_screen_info(
u32 index,
@@ -204,12 +204,12 @@ ssize_t dd_vmap_write(u32 index, const char __user *buf,
int osd_set_clear(u32 index);
void osd_page_flip(struct osd_plane_map_s *plane_map);
void walk_through_update_list(void);
int osd_setting_blend(void);
void osd_set_hwc_enable(u32 hwc_enable);
int osd_setting_blend(u32 output_index);
void osd_set_hwc_enable(u32 index, u32 hwc_enable);
void osd_set_urgent_info(u32 ports, u32 basic_urgent);
void osd_get_urgent_info(u32 *ports, u32 *basic_urgent);
void osd_set_single_step_mode(u32 osd_single_step_mode);
void osd_set_single_step(u32 osd_single_step);
void osd_set_single_step_mode(u32 index, u32 osd_single_step_mode);
void osd_set_single_step(u32 index, u32 osd_single_step);
void output_save_info(void);
void osd_get_rotate(u32 index, u32 *osd_rotate);
void osd_set_rotate(u32 index, u32 osd_rotate);
@@ -218,4 +218,5 @@ void osd_get_dimm_info(u32 index, u32 *osd_dimm_layer, u32 *osd_dimm_color);
void osd_set_dimm_info(u32 index, u32 osd_dimm_layer, u32 osd_dimm_color);
u32 osd_get_line_n_rdma(void);
void osd_set_line_n_rdma(u32 line_n_rdma);
u32 get_output_device_id(u32 index);
#endif