Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp542049imm; Mon, 21 May 2018 10:03:56 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqDZt0i67AKgGT/kIaUeNLjytaBnNXhKRTdy6fBXGPeMbQh918TjZ9e2ASGmTP3K9o5brSr X-Received: by 2002:a65:4a87:: with SMTP id b7-v6mr16366634pgu.271.1526922236238; Mon, 21 May 2018 10:03:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526922236; cv=none; d=google.com; s=arc-20160816; b=ANzWssnXSq09b1ksI4zEk/PLdHt+TdM/V9+9yLLw3CqJzwkp337lhkiwHxeH465ATK /sgSNXUzE0+Y4xTiEyFMfgK+oG5b/e0QSSlqo60pu7Izk7SQeiTxbOfo26i6ocebcWqF 4uexjlAarrhpOlMJmWpFDIIvChzW5slwd4RE24GSyfsslcPa5IwYog85FIr5VmDTfYY2 7PBLE0fJX/konGSeXvf8DfM9eE+WCiPPCYqdayH55N+EFSGH/VTOKYZeKFjnY0y8A5WS WF9DD2aOgPf5mLpoNdgHyr2kp1YTkHDLjj23H+hlTMfzzStQCHNHTa6eAE/wInnooF2x JwIg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=MLk38ehRPTpsjC2s1GUH5bn7ALM1XqmgGWqujk6uFMw=; b=Feu6PnUZopcA51ijojY2eHIZGJ062NYuFJvytsQqOA4JPT5zcQCMTBlNi/YNZPmggz npNU+JMzfCZ91UzJgrk8QxCRfA8HiV4zPWJfHVmA3rq1TUMWMEMyC/wtYE1gkzJEDoNL S849e4XMx6ugWmMNkifEh8xPP/2x3M+zMu7ithglzxDdIrLr8hXZovZ/kc2Scm9VVqlU LvNQJHIS5Mx41jZXShK4sVqDQaPamYpcxQd0l9gM36zy7IZ/7Cn32KIxhLmXhJ6QvSRz apopWChtzoObDnxuvAlFLfJI+FpK+tfCPHOozDrVjbZrydmpXr7HUatQGFUksHBLKiqW 4/YA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ay3-v6si14371035plb.361.2018.05.21.10.03.41; Mon, 21 May 2018 10:03:56 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753459AbeEURC7 (ORCPT + 99 others); Mon, 21 May 2018 13:02:59 -0400 Received: from bhuna.collabora.co.uk ([46.235.227.227]:44476 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752986AbeEURC3 (ORCPT ); Mon, 21 May 2018 13:02:29 -0400 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: ezequiel) with ESMTPSA id DDA6C2785B7 From: Ezequiel Garcia To: linux-media@vger.kernel.org Cc: kernel@collabora.com, Hans Verkuil , Mauro Carvalho Chehab , Shuah Khan , Pawel Osciak , Alexandre Courbot , Sakari Ailus , Brian Starkey , linux-kernel@vger.kernel.org, Gustavo Padovan , Ezequiel Garcia Subject: [PATCH v10 15/16] v4l: Add V4L2_CAP_FENCES to drivers Date: Mon, 21 May 2018 13:59:45 -0300 Message-Id: <20180521165946.11778-16-ezequiel@collabora.com> X-Mailer: git-send-email 2.16.3 In-Reply-To: <20180521165946.11778-1-ezequiel@collabora.com> References: <20180521165946.11778-1-ezequiel@collabora.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Gustavo Padovan Drivers that use videobuf2 are capable of using fences and should report that to userspace. v10: - Add CAPS_FENCES to drivers that don't use fh->m2m_ctx. - Keep the ifdef V4L2_MEM2MEM_DEV. - Set CAPS_FENCES after vidioc_querycap. v9: Add in the core. Signed-off-by: Gustavo Padovan Signed-off-by: Ezequiel Garcia --- drivers/media/platform/exynos-gsc/gsc-m2m.c | 3 ++- drivers/media/platform/m2m-deinterlace.c | 3 ++- drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c | 3 ++- .../media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c | 2 +- .../media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c | 3 ++- drivers/media/platform/mx2_emmaprp.c | 3 ++- drivers/media/platform/qcom/venus/vdec.c | 3 ++- drivers/media/platform/qcom/venus/venc.c | 3 ++- drivers/media/platform/sh_veu.c | 3 ++- drivers/media/v4l2-core/v4l2-ioctl.c | 24 +++++++++++++++++++++- 10 files changed, 40 insertions(+), 10 deletions(-) diff --git a/drivers/media/platform/exynos-gsc/gsc-m2m.c b/drivers/media/platform/exynos-gsc/gsc-m2m.c index e9ff27949a91..fbf072c8aedd 100644 --- a/drivers/media/platform/exynos-gsc/gsc-m2m.c +++ b/drivers/media/platform/exynos-gsc/gsc-m2m.c @@ -298,7 +298,8 @@ static int gsc_m2m_querycap(struct file *file, void *fh, strlcpy(cap->card, GSC_MODULE_NAME " gscaler", sizeof(cap->card)); snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s", dev_name(&gsc->pdev->dev)); - cap->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_M2M_MPLANE; + cap->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_M2M_MPLANE | + V4L2_CAP_FENCES; cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; return 0; } diff --git a/drivers/media/platform/m2m-deinterlace.c b/drivers/media/platform/m2m-deinterlace.c index 1e4195144f39..b7421de1268f 100644 --- a/drivers/media/platform/m2m-deinterlace.c +++ b/drivers/media/platform/m2m-deinterlace.c @@ -461,7 +461,8 @@ static int vidioc_querycap(struct file *file, void *priv, * and are scheduled for removal. */ cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OUTPUT | - V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING; + V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING | + V4L2_CAP_FENCES; cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; return 0; diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c b/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c index 583d47724ee8..7aba2ba128ba 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c @@ -1242,7 +1242,8 @@ int mtk_mdp_register_m2m_device(struct mtk_mdp_dev *mdp) ret = -ENOMEM; goto err_video_alloc; } - mdp->vdev->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING; + mdp->vdev->device_caps = V4L2_CAP_FENCES | V4L2_CAP_VIDEO_M2M_MPLANE | + V4L2_CAP_STREAMING; mdp->vdev->fops = &mtk_mdp_m2m_fops; mdp->vdev->ioctl_ops = &mtk_mdp_m2m_ioctl_ops; mdp->vdev->release = video_device_release; diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c index 4334b7394861..75318a4129ea 100644 --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c @@ -321,7 +321,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev) vfd_dec->v4l2_dev = &dev->v4l2_dev; vfd_dec->vfl_dir = VFL_DIR_M2M; vfd_dec->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE | - V4L2_CAP_STREAMING; + V4L2_CAP_STREAMING | V4L2_CAP_FENCES; snprintf(vfd_dec->name, sizeof(vfd_dec->name), "%s", MTK_VCODEC_DEC_NAME); diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c index 83f859e8509c..1c9d4e7262bb 100644 --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c @@ -339,7 +339,8 @@ static int mtk_vcodec_probe(struct platform_device *pdev) vfd_enc->v4l2_dev = &dev->v4l2_dev; vfd_enc->vfl_dir = VFL_DIR_M2M; vfd_enc->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE | - V4L2_CAP_STREAMING; + V4L2_CAP_STREAMING | + V4L2_CAP_FENCES; snprintf(vfd_enc->name, sizeof(vfd_enc->name), "%s", MTK_VCODEC_ENC_NAME); diff --git a/drivers/media/platform/mx2_emmaprp.c b/drivers/media/platform/mx2_emmaprp.c index 5a8eff60e95f..230ad00fc62d 100644 --- a/drivers/media/platform/mx2_emmaprp.c +++ b/drivers/media/platform/mx2_emmaprp.c @@ -401,7 +401,8 @@ static int vidioc_querycap(struct file *file, void *priv, { strncpy(cap->driver, MEM2MEM_NAME, sizeof(cap->driver) - 1); strncpy(cap->card, MEM2MEM_NAME, sizeof(cap->card) - 1); - cap->device_caps = V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING; + cap->device_caps = V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING | + V4L2_CAP_FENCES; cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; return 0; } diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c index 8d7b4fc95880..9da748d05bd9 100644 --- a/drivers/media/platform/qcom/venus/vdec.c +++ b/drivers/media/platform/qcom/venus/vdec.c @@ -1099,7 +1099,8 @@ static int vdec_probe(struct platform_device *pdev) vdev->ioctl_ops = &vdec_ioctl_ops; vdev->vfl_dir = VFL_DIR_M2M; vdev->v4l2_dev = &core->v4l2_dev; - vdev->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING; + vdev->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING | + V4L2_CAP_FENCES; ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); if (ret) diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c index 713c79ba9639..41b25ef2d4dc 100644 --- a/drivers/media/platform/qcom/venus/venc.c +++ b/drivers/media/platform/qcom/venus/venc.c @@ -1243,7 +1243,8 @@ static int venc_probe(struct platform_device *pdev) vdev->ioctl_ops = &venc_ioctl_ops; vdev->vfl_dir = VFL_DIR_M2M; vdev->v4l2_dev = &core->v4l2_dev; - vdev->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING; + vdev->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING | + V4L2_CAP_FENCES; ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); if (ret) diff --git a/drivers/media/platform/sh_veu.c b/drivers/media/platform/sh_veu.c index 1a0cde017fdf..4ad7ec5a197a 100644 --- a/drivers/media/platform/sh_veu.c +++ b/drivers/media/platform/sh_veu.c @@ -351,7 +351,8 @@ static int sh_veu_querycap(struct file *file, void *priv, strlcpy(cap->driver, "sh-veu", sizeof(cap->driver)); strlcpy(cap->card, "sh-mobile VEU", sizeof(cap->card)); strlcpy(cap->bus_info, "platform:sh-veu", sizeof(cap->bus_info)); - cap->device_caps = V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING; + cap->device_caps = V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING | + V4L2_CAP_FENCES; cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; return 0; diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c index 2135ac235a96..4c5e95a0fe6f 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -29,6 +29,7 @@ #include #include #include +#include #include @@ -1002,6 +1003,8 @@ static int v4l_querycap(const struct v4l2_ioctl_ops *ops, { struct v4l2_capability *cap = (struct v4l2_capability *)arg; struct video_device *vfd = video_devdata(file); + struct v4l2_fh *vfh = + test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) ? fh : NULL; int ret; cap->version = LINUX_VERSION_CODE; @@ -1010,7 +1013,26 @@ static int v4l_querycap(const struct v4l2_ioctl_ops *ops, ret = ops->vidioc_querycap(file, fh, cap); - cap->capabilities |= V4L2_CAP_EXT_PIX_FORMAT; + /* If a streaming device has a queue or a m2m context, + * then the device supports explicit sync. + */ + if (cap->device_caps & V4L2_CAP_STREAMING) { + /* + * TODO: Drop these additional queue lock + * checks once we make vb2_queue lock + * mandatory. + */ + if (vfd->queue && vfd->queue->lock) + cap->device_caps |= V4L2_CAP_FENCES; +#if IS_ENABLED(CONFIG_V4L2_MEM2MEM_DEV) + if (vfh && vfh->m2m_ctx && + vfh->m2m_ctx->cap_q_ctx.q.lock && + vfh->m2m_ctx->out_q_ctx.q.lock) + cap->device_caps |= V4L2_CAP_FENCES; +#endif + } + cap->capabilities |= cap->device_caps | V4L2_CAP_EXT_PIX_FORMAT; + /* * Drivers MUST fill in device_caps, so check for this and * warn if it was forgotten. -- 2.16.3