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