153541Sshin/* SPDX-License-Identifier: MIT */
253541Sshin#ifndef __NVIF_OUTP_H__
353541Sshin#define __NVIF_OUTP_H__
453541Sshin#include <nvif/object.h>
553541Sshin#include <nvif/if0012.h>
653541Sshin#include <drm/display/drm_dp.h>
753541Sshinstruct nvif_disp;
853541Sshin
953541Sshinstruct nvif_outp {
1053541Sshin	struct nvif_object object;
1153541Sshin	u32 id;
1253541Sshin
1353541Sshin	struct {
1453541Sshin		enum {
1553541Sshin			NVIF_OUTP_DAC,
1653541Sshin			NVIF_OUTP_SOR,
1753541Sshin			NVIF_OUTP_PIOR,
1853541Sshin		} type;
1953541Sshin
2053541Sshin		enum {
2153541Sshin			NVIF_OUTP_RGB_CRT,
2253541Sshin			NVIF_OUTP_TMDS,
2353541Sshin			NVIF_OUTP_LVDS,
2453541Sshin			NVIF_OUTP_DP,
2553541Sshin		} proto;
2653541Sshin
2753541Sshin		u8 heads;
2853541Sshin#define NVIF_OUTP_DDC_INVALID 0xff
2953541Sshin		u8 ddc;
3053541Sshin		u8 conn;
3153541Sshin
3253541Sshin		union {
3353541Sshin			struct {
3453541Sshin				u32 freq_max;
3553541Sshin			} rgb_crt;
3653541Sshin			struct {
3753541Sshin				bool dual;
3853541Sshin			} tmds;
3953541Sshin			struct {
4053541Sshin				bool acpi_edid;
4153541Sshin			} lvds;
4253541Sshin			struct {
4353541Sshin				u8   aux;
4453541Sshin				bool mst;
4553541Sshin				bool increased_wm;
4653541Sshin				u8   link_nr;
4753541Sshin				u32  link_bw;
4853541Sshin			} dp;
4953541Sshin		};
5053541Sshin	} info;
5153541Sshin
5253541Sshin	struct {
5353541Sshin		int id;
5453541Sshin		int link;
5553541Sshin	} or;
5653541Sshin};
5753541Sshin
5853541Sshinint nvif_outp_ctor(struct nvif_disp *, const char *name, int id, struct nvif_outp *);
5953541Sshinvoid nvif_outp_dtor(struct nvif_outp *);
6053541Sshin
6153541Sshinenum nvif_outp_detect_status {
6253541Sshin	NOT_PRESENT,
6353541Sshin	PRESENT,
6453541Sshin	UNKNOWN,
6553541Sshin};
6653541Sshin
6753541Sshinenum nvif_outp_detect_status nvif_outp_detect(struct nvif_outp *);
6853541Sshinint nvif_outp_edid_get(struct nvif_outp *, u8 **pedid);
6953541Sshin
7053541Sshinint nvif_outp_load_detect(struct nvif_outp *, u32 loadval);
7153541Sshinint nvif_outp_acquire_dac(struct nvif_outp *);
7253541Sshinint nvif_outp_acquire_sor(struct nvif_outp *, bool hda);
7353541Sshinint nvif_outp_acquire_pior(struct nvif_outp *);
7453541Sshinint nvif_outp_inherit_rgb_crt(struct nvif_outp *outp, u8 *proto_out);
7553541Sshinint nvif_outp_inherit_lvds(struct nvif_outp *outp, u8 *proto_out);
7653541Sshinint nvif_outp_inherit_tmds(struct nvif_outp *outp, u8 *proto_out);
7753541Sshinint nvif_outp_inherit_dp(struct nvif_outp *outp, u8 *proto_out);
7853541Sshin
7953541Sshinvoid nvif_outp_release(struct nvif_outp *);
8053541Sshin
8153541Sshinstatic inline bool
8253541Sshinnvif_outp_acquired(struct nvif_outp *outp)
8353541Sshin{
8453541Sshin	return outp->or.id >= 0;
8553541Sshin}
8653541Sshin
8753541Sshinint nvif_outp_bl_get(struct nvif_outp *);
8853541Sshinint nvif_outp_bl_set(struct nvif_outp *, int level);
8953541Sshin
9053541Sshinint nvif_outp_lvds(struct nvif_outp *, bool dual, bool bpc8);
9153541Sshin
9253541Sshinint nvif_outp_hdmi(struct nvif_outp *, int head, bool enable, u8 max_ac_packet, u8 rekey, u32 khz,
9353541Sshin		   bool scdc, bool scdc_scrambling, bool scdc_low_rates);
9453541Sshin
9553541Sshinint nvif_outp_infoframe(struct nvif_outp *, u8 type, struct nvif_outp_infoframe_v0 *, u32 size);
9653541Sshinint nvif_outp_hda_eld(struct nvif_outp *, int head, void *data, u32 size);
9753541Sshin
9853541Sshinint nvif_outp_dp_aux_pwr(struct nvif_outp *, bool enable);
9953541Sshinint nvif_outp_dp_aux_xfer(struct nvif_outp *, u8 type, u8 *size, u32 addr, u8 *data);
10053541Sshin
10153541Sshinstruct nvif_outp_dp_rate {
10253541Sshin	int dpcd; /* -1 for non-indexed rates */
10353541Sshin	u32 rate;
10453541Sshin};
10553541Sshin
10653541Sshinint nvif_outp_dp_rates(struct nvif_outp *, struct nvif_outp_dp_rate *rate, int rate_nr);
10753541Sshinint nvif_outp_dp_train(struct nvif_outp *, u8 dpcd[DP_RECEIVER_CAP_SIZE],
10853541Sshin		       u8 lttprs, u8 link_nr, u32 link_bw, bool mst, bool post_lt_adj,
10953541Sshin		       bool retrain);
11053541Sshinint nvif_outp_dp_drive(struct nvif_outp *, u8 link_nr, u8 pe[4], u8 vs[4]);
11153541Sshinint nvif_outp_dp_sst(struct nvif_outp *, int head, u32 watermark, u32 hblanksym, u32 vblanksym);
11253541Sshinint nvif_outp_dp_mst_id_get(struct nvif_outp *, u32 *id);
11353541Sshinint nvif_outp_dp_mst_id_put(struct nvif_outp *, u32 id);
11453541Sshinint nvif_outp_dp_mst_vcpi(struct nvif_outp *, int head,
11553541Sshin			  u8 start_slot, u8 num_slots, u16 pbn, u16 aligned_pbn);
11653541Sshin#endif
11753541Sshin