Lines Matching refs:outp
45 nvkm_dp_mst_id_put(struct nvkm_outp *outp, u32 id) in nvkm_dp_mst_id_put() argument
51 nvkm_dp_mst_id_get(struct nvkm_outp *outp, u32 *pid) in nvkm_dp_mst_id_get() argument
53 *pid = BIT(outp->index); in nvkm_dp_mst_id_get()
58 nvkm_dp_aux_xfer(struct nvkm_outp *outp, u8 type, u32 addr, u8 *data, u8 *size) in nvkm_dp_aux_xfer() argument
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()
71 nvkm_dp_aux_pwr(struct nvkm_outp *outp, bool pu) in nvkm_dp_aux_pwr() argument
73 outp->dp.enabled = pu; in nvkm_dp_aux_pwr()
74 nvkm_dp_enable(outp, outp->dp.enabled); in nvkm_dp_aux_pwr()
79 struct nvkm_outp *outp; member
94 struct nvkm_outp *outp = lt->outp; in nvkm_dp_train_sense() local
105 ret = nvkm_rdaux(outp->dp.aux, addr, <->stat[0], 3); in nvkm_dp_train_sense()
114 ret = nvkm_rdaux(outp->dp.aux, addr, <->stat[4], 2); in nvkm_dp_train_sense()
119 ret = nvkm_rdaux(outp->dp.aux, DPCD_LS0C, <->pc2stat, 1); in nvkm_dp_train_sense()
123 OUTP_TRACE(outp, "status %6ph pc2 %02x", lt->stat, lt->pc2stat); in nvkm_dp_train_sense()
125 OUTP_TRACE(outp, "status %6ph", lt->stat); in nvkm_dp_train_sense()
134 struct nvkm_outp *outp = lt->outp; in nvkm_dp_train_drive() local
135 struct nvkm_ior *ior = outp->ior; in nvkm_dp_train_drive()
166 OUTP_TRACE(outp, "config lane %d %02x %02x", i, lt->conf[i], lpc2); in nvkm_dp_train_drive()
171 data = nvbios_dpout_match(bios, outp->info.hasht, outp->info.hashm, 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()
205 struct nvkm_outp *outp = lt->outp; in nvkm_dp_train_pattern() local
209 OUTP_TRACE(outp, "training pattern %d", pattern); in nvkm_dp_train_pattern()
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()
313 nvkm_dp_train_link(struct nvkm_outp *outp, int rate) in nvkm_dp_train_link() argument
315 struct nvkm_ior *ior = outp->ior; in nvkm_dp_train_link()
317 .outp = outp, in nvkm_dp_train_link()
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()
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()
354 OUTP_DBG(outp, "training LTTPR%d", lt.repeater); in nvkm_dp_train_link()
356 OUTP_DBG(outp, "training sink"); in nvkm_dp_train_link()
369 nvkm_dp_train_links(struct nvkm_outp *outp, int rate) in nvkm_dp_train_links() argument
371 struct nvkm_ior *ior = outp->ior; in nvkm_dp_train_links()
372 struct nvkm_disp *disp = outp->disp; in nvkm_dp_train_links()
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()
392 nvbios_init(&outp->disp->engine.subdev, lnkcmp, in nvkm_dp_train_links()
393 init.outp = &outp->info; 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()
412 init.outp = &outp->info; in nvkm_dp_train_links()
418 ret = ior->func->dp->links(ior, outp->dp.aux); in nvkm_dp_train_links()
421 OUTP_ERR(outp, "train failed with %d", ret); in nvkm_dp_train_links()
430 return nvkm_dp_train_link(outp, rate); in nvkm_dp_train_links()
434 nvkm_dp_train_fini(struct nvkm_outp *outp) in nvkm_dp_train_fini() argument
437 nvbios_init(&outp->disp->engine.subdev, outp->dp.info.script[1], in nvkm_dp_train_fini()
438 init.outp = &outp->info; in nvkm_dp_train_fini()
439 init.or = outp->ior->id; in nvkm_dp_train_fini()
440 init.link = outp->ior->asy.link; in nvkm_dp_train_fini()
445 nvkm_dp_train_init(struct nvkm_outp *outp) in nvkm_dp_train_init() argument
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()
450 init.outp = &outp->info; in nvkm_dp_train_init()
451 init.or = outp->ior->id; in nvkm_dp_train_init()
452 init.link = outp->ior->asy.link; in nvkm_dp_train_init()
455 nvbios_init(&outp->disp->engine.subdev, outp->dp.info.script[3], in nvkm_dp_train_init()
456 init.outp = &outp->info; in nvkm_dp_train_init()
457 init.or = outp->ior->id; in nvkm_dp_train_init()
458 init.link = outp->ior->asy.link; in nvkm_dp_train_init()
462 if (!AMPERE_IED_HACK(outp->disp)) { in nvkm_dp_train_init()
464 nvbios_init(&outp->disp->engine.subdev, outp->dp.info.script[0], in nvkm_dp_train_init()
465 init.outp = &outp->info; in nvkm_dp_train_init()
466 init.or = outp->ior->id; in nvkm_dp_train_init()
467 init.link = outp->ior->asy.link; in nvkm_dp_train_init()
473 nvkm_dp_drive(struct nvkm_outp *outp, u8 lanes, u8 pe[4], u8 vs[4]) in nvkm_dp_drive() argument
476 .outp = outp, in nvkm_dp_drive()
487 nvkm_dp_train(struct nvkm_outp *outp, bool retrain) in nvkm_dp_train() argument
489 struct nvkm_ior *ior = outp->ior; in nvkm_dp_train()
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()
503 ret = nvkm_dp_train_link(outp, rate); in nvkm_dp_train()
504 mutex_unlock(&outp->dp.mutex); in nvkm_dp_train()
508 mutex_lock(&outp->dp.mutex); in nvkm_dp_train()
509 OUTP_DBG(outp, "training"); 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()
516 nvkm_dp_train_init(outp); in nvkm_dp_train()
517 ret = nvkm_dp_train_links(outp, rate); in nvkm_dp_train()
518 nvkm_dp_train_fini(outp); in nvkm_dp_train()
520 OUTP_ERR(outp, "training failed"); in nvkm_dp_train()
522 OUTP_DBG(outp, "training done"); in nvkm_dp_train()
524 mutex_unlock(&outp->dp.mutex); in nvkm_dp_train()
529 nvkm_dp_disable(struct nvkm_outp *outp, struct nvkm_ior *ior) in nvkm_dp_disable() argument
532 nvbios_init(&ior->disp->engine.subdev, outp->dp.info.script[4], in nvkm_dp_disable()
533 init.outp = &outp->info; in nvkm_dp_disable()
540 nvkm_dp_release(struct nvkm_outp *outp) in nvkm_dp_release() argument
542 outp->ior->dp.nr = 0; in nvkm_dp_release()
543 nvkm_dp_disable(outp, outp->ior); in nvkm_dp_release()
545 nvkm_outp_release(outp); in nvkm_dp_release()
549 nvkm_dp_enable(struct nvkm_outp *outp, bool auxpwr) in nvkm_dp_enable() argument
551 struct nvkm_gpio *gpio = outp->disp->engine.subdev.device->gpio; in nvkm_dp_enable()
552 struct nvkm_i2c_aux *aux = outp->dp.aux; in nvkm_dp_enable()
554 if (auxpwr && !outp->dp.aux_pwr) { in nvkm_dp_enable()
559 if (outp->conn->info.type == DCB_CONNECTOR_eDP) { in nvkm_dp_enable()
563 outp->dp.aux_pwr_pu = true; in nvkm_dp_enable()
576 OUTP_DBG(outp, "aux power -> always"); 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()
581 OUTP_DBG(outp, "aux power -> demand"); in nvkm_dp_enable()
583 outp->dp.aux_pwr = false; in nvkm_dp_enable()
588 if (outp->conn->info.type == DCB_CONNECTOR_eDP) { 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()
598 nvkm_dp_fini(struct nvkm_outp *outp) in nvkm_dp_fini() argument
600 nvkm_dp_enable(outp, false); in nvkm_dp_fini()
604 nvkm_dp_init(struct nvkm_outp *outp) in nvkm_dp_init() argument
606 nvkm_outp_init(outp); in nvkm_dp_init()
607 nvkm_dp_enable(outp, outp->dp.enabled); in nvkm_dp_init()
611 nvkm_dp_dtor(struct nvkm_outp *outp) in nvkm_dp_dtor() argument
613 return outp; in nvkm_dp_dtor()
641 struct nvkm_outp *outp; in nvkm_dp_new() local
647 outp = *poutp; in nvkm_dp_new()
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()
656 OUTP_ERR(outp, "no aux"); in nvkm_dp_new()
661 data = nvbios_dpout_match(bios, outp->info.hasht, outp->info.hashm, 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()