Lines Matching refs:qdev

49 static int qxl_alloc_client_monitors_config(struct qxl_device *qdev,  in qxl_alloc_client_monitors_config()  argument
52 if (qdev->client_monitors_config && in qxl_alloc_client_monitors_config()
53 count > qdev->client_monitors_config->count) { in qxl_alloc_client_monitors_config()
54 kfree(qdev->client_monitors_config); in qxl_alloc_client_monitors_config()
55 qdev->client_monitors_config = NULL; in qxl_alloc_client_monitors_config()
57 if (!qdev->client_monitors_config) { in qxl_alloc_client_monitors_config()
58 qdev->client_monitors_config = kzalloc( in qxl_alloc_client_monitors_config()
59 struct_size(qdev->client_monitors_config, in qxl_alloc_client_monitors_config()
61 if (!qdev->client_monitors_config) in qxl_alloc_client_monitors_config()
64 qdev->client_monitors_config->count = count; in qxl_alloc_client_monitors_config()
75 static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev) in qxl_display_copy_rom_client_monitors_config() argument
82 num_monitors = qdev->rom->client_monitors_config.count; in qxl_display_copy_rom_client_monitors_config()
83 crc = crc32(0, (const uint8_t *)&qdev->rom->client_monitors_config, in qxl_display_copy_rom_client_monitors_config()
84 sizeof(qdev->rom->client_monitors_config)); in qxl_display_copy_rom_client_monitors_config()
85 if (crc != qdev->rom->client_monitors_config_crc) in qxl_display_copy_rom_client_monitors_config()
96 num_monitors = qdev->rom->client_monitors_config.count; in qxl_display_copy_rom_client_monitors_config()
98 if (qdev->client_monitors_config in qxl_display_copy_rom_client_monitors_config()
99 && (num_monitors != qdev->client_monitors_config->count)) { in qxl_display_copy_rom_client_monitors_config()
102 if (qxl_alloc_client_monitors_config(qdev, num_monitors)) { in qxl_display_copy_rom_client_monitors_config()
107 qdev->client_monitors_config->max_allowed = qxl_num_crtc; in qxl_display_copy_rom_client_monitors_config()
108 for (i = 0 ; i < qdev->client_monitors_config->count ; ++i) { in qxl_display_copy_rom_client_monitors_config()
110 &qdev->rom->client_monitors_config.heads[i]; in qxl_display_copy_rom_client_monitors_config()
112 &qdev->client_monitors_config->heads[i]; in qxl_display_copy_rom_client_monitors_config()
148 static void qxl_update_offset_props(struct qxl_device *qdev) in qxl_update_offset_props() argument
150 struct drm_device *dev = &qdev->ddev; in qxl_update_offset_props()
158 head = &qdev->client_monitors_config->heads[output->index]; in qxl_update_offset_props()
167 void qxl_display_read_client_monitors_config(struct qxl_device *qdev) in qxl_display_read_client_monitors_config() argument
169 struct drm_device *dev = &qdev->ddev; in qxl_display_read_client_monitors_config()
174 status = qxl_display_copy_rom_client_monitors_config(qdev); in qxl_display_read_client_monitors_config()
193 qxl_update_offset_props(qdev); in qxl_display_read_client_monitors_config()
202 static int qxl_check_mode(struct qxl_device *qdev, in qxl_check_mode() argument
213 if (size > qdev->vram_size) in qxl_check_mode()
218 static int qxl_check_framebuffer(struct qxl_device *qdev, in qxl_check_framebuffer() argument
221 return qxl_check_mode(qdev, bo->surf.width, bo->surf.height); in qxl_check_framebuffer()
230 struct qxl_device *qdev = to_qxl(dev); in qxl_add_mode() local
234 rc = qxl_check_mode(qdev, width, height); in qxl_add_mode()
254 struct qxl_device *qdev = to_qxl(dev); in qxl_add_monitors_config_modes() local
259 if (!qdev->monitors_config) in qxl_add_monitors_config_modes()
263 if (!qdev->client_monitors_config) in qxl_add_monitors_config_modes()
265 if (h >= qdev->client_monitors_config->count) in qxl_add_monitors_config_modes()
268 head = &qdev->client_monitors_config->heads[h]; in qxl_add_monitors_config_modes()
295 static void qxl_send_monitors_config(struct qxl_device *qdev) in qxl_send_monitors_config() argument
299 BUG_ON(!qdev->ram_header->monitors_config); in qxl_send_monitors_config()
301 if (qdev->monitors_config->count == 0) in qxl_send_monitors_config()
304 for (i = 0 ; i < qdev->monitors_config->count ; ++i) { in qxl_send_monitors_config()
305 struct qxl_head *head = &qdev->monitors_config->heads[i]; in qxl_send_monitors_config()
315 qxl_io_monitors_config(qdev); in qxl_send_monitors_config()
322 struct qxl_device *qdev = to_qxl(dev); in qxl_crtc_update_monitors_config() local
327 if (!qdev->primary_bo) { in qxl_crtc_update_monitors_config()
332 if (!qdev->monitors_config || qxl_num_crtc <= i) in qxl_crtc_update_monitors_config()
338 oldcount = qdev->monitors_config->count; in qxl_crtc_update_monitors_config()
346 if (qdev->monitors_config->count < i + 1) in qxl_crtc_update_monitors_config()
347 qdev->monitors_config->count = i + 1; in qxl_crtc_update_monitors_config()
348 if (qdev->primary_bo == qdev->dumb_shadow_bo) in qxl_crtc_update_monitors_config()
349 head.x += qdev->dumb_heads[i].x; in qxl_crtc_update_monitors_config()
355 if (qdev->monitors_config->count == i + 1) in qxl_crtc_update_monitors_config()
356 qdev->monitors_config->count = i; in qxl_crtc_update_monitors_config()
362 if (head.width == qdev->monitors_config->heads[i].width && in qxl_crtc_update_monitors_config()
363 head.height == qdev->monitors_config->heads[i].height && in qxl_crtc_update_monitors_config()
364 head.x == qdev->monitors_config->heads[i].x && in qxl_crtc_update_monitors_config()
365 head.y == qdev->monitors_config->heads[i].y && in qxl_crtc_update_monitors_config()
366 oldcount == qdev->monitors_config->count) in qxl_crtc_update_monitors_config()
372 if (oldcount != qdev->monitors_config->count) in qxl_crtc_update_monitors_config()
374 oldcount, qdev->monitors_config->count, in qxl_crtc_update_monitors_config()
377 qdev->monitors_config->heads[i] = head; in qxl_crtc_update_monitors_config()
378 qdev->monitors_config->max_allowed = qxl_num_crtc; in qxl_crtc_update_monitors_config()
379 qxl_send_monitors_config(qdev); in qxl_crtc_update_monitors_config()
413 struct qxl_device *qdev = to_qxl(fb->dev); in qxl_framebuffer_surface_dirty() local
439 qxl_draw_dirty_fb(qdev, fb, qobj, flags, color, in qxl_framebuffer_surface_dirty()
477 struct qxl_device *qdev = to_qxl(plane->dev); in qxl_primary_atomic_check() local
485 return qxl_check_framebuffer(qdev, bo); in qxl_primary_atomic_check()
488 static int qxl_primary_apply_cursor(struct qxl_device *qdev, in qxl_primary_apply_cursor() argument
499 ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), in qxl_primary_apply_cursor()
513 cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); in qxl_primary_apply_cursor()
518 cmd->u.set.shape = qxl_bo_physical_address(qdev, qcrtc->cursor_bo, 0); in qxl_primary_apply_cursor()
521 qxl_release_unmap(qdev, release, &cmd->release_info); in qxl_primary_apply_cursor()
524 qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); in qxl_primary_apply_cursor()
529 qxl_release_free(qdev, release); in qxl_primary_apply_cursor()
533 static int qxl_primary_move_cursor(struct qxl_device *qdev, in qxl_primary_move_cursor() argument
544 ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), in qxl_primary_move_cursor()
552 qxl_release_free(qdev, release); in qxl_primary_move_cursor()
556 cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); in qxl_primary_move_cursor()
560 qxl_release_unmap(qdev, release, &cmd->release_info); in qxl_primary_move_cursor()
563 qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); in qxl_primary_move_cursor()
567 static struct qxl_bo *qxl_create_cursor(struct qxl_device *qdev, in qxl_create_cursor() argument
581 ret = qxl_bo_create(qdev, sizeof(struct qxl_cursor) + size, in qxl_create_cursor()
644 struct qxl_device *qdev = to_qxl(plane->dev); in qxl_primary_atomic_update() local
658 if (qdev->primary_bo) in qxl_primary_atomic_update()
659 qxl_io_destroy_primary(qdev); in qxl_primary_atomic_update()
660 qxl_io_create_primary(qdev, primary); in qxl_primary_atomic_update()
661 qxl_primary_apply_cursor(qdev, plane->state); in qxl_primary_atomic_update()
666 qdev->dumb_heads[new_state->crtc->index].x; in qxl_primary_atomic_update()
668 qxl_draw_dirty_fb(qdev, new_state->fb, bo, 0, 0, &norect, 1, 1, in qxl_primary_atomic_update()
677 struct qxl_device *qdev = to_qxl(plane->dev); in qxl_primary_atomic_disable() local
685 qxl_io_destroy_primary(qdev); in qxl_primary_atomic_disable()
696 struct qxl_device *qdev = to_qxl(plane->dev); in qxl_cursor_atomic_update() local
700 qxl_primary_apply_cursor(qdev, new_state); in qxl_cursor_atomic_update()
702 qxl_primary_move_cursor(qdev, new_state); in qxl_cursor_atomic_update()
711 struct qxl_device *qdev = to_qxl(plane->dev); in qxl_cursor_atomic_disable() local
717 ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), in qxl_cursor_atomic_disable()
725 qxl_release_free(qdev, release); in qxl_cursor_atomic_disable()
729 cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); in qxl_cursor_atomic_disable()
731 qxl_release_unmap(qdev, release, &cmd->release_info); in qxl_cursor_atomic_disable()
734 qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); in qxl_cursor_atomic_disable()
741 static void qxl_update_dumb_head(struct qxl_device *qdev, in qxl_update_dumb_head() argument
746 if (index >= qdev->monitors_config->max_allowed) in qxl_update_dumb_head()
757 if (qdev->dumb_heads[index].width == width && in qxl_update_dumb_head()
758 qdev->dumb_heads[index].height == height) in qxl_update_dumb_head()
762 qdev->dumb_heads[index].width, in qxl_update_dumb_head()
763 qdev->dumb_heads[index].height, in qxl_update_dumb_head()
765 qdev->dumb_heads[index].width = width; in qxl_update_dumb_head()
766 qdev->dumb_heads[index].height = height; in qxl_update_dumb_head()
769 static void qxl_calc_dumb_shadow(struct qxl_device *qdev, in qxl_calc_dumb_shadow() argument
776 for (i = 0; i < qdev->monitors_config->max_allowed; i++) { in qxl_calc_dumb_shadow()
777 head = qdev->dumb_heads + i; in qxl_calc_dumb_shadow()
790 if (!qdev->dumb_shadow_bo || in qxl_calc_dumb_shadow()
791 qdev->dumb_shadow_bo->surf.width != surf->width || in qxl_calc_dumb_shadow()
792 qdev->dumb_shadow_bo->surf.height != surf->height) in qxl_calc_dumb_shadow()
796 static void qxl_prepare_shadow(struct qxl_device *qdev, struct qxl_bo *user_bo, in qxl_prepare_shadow() argument
801 qxl_update_dumb_head(qdev, crtc_index, in qxl_prepare_shadow()
803 qxl_calc_dumb_shadow(qdev, &surf); in qxl_prepare_shadow()
804 if (!qdev->dumb_shadow_bo || in qxl_prepare_shadow()
805 qdev->dumb_shadow_bo->surf.width != surf.width || in qxl_prepare_shadow()
806 qdev->dumb_shadow_bo->surf.height != surf.height) { in qxl_prepare_shadow()
807 if (qdev->dumb_shadow_bo) { in qxl_prepare_shadow()
808 qxl_bo_unpin(qdev->dumb_shadow_bo); in qxl_prepare_shadow()
810 (&qdev->dumb_shadow_bo->tbo.base); in qxl_prepare_shadow()
811 qdev->dumb_shadow_bo = NULL; in qxl_prepare_shadow()
813 qxl_bo_create(qdev, surf.height * surf.stride, in qxl_prepare_shadow()
815 &surf, &qdev->dumb_shadow_bo); in qxl_prepare_shadow()
817 if (user_bo->shadow != qdev->dumb_shadow_bo) { in qxl_prepare_shadow()
824 drm_gem_object_get(&qdev->dumb_shadow_bo->tbo.base); in qxl_prepare_shadow()
825 user_bo->shadow = qdev->dumb_shadow_bo; in qxl_prepare_shadow()
833 struct qxl_device *qdev = to_qxl(plane->dev); in qxl_plane_prepare_fb() local
846 qxl_prepare_shadow(qdev, user_bo, new_state->crtc->index); in qxl_plane_prepare_fb()
854 qcrtc->cursor_bo = qxl_create_cursor(qdev, user_bo, in qxl_plane_prepare_fb()
934 static struct drm_plane *qxl_create_plane(struct qxl_device *qdev, in qxl_create_plane() argument
963 err = drm_universal_plane_init(&qdev->ddev, plane, possible_crtcs, in qxl_create_plane()
982 struct qxl_device *qdev = to_qxl(dev); in qdev_crtc_init() local
989 primary = qxl_create_plane(qdev, 1 << crtc_id, DRM_PLANE_TYPE_PRIMARY); in qdev_crtc_init()
995 cursor = qxl_create_plane(qdev, 1 << crtc_id, DRM_PLANE_TYPE_CURSOR); in qdev_crtc_init()
1024 struct qxl_device *qdev = to_qxl(dev); in qxl_conn_get_modes() local
1030 if (qdev->client_monitors_config) { in qxl_conn_get_modes()
1032 head = &qdev->client_monitors_config->heads[output->index]; in qxl_conn_get_modes()
1050 struct qxl_device *qdev = to_qxl(ddev); in qxl_conn_mode_valid() local
1052 if (qxl_check_mode(qdev, mode->hdisplay, mode->vdisplay) != 0) in qxl_conn_mode_valid()
1080 struct qxl_device *qdev = to_qxl(ddev); in qxl_conn_detect() local
1084 if (!qdev->client_monitors_config) { in qxl_conn_detect()
1088 connected = qdev->client_monitors_config->count > output->index && in qxl_conn_detect()
1089 qxl_head_enabled(&qdev->client_monitors_config->heads[output->index]); in qxl_conn_detect()
1116 static int qxl_mode_create_hotplug_mode_update_property(struct qxl_device *qdev) in qxl_mode_create_hotplug_mode_update_property() argument
1118 if (qdev->hotplug_mode_update_property) in qxl_mode_create_hotplug_mode_update_property()
1121 qdev->hotplug_mode_update_property = in qxl_mode_create_hotplug_mode_update_property()
1122 drm_property_create_range(&qdev->ddev, DRM_MODE_PROP_IMMUTABLE, in qxl_mode_create_hotplug_mode_update_property()
1130 struct qxl_device *qdev = to_qxl(dev); in qdev_output_init() local
1163 qdev->hotplug_mode_update_property, 0); in qdev_output_init()
1192 int qxl_create_monitors_object(struct qxl_device *qdev) in qxl_create_monitors_object() argument
1200 ret = qxl_gem_object_create(qdev, monitors_config_size, 0, in qxl_create_monitors_object()
1207 qdev->monitors_config_bo = gem_to_qxl_bo(gobj); in qxl_create_monitors_object()
1209 ret = qxl_bo_pin_and_vmap(qdev->monitors_config_bo, &map); in qxl_create_monitors_object()
1213 qdev->monitors_config = qdev->monitors_config_bo->kptr; in qxl_create_monitors_object()
1214 qdev->ram_header->monitors_config = in qxl_create_monitors_object()
1215 qxl_bo_physical_address(qdev, qdev->monitors_config_bo, 0); in qxl_create_monitors_object()
1217 memset(qdev->monitors_config, 0, monitors_config_size); in qxl_create_monitors_object()
1218 qdev->dumb_heads = kcalloc(qxl_num_crtc, sizeof(qdev->dumb_heads[0]), in qxl_create_monitors_object()
1220 if (!qdev->dumb_heads) { in qxl_create_monitors_object()
1221 qxl_destroy_monitors_object(qdev); in qxl_create_monitors_object()
1227 int qxl_destroy_monitors_object(struct qxl_device *qdev) in qxl_destroy_monitors_object() argument
1231 if (!qdev->monitors_config_bo) in qxl_destroy_monitors_object()
1234 kfree(qdev->dumb_heads); in qxl_destroy_monitors_object()
1235 qdev->dumb_heads = NULL; in qxl_destroy_monitors_object()
1237 qdev->monitors_config = NULL; in qxl_destroy_monitors_object()
1238 qdev->ram_header->monitors_config = 0; in qxl_destroy_monitors_object()
1240 ret = qxl_bo_vunmap_and_unpin(qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1244 qxl_bo_unref(&qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1248 int qxl_modeset_init(struct qxl_device *qdev) in qxl_modeset_init() argument
1253 ret = drmm_mode_config_init(&qdev->ddev); in qxl_modeset_init()
1257 ret = qxl_create_monitors_object(qdev); in qxl_modeset_init()
1261 qdev->ddev.mode_config.funcs = (void *)&qxl_mode_funcs; in qxl_modeset_init()
1264 qdev->ddev.mode_config.min_width = 0; in qxl_modeset_init()
1265 qdev->ddev.mode_config.min_height = 0; in qxl_modeset_init()
1266 qdev->ddev.mode_config.max_width = 8192; in qxl_modeset_init()
1267 qdev->ddev.mode_config.max_height = 8192; in qxl_modeset_init()
1269 drm_mode_create_suggested_offset_properties(&qdev->ddev); in qxl_modeset_init()
1270 qxl_mode_create_hotplug_mode_update_property(qdev); in qxl_modeset_init()
1273 qdev_crtc_init(&qdev->ddev, i); in qxl_modeset_init()
1274 qdev_output_init(&qdev->ddev, i); in qxl_modeset_init()
1277 qxl_display_read_client_monitors_config(qdev); in qxl_modeset_init()
1279 drm_mode_config_reset(&qdev->ddev); in qxl_modeset_init()
1283 void qxl_modeset_fini(struct qxl_device *qdev) in qxl_modeset_fini() argument
1285 if (qdev->dumb_shadow_bo) { in qxl_modeset_fini()
1286 qxl_bo_unpin(qdev->dumb_shadow_bo); in qxl_modeset_fini()
1287 drm_gem_object_put(&qdev->dumb_shadow_bo->tbo.base); in qxl_modeset_fini()
1288 qdev->dumb_shadow_bo = NULL; in qxl_modeset_fini()
1290 qxl_destroy_monitors_object(qdev); in qxl_modeset_fini()