.. | .. |
---|
23 | 23 | |
---|
24 | 24 | #include <subdev/timer.h> |
---|
25 | 25 | |
---|
26 | | -static void |
---|
| 26 | +void |
---|
27 | 27 | gv100_sor_dp_watermark(struct nvkm_ior *sor, int head, u8 watermark) |
---|
28 | 28 | { |
---|
29 | 29 | struct nvkm_device *device = sor->disp->engine.subdev.device; |
---|
.. | .. |
---|
31 | 31 | nvkm_mask(device, 0x616550 + hoff, 0x0c00003f, 0x08000000 | watermark); |
---|
32 | 32 | } |
---|
33 | 33 | |
---|
34 | | -static void |
---|
| 34 | +void |
---|
35 | 35 | gv100_sor_dp_audio_sym(struct nvkm_ior *sor, int head, u16 h, u32 v) |
---|
36 | 36 | { |
---|
37 | 37 | struct nvkm_device *device = sor->disp->engine.subdev.device; |
---|
.. | .. |
---|
40 | 40 | nvkm_mask(device, 0x61656c + hoff, 0x00ffffff, v); |
---|
41 | 41 | } |
---|
42 | 42 | |
---|
43 | | -static void |
---|
| 43 | +void |
---|
44 | 44 | gv100_sor_dp_audio(struct nvkm_ior *sor, int head, bool enable) |
---|
45 | 45 | { |
---|
46 | 46 | struct nvkm_device *device = sor->disp->engine.subdev.device; |
---|
.. | .. |
---|
54 | 54 | ); |
---|
55 | 55 | } |
---|
56 | 56 | |
---|
57 | | -static void |
---|
| 57 | +void |
---|
58 | 58 | gv100_sor_state(struct nvkm_ior *sor, struct nvkm_ior_state *state) |
---|
59 | 59 | { |
---|
60 | 60 | struct nvkm_device *device = sor->disp->engine.subdev.device; |
---|
.. | .. |
---|
78 | 78 | } |
---|
79 | 79 | |
---|
80 | 80 | static const struct nvkm_ior_func |
---|
81 | | -gv100_sor = { |
---|
| 81 | +gv100_sor_hda = { |
---|
82 | 82 | .route = { |
---|
83 | 83 | .get = gm200_sor_route_get, |
---|
84 | 84 | .set = gm200_sor_route_set, |
---|
.. | .. |
---|
88 | 88 | .clock = gf119_sor_clock, |
---|
89 | 89 | .hdmi = { |
---|
90 | 90 | .ctrl = gv100_hdmi_ctrl, |
---|
| 91 | + .scdc = gm200_hdmi_scdc, |
---|
91 | 92 | }, |
---|
92 | 93 | .dp = { |
---|
93 | 94 | .lanes = { 0, 1, 2, 3 }, |
---|
.. | .. |
---|
102 | 103 | .hda = { |
---|
103 | 104 | .hpd = gf119_hda_hpd, |
---|
104 | 105 | .eld = gf119_hda_eld, |
---|
| 106 | + .device_entry = gv100_hda_device_entry, |
---|
| 107 | + }, |
---|
| 108 | +}; |
---|
| 109 | + |
---|
| 110 | +static const struct nvkm_ior_func |
---|
| 111 | +gv100_sor = { |
---|
| 112 | + .route = { |
---|
| 113 | + .get = gm200_sor_route_get, |
---|
| 114 | + .set = gm200_sor_route_set, |
---|
| 115 | + }, |
---|
| 116 | + .state = gv100_sor_state, |
---|
| 117 | + .power = nv50_sor_power, |
---|
| 118 | + .clock = gf119_sor_clock, |
---|
| 119 | + .hdmi = { |
---|
| 120 | + .ctrl = gv100_hdmi_ctrl, |
---|
| 121 | + .scdc = gm200_hdmi_scdc, |
---|
| 122 | + }, |
---|
| 123 | + .dp = { |
---|
| 124 | + .lanes = { 0, 1, 2, 3 }, |
---|
| 125 | + .links = gf119_sor_dp_links, |
---|
| 126 | + .power = g94_sor_dp_power, |
---|
| 127 | + .pattern = gm107_sor_dp_pattern, |
---|
| 128 | + .drive = gm200_sor_dp_drive, |
---|
| 129 | + .audio = gv100_sor_dp_audio, |
---|
| 130 | + .audio_sym = gv100_sor_dp_audio_sym, |
---|
| 131 | + .watermark = gv100_sor_dp_watermark, |
---|
105 | 132 | }, |
---|
106 | 133 | }; |
---|
107 | 134 | |
---|
108 | 135 | int |
---|
109 | 136 | gv100_sor_new(struct nvkm_disp *disp, int id) |
---|
110 | 137 | { |
---|
| 138 | + struct nvkm_device *device = disp->engine.subdev.device; |
---|
| 139 | + u32 hda; |
---|
| 140 | + |
---|
| 141 | + if (!((hda = nvkm_rd32(device, 0x08a15c)) & 0x40000000)) |
---|
| 142 | + hda = nvkm_rd32(device, 0x118fb0) >> 8; |
---|
| 143 | + |
---|
| 144 | + if (hda & BIT(id)) |
---|
| 145 | + return nvkm_ior_new_(&gv100_sor_hda, disp, SOR, id); |
---|
111 | 146 | return nvkm_ior_new_(&gv100_sor, disp, SOR, id); |
---|
112 | 147 | } |
---|
113 | 148 | |
---|