1/* SPDX-License-Identifier: MIT */ 2#ifndef __NVIF_OUTP_H__ 3#define __NVIF_OUTP_H__ 4#include <nvif/object.h> 5#include <nvif/if0012.h> 6#include <drm/display/drm_dp.h> 7struct nvif_disp; 8 9struct nvif_outp { 10 struct nvif_object object; 11 u32 id; 12 13 struct { 14 enum { 15 NVIF_OUTP_DAC, 16 NVIF_OUTP_SOR, 17 NVIF_OUTP_PIOR, 18 } type; 19 20 enum { 21 NVIF_OUTP_RGB_CRT, 22 NVIF_OUTP_TMDS, 23 NVIF_OUTP_LVDS, 24 NVIF_OUTP_DP, 25 } proto; 26 27 u8 heads; 28#define NVIF_OUTP_DDC_INVALID 0xff 29 u8 ddc; 30 u8 conn; 31 32 union { 33 struct { 34 u32 freq_max; 35 } rgb_crt; 36 struct { 37 bool dual; 38 } tmds; 39 struct { 40 bool acpi_edid; 41 } lvds; 42 struct { 43 u8 aux; 44 bool mst; 45 bool increased_wm; 46 u8 link_nr; 47 u32 link_bw; 48 } dp; 49 }; 50 } info; 51 52 struct { 53 int id; 54 int link; 55 } or; 56}; 57 58int nvif_outp_ctor(struct nvif_disp *, const char *name, int id, struct nvif_outp *); 59void nvif_outp_dtor(struct nvif_outp *); 60 61enum nvif_outp_detect_status { 62 NOT_PRESENT, 63 PRESENT, 64 UNKNOWN, 65}; 66 67enum nvif_outp_detect_status nvif_outp_detect(struct nvif_outp *); 68int nvif_outp_edid_get(struct nvif_outp *, u8 **pedid); 69 70int nvif_outp_load_detect(struct nvif_outp *, u32 loadval); 71int nvif_outp_acquire_dac(struct nvif_outp *); 72int nvif_outp_acquire_sor(struct nvif_outp *, bool hda); 73int nvif_outp_acquire_pior(struct nvif_outp *); 74int nvif_outp_inherit_rgb_crt(struct nvif_outp *outp, u8 *proto_out); 75int nvif_outp_inherit_lvds(struct nvif_outp *outp, u8 *proto_out); 76int nvif_outp_inherit_tmds(struct nvif_outp *outp, u8 *proto_out); 77int nvif_outp_inherit_dp(struct nvif_outp *outp, u8 *proto_out); 78 79void nvif_outp_release(struct nvif_outp *); 80 81static inline bool 82nvif_outp_acquired(struct nvif_outp *outp) 83{ 84 return outp->or.id >= 0; 85} 86 87int nvif_outp_bl_get(struct nvif_outp *); 88int nvif_outp_bl_set(struct nvif_outp *, int level); 89 90int nvif_outp_lvds(struct nvif_outp *, bool dual, bool bpc8); 91 92int nvif_outp_hdmi(struct nvif_outp *, int head, bool enable, u8 max_ac_packet, u8 rekey, u32 khz, 93 bool scdc, bool scdc_scrambling, bool scdc_low_rates); 94 95int nvif_outp_infoframe(struct nvif_outp *, u8 type, struct nvif_outp_infoframe_v0 *, u32 size); 96int nvif_outp_hda_eld(struct nvif_outp *, int head, void *data, u32 size); 97 98int nvif_outp_dp_aux_pwr(struct nvif_outp *, bool enable); 99int nvif_outp_dp_aux_xfer(struct nvif_outp *, u8 type, u8 *size, u32 addr, u8 *data); 100 101struct nvif_outp_dp_rate { 102 int dpcd; /* -1 for non-indexed rates */ 103 u32 rate; 104}; 105 106int nvif_outp_dp_rates(struct nvif_outp *, struct nvif_outp_dp_rate *rate, int rate_nr); 107int nvif_outp_dp_train(struct nvif_outp *, u8 dpcd[DP_RECEIVER_CAP_SIZE], 108 u8 lttprs, u8 link_nr, u32 link_bw, bool mst, bool post_lt_adj, 109 bool retrain); 110int nvif_outp_dp_drive(struct nvif_outp *, u8 link_nr, u8 pe[4], u8 vs[4]); 111int nvif_outp_dp_sst(struct nvif_outp *, int head, u32 watermark, u32 hblanksym, u32 vblanksym); 112int nvif_outp_dp_mst_id_get(struct nvif_outp *, u32 *id); 113int nvif_outp_dp_mst_id_put(struct nvif_outp *, u32 id); 114int nvif_outp_dp_mst_vcpi(struct nvif_outp *, int head, 115 u8 start_slot, u8 num_slots, u16 pbn, u16 aligned_pbn); 116#endif 117