• Home
  • Raw
  • Download

Lines Matching refs:qdev

45 static int qxl_alloc_client_monitors_config(struct qxl_device *qdev,  in qxl_alloc_client_monitors_config()  argument
48 if (qdev->client_monitors_config && in qxl_alloc_client_monitors_config()
49 count > qdev->client_monitors_config->count) { in qxl_alloc_client_monitors_config()
50 kfree(qdev->client_monitors_config); in qxl_alloc_client_monitors_config()
51 qdev->client_monitors_config = NULL; in qxl_alloc_client_monitors_config()
53 if (!qdev->client_monitors_config) { in qxl_alloc_client_monitors_config()
54 qdev->client_monitors_config = kzalloc( in qxl_alloc_client_monitors_config()
55 struct_size(qdev->client_monitors_config, in qxl_alloc_client_monitors_config()
57 if (!qdev->client_monitors_config) in qxl_alloc_client_monitors_config()
60 qdev->client_monitors_config->count = count; in qxl_alloc_client_monitors_config()
71 static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev) in qxl_display_copy_rom_client_monitors_config() argument
78 num_monitors = qdev->rom->client_monitors_config.count; in qxl_display_copy_rom_client_monitors_config()
79 crc = crc32(0, (const uint8_t *)&qdev->rom->client_monitors_config, in qxl_display_copy_rom_client_monitors_config()
80 sizeof(qdev->rom->client_monitors_config)); in qxl_display_copy_rom_client_monitors_config()
81 if (crc != qdev->rom->client_monitors_config_crc) in qxl_display_copy_rom_client_monitors_config()
92 num_monitors = qdev->rom->client_monitors_config.count; in qxl_display_copy_rom_client_monitors_config()
94 if (qdev->client_monitors_config in qxl_display_copy_rom_client_monitors_config()
95 && (num_monitors != qdev->client_monitors_config->count)) { in qxl_display_copy_rom_client_monitors_config()
98 if (qxl_alloc_client_monitors_config(qdev, num_monitors)) { in qxl_display_copy_rom_client_monitors_config()
103 qdev->client_monitors_config->max_allowed = qxl_num_crtc; in qxl_display_copy_rom_client_monitors_config()
104 for (i = 0 ; i < qdev->client_monitors_config->count ; ++i) { in qxl_display_copy_rom_client_monitors_config()
106 &qdev->rom->client_monitors_config.heads[i]; in qxl_display_copy_rom_client_monitors_config()
108 &qdev->client_monitors_config->heads[i]; in qxl_display_copy_rom_client_monitors_config()
144 static void qxl_update_offset_props(struct qxl_device *qdev) in qxl_update_offset_props() argument
146 struct drm_device *dev = &qdev->ddev; in qxl_update_offset_props()
154 head = &qdev->client_monitors_config->heads[output->index]; in qxl_update_offset_props()
163 void qxl_display_read_client_monitors_config(struct qxl_device *qdev) in qxl_display_read_client_monitors_config() argument
165 struct drm_device *dev = &qdev->ddev; in qxl_display_read_client_monitors_config()
170 status = qxl_display_copy_rom_client_monitors_config(qdev); in qxl_display_read_client_monitors_config()
189 qxl_update_offset_props(qdev); in qxl_display_read_client_monitors_config()
198 static int qxl_check_mode(struct qxl_device *qdev, in qxl_check_mode() argument
209 if (size > qdev->vram_size) in qxl_check_mode()
214 static int qxl_check_framebuffer(struct qxl_device *qdev, in qxl_check_framebuffer() argument
217 return qxl_check_mode(qdev, bo->surf.width, bo->surf.height); in qxl_check_framebuffer()
226 struct qxl_device *qdev = to_qxl(dev); in qxl_add_mode() local
230 rc = qxl_check_mode(qdev, width, height); in qxl_add_mode()
247 struct qxl_device *qdev = to_qxl(dev); in qxl_add_monitors_config_modes() local
252 if (!qdev->monitors_config) in qxl_add_monitors_config_modes()
256 if (!qdev->client_monitors_config) in qxl_add_monitors_config_modes()
258 if (h >= qdev->client_monitors_config->count) in qxl_add_monitors_config_modes()
261 head = &qdev->client_monitors_config->heads[h]; in qxl_add_monitors_config_modes()
288 static void qxl_send_monitors_config(struct qxl_device *qdev) in qxl_send_monitors_config() argument
292 BUG_ON(!qdev->ram_header->monitors_config); in qxl_send_monitors_config()
294 if (qdev->monitors_config->count == 0) in qxl_send_monitors_config()
297 for (i = 0 ; i < qdev->monitors_config->count ; ++i) { in qxl_send_monitors_config()
298 struct qxl_head *head = &qdev->monitors_config->heads[i]; in qxl_send_monitors_config()
308 qxl_io_monitors_config(qdev); in qxl_send_monitors_config()
315 struct qxl_device *qdev = to_qxl(dev); in qxl_crtc_update_monitors_config() local
320 if (!qdev->primary_bo) { in qxl_crtc_update_monitors_config()
325 if (!qdev->monitors_config || qxl_num_crtc <= i) in qxl_crtc_update_monitors_config()
331 oldcount = qdev->monitors_config->count; in qxl_crtc_update_monitors_config()
339 if (qdev->monitors_config->count < i + 1) in qxl_crtc_update_monitors_config()
340 qdev->monitors_config->count = i + 1; in qxl_crtc_update_monitors_config()
341 if (qdev->primary_bo == qdev->dumb_shadow_bo) in qxl_crtc_update_monitors_config()
342 head.x += qdev->dumb_heads[i].x; in qxl_crtc_update_monitors_config()
348 if (qdev->monitors_config->count == i + 1) in qxl_crtc_update_monitors_config()
349 qdev->monitors_config->count = i; in qxl_crtc_update_monitors_config()
355 if (head.width == qdev->monitors_config->heads[i].width && in qxl_crtc_update_monitors_config()
356 head.height == qdev->monitors_config->heads[i].height && in qxl_crtc_update_monitors_config()
357 head.x == qdev->monitors_config->heads[i].x && in qxl_crtc_update_monitors_config()
358 head.y == qdev->monitors_config->heads[i].y && in qxl_crtc_update_monitors_config()
359 oldcount == qdev->monitors_config->count) in qxl_crtc_update_monitors_config()
365 if (oldcount != qdev->monitors_config->count) in qxl_crtc_update_monitors_config()
367 oldcount, qdev->monitors_config->count, in qxl_crtc_update_monitors_config()
370 qdev->monitors_config->heads[i] = head; in qxl_crtc_update_monitors_config()
371 qdev->monitors_config->max_allowed = qxl_num_crtc; in qxl_crtc_update_monitors_config()
372 qxl_send_monitors_config(qdev); in qxl_crtc_update_monitors_config()
406 struct qxl_device *qdev = to_qxl(fb->dev); in qxl_framebuffer_surface_dirty() local
432 qxl_draw_dirty_fb(qdev, fb, qobj, flags, color, in qxl_framebuffer_surface_dirty()
468 struct qxl_device *qdev = to_qxl(plane->dev); in qxl_primary_atomic_check() local
476 return qxl_check_framebuffer(qdev, bo); in qxl_primary_atomic_check()
482 struct qxl_device *qdev = to_qxl(dev); in qxl_primary_apply_cursor() local
492 ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), in qxl_primary_apply_cursor()
506 cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); in qxl_primary_apply_cursor()
511 cmd->u.set.shape = qxl_bo_physical_address(qdev, qcrtc->cursor_bo, 0); in qxl_primary_apply_cursor()
514 qxl_release_unmap(qdev, release, &cmd->release_info); in qxl_primary_apply_cursor()
517 qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); in qxl_primary_apply_cursor()
522 qxl_release_free(qdev, release); in qxl_primary_apply_cursor()
529 struct qxl_device *qdev = to_qxl(plane->dev); in qxl_primary_atomic_update() local
543 if (qdev->primary_bo) in qxl_primary_atomic_update()
544 qxl_io_destroy_primary(qdev); in qxl_primary_atomic_update()
545 qxl_io_create_primary(qdev, primary); in qxl_primary_atomic_update()
551 qdev->dumb_heads[plane->state->crtc->index].x; in qxl_primary_atomic_update()
553 qxl_draw_dirty_fb(qdev, plane->state->fb, bo, 0, 0, &norect, 1, 1, in qxl_primary_atomic_update()
560 struct qxl_device *qdev = to_qxl(plane->dev); in qxl_primary_atomic_disable() local
566 qxl_io_destroy_primary(qdev); in qxl_primary_atomic_disable()
576 struct qxl_device *qdev = to_qxl(dev); in qxl_cursor_atomic_update() local
588 ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), in qxl_cursor_atomic_update()
603 ret = qxl_alloc_bo_reserved(qdev, release, in qxl_cursor_atomic_update()
635 cmd = (struct qxl_cursor_cmd *) qxl_release_map(qdev, release); in qxl_cursor_atomic_update()
637 cmd->u.set.shape = qxl_bo_physical_address(qdev, in qxl_cursor_atomic_update()
650 cmd = (struct qxl_cursor_cmd *) qxl_release_map(qdev, release); in qxl_cursor_atomic_update()
657 qxl_release_unmap(qdev, release, &cmd->release_info); in qxl_cursor_atomic_update()
659 qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); in qxl_cursor_atomic_update()
677 qxl_release_free(qdev, release); in qxl_cursor_atomic_update()
685 struct qxl_device *qdev = to_qxl(plane->dev); in qxl_cursor_atomic_disable() local
690 ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), in qxl_cursor_atomic_disable()
698 qxl_release_free(qdev, release); in qxl_cursor_atomic_disable()
702 cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); in qxl_cursor_atomic_disable()
704 qxl_release_unmap(qdev, release, &cmd->release_info); in qxl_cursor_atomic_disable()
707 qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); in qxl_cursor_atomic_disable()
710 static void qxl_update_dumb_head(struct qxl_device *qdev, in qxl_update_dumb_head() argument
715 if (index >= qdev->monitors_config->max_allowed) in qxl_update_dumb_head()
726 if (qdev->dumb_heads[index].width == width && in qxl_update_dumb_head()
727 qdev->dumb_heads[index].height == height) in qxl_update_dumb_head()
731 qdev->dumb_heads[index].width, in qxl_update_dumb_head()
732 qdev->dumb_heads[index].height, in qxl_update_dumb_head()
734 qdev->dumb_heads[index].width = width; in qxl_update_dumb_head()
735 qdev->dumb_heads[index].height = height; in qxl_update_dumb_head()
738 static void qxl_calc_dumb_shadow(struct qxl_device *qdev, in qxl_calc_dumb_shadow() argument
745 for (i = 0; i < qdev->monitors_config->max_allowed; i++) { in qxl_calc_dumb_shadow()
746 head = qdev->dumb_heads + i; in qxl_calc_dumb_shadow()
759 if (!qdev->dumb_shadow_bo || in qxl_calc_dumb_shadow()
760 qdev->dumb_shadow_bo->surf.width != surf->width || in qxl_calc_dumb_shadow()
761 qdev->dumb_shadow_bo->surf.height != surf->height) in qxl_calc_dumb_shadow()
768 struct qxl_device *qdev = to_qxl(plane->dev); in qxl_plane_prepare_fb() local
782 qxl_update_dumb_head(qdev, new_state->crtc->index, in qxl_plane_prepare_fb()
784 qxl_calc_dumb_shadow(qdev, &surf); in qxl_plane_prepare_fb()
785 if (!qdev->dumb_shadow_bo || in qxl_plane_prepare_fb()
786 qdev->dumb_shadow_bo->surf.width != surf.width || in qxl_plane_prepare_fb()
787 qdev->dumb_shadow_bo->surf.height != surf.height) { in qxl_plane_prepare_fb()
788 if (qdev->dumb_shadow_bo) { in qxl_plane_prepare_fb()
790 (&qdev->dumb_shadow_bo->tbo.base); in qxl_plane_prepare_fb()
791 qdev->dumb_shadow_bo = NULL; in qxl_plane_prepare_fb()
793 qxl_bo_create(qdev, surf.height * surf.stride, in qxl_plane_prepare_fb()
795 &surf, &qdev->dumb_shadow_bo); in qxl_plane_prepare_fb()
797 if (user_bo->shadow != qdev->dumb_shadow_bo) { in qxl_plane_prepare_fb()
803 drm_gem_object_get(&qdev->dumb_shadow_bo->tbo.base); in qxl_plane_prepare_fb()
804 user_bo->shadow = qdev->dumb_shadow_bo; in qxl_plane_prepare_fb()
881 static struct drm_plane *qxl_create_plane(struct qxl_device *qdev, in qxl_create_plane() argument
910 err = drm_universal_plane_init(&qdev->ddev, plane, possible_crtcs, in qxl_create_plane()
929 struct qxl_device *qdev = to_qxl(dev); in qdev_crtc_init() local
936 primary = qxl_create_plane(qdev, 1 << crtc_id, DRM_PLANE_TYPE_PRIMARY); in qdev_crtc_init()
942 cursor = qxl_create_plane(qdev, 1 << crtc_id, DRM_PLANE_TYPE_CURSOR); in qdev_crtc_init()
971 struct qxl_device *qdev = to_qxl(dev); in qxl_conn_get_modes() local
977 if (qdev->client_monitors_config) { in qxl_conn_get_modes()
979 head = &qdev->client_monitors_config->heads[output->index]; in qxl_conn_get_modes()
997 struct qxl_device *qdev = to_qxl(ddev); in qxl_conn_mode_valid() local
999 if (qxl_check_mode(qdev, mode->hdisplay, mode->vdisplay) != 0) in qxl_conn_mode_valid()
1027 struct qxl_device *qdev = to_qxl(ddev); in qxl_conn_detect() local
1031 if (!qdev->client_monitors_config) { in qxl_conn_detect()
1035 connected = qdev->client_monitors_config->count > output->index && in qxl_conn_detect()
1036 qxl_head_enabled(&qdev->client_monitors_config->heads[output->index]); in qxl_conn_detect()
1063 static int qxl_mode_create_hotplug_mode_update_property(struct qxl_device *qdev) in qxl_mode_create_hotplug_mode_update_property() argument
1065 if (qdev->hotplug_mode_update_property) in qxl_mode_create_hotplug_mode_update_property()
1068 qdev->hotplug_mode_update_property = in qxl_mode_create_hotplug_mode_update_property()
1069 drm_property_create_range(&qdev->ddev, DRM_MODE_PROP_IMMUTABLE, in qxl_mode_create_hotplug_mode_update_property()
1077 struct qxl_device *qdev = to_qxl(dev); in qdev_output_init() local
1110 qdev->hotplug_mode_update_property, 0); in qdev_output_init()
1138 int qxl_create_monitors_object(struct qxl_device *qdev) in qxl_create_monitors_object() argument
1145 ret = qxl_gem_object_create(qdev, monitors_config_size, 0, in qxl_create_monitors_object()
1152 qdev->monitors_config_bo = gem_to_qxl_bo(gobj); in qxl_create_monitors_object()
1154 ret = qxl_bo_pin(qdev->monitors_config_bo); in qxl_create_monitors_object()
1158 qxl_bo_kmap(qdev->monitors_config_bo, NULL); in qxl_create_monitors_object()
1160 qdev->monitors_config = qdev->monitors_config_bo->kptr; in qxl_create_monitors_object()
1161 qdev->ram_header->monitors_config = in qxl_create_monitors_object()
1162 qxl_bo_physical_address(qdev, qdev->monitors_config_bo, 0); in qxl_create_monitors_object()
1164 memset(qdev->monitors_config, 0, monitors_config_size); in qxl_create_monitors_object()
1165 qdev->dumb_heads = kcalloc(qxl_num_crtc, sizeof(qdev->dumb_heads[0]), in qxl_create_monitors_object()
1167 if (!qdev->dumb_heads) { in qxl_create_monitors_object()
1168 qxl_destroy_monitors_object(qdev); in qxl_create_monitors_object()
1174 int qxl_destroy_monitors_object(struct qxl_device *qdev) in qxl_destroy_monitors_object() argument
1178 qdev->monitors_config = NULL; in qxl_destroy_monitors_object()
1179 qdev->ram_header->monitors_config = 0; in qxl_destroy_monitors_object()
1181 qxl_bo_kunmap(qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1182 ret = qxl_bo_unpin(qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1186 qxl_bo_unref(&qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1190 int qxl_modeset_init(struct qxl_device *qdev) in qxl_modeset_init() argument
1195 drm_mode_config_init(&qdev->ddev); in qxl_modeset_init()
1197 ret = qxl_create_monitors_object(qdev); in qxl_modeset_init()
1201 qdev->ddev.mode_config.funcs = (void *)&qxl_mode_funcs; in qxl_modeset_init()
1204 qdev->ddev.mode_config.min_width = 0; in qxl_modeset_init()
1205 qdev->ddev.mode_config.min_height = 0; in qxl_modeset_init()
1206 qdev->ddev.mode_config.max_width = 8192; in qxl_modeset_init()
1207 qdev->ddev.mode_config.max_height = 8192; in qxl_modeset_init()
1209 qdev->ddev.mode_config.fb_base = qdev->vram_base; in qxl_modeset_init()
1211 drm_mode_create_suggested_offset_properties(&qdev->ddev); in qxl_modeset_init()
1212 qxl_mode_create_hotplug_mode_update_property(qdev); in qxl_modeset_init()
1215 qdev_crtc_init(&qdev->ddev, i); in qxl_modeset_init()
1216 qdev_output_init(&qdev->ddev, i); in qxl_modeset_init()
1219 qxl_display_read_client_monitors_config(qdev); in qxl_modeset_init()
1221 drm_mode_config_reset(&qdev->ddev); in qxl_modeset_init()
1225 void qxl_modeset_fini(struct qxl_device *qdev) in qxl_modeset_fini() argument
1227 if (qdev->dumb_shadow_bo) { in qxl_modeset_fini()
1228 drm_gem_object_put(&qdev->dumb_shadow_bo->tbo.base); in qxl_modeset_fini()
1229 qdev->dumb_shadow_bo = NULL; in qxl_modeset_fini()
1231 qxl_destroy_monitors_object(qdev); in qxl_modeset_fini()
1232 drm_mode_config_cleanup(&qdev->ddev); in qxl_modeset_fini()