diff options
| -rw-r--r-- | drivers/gpu/drm/drm_edid.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_cmd.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_ioctl.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_release.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/sun4i/sun4i_lvds.c | 55 | ||||
| -rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_vq.c | 4 |
7 files changed, 19 insertions, 80 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 134069f36482..39f1db4acda4 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
| @@ -4451,6 +4451,7 @@ drm_reset_display_info(struct drm_connector *connector) | |||
| 4451 | info->max_tmds_clock = 0; | 4451 | info->max_tmds_clock = 0; |
| 4452 | info->dvi_dual = false; | 4452 | info->dvi_dual = false; |
| 4453 | info->has_hdmi_infoframe = false; | 4453 | info->has_hdmi_infoframe = false; |
| 4454 | memset(&info->hdmi, 0, sizeof(info->hdmi)); | ||
| 4454 | 4455 | ||
| 4455 | info->non_desktop = 0; | 4456 | info->non_desktop = 0; |
| 4456 | } | 4457 | } |
| @@ -4462,17 +4463,11 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi | |||
| 4462 | 4463 | ||
| 4463 | u32 quirks = edid_get_quirks(edid); | 4464 | u32 quirks = edid_get_quirks(edid); |
| 4464 | 4465 | ||
| 4466 | drm_reset_display_info(connector); | ||
| 4467 | |||
| 4465 | info->width_mm = edid->width_cm * 10; | 4468 | info->width_mm = edid->width_cm * 10; |
| 4466 | info->height_mm = edid->height_cm * 10; | 4469 | info->height_mm = edid->height_cm * 10; |
| 4467 | 4470 | ||
| 4468 | /* driver figures it out in this case */ | ||
| 4469 | info->bpc = 0; | ||
| 4470 | info->color_formats = 0; | ||
| 4471 | info->cea_rev = 0; | ||
| 4472 | info->max_tmds_clock = 0; | ||
| 4473 | info->dvi_dual = false; | ||
| 4474 | info->has_hdmi_infoframe = false; | ||
| 4475 | |||
| 4476 | info->non_desktop = !!(quirks & EDID_QUIRK_NON_DESKTOP); | 4471 | info->non_desktop = !!(quirks & EDID_QUIRK_NON_DESKTOP); |
| 4477 | 4472 | ||
| 4478 | DRM_DEBUG_KMS("non_desktop set to %d\n", info->non_desktop); | 4473 | DRM_DEBUG_KMS("non_desktop set to %d\n", info->non_desktop); |
diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c index c0fb52c6d4ca..01665b98c57e 100644 --- a/drivers/gpu/drm/qxl/qxl_cmd.c +++ b/drivers/gpu/drm/qxl/qxl_cmd.c | |||
| @@ -179,10 +179,9 @@ qxl_push_command_ring_release(struct qxl_device *qdev, struct qxl_release *relea | |||
| 179 | uint32_t type, bool interruptible) | 179 | uint32_t type, bool interruptible) |
| 180 | { | 180 | { |
| 181 | struct qxl_command cmd; | 181 | struct qxl_command cmd; |
| 182 | struct qxl_bo_list *entry = list_first_entry(&release->bos, struct qxl_bo_list, tv.head); | ||
| 183 | 182 | ||
| 184 | cmd.type = type; | 183 | cmd.type = type; |
| 185 | cmd.data = qxl_bo_physical_address(qdev, to_qxl_bo(entry->tv.bo), release->release_offset); | 184 | cmd.data = qxl_bo_physical_address(qdev, release->release_bo, release->release_offset); |
| 186 | 185 | ||
| 187 | return qxl_ring_push(qdev->command_ring, &cmd, interruptible); | 186 | return qxl_ring_push(qdev->command_ring, &cmd, interruptible); |
| 188 | } | 187 | } |
| @@ -192,10 +191,9 @@ qxl_push_cursor_ring_release(struct qxl_device *qdev, struct qxl_release *releas | |||
| 192 | uint32_t type, bool interruptible) | 191 | uint32_t type, bool interruptible) |
| 193 | { | 192 | { |
| 194 | struct qxl_command cmd; | 193 | struct qxl_command cmd; |
| 195 | struct qxl_bo_list *entry = list_first_entry(&release->bos, struct qxl_bo_list, tv.head); | ||
| 196 | 194 | ||
| 197 | cmd.type = type; | 195 | cmd.type = type; |
| 198 | cmd.data = qxl_bo_physical_address(qdev, to_qxl_bo(entry->tv.bo), release->release_offset); | 196 | cmd.data = qxl_bo_physical_address(qdev, release->release_bo, release->release_offset); |
| 199 | 197 | ||
| 200 | return qxl_ring_push(qdev->cursor_ring, &cmd, interruptible); | 198 | return qxl_ring_push(qdev->cursor_ring, &cmd, interruptible); |
| 201 | } | 199 | } |
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h index 00a1a66b052a..864b456080c4 100644 --- a/drivers/gpu/drm/qxl/qxl_drv.h +++ b/drivers/gpu/drm/qxl/qxl_drv.h | |||
| @@ -167,6 +167,7 @@ struct qxl_release { | |||
| 167 | 167 | ||
| 168 | int id; | 168 | int id; |
| 169 | int type; | 169 | int type; |
| 170 | struct qxl_bo *release_bo; | ||
| 170 | uint32_t release_offset; | 171 | uint32_t release_offset; |
| 171 | uint32_t surface_release_id; | 172 | uint32_t surface_release_id; |
| 172 | struct ww_acquire_ctx ticket; | 173 | struct ww_acquire_ctx ticket; |
diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c index e238a1a2eca1..6cc9f3367fa0 100644 --- a/drivers/gpu/drm/qxl/qxl_ioctl.c +++ b/drivers/gpu/drm/qxl/qxl_ioctl.c | |||
| @@ -182,9 +182,9 @@ static int qxl_process_single_command(struct qxl_device *qdev, | |||
| 182 | goto out_free_reloc; | 182 | goto out_free_reloc; |
| 183 | 183 | ||
| 184 | /* TODO copy slow path code from i915 */ | 184 | /* TODO copy slow path code from i915 */ |
| 185 | fb_cmd = qxl_bo_kmap_atomic_page(qdev, cmd_bo, (release->release_offset & PAGE_SIZE)); | 185 | fb_cmd = qxl_bo_kmap_atomic_page(qdev, cmd_bo, (release->release_offset & PAGE_MASK)); |
| 186 | unwritten = __copy_from_user_inatomic_nocache | 186 | unwritten = __copy_from_user_inatomic_nocache |
| 187 | (fb_cmd + sizeof(union qxl_release_info) + (release->release_offset & ~PAGE_SIZE), | 187 | (fb_cmd + sizeof(union qxl_release_info) + (release->release_offset & ~PAGE_MASK), |
| 188 | u64_to_user_ptr(cmd->command), cmd->command_size); | 188 | u64_to_user_ptr(cmd->command), cmd->command_size); |
| 189 | 189 | ||
| 190 | { | 190 | { |
diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c index 5d84a66fed36..7cb214577275 100644 --- a/drivers/gpu/drm/qxl/qxl_release.c +++ b/drivers/gpu/drm/qxl/qxl_release.c | |||
| @@ -173,6 +173,7 @@ qxl_release_free_list(struct qxl_release *release) | |||
| 173 | list_del(&entry->tv.head); | 173 | list_del(&entry->tv.head); |
| 174 | kfree(entry); | 174 | kfree(entry); |
| 175 | } | 175 | } |
| 176 | release->release_bo = NULL; | ||
| 176 | } | 177 | } |
| 177 | 178 | ||
| 178 | void | 179 | void |
| @@ -296,7 +297,6 @@ int qxl_alloc_surface_release_reserved(struct qxl_device *qdev, | |||
| 296 | { | 297 | { |
| 297 | if (surface_cmd_type == QXL_SURFACE_CMD_DESTROY && create_rel) { | 298 | if (surface_cmd_type == QXL_SURFACE_CMD_DESTROY && create_rel) { |
| 298 | int idr_ret; | 299 | int idr_ret; |
| 299 | struct qxl_bo_list *entry = list_first_entry(&create_rel->bos, struct qxl_bo_list, tv.head); | ||
| 300 | struct qxl_bo *bo; | 300 | struct qxl_bo *bo; |
| 301 | union qxl_release_info *info; | 301 | union qxl_release_info *info; |
| 302 | 302 | ||
| @@ -304,8 +304,9 @@ int qxl_alloc_surface_release_reserved(struct qxl_device *qdev, | |||
| 304 | idr_ret = qxl_release_alloc(qdev, QXL_RELEASE_SURFACE_CMD, release); | 304 | idr_ret = qxl_release_alloc(qdev, QXL_RELEASE_SURFACE_CMD, release); |
| 305 | if (idr_ret < 0) | 305 | if (idr_ret < 0) |
| 306 | return idr_ret; | 306 | return idr_ret; |
| 307 | bo = to_qxl_bo(entry->tv.bo); | 307 | bo = create_rel->release_bo; |
| 308 | 308 | ||
| 309 | (*release)->release_bo = bo; | ||
| 309 | (*release)->release_offset = create_rel->release_offset + 64; | 310 | (*release)->release_offset = create_rel->release_offset + 64; |
| 310 | 311 | ||
| 311 | qxl_release_list_add(*release, bo); | 312 | qxl_release_list_add(*release, bo); |
| @@ -365,6 +366,7 @@ int qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size, | |||
| 365 | 366 | ||
| 366 | bo = qxl_bo_ref(qdev->current_release_bo[cur_idx]); | 367 | bo = qxl_bo_ref(qdev->current_release_bo[cur_idx]); |
| 367 | 368 | ||
| 369 | (*release)->release_bo = bo; | ||
| 368 | (*release)->release_offset = qdev->current_release_bo_offset[cur_idx] * release_size_per_bo[cur_idx]; | 370 | (*release)->release_offset = qdev->current_release_bo_offset[cur_idx] * release_size_per_bo[cur_idx]; |
| 369 | qdev->current_release_bo_offset[cur_idx]++; | 371 | qdev->current_release_bo_offset[cur_idx]++; |
| 370 | 372 | ||
| @@ -408,13 +410,12 @@ union qxl_release_info *qxl_release_map(struct qxl_device *qdev, | |||
| 408 | { | 410 | { |
| 409 | void *ptr; | 411 | void *ptr; |
| 410 | union qxl_release_info *info; | 412 | union qxl_release_info *info; |
| 411 | struct qxl_bo_list *entry = list_first_entry(&release->bos, struct qxl_bo_list, tv.head); | 413 | struct qxl_bo *bo = release->release_bo; |
| 412 | struct qxl_bo *bo = to_qxl_bo(entry->tv.bo); | ||
| 413 | 414 | ||
| 414 | ptr = qxl_bo_kmap_atomic_page(qdev, bo, release->release_offset & PAGE_SIZE); | 415 | ptr = qxl_bo_kmap_atomic_page(qdev, bo, release->release_offset & PAGE_MASK); |
| 415 | if (!ptr) | 416 | if (!ptr) |
| 416 | return NULL; | 417 | return NULL; |
| 417 | info = ptr + (release->release_offset & ~PAGE_SIZE); | 418 | info = ptr + (release->release_offset & ~PAGE_MASK); |
| 418 | return info; | 419 | return info; |
| 419 | } | 420 | } |
| 420 | 421 | ||
| @@ -422,11 +423,10 @@ void qxl_release_unmap(struct qxl_device *qdev, | |||
| 422 | struct qxl_release *release, | 423 | struct qxl_release *release, |
| 423 | union qxl_release_info *info) | 424 | union qxl_release_info *info) |
| 424 | { | 425 | { |
| 425 | struct qxl_bo_list *entry = list_first_entry(&release->bos, struct qxl_bo_list, tv.head); | 426 | struct qxl_bo *bo = release->release_bo; |
| 426 | struct qxl_bo *bo = to_qxl_bo(entry->tv.bo); | ||
| 427 | void *ptr; | 427 | void *ptr; |
| 428 | 428 | ||
| 429 | ptr = ((void *)info) - (release->release_offset & ~PAGE_SIZE); | 429 | ptr = ((void *)info) - (release->release_offset & ~PAGE_MASK); |
| 430 | qxl_bo_kunmap_atomic_page(qdev, bo, ptr); | 430 | qxl_bo_kunmap_atomic_page(qdev, bo, ptr); |
| 431 | } | 431 | } |
| 432 | 432 | ||
diff --git a/drivers/gpu/drm/sun4i/sun4i_lvds.c b/drivers/gpu/drm/sun4i/sun4i_lvds.c index bffff4c9fbf5..be3f14d7746d 100644 --- a/drivers/gpu/drm/sun4i/sun4i_lvds.c +++ b/drivers/gpu/drm/sun4i/sun4i_lvds.c | |||
| @@ -94,64 +94,9 @@ static void sun4i_lvds_encoder_disable(struct drm_encoder *encoder) | |||
| 94 | } | 94 | } |
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | static enum drm_mode_status sun4i_lvds_encoder_mode_valid(struct drm_encoder *crtc, | ||
| 98 | const struct drm_display_mode *mode) | ||
| 99 | { | ||
| 100 | struct sun4i_lvds *lvds = drm_encoder_to_sun4i_lvds(crtc); | ||
| 101 | struct sun4i_tcon *tcon = lvds->tcon; | ||
| 102 | u32 hsync = mode->hsync_end - mode->hsync_start; | ||
| 103 | u32 vsync = mode->vsync_end - mode->vsync_start; | ||
| 104 | unsigned long rate = mode->clock * 1000; | ||
| 105 | long rounded_rate; | ||
| 106 | |||
| 107 | DRM_DEBUG_DRIVER("Validating modes...\n"); | ||
| 108 | |||
| 109 | if (hsync < 1) | ||
| 110 | return MODE_HSYNC_NARROW; | ||
| 111 | |||
| 112 | if (hsync > 0x3ff) | ||
| 113 | return MODE_HSYNC_WIDE; | ||
| 114 | |||
| 115 | if ((mode->hdisplay < 1) || (mode->htotal < 1)) | ||
| 116 | return MODE_H_ILLEGAL; | ||
| 117 | |||
| 118 | if ((mode->hdisplay > 0x7ff) || (mode->htotal > 0xfff)) | ||
| 119 | return MODE_BAD_HVALUE; | ||
| 120 | |||
| 121 | DRM_DEBUG_DRIVER("Horizontal parameters OK\n"); | ||
| 122 | |||
| 123 | if (vsync < 1) | ||
| 124 | return MODE_VSYNC_NARROW; | ||
| 125 | |||
| 126 | if (vsync > 0x3ff) | ||
| 127 | return MODE_VSYNC_WIDE; | ||
| 128 | |||
| 129 | if ((mode->vdisplay < 1) || (mode->vtotal < 1)) | ||
| 130 | return MODE_V_ILLEGAL; | ||
| 131 | |||
| 132 | if ((mode->vdisplay > 0x7ff) || (mode->vtotal > 0xfff)) | ||
| 133 | return MODE_BAD_VVALUE; | ||
| 134 | |||
| 135 | DRM_DEBUG_DRIVER("Vertical parameters OK\n"); | ||
| 136 | |||
| 137 | tcon->dclk_min_div = 7; | ||
| 138 | tcon->dclk_max_div = 7; | ||
| 139 | rounded_rate = clk_round_rate(tcon->dclk, rate); | ||
| 140 | if (rounded_rate < rate) | ||
| 141 | return MODE_CLOCK_LOW; | ||
| 142 | |||
| 143 | if (rounded_rate > rate) | ||
| 144 | return MODE_CLOCK_HIGH; | ||
| 145 | |||
| 146 | DRM_DEBUG_DRIVER("Clock rate OK\n"); | ||
| 147 | |||
| 148 | return MODE_OK; | ||
| 149 | } | ||
| 150 | |||
| 151 | static const struct drm_encoder_helper_funcs sun4i_lvds_enc_helper_funcs = { | 97 | static const struct drm_encoder_helper_funcs sun4i_lvds_enc_helper_funcs = { |
| 152 | .disable = sun4i_lvds_encoder_disable, | 98 | .disable = sun4i_lvds_encoder_disable, |
| 153 | .enable = sun4i_lvds_encoder_enable, | 99 | .enable = sun4i_lvds_encoder_enable, |
| 154 | .mode_valid = sun4i_lvds_encoder_mode_valid, | ||
| 155 | }; | 100 | }; |
| 156 | 101 | ||
| 157 | static const struct drm_encoder_funcs sun4i_lvds_enc_funcs = { | 102 | static const struct drm_encoder_funcs sun4i_lvds_enc_funcs = { |
diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c index 48e4f1df6e5d..020070d483d3 100644 --- a/drivers/gpu/drm/virtio/virtgpu_vq.c +++ b/drivers/gpu/drm/virtio/virtgpu_vq.c | |||
| @@ -293,7 +293,7 @@ retry: | |||
| 293 | ret = virtqueue_add_sgs(vq, sgs, outcnt, incnt, vbuf, GFP_ATOMIC); | 293 | ret = virtqueue_add_sgs(vq, sgs, outcnt, incnt, vbuf, GFP_ATOMIC); |
| 294 | if (ret == -ENOSPC) { | 294 | if (ret == -ENOSPC) { |
| 295 | spin_unlock(&vgdev->ctrlq.qlock); | 295 | spin_unlock(&vgdev->ctrlq.qlock); |
| 296 | wait_event(vgdev->ctrlq.ack_queue, vq->num_free); | 296 | wait_event(vgdev->ctrlq.ack_queue, vq->num_free >= outcnt + incnt); |
| 297 | spin_lock(&vgdev->ctrlq.qlock); | 297 | spin_lock(&vgdev->ctrlq.qlock); |
| 298 | goto retry; | 298 | goto retry; |
| 299 | } else { | 299 | } else { |
| @@ -368,7 +368,7 @@ retry: | |||
| 368 | ret = virtqueue_add_sgs(vq, sgs, outcnt, 0, vbuf, GFP_ATOMIC); | 368 | ret = virtqueue_add_sgs(vq, sgs, outcnt, 0, vbuf, GFP_ATOMIC); |
| 369 | if (ret == -ENOSPC) { | 369 | if (ret == -ENOSPC) { |
| 370 | spin_unlock(&vgdev->cursorq.qlock); | 370 | spin_unlock(&vgdev->cursorq.qlock); |
| 371 | wait_event(vgdev->cursorq.ack_queue, vq->num_free); | 371 | wait_event(vgdev->cursorq.ack_queue, vq->num_free >= outcnt); |
| 372 | spin_lock(&vgdev->cursorq.qlock); | 372 | spin_lock(&vgdev->cursorq.qlock); |
| 373 | goto retry; | 373 | goto retry; |
| 374 | } else { | 374 | } else { |
