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