Lines Matching refs:qdev
39 void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count) in qxl_alloc_client_monitors_config() argument
41 if (qdev->client_monitors_config && in qxl_alloc_client_monitors_config()
42 count > qdev->client_monitors_config->count) { in qxl_alloc_client_monitors_config()
43 kfree(qdev->client_monitors_config); in qxl_alloc_client_monitors_config()
44 qdev->client_monitors_config = NULL; in qxl_alloc_client_monitors_config()
46 if (!qdev->client_monitors_config) { in qxl_alloc_client_monitors_config()
47 qdev->client_monitors_config = kzalloc( in qxl_alloc_client_monitors_config()
50 if (!qdev->client_monitors_config) { in qxl_alloc_client_monitors_config()
51 qxl_io_log(qdev, in qxl_alloc_client_monitors_config()
57 qdev->client_monitors_config->count = count; in qxl_alloc_client_monitors_config()
60 static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev) in qxl_display_copy_rom_client_monitors_config() argument
66 num_monitors = qdev->rom->client_monitors_config.count; in qxl_display_copy_rom_client_monitors_config()
67 crc = crc32(0, (const uint8_t *)&qdev->rom->client_monitors_config, in qxl_display_copy_rom_client_monitors_config()
68 sizeof(qdev->rom->client_monitors_config)); in qxl_display_copy_rom_client_monitors_config()
69 if (crc != qdev->rom->client_monitors_config_crc) { in qxl_display_copy_rom_client_monitors_config()
70 qxl_io_log(qdev, "crc mismatch: have %X (%zd) != %X\n", crc, in qxl_display_copy_rom_client_monitors_config()
71 sizeof(qdev->rom->client_monitors_config), in qxl_display_copy_rom_client_monitors_config()
72 qdev->rom->client_monitors_config_crc); in qxl_display_copy_rom_client_monitors_config()
75 if (num_monitors > qdev->monitors_config->max_allowed) { in qxl_display_copy_rom_client_monitors_config()
77 qdev->monitors_config->max_allowed, num_monitors); in qxl_display_copy_rom_client_monitors_config()
78 num_monitors = qdev->monitors_config->max_allowed; in qxl_display_copy_rom_client_monitors_config()
80 num_monitors = qdev->rom->client_monitors_config.count; in qxl_display_copy_rom_client_monitors_config()
82 qxl_alloc_client_monitors_config(qdev, num_monitors); in qxl_display_copy_rom_client_monitors_config()
84 qdev->client_monitors_config->max_allowed = in qxl_display_copy_rom_client_monitors_config()
85 qdev->monitors_config->max_allowed; in qxl_display_copy_rom_client_monitors_config()
86 for (i = 0 ; i < qdev->client_monitors_config->count ; ++i) { in qxl_display_copy_rom_client_monitors_config()
88 &qdev->rom->client_monitors_config.heads[i]; in qxl_display_copy_rom_client_monitors_config()
90 &qdev->client_monitors_config->heads[i]; in qxl_display_copy_rom_client_monitors_config()
104 static void qxl_update_offset_props(struct qxl_device *qdev) in qxl_update_offset_props() argument
106 struct drm_device *dev = qdev->ddev; in qxl_update_offset_props()
114 head = &qdev->client_monitors_config->heads[output->index]; in qxl_update_offset_props()
123 void qxl_display_read_client_monitors_config(struct qxl_device *qdev) in qxl_display_read_client_monitors_config() argument
126 struct drm_device *dev = qdev->ddev; in qxl_display_read_client_monitors_config()
127 while (qxl_display_copy_rom_client_monitors_config(qdev)) { in qxl_display_read_client_monitors_config()
128 qxl_io_log(qdev, "failed crc check for client_monitors_config," in qxl_display_read_client_monitors_config()
133 qxl_update_offset_props(qdev); in qxl_display_read_client_monitors_config()
135 if (!drm_helper_hpd_irq_event(qdev->ddev)) { in qxl_display_read_client_monitors_config()
138 drm_kms_helper_hotplug_event(qdev->ddev); in qxl_display_read_client_monitors_config()
147 struct qxl_device *qdev = dev->dev_private; in qxl_add_monitors_config_modes() local
153 if (!qdev->client_monitors_config) in qxl_add_monitors_config_modes()
155 head = &qdev->client_monitors_config->heads[h]; in qxl_add_monitors_config_modes()
164 qdev->monitors_config_width = mode->hdisplay; in qxl_add_monitors_config_modes()
165 qdev->monitors_config_height = mode->vdisplay; in qxl_add_monitors_config_modes()
223 struct qxl_device *qdev = dev->dev_private; in qxl_crtc_page_flip() local
252 qxl_draw_dirty_fb(qdev, qfb_src, bo, 0, 0, in qxl_crtc_page_flip()
274 qxl_hide_cursor(struct qxl_device *qdev) in qxl_hide_cursor() argument
280 ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), QXL_RELEASE_CURSOR_CMD, in qxl_hide_cursor()
287 qxl_release_free(qdev, release); in qxl_hide_cursor()
291 cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); in qxl_hide_cursor()
293 qxl_release_unmap(qdev, release, &cmd->release_info); in qxl_hide_cursor()
296 qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); in qxl_hide_cursor()
307 struct qxl_device *qdev = dev->dev_private; in qxl_crtc_cursor_set2() local
319 return qxl_hide_cursor(qdev); in qxl_crtc_cursor_set2()
342 ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), in qxl_crtc_cursor_set2()
348 ret = qxl_alloc_bo_reserved(qdev, release, sizeof(struct qxl_cursor) + size, in qxl_crtc_cursor_set2()
383 cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); in qxl_crtc_cursor_set2()
388 cmd->u.set.shape = qxl_bo_physical_address(qdev, cursor_bo, 0); in qxl_crtc_cursor_set2()
391 qxl_release_unmap(qdev, release, &cmd->release_info); in qxl_crtc_cursor_set2()
394 qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); in qxl_crtc_cursor_set2()
413 qxl_release_free(qdev, release); in qxl_crtc_cursor_set2()
427 struct qxl_device *qdev = dev->dev_private; in qxl_crtc_cursor_move() local
433 ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), QXL_RELEASE_CURSOR_CMD, in qxl_crtc_cursor_move()
440 qxl_release_free(qdev, release); in qxl_crtc_cursor_move()
447 cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); in qxl_crtc_cursor_move()
451 qxl_release_unmap(qdev, release, &cmd->release_info); in qxl_crtc_cursor_move()
454 qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); in qxl_crtc_cursor_move()
486 struct qxl_device *qdev = qxl_fb->base.dev->dev_private; in qxl_framebuffer_surface_dirty() local
511 qxl_draw_dirty_fb(qdev, qxl_fb, qobj, flags, color, in qxl_framebuffer_surface_dirty()
553 struct qxl_device *qdev = dev->dev_private; in qxl_crtc_mode_fixup() local
555 qxl_io_log(qdev, "%s: (%d,%d) => (%d,%d)\n", in qxl_crtc_mode_fixup()
564 qxl_send_monitors_config(struct qxl_device *qdev) in qxl_send_monitors_config() argument
568 BUG_ON(!qdev->ram_header->monitors_config); in qxl_send_monitors_config()
570 if (qdev->monitors_config->count == 0) { in qxl_send_monitors_config()
571 qxl_io_log(qdev, "%s: 0 monitors??\n", __func__); in qxl_send_monitors_config()
574 for (i = 0 ; i < qdev->monitors_config->count ; ++i) { in qxl_send_monitors_config()
575 struct qxl_head *head = &qdev->monitors_config->heads[i]; in qxl_send_monitors_config()
585 qxl_io_monitors_config(qdev); in qxl_send_monitors_config()
588 static void qxl_monitors_config_set(struct qxl_device *qdev, in qxl_monitors_config_set() argument
595 qdev->monitors_config->heads[index].x = x; in qxl_monitors_config_set()
596 qdev->monitors_config->heads[index].y = y; in qxl_monitors_config_set()
597 qdev->monitors_config->heads[index].width = width; in qxl_monitors_config_set()
598 qdev->monitors_config->heads[index].height = height; in qxl_monitors_config_set()
599 qdev->monitors_config->heads[index].surface_id = surf_id; in qxl_monitors_config_set()
610 struct qxl_device *qdev = dev->dev_private; in qxl_crtc_mode_set() local
637 if (bo->surf.stride * bo->surf.height > qdev->vram_size) { in qxl_crtc_mode_set()
652 qxl_io_destroy_primary(qdev); in qxl_crtc_mode_set()
653 qxl_io_log(qdev, in qxl_crtc_mode_set()
657 qxl_io_create_primary(qdev, 0, bo); in qxl_crtc_mode_set()
675 qxl_monitors_config_set(qdev, qcrtc->index, x, y, in qxl_crtc_mode_set()
697 struct qxl_device *qdev = dev->dev_private; in qxl_crtc_disable() local
708 qxl_monitors_config_set(qdev, qcrtc->index, 0, 0, 0, 0, 0); in qxl_crtc_disable()
710 qxl_send_monitors_config(qdev); in qxl_crtc_disable()
755 static void qxl_write_monitors_config_for_encoder(struct qxl_device *qdev, in qxl_write_monitors_config_for_encoder() argument
766 if (!qdev->monitors_config || in qxl_write_monitors_config_for_encoder()
767 qdev->monitors_config->max_allowed <= i) { in qxl_write_monitors_config_for_encoder()
770 qdev->monitors_config, in qxl_write_monitors_config_for_encoder()
771 qdev->monitors_config ? in qxl_write_monitors_config_for_encoder()
772 qdev->monitors_config->max_allowed : -1); in qxl_write_monitors_config_for_encoder()
781 head = &qdev->monitors_config->heads[i]; in qxl_write_monitors_config_for_encoder()
789 if (qdev->monitors_config->count < i + 1) in qxl_write_monitors_config_for_encoder()
790 qdev->monitors_config->count = i + 1; in qxl_write_monitors_config_for_encoder()
798 i, head->x, head->y, head->width, head->height, qdev->monitors_config->count); in qxl_write_monitors_config_for_encoder()
802 qxl_send_monitors_config(qdev); in qxl_write_monitors_config_for_encoder()
807 struct qxl_device *qdev = encoder->dev->dev_private; in qxl_enc_commit() local
809 qxl_write_monitors_config_for_encoder(qdev, encoder); in qxl_enc_commit()
823 struct qxl_device *qdev = connector->dev->dev_private; in qxl_conn_get_modes() local
827 DRM_DEBUG_KMS("monitors_config=%p\n", qdev->monitors_config); in qxl_conn_get_modes()
830 if (qdev->monitors_config && qdev->monitors_config->count) { in qxl_conn_get_modes()
843 struct qxl_device *qdev = ddev->dev_private; in qxl_conn_mode_valid() local
849 if(qdev->monitors_config_width == mode->hdisplay && in qxl_conn_mode_valid()
850 qdev->monitors_config_height == mode->vdisplay) in qxl_conn_mode_valid()
901 struct qxl_device *qdev = ddev->dev_private; in qxl_conn_detect() local
905 if (!qdev->client_monitors_config) { in qxl_conn_detect()
909 connected = qdev->client_monitors_config->count > output->index && in qxl_conn_detect()
910 qxl_head_enabled(&qdev->client_monitors_config->heads[output->index]); in qxl_conn_detect()
914 qxl_monitors_config_set(qdev, output->index, 0, 0, 0, 0, 0); in qxl_conn_detect()
957 static int qxl_mode_create_hotplug_mode_update_property(struct qxl_device *qdev) in qxl_mode_create_hotplug_mode_update_property() argument
959 if (qdev->hotplug_mode_update_property) in qxl_mode_create_hotplug_mode_update_property()
962 qdev->hotplug_mode_update_property = in qxl_mode_create_hotplug_mode_update_property()
963 drm_property_create_range(qdev->ddev, DRM_MODE_PROP_IMMUTABLE, in qxl_mode_create_hotplug_mode_update_property()
971 struct qxl_device *qdev = dev->dev_private; in qdev_output_init() local
999 qdev->hotplug_mode_update_property, 0); in qdev_output_init()
1037 int qxl_create_monitors_object(struct qxl_device *qdev) in qxl_create_monitors_object() argument
1045 ret = qxl_gem_object_create(qdev, monitors_config_size, 0, in qxl_create_monitors_object()
1052 qdev->monitors_config_bo = gem_to_qxl_bo(gobj); in qxl_create_monitors_object()
1054 ret = qxl_bo_reserve(qdev->monitors_config_bo, false); in qxl_create_monitors_object()
1058 ret = qxl_bo_pin(qdev->monitors_config_bo, QXL_GEM_DOMAIN_VRAM, NULL); in qxl_create_monitors_object()
1060 qxl_bo_unreserve(qdev->monitors_config_bo); in qxl_create_monitors_object()
1064 qxl_bo_unreserve(qdev->monitors_config_bo); in qxl_create_monitors_object()
1066 qxl_bo_kmap(qdev->monitors_config_bo, NULL); in qxl_create_monitors_object()
1068 qdev->monitors_config = qdev->monitors_config_bo->kptr; in qxl_create_monitors_object()
1069 qdev->ram_header->monitors_config = in qxl_create_monitors_object()
1070 qxl_bo_physical_address(qdev, qdev->monitors_config_bo, 0); in qxl_create_monitors_object()
1072 memset(qdev->monitors_config, 0, monitors_config_size); in qxl_create_monitors_object()
1073 qdev->monitors_config->max_allowed = max_allowed; in qxl_create_monitors_object()
1077 int qxl_destroy_monitors_object(struct qxl_device *qdev) in qxl_destroy_monitors_object() argument
1081 qdev->monitors_config = NULL; in qxl_destroy_monitors_object()
1082 qdev->ram_header->monitors_config = 0; in qxl_destroy_monitors_object()
1084 qxl_bo_kunmap(qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1085 ret = qxl_bo_reserve(qdev->monitors_config_bo, false); in qxl_destroy_monitors_object()
1089 qxl_bo_unpin(qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1090 qxl_bo_unreserve(qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1092 qxl_bo_unref(&qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1096 int qxl_modeset_init(struct qxl_device *qdev) in qxl_modeset_init() argument
1101 drm_mode_config_init(qdev->ddev); in qxl_modeset_init()
1103 ret = qxl_create_monitors_object(qdev); in qxl_modeset_init()
1107 qdev->ddev->mode_config.funcs = (void *)&qxl_mode_funcs; in qxl_modeset_init()
1110 qdev->ddev->mode_config.min_width = 320; in qxl_modeset_init()
1111 qdev->ddev->mode_config.min_height = 200; in qxl_modeset_init()
1112 qdev->ddev->mode_config.max_width = 8192; in qxl_modeset_init()
1113 qdev->ddev->mode_config.max_height = 8192; in qxl_modeset_init()
1115 qdev->ddev->mode_config.fb_base = qdev->vram_base; in qxl_modeset_init()
1117 drm_mode_create_suggested_offset_properties(qdev->ddev); in qxl_modeset_init()
1118 qxl_mode_create_hotplug_mode_update_property(qdev); in qxl_modeset_init()
1121 qdev_crtc_init(qdev->ddev, i); in qxl_modeset_init()
1122 qdev_output_init(qdev->ddev, i); in qxl_modeset_init()
1125 qdev->mode_info.mode_config_initialized = true; in qxl_modeset_init()
1130 qxl_fbdev_init(qdev); in qxl_modeset_init()
1134 void qxl_modeset_fini(struct qxl_device *qdev) in qxl_modeset_fini() argument
1136 qxl_fbdev_fini(qdev); in qxl_modeset_fini()
1138 qxl_destroy_monitors_object(qdev); in qxl_modeset_fini()
1139 if (qdev->mode_info.mode_config_initialized) { in qxl_modeset_fini()
1140 drm_mode_config_cleanup(qdev->ddev); in qxl_modeset_fini()
1141 qdev->mode_info.mode_config_initialized = false; in qxl_modeset_fini()