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 (%d) != %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
248 qxl_draw_dirty_fb(qdev, qfb_src, bo, 0, 0, in qxl_crtc_page_flip()
266 qxl_hide_cursor(struct qxl_device *qdev) in qxl_hide_cursor() argument
272 ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), QXL_RELEASE_CURSOR_CMD, in qxl_hide_cursor()
279 qxl_release_free(qdev, release); in qxl_hide_cursor()
283 cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); in qxl_hide_cursor()
285 qxl_release_unmap(qdev, release, &cmd->release_info); in qxl_hide_cursor()
287 qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); in qxl_hide_cursor()
299 struct qxl_device *qdev = dev->dev_private; in qxl_crtc_cursor_set2() local
311 return qxl_hide_cursor(qdev); in qxl_crtc_cursor_set2()
334 ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), in qxl_crtc_cursor_set2()
340 ret = qxl_alloc_bo_reserved(qdev, release, sizeof(struct qxl_cursor) + size, in qxl_crtc_cursor_set2()
375 cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); in qxl_crtc_cursor_set2()
380 cmd->u.set.shape = qxl_bo_physical_address(qdev, cursor_bo, 0); in qxl_crtc_cursor_set2()
383 qxl_release_unmap(qdev, release, &cmd->release_info); in qxl_crtc_cursor_set2()
385 qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); in qxl_crtc_cursor_set2()
405 qxl_release_free(qdev, release); in qxl_crtc_cursor_set2()
419 struct qxl_device *qdev = dev->dev_private; in qxl_crtc_cursor_move() local
425 ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), QXL_RELEASE_CURSOR_CMD, in qxl_crtc_cursor_move()
432 qxl_release_free(qdev, release); in qxl_crtc_cursor_move()
439 cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); in qxl_crtc_cursor_move()
443 qxl_release_unmap(qdev, release, &cmd->release_info); in qxl_crtc_cursor_move()
445 qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); in qxl_crtc_cursor_move()
478 struct qxl_device *qdev = qxl_fb->base.dev->dev_private; in qxl_framebuffer_surface_dirty() local
503 qxl_draw_dirty_fb(qdev, qxl_fb, qobj, flags, color, in qxl_framebuffer_surface_dirty()
545 struct qxl_device *qdev = dev->dev_private; in qxl_crtc_mode_fixup() local
547 qxl_io_log(qdev, "%s: (%d,%d) => (%d,%d)\n", in qxl_crtc_mode_fixup()
556 qxl_send_monitors_config(struct qxl_device *qdev) in qxl_send_monitors_config() argument
560 BUG_ON(!qdev->ram_header->monitors_config); in qxl_send_monitors_config()
562 if (qdev->monitors_config->count == 0) { in qxl_send_monitors_config()
563 qxl_io_log(qdev, "%s: 0 monitors??\n", __func__); in qxl_send_monitors_config()
566 for (i = 0 ; i < qdev->monitors_config->count ; ++i) { in qxl_send_monitors_config()
567 struct qxl_head *head = &qdev->monitors_config->heads[i]; in qxl_send_monitors_config()
577 qxl_io_monitors_config(qdev); in qxl_send_monitors_config()
580 static void qxl_monitors_config_set(struct qxl_device *qdev, in qxl_monitors_config_set() argument
587 qdev->monitors_config->heads[index].x = x; in qxl_monitors_config_set()
588 qdev->monitors_config->heads[index].y = y; in qxl_monitors_config_set()
589 qdev->monitors_config->heads[index].width = width; in qxl_monitors_config_set()
590 qdev->monitors_config->heads[index].height = height; in qxl_monitors_config_set()
591 qdev->monitors_config->heads[index].surface_id = surf_id; in qxl_monitors_config_set()
602 struct qxl_device *qdev = dev->dev_private; in qxl_crtc_mode_set() local
629 if (bo->surf.stride * bo->surf.height > qdev->vram_size) { in qxl_crtc_mode_set()
644 qxl_io_destroy_primary(qdev); in qxl_crtc_mode_set()
645 qxl_io_log(qdev, in qxl_crtc_mode_set()
649 qxl_io_create_primary(qdev, 0, bo); in qxl_crtc_mode_set()
667 qxl_monitors_config_set(qdev, qcrtc->index, x, y, in qxl_crtc_mode_set()
689 struct qxl_device *qdev = dev->dev_private; in qxl_crtc_disable() local
700 qxl_monitors_config_set(qdev, qcrtc->index, 0, 0, 0, 0, 0); in qxl_crtc_disable()
702 qxl_send_monitors_config(qdev); in qxl_crtc_disable()
747 static void qxl_write_monitors_config_for_encoder(struct qxl_device *qdev, in qxl_write_monitors_config_for_encoder() argument
758 if (!qdev->monitors_config || in qxl_write_monitors_config_for_encoder()
759 qdev->monitors_config->max_allowed <= i) { in qxl_write_monitors_config_for_encoder()
762 qdev->monitors_config, in qxl_write_monitors_config_for_encoder()
763 qdev->monitors_config ? in qxl_write_monitors_config_for_encoder()
764 qdev->monitors_config->max_allowed : -1); in qxl_write_monitors_config_for_encoder()
773 head = &qdev->monitors_config->heads[i]; in qxl_write_monitors_config_for_encoder()
781 if (qdev->monitors_config->count < i + 1) in qxl_write_monitors_config_for_encoder()
782 qdev->monitors_config->count = i + 1; in qxl_write_monitors_config_for_encoder()
790 i, head->x, head->y, head->width, head->height, qdev->monitors_config->count); in qxl_write_monitors_config_for_encoder()
794 qxl_send_monitors_config(qdev); in qxl_write_monitors_config_for_encoder()
799 struct qxl_device *qdev = encoder->dev->dev_private; in qxl_enc_commit() local
801 qxl_write_monitors_config_for_encoder(qdev, encoder); in qxl_enc_commit()
815 struct qxl_device *qdev = connector->dev->dev_private; in qxl_conn_get_modes() local
819 DRM_DEBUG_KMS("monitors_config=%p\n", qdev->monitors_config); in qxl_conn_get_modes()
822 if (qdev->monitors_config && qdev->monitors_config->count) { in qxl_conn_get_modes()
835 struct qxl_device *qdev = ddev->dev_private; in qxl_conn_mode_valid() local
841 if(qdev->monitors_config_width == mode->hdisplay && in qxl_conn_mode_valid()
842 qdev->monitors_config_height == mode->vdisplay) in qxl_conn_mode_valid()
893 struct qxl_device *qdev = ddev->dev_private; in qxl_conn_detect() local
897 if (!qdev->client_monitors_config) { in qxl_conn_detect()
901 connected = qdev->client_monitors_config->count > output->index && in qxl_conn_detect()
902 qxl_head_enabled(&qdev->client_monitors_config->heads[output->index]); in qxl_conn_detect()
906 qxl_monitors_config_set(qdev, output->index, 0, 0, 0, 0, 0); in qxl_conn_detect()
949 static int qxl_mode_create_hotplug_mode_update_property(struct qxl_device *qdev) in qxl_mode_create_hotplug_mode_update_property() argument
951 if (qdev->hotplug_mode_update_property) in qxl_mode_create_hotplug_mode_update_property()
954 qdev->hotplug_mode_update_property = in qxl_mode_create_hotplug_mode_update_property()
955 drm_property_create_range(qdev->ddev, DRM_MODE_PROP_IMMUTABLE, in qxl_mode_create_hotplug_mode_update_property()
963 struct qxl_device *qdev = dev->dev_private; in qdev_output_init() local
991 qdev->hotplug_mode_update_property, 0); in qdev_output_init()
1029 int qxl_create_monitors_object(struct qxl_device *qdev) in qxl_create_monitors_object() argument
1037 ret = qxl_gem_object_create(qdev, monitors_config_size, 0, in qxl_create_monitors_object()
1044 qdev->monitors_config_bo = gem_to_qxl_bo(gobj); in qxl_create_monitors_object()
1046 ret = qxl_bo_reserve(qdev->monitors_config_bo, false); in qxl_create_monitors_object()
1050 ret = qxl_bo_pin(qdev->monitors_config_bo, QXL_GEM_DOMAIN_VRAM, NULL); in qxl_create_monitors_object()
1052 qxl_bo_unreserve(qdev->monitors_config_bo); in qxl_create_monitors_object()
1056 qxl_bo_unreserve(qdev->monitors_config_bo); in qxl_create_monitors_object()
1058 qxl_bo_kmap(qdev->monitors_config_bo, NULL); in qxl_create_monitors_object()
1060 qdev->monitors_config = qdev->monitors_config_bo->kptr; in qxl_create_monitors_object()
1061 qdev->ram_header->monitors_config = in qxl_create_monitors_object()
1062 qxl_bo_physical_address(qdev, qdev->monitors_config_bo, 0); in qxl_create_monitors_object()
1064 memset(qdev->monitors_config, 0, monitors_config_size); in qxl_create_monitors_object()
1065 qdev->monitors_config->max_allowed = max_allowed; in qxl_create_monitors_object()
1069 int qxl_destroy_monitors_object(struct qxl_device *qdev) in qxl_destroy_monitors_object() argument
1073 qdev->monitors_config = NULL; in qxl_destroy_monitors_object()
1074 qdev->ram_header->monitors_config = 0; in qxl_destroy_monitors_object()
1076 qxl_bo_kunmap(qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1077 ret = qxl_bo_reserve(qdev->monitors_config_bo, false); in qxl_destroy_monitors_object()
1081 qxl_bo_unpin(qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1082 qxl_bo_unreserve(qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1084 qxl_bo_unref(&qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1088 int qxl_modeset_init(struct qxl_device *qdev) in qxl_modeset_init() argument
1093 drm_mode_config_init(qdev->ddev); in qxl_modeset_init()
1095 ret = qxl_create_monitors_object(qdev); in qxl_modeset_init()
1099 qdev->ddev->mode_config.funcs = (void *)&qxl_mode_funcs; in qxl_modeset_init()
1102 qdev->ddev->mode_config.min_width = 320; in qxl_modeset_init()
1103 qdev->ddev->mode_config.min_height = 200; in qxl_modeset_init()
1104 qdev->ddev->mode_config.max_width = 8192; in qxl_modeset_init()
1105 qdev->ddev->mode_config.max_height = 8192; in qxl_modeset_init()
1107 qdev->ddev->mode_config.fb_base = qdev->vram_base; in qxl_modeset_init()
1109 drm_mode_create_suggested_offset_properties(qdev->ddev); in qxl_modeset_init()
1110 qxl_mode_create_hotplug_mode_update_property(qdev); in qxl_modeset_init()
1113 qdev_crtc_init(qdev->ddev, i); in qxl_modeset_init()
1114 qdev_output_init(qdev->ddev, i); in qxl_modeset_init()
1117 qdev->mode_info.mode_config_initialized = true; in qxl_modeset_init()
1122 qxl_fbdev_init(qdev); in qxl_modeset_init()
1126 void qxl_modeset_fini(struct qxl_device *qdev) in qxl_modeset_fini() argument
1128 qxl_fbdev_fini(qdev); in qxl_modeset_fini()
1130 qxl_destroy_monitors_object(qdev); in qxl_modeset_fini()
1131 if (qdev->mode_info.mode_config_initialized) { in qxl_modeset_fini()
1132 drm_mode_config_cleanup(qdev->ddev); in qxl_modeset_fini()
1133 qdev->mode_info.mode_config_initialized = false; in qxl_modeset_fini()