Lines Matching +full:off +full:- +full:chip

3 /*-
21 * Driver for the "DisplayLink DL-120 / DL-160" graphic chips based on
77 &udl_fps, 0, "Frames Per Second, 1-60");
199 if (buf->size == size) { in udl_buffer_alloc()
206 uint8_t *ptr = ((uint8_t *)buf) - size; in udl_buffer_alloc()
232 buf->size = size; in udl_buffer_free()
240 unsigned i = sc->sc_cur_mode; in udl_get_fb_size()
249 unsigned i = sc->sc_cur_mode; in udl_get_fb_width()
257 unsigned i = sc->sc_cur_mode; in udl_get_fb_height()
265 unsigned i = sc->sc_cur_mode; in udl_get_fb_hz()
277 if (sc->sc_power_save == 0) { in udl_callout()
286 if (sc->sc_sync_off >= max) in udl_callout()
287 sc->sc_sync_off = 0; in udl_callout()
288 usbd_transfer_start(sc->sc_xfer[UDL_BULK_WRITE_0]); in udl_callout()
289 usbd_transfer_start(sc->sc_xfer[UDL_BULK_WRITE_1]); in udl_callout()
293 callout_reset(&sc->sc_callout, hz / fps, &udl_callout, sc); in udl_callout()
301 if (uaa->usb_mode != USB_MODE_HOST) in udl_probe()
303 if (uaa->info.bConfigIndex != 0) in udl_probe()
305 if (uaa->info.bIfaceIndex != 0) in udl_probe()
323 mtx_init(&sc->sc_mtx, "UDL lock", NULL, MTX_DEF); in udl_attach()
324 cv_init(&sc->sc_cv, "UDLCV"); in udl_attach()
325 callout_init_mtx(&sc->sc_callout, &sc->sc_mtx, 0); in udl_attach()
326 sc->sc_udev = uaa->device; in udl_attach()
328 error = usbd_transfer_setup(uaa->device, &uaa->info.bIfaceIndex, in udl_attach()
329 sc->sc_xfer, udl_config, UDL_N_TRANSFER, sc, &sc->sc_mtx); in udl_attach()
335 usbd_xfer_set_priv(sc->sc_xfer[UDL_BULK_WRITE_0], &sc->sc_xfer_head[0]); in udl_attach()
336 usbd_xfer_set_priv(sc->sc_xfer[UDL_BULK_WRITE_1], &sc->sc_xfer_head[1]); in udl_attach()
338 TAILQ_INIT(&sc->sc_xfer_head[0]); in udl_attach()
339 TAILQ_INIT(&sc->sc_xfer_head[1]); in udl_attach()
340 TAILQ_INIT(&sc->sc_cmd_buf_free); in udl_attach()
341 TAILQ_INIT(&sc->sc_cmd_buf_pending); in udl_attach()
343 sc->sc_def_chip = -1; in udl_attach()
344 sc->sc_chip = USB_GET_DRIVER_INFO(uaa); in udl_attach()
345 sc->sc_def_mode = -1; in udl_attach()
346 sc->sc_cur_mode = UDL_MAX_MODES; in udl_attach()
348 /* Allow chip ID to be overwritten */ in udl_attach()
350 CTLFLAG_RWTUN, &sc->sc_def_chip, 0, "chip ID"); in udl_attach()
352 /* Export current chip ID */ in udl_attach()
354 CTLFLAG_RD, &sc->sc_chip, 0, "chip ID"); in udl_attach()
356 if (sc->sc_def_chip > -1 && sc->sc_def_chip <= DLMAX) { in udl_attach()
357 device_printf(dev, "Forcing chip ID to 0x%04x\n", sc->sc_def_chip); in udl_attach()
358 sc->sc_chip = sc->sc_def_chip; in udl_attach()
361 * The product might have more than one chip in udl_attach()
363 if (sc->sc_chip == DLUNK) in udl_attach()
367 struct udl_cmd_buf *cb = &sc->sc_cmd_buf_temp[i]; in udl_attach()
369 TAILQ_INSERT_TAIL(&sc->sc_cmd_buf_free, cb, entry); in udl_attach()
373 * Initialize chip. in udl_attach()
386 CTLFLAG_RWTUN, &sc->sc_def_mode, 0, "mode"); in udl_attach()
390 CTLFLAG_RD, &sc->sc_cur_mode, 0, "mode"); in udl_attach()
392 i = sc->sc_def_mode; in udl_attach()
393 if (i > -1 && i < UDL_MAX_MODES) { in udl_attach()
394 if (udl_modes[i].chip <= sc->sc_chip) { in udl_attach()
396 sc->sc_cur_mode = i; in udl_attach()
414 sc->sc_fb_info.fb_name = device_get_nameunit(dev); in udl_attach()
415 sc->sc_fb_info.fb_size = sc->sc_fb_size; in udl_attach()
416 sc->sc_fb_info.fb_bpp = 16; in udl_attach()
417 sc->sc_fb_info.fb_depth = 16; in udl_attach()
418 sc->sc_fb_info.fb_width = udl_get_fb_width(sc); in udl_attach()
419 sc->sc_fb_info.fb_height = udl_get_fb_height(sc); in udl_attach()
420 sc->sc_fb_info.fb_stride = sc->sc_fb_info.fb_width * 2; in udl_attach()
421 sc->sc_fb_info.fb_pbase = 0; in udl_attach()
422 sc->sc_fb_info.fb_vbase = (uintptr_t)sc->sc_fb_addr; in udl_attach()
423 sc->sc_fb_info.fb_priv = sc; in udl_attach()
424 sc->sc_fb_info.setblankmode = &udl_fb_setblankmode; in udl_attach()
426 sc->sc_fbdev = device_add_child(dev, "fbd", DEVICE_UNIT_ANY); in udl_attach()
427 if (sc->sc_fbdev == NULL) in udl_attach()
429 if (device_probe_and_attach(sc->sc_fbdev) != 0) in udl_attach()
452 sc->sc_gone = 1; in udl_detach()
453 callout_stop(&sc->sc_callout); in udl_detach()
456 usbd_transfer_unsetup(sc->sc_xfer, UDL_N_TRANSFER); in udl_detach()
458 callout_drain(&sc->sc_callout); in udl_detach()
460 mtx_destroy(&sc->sc_mtx); in udl_detach()
461 cv_destroy(&sc->sc_cv); in udl_detach()
464 udl_buffer_free(sc->sc_fb_addr, sc->sc_fb_size); in udl_detach()
467 free(sc->sc_fb_copy, M_USB_DL); in udl_detach()
477 return (&sc->sc_fb_info); in udl_fb_getinfo()
491 if (sc->sc_fb_addr != 0) { in udl_fb_setblankmode()
494 memset((void *)sc->sc_fb_addr, 0, max); in udl_fb_setblankmode()
510 while ((cb = TAILQ_FIRST(&sc->sc_cmd_buf_free)) == NULL) { in udl_cmd_buf_alloc_locked()
513 cv_wait(&sc->sc_cv, &sc->sc_mtx); in udl_cmd_buf_alloc_locked()
516 TAILQ_REMOVE(&sc->sc_cmd_buf_free, cb, entry); in udl_cmd_buf_alloc_locked()
517 cb->off = 0; in udl_cmd_buf_alloc_locked()
537 if (sc->sc_gone) { in udl_cmd_buf_send()
538 TAILQ_INSERT_TAIL(&sc->sc_cmd_buf_free, cb, entry); in udl_cmd_buf_send()
544 TAILQ_INSERT_TAIL(&sc->sc_cmd_buf_pending, cb, entry); in udl_cmd_buf_send()
545 usbd_transfer_start(sc->sc_xfer[UDL_BULK_WRITE_0]); in udl_cmd_buf_send()
546 usbd_transfer_start(sc->sc_xfer[UDL_BULK_WRITE_1]); in udl_cmd_buf_send()
557 if (sc->sc_fb_addr == NULL || in udl_fb_synchronize_locked()
558 sc->sc_fb_copy == NULL) in udl_fb_synchronize_locked()
561 while (sc->sc_sync_off < max) { in udl_fb_synchronize_locked()
562 uint32_t delta = max - sc->sc_sync_off; in udl_fb_synchronize_locked()
566 if (bcmp(sc->sc_fb_addr + sc->sc_sync_off, sc->sc_fb_copy + sc->sc_sync_off, delta) != 0) { in udl_fb_synchronize_locked()
572 memcpy(sc->sc_fb_copy + sc->sc_sync_off, in udl_fb_synchronize_locked()
573 sc->sc_fb_addr + sc->sc_sync_off, delta); in udl_fb_synchronize_locked()
576 udl_cmd_insert_int_3(cb, sc->sc_sync_off); in udl_fb_synchronize_locked()
578 udl_cmd_insert_buf_le16(cb, sc->sc_fb_copy + sc->sc_sync_off, delta); in udl_fb_synchronize_locked()
579 sc->sc_sync_off += delta; in udl_fb_synchronize_locked()
582 sc->sc_sync_off += delta; in udl_fb_synchronize_locked()
599 TAILQ_CONCAT(&sc->sc_cmd_buf_free, phead, entry); in udl_bulk_write_callback()
603 cb = TAILQ_FIRST(&sc->sc_cmd_buf_pending); in udl_bulk_write_callback()
609 TAILQ_REMOVE(&sc->sc_cmd_buf_pending, cb, entry); in udl_bulk_write_callback()
612 usbd_xfer_set_frame_data(xfer, i, cb->buf, cb->off); in udl_bulk_write_callback()
620 TAILQ_CONCAT(&sc->sc_cmd_buf_free, phead, entry); in udl_bulk_write_callback()
629 cv_signal(&sc->sc_cv); in udl_bulk_write_callback()
642 DPRINTF("screen %s\n", on ? "ON" : "OFF"); in udl_power_save()
644 sc->sc_power_save = on ? 0 : 1; in udl_power_save()
669 error = usbd_do_request_flags(sc->sc_udev, NULL, in udl_ctrl_msg()
747 uint16_t chip, uint32_t clock) in udl_lookup_mode() argument
758 (udl_modes[idx].chip <= chip)) { in udl_lookup_mode()
770 (udl_modes[idx].chip <= chip)) { in udl_lookup_mode()
782 pserial = usb_get_serial(uaa->device); in udl_select_chip()
784 sc->sc_chip = DL120; in udl_select_chip()
786 if ((uaa->info.idVendor == USB_VENDOR_DISPLAYLINK) && in udl_select_chip()
787 (uaa->info.idProduct == USB_PRODUCT_DISPLAYLINK_WSDVI)) { in udl_select_chip()
791 * to determine which chip it is. in udl_select_chip()
795 if (strncmp(pserial, "0198-13", 7) == 0) in udl_select_chip()
796 sc->sc_chip = DL160; in udl_select_chip()
798 DPRINTF("iSerialNumber (%s) used to select chip (%d)\n", in udl_select_chip()
799 pserial, sc->sc_chip); in udl_select_chip()
801 if ((uaa->info.idVendor == USB_VENDOR_DISPLAYLINK) && in udl_select_chip()
802 (uaa->info.idProduct == USB_PRODUCT_DISPLAYLINK_SWDVI)) { in udl_select_chip()
809 sc->sc_chip = DL160; in udl_select_chip()
811 if (uaa->info.bcdDevice >= 0x100) { in udl_select_chip()
812 sc->sc_chip = DL165; in udl_select_chip()
813 if (uaa->info.bcdDevice == 0x104) in udl_select_chip()
814 sc->sc_chip = DL195; in udl_select_chip()
815 if (uaa->info.bcdDevice == 0x108) in udl_select_chip()
816 sc->sc_chip = DL125; in udl_select_chip()
818 DPRINTF("bcdDevice (%02x) used to select chip (%d)\n", in udl_select_chip()
819 uaa->info.bcdDevice, sc->sc_chip); in udl_select_chip()
847 sc->sc_fb_addr = udl_buffer_alloc(size); in udl_fbmem_alloc()
848 sc->sc_fb_copy = malloc(size, M_USB_DL, M_WAITOK | M_ZERO); in udl_fbmem_alloc()
849 sc->sc_fb_size = size; in udl_fbmem_alloc()
856 cb->buf[cb->off] = value; in udl_cmd_insert_int_1()
857 cb->off += 1; in udl_cmd_insert_int_1()
867 bcopy(&lvalue, cb->buf + cb->off, 2);
869 cb->off += 2;
884 bcopy(&lvalue, cb->buf + cb->off, 3); in udl_cmd_insert_int_3()
886 cb->off += 3; in udl_cmd_insert_int_3()
896 bcopy(&lvalue, cb->buf + cb->off, 4);
898 cb->off += 4;
910 cb->buf[cb->off + x + 0] = buf[x + 1]; in udl_cmd_insert_buf_le16()
911 cb->buf[cb->off + x + 1] = buf[x + 0]; in udl_cmd_insert_buf_le16()
913 cb->off += len; in udl_cmd_insert_buf_le16()
947 /* Some products may use later chip too */ in udl_init_chip()
950 switch (sc->sc_chip) { in udl_init_chip()
952 sc->sc_chip = DL125; in udl_init_chip()
955 sc->sc_chip = DL165; in udl_init_chip()
960 DPRINTF("chip 0x%04x\n", sc->sc_chip); in udl_init_chip()
972 error = udl_read_edid(sc, sc->sc_edid); in udl_init_chip()
1007 const uint8_t *buf = udl_modes[sc->sc_cur_mode].mode; in udl_init_resolution()
1031 delta = max - i; in udl_init_resolution()
1062 edid_parse(sc->sc_edid, &sc->sc_edid_info); in udl_select_mode()
1064 edid_print(&sc->sc_edid_info); in udl_select_mode()
1066 if (sc->sc_edid_info.edid_preferred_mode != NULL) { in udl_select_mode()
1068 (sc->sc_edid_info.edid_preferred_mode->dot_clock * 1000) / in udl_select_mode()
1069 (sc->sc_edid_info.edid_preferred_mode->htotal * in udl_select_mode()
1070 sc->sc_edid_info.edid_preferred_mode->vtotal); in udl_select_mode()
1072 sc->sc_edid_info.edid_preferred_mode->dot_clock / 10; in udl_select_mode()
1074 sc->sc_edid_info.edid_preferred_mode->hdisplay; in udl_select_mode()
1076 sc->sc_edid_info.edid_preferred_mode->vdisplay; in udl_select_mode()
1078 sc->sc_chip, mode.clock); in udl_select_mode()
1079 sc->sc_cur_mode = index; in udl_select_mode()
1088 while (i < sc->sc_edid_info.edid_nmodes) { in udl_select_mode()
1090 (sc->sc_edid_info.edid_modes[i].dot_clock * 1000) / in udl_select_mode()
1091 (sc->sc_edid_info.edid_modes[i].htotal * in udl_select_mode()
1092 sc->sc_edid_info.edid_modes[i].vtotal); in udl_select_mode()
1094 sc->sc_edid_info.edid_modes[i].dot_clock / 10; in udl_select_mode()
1096 sc->sc_edid_info.edid_modes[i].hdisplay; in udl_select_mode()
1098 sc->sc_edid_info.edid_modes[i].vdisplay; in udl_select_mode()
1100 mode.hz, sc->sc_chip, mode.clock); in udl_select_mode()
1102 if ((sc->sc_cur_mode == UDL_MAX_MODES) || in udl_select_mode()
1103 (index > sc->sc_cur_mode)) in udl_select_mode()
1104 sc->sc_cur_mode = index; in udl_select_mode()
1111 if (sc->sc_cur_mode == UDL_MAX_MODES) in udl_select_mode()
1112 sc->sc_cur_mode = udl_lookup_mode(800, 600, 60, sc->sc_chip, 0); in udl_select_mode()
1116 udl_cmd_write_buf_le16(struct udl_softc *sc, const uint8_t *buf, uint32_t off, in udl_cmd_write_buf_le16() argument
1127 udl_cmd_insert_int_3(cb, off); in udl_cmd_write_buf_le16()