162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2016 BayLibre, SAS 462306a36Sopenharmony_ci * Author: Neil Armstrong <narmstrong@baylibre.com> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef __MESON_DRV_H 862306a36Sopenharmony_ci#define __MESON_DRV_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/device.h> 1162306a36Sopenharmony_ci#include <linux/of.h> 1262306a36Sopenharmony_ci#include <linux/regmap.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cistruct drm_crtc; 1562306a36Sopenharmony_cistruct drm_device; 1662306a36Sopenharmony_cistruct drm_plane; 1762306a36Sopenharmony_cistruct meson_drm; 1862306a36Sopenharmony_cistruct meson_afbcd_ops; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cienum vpu_compatible { 2162306a36Sopenharmony_ci VPU_COMPATIBLE_GXBB = 0, 2262306a36Sopenharmony_ci VPU_COMPATIBLE_GXL = 1, 2362306a36Sopenharmony_ci VPU_COMPATIBLE_GXM = 2, 2462306a36Sopenharmony_ci VPU_COMPATIBLE_G12A = 3, 2562306a36Sopenharmony_ci}; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cienum { 2862306a36Sopenharmony_ci MESON_ENC_CVBS = 0, 2962306a36Sopenharmony_ci MESON_ENC_HDMI, 3062306a36Sopenharmony_ci MESON_ENC_DSI, 3162306a36Sopenharmony_ci MESON_ENC_LAST, 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistruct meson_drm_match_data { 3562306a36Sopenharmony_ci enum vpu_compatible compat; 3662306a36Sopenharmony_ci struct meson_afbcd_ops *afbcd_ops; 3762306a36Sopenharmony_ci}; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistruct meson_drm_soc_limits { 4062306a36Sopenharmony_ci unsigned int max_hdmi_phy_freq; 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistruct meson_drm { 4462306a36Sopenharmony_ci struct device *dev; 4562306a36Sopenharmony_ci enum vpu_compatible compat; 4662306a36Sopenharmony_ci void __iomem *io_base; 4762306a36Sopenharmony_ci struct regmap *hhi; 4862306a36Sopenharmony_ci int vsync_irq; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci struct meson_canvas *canvas; 5162306a36Sopenharmony_ci u8 canvas_id_osd1; 5262306a36Sopenharmony_ci u8 canvas_id_vd1_0; 5362306a36Sopenharmony_ci u8 canvas_id_vd1_1; 5462306a36Sopenharmony_ci u8 canvas_id_vd1_2; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci struct drm_device *drm; 5762306a36Sopenharmony_ci struct drm_crtc *crtc; 5862306a36Sopenharmony_ci struct drm_plane *primary_plane; 5962306a36Sopenharmony_ci struct drm_plane *overlay_plane; 6062306a36Sopenharmony_ci void *encoders[MESON_ENC_LAST]; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci const struct meson_drm_soc_limits *limits; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci /* Components Data */ 6562306a36Sopenharmony_ci struct { 6662306a36Sopenharmony_ci bool osd1_enabled; 6762306a36Sopenharmony_ci bool osd1_interlace; 6862306a36Sopenharmony_ci bool osd1_commit; 6962306a36Sopenharmony_ci bool osd1_afbcd; 7062306a36Sopenharmony_ci uint32_t osd1_ctrl_stat; 7162306a36Sopenharmony_ci uint32_t osd1_ctrl_stat2; 7262306a36Sopenharmony_ci uint32_t osd1_blk0_cfg[5]; 7362306a36Sopenharmony_ci uint32_t osd1_blk1_cfg4; 7462306a36Sopenharmony_ci uint32_t osd1_blk2_cfg4; 7562306a36Sopenharmony_ci uint32_t osd1_addr; 7662306a36Sopenharmony_ci uint32_t osd1_stride; 7762306a36Sopenharmony_ci uint32_t osd1_height; 7862306a36Sopenharmony_ci uint32_t osd1_width; 7962306a36Sopenharmony_ci uint32_t osd_sc_ctrl0; 8062306a36Sopenharmony_ci uint32_t osd_sc_i_wh_m1; 8162306a36Sopenharmony_ci uint32_t osd_sc_o_h_start_end; 8262306a36Sopenharmony_ci uint32_t osd_sc_o_v_start_end; 8362306a36Sopenharmony_ci uint32_t osd_sc_v_ini_phase; 8462306a36Sopenharmony_ci uint32_t osd_sc_v_phase_step; 8562306a36Sopenharmony_ci uint32_t osd_sc_h_ini_phase; 8662306a36Sopenharmony_ci uint32_t osd_sc_h_phase_step; 8762306a36Sopenharmony_ci uint32_t osd_sc_h_ctrl0; 8862306a36Sopenharmony_ci uint32_t osd_sc_v_ctrl0; 8962306a36Sopenharmony_ci uint32_t osd_blend_din0_scope_h; 9062306a36Sopenharmony_ci uint32_t osd_blend_din0_scope_v; 9162306a36Sopenharmony_ci uint32_t osb_blend0_size; 9262306a36Sopenharmony_ci uint32_t osb_blend1_size; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci bool vd1_enabled; 9562306a36Sopenharmony_ci bool vd1_commit; 9662306a36Sopenharmony_ci bool vd1_afbc; 9762306a36Sopenharmony_ci unsigned int vd1_planes; 9862306a36Sopenharmony_ci uint32_t vd1_if0_gen_reg; 9962306a36Sopenharmony_ci uint32_t vd1_if0_luma_x0; 10062306a36Sopenharmony_ci uint32_t vd1_if0_luma_y0; 10162306a36Sopenharmony_ci uint32_t vd1_if0_chroma_x0; 10262306a36Sopenharmony_ci uint32_t vd1_if0_chroma_y0; 10362306a36Sopenharmony_ci uint32_t vd1_if0_repeat_loop; 10462306a36Sopenharmony_ci uint32_t vd1_if0_luma0_rpt_pat; 10562306a36Sopenharmony_ci uint32_t vd1_if0_chroma0_rpt_pat; 10662306a36Sopenharmony_ci uint32_t vd1_range_map_y; 10762306a36Sopenharmony_ci uint32_t vd1_range_map_cb; 10862306a36Sopenharmony_ci uint32_t vd1_range_map_cr; 10962306a36Sopenharmony_ci uint32_t viu_vd1_fmt_w; 11062306a36Sopenharmony_ci uint32_t vd1_if0_canvas0; 11162306a36Sopenharmony_ci uint32_t vd1_if0_gen_reg2; 11262306a36Sopenharmony_ci uint32_t viu_vd1_fmt_ctrl; 11362306a36Sopenharmony_ci uint32_t vd1_addr0; 11462306a36Sopenharmony_ci uint32_t vd1_addr1; 11562306a36Sopenharmony_ci uint32_t vd1_addr2; 11662306a36Sopenharmony_ci uint32_t vd1_stride0; 11762306a36Sopenharmony_ci uint32_t vd1_stride1; 11862306a36Sopenharmony_ci uint32_t vd1_stride2; 11962306a36Sopenharmony_ci uint32_t vd1_height0; 12062306a36Sopenharmony_ci uint32_t vd1_height1; 12162306a36Sopenharmony_ci uint32_t vd1_height2; 12262306a36Sopenharmony_ci uint32_t vd1_afbc_mode; 12362306a36Sopenharmony_ci uint32_t vd1_afbc_en; 12462306a36Sopenharmony_ci uint32_t vd1_afbc_head_addr; 12562306a36Sopenharmony_ci uint32_t vd1_afbc_body_addr; 12662306a36Sopenharmony_ci uint32_t vd1_afbc_conv_ctrl; 12762306a36Sopenharmony_ci uint32_t vd1_afbc_dec_def_color; 12862306a36Sopenharmony_ci uint32_t vd1_afbc_vd_cfmt_ctrl; 12962306a36Sopenharmony_ci uint32_t vd1_afbc_vd_cfmt_w; 13062306a36Sopenharmony_ci uint32_t vd1_afbc_vd_cfmt_h; 13162306a36Sopenharmony_ci uint32_t vd1_afbc_mif_hor_scope; 13262306a36Sopenharmony_ci uint32_t vd1_afbc_mif_ver_scope; 13362306a36Sopenharmony_ci uint32_t vd1_afbc_size_out; 13462306a36Sopenharmony_ci uint32_t vd1_afbc_pixel_hor_scope; 13562306a36Sopenharmony_ci uint32_t vd1_afbc_pixel_ver_scope; 13662306a36Sopenharmony_ci uint32_t vd1_afbc_size_in; 13762306a36Sopenharmony_ci uint32_t vpp_pic_in_height; 13862306a36Sopenharmony_ci uint32_t vpp_postblend_vd1_h_start_end; 13962306a36Sopenharmony_ci uint32_t vpp_postblend_vd1_v_start_end; 14062306a36Sopenharmony_ci uint32_t vpp_hsc_region12_startp; 14162306a36Sopenharmony_ci uint32_t vpp_hsc_region34_startp; 14262306a36Sopenharmony_ci uint32_t vpp_hsc_region4_endp; 14362306a36Sopenharmony_ci uint32_t vpp_hsc_start_phase_step; 14462306a36Sopenharmony_ci uint32_t vpp_hsc_region1_phase_slope; 14562306a36Sopenharmony_ci uint32_t vpp_hsc_region3_phase_slope; 14662306a36Sopenharmony_ci uint32_t vpp_line_in_length; 14762306a36Sopenharmony_ci uint32_t vpp_preblend_h_size; 14862306a36Sopenharmony_ci uint32_t vpp_vsc_region12_startp; 14962306a36Sopenharmony_ci uint32_t vpp_vsc_region34_startp; 15062306a36Sopenharmony_ci uint32_t vpp_vsc_region4_endp; 15162306a36Sopenharmony_ci uint32_t vpp_vsc_start_phase_step; 15262306a36Sopenharmony_ci uint32_t vpp_vsc_ini_phase; 15362306a36Sopenharmony_ci uint32_t vpp_vsc_phase_ctrl; 15462306a36Sopenharmony_ci uint32_t vpp_hsc_phase_ctrl; 15562306a36Sopenharmony_ci uint32_t vpp_blend_vd2_h_start_end; 15662306a36Sopenharmony_ci uint32_t vpp_blend_vd2_v_start_end; 15762306a36Sopenharmony_ci } viu; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci struct { 16062306a36Sopenharmony_ci unsigned int current_mode; 16162306a36Sopenharmony_ci bool hdmi_repeat; 16262306a36Sopenharmony_ci bool venc_repeat; 16362306a36Sopenharmony_ci bool hdmi_use_enci; 16462306a36Sopenharmony_ci } venc; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci struct { 16762306a36Sopenharmony_ci dma_addr_t addr_dma; 16862306a36Sopenharmony_ci uint32_t *addr; 16962306a36Sopenharmony_ci unsigned int offset; 17062306a36Sopenharmony_ci } rdma; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci struct { 17362306a36Sopenharmony_ci struct meson_afbcd_ops *ops; 17462306a36Sopenharmony_ci u64 modifier; 17562306a36Sopenharmony_ci u32 format; 17662306a36Sopenharmony_ci } afbcd; 17762306a36Sopenharmony_ci}; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_cistatic inline int meson_vpu_is_compatible(struct meson_drm *priv, 18062306a36Sopenharmony_ci enum vpu_compatible family) 18162306a36Sopenharmony_ci{ 18262306a36Sopenharmony_ci return priv->compat == family; 18362306a36Sopenharmony_ci} 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci#endif /* __MESON_DRV_H */ 186