18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: MIT */
28c2ecf20Sopenharmony_ci#ifndef __NV04_DISPLAY_H__
38c2ecf20Sopenharmony_ci#define __NV04_DISPLAY_H__
48c2ecf20Sopenharmony_ci#include <subdev/bios.h>
58c2ecf20Sopenharmony_ci#include <subdev/bios/pll.h>
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include "nouveau_display.h"
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_cistruct nouveau_encoder;
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_cienum nv04_fp_display_regs {
128c2ecf20Sopenharmony_ci	FP_DISPLAY_END,
138c2ecf20Sopenharmony_ci	FP_TOTAL,
148c2ecf20Sopenharmony_ci	FP_CRTC,
158c2ecf20Sopenharmony_ci	FP_SYNC_START,
168c2ecf20Sopenharmony_ci	FP_SYNC_END,
178c2ecf20Sopenharmony_ci	FP_VALID_START,
188c2ecf20Sopenharmony_ci	FP_VALID_END
198c2ecf20Sopenharmony_ci};
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_cistruct nv04_crtc_reg {
228c2ecf20Sopenharmony_ci	unsigned char MiscOutReg;
238c2ecf20Sopenharmony_ci	uint8_t CRTC[0xa0];
248c2ecf20Sopenharmony_ci	uint8_t CR58[0x10];
258c2ecf20Sopenharmony_ci	uint8_t Sequencer[5];
268c2ecf20Sopenharmony_ci	uint8_t Graphics[9];
278c2ecf20Sopenharmony_ci	uint8_t Attribute[21];
288c2ecf20Sopenharmony_ci	unsigned char DAC[768];
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci	/* PCRTC regs */
318c2ecf20Sopenharmony_ci	uint32_t fb_start;
328c2ecf20Sopenharmony_ci	uint32_t crtc_cfg;
338c2ecf20Sopenharmony_ci	uint32_t cursor_cfg;
348c2ecf20Sopenharmony_ci	uint32_t gpio_ext;
358c2ecf20Sopenharmony_ci	uint32_t crtc_830;
368c2ecf20Sopenharmony_ci	uint32_t crtc_834;
378c2ecf20Sopenharmony_ci	uint32_t crtc_850;
388c2ecf20Sopenharmony_ci	uint32_t crtc_eng_ctrl;
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci	/* PRAMDAC regs */
418c2ecf20Sopenharmony_ci	uint32_t nv10_cursync;
428c2ecf20Sopenharmony_ci	struct nvkm_pll_vals pllvals;
438c2ecf20Sopenharmony_ci	uint32_t ramdac_gen_ctrl;
448c2ecf20Sopenharmony_ci	uint32_t ramdac_630;
458c2ecf20Sopenharmony_ci	uint32_t ramdac_634;
468c2ecf20Sopenharmony_ci	uint32_t tv_setup;
478c2ecf20Sopenharmony_ci	uint32_t tv_vtotal;
488c2ecf20Sopenharmony_ci	uint32_t tv_vskew;
498c2ecf20Sopenharmony_ci	uint32_t tv_vsync_delay;
508c2ecf20Sopenharmony_ci	uint32_t tv_htotal;
518c2ecf20Sopenharmony_ci	uint32_t tv_hskew;
528c2ecf20Sopenharmony_ci	uint32_t tv_hsync_delay;
538c2ecf20Sopenharmony_ci	uint32_t tv_hsync_delay2;
548c2ecf20Sopenharmony_ci	uint32_t fp_horiz_regs[7];
558c2ecf20Sopenharmony_ci	uint32_t fp_vert_regs[7];
568c2ecf20Sopenharmony_ci	uint32_t dither;
578c2ecf20Sopenharmony_ci	uint32_t fp_control;
588c2ecf20Sopenharmony_ci	uint32_t dither_regs[6];
598c2ecf20Sopenharmony_ci	uint32_t fp_debug_0;
608c2ecf20Sopenharmony_ci	uint32_t fp_debug_1;
618c2ecf20Sopenharmony_ci	uint32_t fp_debug_2;
628c2ecf20Sopenharmony_ci	uint32_t fp_margin_color;
638c2ecf20Sopenharmony_ci	uint32_t ramdac_8c0;
648c2ecf20Sopenharmony_ci	uint32_t ramdac_a20;
658c2ecf20Sopenharmony_ci	uint32_t ramdac_a24;
668c2ecf20Sopenharmony_ci	uint32_t ramdac_a34;
678c2ecf20Sopenharmony_ci	uint32_t ctv_regs[38];
688c2ecf20Sopenharmony_ci};
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_cistruct nv04_output_reg {
718c2ecf20Sopenharmony_ci	uint32_t output;
728c2ecf20Sopenharmony_ci	int head;
738c2ecf20Sopenharmony_ci};
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_cistruct nv04_mode_state {
768c2ecf20Sopenharmony_ci	struct nv04_crtc_reg crtc_reg[2];
778c2ecf20Sopenharmony_ci	uint32_t pllsel;
788c2ecf20Sopenharmony_ci	uint32_t sel_clk;
798c2ecf20Sopenharmony_ci};
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_cistruct nv04_display {
828c2ecf20Sopenharmony_ci	struct nv04_mode_state mode_reg;
838c2ecf20Sopenharmony_ci	struct nv04_mode_state saved_reg;
848c2ecf20Sopenharmony_ci	uint32_t saved_vga_font[4][16384];
858c2ecf20Sopenharmony_ci	uint32_t dac_users[4];
868c2ecf20Sopenharmony_ci	struct nouveau_bo *image[2];
878c2ecf20Sopenharmony_ci	struct nvif_notify flip;
888c2ecf20Sopenharmony_ci};
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_cistatic inline struct nv04_display *
918c2ecf20Sopenharmony_cinv04_display(struct drm_device *dev)
928c2ecf20Sopenharmony_ci{
938c2ecf20Sopenharmony_ci	return nouveau_display(dev)->priv;
948c2ecf20Sopenharmony_ci}
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci/* nv04_display.c */
978c2ecf20Sopenharmony_ciint nv04_display_create(struct drm_device *);
988c2ecf20Sopenharmony_cistruct nouveau_connector *
998c2ecf20Sopenharmony_cinv04_encoder_get_connector(struct nouveau_encoder *nv_encoder);
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci/* nv04_crtc.c */
1028c2ecf20Sopenharmony_ciint nv04_crtc_create(struct drm_device *, int index);
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci/* nv04_dac.c */
1058c2ecf20Sopenharmony_ciint nv04_dac_create(struct drm_connector *, struct dcb_output *);
1068c2ecf20Sopenharmony_ciuint32_t nv17_dac_sample_load(struct drm_encoder *encoder);
1078c2ecf20Sopenharmony_ciint nv04_dac_output_offset(struct drm_encoder *encoder);
1088c2ecf20Sopenharmony_civoid nv04_dac_update_dacclk(struct drm_encoder *encoder, bool enable);
1098c2ecf20Sopenharmony_cibool nv04_dac_in_use(struct drm_encoder *encoder);
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_ci/* nv04_dfp.c */
1128c2ecf20Sopenharmony_ciint nv04_dfp_create(struct drm_connector *, struct dcb_output *);
1138c2ecf20Sopenharmony_ciint nv04_dfp_get_bound_head(struct drm_device *dev, struct dcb_output *dcbent);
1148c2ecf20Sopenharmony_civoid nv04_dfp_bind_head(struct drm_device *dev, struct dcb_output *dcbent,
1158c2ecf20Sopenharmony_ci			       int head, bool dl);
1168c2ecf20Sopenharmony_civoid nv04_dfp_disable(struct drm_device *dev, int head);
1178c2ecf20Sopenharmony_civoid nv04_dfp_update_fp_control(struct drm_encoder *encoder, int mode);
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci/* nv04_tv.c */
1208c2ecf20Sopenharmony_ciint nv04_tv_identify(struct drm_device *dev, int i2c_index);
1218c2ecf20Sopenharmony_ciint nv04_tv_create(struct drm_connector *, struct dcb_output *);
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci/* nv17_tv.c */
1248c2ecf20Sopenharmony_ciint nv17_tv_create(struct drm_connector *, struct dcb_output *);
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ci/* overlay.c */
1278c2ecf20Sopenharmony_civoid nouveau_overlay_init(struct drm_device *dev);
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_cistatic inline bool
1308c2ecf20Sopenharmony_cinv_two_heads(struct drm_device *dev)
1318c2ecf20Sopenharmony_ci{
1328c2ecf20Sopenharmony_ci	struct nouveau_drm *drm = nouveau_drm(dev);
1338c2ecf20Sopenharmony_ci	const int impl = dev->pdev->device & 0x0ff0;
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ci	if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_CELSIUS && impl != 0x0100 &&
1368c2ecf20Sopenharmony_ci	    impl != 0x0150 && impl != 0x01a0 && impl != 0x0200)
1378c2ecf20Sopenharmony_ci		return true;
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_ci	return false;
1408c2ecf20Sopenharmony_ci}
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_cistatic inline bool
1438c2ecf20Sopenharmony_cinv_gf4_disp_arch(struct drm_device *dev)
1448c2ecf20Sopenharmony_ci{
1458c2ecf20Sopenharmony_ci	return nv_two_heads(dev) && (dev->pdev->device & 0x0ff0) != 0x0110;
1468c2ecf20Sopenharmony_ci}
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_cistatic inline bool
1498c2ecf20Sopenharmony_cinv_two_reg_pll(struct drm_device *dev)
1508c2ecf20Sopenharmony_ci{
1518c2ecf20Sopenharmony_ci	struct nouveau_drm *drm = nouveau_drm(dev);
1528c2ecf20Sopenharmony_ci	const int impl = dev->pdev->device & 0x0ff0;
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_ci	if (impl == 0x0310 || impl == 0x0340 || drm->client.device.info.family >= NV_DEVICE_INFO_V0_CURIE)
1558c2ecf20Sopenharmony_ci		return true;
1568c2ecf20Sopenharmony_ci	return false;
1578c2ecf20Sopenharmony_ci}
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_cistatic inline bool
1608c2ecf20Sopenharmony_cinv_match_device(struct drm_device *dev, unsigned device,
1618c2ecf20Sopenharmony_ci		unsigned sub_vendor, unsigned sub_device)
1628c2ecf20Sopenharmony_ci{
1638c2ecf20Sopenharmony_ci	return dev->pdev->device == device &&
1648c2ecf20Sopenharmony_ci		dev->pdev->subsystem_vendor == sub_vendor &&
1658c2ecf20Sopenharmony_ci		dev->pdev->subsystem_device == sub_device;
1668c2ecf20Sopenharmony_ci}
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_ci#include <subdev/bios/init.h>
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_cistatic inline void
1718c2ecf20Sopenharmony_cinouveau_bios_run_init_table(struct drm_device *dev, u16 table,
1728c2ecf20Sopenharmony_ci			    struct dcb_output *outp, int crtc)
1738c2ecf20Sopenharmony_ci{
1748c2ecf20Sopenharmony_ci	nvbios_init(&nvxx_bios(&nouveau_drm(dev)->client.device)->subdev, table,
1758c2ecf20Sopenharmony_ci		init.outp = outp;
1768c2ecf20Sopenharmony_ci		init.head = crtc;
1778c2ecf20Sopenharmony_ci	);
1788c2ecf20Sopenharmony_ci}
1798c2ecf20Sopenharmony_ci
1808c2ecf20Sopenharmony_ciint nv04_flip_complete(struct nvif_notify *);
1818c2ecf20Sopenharmony_ci#endif
182