root/drivers/gpu/drm/nouveau/include/nvif/if0012.h
/* SPDX-License-Identifier: MIT */
#ifndef __NVIF_IF0012_H__
#define __NVIF_IF0012_H__

#include <drm/display/drm_dp.h>

union nvif_outp_args {
        struct nvif_outp_v0 {
                __u8 version;
                __u8 id;        /* DCB device index. */
#define NVIF_OUTP_V0_TYPE_DAC  0x00
#define NVIF_OUTP_V0_TYPE_SOR  0x01
#define NVIF_OUTP_V0_TYPE_PIOR 0x02
                __u8 type;
#define NVIF_OUTP_V0_PROTO_RGB_CRT 0x00
#define NVIF_OUTP_V0_PROTO_TMDS    0x01
#define NVIF_OUTP_V0_PROTO_LVDS    0x02
#define NVIF_OUTP_V0_PROTO_DP      0x03
                __u8 proto;
                __u8 heads;
                __u8 ddc;
                __u8 conn;
                union {
                        struct {
                                __u32 freq_max;
                        } rgb_crt;
                        struct {
                                __u8  dual;
                        } tmds;
                        struct {
                                __u8  acpi_edid;
                        } lvds;
                        struct {
                                __u8  aux;
                                __u8  mst;
                                __u8  increased_wm;
                                __u8  link_nr;
                                __u32 link_bw;
                        } dp;
                };
        } v0;
};

#define NVIF_OUTP_V0_DETECT        0x00
#define NVIF_OUTP_V0_EDID_GET      0x01

#define NVIF_OUTP_V0_INHERIT       0x10
#define NVIF_OUTP_V0_ACQUIRE       0x11
#define NVIF_OUTP_V0_RELEASE       0x12

#define NVIF_OUTP_V0_LOAD_DETECT   0x20

#define NVIF_OUTP_V0_BL_GET        0x30
#define NVIF_OUTP_V0_BL_SET        0x31

#define NVIF_OUTP_V0_LVDS          0x40

#define NVIF_OUTP_V0_HDMI          0x50

#define NVIF_OUTP_V0_INFOFRAME     0x60
#define NVIF_OUTP_V0_HDA_ELD       0x61

#define NVIF_OUTP_V0_DP_AUX_PWR    0x70
#define NVIF_OUTP_V0_DP_AUX_XFER   0x71
#define NVIF_OUTP_V0_DP_RATES      0x72
#define NVIF_OUTP_V0_DP_TRAIN      0x73
#define NVIF_OUTP_V0_DP_DRIVE      0x74
#define NVIF_OUTP_V0_DP_SST        0x75
#define NVIF_OUTP_V0_DP_MST_ID_GET 0x76
#define NVIF_OUTP_V0_DP_MST_ID_PUT 0x77
#define NVIF_OUTP_V0_DP_MST_VCPI   0x78

union nvif_outp_detect_args {
        struct nvif_outp_detect_v0 {
                __u8 version;
#define NVIF_OUTP_DETECT_V0_NOT_PRESENT 0x00
#define NVIF_OUTP_DETECT_V0_PRESENT     0x01
#define NVIF_OUTP_DETECT_V0_UNKNOWN     0x02
                __u8 status;
        } v0;
};

union nvif_outp_edid_get_args {
        struct nvif_outp_edid_get_v0 {
                __u8  version;
                __u8  pad01;
                __u16 size;
                __u8  data[2048];
        } v0;
};

union nvif_outp_load_detect_args {
        struct nvif_outp_load_detect_v0 {
                __u8  version;
                __u8  load;
                __u8  pad02[2];
                __u32 data; /*TODO: move vbios loadval parsing into nvkm */
        } v0;
};

union nvif_outp_acquire_args {
        struct nvif_outp_acquire_v0 {
                __u8 version;
#define NVIF_OUTP_ACQUIRE_V0_DAC  0x00
#define NVIF_OUTP_ACQUIRE_V0_SOR  0x01
#define NVIF_OUTP_ACQUIRE_V0_PIOR 0x02
                __u8 type;
                __u8 or;
                __u8 link;
                __u8 pad04[4];
                union {
                        struct {
                                __u8 hda;
                        } sor;
                };
        } v0;
};

