Lines Matching full:dp

24 #include "dp.h"
43 struct nvkm_dp *dp; member
54 struct nvkm_dp *dp = lt->dp; in nvkm_dp_train_sense() local
57 if (dp->dpcd[DPCD_RC0E_AUX_RD_INTERVAL]) in nvkm_dp_train_sense()
58 mdelay(dp->dpcd[DPCD_RC0E_AUX_RD_INTERVAL] * 4); in nvkm_dp_train_sense()
62 ret = nvkm_rdaux(dp->aux, DPCD_LS02, lt->stat, 6); in nvkm_dp_train_sense()
67 ret = nvkm_rdaux(dp->aux, DPCD_LS0C, &lt->pc2stat, 1); in nvkm_dp_train_sense()
70 OUTP_TRACE(&dp->outp, "status %6ph pc2 %02x", in nvkm_dp_train_sense()
73 OUTP_TRACE(&dp->outp, "status %6ph", lt->stat); in nvkm_dp_train_sense()
82 struct nvkm_dp *dp = lt->dp; in nvkm_dp_train_drive() local
83 struct nvkm_ior *ior = dp->outp.ior; in nvkm_dp_train_drive()
91 for (i = 0; i < ior->dp.nr; i++) { in nvkm_dp_train_drive()
113 OUTP_TRACE(&dp->outp, "config lane %d %02x %02x", in nvkm_dp_train_drive()
116 data = nvbios_dpout_match(bios, dp->outp.info.hasht, in nvkm_dp_train_drive()
117 dp->outp.info.hashm, in nvkm_dp_train_drive()
128 ior->func->dp.drive(ior, i, ocfg.pc, ocfg.dc, in nvkm_dp_train_drive()
132 ret = nvkm_wraux(dp->aux, DPCD_LC03(0), lt->conf, 4); in nvkm_dp_train_drive()
137 ret = nvkm_wraux(dp->aux, DPCD_LC0F, lt->pc2conf, 2); in nvkm_dp_train_drive()
148 struct nvkm_dp *dp = lt->dp; in nvkm_dp_train_pattern() local
151 OUTP_TRACE(&dp->outp, "training pattern %d", pattern); in nvkm_dp_train_pattern()
152 dp->outp.ior->func->dp.pattern(dp->outp.ior, pattern); in nvkm_dp_train_pattern()
154 nvkm_rdaux(dp->aux, DPCD_LC02, &sink_tp, 1); in nvkm_dp_train_pattern()
157 nvkm_wraux(dp->aux, DPCD_LC02, &sink_tp, 1); in nvkm_dp_train_pattern()
166 if (lt->dp->dpcd[DPCD_RC02] & DPCD_RC02_TPS3_SUPPORTED) in nvkm_dp_train_eq()
178 for (i = 0; i < lt->dp->outp.ior->dp.nr && eq_done; i++) { in nvkm_dp_train_eq()
206 for (i = 0; i < lt->dp->outp.ior->dp.nr; i++) { in nvkm_dp_train_cr()
226 nvkm_dp_train_links(struct nvkm_dp *dp) in nvkm_dp_train_links() argument
228 struct nvkm_ior *ior = dp->outp.ior; in nvkm_dp_train_links()
229 struct nvkm_disp *disp = dp->outp.disp; in nvkm_dp_train_links()
233 .dp = dp, in nvkm_dp_train_links()
239 OUTP_DBG(&dp->outp, "training %d x %d MB/s", in nvkm_dp_train_links()
240 ior->dp.nr, ior->dp.bw * 27); in nvkm_dp_train_links()
244 dp->dpcd[DPCD_RC02] &= ~DPCD_RC02_TPS3_SUPPORTED; in nvkm_dp_train_links()
245 lt.pc2 = dp->dpcd[DPCD_RC02] & DPCD_RC02_TPS3_SUPPORTED; in nvkm_dp_train_links()
247 if (AMPERE_IED_HACK(disp) && (lnkcmp = lt.dp->info.script[0])) { in nvkm_dp_train_links()
248 /* Execute BeforeLinkTraining script from DP Info table. */ in nvkm_dp_train_links()
249 while (ior->dp.bw < nvbios_rd08(bios, lnkcmp)) in nvkm_dp_train_links()
253 nvbios_init(&dp->outp.disp->engine.subdev, lnkcmp, in nvkm_dp_train_links()
254 init.outp = &dp->outp.info; in nvkm_dp_train_links()
261 if ((lnkcmp = lt.dp->info.lnkcmp)) { in nvkm_dp_train_links()
262 if (dp->version < 0x30) { in nvkm_dp_train_links()
263 while ((ior->dp.bw * 2700) < nvbios_rd16(bios, lnkcmp)) in nvkm_dp_train_links()
267 while (ior->dp.bw < nvbios_rd08(bios, lnkcmp)) in nvkm_dp_train_links()
273 init.outp = &dp->outp.info; in nvkm_dp_train_links()
279 ret = ior->func->dp.links(ior, dp->aux); in nvkm_dp_train_links()
282 OUTP_ERR(&dp->outp, "train failed with %d", ret); in nvkm_dp_train_links()
288 ior->func->dp.power(ior, ior->dp.nr); in nvkm_dp_train_links()
291 sink[0] = ior->dp.bw; in nvkm_dp_train_links()
292 sink[1] = ior->dp.nr; in nvkm_dp_train_links()
293 if (ior->dp.ef) in nvkm_dp_train_links()
296 ret = nvkm_wraux(dp->aux, DPCD_LC00_LINK_BW_SET, sink, 2); in nvkm_dp_train_links()
310 nvkm_dp_train_fini(struct nvkm_dp *dp) in nvkm_dp_train_fini() argument
312 /* Execute AfterLinkTraining script from DP Info table. */ in nvkm_dp_train_fini()
313 nvbios_init(&dp->outp.disp->engine.subdev, dp->info.script[1], in nvkm_dp_train_fini()
314 init.outp = &dp->outp.info; in nvkm_dp_train_fini()
315 init.or = dp->outp.ior->id; in nvkm_dp_train_fini()
316 init.link = dp->outp.ior->asy.link; in nvkm_dp_train_fini()
321 nvkm_dp_train_init(struct nvkm_dp *dp) in nvkm_dp_train_init() argument
323 /* Execute EnableSpread/DisableSpread script from DP Info table. */ in nvkm_dp_train_init()
324 if (dp->dpcd[DPCD_RC03] & DPCD_RC03_MAX_DOWNSPREAD) { in nvkm_dp_train_init()
325 nvbios_init(&dp->outp.disp->engine.subdev, dp->info.script[2], in nvkm_dp_train_init()
326 init.outp = &dp->outp.info; in nvkm_dp_train_init()
327 init.or = dp->outp.ior->id; in nvkm_dp_train_init()
328 init.link = dp->outp.ior->asy.link; in nvkm_dp_train_init()
331 nvbios_init(&dp->outp.disp->engine.subdev, dp->info.script[3], in nvkm_dp_train_init()
332 init.outp = &dp->outp.info; in nvkm_dp_train_init()
333 init.or = dp->outp.ior->id; in nvkm_dp_train_init()
334 init.link = dp->outp.ior->asy.link; in nvkm_dp_train_init()
338 if (!AMPERE_IED_HACK(dp->outp.disp)) { in nvkm_dp_train_init()
339 /* Execute BeforeLinkTraining script from DP Info table. */ in nvkm_dp_train_init()
340 nvbios_init(&dp->outp.disp->engine.subdev, dp->info.script[0], in nvkm_dp_train_init()
341 init.outp = &dp->outp.info; in nvkm_dp_train_init()
342 init.or = dp->outp.ior->id; in nvkm_dp_train_init()
343 init.link = dp->outp.ior->asy.link; in nvkm_dp_train_init()
366 nvkm_dp_train(struct nvkm_dp *dp, u32 dataKBps) in nvkm_dp_train() argument
368 struct nvkm_ior *ior = dp->outp.ior; in nvkm_dp_train()
369 const u8 sink_nr = dp->dpcd[DPCD_RC02] & DPCD_RC02_MAX_LANE_COUNT; in nvkm_dp_train()
370 const u8 sink_bw = dp->dpcd[DPCD_RC01_MAX_LINK_RATE]; in nvkm_dp_train()
371 const u8 outp_nr = dp->outp.info.dpconf.link_nr; in nvkm_dp_train()
372 const u8 outp_bw = dp->outp.info.dpconf.link_bw; in nvkm_dp_train()
406 if (!nvkm_rdaux(dp->aux, DPCD_SC00, &pwr, 1)) { in nvkm_dp_train()
410 nvkm_wraux(dp->aux, DPCD_SC00, &pwr, 1); in nvkm_dp_train()
415 OUTP_DBG(&dp->outp, "training (min: %d x %d MB/s)", in nvkm_dp_train()
417 nvkm_dp_train_init(dp); in nvkm_dp_train()
424 OUTP_ERR(&dp->outp, "link rate unsupported by sink"); in nvkm_dp_train()
426 ior->dp.mst = dp->lt.mst; in nvkm_dp_train()
427 ior->dp.ef = dp->dpcd[DPCD_RC02] & DPCD_RC02_ENHANCED_FRAME_CAP; in nvkm_dp_train()
428 ior->dp.bw = cfg->bw; in nvkm_dp_train()
429 ior->dp.nr = cfg->nr; in nvkm_dp_train()
432 ret = nvkm_dp_train_links(dp); in nvkm_dp_train()
434 nvkm_dp_train_fini(dp); in nvkm_dp_train()
436 OUTP_ERR(&dp->outp, "training failed"); in nvkm_dp_train()
438 OUTP_DBG(&dp->outp, "training done"); in nvkm_dp_train()
439 atomic_set(&dp->lt.done, 1); in nvkm_dp_train()
446 struct nvkm_dp *dp = nvkm_dp(outp); in nvkm_dp_disable() local
448 /* Execute DisableLT script from DP Info Table. */ in nvkm_dp_disable()
449 nvbios_init(&ior->disp->engine.subdev, dp->info.script[4], in nvkm_dp_disable()
450 init.outp = &dp->outp.info; in nvkm_dp_disable()
459 struct nvkm_dp *dp = nvkm_dp(outp); in nvkm_dp_release() local
462 atomic_set(&dp->lt.done, 0); in nvkm_dp_release()
463 dp->outp.ior->dp.nr = 0; in nvkm_dp_release()
469 struct nvkm_dp *dp = nvkm_dp(outp); in nvkm_dp_acquire() local
470 struct nvkm_ior *ior = dp->outp.ior; in nvkm_dp_acquire()
479 mutex_lock(&dp->mutex); in nvkm_dp_acquire()
489 linkKBps = ior->dp.bw * 27000 * ior->dp.nr; in nvkm_dp_acquire()
491 OUTP_DBG(&dp->outp, "data %d KB/s link %d KB/s mst %d->%d", in nvkm_dp_acquire()
492 dataKBps, linkKBps, ior->dp.mst, dp->lt.mst); in nvkm_dp_acquire()
493 if (linkKBps < dataKBps || ior->dp.mst != dp->lt.mst) { in nvkm_dp_acquire()
494 OUTP_DBG(&dp->outp, "link requirements changed"); in nvkm_dp_acquire()
499 ret = nvkm_rdaux(dp->aux, DPCD_LS02, stat, 3); in nvkm_dp_acquire()
501 OUTP_DBG(&dp->outp, in nvkm_dp_acquire()
507 for (i = 0; i < ior->dp.nr; i++) { in nvkm_dp_acquire()
512 OUTP_DBG(&dp->outp, in nvkm_dp_acquire()
519 OUTP_DBG(&dp->outp, "no inter-lane alignment"); in nvkm_dp_acquire()
523 if (retrain || !atomic_read(&dp->lt.done)) in nvkm_dp_acquire()
524 ret = nvkm_dp_train(dp, dataKBps); in nvkm_dp_acquire()
525 mutex_unlock(&dp->mutex); in nvkm_dp_acquire()
530 nvkm_dp_enable(struct nvkm_dp *dp, bool enable) in nvkm_dp_enable() argument
532 struct nvkm_i2c_aux *aux = dp->aux; in nvkm_dp_enable()
535 if (!dp->present) { in nvkm_dp_enable()
536 OUTP_DBG(&dp->outp, "aux power -> always"); in nvkm_dp_enable()
538 dp->present = true; in nvkm_dp_enable()
541 if (!nvkm_rdaux(aux, DPCD_RC00_DPCD_REV, dp->dpcd, in nvkm_dp_enable()
542 sizeof(dp->dpcd))) in nvkm_dp_enable()
546 if (dp->present) { in nvkm_dp_enable()
547 OUTP_DBG(&dp->outp, "aux power -> demand"); in nvkm_dp_enable()
549 dp->present = false; in nvkm_dp_enable()
552 atomic_set(&dp->lt.done, 0); in nvkm_dp_enable()
560 struct nvkm_dp *dp = container_of(notify, typeof(*dp), hpd); in nvkm_dp_hpd() local
561 struct nvkm_conn *conn = dp->outp.conn; in nvkm_dp_hpd()
562 struct nvkm_disp *disp = dp->outp.disp; in nvkm_dp_hpd()
565 OUTP_DBG(&dp->outp, "HPD: %d", line->mask); in nvkm_dp_hpd()
567 if (atomic_read(&dp->lt.done)) in nvkm_dp_hpd()
568 dp->outp.func->acquire(&dp->outp); in nvkm_dp_hpd()
571 nvkm_dp_enable(dp, true); in nvkm_dp_hpd()
586 struct nvkm_dp *dp = nvkm_dp(outp); in nvkm_dp_fini() local
587 nvkm_notify_put(&dp->hpd); in nvkm_dp_fini()
588 nvkm_dp_enable(dp, false); in nvkm_dp_fini()
595 struct nvkm_dp *dp = nvkm_dp(outp); in nvkm_dp_init() local
597 nvkm_notify_put(&dp->outp.conn->hpd); in nvkm_dp_init()
603 if (dp->outp.conn->info.type == DCB_CONNECTOR_eDP) { in nvkm_dp_init()
620 if (!nvkm_dp_enable(dp, true) && power == 0) in nvkm_dp_init()
623 nvkm_dp_enable(dp, true); in nvkm_dp_init()
626 nvkm_notify_get(&dp->hpd); in nvkm_dp_init()
632 struct nvkm_dp *dp = nvkm_dp(outp); in nvkm_dp_dtor() local
633 nvkm_notify_fini(&dp->hpd); in nvkm_dp_dtor()
634 return dp; in nvkm_dp_dtor()
649 struct nvkm_i2c_aux *aux, struct nvkm_dp *dp) in nvkm_dp_ctor() argument
658 ret = nvkm_outp_ctor(&nvkm_dp_func, disp, index, dcbE, &dp->outp); in nvkm_dp_ctor()
662 dp->aux = aux; in nvkm_dp_ctor()
663 if (!dp->aux) { in nvkm_dp_ctor()
664 OUTP_ERR(&dp->outp, "no aux"); in nvkm_dp_ctor()
669 data = nvbios_dpout_match(bios, dp->outp.info.hasht, in nvkm_dp_ctor()
670 dp->outp.info.hashm, &dp->version, in nvkm_dp_ctor()
671 &hdr, &cnt, &len, &dp->info); in nvkm_dp_ctor()
673 OUTP_ERR(&dp->outp, "no bios dp data"); in nvkm_dp_ctor()
677 OUTP_DBG(&dp->outp, "bios dp %02x %02x %02x %02x", in nvkm_dp_ctor()
678 dp->version, hdr, cnt, len); in nvkm_dp_ctor()
685 .port = dp->aux->id, in nvkm_dp_ctor()
689 &dp->hpd); in nvkm_dp_ctor()
691 OUTP_ERR(&dp->outp, "error monitoring aux hpd: %d", ret); in nvkm_dp_ctor()
695 mutex_init(&dp->mutex); in nvkm_dp_ctor()
696 atomic_set(&dp->lt.done, 0); in nvkm_dp_ctor()
706 struct nvkm_dp *dp; in nvkm_dp_new() local
713 if (!(dp = kzalloc(sizeof(*dp), GFP_KERNEL))) in nvkm_dp_new()
715 *poutp = &dp->outp; in nvkm_dp_new()
717 return nvkm_dp_ctor(disp, index, dcbE, aux, dp); in nvkm_dp_new()