From patchwork Tue Apr 9 11:07:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eugen Hristev X-Patchwork-Id: 10890967 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 55C6C1515 for ; Tue, 9 Apr 2019 11:08:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 405EA286EC for ; Tue, 9 Apr 2019 11:08:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 34FEB28590; Tue, 9 Apr 2019 11:08:12 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B455828590 for ; Tue, 9 Apr 2019 11:08:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726879AbfDILHb (ORCPT ); Tue, 9 Apr 2019 07:07:31 -0400 Received: from esa2.microchip.iphmx.com ([68.232.149.84]:55266 "EHLO esa2.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726112AbfDILHa (ORCPT ); Tue, 9 Apr 2019 07:07:30 -0400 X-IronPort-AV: E=Sophos;i="5.60,329,1549954800"; d="scan'208";a="29738791" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa2.microchip.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 09 Apr 2019 04:07:29 -0700 Received: from NAM05-CO1-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.76.38) with Microsoft SMTP Server (TLS) id 14.3.352.0; Tue, 9 Apr 2019 04:07:29 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchiptechnology.onmicrosoft.com; s=selector1-microchiptechnology-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Fy40osxoOl1PC4sq+lAQ9JLO5R7YNNWYg1FqHbxUQiE=; b=lM23HOeXsTgfedk0rYEgkNuVFAhCRjB6FJXDr67beCSyMYbSgi+FOnp3PEA3gaAwpMto8r1ioYgXruUje1dvMnuG7mL16Wr+E+ZP/0j7BbYPtBqrAA27XrqSoJE6/DKFbeiFYttAxDNtSHyLan2ubH4D9uNawtMq3VM6fLcMDc8= Received: from DM5PR11MB1242.namprd11.prod.outlook.com (10.168.108.8) by DM5PR11MB0011.namprd11.prod.outlook.com (10.164.155.29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1771.19; Tue, 9 Apr 2019 11:07:27 +0000 Received: from DM5PR11MB1242.namprd11.prod.outlook.com ([fe80::e0e3:1d51:9e3e:6dc]) by DM5PR11MB1242.namprd11.prod.outlook.com ([fe80::e0e3:1d51:9e3e:6dc%3]) with mapi id 15.20.1771.021; Tue, 9 Apr 2019 11:07:27 +0000 From: To: , , , , , CC: , Subject: [PATCH 1/7] media: atmel: atmel-isc: add safe checks and fixed wrong ISC state in error case Thread-Topic: [PATCH 1/7] media: atmel: atmel-isc: add safe checks and fixed wrong ISC state in error case Thread-Index: AQHU7sRnq25L58WM2EaOgqX2GZumDQ== Date: Tue, 9 Apr 2019 11:07:21 +0000 Message-ID: <1554807715-2353-2-git-send-email-eugen.hristev@microchip.com> References: <1554807715-2353-1-git-send-email-eugen.hristev@microchip.com> In-Reply-To: <1554807715-2353-1-git-send-email-eugen.hristev@microchip.com> Accept-Language: ro-RO, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: VI1PR09CA0054.eurprd09.prod.outlook.com (2603:10a6:802:28::22) To DM5PR11MB1242.namprd11.prod.outlook.com (2603:10b6:3:14::8) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Eugen.Hristev@microchip.com; x-ms-exchange-messagesentrepresentingtype: 1 x-mailer: git-send-email 2.7.4 x-originating-ip: [94.177.32.154] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 54d39806-c97e-4f58-cea7-08d6bcdb89b4 x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600139)(711020)(4605104)(2017052603328)(7193020);SRVR:DM5PR11MB0011; x-ms-traffictypediagnostic: DM5PR11MB0011: x-microsoft-antispam-prvs: x-forefront-prvs: 000227DA0C x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(346002)(136003)(376002)(366004)(396003)(39850400004)(199004)(189003)(256004)(81166006)(66066001)(486006)(8676002)(36756003)(6666004)(446003)(476003)(5660300002)(81156014)(50226002)(8936002)(71200400001)(71190400001)(14444005)(2616005)(11346002)(6512007)(106356001)(105586002)(7736002)(305945005)(478600001)(4326008)(2201001)(186003)(99286004)(76176011)(6486002)(107886003)(68736007)(97736004)(72206003)(110136005)(14454004)(316002)(53936002)(52116002)(26005)(54906003)(6436002)(6506007)(6116002)(2501003)(2906002)(3846002)(386003)(25786009)(102836004)(86362001);DIR:OUT;SFP:1101;SCL:1;SRVR:DM5PR11MB0011;H:DM5PR11MB1242.namprd11.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;A:1;MX:1; received-spf: None (protection.outlook.com: microchip.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: kKZoQoVvQL0rG8wgj2qE+/ZEDHRsqEaW/e1Jea67AjQJquMn3xjcT/A6i/FvMdOswyWh/zwXa0K6rDSjYLdfyqXfWcLO8Wl275pn/0UR9wlV5woWzNQ/HUpWsH2D1u6jLhzaCiNsaxOlhAXCSoZIPFFWXZyx10UTQVFgpom32D4msUbQRip++z7bkb+MCXDAzB+IlvnV/HLeHTtshJEJqMbScD9Q2kG6XcF/Rzr3kik95H8qpXf1dFrWiWkk9NM1U11PIR8QdviDYNJbKap1ST0aQDaD8IrQJhLa3LagtIlNSIb+TxdY77z4OiAq0P9rloTbSCdOfDCwPCxKByTG5QMn8pAdWEHeYFiI47HqbEys1Yg+17tFg2LdHFkjBsEItoOLXa2zTvkAICxeJhUKy5zLLyCtziZjp0WzsRCcBFA= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: 54d39806-c97e-4f58-cea7-08d6bcdb89b4 X-MS-Exchange-CrossTenant-originalarrivaltime: 09 Apr 2019 11:07:21.8005 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR11MB0011 X-OriginatorOrg: microchip.com Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Eugen Hristev This adds safety checks on some scenarios: - start streaming but streaming is already started - start streaming but no buffer in the dma queue - spin lock is not released in error scenario - no frame is configured but dma is requested to start - configure ISC may have been called without need, before checking if buffer is ok. Signed-off-by: Eugen Hristev --- drivers/media/platform/atmel/atmel-isc.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/drivers/media/platform/atmel/atmel-isc.c b/drivers/media/platform/atmel/atmel-isc.c index a10db16..3c19761 100644 --- a/drivers/media/platform/atmel/atmel-isc.c +++ b/drivers/media/platform/atmel/atmel-isc.c @@ -722,6 +722,11 @@ static void isc_start_dma(struct isc_device *isc) u32 dctrl_dview; dma_addr_t addr0; + if (!isc->cur_frm) { + v4l2_err(&isc->v4l2_dev, "Video buffer not available\n"); + return; + } + addr0 = vb2_dma_contig_plane_dma_addr(&isc->cur_frm->vb.vb2_buf, 0); regmap_write(regmap, ISC_DAD0, addr0); @@ -886,6 +891,9 @@ static int isc_start_streaming(struct vb2_queue *vq, unsigned int count) unsigned long flags; int ret; + if (vb2_is_streaming(&isc->vb2_vidq)) + return -EBUSY; + /* Enable stream on the sub device */ ret = v4l2_subdev_call(isc->current_subdev->sd, video, s_stream, 1); if (ret && ret != -ENOIOCTLCMD) { @@ -896,6 +904,20 @@ static int isc_start_streaming(struct vb2_queue *vq, unsigned int count) pm_runtime_get_sync(isc->dev); + spin_lock_irqsave(&isc->dma_queue_lock, flags); + + isc->sequence = 0; + isc->stop = false; + reinit_completion(&isc->comp); + + if (list_empty(&isc->dma_queue)) { + v4l2_err(&isc->v4l2_dev, "dma queue empty\n"); + ret = -EINVAL; + goto err_configure_unlock; + } + + spin_unlock_irqrestore(&isc->dma_queue_lock, flags); + ret = isc_configure(isc); if (unlikely(ret)) goto err_configure; @@ -905,10 +927,6 @@ static int isc_start_streaming(struct vb2_queue *vq, unsigned int count) spin_lock_irqsave(&isc->dma_queue_lock, flags); - isc->sequence = 0; - isc->stop = false; - reinit_completion(&isc->comp); - isc->cur_frm = list_first_entry(&isc->dma_queue, struct isc_buffer, list); list_del(&isc->cur_frm->list); @@ -919,8 +937,11 @@ static int isc_start_streaming(struct vb2_queue *vq, unsigned int count) return 0; +err_configure_unlock: + spin_unlock_irqrestore(&isc->dma_queue_lock, flags); + err_configure: - pm_runtime_put_sync(isc->dev); + isc->stop = true; v4l2_subdev_call(isc->current_subdev->sd, video, s_stream, 0); @@ -931,6 +952,7 @@ static int isc_start_streaming(struct vb2_queue *vq, unsigned int count) INIT_LIST_HEAD(&isc->dma_queue); spin_unlock_irqrestore(&isc->dma_queue_lock, flags); + pm_runtime_put_sync(isc->dev); return ret; }