Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/msm: move fence code to it's own file

Signed-off-by: Rob Clark <robdclark@gmail.com>

Rob Clark fde5de6c edcd60ce

+178 -133
+1
drivers/gpu/drm/msm/Makefile
··· 42 42 msm_debugfs.o \ 43 43 msm_drv.o \ 44 44 msm_fb.o \ 45 + msm_fence.o \ 45 46 msm_gem.o \ 46 47 msm_gem_prime.o \ 47 48 msm_gem_submit.o \
+1
drivers/gpu/drm/msm/msm_atomic.c
··· 18 18 #include "msm_drv.h" 19 19 #include "msm_kms.h" 20 20 #include "msm_gem.h" 21 + #include "msm_fence.h" 21 22 22 23 struct msm_commit { 23 24 struct drm_device *dev;
+1 -107
drivers/gpu/drm/msm/msm_drv.c
··· 17 17 18 18 #include "msm_drv.h" 19 19 #include "msm_debugfs.h" 20 + #include "msm_fence.h" 20 21 #include "msm_gpu.h" 21 22 #include "msm_kms.h" 22 23 ··· 535 534 return; 536 535 DBG("dev=%p, crtc=%u", dev, pipe); 537 536 vblank_ctrl_queue_work(priv, pipe, false); 538 - } 539 - 540 - /* 541 - * Fences: 542 - */ 543 - 544 - int msm_wait_fence(struct drm_device *dev, uint32_t fence, 545 - ktime_t *timeout , bool interruptible) 546 - { 547 - struct msm_drm_private *priv = dev->dev_private; 548 - int ret; 549 - 550 - if (!priv->gpu) 551 - return 0; 552 - 553 - if (fence > priv->gpu->submitted_fence) { 554 - DRM_ERROR("waiting on invalid fence: %u (of %u)\n", 555 - fence, priv->gpu->submitted_fence); 556 - return -EINVAL; 557 - } 558 - 559 - if (!timeout) { 560 - /* no-wait: */ 561 - ret = fence_completed(dev, fence) ? 0 : -EBUSY; 562 - } else { 563 - ktime_t now = ktime_get(); 564 - unsigned long remaining_jiffies; 565 - 566 - if (ktime_compare(*timeout, now) < 0) { 567 - remaining_jiffies = 0; 568 - } else { 569 - ktime_t rem = ktime_sub(*timeout, now); 570 - struct timespec ts = ktime_to_timespec(rem); 571 - remaining_jiffies = timespec_to_jiffies(&ts); 572 - } 573 - 574 - if (interruptible) 575 - ret = wait_event_interruptible_timeout(priv->fence_event, 576 - fence_completed(dev, fence), 577 - remaining_jiffies); 578 - else 579 - ret = wait_event_timeout(priv->fence_event, 580 - fence_completed(dev, fence), 581 - remaining_jiffies); 582 - 583 - if (ret == 0) { 584 - DBG("timeout waiting for fence: %u (completed: %u)", 585 - fence, priv->completed_fence); 586 - ret = -ETIMEDOUT; 587 - } else if (ret != -ERESTARTSYS) { 588 - ret = 0; 589 - } 590 - } 591 - 592 - return ret; 593 - } 594 - 595 - int msm_queue_fence_cb(struct drm_device *dev, 596 - struct msm_fence_cb *cb, uint32_t fence) 597 - { 598 - struct msm_drm_private *priv = dev->dev_private; 599 - int ret = 0; 600 - 601 - mutex_lock(&dev->struct_mutex); 602 - if (!list_empty(&cb->work.entry)) { 603 - ret = -EINVAL; 604 - } else if (fence > priv->completed_fence) { 605 - cb->fence = fence; 606 - list_add_tail(&cb->work.entry, &priv->fence_cbs); 607 - } else { 608 - queue_work(priv->wq, &cb->work); 609 - } 610 - mutex_unlock(&dev->struct_mutex); 611 - 612 - return ret; 613 - } 614 - 615 - /* called from workqueue */ 616 - void msm_update_fence(struct drm_device *dev, uint32_t fence) 617 - { 618 - struct msm_drm_private *priv = dev->dev_private; 619 - 620 - mutex_lock(&dev->struct_mutex); 621 - priv->completed_fence = max(fence, priv->completed_fence); 622 - 623 - while (!list_empty(&priv->fence_cbs)) { 624 - struct msm_fence_cb *cb; 625 - 626 - cb = list_first_entry(&priv->fence_cbs, 627 - struct msm_fence_cb, work.entry); 628 - 629 - if (cb->fence > priv->completed_fence) 630 - break; 631 - 632 - list_del_init(&cb->work.entry); 633 - queue_work(priv->wq, &cb->work); 634 - } 635 - 636 - mutex_unlock(&dev->struct_mutex); 637 - 638 - wake_up_all(&priv->fence_event); 639 - } 640 - 641 - void __msm_fence_worker(struct work_struct *work) 642 - { 643 - struct msm_fence_cb *cb = container_of(work, struct msm_fence_cb, work); 644 - cb->func(cb); 645 537 } 646 538 647 539 /*
+1 -26
drivers/gpu/drm/msm/msm_drv.h
··· 49 49 struct msm_rd_state; 50 50 struct msm_perf_state; 51 51 struct msm_gem_submit; 52 + struct msm_fence_cb; 52 53 53 54 #define NUM_DOMAINS 2 /* one for KMS, then one per gpu core (?) */ 54 55 ··· 158 157 uint32_t pixel_format; 159 158 }; 160 159 161 - /* callback from wq once fence has passed: */ 162 - struct msm_fence_cb { 163 - struct work_struct work; 164 - uint32_t fence; 165 - void (*func)(struct msm_fence_cb *cb); 166 - }; 167 - 168 - void __msm_fence_worker(struct work_struct *work); 169 - 170 - #define INIT_FENCE_CB(_cb, _func) do { \ 171 - INIT_WORK(&(_cb)->work, __msm_fence_worker); \ 172 - (_cb)->func = _func; \ 173 - } while (0) 174 - 175 160 int msm_atomic_check(struct drm_device *dev, 176 161 struct drm_atomic_state *state); 177 162 int msm_atomic_commit(struct drm_device *dev, 178 163 struct drm_atomic_state *state, bool nonblock); 179 164 180 165 int msm_register_mmu(struct drm_device *dev, struct msm_mmu *mmu); 181 - 182 - int msm_wait_fence(struct drm_device *dev, uint32_t fence, 183 - ktime_t *timeout, bool interruptible); 184 - int msm_queue_fence_cb(struct drm_device *dev, 185 - struct msm_fence_cb *cb, uint32_t fence); 186 - void msm_update_fence(struct drm_device *dev, uint32_t fence); 187 166 188 167 int msm_ioctl_gem_submit(struct drm_device *dev, void *data, 189 168 struct drm_file *file); ··· 283 302 284 303 #define DBG(fmt, ...) DRM_DEBUG(fmt"\n", ##__VA_ARGS__) 285 304 #define VERB(fmt, ...) if (0) DRM_DEBUG(fmt"\n", ##__VA_ARGS__) 286 - 287 - static inline bool fence_completed(struct drm_device *dev, uint32_t fence) 288 - { 289 - struct msm_drm_private *priv = dev->dev_private; 290 - return priv->completed_fence >= fence; 291 - } 292 305 293 306 static inline int align_pitch(int width, int bpp) 294 307 {
+129
drivers/gpu/drm/msm/msm_fence.c
··· 1 + /* 2 + * Copyright (C) 2013-2016 Red Hat 3 + * Author: Rob Clark <robdclark@gmail.com> 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms of the GNU General Public License version 2 as published by 7 + * the Free Software Foundation. 8 + * 9 + * This program is distributed in the hope that it will be useful, but WITHOUT 10 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 + * more details. 13 + * 14 + * You should have received a copy of the GNU General Public License along with 15 + * this program. If not, see <http://www.gnu.org/licenses/>. 16 + */ 17 + 18 + #include "msm_drv.h" 19 + #include "msm_fence.h" 20 + #include "msm_gpu.h" 21 + 22 + static inline bool fence_completed(struct drm_device *dev, uint32_t fence) 23 + { 24 + struct msm_drm_private *priv = dev->dev_private; 25 + return (int32_t)(priv->completed_fence - fence) >= 0; 26 + } 27 + 28 + int msm_wait_fence(struct drm_device *dev, uint32_t fence, 29 + ktime_t *timeout , bool interruptible) 30 + { 31 + struct msm_drm_private *priv = dev->dev_private; 32 + int ret; 33 + 34 + if (!priv->gpu) 35 + return 0; 36 + 37 + if (fence > priv->gpu->submitted_fence) { 38 + DRM_ERROR("waiting on invalid fence: %u (of %u)\n", 39 + fence, priv->gpu->submitted_fence); 40 + return -EINVAL; 41 + } 42 + 43 + if (!timeout) { 44 + /* no-wait: */ 45 + ret = fence_completed(dev, fence) ? 0 : -EBUSY; 46 + } else { 47 + ktime_t now = ktime_get(); 48 + unsigned long remaining_jiffies; 49 + 50 + if (ktime_compare(*timeout, now) < 0) { 51 + remaining_jiffies = 0; 52 + } else { 53 + ktime_t rem = ktime_sub(*timeout, now); 54 + struct timespec ts = ktime_to_timespec(rem); 55 + remaining_jiffies = timespec_to_jiffies(&ts); 56 + } 57 + 58 + if (interruptible) 59 + ret = wait_event_interruptible_timeout(priv->fence_event, 60 + fence_completed(dev, fence), 61 + remaining_jiffies); 62 + else 63 + ret = wait_event_timeout(priv->fence_event, 64 + fence_completed(dev, fence), 65 + remaining_jiffies); 66 + 67 + if (ret == 0) { 68 + DBG("timeout waiting for fence: %u (completed: %u)", 69 + fence, priv->completed_fence); 70 + ret = -ETIMEDOUT; 71 + } else if (ret != -ERESTARTSYS) { 72 + ret = 0; 73 + } 74 + } 75 + 76 + return ret; 77 + } 78 + 79 + int msm_queue_fence_cb(struct drm_device *dev, 80 + struct msm_fence_cb *cb, uint32_t fence) 81 + { 82 + struct msm_drm_private *priv = dev->dev_private; 83 + int ret = 0; 84 + 85 + mutex_lock(&dev->struct_mutex); 86 + if (!list_empty(&cb->work.entry)) { 87 + ret = -EINVAL; 88 + } else if (fence > priv->completed_fence) { 89 + cb->fence = fence; 90 + list_add_tail(&cb->work.entry, &priv->fence_cbs); 91 + } else { 92 + queue_work(priv->wq, &cb->work); 93 + } 94 + mutex_unlock(&dev->struct_mutex); 95 + 96 + return ret; 97 + } 98 + 99 + /* called from workqueue */ 100 + void msm_update_fence(struct drm_device *dev, uint32_t fence) 101 + { 102 + struct msm_drm_private *priv = dev->dev_private; 103 + 104 + mutex_lock(&dev->struct_mutex); 105 + priv->completed_fence = max(fence, priv->completed_fence); 106 + 107 + while (!list_empty(&priv->fence_cbs)) { 108 + struct msm_fence_cb *cb; 109 + 110 + cb = list_first_entry(&priv->fence_cbs, 111 + struct msm_fence_cb, work.entry); 112 + 113 + if (cb->fence > priv->completed_fence) 114 + break; 115 + 116 + list_del_init(&cb->work.entry); 117 + queue_work(priv->wq, &cb->work); 118 + } 119 + 120 + mutex_unlock(&dev->struct_mutex); 121 + 122 + wake_up_all(&priv->fence_event); 123 + } 124 + 125 + void __msm_fence_worker(struct work_struct *work) 126 + { 127 + struct msm_fence_cb *cb = container_of(work, struct msm_fence_cb, work); 128 + cb->func(cb); 129 + }
+43
drivers/gpu/drm/msm/msm_fence.h
··· 1 + /* 2 + * Copyright (C) 2013-2016 Red Hat 3 + * Author: Rob Clark <robdclark@gmail.com> 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms of the GNU General Public License version 2 as published by 7 + * the Free Software Foundation. 8 + * 9 + * This program is distributed in the hope that it will be useful, but WITHOUT 10 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 + * more details. 13 + * 14 + * You should have received a copy of the GNU General Public License along with 15 + * this program. If not, see <http://www.gnu.org/licenses/>. 16 + */ 17 + 18 + #ifndef __MSM_FENCE_H__ 19 + #define __MSM_FENCE_H__ 20 + 21 + #include "msm_drv.h" 22 + 23 + /* callback from wq once fence has passed: */ 24 + struct msm_fence_cb { 25 + struct work_struct work; 26 + uint32_t fence; 27 + void (*func)(struct msm_fence_cb *cb); 28 + }; 29 + 30 + void __msm_fence_worker(struct work_struct *work); 31 + 32 + #define INIT_FENCE_CB(_cb, _func) do { \ 33 + INIT_WORK(&(_cb)->work, __msm_fence_worker); \ 34 + (_cb)->func = _func; \ 35 + } while (0) 36 + 37 + int msm_wait_fence(struct drm_device *dev, uint32_t fence, 38 + ktime_t *timeout, bool interruptible); 39 + int msm_queue_fence_cb(struct drm_device *dev, 40 + struct msm_fence_cb *cb, uint32_t fence); 41 + void msm_update_fence(struct drm_device *dev, uint32_t fence); 42 + 43 + #endif
+1
drivers/gpu/drm/msm/msm_gem.c
··· 21 21 #include <linux/pfn_t.h> 22 22 23 23 #include "msm_drv.h" 24 + #include "msm_fence.h" 24 25 #include "msm_gem.h" 25 26 #include "msm_gpu.h" 26 27 #include "msm_mmu.h"
+1
drivers/gpu/drm/msm/msm_gpu.c
··· 18 18 #include "msm_gpu.h" 19 19 #include "msm_gem.h" 20 20 #include "msm_mmu.h" 21 + #include "msm_fence.h" 21 22 22 23 23 24 /*