Lines Matching +full:no +full:- +full:hpd
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
48 head->func->vblank_put(head); in nvkm_disp_vblank_fini()
57 head->func->vblank_get(head); in nvkm_disp_vblank_init()
65 container_of(notify->event, typeof(*disp), vblank); in nvkm_disp_vblank_ctor()
69 int ret = -ENOSYS; in nvkm_disp_vblank_ctor()
71 if (!(ret = nvif_unpack(ret, &data, &size, req->v0, 0, 0, false))) { in nvkm_disp_vblank_ctor()
72 notify->size = sizeof(struct nvif_notify_head_rep_v0); in nvkm_disp_vblank_ctor()
73 if (ret = -ENXIO, req->v0.head <= disp->vblank.index_nr) { in nvkm_disp_vblank_ctor()
74 notify->types = 1; in nvkm_disp_vblank_ctor()
75 notify->index = req->v0.head; in nvkm_disp_vblank_ctor()
94 nvkm_event_send(&disp->vblank, 1, head, &rep, sizeof(rep)); in nvkm_disp_vblank()
102 container_of(notify->event, typeof(*disp), hpd); in nvkm_disp_hpd_ctor()
107 int ret = -ENOSYS; in nvkm_disp_hpd_ctor()
109 if (!(ret = nvif_unpack(ret, &data, &size, req->v0, 0, 0, false))) { in nvkm_disp_hpd_ctor()
110 notify->size = sizeof(struct nvif_notify_conn_rep_v0); in nvkm_disp_hpd_ctor()
111 list_for_each_entry(outp, &disp->outp, head) { in nvkm_disp_hpd_ctor()
112 if (ret = -ENXIO, outp->conn->index == req->v0.conn) { in nvkm_disp_hpd_ctor()
113 if (ret = -ENODEV, outp->conn->hpd.event) { in nvkm_disp_hpd_ctor()
114 notify->types = req->v0.mask; in nvkm_disp_hpd_ctor()
115 notify->index = req->v0.conn; in nvkm_disp_hpd_ctor()
134 struct nvkm_disp *disp = nvkm_disp(object->engine); in nvkm_disp_ntfy()
137 *event = &disp->vblank; in nvkm_disp_ntfy()
140 *event = &disp->hpd; in nvkm_disp_ntfy()
145 return -EINVAL; in nvkm_disp_ntfy()
151 struct nvkm_disp *disp = nvkm_disp(oproxy->base.engine); in nvkm_disp_class_del()
152 mutex_lock(&disp->engine.subdev.mutex); in nvkm_disp_class_del()
153 if (disp->client == oproxy) in nvkm_disp_class_del()
154 disp->client = NULL; in nvkm_disp_class_del()
155 mutex_unlock(&disp->engine.subdev.mutex); in nvkm_disp_class_del()
168 const struct nvkm_disp_oclass *sclass = oclass->engn; in nvkm_disp_class_new()
169 struct nvkm_disp *disp = nvkm_disp(oclass->engine); in nvkm_disp_class_new()
176 *pobject = &oproxy->base; in nvkm_disp_class_new()
178 mutex_lock(&disp->engine.subdev.mutex); in nvkm_disp_class_new()
179 if (disp->client) { in nvkm_disp_class_new()
180 mutex_unlock(&disp->engine.subdev.mutex); in nvkm_disp_class_new()
181 return -EBUSY; in nvkm_disp_class_new()
183 disp->client = oproxy; in nvkm_disp_class_new()
184 mutex_unlock(&disp->engine.subdev.mutex); in nvkm_disp_class_new()
186 return sclass->ctor(disp, oclass, data, size, &oproxy->object); in nvkm_disp_class_new()
198 struct nvkm_disp *disp = nvkm_disp(oclass->engine); in nvkm_disp_class_get()
200 const struct nvkm_disp_oclass *root = disp->func->root(disp); in nvkm_disp_class_get()
201 oclass->base = root->base; in nvkm_disp_class_get()
202 oclass->engn = root; in nvkm_disp_class_get()
213 disp->func->intr(disp); in nvkm_disp_intr()
223 if (disp->func->fini) in nvkm_disp_fini()
224 disp->func->fini(disp); in nvkm_disp_fini()
226 list_for_each_entry(outp, &disp->outp, head) { in nvkm_disp_fini()
230 list_for_each_entry(conn, &disp->conn, head) { in nvkm_disp_fini()
245 list_for_each_entry(conn, &disp->conn, head) { in nvkm_disp_init()
249 list_for_each_entry(outp, &disp->outp, head) { in nvkm_disp_init()
253 if (disp->func->init) { in nvkm_disp_init()
254 int ret = disp->func->init(disp); in nvkm_disp_init()
262 list_for_each_entry(ior, &disp->ior, head) { in nvkm_disp_init()
263 ior->func->power(ior, true, true, true, true, true); in nvkm_disp_init()
273 struct nvkm_subdev *subdev = &disp->engine.subdev; in nvkm_disp_oneinit()
274 struct nvkm_bios *bios = subdev->device->bios; in nvkm_disp_oneinit()
281 u8 hpd = 0, ver, hdr; in nvkm_disp_oneinit() local
286 i = -1; in nvkm_disp_oneinit()
288 if (ver < 0x40) /* No support for chipsets prior to NV50. */ in nvkm_disp_oneinit()
307 /* No support for WFD yet. */ in nvkm_disp_oneinit()
308 ret = -ENODEV; in nvkm_disp_oneinit()
318 if (ret != -ENODEV) in nvkm_disp_oneinit()
329 list_add_tail(&outp->head, &disp->outp); in nvkm_disp_oneinit()
330 hpd = max(hpd, (u8)(dcbE.connector + 1)); in nvkm_disp_oneinit()
334 list_for_each_entry_safe(outp, outt, &disp->outp, head) { in nvkm_disp_oneinit()
336 data = nvbios_connEp(bios, outp->info.connector, &ver, &hdr, in nvkm_disp_oneinit()
339 /* No bios connector data... */ in nvkm_disp_oneinit()
346 int ccb_index = outp->info.i2c_index; in nvkm_disp_oneinit()
348 list_for_each_entry(pair, &disp->outp, head) { in nvkm_disp_oneinit()
349 if (pair->info.i2c_index == ccb_index) { in nvkm_disp_oneinit()
350 outp->conn = pair->conn; in nvkm_disp_oneinit()
357 if (outp->conn) in nvkm_disp_oneinit()
362 i = -1; in nvkm_disp_oneinit()
364 i = outp->info.connector; in nvkm_disp_oneinit()
368 list_for_each_entry(conn, &disp->conn, head) { in nvkm_disp_oneinit()
369 if (conn->index == outp->info.connector) { in nvkm_disp_oneinit()
370 outp->conn = conn; in nvkm_disp_oneinit()
375 if (outp->conn) in nvkm_disp_oneinit()
379 ret = nvkm_conn_new(disp, i, &connE, &outp->conn); in nvkm_disp_oneinit()
381 nvkm_error(&disp->engine.subdev, in nvkm_disp_oneinit()
383 outp->index, ret); in nvkm_disp_oneinit()
384 nvkm_conn_del(&outp->conn); in nvkm_disp_oneinit()
385 list_del(&outp->head); in nvkm_disp_oneinit()
390 list_add_tail(&outp->conn->head, &disp->conn); in nvkm_disp_oneinit()
393 ret = nvkm_event_init(&nvkm_disp_hpd_func, 3, hpd, &disp->hpd); in nvkm_disp_oneinit()
397 if (disp->func->oneinit) { in nvkm_disp_oneinit()
398 ret = disp->func->oneinit(disp); in nvkm_disp_oneinit()
403 /* Enforce identity-mapped SOR assignment for panels, which have in nvkm_disp_oneinit()
406 list_for_each_entry(outp, &disp->outp, head) { in nvkm_disp_oneinit()
407 if (outp->conn->info.type == DCB_CONNECTOR_LVDS || in nvkm_disp_oneinit()
408 outp->conn->info.type == DCB_CONNECTOR_eDP) { in nvkm_disp_oneinit()
409 ior = nvkm_ior_find(disp, SOR, ffs(outp->info.or) - 1); in nvkm_disp_oneinit()
411 ior->identity = true; in nvkm_disp_oneinit()
412 outp->identity = true; in nvkm_disp_oneinit()
417 list_for_each_entry(head, &disp->head, head) in nvkm_disp_oneinit()
418 i = max(i, head->id + 1); in nvkm_disp_oneinit()
420 return nvkm_event_init(&nvkm_disp_vblank_func, 1, i, &disp->vblank); in nvkm_disp_oneinit()
431 if (disp->func->dtor) in nvkm_disp_dtor()
432 data = disp->func->dtor(disp); in nvkm_disp_dtor()
434 nvkm_event_fini(&disp->vblank); in nvkm_disp_dtor()
435 nvkm_event_fini(&disp->hpd); in nvkm_disp_dtor()
437 while (!list_empty(&disp->conn)) { in nvkm_disp_dtor()
438 conn = list_first_entry(&disp->conn, typeof(*conn), head); in nvkm_disp_dtor()
439 list_del(&conn->head); in nvkm_disp_dtor()
443 while (!list_empty(&disp->outp)) { in nvkm_disp_dtor()
444 outp = list_first_entry(&disp->outp, typeof(*outp), head); in nvkm_disp_dtor()
445 list_del(&outp->head); in nvkm_disp_dtor()
449 while (!list_empty(&disp->ior)) { in nvkm_disp_dtor()
451 list_first_entry(&disp->ior, typeof(*ior), head); in nvkm_disp_dtor()
455 while (!list_empty(&disp->head)) { in nvkm_disp_dtor()
457 list_first_entry(&disp->head, typeof(*head), head); in nvkm_disp_dtor()
478 disp->func = func; in nvkm_disp_ctor()
479 INIT_LIST_HEAD(&disp->head); in nvkm_disp_ctor()
480 INIT_LIST_HEAD(&disp->ior); in nvkm_disp_ctor()
481 INIT_LIST_HEAD(&disp->outp); in nvkm_disp_ctor()
482 INIT_LIST_HEAD(&disp->conn); in nvkm_disp_ctor()
483 return nvkm_engine_ctor(&nvkm_disp, device, index, true, &disp->engine); in nvkm_disp_ctor()
491 return -ENOMEM; in nvkm_disp_new_()