Lines Matching refs:qdev

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