Lines Matching full:dp

24 #include "dp.h"
60 int ret = nvkm_i2c_aux_acquire(outp->dp.aux); in nvkm_dp_aux_xfer()
65 ret = nvkm_i2c_aux_xfer(outp->dp.aux, false, type, addr, data, size); in nvkm_dp_aux_xfer()
66 nvkm_i2c_aux_release(outp->dp.aux); in nvkm_dp_aux_xfer()
73 outp->dp.enabled = pu; in nvkm_dp_aux_pwr()
74 nvkm_dp_enable(outp, outp->dp.enabled); in nvkm_dp_aux_pwr()
105 ret = nvkm_rdaux(outp->dp.aux, addr, &lt->stat[0], 3); in nvkm_dp_train_sense()
114 ret = nvkm_rdaux(outp->dp.aux, addr, &lt->stat[4], 2); in nvkm_dp_train_sense()
119 ret = nvkm_rdaux(outp->dp.aux, DPCD_LS0C, &lt->pc2stat, 1); in nvkm_dp_train_sense()
144 for (i = 0; i < ior->dp.nr; i++) { in nvkm_dp_train_drive()
181 ior->func->dp->drive(ior, i, ocfg.pc, ocfg.dc, ocfg.pe, ocfg.tx_pu); in nvkm_dp_train_drive()
189 ret = nvkm_wraux(outp->dp.aux, addr, lt->conf, 4); in nvkm_dp_train_drive()
194 ret = nvkm_wraux(outp->dp.aux, DPCD_LC0F, lt->pc2conf, 2); in nvkm_dp_train_drive()
210 outp->ior->func->dp->pattern(outp->ior, pattern); in nvkm_dp_train_pattern()
217 nvkm_rdaux(outp->dp.aux, addr, &sink_tp, 1); in nvkm_dp_train_pattern()
225 nvkm_wraux(outp->dp.aux, addr, &sink_tp, 1); in nvkm_dp_train_pattern()
231 struct nvkm_i2c_aux *aux = lt->outp->dp.aux; in nvkm_dp_train_eq()
242 if (lt->outp->dp.dpcd[DPCD_RC00_DPCD_REV] >= 0x14 && in nvkm_dp_train_eq()
243 lt->outp->dp.dpcd[DPCD_RC03] & DPCD_RC03_TPS4_SUPPORTED) in nvkm_dp_train_eq()
246 if (lt->outp->dp.dpcd[DPCD_RC00_DPCD_REV] >= 0x12 && in nvkm_dp_train_eq()
247 lt->outp->dp.dpcd[DPCD_RC02] & DPCD_RC02_TPS3_SUPPORTED) in nvkm_dp_train_eq()
252 usec = (lt->outp->dp.dpcd[DPCD_RC0E] & DPCD_RC0E_AUX_RD_INTERVAL) * 4000; in nvkm_dp_train_eq()
262 for (i = 0; i < lt->outp->ior->dp.nr && eq_done; i++) { in nvkm_dp_train_eq()
284 if (lt->outp->dp.dpcd[DPCD_RC00_DPCD_REV] < 0x14 && !lt->repeater) in nvkm_dp_train_cr()
285 usec = (lt->outp->dp.dpcd[DPCD_RC0E] & DPCD_RC0E_AUX_RD_INTERVAL) * 4000; in nvkm_dp_train_cr()
293 for (i = 0; i < lt->outp->ior->dp.nr; i++) { in nvkm_dp_train_cr()
318 .pc2 = outp->dp.dpcd[DPCD_RC02] & DPCD_RC02_TPS3_SUPPORTED, in nvkm_dp_train_link()
319 .repeaters = outp->dp.lttprs, in nvkm_dp_train_link()
324 OUTP_DBG(outp, "training %dx%02x", ior->dp.nr, ior->dp.bw); in nvkm_dp_train_link()
327 sink[0] = (outp->dp.rate[rate].dpcd < 0) ? ior->dp.bw : 0; in nvkm_dp_train_link()
328 sink[1] = ior->dp.nr; in nvkm_dp_train_link()
329 if (ior->dp.ef) in nvkm_dp_train_link()
331 if (outp->dp.lt.post_adj) in nvkm_dp_train_link()
334 ret = nvkm_wraux(outp->dp.aux, DPCD_LC00_LINK_BW_SET, sink, 2); in nvkm_dp_train_link()
338 if (outp->dp.rate[rate].dpcd >= 0) { in nvkm_dp_train_link()
339 ret = nvkm_rdaux(outp->dp.aux, DPCD_LC15_LINK_RATE_SET, &sink[0], sizeof(sink[0])); in nvkm_dp_train_link()
344 sink[0] |= outp->dp.rate[rate].dpcd; in nvkm_dp_train_link()
346 ret = nvkm_wraux(outp->dp.aux, DPCD_LC15_LINK_RATE_SET, &sink[0], sizeof(sink[0])); in nvkm_dp_train_link()
378 OUTP_DBG(outp, "programming link for %dx%02x", ior->dp.nr, ior->dp.bw); in nvkm_dp_train_links()
382 outp->dp.dpcd[DPCD_RC03] &= ~DPCD_RC03_TPS4_SUPPORTED; in nvkm_dp_train_links()
384 outp->dp.dpcd[DPCD_RC02] &= ~DPCD_RC02_TPS3_SUPPORTED; in nvkm_dp_train_links()
386 if (AMPERE_IED_HACK(disp) && (lnkcmp = outp->dp.info.script[0])) { in nvkm_dp_train_links()
387 /* Execute BeforeLinkTraining script from DP Info table. */ in nvkm_dp_train_links()
388 while (ior->dp.bw < nvbios_rd08(bios, lnkcmp)) in nvkm_dp_train_links()
400 if ((lnkcmp = outp->dp.info.lnkcmp)) { in nvkm_dp_train_links()
401 if (outp->dp.version < 0x30) { in nvkm_dp_train_links()
402 while ((ior->dp.bw * 2700) < nvbios_rd16(bios, lnkcmp)) in nvkm_dp_train_links()
406 while (ior->dp.bw < nvbios_rd08(bios, lnkcmp)) in nvkm_dp_train_links()
418 ret = ior->func->dp->links(ior, outp->dp.aux); in nvkm_dp_train_links()
427 ior->func->dp->power(ior, ior->dp.nr); in nvkm_dp_train_links()
436 /* Execute AfterLinkTraining script from DP Info table. */ in nvkm_dp_train_fini()
437 nvbios_init(&outp->disp->engine.subdev, outp->dp.info.script[1], in nvkm_dp_train_fini()
447 /* Execute EnableSpread/DisableSpread script from DP Info table. */ in nvkm_dp_train_init()
448 if (outp->dp.dpcd[DPCD_RC03] & DPCD_RC03_MAX_DOWNSPREAD) { in nvkm_dp_train_init()
449 nvbios_init(&outp->disp->engine.subdev, outp->dp.info.script[2], in nvkm_dp_train_init()
455 nvbios_init(&outp->disp->engine.subdev, outp->dp.info.script[3], in nvkm_dp_train_init()
463 /* Execute BeforeLinkTraining script from DP Info table. */ in nvkm_dp_train_init()
464 nvbios_init(&outp->disp->engine.subdev, outp->dp.info.script[0], in nvkm_dp_train_init()
492 for (rate = 0; rate < outp->dp.rates; rate++) { in nvkm_dp_train()
493 if (outp->dp.rate[rate].rate == (retrain ? ior->dp.bw : outp->dp.lt.bw) * 27000) in nvkm_dp_train()
497 if (WARN_ON(rate == outp->dp.rates)) in nvkm_dp_train()
502 mutex_lock(&outp->dp.mutex); in nvkm_dp_train()
504 mutex_unlock(&outp->dp.mutex); in nvkm_dp_train()
508 mutex_lock(&outp->dp.mutex); in nvkm_dp_train()
511 ior->dp.mst = outp->dp.lt.mst; in nvkm_dp_train()
512 ior->dp.ef = outp->dp.dpcd[DPCD_RC02] & DPCD_RC02_ENHANCED_FRAME_CAP; in nvkm_dp_train()
513 ior->dp.bw = outp->dp.lt.bw; in nvkm_dp_train()
514 ior->dp.nr = outp->dp.lt.nr; in nvkm_dp_train()
524 mutex_unlock(&outp->dp.mutex); in nvkm_dp_train()
531 /* Execute DisableLT script from DP Info Table. */ in nvkm_dp_disable()
532 nvbios_init(&ior->disp->engine.subdev, outp->dp.info.script[4], in nvkm_dp_disable()
542 outp->ior->dp.nr = 0; in nvkm_dp_release()
552 struct nvkm_i2c_aux *aux = outp->dp.aux; in nvkm_dp_enable()
554 if (auxpwr && !outp->dp.aux_pwr) { in nvkm_dp_enable()
563 outp->dp.aux_pwr_pu = true; in nvkm_dp_enable()
578 outp->dp.aux_pwr = true; in nvkm_dp_enable()
580 if (!auxpwr && outp->dp.aux_pwr) { in nvkm_dp_enable()
583 outp->dp.aux_pwr = false; in nvkm_dp_enable()
589 if (outp->dp.aux_pwr_pu) { in nvkm_dp_enable()
591 outp->dp.aux_pwr_pu = false; in nvkm_dp_enable()
607 nvkm_dp_enable(outp, outp->dp.enabled); in nvkm_dp_init()
627 .dp.aux_pwr = nvkm_dp_aux_pwr,
628 .dp.aux_xfer = nvkm_dp_aux_xfer,
629 .dp.train = nvkm_dp_train,
630 .dp.drive = nvkm_dp_drive,
631 .dp.mst_id_get = nvkm_dp_mst_id_get,
632 .dp.mst_id_put = nvkm_dp_mst_id_put,
652 outp->dp.aux = nvkm_i2c_aux_find(i2c, NVKM_I2C_AUX_CCB(dcbE->i2c_index)); in nvkm_dp_new()
654 outp->dp.aux = nvkm_i2c_aux_find(i2c, NVKM_I2C_AUX_EXT(dcbE->extdev)); in nvkm_dp_new()
655 if (!outp->dp.aux) { in nvkm_dp_new()
662 &outp->dp.version, &hdr, &cnt, &len, &outp->dp.info); in nvkm_dp_new()
664 OUTP_ERR(outp, "no bios dp data"); in nvkm_dp_new()
668 OUTP_DBG(outp, "bios dp %02x %02x %02x %02x", outp->dp.version, hdr, cnt, len); in nvkm_dp_new()
671 outp->dp.mst = data && ver >= 0x40 && (nvbios_rd08(bios, data + 0x08) & 0x04); in nvkm_dp_new()
673 mutex_init(&outp->dp.mutex); in nvkm_dp_new()