210 lines
5.3 KiB
C
210 lines
5.3 KiB
C
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
|
|
/*
|
|
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
|
|
*/
|
|
|
|
#ifndef __MESON_PLANE_H
|
|
#define __MESON_PLANE_H
|
|
|
|
#include <linux/kernel.h>
|
|
#include <drm/drmP.h>
|
|
#include <drm/drm_plane.h>
|
|
#include <drm/drm_atomic.h>
|
|
#include <drm/drm_atomic_helper.h>
|
|
#include <drm/drm_rect.h>
|
|
#include <drm/drm_blend.h>
|
|
#include <uapi/amlogic/drm/meson_drm.h>
|
|
#include <linux/amlogic/media/vout/vout_notify.h>
|
|
#include <linux/amlogic/meson_uvm_core.h>
|
|
#include <drm/amlogic/meson_drm_plane.h>
|
|
#include "meson_fb.h"
|
|
|
|
/*legacy video driver issue caused zorder problem.*/
|
|
#define OSD_PLANE_BEGIN_ZORDER 65
|
|
#define OSD_PLANE_END_ZORDER 128
|
|
#define VIDEO_PLANE_BEGIN_ZORDER 0
|
|
#define VIDEO_PLANE_END_ZORDER 255
|
|
|
|
struct am_meson_plane_state {
|
|
struct drm_plane_state base;
|
|
u32 sec_en;
|
|
};
|
|
|
|
struct drm_video_present_fence_state {
|
|
s32 __user *video_present_ptr;
|
|
struct sync_file *sync_file;
|
|
int fd;
|
|
};
|
|
|
|
struct drm_video_release_fence_state {
|
|
s32 __user *video_release_ptr;
|
|
struct sync_file *sync_file;
|
|
int fd;
|
|
};
|
|
|
|
struct am_meson_video_plane_state {
|
|
struct drm_plane_state base;
|
|
u32 signal_fmt;
|
|
u32 frame_flag;
|
|
struct dma_fence *async_in_fence;
|
|
struct drm_video_present_fence_state video_present_fence_state;
|
|
struct drm_video_release_fence_state video_release_fence_state;
|
|
struct drm_property_blob *video_hdr_blob;
|
|
};
|
|
|
|
enum meson_max_fb_enum {
|
|
FB_SIZE_1920x1080 = 0,
|
|
FB_SIZE_3840x2160,
|
|
};
|
|
|
|
enum meson_plane_type {
|
|
OSD_PLANE = 0,
|
|
VIDEO_PLANE,
|
|
};
|
|
|
|
enum meson_video_signal_fmt_e {
|
|
SIGNAL_FMT_SDR = 0,
|
|
SIGNAL_FMT_HDR10 = 1,
|
|
SIGNAL_FMT_HDR10PRIME = 2,
|
|
SIGNAL_FMT_CUVA_HDR = 3,
|
|
};
|
|
|
|
struct osd_dimm_info {
|
|
u32 dimm_value;
|
|
/* 0:dimm not update, 1:dimm update from property, 2:dimm update from debug node */
|
|
int dimm_ctrl;
|
|
};
|
|
|
|
struct am_osd_plane {
|
|
/*base struct, same as am_video_plane*/
|
|
struct drm_plane base; //must be first element.
|
|
struct meson_drm *drv; //point to struct parent.
|
|
struct dentry *plane_debugfs_dir;
|
|
int plane_index;
|
|
int plane_type;
|
|
|
|
struct drm_property *occupied_property;
|
|
struct drm_property *prop_sec_en;
|
|
struct drm_property *palette;
|
|
struct drm_property *unsupport_nonafbc;
|
|
bool osd_occupied;
|
|
u32 palette_id;
|
|
/*max fb property*/
|
|
struct drm_property *max_fb_property;
|
|
struct drm_property *osd_capability_property;
|
|
struct drm_property *rotation_reflect_property;
|
|
struct drm_property *dimm_ctrl_property;
|
|
|
|
/*osd extend*/
|
|
u32 osd_reverse;
|
|
u32 osd_blend_bypass;
|
|
u32 osd_read_ports;
|
|
void *vir_addr;
|
|
u32 dump_size;
|
|
bool bflg;
|
|
u32 *receive_palette;
|
|
int osd_permanent_blank;
|
|
int zorder;
|
|
struct osd_dimm_info osd_dimm;
|
|
|
|
/* sysfs debug*/
|
|
u16 pixel_blend_debug;
|
|
struct drm_rect adjust_src;
|
|
struct drm_rect adjust_dst;
|
|
};
|
|
|
|
struct am_video_plane {
|
|
/*base struct, same as am_video_plane*/
|
|
struct drm_plane base; //must be first element.
|
|
struct meson_drm *drv; //point to struct parent.
|
|
struct dentry *plane_debugfs_dir;
|
|
int plane_index;
|
|
int plane_type;
|
|
|
|
/*release fence*/
|
|
spinlock_t fence_lock;
|
|
u64 context;
|
|
u64 seqno;
|
|
|
|
/*present fence*/
|
|
spinlock_t present_fence_lock;
|
|
u64 present_context;
|
|
u64 present_seqno;
|
|
|
|
struct drm_property *signal_fmt_property;
|
|
|
|
struct drm_property *video_cap_property;
|
|
struct drm_property *video_src_min_size_property;
|
|
struct drm_property *video_src_max_size_property;
|
|
|
|
struct drm_property *async_in_fence_property;
|
|
struct drm_property *video_present_fence_property;
|
|
struct drm_property *video_release_fence_property;
|
|
struct drm_property *video_hdr_metadata_property;
|
|
|
|
struct drm_property *frame_flag_prop;
|
|
|
|
struct meson_vpu_pipeline *pipeline;
|
|
spinlock_t lock; //used for video plane dma_fence
|
|
/*video exted*/
|
|
struct drm_rect adjust_src;
|
|
struct drm_rect adjust_dst;
|
|
};
|
|
|
|
struct meson_video_plane_fence_info {
|
|
struct dma_fence *fence;
|
|
struct vframe_s *vf;
|
|
atomic_t refcount;
|
|
};
|
|
|
|
struct vf_node {
|
|
struct meson_video_plane_fence_info *infos;
|
|
struct list_head vfm_node;
|
|
};
|
|
|
|
struct meson_plane_supported_formats {
|
|
u32 *formats;
|
|
u32 format_num;
|
|
};
|
|
|
|
#define to_am_osd_plane(x) container_of(x, \
|
|
struct am_osd_plane, base)
|
|
#define to_am_meson_plane_state(x) container_of(x, \
|
|
struct am_meson_plane_state, base)
|
|
#define to_am_video_plane(x) container_of(x, \
|
|
struct am_video_plane, base)
|
|
#define to_am_meson_video_plane_state(x) container_of(x, \
|
|
struct am_meson_video_plane_state, base)
|
|
|
|
int am_meson_plane_create(struct meson_drm *priv);
|
|
|
|
/*For async commit on kernel 4.9, and can be reused on kernel 5.4.*/
|
|
int meson_video_plane_async_check(struct drm_plane *plane,
|
|
struct drm_atomic_state *state);
|
|
void meson_video_plane_async_update(struct drm_plane *plane,
|
|
struct drm_atomic_state *state);
|
|
|
|
int meson_osd_plane_async_check(struct drm_plane *plane,
|
|
struct drm_atomic_state *state);
|
|
void meson_osd_plane_async_update(struct drm_plane *plane,
|
|
struct drm_atomic_state *state);
|
|
int meson_async_atomic_plane_set_property(struct drm_plane *plane,
|
|
struct drm_plane_state *state, struct drm_file *file_priv,
|
|
struct drm_property *property, u64 val);
|
|
|
|
struct drm_property *
|
|
meson_create_scaling_filter_prop(struct drm_device *dev,
|
|
unsigned int supported_filters);
|
|
|
|
void meson_video_set_vfmmode(struct device_node *of_node,
|
|
struct meson_drm *priv);
|
|
|
|
#if IS_ENABLED(CONFIG_SYNC_FILE)
|
|
int am_meson_dmabuf_export_sync_file_ioctl(struct drm_device *dev,
|
|
void *data, struct drm_file *file_priv);
|
|
#endif
|
|
int meson_plane_mute_ioctl(struct drm_device *dev,
|
|
void *data, struct drm_file *file_priv);
|
|
|
|
#endif
|