From patchwork Thu May 3 02:42:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Satish Kumar Nagireddy X-Patchwork-Id: 49172 X-Patchwork-Delegate: laurent.pinchart@ideasonboard.com Received: from vger.kernel.org ([209.132.180.67]) by www.linuxtv.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fE4DP-0000EL-EE; Thu, 03 May 2018 02:43:28 +0000 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752024AbeECCnZ (ORCPT + 1 other); Wed, 2 May 2018 22:43:25 -0400 Received: from mail-bl2nam02on0074.outbound.protection.outlook.com ([104.47.38.74]:43344 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751988AbeECCnM (ORCPT ); Wed, 2 May 2018 22:43:12 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=lt4xMyvmLlssgCboNI4C9hoEplHmPJFBG3a+eJlIm38=; b=N+XCx0/YQu2JtmmAiRyCPeilGrMA8+m0+lYOKUT5t+Q+t51zEKsIgYEV9/0OM8DJj4AvJUYhrY4WDKnkHTr/6wivWkECrbnYlCn/8ZcHM9+wJrOxY+yvcWozcHry5OW+HwB/y8YBn9gpMiP2IC79ZwWRfQRfa8UskS+2HYyCSog= Received: from MWHPR0201CA0039.namprd02.prod.outlook.com (2603:10b6:301:73::16) by CY1PR02MB2041.namprd02.prod.outlook.com (2a01:111:e400:c5ab::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.715.24; Thu, 3 May 2018 02:43:09 +0000 Received: from SN1NAM02FT009.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e44::207) by MWHPR0201CA0039.outlook.office365.com (2603:10b6:301:73::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.735.16 via Frontend Transport; Thu, 3 May 2018 02:43:09 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; ideasonboard.com; dkim=none (message not signed) header.d=none;ideasonboard.com; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by SN1NAM02FT009.mail.protection.outlook.com (10.152.73.32) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.715.13 via Frontend Transport; Thu, 3 May 2018 02:43:08 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1fE4D6-0004xE-Cj; Wed, 02 May 2018 19:43:08 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1fE4D1-00058K-92; Wed, 02 May 2018 19:43:03 -0700 Received: from xsj-pvapsmtp01 (smtp2.xilinx.com [149.199.38.66]) by xsj-smtp-dlp2.xlnx.xilinx.com (8.13.8/8.13.1) with ESMTP id w432gtYK009735; Wed, 2 May 2018 19:42:55 -0700 Received: from [172.19.2.23] (helo=xsjsatishna50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1fE4Ct-00057Q-3R; Wed, 02 May 2018 19:42:55 -0700 From: Satish Kumar Nagireddy To: , , , CC: Satish Kumar Nagireddy Subject: [PATCH v5 6/8] v4l: xilinx: dma: Add multi-planar support Date: Wed, 2 May 2018 19:42:51 -0700 Message-ID: X-Mailer: git-send-email 2.1.1 In-Reply-To: References: X-RCIS-Action: ALLOW X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(376002)(346002)(39380400002)(39860400002)(396003)(2980300002)(438002)(199004)(189003)(51234002)(50466002)(305945005)(8676002)(26005)(81166006)(478600001)(47776003)(81156014)(16586007)(59450400001)(2906002)(2201001)(76176011)(9786002)(7696005)(51416003)(5660300001)(106466001)(6636002)(356003)(107886003)(6666003)(50226002)(336012)(476003)(36386004)(2616005)(48376002)(110136005)(126002)(118296001)(8936002)(36756003)(486006)(106002)(186003)(4326008)(77096007)(316002)(446003)(72206003)(11346002)(426003)(63266004)(107986001)(2101003); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR02MB2041; H:xsj-pvapsmtpgw01; FPR:; SPF:Pass; LANG:en; PTR:unknown-60-83.xilinx.com; A:1; MX:1; X-Microsoft-Exchange-Diagnostics: 1; SN1NAM02FT009; 1:4qohQEsetuGv2Iv1y561Sx7erCuZYrUvdW8yNrW+gC5cWY14sC0OvWV1zr9ZjG3nOVCDr6mwNeEXGoH6UIoee4i5Gwsnhbv3TofGTJFockA4n/CSxhaAuA9rkhp5vWzz MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(4608076)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060); SRVR:CY1PR02MB2041; X-Microsoft-Exchange-Diagnostics: 1; CY1PR02MB2041; 3:Te3Vo8LzdTusx5FUJGt1A1Q05nZkah+xzf01PvCgq/JwZ3JPW+P/fBbqMMg4XyTOSERT8txc4mJkd2wZXIltoZCXjkZzZfCtf/DemR0O1HR6zyBCjpLl/Qzrd8eLMq/qUMVKo+hVp7kb3tHbmgCIygpiWNwonuUwmHLwl5ZsFS9DZGU/xtkVVqGclZ0KRnRCVGYAeBz8BqHCf6FDhFxAdEHliAGrIQ5Vsr8iP1iS3yUJZHNpTd8V1z8dteqxIXDMk2z5Srb6M0OtNYbHWgiWP+GxG6n8SBw0DRIY/sDKmIYbvrUVTpDxZFiqm+dgv6b/GPCuShdSERQ42qoIocQpeQYap+BbwYVWJ5PtDpfKRY8=; 25:b3k90+pzeslvgIT/oArItMl+PxO/a24ZG7kmwpR4RDW3gLzm3w5AEqq3W3FYDTKfrdsOGtccOAeOLvq/TpmzOVJ0q4nloLR9kPcak5kbAT1YVobEqMXnX/0rDL3vKGVNKLmXXV6yWt/qbNyohzYYhFKFJ0rZFWtaJynLngp+xou4O4cDQSKAcAtneKT6eB3mFGLYmtZMj/BB3IZ3oogtXKsL7E/OutIxrjI8qjU+EGcsA5BMhurHqlBgOD3JWNSZW5PXh6JIAu/7bshh3XfUiDaw/j9jxbvv+1DDYtAcTEaSU2V0tcDDtKKg1V5xTIP+Hb6HLOicvajnnpJwd63EFw== X-MS-TrafficTypeDiagnostic: CY1PR02MB2041: X-Microsoft-Exchange-Diagnostics: 1; CY1PR02MB2041; 31:eEGgqj7WlMuVizJbxdyEZJO5LV1SElH5b4UWu6F/a8DJxFWeb61beImIC6hUTv+Afi248lAy433eqSQL0QfDIOfP6U/bCDgkLefIxrZzIAZ9FAV60IBtAkKO8DZUCMSPmLVVYWoE1Az4fWbtQWrhXpJjJN4NOf5sDRkZ0sGuxZ6KYKvQ0Ulc2lX13WIazWtdbnNdS5IrmOT2L0T/nUI7VnzsaEi/zlzIC4y9DBl94e0=; 20:dchaLh6nf5pOrb+TYYkP17G0HxAMnoHTM0GD8OSL1Tc6Hhy7Mtlb2ZbbqgaTKfhTx00t4TpFRz5qbUa1lyGA61zSUPHr5EnNuReeDSUUUyYPfMlz6pHb/CyeAUhTInH0Ww0Ci5M7DYWyVOqnoEiY0TefzSgdtTIW8QBVVhEiZNJuBLq74Mh5B9vci0a01lNKffMrlkCIuZqZ3pPw/2TAiNk/TozoKT8mIYX1foXIAdzBeDGRkbYxe5P3NpK9bozrEH8EbhUjOkIHPuHRyMqZ/cz3wBjfsZIo4+jUFShgy+NpORbY8O9R+TsyTp6tw7LX/EFVWU0YfmL8pmHVKT39rizdese8aNC47HE+WTdpFkhdHdhABeGBQj0DWyi4uk3gYAwhXhCY6tnITqgkhENNgpOKcwuMdcCqyCXxLgI3uAKQiah4CTdX6jbC97DpdKeIb8Tzr/U3WNlAT+sKt+b4wJnJjZwPZxyFUBtEA3zWdchPGdqJHbZXKcyZbxGCrvOy X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(10201501046)(3231254)(944501410)(52105095)(3002001)(93006095)(93004095)(6055026)(6041310)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:CY1PR02MB2041; BCL:0; PCL:0; RULEID:; SRVR:CY1PR02MB2041; X-Microsoft-Exchange-Diagnostics: 1; CY1PR02MB2041; 4:MlD61p93I3Z73PRfD6B/c5GdzUI8DDtxbOTm+PtZ13a2AmKYK2G1NvM9H3tIWyR3QUOzNflVNxOcIMqkHACGXfkIxIjzEmcg6LEULJPlvuZzxIkUtdOXgeRzuY56yAvtci3WwHC7OkhCjPkSq+AbN/9oPTItr1W5eLr7nfiypBIhLrPuQihs2Y0yl8nLXdEuiCESSIPosF6CGK8fnawD+bnfMDbd0xrmpioddJRIY5eN3t6h3L3xc3waHUieq1rRss8FfE88YcsJuDOURn6bNjR81nc9AtU++KDJ0uAt69bpSWeH9FVDTMtTpx85SJDa X-Forefront-PRVS: 066153096A X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR02MB2041; 23:xZqcu0y6SQfptr55diagixFJf2EQsGRJKv4VUVvOV?= =?us-ascii?Q?3Hoc9Vw0MS+307ofqwbD4KAU1H2WBh2iW0nfZ6iHfR6dXoUxvdVe1GA8aKQn?= =?us-ascii?Q?JFATfM0SdRIWrkiwSoCNHQxr32SukD2q6Osf5KGdq2laLsPwnacSGh8MKUnw?= =?us-ascii?Q?INvwE1G6TgXif7J+IcLdyfPZpsjsTK9ETjniAAmdVt+SGpNZ7yKExG5+O2OO?= =?us-ascii?Q?+TShSU+L8lIPYjyXFSqumqTPM6WyOPQQmpVH7dHwNBT84t0lmtm36dSKjS6X?= =?us-ascii?Q?6+TGKPEIdgs9Up3oriYXyi0RP/N8GIByxk0nOiU7WOsFaaUJd+mPmXpaplln?= =?us-ascii?Q?sDS+20Le1LN43eMhhdEWu4z/B7EH2PYZA+FZULD8WU+3xjYrA7ql0itq7JUQ?= =?us-ascii?Q?Dktjq6k/VH2RhadZre3iNhY+n44R0eKvJGFmXYxylHSuufua/mYgwJxP8zPc?= =?us-ascii?Q?1yN83viW22dBtT8+Zni2N34826E+zDnBiKFB5aAgWRs+RfLU6ZzUh8tHpBjN?= =?us-ascii?Q?EKBkNEds1tiKVmR3kDlWM3vWz1pzI//cqb7LtpEpGa2mLoGW4eCTjoMnbhtf?= =?us-ascii?Q?50mom4qNabRQ7AuLF17g8dlwAjMtbw1A1guKCWiVEM1JSDp3td1XoV3VOm2m?= =?us-ascii?Q?GHFz8/RCXfm5M+jg7z77apx8tob2MvhvhaEm0uMmKAMq7Z1IwNqpd3xLUiko?= =?us-ascii?Q?PjXhcNkrSwGsHEuaJlNWnqFwLgnO0n5oHHiNl6C+wdbsIfiGPFA1vEyqM7U0?= =?us-ascii?Q?fwdeF0G+wcMcDLR6ZRWxvBUfZNee0vB76/IY8qRs3Oz8XPVEWdzK6fOXzC6I?= =?us-ascii?Q?UUR3lFMjoEaGVRq9i35el4wlnSvya9jNhotBr7yS3GQ8Rp6tp6XtrY+ykRr+?= =?us-ascii?Q?ua3JgJ7MN5zL9zB10Y+WzDXjp8fpmiMkSQJSDMgVY4q7x9W0rVYXJvKO67uI?= =?us-ascii?Q?jaO8EhAZlEY/MrWSeo9ma/LMc5sx3vV7ycSH2s2R4kdr8ZmkktoB4z2Ge/Qe?= =?us-ascii?Q?6j9sdEECIzIhKxiHad7Pxly/F/MCw/amLsWGMW3AlsWeEn/CvILTIksbn/6S?= =?us-ascii?Q?81mtZXGV6G9170eQo9zvZBVOdG+L8q+2uNUJYiFtdnpsnmGLZzIHSbysoCjm?= =?us-ascii?Q?bhwizxlrAbPQlVcpcyokMBX8ha5wSLYLWC+QcXPrcFTWkwC0FtRrF3fPxGgT?= =?us-ascii?Q?nUDUUKToYE5fv93cK1XVyEj9JsHwUp5zHiGDoxbjjku/vhMcry3g5hRtbJu3?= =?us-ascii?Q?X8F3y8V4U6ZrxHFj6s=3D?= X-Microsoft-Antispam-Message-Info: O1n23bTU5doYm39sQnoEA2sBWuM9rfmbA5NxJLtlyPpDjQc+uImSO4VR525/9TCSbM5svePebnxiQZwQwCxb+wFNdlMKJheSz44606yCwpeFdQHt26RiRsGEFN6I8r/Lfqq135zCIIMh64BIooVF3f95MA37GFM41/otvarFgenr/lgbWAOo1xybX3VVOqnd X-Microsoft-Exchange-Diagnostics: 1; CY1PR02MB2041; 6:mgqSJW/+9WcWmJC5ZT6zwN1LOYJESDtUsiM7RPUFTfn0pDGFfJt2qx0adHxEXkWWxFMNuwsa1gmyz9AcpoG4ZkQaPKIXyhk/c5lVaHlzRun+ocwi8EHcJ37pdaL8ZvwV9SrgriMdd/fTq5JGuVF9phNhD/ArUJZU/iv0WjAnNr39QTW6OolubHmGaqMKCCNllARc/r6RT6M72p70sycUS+02qB0+Zg1gQkmRPk7bX1p5nh2pjS3YDunI8nLl+HW0K9JeOgURUdSM7dhChPVmHMx4dV47ye58LR9JTUXmO8d/YJ0sfcJL/wz+LJNyzKeaf7QndLEUiwaSYmd5Q35etzGDUTogZEerj06PTNuO2Rcf0e5uVhNr6CVUxMF9UzJauDSQYpACOarwJkBaRRsxLCRA93DhiKmYVgeVjYw2l3qe7RowaenRl3Eg0fR5mEw1wBfp5uy1jUSG42gAlt0vig==; 5:fQD6gVz5nEuMFZ5Xplv4ILwQoKUYzf2GQlvtsNsGLHw/ZoW3gOQ2PhAh2+1owK4wass5Y85EyArhkXbeKtQGRmfU1cI715wpjiCWq81lVnAqlW/J83cr8/ZIuifmnf25gJUmEji5whvR42BKP9aim/FtW+CpcCCEsTfvtqDgwRE=; 24:KJ/V7PE81ioU50rOQql+/ITADA04d2bOW5OPF4xZTABuEKetFK1CfXs13jjA3c5/BcvFDEzG1l5f+ySjc/T03cJfS29CsfRPON8I/Ubr8go= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR02MB2041; 7:MXB4UabRI8fW8DTutTOo/KSvhW5iEgQgrIO/Y8EfcopvGDSJNhBttiNteIrPTkPuPZf9Z8fZoTVa6mEDNbk8FOEfCmObvwqaBuBsqmTPlGAn2tnjzochmMxt/rVuo8WL+pAsfF5/KZcHpZeFSHA1nzs6fYBk/1JpNnmf6oG8aDUzda0rtD/MXc4SqAK4S5a8ikGnley2TxEOPtMWRzIoCut1EX1j5G+iBkIzquXVP2iQK5P3dBbM1wqQ0aooYza6 X-MS-Office365-Filtering-Correlation-Id: f1e0ce8f-4dcc-450b-467a-08d5b09f9af6 X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 May 2018 02:43:08.6725 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f1e0ce8f-4dcc-450b-467a-08d5b09f9af6 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c; Ip=[149.199.60.83]; Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR02MB2041 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org The current v4l driver supports single plane formats. This patch adds support to handle multi-planar formats. Driver can handle both single and multi-planar formats. Signed-off-by: Satish Kumar Nagireddy --- Changes in v5: - Added default height - Corrected sizeimage declaration with u32 Changes in v4: - Single plane implementation is removed as multi-plane supports both - num_buffers and bpl_factor parameters are removed to have clean implementation drivers/media/platform/xilinx/xilinx-dma.c | 150 +++++++++++++++++----------- drivers/media/platform/xilinx/xilinx-dma.h | 4 +- drivers/media/platform/xilinx/xilinx-vipp.c | 16 +-- 3 files changed, 104 insertions(+), 66 deletions(-) diff --git a/drivers/media/platform/xilinx/xilinx-dma.c b/drivers/media/platform/xilinx/xilinx-dma.c index 518d572..2ffc276 100644 --- a/drivers/media/platform/xilinx/xilinx-dma.c +++ b/drivers/media/platform/xilinx/xilinx-dma.c @@ -74,8 +74,8 @@ static int xvip_dma_verify_format(struct xvip_dma *dma) return ret == -ENOIOCTLCMD ? -EINVAL : ret; if (dma->fmtinfo->code != fmt.format.code || - dma->format.height != fmt.format.height || - dma->format.width != fmt.format.width) + dma->format.fmt.pix_mp.width != fmt.format.width || + dma->format.fmt.pix_mp.height != fmt.format.height) return -EINVAL; return 0; @@ -310,7 +310,8 @@ static void xvip_dma_complete(void *param) buf->buf.field = V4L2_FIELD_NONE; buf->buf.sequence = dma->sequence++; buf->buf.vb2_buf.timestamp = ktime_get_ns(); - vb2_set_plane_payload(&buf->buf.vb2_buf, 0, dma->format.sizeimage); + vb2_set_plane_payload(&buf->buf.vb2_buf, 0, + dma->format.fmt.pix_mp.plane_fmt[0].sizeimage); vb2_buffer_done(&buf->buf.vb2_buf, VB2_BUF_STATE_DONE); } @@ -320,13 +321,15 @@ xvip_dma_queue_setup(struct vb2_queue *vq, unsigned int sizes[], struct device *alloc_devs[]) { struct xvip_dma *dma = vb2_get_drv_priv(vq); + u32 sizeimage; /* Make sure the image size is large enough. */ + sizeimage = dma->format.fmt.pix_mp.plane_fmt[0].sizeimage; if (*nplanes) - return sizes[0] < dma->format.sizeimage ? -EINVAL : 0; + return sizes[0] < sizeimage ? -EINVAL : 0; *nplanes = 1; - sizes[0] = dma->format.sizeimage; + sizes[0] = sizeimage; return 0; } @@ -350,8 +353,9 @@ static void xvip_dma_buffer_queue(struct vb2_buffer *vb) struct dma_async_tx_descriptor *desc; dma_addr_t addr = vb2_dma_contig_plane_dma_addr(vb, 0); u32 flags; + struct v4l2_pix_format_mplane *pix_mp = &dma->format.fmt.pix_mp; - if (dma->queue.type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { + if (dma->queue.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { flags = DMA_PREP_INTERRUPT | DMA_CTRL_ACK; dma->xt.dir = DMA_DEV_TO_MEM; dma->xt.src_sgl = false; @@ -365,10 +369,11 @@ static void xvip_dma_buffer_queue(struct vb2_buffer *vb) dma->xt.src_start = addr; } - dma->xt.frame_size = 1; - dma->sgl[0].size = dma->format.width * dma->fmtinfo->bpp[0]; - dma->sgl[0].icg = dma->format.bytesperline - dma->sgl[0].size; - dma->xt.numf = dma->format.height; + dma->xt.frame_size = dma->fmtinfo->num_planes; + dma->sgl[0].size = pix_mp->width * dma->fmtinfo->bpp[0]; + dma->sgl[0].icg = pix_mp->plane_fmt[0].bytesperline - dma->sgl[0].size; + dma->xt.numf = pix_mp->height; + dma->sgl[0].dst_icg = 0; desc = dmaengine_prep_interleaved_dma(dma->dma, &dma->xt, flags); if (!desc) { @@ -496,11 +501,12 @@ xvip_dma_querycap(struct file *file, void *fh, struct v4l2_capability *cap) cap->capabilities = V4L2_CAP_DEVICE_CAPS | V4L2_CAP_STREAMING | dma->xdev->v4l2_caps; + cap->device_caps = V4L2_CAP_STREAMING; - if (dma->queue.type == V4L2_BUF_TYPE_VIDEO_CAPTURE) - cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; + if (dma->queue.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) + cap->device_caps |= V4L2_CAP_VIDEO_CAPTURE_MPLANE; else - cap->device_caps = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING; + cap->device_caps |= V4L2_CAP_VIDEO_OUTPUT_MPLANE; strlcpy(cap->driver, "xilinx-vipp", sizeof(cap->driver)); strlcpy(cap->card, dma->video.name, sizeof(cap->card)); @@ -524,7 +530,7 @@ xvip_dma_enum_format(struct file *file, void *fh, struct v4l2_fmtdesc *f) if (f->index > 0) return -EINVAL; - f->pixelformat = dma->format.pixelformat; + f->pixelformat = dma->format.fmt.pix_mp.pixelformat; strlcpy(f->description, dma->fmtinfo->description, sizeof(f->description)); @@ -537,13 +543,14 @@ xvip_dma_get_format(struct file *file, void *fh, struct v4l2_format *format) struct v4l2_fh *vfh = file->private_data; struct xvip_dma *dma = to_xvip_dma(vfh->vdev); - format->fmt.pix = dma->format; + format->fmt.pix_mp = dma->format.fmt.pix_mp; return 0; } static void -__xvip_dma_try_format(struct xvip_dma *dma, struct v4l2_pix_format *pix, +__xvip_dma_try_format(struct xvip_dma *dma, + struct v4l2_format *format, const struct xvip_video_format **fmtinfo) { const struct xvip_video_format *info; @@ -551,19 +558,20 @@ __xvip_dma_try_format(struct xvip_dma *dma, struct v4l2_pix_format *pix, unsigned int max_width; unsigned int min_bpl; unsigned int max_bpl; - unsigned int width; + unsigned int width, height; unsigned int align; unsigned int bpl; + struct v4l2_pix_format_mplane *pix_mp = &format->fmt.pix_mp; + struct v4l2_plane_pix_format *plane_fmt = pix_mp->plane_fmt; /* Retrieve format information and select the default format if the * requested format isn't supported. */ - info = xvip_get_format_by_fourcc(pix->pixelformat); + info = xvip_get_format_by_fourcc(pix_mp->pixelformat); if (IS_ERR(info)) info = xvip_get_format_by_fourcc(XVIP_DMA_DEF_FORMAT); - pix->pixelformat = info->fourcc; - pix->field = V4L2_FIELD_NONE; + pix_mp->field = V4L2_FIELD_NONE; /* The transfer alignment requirements are expressed in bytes. Compute * the minimum and maximum values, clamp the requested width and convert @@ -572,22 +580,41 @@ __xvip_dma_try_format(struct xvip_dma *dma, struct v4l2_pix_format *pix, align = lcm(dma->align, info->bpp[0]); min_width = roundup(XVIP_DMA_MIN_WIDTH, align); max_width = rounddown(XVIP_DMA_MAX_WIDTH, align); - width = rounddown(pix->width * info->bpp[0], align); + pix_mp->width = clamp(pix_mp->width, min_width, max_width); + pix_mp->height = clamp(pix_mp->height, XVIP_DMA_MIN_HEIGHT, + XVIP_DMA_MAX_HEIGHT); - pix->width = clamp(width, min_width, max_width) / info->bpp[0]; - pix->height = clamp(pix->height, XVIP_DMA_MIN_HEIGHT, - XVIP_DMA_MAX_HEIGHT); - - /* Clamp the requested bytes per line value. If the maximum bytes per - * line value is zero, the module doesn't support user configurable line - * sizes. Override the requested value with the minimum in that case. + /* + * Clamp the requested bytes per line value. If the maximum + * bytes per line value is zero, the module doesn't support + * user configurable line sizes. Override the requested value + * with the minimum in that case. */ - min_bpl = pix->width * info->bpp[0]; - max_bpl = rounddown(XVIP_DMA_MAX_WIDTH, dma->align); - bpl = rounddown(pix->bytesperline, dma->align); - - pix->bytesperline = clamp(bpl, min_bpl, max_bpl); - pix->sizeimage = pix->bytesperline * pix->height; + max_bpl = rounddown(XVIP_DMA_MAX_WIDTH, align); + min_bpl = pix_mp->width * info->bpp[0]; + min_bpl = roundup(min_bpl, align); + bpl = roundup(plane_fmt[0].bytesperline, align); + plane_fmt[0].bytesperline = clamp(bpl, min_bpl, max_bpl); + + if (info->num_planes == 1) { + /* Single plane formats */ + plane_fmt[0].sizeimage = plane_fmt[0].bytesperline * + pix_mp->height; + } else { + /* + * Supports Multi plane formats in a contiguous buffer, + * so we need only one buffer + */ + unsigned int i; + + plane_fmt[0].sizeimage = 0; + for (i = 0; i < info->num_planes; i++) { + width = plane_fmt[0].bytesperline / + (i ? info->hsub : 1); + height = pix_mp->height / (i ? info->vsub : 1); + plane_fmt[0].sizeimage += width * info->bpp[i] * height; + } + } if (fmtinfo) *fmtinfo = info; @@ -599,7 +626,7 @@ xvip_dma_try_format(struct file *file, void *fh, struct v4l2_format *format) struct v4l2_fh *vfh = file->private_data; struct xvip_dma *dma = to_xvip_dma(vfh->vdev); - __xvip_dma_try_format(dma, &format->fmt.pix, NULL); + __xvip_dma_try_format(dma, format, NULL); return 0; } @@ -610,12 +637,13 @@ xvip_dma_set_format(struct file *file, void *fh, struct v4l2_format *format) struct xvip_dma *dma = to_xvip_dma(vfh->vdev); const struct xvip_video_format *info; - __xvip_dma_try_format(dma, &format->fmt.pix, &info); + __xvip_dma_try_format(dma, format, &info); if (vb2_is_busy(&dma->queue)) return -EBUSY; - dma->format = format->fmt.pix; + dma->format.fmt.pix_mp = format->fmt.pix_mp; + dma->fmtinfo = info; return 0; @@ -623,13 +651,14 @@ xvip_dma_set_format(struct file *file, void *fh, struct v4l2_format *format) static const struct v4l2_ioctl_ops xvip_dma_ioctl_ops = { .vidioc_querycap = xvip_dma_querycap, - .vidioc_enum_fmt_vid_cap = xvip_dma_enum_format, - .vidioc_g_fmt_vid_cap = xvip_dma_get_format, - .vidioc_g_fmt_vid_out = xvip_dma_get_format, - .vidioc_s_fmt_vid_cap = xvip_dma_set_format, - .vidioc_s_fmt_vid_out = xvip_dma_set_format, - .vidioc_try_fmt_vid_cap = xvip_dma_try_format, - .vidioc_try_fmt_vid_out = xvip_dma_try_format, + .vidioc_enum_fmt_vid_cap_mplane = xvip_dma_enum_format, + .vidioc_enum_fmt_vid_out_mplane = xvip_dma_enum_format, + .vidioc_g_fmt_vid_cap_mplane = xvip_dma_get_format, + .vidioc_g_fmt_vid_out_mplane = xvip_dma_get_format, + .vidioc_s_fmt_vid_cap_mplane = xvip_dma_set_format, + .vidioc_s_fmt_vid_out_mplane = xvip_dma_set_format, + .vidioc_try_fmt_vid_cap_mplane = xvip_dma_try_format, + .vidioc_try_fmt_vid_out_mplane = xvip_dma_try_format, .vidioc_reqbufs = vb2_ioctl_reqbufs, .vidioc_querybuf = vb2_ioctl_querybuf, .vidioc_qbuf = vb2_ioctl_qbuf, @@ -662,6 +691,7 @@ int xvip_dma_init(struct xvip_composite_device *xdev, struct xvip_dma *dma, { char name[16]; int ret; + struct v4l2_pix_format_mplane *pix_mp; dma->xdev = xdev; dma->port = port; @@ -671,17 +701,22 @@ int xvip_dma_init(struct xvip_composite_device *xdev, struct xvip_dma *dma, spin_lock_init(&dma->queued_lock); dma->fmtinfo = xvip_get_format_by_fourcc(XVIP_DMA_DEF_FORMAT); - dma->format.pixelformat = dma->fmtinfo->fourcc; - dma->format.colorspace = V4L2_COLORSPACE_SRGB; - dma->format.field = V4L2_FIELD_NONE; - dma->format.width = XVIP_DMA_DEF_WIDTH; - dma->format.height = XVIP_DMA_DEF_HEIGHT; - dma->format.bytesperline = dma->format.width * dma->fmtinfo->bpp[0]; - dma->format.sizeimage = dma->format.bytesperline * dma->format.height; + dma->format.type = type; + + pix_mp = &dma->format.fmt.pix_mp; + pix_mp->pixelformat = dma->fmtinfo->fourcc; + pix_mp->colorspace = V4L2_COLORSPACE_SRGB; + pix_mp->field = V4L2_FIELD_NONE; + pix_mp->width = XVIP_DMA_DEF_WIDTH; + pix_mp->height = XVIP_DMA_DEF_HEIGHT; + pix_mp->plane_fmt[0].bytesperline = pix_mp->width * + dma->fmtinfo->bpp[0]; + pix_mp->plane_fmt[0].sizeimage = pix_mp->plane_fmt[0].bytesperline * + pix_mp->height; /* Initialize the media entity... */ - dma->pad.flags = type == V4L2_BUF_TYPE_VIDEO_CAPTURE - ? MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE; + dma->pad.flags = type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE + ? MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE; ret = media_entity_pads_init(&dma->video.entity, 1, &dma->pad); if (ret < 0) @@ -693,11 +728,14 @@ int xvip_dma_init(struct xvip_composite_device *xdev, struct xvip_dma *dma, dma->video.queue = &dma->queue; snprintf(dma->video.name, sizeof(dma->video.name), "%s %s %u", xdev->dev->of_node->name, - type == V4L2_BUF_TYPE_VIDEO_CAPTURE ? "output" : "input", + type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE + ? "output" : "input", port); + dma->video.vfl_type = VFL_TYPE_GRABBER; - dma->video.vfl_dir = type == V4L2_BUF_TYPE_VIDEO_CAPTURE - ? VFL_DIR_RX : VFL_DIR_TX; + dma->video.vfl_dir = type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE + ? VFL_DIR_RX : VFL_DIR_TX; + dma->video.release = video_device_release_empty; dma->video.ioctl_ops = &xvip_dma_ioctl_ops; dma->video.lock = &dma->lock; diff --git a/drivers/media/platform/xilinx/xilinx-dma.h b/drivers/media/platform/xilinx/xilinx-dma.h index e95d136..96933ed 100644 --- a/drivers/media/platform/xilinx/xilinx-dma.h +++ b/drivers/media/platform/xilinx/xilinx-dma.h @@ -62,7 +62,7 @@ static inline struct xvip_pipeline *to_xvip_pipeline(struct media_entity *e) * @pipe: pipeline belonging to the DMA channel * @port: composite device DT node port number for the DMA channel * @lock: protects the @format, @fmtinfo and @queue fields - * @format: active V4L2 pixel format + * @format: V4L2 format * @fmtinfo: format information corresponding to the active @format * @queue: vb2 buffers queue * @sequence: V4L2 buffers sequence number @@ -83,7 +83,7 @@ struct xvip_dma { unsigned int port; struct mutex lock; - struct v4l2_pix_format format; + struct v4l2_format format; const struct xvip_video_format *fmtinfo; struct vb2_queue queue; diff --git a/drivers/media/platform/xilinx/xilinx-vipp.c b/drivers/media/platform/xilinx/xilinx-vipp.c index 6bb28cd..509b50f 100644 --- a/drivers/media/platform/xilinx/xilinx-vipp.c +++ b/drivers/media/platform/xilinx/xilinx-vipp.c @@ -433,12 +433,15 @@ static int xvip_graph_dma_init_one(struct xvip_composite_device *xdev, if (ret < 0) return ret; - if (strcmp(direction, "input") == 0) - type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - else if (strcmp(direction, "output") == 0) - type = V4L2_BUF_TYPE_VIDEO_OUTPUT; - else + if (strcmp(direction, "input") == 0) { + type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; + xdev->v4l2_caps |= V4L2_CAP_VIDEO_CAPTURE_MPLANE; + } else if (strcmp(direction, "output") == 0) { + type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; + xdev->v4l2_caps |= V4L2_CAP_VIDEO_OUTPUT_MPLANE; + } else { return -EINVAL; + } of_property_read_u32(node, "reg", &index); @@ -454,9 +457,6 @@ static int xvip_graph_dma_init_one(struct xvip_composite_device *xdev, list_add_tail(&dma->list, &xdev->dmas); - xdev->v4l2_caps |= type == V4L2_BUF_TYPE_VIDEO_CAPTURE - ? V4L2_CAP_VIDEO_CAPTURE : V4L2_CAP_VIDEO_OUTPUT; - return 0; }