Re: [PATCH V2 1/2] drm/vkms: Add support for virtual hardware mode

2021-03-03 Thread kernel test robot
Hi Sumera,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v5.12-rc1 next-20210303]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:
https://github.com/0day-ci/linux/commits/Sumera-Priyadarsini/Add-virtual-hardware-module/20210303-205440
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 
f69d02e37a85645aa90d18cacfff36dba370f797
config: powerpc64-randconfig-p002-20210303 (attached as .config)
compiler: powerpc64-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
chmod +x ~/bin/make.cross
# 
https://github.com/0day-ci/linux/commit/67e97bc2a047c91e1de3544be8668ff9a1e2775b
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review 
Sumera-Priyadarsini/Add-virtual-hardware-module/20210303-205440
git checkout 67e97bc2a047c91e1de3544be8668ff9a1e2775b
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross 
ARCH=powerpc64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot 

All warnings (new ones prefixed by >>):

   drivers/gpu/drm/vkms/vkms_composer.c: In function 'vkms_composer_worker':
>> drivers/gpu/drm/vkms/vkms_composer.c:226:20: warning: variable 'wb_pending' 
>> set but not used [-Wunused-but-set-variable]
 226 |  bool crc_pending, wb_pending;
 |^~


vim +/wb_pending +226 drivers/gpu/drm/vkms/vkms_composer.c

