diff options
| -rw-r--r-- | drivers/dma-buf/dma-fence.c | 17 | ||||
| -rw-r--r-- | drivers/dma-buf/sync_debug.c | 2 | ||||
| -rw-r--r-- | drivers/dma-buf/sync_file.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_dp_mst_topology.c | 41 | ||||
| -rw-r--r-- | drivers/gpu/drm/vc4/vc4_crtc.c | 66 | ||||
| -rw-r--r-- | include/linux/dma-fence.h | 2 |
6 files changed, 92 insertions, 44 deletions
diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c index 57da14c15987..56e0a0e1b600 100644 --- a/drivers/dma-buf/dma-fence.c +++ b/drivers/dma-buf/dma-fence.c | |||
| @@ -75,11 +75,6 @@ int dma_fence_signal_locked(struct dma_fence *fence) | |||
| 75 | if (WARN_ON(!fence)) | 75 | if (WARN_ON(!fence)) |
| 76 | return -EINVAL; | 76 | return -EINVAL; |
| 77 | 77 | ||
| 78 | if (!ktime_to_ns(fence->timestamp)) { | ||
| 79 | fence->timestamp = ktime_get(); | ||
| 80 | smp_mb__before_atomic(); | ||
| 81 | } | ||
| 82 | |||
| 83 | if (test_and_set_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) { | 78 | if (test_and_set_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) { |
| 84 | ret = -EINVAL; | 79 | ret = -EINVAL; |
| 85 | 80 | ||
| @@ -87,8 +82,11 @@ int dma_fence_signal_locked(struct dma_fence *fence) | |||
| 87 | * we might have raced with the unlocked dma_fence_signal, | 82 | * we might have raced with the unlocked dma_fence_signal, |
| 88 | * still run through all callbacks | 83 | * still run through all callbacks |
| 89 | */ | 84 | */ |
| 90 | } else | 85 | } else { |
| 86 | fence->timestamp = ktime_get(); | ||
| 87 | set_bit(DMA_FENCE_FLAG_TIMESTAMP_BIT, &fence->flags); | ||
| 91 | trace_dma_fence_signaled(fence); | 88 | trace_dma_fence_signaled(fence); |
| 89 | } | ||
| 92 | 90 | ||
| 93 | list_for_each_entry_safe(cur, tmp, &fence->cb_list, node) { | 91 | list_for_each_entry_safe(cur, tmp, &fence->cb_list, node) { |
| 94 | list_del_init(&cur->node); | 92 | list_del_init(&cur->node); |
| @@ -115,14 +113,11 @@ int dma_fence_signal(struct dma_fence *fence) | |||
| 115 | if (!fence) | 113 | if (!fence) |
| 116 | return -EINVAL; | 114 | return -EINVAL; |
| 117 | 115 | ||
| 118 | if (!ktime_to_ns(fence->timestamp)) { | ||
| 119 | fence->timestamp = ktime_get(); | ||
| 120 | smp_mb__before_atomic(); | ||
| 121 | } | ||
| 122 | |||
| 123 | if (test_and_set_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) | 116 | if (test_and_set_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) |
| 124 | return -EINVAL; | 117 | return -EINVAL; |
| 125 | 118 | ||
| 119 | fence->timestamp = ktime_get(); | ||
| 120 | set_bit(DMA_FENCE_FLAG_TIMESTAMP_BIT, &fence->flags); | ||
| 126 | trace_dma_fence_signaled(fence); | 121 | trace_dma_fence_signaled(fence); |
| 127 | 122 | ||
| 128 | if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &fence->flags)) { | 123 | if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &fence->flags)) { |
diff --git a/drivers/dma-buf/sync_debug.c b/drivers/dma-buf/sync_debug.c index 82a6e7f6d37f..59a3b2f8ee91 100644 --- a/drivers/dma-buf/sync_debug.c +++ b/drivers/dma-buf/sync_debug.c | |||
| @@ -84,7 +84,7 @@ static void sync_print_fence(struct seq_file *s, | |||
| 84 | show ? "_" : "", | 84 | show ? "_" : "", |
| 85 | sync_status_str(status)); | 85 | sync_status_str(status)); |
| 86 | 86 | ||
| 87 | if (status) { | 87 | if (test_bit(DMA_FENCE_FLAG_TIMESTAMP_BIT, &fence->flags)) { |
| 88 | struct timespec64 ts64 = | 88 | struct timespec64 ts64 = |
| 89 | ktime_to_timespec64(fence->timestamp); | 89 | ktime_to_timespec64(fence->timestamp); |
| 90 | 90 | ||
diff --git a/drivers/dma-buf/sync_file.c b/drivers/dma-buf/sync_file.c index 545e2c5c4815..d7e219d2669d 100644 --- a/drivers/dma-buf/sync_file.c +++ b/drivers/dma-buf/sync_file.c | |||
| @@ -391,7 +391,13 @@ static void sync_fill_fence_info(struct dma_fence *fence, | |||
| 391 | sizeof(info->driver_name)); | 391 | sizeof(info->driver_name)); |
| 392 | 392 | ||
| 393 | info->status = dma_fence_get_status(fence); | 393 | info->status = dma_fence_get_status(fence); |
| 394 | info->timestamp_ns = ktime_to_ns(fence->timestamp); | 394 | while (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags) && |
| 395 | !test_bit(DMA_FENCE_FLAG_TIMESTAMP_BIT, &fence->flags)) | ||
| 396 | cpu_relax(); | ||
| 397 | info->timestamp_ns = | ||
| 398 | test_bit(DMA_FENCE_FLAG_TIMESTAMP_BIT, &fence->flags) ? | ||
| 399 | ktime_to_ns(fence->timestamp) : | ||
| 400 | ktime_set(0, 0); | ||
| 395 | } | 401 | } |
| 396 | 402 | ||
| 397 | static long sync_file_ioctl_fence_info(struct sync_file *sync_file, | 403 | static long sync_file_ioctl_fence_info(struct sync_file *sync_file, |
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c index bfd237c15e76..ae5f06895562 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/drm_dp_mst_topology.c | |||
| @@ -330,6 +330,13 @@ static bool drm_dp_sideband_msg_build(struct drm_dp_sideband_msg_rx *msg, | |||
| 330 | return false; | 330 | return false; |
| 331 | } | 331 | } |
| 332 | 332 | ||
| 333 | /* | ||
| 334 | * ignore out-of-order messages or messages that are part of a | ||
| 335 | * failed transaction | ||
| 336 | */ | ||
| 337 | if (!recv_hdr.somt && !msg->have_somt) | ||
| 338 | return false; | ||
| 339 | |||
| 333 | /* get length contained in this portion */ | 340 | /* get length contained in this portion */ |
| 334 | msg->curchunk_len = recv_hdr.msg_len; | 341 | msg->curchunk_len = recv_hdr.msg_len; |
| 335 | msg->curchunk_hdrlen = hdrlen; | 342 | msg->curchunk_hdrlen = hdrlen; |
| @@ -2164,7 +2171,7 @@ out_unlock: | |||
| 2164 | } | 2171 | } |
| 2165 | EXPORT_SYMBOL(drm_dp_mst_topology_mgr_resume); | 2172 | EXPORT_SYMBOL(drm_dp_mst_topology_mgr_resume); |
| 2166 | 2173 | ||
| 2167 | static void drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up) | 2174 | static bool drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up) |
| 2168 | { | 2175 | { |
| 2169 | int len; | 2176 | int len; |
| 2170 | u8 replyblock[32]; | 2177 | u8 replyblock[32]; |
| @@ -2179,12 +2186,12 @@ static void drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up) | |||
| 2179 | replyblock, len); | 2186 | replyblock, len); |
| 2180 | if (ret != len) { | 2187 | if (ret != len) { |
| 2181 | DRM_DEBUG_KMS("failed to read DPCD down rep %d %d\n", len, ret); | 2188 | DRM_DEBUG_KMS("failed to read DPCD down rep %d %d\n", len, ret); |
| 2182 | return; | 2189 | return false; |
| 2183 | } | 2190 | } |
| 2184 | ret = drm_dp_sideband_msg_build(msg, replyblock, len, true); | 2191 | ret = drm_dp_sideband_msg_build(msg, replyblock, len, true); |
| 2185 | if (!ret) { | 2192 | if (!ret) { |
| 2186 | DRM_DEBUG_KMS("sideband msg build failed %d\n", replyblock[0]); | 2193 | DRM_DEBUG_KMS("sideband msg build failed %d\n", replyblock[0]); |
| 2187 | return; | 2194 | return false; |
| 2188 | } | 2195 | } |
| 2189 | replylen = msg->curchunk_len + msg->curchunk_hdrlen; | 2196 | replylen = msg->curchunk_len + msg->curchunk_hdrlen; |
| 2190 | 2197 | ||
| @@ -2196,21 +2203,32 @@ static void drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up) | |||
| 2196 | ret = drm_dp_dpcd_read(mgr->aux, basereg + curreply, | 2203 | ret = drm_dp_dpcd_read(mgr->aux, basereg + curreply, |
| 2197 | replyblock, len); | 2204 | replyblock, len); |
| 2198 | if (ret != len) { | 2205 | if (ret != len) { |
| 2199 | DRM_DEBUG_KMS("failed to read a chunk\n"); | 2206 | DRM_DEBUG_KMS("failed to read a chunk (len %d, ret %d)\n", |
| 2207 | len, ret); | ||
| 2208 | return false; | ||
| 2200 | } | 2209 | } |
| 2210 | |||
| 2201 | ret = drm_dp_sideband_msg_build(msg, replyblock, len, false); | 2211 | ret = drm_dp_sideband_msg_build(msg, replyblock, len, false); |
| 2202 | if (ret == false) | 2212 | if (!ret) { |
| 2203 | DRM_DEBUG_KMS("failed to build sideband msg\n"); | 2213 | DRM_DEBUG_KMS("failed to build sideband msg\n"); |
| 2214 | return false; | ||
| 2215 | } | ||
| 2216 | |||
| 2204 | curreply += len; | 2217 | curreply += len; |
| 2205 | replylen -= len; | 2218 | replylen -= len; |
| 2206 | } | 2219 | } |
| 2220 | return true; | ||
| 2207 | } | 2221 | } |
| 2208 | 2222 | ||
| 2209 | static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr) | 2223 | static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr) |
| 2210 | { | 2224 | { |
| 2211 | int ret = 0; | 2225 | int ret = 0; |
| 2212 | 2226 | ||
| 2213 | drm_dp_get_one_sb_msg(mgr, false); | 2227 | if (!drm_dp_get_one_sb_msg(mgr, false)) { |
| 2228 | memset(&mgr->down_rep_recv, 0, | ||
| 2229 | sizeof(struct drm_dp_sideband_msg_rx)); | ||
| 2230 | return 0; | ||
| 2231 | } | ||
| 2214 | 2232 | ||
| 2215 | if (mgr->down_rep_recv.have_eomt) { | 2233 | if (mgr->down_rep_recv.have_eomt) { |
| 2216 | struct drm_dp_sideband_msg_tx *txmsg; | 2234 | struct drm_dp_sideband_msg_tx *txmsg; |
| @@ -2266,7 +2284,12 @@ static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr) | |||
| 2266 | static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) | 2284 | static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) |
| 2267 | { | 2285 | { |
| 2268 | int ret = 0; | 2286 | int ret = 0; |
| 2269 | drm_dp_get_one_sb_msg(mgr, true); | 2287 | |
| 2288 | if (!drm_dp_get_one_sb_msg(mgr, true)) { | ||
| 2289 | memset(&mgr->up_req_recv, 0, | ||
| 2290 | sizeof(struct drm_dp_sideband_msg_rx)); | ||
| 2291 | return 0; | ||
| 2292 | } | ||
| 2270 | 2293 | ||
| 2271 | if (mgr->up_req_recv.have_eomt) { | 2294 | if (mgr->up_req_recv.have_eomt) { |
| 2272 | struct drm_dp_sideband_msg_req_body msg; | 2295 | struct drm_dp_sideband_msg_req_body msg; |
| @@ -2318,7 +2341,9 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) | |||