union nvif_outp_inherit_args {
        struct nvif_outp_inherit_v0 {
                __u8 version;
#define NVIF_OUTP_INHERIT_V0_RGB_CRT 0x00
#define NVIF_OUTP_INHERIT_V0_TV      0x01
#define NVIF_OUTP_INHERIT_V0_TMDS    0x02
#define NVIF_OUTP_INHERIT_V0_LVDS    0x03
#define NVIF_OUTP_INHERIT_V0_DP      0x04
                // In/out. Input is one of the above values, output is the actual hw protocol
                __u8 proto;
                __u8 or;
                __u8 link;
                __u8 head;
                union {
                        struct {
                                // TODO: Figure out padding, and whether we even want this field
                                __u8 hda;
                        } tmds;
                };
        } v0;
};

union nvif_outp_release_args {
        struct nvif_outp_release_vn {
        } vn;
};

union nvif_outp_bl_get_args {
        struct nvif_outp_bl_get_v0 {
                __u8  version;
                __u8  level;
        } v0;
};

union nvif_outp_bl_set_args {
        struct nvif_outp_bl_set_v0 {
                __u8  version;
                __u8  level;
        } v0;
};

union nvif_outp_lvds_args {
        struct nvif_outp_lvds_v0 {
                __u8  version;
                __u8  dual;
                __u8  bpc8;
        } v0;
};

union nvif_outp_hdmi_args {
        struct nvif_outp_hdmi_v0 {
                __u8 version;
                __u8 head;
                __u8 enable;
                __u8 max_ac_packet;
                __u8 rekey;
                __u8 scdc;
                __u8 scdc_scrambling;
                __u8 scdc_low_rates;
                __u32 khz;
        } v0;
};

union nvif_outp_infoframe_args {
        struct nvif_outp_infoframe_v0 {
                __u8 version;
#define NVIF_OUTP_INFOFRAME_V0_AVI 0
#define NVIF_OUTP_INFOFRAME_V0_VSI 1
                __u8 type;
                __u8 head;
                __u8 pad03[5];
                __u8 data[];
        } v0;
};

union nvif_outp_hda_eld_args {
        struct nvif_outp_hda_eld_v0 {
                __u8  version;
                __u8  head;
                __u8  pad02[6];
                __u8  data[];
        } v0;
};

union nvif_outp_dp_aux_pwr_args {
        struct nvif_outp_dp_aux_pwr_v0 {
                __u8 version;
                __u8 state;
                __u8 pad02[6];
        } v0;
};

union nvif_outp_dp_aux_xfer_args {
        struct nvif_outp_dp_aux_xfer_v0 {
                __u8  version;
                __u8  pad01;
                __u8  type;
                __u8  size;
                __u32 addr;
                __u8  data[16];
        } v0;
};

union nvif_outp_dp_rates_args {
        struct nvif_outp_dp_rates_v0 {
                __u8  version;
                __u8  pad01[6];
                __u8  rates;
                struct {
                        __s8  dpcd;
                        __u32 rate;
                } rate[8];
        } v0;
};

union nvif_outp_dp_train_args {
        struct nvif_outp_dp_train_v0 {
                __u8  version;
                __u8  retrain;
                __u8  mst;
                __u8  lttprs;
                __u8  post_lt_adj;
                __u8  link_nr;
                __u32 link_bw;
                __u8 dpcd[DP_RECEIVER_CAP_SIZE];
        } v0;
};

union nvif_outp_dp_drive_args {
        struct nvif_outp_dp_drive_v0 {
                __u8  version;
                __u8  pad01[2];
                __u8  lanes;
                __u8  pe[4];
                __u8  vs[4];
        } v0;
};

union nvif_outp_dp_sst_args {
        struct nvif_outp_dp_sst_v0 {
                __u8  version;
                __u8  head;
                __u8  pad02[2];
                __u32 watermark;
                __u32 hblanksym;
                __u32 vblanksym;
        } v0;
};

union nvif_outp_dp_mst_id_put_args {
        struct nvif_outp_dp_mst_id_put_v0 {
                __u8  version;
                __u8  pad01[3];
                __u32 id;
        } v0;
};

union nvif_outp_dp_mst_id_get_args {
        struct nvif_outp_dp_mst_id_get_v0 {
                __u8  version;
                __u8  pad01[3];
                __u32 id;
        } v0;
};

union nvif_outp_dp_mst_vcpi_args {
        struct nvif_outp_dp_mst_vcpi_v0 {
                __u8  version;
                __u8  head;
                __u8  start_slot;
                __u8  num_slots;
                __u16 pbn;
                __u16 aligned_pbn;
        } v0;
};
#endif