67e97bc2a047c9 drivers/gpu/drm/vkms/vkms_composer.c Sumera Priyadarsini 
2021-03-03  209  
0ca33adb91c0a9 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-09-04  210  /**
a4e7e98e90ebd9 drivers/gpu/drm/vkms/vkms_composer.c Rodrigo Siqueira
2019-06-25  211   * vkms_composer_worker - ordered work_struct to compute CRC
0ca33adb91c0a9 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-09-04  212   *
0ca33adb91c0a9 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-09-04  213   * @work: work_struct
0ca33adb91c0a9 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-09-04  214   *
a4e7e98e90ebd9 drivers/gpu/drm/vkms/vkms_composer.c Rodrigo Siqueira
2019-06-25  215   * Work handler for composing and computing CRCs. work_struct 
scheduled in
0ca33adb91c0a9 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-09-04  216   * an ordered workqueue that's periodically scheduled to run by
0ca33adb91c0a9 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-09-04  217   * _vblank_handle() and flushed at 
vkms_atomic_crtc_destroy_state().
0ca33adb91c0a9 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-09-04  218   */
a4e7e98e90ebd9 drivers/gpu/drm/vkms/vkms_composer.c Rodrigo Siqueira
2019-06-25  219  void vkms_composer_worker(struct work_struct *work)
6c234fe37c5762 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-08-02  220  {
6c234fe37c5762 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-08-02  221 struct vkms_crtc_state *crtc_state = container_of(work,
6c234fe37c5762 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-08-02  222 struct 
vkms_crtc_state,
a4e7e98e90ebd9 drivers/gpu/drm/vkms/vkms_composer.c Rodrigo Siqueira
2019-06-25  223 composer_work);
6c234fe37c5762 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-08-02  224 struct drm_crtc *crtc = crtc_state->base.crtc;
6c234fe37c5762 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-08-02  225 struct vkms_output *out = drm_crtc_to_vkms_output(crtc);
dbd9d80c1b2e03 drivers/gpu/drm/vkms/vkms_composer.c Rodrigo Siqueira
2020-08-30 @226 bool crc_pending, wb_pending;
0ca33adb91c0a9 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-09-04  227 u64 frame_start, frame_end;
67e97bc2a047c9 drivers/gpu/drm/vkms/vkms_composer.c Sumera Priyadarsini 
2021-03-03  228 u32 crc32 = 0;
953025763d1421 drivers/gpu/drm/vkms/vkms_composer.c Rodrigo Siqueira
2020-08-30  229 int ret;
0ca33adb91c0a9 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-09-04  230  
a4e7e98e90ebd9 drivers/gpu/drm/vkms/vkms_composer.c Rodrigo Siqueira
2019-06-25  231 spin_lock_irq(&out->composer_lock);
0ca33adb91c0a9 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-09-04  232 frame_start = crtc_state->frame_start;
0ca33adb91c0a9 drivers/gpu/drm/vkms/vkms_crc.c  Haneen Mohammed 
2018-09-04  233 frame_end = crtc_state->frame_end;
18d095

[PATCH V2 1/2] drm/vkms: Add support for virtual hardware mode

2021-03-03 Thread Sumera Priyadarsini
Add a virtual hardware or vblank-less mode as a module to enable
VKMS to emulate virtual graphic drivers.

Two new functions vkms_composer_common() and vkms_crtc_composer() have
been added. The actual plane composition work has been moved to
vkms_composer_common() which is called by both vkms_composer_worker()
and vkms_crtc_composer(). vkms_crtc_composer() is used in case of
vblank mode and is called directly in the atomic hook in
vkms_atomic_begin(). However, some crc captures still use vblanks
which causes the crc-based igt tests to crash. Currently, I am unsure
about how to approach one-shot implementation of crc reads so I am
still working on that.

The patch is based on Rodrigo Siqueira's
patch(https://patchwork.freedesktop.org/patch/316851/?series=48469&rev=3)
and the ensuing review.

Signed-off-by: Sumera Priyadarsini 

Changes in V2:
- Remove spinlock across 'vkms_output->lock' in vkms_crtc.c(Daniel)
- Add vkms_composer_common() (Daniel)
---
 drivers/gpu/drm/vkms/vkms_composer.c | 88 +---
 drivers/gpu/drm/vkms/vkms_crtc.c | 24 ++--
 drivers/gpu/drm/vkms/vkms_drv.c  | 18 --
 drivers/gpu/drm/vkms/vkms_drv.h  |  4 ++
 4 files changed, 91 insertions(+), 43 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_composer.c 
b/drivers/gpu/drm/vkms/vkms_composer.c
index 66c6842d70db..df5b946f001f 100644
--- a/drivers/gpu/drm/vkms/vkms_composer.c
+++ b/drivers/gpu/drm/vkms/vkms_composer.c
@@ -169,6 +169,44 @@ static int compose_planes(void **vaddr_out,
return 0;
 }
 
+int vkms_composer_common(struct vkms_crtc_state *crtc_state,
+ struct vkms_output *out, bool wb_pending, uint32_t 
*crc32)
+{
+   struct vkms_composer *primary_composer = NULL;
+   struct vkms_composer *cursor_composer = NULL;
+   void *vaddr_out = NULL;
+   int ret;
+
+   if (crtc_state->num_active_planes >= 1)
+   primary_composer = crtc_state->active_planes[0]->composer;
+   if (crtc_state->num_active_planes == 2)
+   cursor_composer = crtc_state->active_planes[1]->composer;
+   if (!primary_composer)
+   return -EINVAL;
+   if (wb_pending)
+   vaddr_out = crtc_state->active_writeback;
+
+   ret = compose_planes(&vaddr_out, primary_composer, cursor_composer);
+   if (ret) {
+   if (ret == -EINVAL && !wb_pending)
+   kfree(vaddr_out);
+   return -EINVAL;
+   }
+
+   *crc32 = compute_crc(vaddr_out, primary_composer);
+
+   if (wb_pending) {
+   drm_writeback_signal_completion(&out->wb_connector, 0);
+   spin_lock_irq(&out->composer_lock);
+   crtc_state->wb_pending = false;
+   spin_unlock_irq(&out->composer_lock);
+   } else {
+   kfree(vaddr_out);
+   }
+
+   return 0;
+}
+
 /**
  * vkms_composer_worker - ordered work_struct to compute CRC
  *
@@ -185,12 +223,9 @@ void vkms_composer_worker(struct work_struct *work)
composer_work);
struct drm_crtc *crtc = crtc_state->base.crtc;
struct vkms_output *out = drm_crtc_to_vkms_output(crtc);
-   struct vkms_composer *primary_composer = NULL;
-   struct vkms_composer *cursor_composer = NULL;
bool crc_pending, wb_pending;
-   void *vaddr_out = NULL;
-   u32 crc32 = 0;
u64 frame_start, frame_end;
+   u32 crc32 = 0;
int ret;
 
spin_lock_irq(&out->composer_lock);
@@ -210,36 +245,9 @@ void vkms_composer_worker(struct work_struct *work)
if (!crc_pending)
return;
 
-   if (crtc_state->num_active_planes >= 1)
-   primary_composer = crtc_state->active_planes[0]->composer;
-
-   if (crtc_state->num_active_planes == 2)
-   cursor_composer = crtc_state->active_planes[1]->composer;
-
-   if (!primary_composer)
-   return;
-
-   if (wb_pending)
-   vaddr_out = crtc_state->active_writeback;
-
-   ret = compose_planes(&vaddr_out, primary_composer, cursor_composer);
-   if (ret) {
-   if (ret == -EINVAL && !wb_pending)
-   kfree(vaddr_out);
+   ret = vkms_composer_common(crtc_state, out, crtc_state->wb_pending, 
&crc32);
+   if (ret == -EINVAL)
return;
-   }
-
-   crc32 = compute_crc(vaddr_out, primary_composer);
-
-   if (wb_pending) {
-   drm_writeback_signal_completion(&out->wb_connector, 0);
-   spin_lock_irq(&out->composer_lock);
-   crtc_state->wb_pending = false;
-   spin_unlock_irq(&out->composer_lock);
-   } else {
-   kfree(vaddr_out);
-   }
-
/*
 * The worker can fall behind the vblank hrtimer, make sure we catch up.
 */
@@ -247,6 +255,20 @@ void vkms_composer_worker(struct work_struct *work)
drm_crtc_add_crc_entry(crtc, true, frame_star