Lines Matching refs:qdev
40 static void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count) in qxl_alloc_client_monitors_config() argument
42 if (qdev->client_monitors_config && in qxl_alloc_client_monitors_config()
43 count > qdev->client_monitors_config->count) { in qxl_alloc_client_monitors_config()
44 kfree(qdev->client_monitors_config); in qxl_alloc_client_monitors_config()
45 qdev->client_monitors_config = NULL; in qxl_alloc_client_monitors_config()
47 if (!qdev->client_monitors_config) { in qxl_alloc_client_monitors_config()
48 qdev->client_monitors_config = kzalloc( in qxl_alloc_client_monitors_config()
51 if (!qdev->client_monitors_config) { in qxl_alloc_client_monitors_config()
52 qxl_io_log(qdev, in qxl_alloc_client_monitors_config()
58 qdev->client_monitors_config->count = count; in qxl_alloc_client_monitors_config()
67 static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev) in qxl_display_copy_rom_client_monitors_config() argument
74 num_monitors = qdev->rom->client_monitors_config.count; in qxl_display_copy_rom_client_monitors_config()
75 crc = crc32(0, (const uint8_t *)&qdev->rom->client_monitors_config, in qxl_display_copy_rom_client_monitors_config()
76 sizeof(qdev->rom->client_monitors_config)); in qxl_display_copy_rom_client_monitors_config()
77 if (crc != qdev->rom->client_monitors_config_crc) { in qxl_display_copy_rom_client_monitors_config()
78 qxl_io_log(qdev, "crc mismatch: have %X (%zd) != %X\n", crc, in qxl_display_copy_rom_client_monitors_config()
79 sizeof(qdev->rom->client_monitors_config), in qxl_display_copy_rom_client_monitors_config()
80 qdev->rom->client_monitors_config_crc); in qxl_display_copy_rom_client_monitors_config()
87 if (num_monitors > qdev->monitors_config->max_allowed) { in qxl_display_copy_rom_client_monitors_config()
89 qdev->monitors_config->max_allowed, num_monitors); in qxl_display_copy_rom_client_monitors_config()
90 num_monitors = qdev->monitors_config->max_allowed; 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 qxl_alloc_client_monitors_config(qdev, num_monitors); in qxl_display_copy_rom_client_monitors_config()
100 qdev->client_monitors_config->max_allowed = in qxl_display_copy_rom_client_monitors_config()
101 qdev->monitors_config->max_allowed; in qxl_display_copy_rom_client_monitors_config()
102 for (i = 0 ; i < qdev->client_monitors_config->count ; ++i) { in qxl_display_copy_rom_client_monitors_config()
104 &qdev->rom->client_monitors_config.heads[i]; in qxl_display_copy_rom_client_monitors_config()
106 &qdev->client_monitors_config->heads[i]; in qxl_display_copy_rom_client_monitors_config()
142 static void qxl_update_offset_props(struct qxl_device *qdev) in qxl_update_offset_props() argument
144 struct drm_device *dev = &qdev->ddev; in qxl_update_offset_props()
152 head = &qdev->client_monitors_config->heads[output->index]; in qxl_update_offset_props()
161 void qxl_display_read_client_monitors_config(struct qxl_device *qdev) in qxl_display_read_client_monitors_config() argument
163 struct drm_device *dev = &qdev->ddev; in qxl_display_read_client_monitors_config()
167 status = qxl_display_copy_rom_client_monitors_config(qdev); in qxl_display_read_client_monitors_config()
173 qxl_io_log(qdev, "config: bad crc\n"); in qxl_display_read_client_monitors_config()
178 qxl_io_log(qdev, "config: unchanged\n"); in qxl_display_read_client_monitors_config()
184 qxl_update_offset_props(qdev); in qxl_display_read_client_monitors_config()
198 struct qxl_device *qdev = dev->dev_private; in qxl_add_monitors_config_modes() local
204 if (!qdev->monitors_config) in qxl_add_monitors_config_modes()
206 if (h >= qdev->monitors_config->max_allowed) in qxl_add_monitors_config_modes()
208 if (!qdev->client_monitors_config) in qxl_add_monitors_config_modes()
210 if (h >= qdev->client_monitors_config->count) in qxl_add_monitors_config_modes()
213 head = &qdev->client_monitors_config->heads[h]; in qxl_add_monitors_config_modes()
226 qdev->monitors_config_width = mode->hdisplay; in qxl_add_monitors_config_modes()
227 qdev->monitors_config_height = mode->vdisplay; in qxl_add_monitors_config_modes()
325 struct qxl_device *qdev = qxl_fb->base.dev->dev_private; in qxl_framebuffer_surface_dirty() local
350 qxl_draw_dirty_fb(qdev, qxl_fb, qobj, flags, color, in qxl_framebuffer_surface_dirty()
389 struct qxl_device *qdev = dev->dev_private; in qxl_crtc_mode_fixup() local
391 qxl_io_log(qdev, "%s: (%d,%d) => (%d,%d)\n", in qxl_crtc_mode_fixup()
400 qxl_send_monitors_config(struct qxl_device *qdev) in qxl_send_monitors_config() argument
404 BUG_ON(!qdev->ram_header->monitors_config); in qxl_send_monitors_config()
406 if (qdev->monitors_config->count == 0) { in qxl_send_monitors_config()
407 qxl_io_log(qdev, "%s: 0 monitors??\n", __func__); in qxl_send_monitors_config()
410 for (i = 0 ; i < qdev->monitors_config->count ; ++i) { in qxl_send_monitors_config()
411 struct qxl_head *head = &qdev->monitors_config->heads[i]; in qxl_send_monitors_config()
421 qxl_io_monitors_config(qdev); in qxl_send_monitors_config()
424 static void qxl_monitors_config_set(struct qxl_device *qdev, in qxl_monitors_config_set() argument
431 qdev->monitors_config->heads[index].x = x; in qxl_monitors_config_set()
432 qdev->monitors_config->heads[index].y = y; in qxl_monitors_config_set()
433 qdev->monitors_config->heads[index].width = width; in qxl_monitors_config_set()
434 qdev->monitors_config->heads[index].height = height; in qxl_monitors_config_set()
435 qdev->monitors_config->heads[index].surface_id = surf_id; in qxl_monitors_config_set()
441 struct qxl_device *qdev = crtc->dev->dev_private; in qxl_mode_set_nofb() local
448 qxl_monitors_config_set(qdev, qcrtc->index, 0, 0, in qxl_mode_set_nofb()
463 struct qxl_device *qdev = crtc->dev->dev_private; in qxl_crtc_atomic_disable() local
465 qxl_monitors_config_set(qdev, qcrtc->index, 0, 0, 0, 0, 0); in qxl_crtc_atomic_disable()
467 qxl_send_monitors_config(qdev); in qxl_crtc_atomic_disable()
481 struct qxl_device *qdev = plane->dev->dev_private; in qxl_primary_atomic_check() local
491 if (bo->surf.stride * bo->surf.height > qdev->vram_size) { in qxl_primary_atomic_check()
502 struct qxl_device *qdev = dev->dev_private; in qxl_primary_apply_cursor() local
512 ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), in qxl_primary_apply_cursor()
526 cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); in qxl_primary_apply_cursor()
531 cmd->u.set.shape = qxl_bo_physical_address(qdev, qcrtc->cursor_bo, 0); in qxl_primary_apply_cursor()
534 qxl_release_unmap(qdev, release, &cmd->release_info); in qxl_primary_apply_cursor()
536 qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); in qxl_primary_apply_cursor()
542 qxl_release_free(qdev, release); in qxl_primary_apply_cursor()
549 struct qxl_device *qdev = plane->dev->dev_private; in qxl_primary_atomic_update() local
581 qxl_io_destroy_primary(qdev); in qxl_primary_atomic_update()
592 qxl_io_create_primary(qdev, 0, bo); in qxl_primary_atomic_update()
596 qxl_draw_dirty_fb(qdev, qfb, bo, 0, 0, &norect, 1, 1); in qxl_primary_atomic_update()
602 struct qxl_device *qdev = plane->dev->dev_private; in qxl_primary_atomic_disable() local
610 qxl_io_destroy_primary(qdev); in qxl_primary_atomic_disable()
626 struct qxl_device *qdev = dev->dev_private; in qxl_cursor_atomic_update() local
638 ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), in qxl_cursor_atomic_update()
653 ret = qxl_alloc_bo_reserved(qdev, release, in qxl_cursor_atomic_update()
681 cmd = (struct qxl_cursor_cmd *) qxl_release_map(qdev, release); in qxl_cursor_atomic_update()
683 cmd->u.set.shape = qxl_bo_physical_address(qdev, in qxl_cursor_atomic_update()
696 cmd = (struct qxl_cursor_cmd *) qxl_release_map(qdev, release); in qxl_cursor_atomic_update()
703 qxl_release_unmap(qdev, release, &cmd->release_info); in qxl_cursor_atomic_update()
704 qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); in qxl_cursor_atomic_update()
721 qxl_release_free(qdev, release); in qxl_cursor_atomic_update()
729 struct qxl_device *qdev = plane->dev->dev_private; in qxl_cursor_atomic_disable() local
734 ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), in qxl_cursor_atomic_disable()
742 qxl_release_free(qdev, release); in qxl_cursor_atomic_disable()
746 cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); in qxl_cursor_atomic_disable()
748 qxl_release_unmap(qdev, release, &cmd->release_info); in qxl_cursor_atomic_disable()
750 qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); in qxl_cursor_atomic_disable()
757 struct qxl_device *qdev = plane->dev->dev_private; in qxl_plane_prepare_fb() local
788 qxl_bo_create(qdev, user_bo->gem_base.size, in qxl_plane_prepare_fb()
868 static struct drm_plane *qxl_create_plane(struct qxl_device *qdev, in qxl_create_plane() argument
897 err = drm_universal_plane_init(&qdev->ddev, plane, possible_crtcs, in qxl_create_plane()
916 struct qxl_device *qdev = dev->dev_private; in qdev_crtc_init() local
923 primary = qxl_create_plane(qdev, 1 << crtc_id, DRM_PLANE_TYPE_PRIMARY); in qdev_crtc_init()
929 cursor = qxl_create_plane(qdev, 1 << crtc_id, DRM_PLANE_TYPE_CURSOR); in qdev_crtc_init()
965 static void qxl_write_monitors_config_for_encoder(struct qxl_device *qdev, in qxl_write_monitors_config_for_encoder() argument
976 if (!qdev->monitors_config || in qxl_write_monitors_config_for_encoder()
977 qdev->monitors_config->max_allowed <= i) { in qxl_write_monitors_config_for_encoder()
980 qdev->monitors_config, in qxl_write_monitors_config_for_encoder()
981 qdev->monitors_config ? in qxl_write_monitors_config_for_encoder()
982 qdev->monitors_config->max_allowed : -1); in qxl_write_monitors_config_for_encoder()
991 head = &qdev->monitors_config->heads[i]; in qxl_write_monitors_config_for_encoder()
999 if (qdev->monitors_config->count < i + 1) in qxl_write_monitors_config_for_encoder()
1000 qdev->monitors_config->count = i + 1; in qxl_write_monitors_config_for_encoder()
1008 i, head->x, head->y, head->width, head->height, qdev->monitors_config->count); in qxl_write_monitors_config_for_encoder()
1012 qxl_send_monitors_config(qdev); in qxl_write_monitors_config_for_encoder()
1017 struct qxl_device *qdev = encoder->dev->dev_private; in qxl_enc_commit() local
1019 qxl_write_monitors_config_for_encoder(qdev, encoder); in qxl_enc_commit()
1047 struct qxl_device *qdev = ddev->dev_private; in qxl_conn_mode_valid() local
1053 if(qdev->monitors_config_width == mode->hdisplay && in qxl_conn_mode_valid()
1054 qdev->monitors_config_height == mode->vdisplay) in qxl_conn_mode_valid()
1094 struct qxl_device *qdev = ddev->dev_private; in qxl_conn_detect() local
1098 if (!qdev->client_monitors_config) { in qxl_conn_detect()
1102 connected = qdev->client_monitors_config->count > output->index && in qxl_conn_detect()
1103 qxl_head_enabled(&qdev->client_monitors_config->heads[output->index]); in qxl_conn_detect()
1107 qxl_monitors_config_set(qdev, output->index, 0, 0, 0, 0, 0); in qxl_conn_detect()
1151 static int qxl_mode_create_hotplug_mode_update_property(struct qxl_device *qdev) in qxl_mode_create_hotplug_mode_update_property() argument
1153 if (qdev->hotplug_mode_update_property) in qxl_mode_create_hotplug_mode_update_property()
1156 qdev->hotplug_mode_update_property = in qxl_mode_create_hotplug_mode_update_property()
1157 drm_property_create_range(&qdev->ddev, DRM_MODE_PROP_IMMUTABLE, in qxl_mode_create_hotplug_mode_update_property()
1165 struct qxl_device *qdev = dev->dev_private; in qdev_output_init() local
1193 qdev->hotplug_mode_update_property, 0); in qdev_output_init()
1234 int qxl_create_monitors_object(struct qxl_device *qdev) in qxl_create_monitors_object() argument
1242 ret = qxl_gem_object_create(qdev, monitors_config_size, 0, in qxl_create_monitors_object()
1249 qdev->monitors_config_bo = gem_to_qxl_bo(gobj); in qxl_create_monitors_object()
1251 ret = qxl_bo_pin(qdev->monitors_config_bo, QXL_GEM_DOMAIN_VRAM, NULL); in qxl_create_monitors_object()
1255 qxl_bo_kmap(qdev->monitors_config_bo, NULL); in qxl_create_monitors_object()
1257 qdev->monitors_config = qdev->monitors_config_bo->kptr; in qxl_create_monitors_object()
1258 qdev->ram_header->monitors_config = in qxl_create_monitors_object()
1259 qxl_bo_physical_address(qdev, qdev->monitors_config_bo, 0); in qxl_create_monitors_object()
1261 memset(qdev->monitors_config, 0, monitors_config_size); in qxl_create_monitors_object()
1262 qdev->monitors_config->max_allowed = max_allowed; in qxl_create_monitors_object()
1266 int qxl_destroy_monitors_object(struct qxl_device *qdev) in qxl_destroy_monitors_object() argument
1270 qdev->monitors_config = NULL; in qxl_destroy_monitors_object()
1271 qdev->ram_header->monitors_config = 0; in qxl_destroy_monitors_object()
1273 qxl_bo_kunmap(qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1274 ret = qxl_bo_unpin(qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1278 qxl_bo_unref(&qdev->monitors_config_bo); in qxl_destroy_monitors_object()
1282 int qxl_modeset_init(struct qxl_device *qdev) in qxl_modeset_init() argument
1287 drm_mode_config_init(&qdev->ddev); in qxl_modeset_init()
1289 ret = qxl_create_monitors_object(qdev); in qxl_modeset_init()
1293 qdev->ddev.mode_config.funcs = (void *)&qxl_mode_funcs; in qxl_modeset_init()
1296 qdev->ddev.mode_config.min_width = 0; in qxl_modeset_init()
1297 qdev->ddev.mode_config.min_height = 0; in qxl_modeset_init()
1298 qdev->ddev.mode_config.max_width = 8192; in qxl_modeset_init()
1299 qdev->ddev.mode_config.max_height = 8192; in qxl_modeset_init()
1301 qdev->ddev.mode_config.fb_base = qdev->vram_base; in qxl_modeset_init()
1303 drm_mode_create_suggested_offset_properties(&qdev->ddev); in qxl_modeset_init()
1304 qxl_mode_create_hotplug_mode_update_property(qdev); in qxl_modeset_init()
1307 qdev_crtc_init(&qdev->ddev, i); in qxl_modeset_init()
1308 qdev_output_init(&qdev->ddev, i); in qxl_modeset_init()
1311 qxl_display_read_client_monitors_config(qdev); in qxl_modeset_init()
1312 qdev->mode_info.mode_config_initialized = true; in qxl_modeset_init()
1314 drm_mode_config_reset(&qdev->ddev); in qxl_modeset_init()
1319 qxl_fbdev_init(qdev); in qxl_modeset_init()
1323 void qxl_modeset_fini(struct qxl_device *qdev) in qxl_modeset_fini() argument
1325 qxl_fbdev_fini(qdev); in qxl_modeset_fini()
1327 qxl_destroy_monitors_object(qdev); in qxl_modeset_fini()
1328 if (qdev->mode_info.mode_config_initialized) { in qxl_modeset_fini()
1329 drm_mode_config_cleanup(&qdev->ddev); in qxl_modeset_fini()
1330 qdev->mode_info.mode_config_initialized = false; in qxl_modeset_fini()