Lines Matching +full:lvds +full:- +full:encoder

31 #include <linux/dma-mapping.h>
84 chan->device = device; in nv50_chan_create()
95 &chan->user); in nv50_chan_create()
97 nvif_object_map(&chan->user, NULL, 0); in nv50_chan_create()
106 return -ENOSYS; in nv50_chan_create()
112 nvif_object_dtor(&chan->user); in nv50_chan_destroy()
122 nvif_object_dtor(&dmac->vram); in nv50_dmac_destroy()
123 nvif_object_dtor(&dmac->sync); in nv50_dmac_destroy()
125 nv50_chan_destroy(&dmac->base); in nv50_dmac_destroy()
127 nvif_mem_dtor(&dmac->_push.mem); in nv50_dmac_destroy()
135 dmac->cur = push->cur - (u32 *)dmac->_push.mem.object.map.ptr; in nv50_dmac_kick()
136 if (dmac->put != dmac->cur) { in nv50_dmac_kick()
140 if (dmac->push->mem.type & NVIF_MEM_VRAM) { in nv50_dmac_kick()
141 struct nvif_device *device = dmac->base.device; in nv50_dmac_kick()
142 nvif_wr32(&device->object, 0x070000, 0x00000001); in nv50_dmac_kick()
144 if (!(nvif_rd32(&device->object, 0x070000) & 0x00000002)) in nv50_dmac_kick()
149 NVIF_WV32(&dmac->base.user, NV507C, PUT, PTR, dmac->cur); in nv50_dmac_kick()
150 dmac->put = dmac->cur; in nv50_dmac_kick()
153 push->bgn = push->cur; in nv50_dmac_kick()
159 u32 get = NVIF_RV32(&dmac->base.user, NV507C, GET, PTR); in nv50_dmac_free()
160 if (get > dmac->cur) /* NVIDIA stay 5 away from GET, do the same. */ in nv50_dmac_free()
161 return get - dmac->cur - 5; in nv50_dmac_free()
162 return dmac->max - dmac->cur; in nv50_dmac_free()
171 u32 get = NVIF_RV32(&dmac->base.user, NV507C, GET, PTR); in nv50_dmac_wind()
173 /* Corner-case, HW idle, but non-committed work pending. */ in nv50_dmac_wind()
174 if (dmac->put == 0) in nv50_dmac_wind()
175 nv50_dmac_kick(dmac->push); in nv50_dmac_wind()
177 if (nvif_msec(dmac->base.device, 2000, in nv50_dmac_wind()
178 if (NVIF_TV32(&dmac->base.user, NV507C, GET, PTR, >, 0)) in nv50_dmac_wind()
181 return -ETIMEDOUT; in nv50_dmac_wind()
184 PUSH_RSVD(dmac->push, PUSH_JUMP(dmac->push, 0)); in nv50_dmac_wind()
185 dmac->cur = 0; in nv50_dmac_wind()
195 if (WARN_ON(size > dmac->max)) in nv50_dmac_wait()
196 return -EINVAL; in nv50_dmac_wait()
198 dmac->cur = push->cur - (u32 *)dmac->_push.mem.object.map.ptr; in nv50_dmac_wait()
199 if (dmac->cur + size >= dmac->max) { in nv50_dmac_wait()
204 push->cur = dmac->_push.mem.object.map.ptr; in nv50_dmac_wait()
205 push->cur = push->cur + dmac->cur; in nv50_dmac_wait()
209 if (nvif_msec(dmac->base.device, 2000, in nv50_dmac_wait()
214 return -ETIMEDOUT; in nv50_dmac_wait()
217 push->bgn = dmac->_push.mem.object.map.ptr; in nv50_dmac_wait()
218 push->bgn = push->bgn + dmac->cur; in nv50_dmac_wait()
219 push->cur = push->bgn; in nv50_dmac_wait()
220 push->end = push->cur + free; in nv50_dmac_wait()
225 static int nv50_dmac_vram_pushbuf = -1;
233 struct nouveau_cli *cli = (void *)device->object.client; in nv50_dmac_create()
238 mutex_init(&dmac->lock); in nv50_dmac_create()
240 /* Pascal added support for 47-bit physical addresses, but some in nv50_dmac_create()
241 * parts of EVO still only accept 40-bit PAs. in nv50_dmac_create()
250 (nv50_dmac_vram_pushbuf < 0 && device->info.family == NV_DEVICE_INFO_V0_PASCAL)) in nv50_dmac_create()
253 ret = nvif_mem_ctor_map(&cli->mmu, "kmsChanPush", type, 0x1000, in nv50_dmac_create()
254 &dmac->_push.mem); in nv50_dmac_create()
258 dmac->ptr = dmac->_push.mem.object.map.ptr; in nv50_dmac_create()
259 dmac->_push.wait = nv50_dmac_wait; in nv50_dmac_create()
260 dmac->_push.kick = nv50_dmac_kick; in nv50_dmac_create()
261 dmac->push = &dmac->_push; in nv50_dmac_create()
262 dmac->push->bgn = dmac->_push.mem.object.map.ptr; in nv50_dmac_create()
263 dmac->push->cur = dmac->push->bgn; in nv50_dmac_create()
264 dmac->push->end = dmac->push->bgn; in nv50_dmac_create()
265 dmac->max = 0x1000/4 - 1; in nv50_dmac_create()
270 if (disp->oclass < GV100_DISP) in nv50_dmac_create()
271 dmac->max -= 12; in nv50_dmac_create()
273 args->pushbuf = nvif_handle(&dmac->_push.mem.object); in nv50_dmac_create()
276 &dmac->base); in nv50_dmac_create()
283 ret = nvif_object_ctor(&dmac->base.user, "kmsSyncCtxDma", NV50_DISP_HANDLE_SYNCBUF, in nv50_dmac_create()
291 &dmac->sync); in nv50_dmac_create()
295 ret = nvif_object_ctor(&dmac->base.user, "kmsVramCtxDma", NV50_DISP_HANDLE_VRAM, in nv50_dmac_create()
301 .limit = device->info.ram_user - 1, in nv50_dmac_create()
303 &dmac->vram); in nv50_dmac_create()
318 outp->base.base.name, outp->caps.dp_interlace); in nv50_outp_dump_caps()
324 struct nv50_disp *disp = nv50_disp(nv_encoder->base.base.dev); in nv50_outp_release()
330 .base.hasht = nv_encoder->dcb->hasht, in nv50_outp_release()
331 .base.hashm = nv_encoder->dcb->hashm, in nv50_outp_release()
334 nvif_mthd(&disp->disp->object, 0, &args, sizeof(args)); in nv50_outp_release()
335 nv_encoder->or = -1; in nv50_outp_release()
336 nv_encoder->link = 0; in nv50_outp_release()
342 struct nouveau_drm *drm = nouveau_drm(nv_encoder->base.base.dev); in nv50_outp_acquire()
343 struct nv50_disp *disp = nv50_disp(drm->dev); in nv50_outp_acquire()
350 .base.hasht = nv_encoder->dcb->hasht, in nv50_outp_acquire()
351 .base.hashm = nv_encoder->dcb->hashm, in nv50_outp_acquire()
356 ret = nvif_mthd(&disp->disp->object, 0, &args, sizeof(args)); in nv50_outp_acquire()
362 nv_encoder->or = args.info.or; in nv50_outp_acquire()
363 nv_encoder->link = args.info.link; in nv50_outp_acquire()
368 nv50_outp_atomic_check_view(struct drm_encoder *encoder, in nv50_outp_atomic_check_view() argument
373 struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode; in nv50_outp_atomic_check_view()
374 struct drm_display_mode *mode = &crtc_state->mode; in nv50_outp_atomic_check_view()
375 struct drm_connector *connector = conn_state->connector; in nv50_outp_atomic_check_view()
377 struct nouveau_drm *drm = nouveau_drm(encoder->dev); in nv50_outp_atomic_check_view()
379 NV_ATOMIC(drm, "%s atomic_check\n", encoder->name); in nv50_outp_atomic_check_view()
380 asyc->scaler.full = false; in nv50_outp_atomic_check_view()
384 if (asyc->scaler.mode == DRM_MODE_SCALE_NONE) { in nv50_outp_atomic_check_view()
385 switch (connector->connector_type) { in nv50_outp_atomic_check_view()
392 if (mode->hdisplay == native_mode->hdisplay && in nv50_outp_atomic_check_view()
393 mode->vdisplay == native_mode->vdisplay && in nv50_outp_atomic_check_view()
394 mode->type & DRM_MODE_TYPE_DRIVER) in nv50_outp_atomic_check_view()
397 asyc->scaler.full = true; in nv50_outp_atomic_check_view()
408 crtc_state->mode_changed = true; in nv50_outp_atomic_check_view()
415 nv50_outp_atomic_check(struct drm_encoder *encoder, in nv50_outp_atomic_check() argument
419 struct drm_connector *connector = conn_state->connector; in nv50_outp_atomic_check()
424 ret = nv50_outp_atomic_check_view(encoder, crtc_state, conn_state, in nv50_outp_atomic_check()
425 nv_connector->native_mode); in nv50_outp_atomic_check()
429 if (crtc_state->mode_changed || crtc_state->connectors_changed) in nv50_outp_atomic_check()
430 asyh->or.bpc = connector->display_info.bpc; in nv50_outp_atomic_check()
440 struct drm_encoder *encoder = to_drm_encoder(outp); in nv50_outp_get_new_connector() local
444 if (connector_state->best_encoder == encoder) in nv50_outp_get_new_connector()
456 struct drm_encoder *encoder = to_drm_encoder(outp); in nv50_outp_get_old_connector() local
460 if (connector_state->best_encoder == encoder) in nv50_outp_get_old_connector()
472 const u32 mask = drm_encoder_mask(&outp->base.base); in nv50_outp_get_new_crtc()
476 if (crtc_state->encoder_mask & mask) in nv50_outp_get_new_crtc()
487 nv50_dac_atomic_disable(struct drm_encoder *encoder, struct drm_atomic_state *state) in nv50_dac_atomic_disable() argument
489 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); in nv50_dac_atomic_disable()
490 struct nv50_core *core = nv50_disp(encoder->dev)->core; in nv50_dac_atomic_disable()
493 core->func->dac->ctrl(core, nv_encoder->or, ctrl, NULL); in nv50_dac_atomic_disable()
494 nv_encoder->crtc = NULL; in nv50_dac_atomic_disable()
499 nv50_dac_atomic_enable(struct drm_encoder *encoder, struct drm_atomic_state *state) in nv50_dac_atomic_enable() argument
501 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); in nv50_dac_atomic_enable()
504 nv50_head_atom(drm_atomic_get_new_crtc_state(state, &nv_crtc->base)); in nv50_dac_atomic_enable()
505 struct nv50_core *core = nv50_disp(encoder->dev)->core; in nv50_dac_atomic_enable()
508 switch (nv_crtc->index) { in nv50_dac_atomic_enable()
522 core->func->dac->ctrl(core, nv_encoder->or, ctrl, asyh); in nv50_dac_atomic_enable()
523 asyh->or.depth = 0; in nv50_dac_atomic_enable()
525 nv_encoder->crtc = &nv_crtc->base; in nv50_dac_atomic_enable()
529 nv50_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector) in nv50_dac_detect() argument
531 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); in nv50_dac_detect()
532 struct nv50_disp *disp = nv50_disp(encoder->dev); in nv50_dac_detect()
539 .base.hasht = nv_encoder->dcb->hasht, in nv50_dac_detect()
540 .base.hashm = nv_encoder->dcb->hashm, in nv50_dac_detect()
544 args.load.data = nouveau_drm(encoder->dev)->vbios.dactestval; in nv50_dac_detect()
548 ret = nvif_mthd(&disp->disp->object, 0, &args, sizeof(args)); in nv50_dac_detect()
564 nv50_dac_destroy(struct drm_encoder *encoder) in nv50_dac_destroy() argument
566 drm_encoder_cleanup(encoder); in nv50_dac_destroy()
567 kfree(encoder); in nv50_dac_destroy()
578 struct nouveau_drm *drm = nouveau_drm(connector->dev); in nv50_dac_create()
579 struct nvkm_i2c *i2c = nvxx_i2c(&drm->client.device); in nv50_dac_create()
582 struct drm_encoder *encoder; in nv50_dac_create() local
587 return -ENOMEM; in nv50_dac_create()
588 nv_encoder->dcb = dcbe; in nv50_dac_create()
590 bus = nvkm_i2c_bus_find(i2c, dcbe->i2c_index); in nv50_dac_create()
592 nv_encoder->i2c = &bus->i2c; in nv50_dac_create()
594 encoder = to_drm_encoder(nv_encoder); in nv50_dac_create()
595 encoder->possible_crtcs = dcbe->heads; in nv50_dac_create()
596 encoder->possible_clones = 0; in nv50_dac_create()
597 drm_encoder_init(connector->dev, encoder, &nv50_dac_func, type, in nv50_dac_create()
598 "dac-%04x-%04x", dcbe->hasht, dcbe->hashm); in nv50_dac_create()
599 drm_encoder_helper_add(encoder, &nv50_dac_help); in nv50_dac_create()
601 drm_connector_attach_encoder(connector, encoder); in nv50_dac_create()
612 if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify) in nv50_audio_component_eld_notify()
613 acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr, in nv50_audio_component_eld_notify()
623 struct drm_encoder *encoder; in nv50_audio_component_get_eld() local
630 mutex_lock(&drm->audio.lock); in nv50_audio_component_get_eld()
632 drm_for_each_encoder(encoder, drm->dev) { in nv50_audio_component_get_eld()
635 if (encoder->encoder_type == DRM_MODE_ENCODER_DPMST) in nv50_audio_component_get_eld()
638 nv_encoder = nouveau_encoder(encoder); in nv50_audio_component_get_eld()
639 nv_connector = nouveau_connector(nv_encoder->audio.connector); in nv50_audio_component_get_eld()
640 nv_crtc = nouveau_crtc(nv_encoder->crtc); in nv50_audio_component_get_eld()
642 if (!nv_crtc || nv_encoder->or != port || nv_crtc->index != dev_id) in nv50_audio_component_get_eld()
645 *enabled = nv_encoder->audio.enabled; in nv50_audio_component_get_eld()
647 ret = drm_eld_size(nv_connector->base.eld); in nv50_audio_component_get_eld()
648 memcpy(buf, nv_connector->base.eld, in nv50_audio_component_get_eld()
654 mutex_unlock(&drm->audio.lock); in nv50_audio_component_get_eld()
672 return -ENOMEM; in nv50_audio_component_bind()
675 acomp->ops = &nv50_audio_component_ops; in nv50_audio_component_bind()
676 acomp->dev = kdev; in nv50_audio_component_bind()
677 drm->audio.component = acomp; in nv50_audio_component_bind()
691 drm->audio.component = NULL; in nv50_audio_component_unbind()
692 acomp->ops = NULL; in nv50_audio_component_unbind()
693 acomp->dev = NULL; in nv50_audio_component_unbind()
705 if (component_add(drm->dev->dev, &nv50_audio_component_bind_ops)) in nv50_audio_component_init()
708 drm->audio.component_registered = true; in nv50_audio_component_init()
709 mutex_init(&drm->audio.lock); in nv50_audio_component_init()
715 if (!drm->audio.component_registered) in nv50_audio_component_fini()
718 component_del(drm->dev->dev, &nv50_audio_component_bind_ops); in nv50_audio_component_fini()
719 drm->audio.component_registered = false; in nv50_audio_component_fini()
720 mutex_destroy(&drm->audio.lock); in nv50_audio_component_fini()
727 nv50_audio_disable(struct drm_encoder *encoder, struct nouveau_crtc *nv_crtc) in nv50_audio_disable() argument
729 struct nouveau_drm *drm = nouveau_drm(encoder->dev); in nv50_audio_disable()
730 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); in nv50_audio_disable()
731 struct nv50_disp *disp = nv50_disp(encoder->dev); in nv50_audio_disable()
738 .base.hasht = nv_encoder->dcb->hasht, in nv50_audio_disable()
739 .base.hashm = (0xf0ff & nv_encoder->dcb->hashm) | in nv50_audio_disable()
740 (0x0100 << nv_crtc->index), in nv50_audio_disable()
743 mutex_lock(&drm->audio.lock); in nv50_audio_disable()
744 if (nv_encoder->audio.enabled) { in nv50_audio_disable()
745 nv_encoder->audio.enabled = false; in nv50_audio_disable()
746 nv_encoder->audio.connector = NULL; in nv50_audio_disable()
747 nvif_mthd(&disp->disp->object, 0, &args, sizeof(args)); in nv50_audio_disable()
749 mutex_unlock(&drm->audio.lock); in nv50_audio_disable()
751 nv50_audio_component_eld_notify(drm->audio.component, nv_encoder->or, in nv50_audio_disable()
752 nv_crtc->index); in nv50_audio_disable()
756 nv50_audio_enable(struct drm_encoder *encoder, struct nouveau_crtc *nv_crtc, in nv50_audio_enable() argument
760 struct nouveau_drm *drm = nouveau_drm(encoder->dev); in nv50_audio_enable()
761 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); in nv50_audio_enable()
762 struct nv50_disp *disp = nv50_disp(encoder->dev); in nv50_audio_enable()
768 u8 data[sizeof(nv_connector->base.eld)]; in nv50_audio_enable()
772 .base.mthd.hasht = nv_encoder->dcb->hasht, in nv50_audio_enable()
773 .base.mthd.hashm = (0xf0ff & nv_encoder->dcb->hashm) | in nv50_audio_enable()
774 (0x0100 << nv_crtc->index), in nv50_audio_enable()
777 if (!drm_detect_monitor_audio(nv_connector->edid)) in nv50_audio_enable()
780 mutex_lock(&drm->audio.lock); in nv50_audio_enable()
782 memcpy(args.data, nv_connector->base.eld, sizeof(args.data)); in nv50_audio_enable()
784 nvif_mthd(&disp->disp->object, 0, &args, in nv50_audio_enable()
786 nv_encoder->audio.enabled = true; in nv50_audio_enable()
787 nv_encoder->audio.connector = &nv_connector->base; in nv50_audio_enable()
789 mutex_unlock(&drm->audio.lock); in nv50_audio_enable()
791 nv50_audio_component_eld_notify(drm->audio.component, nv_encoder->or, in nv50_audio_enable()
792 nv_crtc->index); in nv50_audio_enable()
799 nv50_hdmi_disable(struct drm_encoder *encoder, struct nouveau_crtc *nv_crtc) in nv50_hdmi_disable() argument
801 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); in nv50_hdmi_disable()
802 struct nv50_disp *disp = nv50_disp(encoder->dev); in nv50_hdmi_disable()
809 .base.hasht = nv_encoder->dcb->hasht, in nv50_hdmi_disable()
810 .base.hashm = (0xf0ff & nv_encoder->dcb->hashm) | in nv50_hdmi_disable()
811 (0x0100 << nv_crtc->index), in nv50_hdmi_disable()
814 nvif_mthd(&disp->disp->object, 0, &args, sizeof(args)); in nv50_hdmi_disable()
818 nv50_hdmi_enable(struct drm_encoder *encoder, struct nouveau_crtc *nv_crtc, in nv50_hdmi_enable() argument
822 struct nouveau_drm *drm = nouveau_drm(encoder->dev); in nv50_hdmi_enable()
823 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); in nv50_hdmi_enable()
824 struct nv50_disp *disp = nv50_disp(encoder->dev); in nv50_hdmi_enable()
832 .base.hasht = nv_encoder->dcb->hasht, in nv50_hdmi_enable()
833 .base.hashm = (0xf0ff & nv_encoder->dcb->hashm) | in nv50_hdmi_enable()
834 (0x0100 << nv_crtc->index), in nv50_hdmi_enable()
847 if (!drm_detect_hdmi_monitor(nv_connector->edid)) in nv50_hdmi_enable()
850 hdmi = &nv_connector->base.display_info.hdmi; in nv50_hdmi_enable()
853 &nv_connector->base, mode); in nv50_hdmi_enable()
861 &nv_connector->base, mode); in nv50_hdmi_enable()
871 max_ac_packet = mode->htotal - mode->hdisplay; in nv50_hdmi_enable()
872 max_ac_packet -= args.pwr.rekey; in nv50_hdmi_enable()
873 max_ac_packet -= 18; /* constant from tegra */ in nv50_hdmi_enable()
876 if (hdmi->scdc.scrambling.supported) { in nv50_hdmi_enable()
877 high_tmds_clock_ratio = mode->clock > 340000; in nv50_hdmi_enable()
879 hdmi->scdc.scrambling.low_rates; in nv50_hdmi_enable()
890 nvif_mthd(&disp->disp->object, 0, &args, size); in nv50_hdmi_enable()
892 nv50_audio_enable(encoder, nv_crtc, nv_connector, state, mode); in nv50_hdmi_enable()
897 if (!hdmi->scdc.scrambling.supported) in nv50_hdmi_enable()
900 ret = drm_scdc_readb(nv_encoder->i2c, SCDC_TMDS_CONFIG, &config); in nv50_hdmi_enable()
908 ret = drm_scdc_writeb(nv_encoder->i2c, SCDC_TMDS_CONFIG, config); in nv50_hdmi_enable()
919 #define nv50_msto(p) container_of((p), struct nv50_msto, encoder)
931 struct drm_encoder encoder; member
939 struct nouveau_encoder *nv50_real_outp(struct drm_encoder *encoder) in nv50_real_outp() argument
943 if (encoder->encoder_type != DRM_MODE_ENCODER_DPMST) in nv50_real_outp()
944 return nouveau_encoder(encoder); in nv50_real_outp()
946 msto = nv50_msto(encoder); in nv50_real_outp()
947 if (!msto->mstc) in nv50_real_outp()
949 return msto->mstc->mstm->outp; in nv50_real_outp()
955 struct nouveau_drm *drm = nouveau_drm(msto->encoder.dev); in nv50_msto_payload()
956 struct nv50_mstc *mstc = msto->mstc; in nv50_msto_payload()
957 struct nv50_mstm *mstm = mstc->mstm; in nv50_msto_payload()
958 int vcpi = mstc->port->vcpi.vcpi, i; in nv50_msto_payload()
960 WARN_ON(!mutex_is_locked(&mstm->mgr.payload_lock)); in nv50_msto_payload()
962 NV_ATOMIC(drm, "%s: vcpi %d\n", msto->encoder.name, vcpi); in nv50_msto_payload()
963 for (i = 0; i < mstm->mgr.max_payloads; i++) { in nv50_msto_payload()
964 struct drm_dp_payload *payload = &mstm->mgr.payloads[i]; in nv50_msto_payload()
966 mstm->outp->base.base.name, i, payload->vcpi, in nv50_msto_payload()
967 payload->start_slot, payload->num_slots); in nv50_msto_payload()
970 for (i = 0; i < mstm->mgr.max_payloads; i++) { in nv50_msto_payload()
971 struct drm_dp_payload *payload = &mstm->mgr.payloads[i]; in nv50_msto_payload()
972 if (payload->vcpi == vcpi) in nv50_msto_payload()
982 struct nouveau_drm *drm = nouveau_drm(msto->encoder.dev); in nv50_msto_cleanup()
983 struct nv50_mstc *mstc = msto->mstc; in nv50_msto_cleanup()
984 struct nv50_mstm *mstm = mstc->mstm; in nv50_msto_cleanup()
986 if (!msto->disabled) in nv50_msto_cleanup()
989 NV_ATOMIC(drm, "%s: msto cleanup\n", msto->encoder.name); in nv50_msto_cleanup()
991 drm_dp_mst_deallocate_vcpi(&mstm->mgr, mstc->port); in nv50_msto_cleanup()
993 msto->mstc = NULL; in nv50_msto_cleanup()
994 msto->disabled = false; in nv50_msto_cleanup()
1000 struct nouveau_drm *drm = nouveau_drm(msto->encoder.dev); in nv50_msto_prepare()
1001 struct nv50_mstc *mstc = msto->mstc; in nv50_msto_prepare()
1002 struct nv50_mstm *mstm = mstc->mstm; in nv50_msto_prepare()
1009 .base.hasht = mstm->outp->dcb->hasht, in nv50_msto_prepare()
1010 .base.hashm = (0xf0ff & mstm->outp->dcb->hashm) | in nv50_msto_prepare()
1011 (0x0100 << msto->head->base.index), in nv50_msto_prepare()
1014 mutex_lock(&mstm->mgr.payload_lock); in nv50_msto_prepare()
1016 NV_ATOMIC(drm, "%s: msto prepare\n", msto->encoder.name); in nv50_msto_prepare()
1017 if (mstc->port->vcpi.vcpi > 0) { in nv50_msto_prepare()
1020 args.vcpi.start_slot = payload->start_slot; in nv50_msto_prepare()
1021 args.vcpi.num_slots = payload->num_slots; in nv50_msto_prepare()
1022 args.vcpi.pbn = mstc->port->vcpi.pbn; in nv50_msto_prepare()
1023 args.vcpi.aligned_pbn = mstc->port->vcpi.aligned_pbn; in nv50_msto_prepare()
1028 msto->encoder.name, msto->head->base.base.name, in nv50_msto_prepare()
1032 nvif_mthd(&drm->display->disp.object, 0, &args, sizeof(args)); in nv50_msto_prepare()
1033 mutex_unlock(&mstm->mgr.payload_lock); in nv50_msto_prepare()
1037 nv50_msto_atomic_check(struct drm_encoder *encoder, in nv50_msto_atomic_check() argument
1041 struct drm_atomic_state *state = crtc_state->state; in nv50_msto_atomic_check()
1042 struct drm_connector *connector = conn_state->connector; in nv50_msto_atomic_check()
1044 struct nv50_mstm *mstm = mstc->mstm; in nv50_msto_atomic_check()
1049 ret = nv50_outp_atomic_check_view(encoder, crtc_state, conn_state, in nv50_msto_atomic_check()
1050 mstc->native); in nv50_msto_atomic_check()
1054 if (!crtc_state->mode_changed && !crtc_state->connectors_changed) in nv50_msto_atomic_check()
1062 if (!state->duplicated) { in nv50_msto_atomic_check()
1063 const int clock = crtc_state->adjusted_mode.clock; in nv50_msto_atomic_check()
1065 asyh->or.bpc = connector->display_info.bpc; in nv50_msto_atomic_check()
1066 asyh->dp.pbn = drm_dp_calc_pbn_mode(clock, asyh->or.bpc * 3, in nv50_msto_atomic_check()
1070 slots = drm_dp_atomic_find_vcpi_slots(state, &mstm->mgr, mstc->port, in nv50_msto_atomic_check()
1071 asyh->dp.pbn, 0); in nv50_msto_atomic_check()
1075 asyh->dp.tu = slots; in nv50_msto_atomic_check()
1092 nv50_msto_atomic_enable(struct drm_encoder *encoder, struct drm_atomic_state *state) in nv50_msto_atomic_enable() argument
1094 struct nv50_msto *msto = nv50_msto(encoder); in nv50_msto_atomic_enable()
1095 struct nv50_head *head = msto->head; in nv50_msto_atomic_enable()
1097 nv50_head_atom(drm_atomic_get_new_crtc_state(state, &head->base.base)); in nv50_msto_atomic_enable()
1105 drm_connector_list_iter_begin(encoder->dev, &conn_iter); in nv50_msto_atomic_enable()
1107 if (connector->state->best_encoder == &msto->encoder) { in nv50_msto_atomic_enable()
1109 mstm = mstc->mstm; in nv50_msto_atomic_enable()
1118 r = drm_dp_mst_allocate_vcpi(&mstm->mgr, mstc->port, asyh->dp.pbn, asyh->dp.tu); in nv50_msto_atomic_enable()
1122 if (!mstm->links++) in nv50_msto_atomic_enable()
1123 nv50_outp_acquire(mstm->outp, false /*XXX: MST audio.*/); in nv50_msto_atomic_enable()
1125 if (mstm->outp->link & 1) in nv50_msto_atomic_enable()
1130 mstm->outp->update(mstm->outp, head->base.index, asyh, proto, in nv50_msto_atomic_enable()
1131 nv50_dp_bpc_to_depth(asyh->or.bpc)); in nv50_msto_atomic_enable()
1133 msto->mstc = mstc; in nv50_msto_atomic_enable()
1134 mstm->modified = true; in nv50_msto_atomic_enable()
1138 nv50_msto_atomic_disable(struct drm_encoder *encoder, struct drm_atomic_state *state) in nv50_msto_atomic_disable() argument
1140 struct nv50_msto *msto = nv50_msto(encoder); in nv50_msto_atomic_disable()
1141 struct nv50_mstc *mstc = msto->mstc; in nv50_msto_atomic_disable()
1142 struct nv50_mstm *mstm = mstc->mstm; in nv50_msto_atomic_disable()
1144 drm_dp_mst_reset_vcpi_slots(&mstm->mgr, mstc->port); in nv50_msto_atomic_disable()
1146 mstm->outp->update(mstm->outp, msto->head->base.index, NULL, 0, 0); in nv50_msto_atomic_disable()
1147 mstm->modified = true; in nv50_msto_atomic_disable()
1148 if (!--mstm->links) in nv50_msto_atomic_disable()
1149 mstm->disabled = true; in nv50_msto_atomic_disable()
1150 msto->disabled = true; in nv50_msto_atomic_disable()
1161 nv50_msto_destroy(struct drm_encoder *encoder) in nv50_msto_destroy() argument
1163 struct nv50_msto *msto = nv50_msto(encoder); in nv50_msto_destroy()
1164 drm_encoder_cleanup(&msto->encoder); in nv50_msto_destroy()
1181 return ERR_PTR(-ENOMEM); in nv50_msto_new()
1183 ret = drm_encoder_init(dev, &msto->encoder, &nv50_msto, in nv50_msto_new()
1184 DRM_MODE_ENCODER_DPMST, "mst-%d", id); in nv50_msto_new()
1190 drm_encoder_helper_add(&msto->encoder, &nv50_msto_help); in nv50_msto_new()
1191 msto->encoder.possible_crtcs = drm_crtc_mask(&head->base.base); in nv50_msto_new()
1192 msto->head = head; in nv50_msto_new()
1203 struct drm_crtc *crtc = connector_state->crtc; in nv50_mstc_atomic_best_encoder()
1205 if (!(mstc->mstm->outp->dcb->heads & drm_crtc_mask(crtc))) in nv50_mstc_atomic_best_encoder()
1208 return &nv50_head(crtc)->msto->encoder; in nv50_mstc_atomic_best_encoder()
1216 struct nouveau_encoder *outp = mstc->mstm->outp; in nv50_mstc_mode_valid()
1231 mstc->edid = drm_dp_mst_get_edid(&mstc->connector, mstc->port->mgr, mstc->port); in nv50_mstc_get_modes()
1232 drm_connector_update_edid_property(&mstc->connector, mstc->edid); in nv50_mstc_get_modes()
1233 if (mstc->edid) in nv50_mstc_get_modes()
1234 ret = drm_add_edid_modes(&mstc->connector, mstc->edid); in nv50_mstc_get_modes()
1242 if (connector->display_info.bpc) in nv50_mstc_get_modes()
1243 connector->display_info.bpc = in nv50_mstc_get_modes()
1244 clamp(connector->display_info.bpc, 6U, 8U); in nv50_mstc_get_modes()
1246 connector->display_info.bpc = 8; in nv50_mstc_get_modes()
1248 if (mstc->native) in nv50_mstc_get_modes()
1249 drm_mode_destroy(mstc->connector.dev, mstc->native); in nv50_mstc_get_modes()
1250 mstc->native = nouveau_conn_native_mode(&mstc->connector); in nv50_mstc_get_modes()
1259 struct drm_dp_mst_topology_mgr *mgr = &mstc->mstm->mgr; in nv50_mstc_atomic_check()
1265 struct drm_crtc *new_crtc = new_conn_state->crtc; in nv50_mstc_atomic_check()
1267 if (!old_conn_state->crtc) in nv50_mstc_atomic_check()
1278 crtc_state->enable) in nv50_mstc_atomic_check()
1282 return drm_dp_atomic_release_vcpi_slots(state, mgr, mstc->port); in nv50_mstc_atomic_check()
1295 ret = pm_runtime_get_sync(connector->dev->dev); in nv50_mstc_detect()
1296 if (ret < 0 && ret != -EACCES) { in nv50_mstc_detect()
1297 pm_runtime_put_autosuspend(connector->dev->dev); in nv50_mstc_detect()
1301 ret = drm_dp_mst_detect_port(connector, ctx, mstc->port->mgr, in nv50_mstc_detect()
1302 mstc->port); in nv50_mstc_detect()
1307 pm_runtime_mark_last_busy(connector->dev->dev); in nv50_mstc_detect()
1308 pm_runtime_put_autosuspend(connector->dev->dev); in nv50_mstc_detect()
1326 drm_connector_cleanup(&mstc->connector); in nv50_mstc_destroy()
1327 drm_dp_mst_put_port_malloc(mstc->port); in nv50_mstc_destroy()
1347 struct drm_device *dev = mstm->outp->base.base.dev; in nv50_mstc_new()
1353 return -ENOMEM; in nv50_mstc_new()
1354 mstc->mstm = mstm; in nv50_mstc_new()
1355 mstc->port = port; in nv50_mstc_new()
1357 ret = drm_connector_init(dev, &mstc->connector, &nv50_mstc, in nv50_mstc_new()
1365 drm_connector_helper_add(&mstc->connector, &nv50_mstc_help); in nv50_mstc_new()
1367 mstc->connector.funcs->reset(&mstc->connector); in nv50_mstc_new()
1368 nouveau_conn_attach_properties(&mstc->connector); in nv50_mstc_new()
1371 if (!(mstm->outp->dcb->heads & drm_crtc_mask(crtc))) in nv50_mstc_new()
1374 drm_connector_attach_encoder(&mstc->connector, in nv50_mstc_new()
1375 &nv50_head(crtc)->msto->encoder); in nv50_mstc_new()
1378 drm_object_attach_property(&mstc->connector.base, dev->mode_config.path_property, 0); in nv50_mstc_new()
1379 drm_object_attach_property(&mstc->connector.base, dev->mode_config.tile_property, 0); in nv50_mstc_new()
1380 drm_connector_set_path_property(&mstc->connector, path); in nv50_mstc_new()
1388 struct nouveau_drm *drm = nouveau_drm(mstm->outp->base.base.dev); in nv50_mstm_cleanup()
1389 struct drm_encoder *encoder; in nv50_mstm_cleanup() local
1392 NV_ATOMIC(drm, "%s: mstm cleanup\n", mstm->outp->base.base.name); in nv50_mstm_cleanup()
1393 ret = drm_dp_check_act_status(&mstm->mgr); in nv50_mstm_cleanup()
1395 ret = drm_dp_update_payload_part2(&mstm->mgr); in nv50_mstm_cleanup()
1397 drm_for_each_encoder(encoder, mstm->outp->base.base.dev) { in nv50_mstm_cleanup()
1398 if (encoder->encoder_type == DRM_MODE_ENCODER_DPMST) { in nv50_mstm_cleanup()
1399 struct nv50_msto *msto = nv50_msto(encoder); in nv50_mstm_cleanup()
1400 struct nv50_mstc *mstc = msto->mstc; in nv50_mstm_cleanup()
1401 if (mstc && mstc->mstm == mstm) in nv50_mstm_cleanup()
1406 mstm->modified = false; in nv50_mstm_cleanup()
1412 struct nouveau_drm *drm = nouveau_drm(mstm->outp->base.base.dev); in nv50_mstm_prepare()
1413 struct drm_encoder *encoder; in nv50_mstm_prepare() local
1416 NV_ATOMIC(drm, "%s: mstm prepare\n", mstm->outp->base.base.name); in nv50_mstm_prepare()
1417 ret = drm_dp_update_payload_part1(&mstm->mgr); in nv50_mstm_prepare()
1419 drm_for_each_encoder(encoder, mstm->outp->base.base.dev) { in nv50_mstm_prepare()
1420 if (encoder->encoder_type == DRM_MODE_ENCODER_DPMST) { in nv50_mstm_prepare()
1421 struct nv50_msto *msto = nv50_msto(encoder); in nv50_mstm_prepare()
1422 struct nv50_mstc *mstc = msto->mstc; in nv50_mstm_prepare()
1423 if (mstc && mstc->mstm == mstm) in nv50_mstm_prepare()
1428 if (mstm->disabled) { in nv50_mstm_prepare()
1429 if (!mstm->links) in nv50_mstm_prepare()
1430 nv50_outp_release(mstm->outp); in nv50_mstm_prepare()
1431 mstm->disabled = false; in nv50_mstm_prepare()
1447 return &mstc->connector; in nv50_mstm_add_connector()
1460 struct drm_dp_aux *aux = &nv_connector->aux; in nv50_mstm_service()
1472 drm_dp_mst_hpd_irq(&mstm->mgr, esi, &handled); in nv50_mstm_service()
1486 nv_connector->base.name, rc); in nv50_mstm_service()
1494 mstm->is_mst = false; in nv50_mstm_remove()
1495 drm_dp_mst_topology_mgr_set_mst(&mstm->mgr, false); in nv50_mstm_remove()
1501 struct nouveau_encoder *outp = mstm->outp; in nv50_mstm_enable()
1508 .base.hasht = outp->dcb->hasht, in nv50_mstm_enable()
1509 .base.hashm = outp->dcb->hashm, in nv50_mstm_enable()
1512 struct nouveau_drm *drm = nouveau_drm(outp->base.base.dev); in nv50_mstm_enable()
1513 struct nvif_object *disp = &drm->display->disp.object; in nv50_mstm_enable()
1521 struct nv50_mstm *mstm = outp->dp.mstm; in nv50_mstm_detect()
1525 if (!mstm || !mstm->can_mst) in nv50_mstm_detect()
1528 aux = mstm->mgr.aux; in nv50_mstm_detect()
1542 ret = drm_dp_mst_topology_mgr_set_mst(&mstm->mgr, true); in nv50_mstm_detect()
1548 mstm->is_mst = true; in nv50_mstm_detect()
1555 struct nv50_mstm *mstm = outp->dp.mstm; in nv50_mstm_fini()
1562 * path to protect mstm->is_mst without potentially deadlocking in nv50_mstm_fini()
1564 mutex_lock(&outp->dp.hpd_irq_lock); in nv50_mstm_fini()
1565 mstm->suspended = true; in nv50_mstm_fini()
1566 mutex_unlock(&outp->dp.hpd_irq_lock); in nv50_mstm_fini()
1568 if (mstm->is_mst) in nv50_mstm_fini()
1569 drm_dp_mst_topology_mgr_suspend(&mstm->mgr); in nv50_mstm_fini()
1575 struct nv50_mstm *mstm = outp->dp.mstm; in nv50_mstm_init()
1581 if (mstm->is_mst) { in nv50_mstm_init()
1582 ret = drm_dp_mst_topology_mgr_resume(&mstm->mgr, !runtime); in nv50_mstm_init()
1583 if (ret == -1) in nv50_mstm_init()
1587 mutex_lock(&outp->dp.hpd_irq_lock); in nv50_mstm_init()
1588 mstm->suspended = false; in nv50_mstm_init()
1589 mutex_unlock(&outp->dp.hpd_irq_lock); in nv50_mstm_init()
1591 if (ret == -1) in nv50_mstm_init()
1592 drm_kms_helper_hotplug_event(mstm->mgr.dev); in nv50_mstm_init()
1600 drm_dp_mst_topology_mgr_destroy(&mstm->mgr); in nv50_mstm_del()
1610 const int max_payloads = hweight8(outp->dcb->heads); in nv50_mstm_new()
1611 struct drm_device *dev = outp->base.base.dev; in nv50_mstm_new()
1616 return -ENOMEM; in nv50_mstm_new()
1617 mstm->outp = outp; in nv50_mstm_new()
1618 mstm->mgr.cbs = &nv50_mstm; in nv50_mstm_new()
1620 ret = drm_dp_mst_topology_mgr_init(&mstm->mgr, dev, aux, aux_max, in nv50_mstm_new()
1621 max_payloads, outp->dcb->dpconf.link_nr, in nv50_mstm_new()
1622 drm_dp_bw_code_to_link_rate(outp->dcb->dpconf.link_bw), in nv50_mstm_new()
1637 struct nv50_disp *disp = nv50_disp(nv_encoder->base.base.dev); in nv50_sor_update()
1638 struct nv50_core *core = disp->core; in nv50_sor_update()
1641 nv_encoder->ctrl &= ~BIT(head); in nv50_sor_update()
1642 if (NVDEF_TEST(nv_encoder->ctrl, NV507D, SOR_SET_CONTROL, OWNER, ==, NONE)) in nv50_sor_update()
1643 nv_encoder->ctrl = 0; in nv50_sor_update()
1645 nv_encoder->ctrl |= NVVAL(NV507D, SOR_SET_CONTROL, PROTOCOL, proto); in nv50_sor_update()
1646 nv_encoder->ctrl |= BIT(head); in nv50_sor_update()
1647 asyh->or.depth = depth; in nv50_sor_update()
1650 core->func->sor->ctrl(core, nv_encoder->or, nv_encoder->ctrl, asyh); in nv50_sor_update()
1653 /* TODO: Should we extend this to PWM-only backlights?
1659 nv50_sor_atomic_disable(struct drm_encoder *encoder, struct drm_atomic_state *state) in nv50_sor_atomic_disable() argument
1661 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); in nv50_sor_atomic_disable()
1662 struct nouveau_crtc *nv_crtc = nouveau_crtc(nv_encoder->crtc); in nv50_sor_atomic_disable()
1665 struct nouveau_drm *drm = nouveau_drm(nv_encoder->base.base.dev); in nv50_sor_atomic_disable()
1666 struct nouveau_backlight *backlight = nv_connector->backlight; in nv50_sor_atomic_disable()
1668 struct drm_dp_aux *aux = &nv_connector->aux; in nv50_sor_atomic_disable()
1673 if (backlight && backlight->uses_dpcd) { in nv50_sor_atomic_disable()
1674 ret = drm_edp_backlight_disable(aux, &backlight->edp_info); in nv50_sor_atomic_disable()
1677 nv_connector->base.base.id, nv_connector->base.name, ret); in nv50_sor_atomic_disable()
1681 if (nv_encoder->dcb->type == DCB_OUTPUT_DP) { in nv50_sor_atomic_disable()
1691 nv_encoder->update(nv_encoder, nv_crtc->index, NULL, 0, 0); in nv50_sor_atomic_disable()
1692 nv50_audio_disable(encoder, nv_crtc); in nv50_sor_atomic_disable()
1693 nv50_hdmi_disable(&nv_encoder->base.base, nv_crtc); in nv50_sor_atomic_disable()
1695 nv_encoder->crtc = NULL; in nv50_sor_atomic_disable()
1699 nv50_sor_atomic_enable(struct drm_encoder *encoder, struct drm_atomic_state *state) in nv50_sor_atomic_enable() argument
1701 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); in nv50_sor_atomic_enable()
1704 nv50_head_atom(drm_atomic_get_new_crtc_state(state, &nv_crtc->base)); in nv50_sor_atomic_enable()
1705 struct drm_display_mode *mode = &asyh->state.adjusted_mode; in nv50_sor_atomic_enable()
1708 struct nv50_disp_sor_lvds_script_v0 lvds; in nv50_sor_atomic_enable() member
1709 } lvds = { in nv50_sor_atomic_enable() local
1712 .base.hasht = nv_encoder->dcb->hasht, in nv50_sor_atomic_enable()
1713 .base.hashm = nv_encoder->dcb->hashm, in nv50_sor_atomic_enable()
1715 struct nv50_disp *disp = nv50_disp(encoder->dev); in nv50_sor_atomic_enable()
1716 struct drm_device *dev = encoder->dev; in nv50_sor_atomic_enable()
1722 struct nvbios *bios = &drm->vbios; in nv50_sor_atomic_enable()
1728 nv_encoder->crtc = &nv_crtc->base; in nv50_sor_atomic_enable()
1730 if ((disp->disp->object.oclass == GT214_DISP || in nv50_sor_atomic_enable()
1731 disp->disp->object.oclass >= GF110_DISP) && in nv50_sor_atomic_enable()
1732 drm_detect_monitor_audio(nv_connector->edid)) in nv50_sor_atomic_enable()
1736 switch (nv_encoder->dcb->type) { in nv50_sor_atomic_enable()
1738 if (nv_encoder->link & 1) { in nv50_sor_atomic_enable()
1740 /* Only enable dual-link if: in nv50_sor_atomic_enable()
1741 * - Need to (i.e. rate > 165MHz) in nv50_sor_atomic_enable()
1742 * - DCB says we can in nv50_sor_atomic_enable()
1743 * - Not an HDMI monitor, since there's no dual-link in nv50_sor_atomic_enable()
1746 if (mode->clock >= 165000 && in nv50_sor_atomic_enable()
1747 nv_encoder->dcb->duallink_possible && in nv50_sor_atomic_enable()
1748 !drm_detect_hdmi_monitor(nv_connector->edid)) in nv50_sor_atomic_enable()
1754 nv50_hdmi_enable(&nv_encoder->base.base, nv_crtc, nv_connector, state, mode); in nv50_sor_atomic_enable()
1759 if (bios->fp_no_ddc) { in nv50_sor_atomic_enable()
1760 if (bios->fp.dual_link) in nv50_sor_atomic_enable()
1761 lvds.lvds.script |= 0x0100; in nv50_sor_atomic_enable()
1762 if (bios->fp.if_is_24bit) in nv50_sor_atomic_enable()
1763 lvds.lvds.script |= 0x0200; in nv50_sor_atomic_enable()
1765 if (nv_connector->type == DCB_CONNECTOR_LVDS_SPWG) { in nv50_sor_atomic_enable()
1766 if (((u8 *)nv_connector->edid)[121] == 2) in nv50_sor_atomic_enable()
1767 lvds.lvds.script |= 0x0100; in nv50_sor_atomic_enable()
1769 if (mode->clock >= bios->fp.duallink_transition_clk) { in nv50_sor_atomic_enable()
1770 lvds.lvds.script |= 0x0100; in nv50_sor_atomic_enable()
1773 if (lvds.lvds.script & 0x0100) { in nv50_sor_atomic_enable()
1774 if (bios->fp.strapless_is_24bit & 2) in nv50_sor_atomic_enable()
1775 lvds.lvds.script |= 0x0200; in nv50_sor_atomic_enable()
1777 if (bios->fp.strapless_is_24bit & 1) in nv50_sor_atomic_enable()
1778 lvds.lvds.script |= 0x0200; in nv50_sor_atomic_enable()
1781 if (asyh->or.bpc == 8) in nv50_sor_atomic_enable()
1782 lvds.lvds.script |= 0x0200; in nv50_sor_atomic_enable()
1785 nvif_mthd(&disp->disp->object, 0, &lvds, sizeof(lvds)); in nv50_sor_atomic_enable()
1788 depth = nv50_dp_bpc_to_depth(asyh->or.bpc); in nv50_sor_atomic_enable()
1790 if (nv_encoder->link & 1) in nv50_sor_atomic_enable()
1795 nv50_audio_enable(encoder, nv_crtc, nv_connector, state, mode); in nv50_sor_atomic_enable()
1798 backlight = nv_connector->backlight; in nv50_sor_atomic_enable()
1799 if (backlight && backlight->uses_dpcd) in nv50_sor_atomic_enable()
1800 drm_edp_backlight_enable(&nv_connector->aux, &backlight->edp_info, in nv50_sor_atomic_enable()
1801 (u16)backlight->dev->props.brightness); in nv50_sor_atomic_enable()
1810 nv_encoder->update(nv_encoder, nv_crtc->index, asyh, proto, depth); in nv50_sor_atomic_enable()
1821 nv50_sor_destroy(struct drm_encoder *encoder) in nv50_sor_destroy() argument
1823 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); in nv50_sor_destroy()
1824 nv50_mstm_del(&nv_encoder->dp.mstm); in nv50_sor_destroy()
1825 drm_encoder_cleanup(encoder); in nv50_sor_destroy()
1827 if (nv_encoder->dcb->type == DCB_OUTPUT_DP) in nv50_sor_destroy()
1828 mutex_destroy(&nv_encoder->dp.hpd_irq_lock); in nv50_sor_destroy()
1830 kfree(encoder); in nv50_sor_destroy()
1840 struct nvkm_bios *bios = nvxx_bios(&drm->client.device); in nv50_has_mst()
1852 struct nouveau_drm *drm = nouveau_drm(connector->dev); in nv50_sor_create()
1853 struct nvkm_i2c *i2c = nvxx_i2c(&drm->client.device); in nv50_sor_create()
1855 struct drm_encoder *encoder; in nv50_sor_create() local
1856 struct nv50_disp *disp = nv50_disp(connector->dev); in nv50_sor_create()
1859 switch (dcbe->type) { in nv50_sor_create()
1870 return -ENOMEM; in nv50_sor_create()
1871 nv_encoder->dcb = dcbe; in nv50_sor_create()
1872 nv_encoder->update = nv50_sor_update; in nv50_sor_create()
1874 encoder = to_drm_encoder(nv_encoder); in nv50_sor_create()
1875 encoder->possible_crtcs = dcbe->heads; in nv50_sor_create()
1876 encoder->possible_clones = 0; in nv50_sor_create()
1877 drm_encoder_init(connector->dev, encoder, &nv50_sor_func, type, in nv50_sor_create()
1878 "sor-%04x-%04x", dcbe->hasht, dcbe->hashm); in nv50_sor_create()
1879 drm_encoder_helper_add(encoder, &nv50_sor_help); in nv50_sor_create()
1881 drm_connector_attach_encoder(connector, encoder); in nv50_sor_create()
1883 disp->core->func->sor->get_caps(disp, nv_encoder, ffs(dcbe->or) - 1); in nv50_sor_create()
1886 if (dcbe->type == DCB_OUTPUT_DP) { in nv50_sor_create()
1888 nvkm_i2c_aux_find(i2c, dcbe->i2c_index); in nv50_sor_create()
1890 mutex_init(&nv_encoder->dp.hpd_irq_lock); in nv50_sor_create()
1893 if (disp->disp->object.oclass < GF110_DISP) { in nv50_sor_create()
1894 /* HW has no support for address-only in nv50_sor_create()
1896 * use custom I2C-over-AUX code. in nv50_sor_create()
1898 nv_encoder->i2c = &aux->i2c; in nv50_sor_create()
1900 nv_encoder->i2c = &nv_connector->aux.ddc; in nv50_sor_create()
1902 nv_encoder->aux = aux; in nv50_sor_create()
1905 if (nv_connector->type != DCB_CONNECTOR_eDP && in nv50_sor_create()
1907 ret = nv50_mstm_new(nv_encoder, &nv_connector->aux, in nv50_sor_create()
1908 16, nv_connector->base.base.id, in nv50_sor_create()
1909 &nv_encoder->dp.mstm); in nv50_sor_create()
1915 nvkm_i2c_bus_find(i2c, dcbe->i2c_index); in nv50_sor_create()
1917 nv_encoder->i2c = &bus->i2c; in nv50_sor_create()
1927 nv50_pior_atomic_check(struct drm_encoder *encoder, in nv50_pior_atomic_check() argument
1931 int ret = nv50_outp_atomic_check(encoder, crtc_state, conn_state); in nv50_pior_atomic_check()
1934 crtc_state->adjusted_mode.clock *= 2; in nv50_pior_atomic_check()
1939 nv50_pior_atomic_disable(struct drm_encoder *encoder, struct drm_atomic_state *state) in nv50_pior_atomic_disable() argument
1941 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); in nv50_pior_atomic_disable()
1942 struct nv50_core *core = nv50_disp(encoder->dev)->core; in nv50_pior_atomic_disable()
1945 core->func->pior->ctrl(core, nv_encoder->or, ctrl, NULL); in nv50_pior_atomic_disable()
1946 nv_encoder->crtc = NULL; in nv50_pior_atomic_disable()
1951 nv50_pior_atomic_enable(struct drm_encoder *encoder, struct drm_atomic_state *state) in nv50_pior_atomic_enable() argument
1953 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); in nv50_pior_atomic_enable()
1956 nv50_head_atom(drm_atomic_get_new_crtc_state(state, &nv_crtc->base)); in nv50_pior_atomic_enable()
1957 struct nv50_core *core = nv50_disp(encoder->dev)->core; in nv50_pior_atomic_enable()
1960 switch (nv_crtc->index) { in nv50_pior_atomic_enable()
1970 switch (asyh->or.bpc) { in nv50_pior_atomic_enable()
1971 case 10: asyh->or.depth = NV837D_PIOR_SET_CONTROL_PIXEL_DEPTH_BPP_30_444; break; in nv50_pior_atomic_enable()
1972 case 8: asyh->or.depth = NV837D_PIOR_SET_CONTROL_PIXEL_DEPTH_BPP_24_444; break; in nv50_pior_atomic_enable()
1973 case 6: asyh->or.depth = NV837D_PIOR_SET_CONTROL_PIXEL_DEPTH_BPP_18_444; break; in nv50_pior_atomic_enable()
1974 default: asyh->or.depth = NV837D_PIOR_SET_CONTROL_PIXEL_DEPTH_DEFAULT; break; in nv50_pior_atomic_enable()
1977 switch (nv_encoder->dcb->type) { in nv50_pior_atomic_enable()
1987 core->func->pior->ctrl(core, nv_encoder->or, ctrl, asyh); in nv50_pior_atomic_enable()
1988 nv_encoder->crtc = &nv_crtc->base; in nv50_pior_atomic_enable()
1999 nv50_pior_destroy(struct drm_encoder *encoder) in nv50_pior_destroy() argument
2001 drm_encoder_cleanup(encoder); in nv50_pior_destroy()
2002 kfree(encoder); in nv50_pior_destroy()
2013 struct drm_device *dev = connector->dev; in nv50_pior_create()
2016 struct nvkm_i2c *i2c = nvxx_i2c(&drm->client.device); in nv50_pior_create()
2021 struct drm_encoder *encoder; in nv50_pior_create() local
2024 switch (dcbe->type) { in nv50_pior_create()
2026 bus = nvkm_i2c_bus_find(i2c, NVKM_I2C_BUS_EXT(dcbe->extdev)); in nv50_pior_create()
2027 ddc = bus ? &bus->i2c : NULL; in nv50_pior_create()
2031 aux = nvkm_i2c_aux_find(i2c, NVKM_I2C_AUX_EXT(dcbe->extdev)); in nv50_pior_create()
2032 ddc = aux ? &aux->i2c : NULL; in nv50_pior_create()
2036 return -ENODEV; in nv50_pior_create()
2041 return -ENOMEM; in nv50_pior_create()
2042 nv_encoder->dcb = dcbe; in nv50_pior_create()
2043 nv_encoder->i2c = ddc; in nv50_pior_create()
2044 nv_encoder->aux = aux; in nv50_pior_create()
2046 encoder = to_drm_encoder(nv_encoder); in nv50_pior_create()
2047 encoder->possible_crtcs = dcbe->heads; in nv50_pior_create()
2048 encoder->possible_clones = 0; in nv50_pior_create()
2049 drm_encoder_init(connector->dev, encoder, &nv50_pior_func, type, in nv50_pior_create()
2050 "pior-%04x-%04x", dcbe->hasht, dcbe->hashm); in nv50_pior_create()
2051 drm_encoder_helper_add(encoder, &nv50_pior_help); in nv50_pior_create()
2053 drm_connector_attach_encoder(connector, encoder); in nv50_pior_create()
2055 disp->core->func->pior->get_caps(disp, nv_encoder, ffs(dcbe->or) - 1); in nv50_pior_create()
2068 struct nouveau_drm *drm = nouveau_drm(state->dev); in nv50_disp_atomic_commit_core()
2069 struct nv50_disp *disp = nv50_disp(drm->dev); in nv50_disp_atomic_commit_core()
2070 struct nv50_core *core = disp->core; in nv50_disp_atomic_commit_core()
2072 struct drm_encoder *encoder; in nv50_disp_atomic_commit_core() local
2076 drm_for_each_encoder(encoder, drm->dev) { in nv50_disp_atomic_commit_core()
2077 if (encoder->encoder_type != DRM_MODE_ENCODER_DPMST) { in nv50_disp_atomic_commit_core()
2078 mstm = nouveau_encoder(encoder)->dp.mstm; in nv50_disp_atomic_commit_core()
2079 if (mstm && mstm->modified) in nv50_disp_atomic_commit_core()
2084 core->func->ntfy_init(disp->sync, NV50_DISP_CORE_NTFY); in nv50_disp_atomic_commit_core()
2085 core->func->update(core, interlock, true); in nv50_disp_atomic_commit_core()
2086 if (core->func->ntfy_wait_done(disp->sync, NV50_DISP_CORE_NTFY, in nv50_disp_atomic_commit_core()
2087 disp->core->chan.base.device)) in nv50_disp_atomic_commit_core()
2090 drm_for_each_encoder(encoder, drm->dev) { in nv50_disp_atomic_commit_core()
2091 if (encoder->encoder_type != DRM_MODE_ENCODER_DPMST) { in nv50_disp_atomic_commit_core()
2092 mstm = nouveau_encoder(encoder)->dp.mstm; in nv50_disp_atomic_commit_core()
2093 if (mstm && mstm->modified) in nv50_disp_atomic_commit_core()
2108 if (interlock[wndw->interlock.type] & wndw->interlock.data) { in nv50_disp_atomic_commit_wndw()
2109 if (wndw->func->update) in nv50_disp_atomic_commit_wndw()
2110 wndw->func->update(wndw, interlock); in nv50_disp_atomic_commit_wndw()
2118 struct drm_device *dev = state->dev; in nv50_disp_atomic_commit_tail()
2126 struct nv50_core *core = disp->core; in nv50_disp_atomic_commit_tail()
2132 NV_ATOMIC(drm, "commit %d %d\n", atom->lock_core, atom->flush_disable); in nv50_disp_atomic_commit_tail()
2139 if (atom->lock_core) in nv50_disp_atomic_commit_tail()
2140 mutex_lock(&disp->mutex); in nv50_disp_atomic_commit_tail()
2147 NV_ATOMIC(drm, "%s: clr %04x (set %04x)\n", crtc->name, in nv50_disp_atomic_commit_tail()
2148 asyh->clr.mask, asyh->set.mask); in nv50_disp_atomic_commit_tail()
2150 if (old_crtc_state->active && !new_crtc_state->active) { in nv50_disp_atomic_commit_tail()
2151 pm_runtime_put_noidle(dev->dev); in nv50_disp_atomic_commit_tail()
2155 if (asyh->clr.mask) { in nv50_disp_atomic_commit_tail()
2156 nv50_head_flush_clr(head, asyh, atom->flush_disable); in nv50_disp_atomic_commit_tail()
2166 NV_ATOMIC(drm, "%s: clr %02x (set %02x)\n", plane->name, in nv50_disp_atomic_commit_tail()
2167 asyw->clr.mask, asyw->set.mask); in nv50_disp_atomic_commit_tail()
2168 if (!asyw->clr.mask) in nv50_disp_atomic_commit_tail()
2171 nv50_wndw_flush_clr(wndw, interlock, atom->flush_disable, asyw); in nv50_disp_atomic_commit_tail()
2175 list_for_each_entry(outp, &atom->outp, head) { in nv50_disp_atomic_commit_tail()
2177 struct drm_encoder *encoder; in nv50_disp_atomic_commit_tail() local
2179 encoder = outp->encoder; in nv50_disp_atomic_commit_tail()
2180 help = encoder->helper_private; in nv50_disp_atomic_commit_tail()
2182 NV_ATOMIC(drm, "%s: clr %02x (set %02x)\n", encoder->name, in nv50_disp_atomic_commit_tail()
2183 outp->clr.mask, outp->set.mask); in nv50_disp_atomic_commit_tail()
2185 if (outp->clr.mask) { in nv50_disp_atomic_commit_tail()
2186 help->atomic_disable(encoder, state); in nv50_disp_atomic_commit_tail()
2188 if (outp->flush_disable) { in nv50_disp_atomic_commit_tail()
2200 if (atom->flush_disable) { in nv50_disp_atomic_commit_tail()
2214 list_for_each_entry_safe(outp, outt, &atom->outp, head) { in nv50_disp_atomic_commit_tail()
2216 struct drm_encoder *encoder; in nv50_disp_atomic_commit_tail() local
2218 encoder = outp->encoder; in nv50_disp_atomic_commit_tail()
2219 help = encoder->helper_private; in nv50_disp_atomic_commit_tail()
2221 NV_ATOMIC(drm, "%s: set %02x (clr %02x)\n", encoder->name, in nv50_disp_atomic_commit_tail()
2222 outp->set.mask, outp->clr.mask); in nv50_disp_atomic_commit_tail()
2224 if (outp->set.mask) { in nv50_disp_atomic_commit_tail()
2225 help->atomic_enable(encoder, state); in nv50_disp_atomic_commit_tail()
2229 list_del(&outp->head); in nv50_disp_atomic_commit_tail()
2238 NV_ATOMIC(drm, "%s: set %04x (clr %04x)\n", crtc->name, in nv50_disp_atomic_commit_tail()
2239 asyh->set.mask, asyh->clr.mask); in nv50_disp_atomic_commit_tail()
2241 if (asyh->set.mask) { in nv50_disp_atomic_commit_tail()
2246 if (new_crtc_state->active) { in nv50_disp_atomic_commit_tail()
2247 if (!old_crtc_state->active) { in nv50_disp_atomic_commit_tail()
2249 pm_runtime_get_noresume(dev->dev); in nv50_disp_atomic_commit_tail()
2251 if (new_crtc_state->event) in nv50_disp_atomic_commit_tail()
2256 /* Update window->head assignment. in nv50_disp_atomic_commit_tail()
2262 * supports non-fixed mappings). in nv50_disp_atomic_commit_tail()
2264 if (core->assign_windows) { in nv50_disp_atomic_commit_tail()
2265 core->func->wndw.owner(core); in nv50_disp_atomic_commit_tail()
2267 core->assign_windows = false; in nv50_disp_atomic_commit_tail()
2289 NV_ATOMIC(drm, "%s: set %04x (clr %04x)\n", crtc->name, in nv50_disp_atomic_commit_tail()
2290 asyh->set.mask, asyh->clr.mask); in nv50_disp_atomic_commit_tail()
2292 if (asyh->set.mask) { in nv50_disp_atomic_commit_tail()
2303 NV_ATOMIC(drm, "%s: set %02x (clr %02x)\n", plane->name, in nv50_disp_atomic_commit_tail()
2304 asyw->set.mask, asyw->clr.mask); in nv50_disp_atomic_commit_tail()
2305 if ( !asyw->set.mask && in nv50_disp_atomic_commit_tail()
2306 (!asyw->clr.mask || atom->flush_disable)) in nv50_disp_atomic_commit_tail()
2319 !atom->state.legacy_cursor_update) in nv50_disp_atomic_commit_tail()
2322 disp->core->func->update(disp->core, interlock, false); in nv50_disp_atomic_commit_tail()
2325 if (atom->lock_core) in nv50_disp_atomic_commit_tail()
2326 mutex_unlock(&disp->mutex); in nv50_disp_atomic_commit_tail()
2334 NV_ERROR(drm, "%s: timeout\n", plane->name); in nv50_disp_atomic_commit_tail()
2338 if (new_crtc_state->event) { in nv50_disp_atomic_commit_tail()
2341 if (new_crtc_state->active) in nv50_disp_atomic_commit_tail()
2343 spin_lock_irqsave(&crtc->dev->event_lock, flags); in nv50_disp_atomic_commit_tail()
2344 drm_crtc_send_vblank_event(crtc, new_crtc_state->event); in nv50_disp_atomic_commit_tail()
2345 spin_unlock_irqrestore(&crtc->dev->event_lock, flags); in nv50_disp_atomic_commit_tail()
2347 new_crtc_state->event = NULL; in nv50_disp_atomic_commit_tail()
2348 if (new_crtc_state->active) in nv50_disp_atomic_commit_tail()
2363 pm_runtime_mark_last_busy(dev->dev); in nv50_disp_atomic_commit_tail()
2364 pm_runtime_put_autosuspend(dev->dev); in nv50_disp_atomic_commit_tail()
2383 ret = pm_runtime_get_sync(dev->dev); in nv50_disp_atomic_commit()
2384 if (ret < 0 && ret != -EACCES) { in nv50_disp_atomic_commit()
2385 pm_runtime_put_autosuspend(dev->dev); in nv50_disp_atomic_commit()
2393 INIT_WORK(&state->commit_work, nv50_disp_atomic_commit_work); in nv50_disp_atomic_commit()
2413 if (asyw->set.image) in nv50_disp_atomic_commit()
2423 pm_runtime_get_noresume(dev->dev); in nv50_disp_atomic_commit()
2426 queue_work(system_unbound_wq, &state->commit_work); in nv50_disp_atomic_commit()
2434 pm_runtime_put_autosuspend(dev->dev); in nv50_disp_atomic_commit()
2439 nv50_disp_outp_atomic_add(struct nv50_atom *atom, struct drm_encoder *encoder) in nv50_disp_outp_atomic_add() argument
2443 list_for_each_entry(outp, &atom->outp, head) { in nv50_disp_outp_atomic_add()
2444 if (outp->encoder == encoder) in nv50_disp_outp_atomic_add()
2450 return ERR_PTR(-ENOMEM); in nv50_disp_outp_atomic_add()
2452 list_add(&outp->head, &atom->outp); in nv50_disp_outp_atomic_add()
2453 outp->encoder = encoder; in nv50_disp_outp_atomic_add()
2461 struct drm_encoder *encoder = old_connector_state->best_encoder; in nv50_disp_outp_atomic_check_clr() local
2466 if (!(crtc = old_connector_state->crtc)) in nv50_disp_outp_atomic_check_clr()
2469 old_crtc_state = drm_atomic_get_old_crtc_state(&atom->state, crtc); in nv50_disp_outp_atomic_check_clr()
2470 new_crtc_state = drm_atomic_get_new_crtc_state(&atom->state, crtc); in nv50_disp_outp_atomic_check_clr()
2471 if (old_crtc_state->active && drm_atomic_crtc_needs_modeset(new_crtc_state)) { in nv50_disp_outp_atomic_check_clr()
2472 outp = nv50_disp_outp_atomic_add(atom, encoder); in nv50_disp_outp_atomic_check_clr()
2476 if (outp->encoder->encoder_type == DRM_MODE_ENCODER_DPMST) { in nv50_disp_outp_atomic_check_clr()
2477 outp->flush_disable = true; in nv50_disp_outp_atomic_check_clr()
2478 atom->flush_disable = true; in nv50_disp_outp_atomic_check_clr()
2480 outp->clr.ctrl = true; in nv50_disp_outp_atomic_check_clr()
2481 atom->lock_core = true; in nv50_disp_outp_atomic_check_clr()
2491 struct drm_encoder *encoder = connector_state->best_encoder; in nv50_disp_outp_atomic_check_set() local
2496 if (!(crtc = connector_state->crtc)) in nv50_disp_outp_atomic_check_set()
2499 new_crtc_state = drm_atomic_get_new_crtc_state(&atom->state, crtc); in nv50_disp_outp_atomic_check_set()
2500 if (new_crtc_state->active && drm_atomic_crtc_needs_modeset(new_crtc_state)) { in nv50_disp_outp_atomic_check_set()
2501 outp = nv50_disp_outp_atomic_add(atom, encoder); in nv50_disp_outp_atomic_check_set()
2505 outp->set.ctrl = true; in nv50_disp_outp_atomic_check_set()
2506 atom->lock_core = true; in nv50_disp_outp_atomic_check_set()
2516 struct nv50_core *core = nv50_disp(dev)->core; in nv50_disp_atomic_check()
2525 if (core->assign_windows && core->func->head->static_wndw_map) { in nv50_disp_atomic_check()
2534 core->func->head->static_wndw_map(head, asyh); in nv50_disp_atomic_check()
2538 /* We need to handle colour management on a per-plane basis. */ in nv50_disp_atomic_check()
2540 if (new_crtc_state->color_mgmt_changed) { in nv50_disp_atomic_check()
2576 list_for_each_entry_safe(outp, outt, &atom->outp, head) { in nv50_disp_atomic_state_clear()
2577 list_del(&outp->head); in nv50_disp_atomic_state_clear()
2588 drm_atomic_state_default_release(&atom->state); in nv50_disp_atomic_state_free()
2597 drm_atomic_state_init(dev, &atom->state) < 0) { in nv50_disp_atomic_state_alloc()
2601 INIT_LIST_HEAD(&atom->outp); in nv50_disp_atomic_state_alloc()
2602 return &atom->state; in nv50_disp_atomic_state_alloc()
2624 struct drm_encoder *encoder; in nv50_display_fini() local
2629 if (plane->funcs != &nv50_wndw) in nv50_display_fini()
2634 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { in nv50_display_fini()
2635 if (encoder->encoder_type != DRM_MODE_ENCODER_DPMST) in nv50_display_fini()
2636 nv50_mstm_fini(nouveau_encoder(encoder)); in nv50_display_fini()
2640 cancel_work_sync(&drm->hpd_work); in nv50_display_fini()
2646 struct nv50_core *core = nv50_disp(dev)->core; in nv50_display_init()
2647 struct drm_encoder *encoder; in nv50_display_init() local
2651 core->func->init(core); in nv50_display_init()
2653 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { in nv50_display_init()
2654 if (encoder->encoder_type != DRM_MODE_ENCODER_DPMST) { in nv50_display_init()
2656 nouveau_encoder(encoder); in nv50_display_init()
2663 if (plane->funcs != &nv50_wndw) in nv50_display_init()
2678 nvif_object_unmap(&disp->caps); in nv50_display_destroy()
2679 nvif_object_dtor(&disp->caps); in nv50_display_destroy()
2680 nv50_core_del(&disp->core); in nv50_display_destroy()
2682 nouveau_bo_unmap(disp->sync); in nv50_display_destroy()
2683 if (disp->sync) in nv50_display_destroy()
2684 nouveau_bo_unpin(disp->sync); in nv50_display_destroy()
2685 nouveau_bo_ref(NULL, &disp->sync); in nv50_display_destroy()
2687 nouveau_display(dev)->priv = NULL; in nv50_display_destroy()
2694 struct nvif_device *device = &nouveau_drm(dev)->client.device; in nv50_display_create()
2696 struct dcb_table *dcb = &drm->vbios.dcb; in nv50_display_create()
2705 return -ENOMEM; in nv50_display_create()
2707 mutex_init(&disp->mutex); in nv50_display_create()
2709 nouveau_display(dev)->priv = disp; in nv50_display_create()
2710 nouveau_display(dev)->dtor = nv50_display_destroy; in nv50_display_create()
2711 nouveau_display(dev)->init = nv50_display_init; in nv50_display_create()
2712 nouveau_display(dev)->fini = nv50_display_fini; in nv50_display_create()
2713 disp->disp = &nouveau_display(dev)->disp; in nv50_display_create()
2714 dev->mode_config.funcs = &nv50_disp_func; in nv50_display_create()
2715 dev->mode_config.quirk_addfb_prefer_xbgr_30bpp = true; in nv50_display_create()
2716 dev->mode_config.normalize_zpos = true; in nv50_display_create()
2719 ret = nouveau_bo_new(&drm->client, 4096, 0x1000, in nv50_display_create()
2721 0, 0x0000, NULL, NULL, &disp->sync); in nv50_display_create()
2723 ret = nouveau_bo_pin(disp->sync, NOUVEAU_GEM_DOMAIN_VRAM, true); in nv50_display_create()
2725 ret = nouveau_bo_map(disp->sync); in nv50_display_create()
2727 nouveau_bo_unpin(disp->sync); in nv50_display_create()
2730 nouveau_bo_ref(NULL, &disp->sync); in nv50_display_create()
2737 ret = nv50_core_new(drm, &disp->core); in nv50_display_create()
2741 disp->core->func->init(disp->core); in nv50_display_create()
2742 if (disp->core->func->caps_init) { in nv50_display_create()
2743 ret = disp->core->func->caps_init(drm, disp); in nv50_display_create()
2749 if (disp->disp->object.oclass >= TU102_DISP) in nv50_display_create()
2750 nouveau_display(dev)->format_modifiers = wndwc57e_modifiers; in nv50_display_create()
2752 if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_FERMI) in nv50_display_create()
2753 nouveau_display(dev)->format_modifiers = disp90xx_modifiers; in nv50_display_create()
2755 nouveau_display(dev)->format_modifiers = disp50xx_modifiers; in nv50_display_create()
2762 * But until then, just limit cursors to 128x128 - which is small enough to avoid ever using in nv50_display_create()
2765 if (disp->disp->object.oclass >= GM107_DISP) { in nv50_display_create()
2766 dev->mode_config.cursor_width = 256; in nv50_display_create()
2767 dev->mode_config.cursor_height = 256; in nv50_display_create()
2768 } else if (disp->disp->object.oclass >= GK104_DISP) { in nv50_display_create()
2769 dev->mode_config.cursor_width = 128; in nv50_display_create()
2770 dev->mode_config.cursor_height = 128; in nv50_display_create()
2772 dev->mode_config.cursor_width = 64; in nv50_display_create()
2773 dev->mode_config.cursor_height = 64; in nv50_display_create()
2777 if (disp->disp->object.oclass >= GV100_DISP) in nv50_display_create()
2778 crtcs = nvif_rd32(&device->object, 0x610060) & 0xff; in nv50_display_create()
2780 if (disp->disp->object.oclass >= GF110_DISP) in nv50_display_create()
2781 crtcs = nvif_rd32(&device->object, 0x612004) & 0xf; in nv50_display_create()
2798 head->msto = nv50_msto_new(dev, head, i); in nv50_display_create()
2799 if (IS_ERR(head->msto)) { in nv50_display_create()
2800 ret = PTR_ERR(head->msto); in nv50_display_create()
2801 head->msto = NULL; in nv50_display_create()
2815 head->msto->encoder.possible_crtcs = crtcs; in nv50_display_create()
2819 /* create encoder/connector objects based on VBIOS DCB table */ in nv50_display_create()
2820 for (i = 0, dcbe = &dcb->entry[0]; i < dcb->entries; i++, dcbe++) { in nv50_display_create()
2825 if (dcbe->location == DCB_LOC_ON_CHIP) { in nv50_display_create()
2826 switch (dcbe->type) { in nv50_display_create()
2836 ret = -ENODEV; in nv50_display_create()
2844 NV_WARN(drm, "failed to create encoder %d/%d/%d: %d\n", in nv50_display_create()
2845 dcbe->location, dcbe->type, in nv50_display_create()
2846 ffs(dcbe->or) - 1, ret); in nv50_display_create()
2851 /* cull any connectors we created that don't have an encoder */ in nv50_display_create()
2852 list_for_each_entry_safe(connector, tmp, &dev->mode_config.connector_list, head) { in nv50_display_create()
2853 if (connector->possible_encoders) in nv50_display_create()
2857 connector->name); in nv50_display_create()
2858 connector->funcs->destroy(connector); in nv50_display_create()
2861 /* Disable vblank irqs aggressively for power-saving, safe on nv50+ */ in nv50_display_create()
2862 dev->vblank_disable_immediate = true; in nv50_display_create()
2877 * Log2(block height) ----------------------------+ *
2878 * Page Kind ----------------------------------+ | *
2879 * Gob Height/Page Kind Generation ------+ | | *
2880 * Sector layout -------+ | | | *
2881 * Compression ------+ | | | | */
2906 * Log2(block height) ----------------------------+ *
2907 * Page Kind ----------------------------------+ | *
2908 * Gob Height/Page Kind Generation ------+ | | *
2909 * Sector layout -------+ | | | *
2910 * Compression ------+ | | | | */