45 NV_ERROR(drm,
"BIT 'd' table not found\n");
56 NV_ERROR(drm,
"displayport table pointer invalid\n");
67 NV_ERROR(drm,
"displayport table 0x%02x unknown\n", table[0]);
71 for (i = 0; i < table[3]; i++) {
72 *entry =
ROMPTR(dev, table[table[1] + (i * table[2])]);
77 NV_ERROR(drm,
"displayport encoder table not found\n");
123 NV_DEBUG(drm,
"training pattern %d\n", pattern);
125 dp->
func->train_set(dev, dp->
dcb, pattern);
139 for (i = 0; i < dp->
link_nr; i++) {
140 u8 lane = (dp->
stat[4 + (i >> 1)] >> ((i & 1) * 4)) & 0xf;
141 u8 lpre = (lane & 0x0c) >> 2;
142 u8 lvsw = (lane & 0x03) >> 0;
144 dp->
conf[
i] = (lpre << 3) | lvsw;
151 dp->
func->train_adj(dev, dp->
dcb, i, lvsw, lpre);
176 bool cr_done =
false,
abort =
false;
183 if (dp_link_train_commit(dev, dp) ||
184 dp_link_train_update(dev, dp, 100))
188 for (i = 0; i < dp->
link_nr; i++) {
189 u8 lane = (dp->
stat[i >> 1] >> ((i & 1) * 4)) & 0xf;
202 }
while (!cr_done && !
abort && ++tries < 5);
204 return cr_done ? 0 : -1;
210 bool eq_done, cr_done =
true;
216 if (dp_link_train_update(dev, dp, 400))
220 for (i = 0; i < dp->
link_nr && eq_done; i++) {
221 u8 lane = (dp->
stat[i >> 1] >> ((i & 1) * 4)) & 0xf;
222 if (!(lane & DP_LANE_CR_DONE))
229 if (dp_link_train_commit(dev, dp))
231 }
while (!eq_done && cr_done && ++tries <= 5);
233 return eq_done ? 0 : -1;
242 if (table[0] >= 0x20 && table[0] <= 0x30) {
243 if (enable) script =
ROM16(entry[12]);
244 else script =
ROM16(entry[14]);
246 if (table[0] == 0x40) {
247 if (enable) script =
ROM16(entry[11]);
248 else script =
ROM16(entry[13]);
252 nouveau_bios_run_init_table(dev, script, dp->
dcb, dp->
crtc);
261 if (table[0] >= 0x20 && table[0] <= 0x30)
262 script =
ROM16(entry[6]);
264 if (table[0] == 0x40)
265 script =
ROM16(entry[5]);
268 nouveau_bios_run_init_table(dev, script, dp->
dcb, dp->
crtc);
277 if (table[0] >= 0x20 && table[0] <= 0x30)
278 script =
ROM16(entry[8]);
280 if (table[0] == 0x40)
281 script =
ROM16(entry[7]);
284 nouveau_bios_run_init_table(dev, script, dp->
dcb, dp->
crtc);
299 const u32 bw_list[] = { 270000, 162000, 0 };
300 const u32 *link_bw = bw_list;
310 dp.
dpcd = nv_encoder->
dp.dpcd;
313 datarate = (datarate / 8) * 10;
319 gpio->
irq(gpio, 0, nv_connector->
hpd, 0xff,
false);
322 dp_set_downspread(dev, &dp, nv_encoder->
dp.dpcd[3] & 1);
325 dp_link_train_init(dev, &dp);
328 while (*link_bw > nv_encoder->
dp.link_bw)
334 while ((dp.
link_nr >> 1) * link_bw[0] > datarate)
338 while ((link_bw[1] * dp.
link_nr) > datarate)
343 dp_set_link_config(dev, &dp);
347 if (!dp_link_train_cr(dev, &dp) &&
348 !dp_link_train_eq(dev, &dp))
359 dp_link_train_fini(dev, &dp);
362 gpio->
irq(gpio, 0, nv_connector->
hpd, 0xff,
true);
376 auxch = i2c->
find(i2c, nv_encoder->
dcb->i2c_index);
388 nouveau_dp_link_train(encoder, datarate, func);
402 NV_DEBUG(drm,
"Sink OUI: %02hx%02hx%02hx\n",
403 buf[0], buf[1], buf[2]);
406 NV_DEBUG(drm,
"Branch OUI: %02hx%02hx%02hx\n",
407 buf[0], buf[1], buf[2]);
419 u8 *dpcd = nv_encoder->
dp.dpcd;
422 auxch = i2c->
find(i2c, nv_encoder->
dcb->i2c_index);
430 nv_encoder->
dp.link_bw = 27000 * dpcd[1];
433 NV_DEBUG(drm,
"display: %dx%d dpcd 0x%02x\n",
434 nv_encoder->
dp.link_nr, nv_encoder->
dp.link_bw, dpcd[0]);
436 nv_encoder->
dcb->dpconf.link_nr,
437 nv_encoder->
dcb->dpconf.link_bw);
439 if (nv_encoder->
dcb->dpconf.link_nr < nv_encoder->
dp.link_nr)
440 nv_encoder->
dp.link_nr = nv_encoder->
dcb->dpconf.link_nr;
441 if (nv_encoder->
dcb->dpconf.link_bw < nv_encoder->
dp.link_bw)
442 nv_encoder->
dp.link_bw = nv_encoder->
dcb->dpconf.link_bw;
445 nv_encoder->
dp.link_nr, nv_encoder->
dp.link_bw);
447 nouveau_dp_probe_oui(dev, auxch, dpcd);