From nobody Sun Dec 14 19:30:16 2025 Received: from PAUP264CU001.outbound.protection.outlook.com (mail-francecentralazon11021129.outbound.protection.outlook.com [40.107.160.129]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 691262951AD; Fri, 23 May 2025 13:42:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.160.129 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748007770; cv=fail; b=KzsJQaE31d0083zM4H4M3t4af5xJGiBwZ7eRU3rGsbGdtGxymXfQOxA9TO0fDXkhJlTFkXx4/nmhJu0uyhVwcOkR8YG0qxdkkPB7iqWEQrKx7iAe/s+TdePfnpGQM9Rxod0hlmOYMdZyIDXIqH6+bSpvmpRpCPA4YZ3rq0wHx3w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748007770; c=relaxed/simple; bh=KpFIi1Ajn5sYFOWrrAErHNfNCx43waXiHs0hqm5lHtc=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=UMtMWQ9+tYYRLbJIK7RAZUwbbQ180nCAGTOFHiOh6gFSN/vYgDLChSPqpElq+6JjdDhX3gmBZnssc0ipv2xSeXvuPG2waZByKu/o4OOYUraiepeois4iCW4iialplUBFt+PCkCAcIzRYpY6zHdH/9+pEGTihNe0I4bRuewmfZP4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=allegrodvt.com; spf=pass smtp.mailfrom=allegrodvt.com; dkim=pass (2048-bit key) header.d=allegrodvt.com header.i=@allegrodvt.com header.b=nB9eSYUL; arc=fail smtp.client-ip=40.107.160.129 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=allegrodvt.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=allegrodvt.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=allegrodvt.com header.i=@allegrodvt.com header.b="nB9eSYUL" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=p4pXSwbKMt95xY6jGXeTTprddtxYdOHY4/n6gFHkRdNfht777jHglWz4DezOCe1JdGaLNTr8IGj4m1om1h8pSuN+AK5OB4C8RBv9wQa3me/x4nZUth0+BrXBChjR1CHQsnfXIAY6LC9csj7NnzzhDnokEsGUkRtr5Im+IhuYapIqnyu3yH7t+XkB9nO/XiCRKzeGVu3XjeXVRTGFsIUIHlsbaPchoST3b+CeJdGrJPR9YT+vmzv/cmkQhEsrleJr1EHZVAFy0P1rRIdePkYadoiN3X7KpFaAwrOPWWME9QJ+eTXQZHOp8g7r5MNpfnvWH7DPE3Re27zKj7Htxe2geg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=bzUazx6iBs64AEsyxJAiqGGwIlTSdMC1yjC1DXGxq8o=; b=zK3cbfwXLsktUTGcu1xPyyCwZy+LEY7XupoNY6KG0rlfPPtP6xpS3zyprnSjNBXxW9v/ocvHxl1G/j2AcjMih0mV0uu6zPMq6Au0Dz/jY6Io9zKNCyZGphtzBEMSeCajOwVbL3TuFwWA/s06GKt3+Cq7xztDRYMWsH4XsLM6G2SZ1QRqFhNcPXalIQAOeEjW6cRlfwqrZcIgfWWNBKAeBEgSyWN4Py/Cc0XVepHyI7gp8mB3xZ+lATxgGhOsaY7Lyd9vXaFCQf6jIu0z8dnDuIZE8aA1Fs2D4MbVlmPKma0ZTcexzii3l7vuIFLN8dnfGcKntuxb7rwvBJVNn8NFVw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=allegrodvt.com; dmarc=pass action=none header.from=allegrodvt.com; dkim=pass header.d=allegrodvt.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=allegrodvt.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=bzUazx6iBs64AEsyxJAiqGGwIlTSdMC1yjC1DXGxq8o=; b=nB9eSYUL3sAVS4paGqc5nOxy1OEeCYDzBX9DccKDRZqae/6j6AuA24OYowu2sova6izmBrUmC8PoRcP3fmZANu1DGStV0m13Rts7Kfqbvl4rsjlDJfPn9yUy8skhH7dWRAg1UGrLJIczzmvI4LxsQMnZT9nEscdG34zHVtmYHxg3A2h4cwAMNF/0+CFZta0y0dylhreScOfmGmaAomStdjb9LZoXSJYAMMBYbpMYMdSkCPCNr9jsSZ3EBZa7Rf3IbFJCH3c5J00ekLLdDTS8KJeHA4+pL7Mx4MixhhPY3kggWjmfwziyw1utKZRe+7ZMRIXI5Z6BvP7C8k6yaqqYsw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=allegrodvt.com; Received: from MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:3d::18) by PATP264MB4619.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:428::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8769.22; Fri, 23 May 2025 13:42:43 +0000 Received: from MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM ([fe80::4281:c926:ecc4:8ba5]) by MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM ([fe80::4281:c926:ecc4:8ba5%2]) with mapi id 15.20.8769.019; Fri, 23 May 2025 13:42:43 +0000 From: Yassine Ouaissa To: Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Michael Tretter , Yassine OUAISSA , Pengutronix Kernel Team , Michal Simek , Neil Armstrong , Heiko Stuebner , Junhao Xie , =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= , Manivannan Sadhasivam , Kever Yang , Hans Verkuil , Christophe JAILLET , Sebastian Fricke , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , Joe Hattori , Wolfram Sang , Gaosheng Cui , Ricardo Ribalda , linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 1/5] media: allegro-dvt: Move the current driver to a subdirectory Date: Fri, 23 May 2025 15:41:46 +0200 Message-Id: <20250523134207.68481-2-yassine.ouaissa@allegrodvt.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250523134207.68481-1-yassine.ouaissa@allegrodvt.com> References: <20250523134207.68481-1-yassine.ouaissa@allegrodvt.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PR0P264CA0178.FRAP264.PROD.OUTLOOK.COM (2603:10a6:100:1c::22) To MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:3d::18) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MR1P264MB3140:EE_|PATP264MB4619:EE_ X-MS-Office365-Filtering-Correlation-Id: a9a01d2d-c140-497b-1fad-08dd99ffb1e0 X-LD-Processed: 6c7a5ec0-2d92-465a-a3e1-9e3f1e9fd917,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|7416014|376014|366016|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?jHYkvkjHYnxyzttceJgnZVaZAJ22bO8ZG7UXznnPCh9FYYlrZRk3FMYaUP5J?= =?us-ascii?Q?8aHQCQpkrg8qleLGu2qQYuy9MmilDQzOsyjY3eroqyR+SVYQLBjUn78nkDzd?= =?us-ascii?Q?9zGN5lZEy7bifUcjnN0laM3Y0EZ5fOrYMSMVUzSXvjcuGdGjFIvd7JOgMYrY?= =?us-ascii?Q?PZ3UDI+I5/VEkXRotONXSxxJ0k10f2DCqcjowgkcASoppvN9X9mnERmIY07R?= =?us-ascii?Q?iNIfaC5S/LeMP6o7OzascsRAXcMx88j59e4cGksz/o7A8bTws7dewv0Ghc5P?= =?us-ascii?Q?vH+utaU6pJebpVz2l+3RZddTFilhnQ9XqRutwu7v4ri7i5ex49ps/dQUwGB9?= =?us-ascii?Q?4doxD9Ye5WEGhGabzT0B09SdxvsxhNnIYSrmN6PWNFV4z2IiTUR+xyHrU7Ch?= =?us-ascii?Q?IQeS6YxiudXwgiEMbO9fmp6//ZfAOZVyCt+aJAwHNTr7c09hmthEo/XuAGwt?= =?us-ascii?Q?Acd5VZQ+sRWHYesU3b4ET/2+cJMrNikHRuEvg+7CraMyykuJUzVwi4ul9Iee?= =?us-ascii?Q?nBnGalqQqKc7AUw3+3oTCaPdemnpZWSSvaJNZ8ltGPnnDI0Ho15iD2UWgPbH?= =?us-ascii?Q?02QFWhZ94TBT5JtN3XUruvgDqAn02ahLP+sX8sTpYhe3+XZRKSojcXc1cjLY?= =?us-ascii?Q?6dSW2kWUkysn3b1pgEQQMHWcraznlWenn6SI5IePTQzfRfWx1dkzrd+hmEp0?= =?us-ascii?Q?Pz+AgBnwuF+dUhFK/dMdeOvd3jKb0GpQk5MW0Y8jEAF1WEqm+xBs/ad6iF/g?= =?us-ascii?Q?J/vQt+7031YIwIeWe9AlAUFdhDb+72xIlo7KYhdgsHfEzdf1XypljYcW5dqt?= =?us-ascii?Q?vRZU8HWyFdm9zAiETFcpYJvzUadsk4uOiDICHZF2BB8gsSGjw3GrxpE1C9oN?= =?us-ascii?Q?AtF/ruimsOWjTsQTPdncLs0BFy8jQ5vn786BwySPDAbwKtjTHEEhrRB/visH?= =?us-ascii?Q?LhsR9Fc2JPXFiQ7Tr1C85NTZDzu4C6/BgPK2ALu/uAnMs5c8nfsofsfpvDcZ?= =?us-ascii?Q?c1WMTo7tSsgMVaATU8O+/oIEko9+N5YqDuwM7j3tdgjSnW0UKvB8bPBqnQGl?= =?us-ascii?Q?eWacxVIn8+eeHcP3S/jsFj1HJWPebAU0mbtr1IKpCtEBQ+ogd2DyItcDmZCi?= =?us-ascii?Q?JNFJ16gsZE7IiXvnJBNdwvH+GWOeua/Kleb1ObLzA4TsJks8bJmWFZl1Og8J?= =?us-ascii?Q?8kPDPuRA+Fzpm/kMVrGesKTHcFIHZ45bG/Yr9wbb6BJlv2NjW08XtCGX4xHs?= =?us-ascii?Q?jvK3xwaIirvxhdCD0ksZB64F/vgbjNsX5k17J8yC1ApHsueaJNoAHzr6szWe?= =?us-ascii?Q?6YgFtpGR6/6SFn1nXJLDenVJqVfYjtonMssA3phNi8h+Ngg1C8wY1inOrodH?= =?us-ascii?Q?S4DHOrcOsmn65LfhdmWRvoH8wYYnq8m5DyobXiIdtWIaMBgfwlNjI4+qqByo?= =?us-ascii?Q?plTI4nLoaHrGhkQw/h6RFNtAm+WNt/3PsTg9aIKI0cX4sl2e3/9reA=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(7416014)(376014)(366016)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?7rebvBuc2L+RplWe11wiFpl5RZ9IPrKNkIsGhcnVlwl8Q0DyGkeFH+cpaKrj?= =?us-ascii?Q?PWnrT/uFZrWDmVOBfPtXuXJHYFVZPbv/Tu9wBSEileB6pxczIoL7lDeSyV6F?= =?us-ascii?Q?haJiY2ERc1xeAMRbxL/eWO8iH6F3iJ2qjHb1RQVObTUk00YS+txFr+TLChuZ?= =?us-ascii?Q?8aRBpBnjahpPtpcr/qF9TkWGF+Hjup4YkirkxcFp4FqTxSnQZLu6QZ1PtFof?= =?us-ascii?Q?lbA2+e/lmxqDBSEIcYfd0/LmA0ZzbjrlyofCJ+l67OTZnJVREjLFhH0ucYBT?= =?us-ascii?Q?7fm6sx47Iv8C2OMv0w1DZhDPlKTCxqPnC0HjUq3OsBCLOn14gL9KcMqcFS13?= =?us-ascii?Q?H87o44bBGvSCKBkWHhQhtnWN+2O3ptmLUtLsQDzboC658N9+jSnYZrKUDoPW?= =?us-ascii?Q?xN8FC7Vc0WVT6DcKJ+KRknx846HGblK3mqvpVU2qwXpVNlbr08TQkTA2DP1j?= =?us-ascii?Q?6MqWALcTT/hocp2uh5xL5ifip12k2zbGyk6vcddyx3EkF1fsO5frGOQhujgE?= =?us-ascii?Q?4X7W4iLj58WBCn9HPO/5oqVuk4uBVgWSR6/UiygDc2YwcNfm5cNBUfJ20hdk?= =?us-ascii?Q?CZ2hzM8T3rbGO5huxlu0Ev6W+Rf31EsGiYE2TtyZm7ZhZDil/7JNZ8tSS6zf?= =?us-ascii?Q?ytqqzGDC+yCJoILEwiiqYYVo4GcLpFphmZKeEQ1GjVxHtfBshYbb/FpP129O?= =?us-ascii?Q?aWZ8Gao3vXlE/hpAYKgrjNN8WDJcVd6nw3QCdB5u+HVvCHvDsBClyBM9q6ct?= =?us-ascii?Q?gURoAcP7dXfxXoRQQNhmV0LgiY1ZEiL8J4dypbRr87k8L64kCQARGr6xXRC5?= =?us-ascii?Q?RhNp1fmpPlir88EnHnv56kId+UaFTG0NwKQP6RHSigD3cvBg8cZiA2Ym4owC?= =?us-ascii?Q?CQrS0x2f/zwh7ij4GVwYcID3IpNKQtseGMQBgCp+BiJOX5R7xzMMsmjfxbi2?= =?us-ascii?Q?kTtp8NxqxP3S1/rcIWTzhTylOF/2Qqf5UZ1NdPibREqtGKV9pj6NaS1INPUU?= =?us-ascii?Q?nep4GSwuiWn7w9kiCkXAetAyL5WqJAL4mqLCroQZ6+CvQrxFob8aXZD60wc1?= =?us-ascii?Q?Zo9D+NH02aesG4irOZOsyhU7z4rNhB28TDciER3A3drWetM/gntYdxBH+qXK?= =?us-ascii?Q?yj6x/OZELxvjMZq5paqz4VLB2c+7YNTxqbIm5s3+vexG01/eJfLX4+FSe+nj?= =?us-ascii?Q?ZV1LNU0bxjQGy/R27kkN/gicQ4RZw5xbjFlZMx8tyBM+ElRUMb697ZQRF5QV?= =?us-ascii?Q?vG5OgioEdK+0C9e10S5+yzXNs56upV57jLvsrsYZhDBPk0psApSdNrdvmFvn?= =?us-ascii?Q?TqCF9/Pywwg7q6qdrchmIezLaDCwIvrTh04HCgLWjB7DyIwuY3SNc+NlkJ96?= =?us-ascii?Q?wFFlU6ze2XVfynoLeXRR+XE5gcT+ppvw3In+/88YbdLVBub7y6WUvF75DKp5?= =?us-ascii?Q?z7/34WKxokTHz/9yCnvb7d1r38diyyfx7kMM/fSA5HTd9sjEnU600T6Ww7nZ?= =?us-ascii?Q?81SnSbPjkLMKj5rkWyMq/2CVJlcCbFXVvJqrG2ukJK5quKrdDaNaSQVZEELr?= =?us-ascii?Q?0qV7KnDNs0j3thML+qud/KCjEGOVFN6d+84PB/s+U9QVvSLxQHd3HVOkHuD7?= =?us-ascii?Q?l4Gz4uP1O2vMOh0TtHIxgZrsuEpldY+Tn+EIgWzhlvyWa1tktWZoQv7YB1Vi?= =?us-ascii?Q?Iqp8aA=3D=3D?= X-OriginatorOrg: allegrodvt.com X-MS-Exchange-CrossTenant-Network-Message-Id: a9a01d2d-c140-497b-1fad-08dd99ffb1e0 X-MS-Exchange-CrossTenant-AuthSource: MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 May 2025 13:42:43.8344 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 6c7a5ec0-2d92-465a-a3e1-9e3f1e9fd917 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Riv+3hnJ/xbnlkSZT3Q9T8vbHVTYNoV9OPz34oyk8myePGDs+tyCfvZuzepv2c0Px/8QbVTjEUqsYPyxAAmk4Gf8XYkvt5fQOX6B65Xi99c= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PATP264MB4619 Content-Type: text/plain; charset="utf-8" In preparation for the upcoming driver update, we need to relocate the current driver. This will help ensure a clean transition and avoid any potential conflicts with the new driver. This patch is crucial for keeping our directory organized and facilitating a smooth integration of the new driver. Signed-off-by: Yassine Ouaissa Reviewed-by: or Acked-by:, please make sure to edit your commit message --- MAINTAINERS | 2 +- drivers/media/platform/allegro-dvt/Kconfig | 16 +--------------- drivers/media/platform/allegro-dvt/Makefile | 5 +---- .../media/platform/allegro-dvt/zynqmp/Kconfig | 17 +++++++++++++++++ .../media/platform/allegro-dvt/zynqmp/Makefile | 6 ++++++ .../allegro-dvt/{ =3D> zynqmp}/allegro-core.c | 0 .../allegro-dvt/{ =3D> zynqmp}/allegro-mail.c | 0 .../allegro-dvt/{ =3D> zynqmp}/allegro-mail.h | 0 .../allegro-dvt/{ =3D> zynqmp}/nal-h264.c | 0 .../allegro-dvt/{ =3D> zynqmp}/nal-h264.h | 0 .../allegro-dvt/{ =3D> zynqmp}/nal-hevc.c | 0 .../allegro-dvt/{ =3D> zynqmp}/nal-hevc.h | 0 .../allegro-dvt/{ =3D> zynqmp}/nal-rbsp.c | 0 .../allegro-dvt/{ =3D> zynqmp}/nal-rbsp.h | 0 14 files changed, 26 insertions(+), 20 deletions(-) create mode 100644 drivers/media/platform/allegro-dvt/zynqmp/Kconfig create mode 100644 drivers/media/platform/allegro-dvt/zynqmp/Makefile rename drivers/media/platform/allegro-dvt/{ =3D> zynqmp}/allegro-core.c (1= 00%) rename drivers/media/platform/allegro-dvt/{ =3D> zynqmp}/allegro-mail.c (1= 00%) rename drivers/media/platform/allegro-dvt/{ =3D> zynqmp}/allegro-mail.h (1= 00%) rename drivers/media/platform/allegro-dvt/{ =3D> zynqmp}/nal-h264.c (100%) rename drivers/media/platform/allegro-dvt/{ =3D> zynqmp}/nal-h264.h (100%) rename drivers/media/platform/allegro-dvt/{ =3D> zynqmp}/nal-hevc.c (100%) rename drivers/media/platform/allegro-dvt/{ =3D> zynqmp}/nal-hevc.h (100%) rename drivers/media/platform/allegro-dvt/{ =3D> zynqmp}/nal-rbsp.c (100%) rename drivers/media/platform/allegro-dvt/{ =3D> zynqmp}/nal-rbsp.h (100%) diff --git a/MAINTAINERS b/MAINTAINERS index fa1e04e87d1d..d81d2756cb2e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -806,7 +806,7 @@ R: Pengutronix Kernel Team L: linux-media@vger.kernel.org S: Maintained F: Documentation/devicetree/bindings/media/allegro,al5e.yaml -F: drivers/media/platform/allegro-dvt/ +F: drivers/media/platform/allegro-dvt/zynqmp =20 ALLIED VISION ALVIUM CAMERA DRIVER M: Tommaso Merciai diff --git a/drivers/media/platform/allegro-dvt/Kconfig b/drivers/media/pla= tform/allegro-dvt/Kconfig index 2182e1277568..e9008614c27b 100644 --- a/drivers/media/platform/allegro-dvt/Kconfig +++ b/drivers/media/platform/allegro-dvt/Kconfig @@ -2,18 +2,4 @@ =20 comment "Allegro DVT media platform drivers" =20 -config VIDEO_ALLEGRO_DVT - tristate "Allegro DVT Video IP Core" - depends on V4L_MEM2MEM_DRIVERS - depends on VIDEO_DEV - depends on ARCH_ZYNQMP || COMPILE_TEST - select V4L2_MEM2MEM_DEV - select VIDEOBUF2_DMA_CONTIG - select REGMAP_MMIO - help - Support for the encoder video IP core by Allegro DVT. This core is - found for example on the Xilinx ZynqMP SoC in the EV family and is - called VCU in the reference manual. - - To compile this driver as a module, choose M here: the module - will be called allegro. +source "drivers/media/platform/allegro-dvt/zynqmp/Kconfig" diff --git a/drivers/media/platform/allegro-dvt/Makefile b/drivers/media/pl= atform/allegro-dvt/Makefile index 66108a303774..d2aa6875edcf 100644 --- a/drivers/media/platform/allegro-dvt/Makefile +++ b/drivers/media/platform/allegro-dvt/Makefile @@ -1,6 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 =20 -allegro-objs :=3D allegro-core.o allegro-mail.o -allegro-objs +=3D nal-rbsp.o nal-h264.o nal-hevc.o - -obj-$(CONFIG_VIDEO_ALLEGRO_DVT) +=3D allegro.o +obj-y +=3D zynqmp/ diff --git a/drivers/media/platform/allegro-dvt/zynqmp/Kconfig b/drivers/me= dia/platform/allegro-dvt/zynqmp/Kconfig new file mode 100644 index 000000000000..0a0a697c420d --- /dev/null +++ b/drivers/media/platform/allegro-dvt/zynqmp/Kconfig @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: GPL-2.0-only + +config VIDEO_ALLEGRO_DVT + tristate "Allegro DVT Video IP Core for ZynqMP" + depends on V4L_MEM2MEM_DRIVERS + depends on VIDEO_DEV + depends on ARCH_ZYNQMP || COMPILE_TEST + select V4L2_MEM2MEM_DEV + select VIDEOBUF2_DMA_CONTIG + select REGMAP_MMIO + help + Support for the encoder video IP core by Allegro DVT. This core is + found for example on the Xilinx ZynqMP SoC in the EV family and is + called VCU in the reference manual. + + To compile this driver as a module, choose M here: the module + will be called allegro. diff --git a/drivers/media/platform/allegro-dvt/zynqmp/Makefile b/drivers/m= edia/platform/allegro-dvt/zynqmp/Makefile new file mode 100644 index 000000000000..66108a303774 --- /dev/null +++ b/drivers/media/platform/allegro-dvt/zynqmp/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0 + +allegro-objs :=3D allegro-core.o allegro-mail.o +allegro-objs +=3D nal-rbsp.o nal-h264.o nal-hevc.o + +obj-$(CONFIG_VIDEO_ALLEGRO_DVT) +=3D allegro.o diff --git a/drivers/media/platform/allegro-dvt/allegro-core.c b/drivers/me= dia/platform/allegro-dvt/zynqmp/allegro-core.c similarity index 100% rename from drivers/media/platform/allegro-dvt/allegro-core.c rename to drivers/media/platform/allegro-dvt/zynqmp/allegro-core.c diff --git a/drivers/media/platform/allegro-dvt/allegro-mail.c b/drivers/me= dia/platform/allegro-dvt/zynqmp/allegro-mail.c similarity index 100% rename from drivers/media/platform/allegro-dvt/allegro-mail.c rename to drivers/media/platform/allegro-dvt/zynqmp/allegro-mail.c diff --git a/drivers/media/platform/allegro-dvt/allegro-mail.h b/drivers/me= dia/platform/allegro-dvt/zynqmp/allegro-mail.h similarity index 100% rename from drivers/media/platform/allegro-dvt/allegro-mail.h rename to drivers/media/platform/allegro-dvt/zynqmp/allegro-mail.h diff --git a/drivers/media/platform/allegro-dvt/nal-h264.c b/drivers/media/= platform/allegro-dvt/zynqmp/nal-h264.c similarity index 100% rename from drivers/media/platform/allegro-dvt/nal-h264.c rename to drivers/media/platform/allegro-dvt/zynqmp/nal-h264.c diff --git a/drivers/media/platform/allegro-dvt/nal-h264.h b/drivers/media/= platform/allegro-dvt/zynqmp/nal-h264.h similarity index 100% rename from drivers/media/platform/allegro-dvt/nal-h264.h rename to drivers/media/platform/allegro-dvt/zynqmp/nal-h264.h diff --git a/drivers/media/platform/allegro-dvt/nal-hevc.c b/drivers/media/= platform/allegro-dvt/zynqmp/nal-hevc.c similarity index 100% rename from drivers/media/platform/allegro-dvt/nal-hevc.c rename to drivers/media/platform/allegro-dvt/zynqmp/nal-hevc.c diff --git a/drivers/media/platform/allegro-dvt/nal-hevc.h b/drivers/media/= platform/allegro-dvt/zynqmp/nal-hevc.h similarity index 100% rename from drivers/media/platform/allegro-dvt/nal-hevc.h rename to drivers/media/platform/allegro-dvt/zynqmp/nal-hevc.h diff --git a/drivers/media/platform/allegro-dvt/nal-rbsp.c b/drivers/media/= platform/allegro-dvt/zynqmp/nal-rbsp.c similarity index 100% rename from drivers/media/platform/allegro-dvt/nal-rbsp.c rename to drivers/media/platform/allegro-dvt/zynqmp/nal-rbsp.c diff --git a/drivers/media/platform/allegro-dvt/nal-rbsp.h b/drivers/media/= platform/allegro-dvt/zynqmp/nal-rbsp.h similarity index 100% rename from drivers/media/platform/allegro-dvt/nal-rbsp.h rename to drivers/media/platform/allegro-dvt/zynqmp/nal-rbsp.h --=20 2.30.2 From nobody Sun Dec 14 19:30:16 2025 Received: from PAUP264CU001.outbound.protection.outlook.com (mail-francecentralazon11021072.outbound.protection.outlook.com [40.107.160.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B5F97293B7C; Fri, 23 May 2025 13:43:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.160.72 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748007792; cv=fail; b=Gr/2Pb/n8CErplaRM65Xnqd8V9KhxG2ERv0s+rkfwgHQZ0v3CAPFwcNtPykS2BFOSiYySg0SnGoB80Yk1YILaRtgbC94jADDu8yuCxnbGwx5pUku+PXOs3E/tQs56O6P0+hEmLihEsr8B1PLBMP4NhZaC2fiX/YZ3WHS5RFCXWE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748007792; c=relaxed/simple; bh=EnudffPALagR/MOOeNz4GC/eTjIMHYr6jk2/bf/Gz9Y=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=MSIbyxXwjHYqjYezirmshtay7hfkpAQfoBJff3qlGuVglGhTnLJaW8iP3g+HLu0tP5fueoL0lfevAWABDdruefu3+S8Jor+SWxqlxW6uyr2Fs3PY2cARMYd1rl4+SWBhBJbJaOUJ6WRRpHy+Avf+12eQ/lbXO0P7KeT+V+efOIs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=allegrodvt.com; spf=pass smtp.mailfrom=allegrodvt.com; dkim=pass (2048-bit key) header.d=allegrodvt.com header.i=@allegrodvt.com header.b=L6mXB9U8; arc=fail smtp.client-ip=40.107.160.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=allegrodvt.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=allegrodvt.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=allegrodvt.com header.i=@allegrodvt.com header.b="L6mXB9U8" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Ti8xHvZnlRcVfKsxAO4z2byAwdeoLW7zQkf2lpNTB2n88hcwt94Ch8NPkW0vbAdKQ6Hbbq7kwVWTygN1wVCTiJCiG3AyoCw9le9bMxqUbLbpE75TJHOQR6meceUGQsofTSEKKP7s3aykKp/Jbc2Ijgrkya1n/5QInDauXc5cclLMNhan3FtEooMYG8uXJI/DzBMXFObu6yOFckZs2NaYLV/ZfU/jH2tzuglWe/5DCNWNfnl/q5sGMLEMdHg/TtimRU6As4lBUCrdcUQZ1Z6tu9x65iNsjW8cJT6bQ+AkhYfT4K2zZoPDtzAjH1FmgDDidlikfHei5O09BsilWcCl5Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=StAOPmEuwx31Gv/QcciJ0JcKEYHZGf5nk+Ep1DjQS+k=; b=r70kkoSzc4CUaK1/YZq/BwXV7GGx0nAdgawDyCjgA//WWxuLuAA4ZtSHGzDsS+Jbr987y/1XcDdM3lvvqa+z5BMDHAiJan00fkrWgVh4+7YaPy+F62MxyH4jOjXFrnBYLbx7/VsKU7MOJ5ujwSgVNpSrC9ZjJCVaNNAeXMytYLMXi734fO9na4ncgrfoWWPAs5F3dBrBPduJcFtAEOsCgICIaAV1vGOj+bMpSmlzhIyeVttGTQuJ0Yi4dSekZsBSaDVNaUsWwdpME9dbWo9ULGprpUA5iqZEmMiRjhCEKxfMxlzpZxHvN0Hm8KP4bwvFE4UN/FdLOYRn0Xzdl9dgwQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=allegrodvt.com; dmarc=pass action=none header.from=allegrodvt.com; dkim=pass header.d=allegrodvt.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=allegrodvt.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=StAOPmEuwx31Gv/QcciJ0JcKEYHZGf5nk+Ep1DjQS+k=; b=L6mXB9U8HeSgDVEXb+FuATIScEF203dQnLJr2w//pzlo06H20m6ClFCkoFEPQdQzjSctBvh9Fp4zins/725h2xDqPNGXGuCHXS8AH6FlsZowyK4VnyIVvhWtmipyiU01KOzf5/BRhcYyzylZmbkda934EqB2gW8d3lUGbVJNegC/RzG7xahw1xbk47Nn7Rf3IA3y6VhAHSM7KGCpRuapPtn/KgCEwk/vRGtNEbhtXtfI79KUtg+ZH0m1azp22XjgFXFcEAS0j1voxZK8lNnPnAsCi5rm15yREIvUJFbxZuTlCmuOG5Eh/M04CPWvQGpUMpbwxj/fqzdt72Y1JMI4ig== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=allegrodvt.com; Received: from MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:3d::18) by PATP264MB4619.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:428::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8769.22; Fri, 23 May 2025 13:43:07 +0000 Received: from MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM ([fe80::4281:c926:ecc4:8ba5]) by MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM ([fe80::4281:c926:ecc4:8ba5%2]) with mapi id 15.20.8769.019; Fri, 23 May 2025 13:43:07 +0000 From: Yassine Ouaissa To: Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Michael Tretter , Yassine OUAISSA , Pengutronix Kernel Team , Michal Simek , Heiko Stuebner , Neil Armstrong , Junhao Xie , =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= , Kever Yang , Manivannan Sadhasivam , Hans Verkuil , Christophe JAILLET , Sebastian Fricke , Gaosheng Cui , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , Joe Hattori , Wolfram Sang , Ricardo Ribalda , linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 2/5] dt-bindings: media: allegro-dvt: add decoder dt-bindings for Gen3 IP Date: Fri, 23 May 2025 15:41:47 +0200 Message-Id: <20250523134207.68481-3-yassine.ouaissa@allegrodvt.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250523134207.68481-1-yassine.ouaissa@allegrodvt.com> References: <20250523134207.68481-1-yassine.ouaissa@allegrodvt.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PA7P264CA0431.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:37d::18) To MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:3d::18) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MR1P264MB3140:EE_|PATP264MB4619:EE_ X-MS-Office365-Filtering-Correlation-Id: b334a59e-0235-48b7-ade0-08dd99ffbfa5 X-LD-Processed: 6c7a5ec0-2d92-465a-a3e1-9e3f1e9fd917,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|7416014|376014|366016|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?LUnkQBCUCMdP7T9nlCKjgm2DhkeLxEbuDxCYoWZISzc/afZQ3gffOR7iW1un?= =?us-ascii?Q?Y4kb/L1XYMspAa8rFvwKjSMpZZCU5jJ5l2QTReyDrA/hnQYyYsjFcb6ovKNc?= =?us-ascii?Q?dpptQM7I7ZThcdzeJHNjQxOJ+txDUdfMBschCg/SCtFZL2ih6leW+ttMQCFP?= =?us-ascii?Q?W1EoPQLHPCuDkTZOZdSA9JKYOn9hCCQrTyMi6ePcfGgtcW1gd5tH8T0VD9Or?= =?us-ascii?Q?T4K6bmDx+qc6dFFjDyU+WNr2opKlLaG7Tk69UZPLjyBm9dcKYP4KojxMDWdu?= =?us-ascii?Q?XvsDtbWnc9x6c/vfZpkZARNg2YB9cVTdb7kY7Wshb6IicQQHhVEmbqMgi0D3?= =?us-ascii?Q?3H6JjpnL4agAekDn3D3kz1dl4MA/a88oXjFeXYKLpEHrhegA50CMUFZF99Z6?= =?us-ascii?Q?Y7lqlTcaTvm+1UBEzLJV2pu7aqWXaHWfIzU3luD5oBbb8V3sjTjTpSIzRiBH?= =?us-ascii?Q?C6fvRl8PPO39FTCVUomUkYDxhA17RHcEANk0ZucF9yale5JYaABmSwEtcu/Q?= =?us-ascii?Q?Z1Vt+5MxCWexQRK06qvdW61sJuJf5W2wXuWsiDhDOYZofMUjsXf18FyOlqiB?= =?us-ascii?Q?fgiCMXcicq+Y6qkCnyi4ztEBFQoBAjbY11orTcXh5FQID9N290xbY4QO4R7X?= =?us-ascii?Q?Dw9HAuzBz/fi8XDah02Mfg56yjRrWvjuhFhKqT+pOoi9p8WmJNQ9mqb9X/Oj?= =?us-ascii?Q?SQ/0YHY4yFiMyAtVRavq84bpY6IqMbmBU7KG6xEpeaB2qC716fL62uVppKsy?= =?us-ascii?Q?d3DxJOmzpbS1TCBOJyJ7Idlqm1wftuZZdkPJixNf7F5GZUwkh94dWTT90lX1?= =?us-ascii?Q?SMFVw3ziBziOScghBQ1laAQ02yEJHgdu58Cjf22T59HMhRExIQRO04cmKAzz?= =?us-ascii?Q?8NJyML2Zs/wdyhat+o3aCqD3zoT/1A2pGtrC3mY9wZUgkH1VY2Fy7oCYv6D3?= =?us-ascii?Q?9vIzRek9FrUzWxxDsTlawS5l/IpSGEL+KxeDFbzZrXa2yvtf6Y37jsQfnIjT?= =?us-ascii?Q?psJ+DbaOJd1EqavkGWF9lMfyqU5N4qZ38UokW2iCaBSJkfSZm1SgZcRE2WhG?= =?us-ascii?Q?KyYUHZCE+0jYdN8n4CIZiunciYtD9LnGHYWYP6Ii+k0frBQtZiLwA7ZUGzNZ?= =?us-ascii?Q?W23c56lGK9Wv2SevXaUvDAJqyKmkKR2qG+llIonHrd0HvrkExE2K7laccz1u?= =?us-ascii?Q?155iPWdoNd+f9LWNb/eFL1Q6aa16N0bPgEySiYe59kkCjO58qbhhQZoJIog6?= =?us-ascii?Q?/6wX0ThsB6J1l5p3EWbCGwC0FyGQeYveFr3PsUr6X/aDbND2HCc9Nx02k4f2?= =?us-ascii?Q?pOVxG9JXHweLTje8dVNE2kAxz1ODN2vdj5gAiDbs79xLcfdEmRwhgHFb40Gr?= =?us-ascii?Q?5iKn3hfhaCPbTNLISqbhM9PhAXbhKy1nbG/UAAsh2WYC2HCLEg=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(7416014)(376014)(366016)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?gSdS5JAk2qwxkMGGPijT9fVw/YAE0IR6Uf38lTI5TnWWggg6IGH5r+RXbWuW?= =?us-ascii?Q?Nssvq0T4N+/OHIDy13LS1t22Iq+EeX/vkI7VuZH/Xr0hd/KwxaZSyJMTwt5m?= =?us-ascii?Q?Vnnvfkq659zSkNW49ehW84w/GjwKe9m6jsYiiypfES6PF1MI0F2eK8pFN7N1?= =?us-ascii?Q?iSJ7Ke50wpeDh2E88yhYCIz5FgqkzPKQhFVgM+HhBjm3RjLHk5+tI7pIgaum?= =?us-ascii?Q?Ia3sOV+mSsVWKYXKg4nyWGWZaQvQJ3U6zsl7U7JjVz6uKtmnZz6nFS0lvif4?= =?us-ascii?Q?O69m/ZqCd3oz0k3LzXcgzoZympLG3wxIE2/wbH11CZ34bHiS5XHqdVM7SBe5?= =?us-ascii?Q?7cahEfc+T1RT9Iluota54dq25sw8hfVn28N+K92RgA7Cg/S2hJfIf3maN1ic?= =?us-ascii?Q?ZD+EerInzgC/GsqvbtE9u8ktXtD79f/FGeWi6nxFe7ollCCtrJttb6Ug21lx?= =?us-ascii?Q?V+CYfrIaQaYMLtW4ebRPvLLmxgwdCJfJBkiOT+8ZhkY0Yvzz76wQC1VhuseL?= =?us-ascii?Q?JwbAOI+oBZ+LfnwyfVmujOFX3tQcraBFesJ7qtrOPUpqF9qYZ7lL1XJatyAo?= =?us-ascii?Q?BGfHOZ65CsManZJ4sLHiUIxVbA7qAgGH2Gjs+9LaH3REbUyAuUNIdatyLzEt?= =?us-ascii?Q?JXjzibK5SlAsH6bZkSjodb5ZaRC6zjkKc6c7AkCoSoeo1f7t+soIqFoDtN+9?= =?us-ascii?Q?/z/O7VoPb8HTDYjC9I27NPgbxs/MSEfAM+2byVbPnmQzGLvYLowSmRpPDczT?= =?us-ascii?Q?PqzSVbRPJr5HAescoNu21r+o4jEqslDzooW1IG/ooh7DzeW6G2cNmbYwmVTG?= =?us-ascii?Q?mBuIrCJZG937RypuhY8UHWMHXJQrojSy6QBInO9Sdd69aFVAU2gXu7ysE3h0?= =?us-ascii?Q?QZ8lKRySwVU5WRNPjrGn3YUyZE71I4u4lt51QhhwNRYsFDFo/bIyEHBVTJDk?= =?us-ascii?Q?A3pe0f3rdsGQW30FVR+/xiu1oQDa5wg0Ij9V+nDWFa1EhCi8OSARDOpp6up7?= =?us-ascii?Q?x8eHkG51IOysWkYqKfTC3OETmYgCqlvToEj/qRAuvlQJMd97jJqc+kMUDZum?= =?us-ascii?Q?a70ECgUdCDgjbctW/THx+mlGX6oSpm6CkA0W2VGqdkqBpkXWOvh7XGBwgfNM?= =?us-ascii?Q?IEHnsFROIyWQMD9se8JSQ1wLRx297Ku1LdJkuheik4mgymRloVEzgkClqgJO?= =?us-ascii?Q?1T/WC7vHZRwle84hqyNHTvl5Zw00yfzfdFYko0PfGnJ/2ZhcKLPAv8K3ogNs?= =?us-ascii?Q?I33g4CPCjoBSy0pFtjCsWSjfGzo28oFBgDZG2yMUQgFaqO9XVEBfxURbouNj?= =?us-ascii?Q?bkzWqeLXnK85U6lwE1wIQJkCGfDECamAGf+00h7D1/+uSfFwWgqDDVpmAO7R?= =?us-ascii?Q?yUIso7Vjl5LzUIhLcI6Y2olBUOf79Y0C/b1cVCcw22eARZZKq4rzpevU1Wk5?= =?us-ascii?Q?Flu6TMwgrKbRhgRj+1i6B0uOBLyF45pvHm5U89cQ1tBnWQCxMx59DhJ/gV2K?= =?us-ascii?Q?QEkhYBWQg5lOHUWMFRM4EFxX+LOF9tg3i2MqImrXpZ4EUTsGmYXiqtuQdEQ+?= =?us-ascii?Q?ki2D9DgWVkgj0bRpCvX2gUZYDSLuK2zB3Hrcygh9MqD4xB5kVwsLHn9WHf0W?= =?us-ascii?Q?TOTKiJ23idXiivD3dhe/F/C7MLHeRCMAj7hnXF+b6nPyxNPNQ8cCwITiuq0+?= =?us-ascii?Q?E4BIjA=3D=3D?= X-OriginatorOrg: allegrodvt.com X-MS-Exchange-CrossTenant-Network-Message-Id: b334a59e-0235-48b7-ade0-08dd99ffbfa5 X-MS-Exchange-CrossTenant-AuthSource: MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 May 2025 13:43:06.9461 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 6c7a5ec0-2d92-465a-a3e1-9e3f1e9fd917 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: E8pjBIEXO3q7IwFP5z9Azdnv9c0EpdqOdDhaypipcFPfgY0tKTd3nMeNLC6DBIX3+N9cLuK0x8J+0Fov+LIe+6e3K2uMXS3KSqwzJ32IXAw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PATP264MB4619 Content-Type: text/plain; charset="utf-8" Add compatible for video decoder on allegrodvt Gen 3 IP. Signed-off-by: Yassine Ouaissa Reviewed-by: or Acked-by:, please make sure to edit your commit message --- .../bindings/media/allegro,al300-vdec.yaml | 75 +++++++++++++++++++ MAINTAINERS | 1 + 2 files changed, 76 insertions(+) create mode 100644 Documentation/devicetree/bindings/media/allegro,al300-v= dec.yaml diff --git a/Documentation/devicetree/bindings/media/allegro,al300-vdec.yam= l b/Documentation/devicetree/bindings/media/allegro,al300-vdec.yaml new file mode 100644 index 000000000000..e853e7634c4f --- /dev/null +++ b/Documentation/devicetree/bindings/media/allegro,al300-vdec.yaml @@ -0,0 +1,75 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/media/allegrodvt,al300-vdec.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Allegro DVT Video IP Decoder Gen 3 + +maintainers: + - Yassine OUAISSA + +description: + The al300-vdec represents the latest generation of Allegro DVT IP decodi= ng + technology, offering significant advancements over its predecessors. + This new decoder features enhanced processing capabilities with improved + throughput and reduced latency. + + Communication between the host driver software and the MCU is implemented + through a specialized mailbox interface mechanism. This mailbox system + provides a structured channel for exchanging commands, parameters, and + status information between the host CPU and the MCU controlling the codec + engines. + +properties: + compatible: + const: allegro,al300-vdec + + reg: + maxItems: 2 + minItems: 2 + + reg-names: + items: + - const: regs + - const: apb + + interrupts: + maxItems: 1 + + clocks: + maxItems: 1 + + memory-region: + maxItems: 1 + + firmware-name: + maxItems: 1 + +required: + - compatible + - reg + - reg-names + - interrupts + - clocks + +additionalProperties: False + +examples: + - | + #include + + axi { + #address-cells =3D <2>; + #size-cells =3D <2>; + + video-decoder@a0120000 { + compatible =3D "allegro,al300-vdec"; + reg =3D <0x00 0xa0120000 0x00 0x10000>, + <0x01 0x80000000 0x00 0x8000>; + reg-names =3D "regs", "apb"; + interrupts =3D ; + clocks =3D <&mcu_core_clk>; + firmware-name =3D "al300_vdec.fw"; + }; + }; diff --git a/MAINTAINERS b/MAINTAINERS index d81d2756cb2e..e59011a36e6b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -806,6 +806,7 @@ R: Pengutronix Kernel Team L: linux-media@vger.kernel.org S: Maintained F: Documentation/devicetree/bindings/media/allegro,al5e.yaml +F: Documentation/devicetree/bindings/media/allegrodvt,al300-vdec.yaml F: drivers/media/platform/allegro-dvt/zynqmp =20 ALLIED VISION ALVIUM CAMERA DRIVER --=20 2.30.2 From nobody Sun Dec 14 19:30:16 2025 Received: from PR0P264CU014.outbound.protection.outlook.com (mail-francecentralazon11022080.outbound.protection.outlook.com [40.107.161.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 79D4D293B74; Fri, 23 May 2025 13:43:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.161.80 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748007815; cv=fail; b=Kx0uINMdfL/GPEfp8tyBM8oulM/4uSUEcHExwuBLJxJJWX+vi2mQDpomTwGKBHYMNsazZItJ8ucspC//vur1yD3fSNz8lVP6oa5clsJGopYYYBkfI5Mlo6TB+FXycV4wd0vNERPVu6j/0pCW44HxrxChNNRkI8IrmDnOVSAUyM4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748007815; c=relaxed/simple; bh=vvAJRQfz23GtQdDF89uUzwjVerAsYfZTVjZL1QgNeCI=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=SMDAtg07QON+6hLTW/nAouZRQUjONt9ksnWqOmf+guz/i1Y/+z97Ut5NeMBEj027I0hMQPnKZLuLwJPIP8gTbaINFcMrbrfq0n+tc771ZHDhHpc7Q+uYlgQQoHucL31opbMl65BWfCox3g8DsLt7QFLQIdiMUbqtee5PxYdRRN0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=allegrodvt.com; spf=pass smtp.mailfrom=allegrodvt.com; dkim=pass (2048-bit key) header.d=allegrodvt.com header.i=@allegrodvt.com header.b=yGRkzs+D; arc=fail smtp.client-ip=40.107.161.80 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=allegrodvt.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=allegrodvt.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=allegrodvt.com header.i=@allegrodvt.com header.b="yGRkzs+D" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BydErWj6qF4e2MLMD9orwwCSgOJkTawol3J8nI4cMmrLjcsc7HA7+1cEzDDcsUxtam7zUhPrtnRuq6S0Ykt6g6rvKg6AM9yb0orvSWUX2mAktB+RUhISfK6L/N3T7wn7lhqUbQsSUpKvcg5qe5ztwTWo2+9LSQqE9sJZvzsh9sQ9sGWbdezJSUGN7fGdMz3zHOyPe9G6AEIlL9RAK/UpdnQadu1r2ex8MZP0FczQjFamzpLjMQhao+feeLWSaB2z1IdxlRn1A7OV4McDB0jvKrS/Nznsw5Ycgcp4XZQOBi8l4/mAA6NPUii92jnftmSf3n2jhJyEjNHeS1MUt8x25g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=kGRP3cG/lu4arrN6xyC1FXh51VFrtMBx+8TGypIs0ZY=; b=lxjpbcNUeXRVySF5r68XVrUocpwyGQvIdCDCgOl/sls1p4XMl1yD6bPymUZZNQUc2lAygCHUu56vWtPJDk+U16vJiSBFA3KsFsRodo0Gz2hqqF2MBVjUd6Tni9ZfHl4Z2s9l1Boah9GxRMaa3c/knBf3K2EfwL3HaQeivcH2NeVyQD8kdys3K09y/vY7sX2H5TqUN5s9ytXEJ45b3UtyKISnIOT1OUyZ5fDK/k0gmK4xhvYKe7o+aQq87fG58480XV122CWZUnCUcSlUAcIMG0iU0T3tGUkGtH8Nd3P07gQG3YCLgy8tiBg8DJGkIyzIso/no49xJnY0TZQ3vU0OWQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=allegrodvt.com; dmarc=pass action=none header.from=allegrodvt.com; dkim=pass header.d=allegrodvt.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=allegrodvt.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=kGRP3cG/lu4arrN6xyC1FXh51VFrtMBx+8TGypIs0ZY=; b=yGRkzs+DlyHAGPlYJZxhSLLDOglSKo7C6O/+Mof/No2BemxnvVj+yn1EoHTk5rIc/CHatt3w7UpO+CuG5gddjVkO/SgUiFgfp0JKpjXc9VhtJ+On3LuibPKa5/SnCbxkx+rcE2SXE6PfkZjFd70OFfr7Z/ZENo6ohqiFy4vL7IdY23bWPUDa12+gaazkNBAFENVoIar3TpgGPI2rnq+RidQgexnbH326KlQeU0RCysr7VlcjnYAM466aqZHm8MHRgaF6tLtPmaBSedWA2FjcCAKMBKjP44OThINaG0XeFkHhEn5MnhpNIuSKu89yaskqICgMZkMqKMDAofb/SEapjg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=allegrodvt.com; Received: from MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:3d::18) by PARP264MB6043.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:4a6::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8769.23; Fri, 23 May 2025 13:43:28 +0000 Received: from MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM ([fe80::4281:c926:ecc4:8ba5]) by MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM ([fe80::4281:c926:ecc4:8ba5%2]) with mapi id 15.20.8769.019; Fri, 23 May 2025 13:43:28 +0000 From: Yassine Ouaissa To: Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Michael Tretter , Yassine OUAISSA , Pengutronix Kernel Team , Michal Simek , Neil Armstrong , Heiko Stuebner , Junhao Xie , =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= , Manivannan Sadhasivam , Kever Yang , Hans Verkuil , Joe Hattori , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , Gaosheng Cui , Christophe JAILLET , Wolfram Sang , Ricardo Ribalda , linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 3/5] MAINTAINERS: Add entry for allegrodvt Gen 3 drivers Date: Fri, 23 May 2025 15:41:48 +0200 Message-Id: <20250523134207.68481-4-yassine.ouaissa@allegrodvt.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250523134207.68481-1-yassine.ouaissa@allegrodvt.com> References: <20250523134207.68481-1-yassine.ouaissa@allegrodvt.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PR0P264CA0184.FRAP264.PROD.OUTLOOK.COM (2603:10a6:100:1c::28) To MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:3d::18) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MR1P264MB3140:EE_|PARP264MB6043:EE_ X-MS-Office365-Filtering-Correlation-Id: 15163bec-7f7f-409e-00a0-08dd99ffcc78 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|1800799024|366016|7416014|376014|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?GUMPiZWgyOzZ0602e069Er/rAc8RbNKFTjpN9WnNOw8tnMTcYI3hwvv8dQ31?= =?us-ascii?Q?AHTmUtD4q58WmGAFkUvbyahbgw4Ltbs3N43sdbvAgM6oF2ux916WZfSPdDnU?= =?us-ascii?Q?acUcri+OTSy88+wW88WfVhkHGAVID62yw6CS4fFjdwRpC3Bp5NeEkK8BId3A?= =?us-ascii?Q?GZaVCm1RjR44AGlQeJDASE+F1jpED1oZztK6+cUaCNsKtpZDHK+fdsrbviua?= =?us-ascii?Q?khjgM5CS41VHPNp92FruYR9Es/2Rnh+YbO6CuqafP8iK61LubIPwLbc1HFt0?= =?us-ascii?Q?GvrfiaWFwPjnCvwUHXNVODeLBcsZ+4u3jXh1laH5RBBi5eCtckQU35C7nQpJ?= =?us-ascii?Q?Z/MHAuKGWUQfh+gD/ql52zcv3QeYFIvxgliTTx13Bb9gZ+EpuTNnTeY2plvG?= =?us-ascii?Q?41gzaOIlcfr+jCwDAfMGiAX1wqf9VA06VXugF6AR1+8D4UKzoTD7GXoBSHav?= =?us-ascii?Q?I3vLxfz/PNyuQlJzITxaNhEsvyYcKRFLF29a9zwJXcFaaX6J99Py2agRaz7K?= =?us-ascii?Q?FnZfkjrydV9fc+OaceMPbMLigsMDiq4kAJ/jBVdC+0FC16HYRNoq6rrSQdix?= =?us-ascii?Q?txBYulQR4d87SIrFrGXridCI7K01/9S8Td+mm3LkvGevzD6V38mH3MdlNmAD?= =?us-ascii?Q?JWfkRHYGjJjIX8XNbOj3bAH9Cn79c4dbpd+PEJRaODUGTOPLFIt7Al7IBhaN?= =?us-ascii?Q?guwRo9EZtRGHunAsTP5u10A8gtDxMLSrnzeYKvlU7QTJmJzCM/7uyQ5ZVkbU?= =?us-ascii?Q?XS5OnMKhbXl2SyOqwr3/3CRsyzs4nmBcuwYYcIkoaPNd+WxSCXCI3RedB3Y+?= =?us-ascii?Q?BaS30gokbDlNbckn6nVsiXtaeibt4pQmaAjrJJBzFHqkW6L9YxvIvdf6WOu0?= =?us-ascii?Q?sBarKTnVejU7K5ba2za+Jba+I6zxsgsnP4z5KxFsAUKz8Hwn12gUHMuOWzFR?= =?us-ascii?Q?uveCz6oJQInRkZD26cHQnJHO7Yxb4LGdxPO4bETI4NZP275eD0Je1piPFaEB?= =?us-ascii?Q?XAzIBb77Kdslvv2YyDO5gWJS8wWon79GCE5gfxc7qya49eHzuSfTOp7kksA1?= =?us-ascii?Q?jlodICT7++H5rNPI3sBl2NYuj+ZswBju3orRttlsVGvtx1tw/BWLZxrcnq6t?= =?us-ascii?Q?Ddkb9LdIoR+X/he57paN7O5VgUz5fTlL/qDOuVRmjD9Ej7B/VD4ZZgpKbvU0?= =?us-ascii?Q?pUCssSgqGkI41Ffp0ZS4ZORD/dN6C7oeO0VEgcBvf66HKZFcOqapMW7GfILR?= =?us-ascii?Q?7bMK2CB2CAnOGupLw7bDtyeevzvoF3hnU2AdBfYYnLGIkDLjG4rKO/M73jEO?= =?us-ascii?Q?eZigwXu6BTp/y1SYl4SLfncX5brSe4dASONgRC0+fFSjRr+zuMNFjmwo8tLa?= =?us-ascii?Q?23o9kG+p2Ctk/D31Qn8rX21BjhJpfJaGWTf7b9J4KM/2gE4+3b0AEXcFOopT?= =?us-ascii?Q?58QbIqGlhu/FHk1pSL5JxCRSZIoGT+ggiBv6ItBFxvV1OYp9TKBAbg=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(1800799024)(366016)(7416014)(376014)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?PxqQbO+c0RYTsl9hDn3Sp5Konn1MprUaGih77kRmH25NYKK2PUlUVZsEnOIa?= =?us-ascii?Q?9sJOqKZSboM7vaEusNnVCoOo04YeJL3jYh1VRY6WVlj9r90tN2W3APHgiEN+?= =?us-ascii?Q?XyFD3zb7O5CuDks8+floxBUPUhwm8DJI98616/df1QNGAbuN0WMMR1cZ1kJn?= =?us-ascii?Q?VAzWGxiF9r484aKe5aIeTds27RoBSfMGEFVhr9Hf+A3bxfjYyDsOuUVQ3BkC?= =?us-ascii?Q?aCMK9rSVfj82cSAXSgBlySpbn/n/H9KjIdhKop/CoR0ZS8KFzSeJd19vptes?= =?us-ascii?Q?HnFJSDJw3b83sM8/Od0zA7qbhddd5sSlP3DTGX8Z2+p3NTPQLKvTZSEVWwkF?= =?us-ascii?Q?W1HaBXtn9YIEPn5oYeDksPi9nO5MO9HmadzAsi87+Bl+CRraTEX/o8u0mrIo?= =?us-ascii?Q?GNCq/wkcE29Ic28zledMZfwE4qkv5Ov3jAouFeqz7CHxQg1MqbuLmAVInwr3?= =?us-ascii?Q?VpB7BgRCnn8iOXzLZ5wpt/fnyMpYmb//BMvz+EzIM03GwB9oae6uBB0oF1ye?= =?us-ascii?Q?G/YyJg+zUxyVSCfcBh20/d5m8vjW8d/YPGeXYNHCylyYY3imraFy0yYoOwLZ?= =?us-ascii?Q?zHo02i3DEQX/2oBac/wYMqufW3FIqg9LOMEHHnJ89p5lizxQSz3SniumMLDk?= =?us-ascii?Q?I7SQvSJS3uvO269IUKgcoEhzTAt5dI9+aAIQzX+sUa1BvEuFLZJV7goqBexG?= =?us-ascii?Q?2elXw+g2/fA664w34MBiDE5B5reVSRjCVZdGgZrWeBI6pQgXd6ZNsFthe7WY?= =?us-ascii?Q?P6ifNKS/Q3LyrKzUK2rHRnk8dXwkiizp+8oN7S3b34YSEw4XzyNHne1G+p/s?= =?us-ascii?Q?tIxulPKmuGPj+X2kx0GGNjAvknx6m9r+n0qZbG+cEoM5AySmcQd+VVJF6q9W?= =?us-ascii?Q?sA5lzu+1QKo5q1wjlmdfLdX2BLegUho/g5bc7XULC4vD/PkPlSrACj26//aH?= =?us-ascii?Q?F5KVKbupd3vKLJP7xpZIX2pksGQCksUBYgG9moNNeln7rppvzADNIL9RVvbs?= =?us-ascii?Q?6P1nMLW/Zpjw5O4MHvT3fQnd0L/P5X4ryr8JfbielDeWwDSKIJE3Yx2gvHJN?= =?us-ascii?Q?hEClYezjRLuzXY1MmOogekfIgoL0ehCJYuGHl6SyfmIMkW2dgIOfvtAJ9XA8?= =?us-ascii?Q?D1NiN0ToJvd99trvtFOErZlWRmEat/YCDrduTNa/FTodjlyNLyPiYReBhPMa?= =?us-ascii?Q?xmh2aM4jbZvBlbE3hHp0rmlAyuibCDVQwn3L4WDbm4LHDxZPtjmqA/yUlDB9?= =?us-ascii?Q?5kPtNBvFj+FTleCWx4P+7wmVKNad1jriVC3gAhQdUFK01YCTphRgMz0R+Ngk?= =?us-ascii?Q?L7YICfTJTeBUMW2lwciG57c8esPc1VKJZQXwVWgwoKoZJZAGjlBAUvLr5tD3?= =?us-ascii?Q?t0Ji6M0NRkYmzzprcB8F0eTKR5yhA9juQEH96Xdu54AdTSlPVFmweeM25eWc?= =?us-ascii?Q?r3HKshnS8TrHQUZ+lZt1Um37R39Q5bmBtHET5SCe2zhsr8Q/Y4fkx2oHd0lp?= =?us-ascii?Q?VBYGOMFleRtRMePW3yDCiquN0DwGupauIsKlsbdJ/x4kzODbiF2ngKv4MXMG?= =?us-ascii?Q?r/zln1+BSCUGEh5rPQtJZekEpba0s/HCoqw+FtBEgK21fs/ij7Y7BxVqgyOM?= =?us-ascii?Q?mYE0ZjVCAtAyCrCumOS1m0wkZaLxr1pIJqnmnWBEkLx+Av4ptns4KnOA9/CM?= =?us-ascii?Q?cMFa7Q=3D=3D?= X-OriginatorOrg: allegrodvt.com X-MS-Exchange-CrossTenant-Network-Message-Id: 15163bec-7f7f-409e-00a0-08dd99ffcc78 X-MS-Exchange-CrossTenant-AuthSource: MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 May 2025 13:43:28.4241 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 6c7a5ec0-2d92-465a-a3e1-9e3f1e9fd917 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: wnYHKoEZ+XOYwHgFLjfdOV2IDI5l3mrIm7IdZL0M/GPcpIQZCTb7Vz72vSB/KzyM84j1D+khpzPn9Td1v+dPHy/C0WiiHAzvDGAhokzcfl0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PARP264MB6043 Content-Type: text/plain; charset="utf-8" Add my self as maintainer of the allegrodvt Gen drivers Signed-off-by: Yassine Ouaissa Reviewed-by: or Acked-by:, please make sure to edit your commit message --- MAINTAINERS | 1 + 1 file changed, 1 insertion(+) diff --git a/MAINTAINERS b/MAINTAINERS index e59011a36e6b..9285bb2f43d9 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -802,6 +802,7 @@ F: drivers/platform/x86/dell/alienware-wmi* =20 ALLEGRO DVT VIDEO IP CORE DRIVER M: Michael Tretter +M: Yassine OUAISSA R: Pengutronix Kernel Team L: linux-media@vger.kernel.org S: Maintained --=20 2.30.2 From nobody Sun Dec 14 19:30:16 2025 Received: from PAUP264CU001.outbound.protection.outlook.com (mail-francecentralazon11021111.outbound.protection.outlook.com [40.107.160.111]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ADE622949ED; Fri, 23 May 2025 13:43:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.160.111 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748007834; cv=fail; b=NWz24wtPsp/N4YOTkwZNs9PKD+MyFYPtEuknP1I+8dP4VCxZPS6I+dCALUO1mDfl1JwGAP+MWDNuohRqTT+OZ8xnPTPV+BEaDnmLGeehS8x+zAYGXxjZwTPfLjSCGANXA9MmeJO2VWt286Cu9nVAoATv2hiGtuZmjpD7zLl790E= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748007834; c=relaxed/simple; bh=xIIHy495odXI85DwoLMjFvuCVtzOMdD6Rp6Ui36CzwE=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=LmZ3P/7dcAr/AvAtY/3436pr6HvZMyMvtmMMUBENLLiN2v4ziVvNO/UdsjhdK0MxASjTu+XhDphuDpBRDpaHbH6SAB5OR6RoZ2YNP4hOZfxZrhXjHtQvseWen0S+J4konj0SNvhTp0HpGBZX4zY0/QF+4pgHwyv+clMGsb8V4dg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=allegrodvt.com; spf=pass smtp.mailfrom=allegrodvt.com; dkim=pass (2048-bit key) header.d=allegrodvt.com header.i=@allegrodvt.com header.b=yfVruSHp; arc=fail smtp.client-ip=40.107.160.111 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=allegrodvt.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=allegrodvt.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=allegrodvt.com header.i=@allegrodvt.com header.b="yfVruSHp" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=fNy/1fiaCsKdT6n6ElUyvYwk2XjDdAEgpefQKMpxZRitTEC2RHlz4kTesrgKtr+rUJvwQCIJZgAQo5kfuW5LnaRJPfO2znW+arJ/txNaVItUjRRoQKsLz+Q1NHVHC3AHN8AsSlJVyLsIPHuakDegTTuoDiYqt+bJ1nh56UYrXGEnFoX7FscCDy5sErndP1hCqVFiVrkRiunKv3RIfFDzpfYnT60zfsldep01jLmJBV7U6eiLogrnAfImwbUZBzwokHPosWjeou2Qshy8oggh6jODEkzAmk34EMZr7AlPp1EUb6pLyqvPfth5WvPzp0WLJqlRgH6kTFyng7G2tmzQZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ADzzuOFAnWtSqIi7kgxiy7RMpf2rbUU0lJox0hHBGBw=; b=PZ8oZohJwJRZkGbwVnRPCOVJT2k3tvjamwyiurzeNxW/2HWuPo7s+69KTw7mrww4HqJwpAKIQJE3OygaBlIbFVVGVX5l+AJHja7Z9mdKYRF2UTcoCfuEoFhVn6SS4lTVLNu34eZljULWmbk6XSUBCMIGKrTlPe0gkWnHmE/+o/Sc4dsA6fvgJPadj7o5psSJ/uvzu3px9YlsZAEUqdLgmOg4Z+LjcIxC573R62hFlJX/XiymRHelzRfM/k2dKiXDjQy9Be5o7ZvhxJi39kq0kJ7SgIEc/M9Zy+NTt5fnWxt5sAPtR44ns01zijoD1heuiRW0tT9jGIqWCYRfRGxsQQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=allegrodvt.com; dmarc=pass action=none header.from=allegrodvt.com; dkim=pass header.d=allegrodvt.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=allegrodvt.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ADzzuOFAnWtSqIi7kgxiy7RMpf2rbUU0lJox0hHBGBw=; b=yfVruSHpHIA9rhnAiwq/p/QY2PlXL2MFAGMkLu9uBL/XjwZZn6sgBwThoY9b5qJ4o8RW+8n/1+S9dcQcbEmzAhGdeI6lBh9ZcoNnHkdKHhr9KEpVL90ClyewnT7eDWJFLFXHi2qUjEqZzDu4CUiFt9V23rI64WoOgJxAMjxbHuOR5WfgCW6TuzTwy+sp4A+sT/mOLeFDbi5uQZ2vrQFUCo/cAIhbNt5kr/hQ8kjCKnGj0/PVZezwYfLG22K1IiTcEi31c/XYKRyaDiP3v4UDWlSpUJa5EyouMeXy8NKFKUgx8R7hlEOm34EAk4y6ApgcVmlrc2S3w/7wLt/gQGO2Dg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=allegrodvt.com; Received: from MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:3d::18) by PATP264MB4619.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:428::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8769.22; Fri, 23 May 2025 13:43:48 +0000 Received: from MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM ([fe80::4281:c926:ecc4:8ba5]) by MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM ([fe80::4281:c926:ecc4:8ba5%2]) with mapi id 15.20.8769.019; Fri, 23 May 2025 13:43:48 +0000 From: Yassine Ouaissa To: Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Michael Tretter , Yassine OUAISSA , Pengutronix Kernel Team , Michal Simek , Neil Armstrong , Heiko Stuebner , Junhao Xie , =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= , Manivannan Sadhasivam , Kever Yang , Hans Verkuil , Joe Hattori , Wolfram Sang , Christophe JAILLET , Gaosheng Cui , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , Ricardo Ribalda , linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 4/5] dt-bindings: vendor-prefixes: Update the description of allegro prefix Date: Fri, 23 May 2025 15:41:49 +0200 Message-Id: <20250523134207.68481-5-yassine.ouaissa@allegrodvt.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250523134207.68481-1-yassine.ouaissa@allegrodvt.com> References: <20250523134207.68481-1-yassine.ouaissa@allegrodvt.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PR1P264CA0109.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:2cf::11) To MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:3d::18) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MR1P264MB3140:EE_|PATP264MB4619:EE_ X-MS-Office365-Filtering-Correlation-Id: 017d864a-ea40-42c6-9ec7-08dd99ffd86d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|7416014|376014|366016|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?WXZGOXBzYkpQY1pkVHN0ZXRIUW1VNXFZZW1vVjZtVzNjbDRZcWdKVWphWHRk?= =?utf-8?B?dzRZZ0Y4ZEtqS2wyZnVFYnV0dTg1dVZoNGxuR25Xc2xxNTh1bzRnNk8wWXhD?= =?utf-8?B?VVNsRm1OWnI4MHFQaHRWQlNOTk9PR2tvc0k2VmZ1UytPd3M2ci90MjNtRmhv?= =?utf-8?B?YzJSR2gwM0t5WE16NWdRT2ZRT1RoZE1UNytEU3hJRGt4Q1BNQStCK2ROdmtF?= =?utf-8?B?MmVhTGc1bkRLT1JYcDdmZmxKUWxoL256b2txNHlqb2FWNGR1YTB3djkvUFg5?= =?utf-8?B?N3NWb3BodGxHcHhpUk9pazNxWUl6bmJhLzVLSGxBTFdScmh4U2tEVWFNVGk0?= =?utf-8?B?RGQ1czhZL1dtdkgzWVh6eW04Z2hDUzNyVEhLT0psYUVRajcwUlFGNlJZd0lD?= =?utf-8?B?b3dIcEdqZmlkTy8rckFadlpPMjlNTHhkelJKTG5sNDJ3ZDE5YVhIcHZQVUNh?= =?utf-8?B?MlkyeXVLdzhSSkV1Nm5OcldNWlVaN3ZyTVA2Y29JRjFXc2RXT2dJcGRnNnRs?= =?utf-8?B?b0t0cVRZVjRWSjZVY2ZJL1RmYlhJQWFqWkhKbGp2U2huRlVRYjFLdlVMT1FL?= =?utf-8?B?Y1ZyNk1CcU1JZ3lNeXR2bjcyeGdOQUxCRTVJdG1CUkpwSW53Q2d6ODNZRE1p?= =?utf-8?B?dGs2OG8rdEc4QmFVTFc2ZXZLYkkxcXpoL0Y4ZU11SUdmRGFQZ2FzZE1iK1Rn?= =?utf-8?B?T08zSHh5YXE1azgrcWoyK0FjSkxhaE1XVStMcUZncUo1emVBUE5rZzFCc215?= =?utf-8?B?Qmg5eGNRZURNdFlBY1ZPd3NWU2pVL0xsazRHWHJXWEJlUWVsNHpXNmpFZDhO?= =?utf-8?B?dldQU3BidkU1Mlc4OWltQ2V4Wnh1NjJuQno3eFVtOVpLeUw1cjRNeTQ0dERt?= =?utf-8?B?WFl4UUFFajdNems0VnJlVUI3eHRXYjJHcFcwSXJjS2hNMk11Ynd3ZXBoUnNR?= =?utf-8?B?ZXorZTJNMkFDZUsyKzZKU3ZBRmxDQlA3VTRJMlpsM1lHdHUrMmZnZWNvajI3?= =?utf-8?B?dE1YRmFnY0pLa2dlcHgyTW9iU3UxcXRzMDdCajkyZ0xQUU5EOWY3cWJoMHEx?= =?utf-8?B?VUh4OUR3UUhsVUJySWlIWU03dFlhMU40Qy9pc1dPQUtFUWxwcGo5NEtQRUJk?= =?utf-8?B?RDc2aUR6MmRFRDFDZWFNMkU1Y1ZqRWJmWktxU3pWNmhZNFJIc2JrRW9tYWNH?= =?utf-8?B?dEc1a3M2Q3BhajJPZFRaMk81ZlR0WkFWSkR5N1dONGpJblA2amRIYTNEOUFK?= =?utf-8?B?bEdhNDNhTmJPOUNGTDRzOTlOU1hOR1A4c21ORllnb0x5djRhZjFuWUEwWVlF?= =?utf-8?B?d3dIZXVUbGoyc0JkWmpzdUtUL2pJUjVCTE5ORnJHNkZWVlRhZHl2OG9IRG1l?= =?utf-8?B?NGtMY2VOMzA3SldiR0Z5OSsvTGxoLzMyMVVVNzNQL05sVWQ2TExkM21WSmRj?= =?utf-8?B?WlVYOThBMTZhSWNpd1Q4QXNLdVl5SG9RRHVxdnY1N0JXUTJldHhIZXd4UE1V?= =?utf-8?B?a2tRU0YySmZLUlg3VUo4d0FUUEdhZ2pkSFZINWtJZW50VENZTVBWNy9MOFNq?= =?utf-8?B?M0wxdTJHOEdIRHI4MkZtUXFWNUJNU0pmT2xsbG5PMXE1NkIrQlJ2cksxdjhh?= =?utf-8?B?VDJuY2lMNVE1NzhVY09CcVo3V0xoaWQxR0tmNFFjQTI3QU03cXN1c2RxY3lm?= =?utf-8?B?UDU1YXZEOTEwU25USUsrV0oybVFyYjhXWEc0bXZZemh1ckEwOFdTZkxmNmto?= =?utf-8?B?NkFUV0tXeDBCRnhScFNHT2g3dnkrNXBKSDRBZGxzdThDVkZ3T1FHMFFibmRN?= =?utf-8?B?MXAzVXdOS2tnNElnQkNtUXAydWY5bm90Nkw4Q3hkd3Q0YzVuSG1YR1U3bHp3?= =?utf-8?B?UUdCMDdrT0VxZ20rMDd1TTRzMXF2Y1NRRTRHUkFSMDhuM3orQy9tc1lOTGdM?= =?utf-8?B?Q2tQRzFaeHN5TDQ3cURDeGpyYnZVSmZTWHFWcUlvVmI2VWZkeXc2d0IzNWVm?= =?utf-8?B?OS95MTEvWkt3PT0=?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(7416014)(376014)(366016)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?dkRpOXRKcys0OThQYmxlYmE3VHJqNEwyTkdRNEVzSHBXM0NkbFp6c1JUMDI2?= =?utf-8?B?cWRMU2tDRWF6UzBJRGlQelZQYkVPYjNmY0pqa1BuOVFvVS9CaisvMnVmMTU5?= =?utf-8?B?WmpXUzBmeENpMzZNY1VtcWNRZno3YURqNGthRm5Zc0pFbTVyWVJMczV6ejVU?= =?utf-8?B?cG50aGhMSkQ3cEpCZDBSanZNS0VJSFZiekYvMDZSdWxlTmxUNzVpbHNlUEQ2?= =?utf-8?B?RzFhZnhzRkdsWjdrdmdyZDFyYUYvT1FGazFoTjlzZzRuVHdTdmVyTVNJSlJ5?= =?utf-8?B?MDVZYTZUSS9PaTBubVZCWmZQT2JicmVNVys0TFVnSEJMZnREb1dtdGU4WXhJ?= =?utf-8?B?WHpNazE3bHFERGJteE5Dckw4WXllbUhEMUVIUVBHdEFHTUxtbFVDMy9IeXRs?= =?utf-8?B?a3FiNXhxQisxMXAwUVBlZFVoVmY1MXB3bUFlVGFnQS9qUWhvVjdVNlVTNWhM?= =?utf-8?B?dzJjRzlmWFlwMmhlbERZNTNJZzZzUFRTZmsrbElSM0hxWmI2eGlEblVBUkJs?= =?utf-8?B?WjhiM2g2cEFOeGw2YUJQSERtTXIxOE85Y2U2TElOWFR6MEpmU1VYcklWM3Ew?= =?utf-8?B?N1NNa2tzdFZhNmh3Ykc2TXNSUzFQZVN3S1ZUbVdzWnhHbElISEplbG45WVRj?= =?utf-8?B?ZTU5VmtNWkZiRzQ1bEo1NWtOclVZOGc4SjZwZ2ljTG1tVTU3ejdCNVhSOHVE?= =?utf-8?B?WUh6OFBWUGIxd1I1dXBvYldPSWdIY3d3YkxVMWI1L0ZQbk02Y0V4VU5mdms0?= =?utf-8?B?aVFjbFRtQTFncno5V1M0MVRXbnZQM0xUa29rSW1BVlJSTXZNVVF6aisyUkFv?= =?utf-8?B?WVRCMFdRbjFKQnFIU1k4VnI5eFBiU1pDeXk3SXNyZy92QUZ4cG5rVWJ4eklF?= =?utf-8?B?SHVXNk5WeHBoTDEwbUFUT1FlbThWU0ovbkI2VTVReGZxdUFOSExrZSt6bU5E?= =?utf-8?B?TUpWQURZUzZMSTlYRzVHSThpU3V4OThKVWxVYjlyUmMyeUZIS0krYkVxcmlv?= =?utf-8?B?L3ErWkxsY1F5dnVLSGtJMjlGWllIV2EyTm5JODA0V215a3hmSnVmS1g4aTdN?= =?utf-8?B?aHJaVXZnangvSVBJNGxVR2EwbU8wcVJya0p0TlBJNVhqbkVUUm9iY2JnaDIz?= =?utf-8?B?bFo5cmFSOWpOb1ZlM1V2UnZqRE5SYW05Z3dtczViU1V5RkZseXRPejgvNGxr?= =?utf-8?B?d3A2cVp1VXFFWWV3UHFaMldlb01laVk1YVVpaGFYZ1Q0c05zbWJlc3VzSUx3?= =?utf-8?B?UlZPVkxhamtPdmFsa1BKaUMvZUJ4d09TdXhCZkI5UjRRUnhSRThWOG1venlp?= =?utf-8?B?ei9xc1h4cTNTbVFLZlV3QVVhTForVGwwQlo4NE0yOVRDdU9ZQ1dMUmc5ZXpm?= =?utf-8?B?VG1VTVRoeDgxQ3g4dGprNllKYmhCN1NURHBVejRsdk9ybnZVY2ZTbU1TeU9U?= =?utf-8?B?VkMwd2ZvUHZJR2xRL3dLT1BkSFRYRklhMHd4VE8zUE9kT3lla1FoMS95SlFZ?= =?utf-8?B?N3FycDB4dzhGN0U4SHVEVGZOdEdTYm5jWDN4T0pJUW5wUnlCVUlrZ3l3TW9U?= =?utf-8?B?eDRwc2hVaVZDaDVFN0pwWlovMlJUSFZPeUZ0UGh3WWFsMnppQXpIM2dmczZi?= =?utf-8?B?MWRlczVzbEJQUzdRbVVnZFArcEZobG5TTlNpUkI4RmpSanNscUcxcCtzTTBu?= =?utf-8?B?TEdFbUR0cU10c0VDOUROZFpoMk51bE9YQVM4MWU4Mjk2RVRpdUppYUpQTFoz?= =?utf-8?B?eVpjdWFCZUlmVnVldUIzbkpINk9KZUJhb2x2eUYwQXUrWnBKcDJvZUFFZ09a?= =?utf-8?B?NmQ4ZWNqVE41REpQc0lQbzlzRnpWZnk2anEra25DQ29GNjdUaUVIb29NcW4z?= =?utf-8?B?WmJoUFpwb1l3UEhnNUR4cWJBT1BSekhsR1VpaUFrUklBV2dicldVSE5SYkEx?= =?utf-8?B?azRybm1tZEFMaTJFM0VoSk5NNTN3TXdCZ3ZxdXArYnpLS3pXR0wvcnRTNDhy?= =?utf-8?B?aFU5NEJ4SWpLelJ0MEozZG5GZ08xZUpuVnoyV2R2NW12RkJmN3JQampIL2dL?= =?utf-8?B?UWRaUnBIeUxhd1BKcm5XdFlqMkxoUEkwSGp4ZXVUZkViNzhwQzFobWJPV3ZJ?= =?utf-8?B?TWdDeXg4d1A3bmM5dXpRcXBiZnpXT0dYSjk4V1B5ZGhIcEpHTmUyc2tGMjI1?= =?utf-8?B?cG5kanRpcGdNWlVPMll5dk5KWWp3Uml0Nms5dUU5MHpEbCs4bnNqUDBtaWtn?= =?utf-8?B?OGZSNU5LYzFHL2x4RzFwaUI1SjFRPT0=?= X-OriginatorOrg: allegrodvt.com X-MS-Exchange-CrossTenant-Network-Message-Id: 017d864a-ea40-42c6-9ec7-08dd99ffd86d X-MS-Exchange-CrossTenant-AuthSource: MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 May 2025 13:43:48.4597 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 6c7a5ec0-2d92-465a-a3e1-9e3f1e9fd917 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 8E3kV80tJDsWoj1sSBx2GbV7worMy8PyK7klyorKcfULPqmMwgN+bPdNP+nHnekKGyUViGje6llDt8hVFV3ZtbJPDIqPwf/9LX2Ibk8D9fQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PATP264MB4619 Add SAS (Soci=C3=A9t=C3=A9 par actions simplifi=C3=A9e) to the allegro of v= endor prefixe description to include French simplified joint-stock company legal structure. Signed-off-by: Yassine Ouaissa Reviewed-by: or Acked-by:, please make sure to edit your commit message --- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Docum= entation/devicetree/bindings/vendor-prefixes.yaml index 86f6a19b28ae..51c1c10fe649 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.yaml +++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml @@ -82,7 +82,7 @@ patternProperties: "^alfa-network,.*": description: ALFA Network Inc. "^allegro,.*": - description: Allegro DVT + description: Allegro DVT, SAS. "^allegromicro,.*": description: Allegro MicroSystems, Inc. "^alliedvision,.*": --=20 2.30.2 From nobody Sun Dec 14 19:30:16 2025 Received: from PAUP264CU001.outbound.protection.outlook.com (mail-francecentralazon11021082.outbound.protection.outlook.com [40.107.160.82]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0C7AA2949FE; Fri, 23 May 2025 13:44:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.160.82 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748007858; cv=fail; b=gsuZ+AlTKBAbw/KsK2yrMpw1ZnPMd3oZpDy0R9mugoPAbuBG8l4s3MYM1Gne09Yhy6kaQwFFpxftLYE3aNs/PkFfGlqKICgGgEPRH70pqBdx2DMVrPQ44jywq96BbnzK0TM4ntUlU/26xaEoVHnk0+uivZg92bJ74oF+xsciaPk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748007858; c=relaxed/simple; bh=e+NNkEKegADgn869v7/mMqx3zXTz8wvLhFvnvfvS7Ts=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=ADDMhG27rU+YnllRxwmys1Zr/mU2p3q9boTMx4dCgM7//rBOa1zgyX7E+wyIHy1uc+fkpr1xem2dbFvd+x0mKmav8QZ0gLEGP/1Mwk6JAiuo3v+o8OYbWZZVZokEEspcrTbE9XnOo07ZxOIjc7S4lEAngD1wp4G9wUOMJjr3Im8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=allegrodvt.com; spf=pass smtp.mailfrom=allegrodvt.com; dkim=pass (2048-bit key) header.d=allegrodvt.com header.i=@allegrodvt.com header.b=u+nkXOOj; arc=fail smtp.client-ip=40.107.160.82 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=allegrodvt.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=allegrodvt.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=allegrodvt.com header.i=@allegrodvt.com header.b="u+nkXOOj" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QADtrg0fHkzbjcjqMfccO2afsGcgE/I09Wyc6RpT8GCW7O5ZPYcB35J4ijgN7bP8zFLavyyhq33Pi7l8E2AQaLnuAolQ6RGFZQXIjasHt2ng8O61VH9LmA1Mc4DyC7aIeTl5ahk4Ls5GNO3S7pvvEF3ilKv83DexkirgYtBMTPkBur9Ob7zYH3S+FXUwI7MCJXFkNalT6jMitXfq3JdEkE5ojnDC3IOHzOzM3lCuDwfsuesGG87YbeTZe3/0A72uDIJKes4UD3+8uRQmGee2vSwZcbcdF8d86CVW0v98xXD57bnOdP4dMAUnhxeD4CA+2eS7hsqUXn41wRItfRF4qA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=wqG4fHOtIJkNy+Nj2ZVpuLlzPvB3hQMMQNbxuneC670=; b=ZaVGIrBiyul0Dc61zpJmAeFHpNMOdIx1MT3MTj00paPShy7F0o/I+NkPBLep6W15oyotL+lp+EfZuIepqnzz6brdgeG6GauvQFwmCLK4BjeN9I7EmkJEWaqkgen+wyBU0YsF1nf/FREvuoeNIoYctEgCBREwMZsp7M+QPRdHjQTfsTJETJKfgV+U9c/+7iqnpwiHM1PnwNN9garLbhIGyiP5slWibXjPbzBa/Abd0RqjH2wj7gJpuujMj3/K/CCOkdOxksD8kFwkOo+6fBCnfCKtclSLbozcEmnTBeuXHuoZPi8l866mAH5tcleH8k6OZGo40Wt9E7BHQouV5KAjlA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=allegrodvt.com; dmarc=pass action=none header.from=allegrodvt.com; dkim=pass header.d=allegrodvt.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=allegrodvt.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wqG4fHOtIJkNy+Nj2ZVpuLlzPvB3hQMMQNbxuneC670=; b=u+nkXOOjI6ax9l4jzxFn61sUpxWtwQUzar1Dugb5kt952KRBQEAyrag71U5F4yq+AxeIb1pK6WqJz6x6kQgFtSRUV6aGcEDTEhSKMrw0pcl9duv1QvABIipxTlSXavLJdOw7jYs5kzqWTTlo2DxsJ6LeguUbZ2nt3toMzaROXW+/wGdXaKwtpya68of4lm8HaVIzNXtjLU6f2cvNU+j80Fc7ScNLZdatye8+kWRLVzS3SwxKnaQL9NnqriQcoiE5g6QVfnOQg25NoUljiAZYO3BnF8SadtxxTVl1ARnUAiDVQT1LHEd7QR6w05K2A/W3W/UP8zW5uCZlY02x/I8Z2w== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=allegrodvt.com; Received: from MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:3d::18) by MRYP264MB6317.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:6f::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8769.22; Fri, 23 May 2025 13:44:09 +0000 Received: from MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM ([fe80::4281:c926:ecc4:8ba5]) by MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM ([fe80::4281:c926:ecc4:8ba5%2]) with mapi id 15.20.8769.019; Fri, 23 May 2025 13:44:09 +0000 From: Yassine Ouaissa To: Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Michael Tretter , Yassine OUAISSA , Pengutronix Kernel Team , Michal Simek , Neil Armstrong , Heiko Stuebner , =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= , Junhao Xie , Kever Yang , Manivannan Sadhasivam , Hans Verkuil , Sebastian Fricke , Andrzej Pietrasiewicz , Joe Hattori , Wolfram Sang , Gaosheng Cui , Christophe JAILLET , =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= , Ricardo Ribalda , linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 5/5] media: allegro-dvt: Add Gen 3 IP stateful decoder driver Date: Fri, 23 May 2025 15:41:50 +0200 Message-Id: <20250523134207.68481-6-yassine.ouaissa@allegrodvt.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250523134207.68481-1-yassine.ouaissa@allegrodvt.com> References: <20250523134207.68481-1-yassine.ouaissa@allegrodvt.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PA7P264CA0409.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:39b::26) To MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:3d::18) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MR1P264MB3140:EE_|MRYP264MB6317:EE_ X-MS-Office365-Filtering-Correlation-Id: 01ffcc7c-ae3b-4d29-f44b-08dd99ffe4b3 X-LD-Processed: 6c7a5ec0-2d92-465a-a3e1-9e3f1e9fd917,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|7416014|376014|4022899009|10070799003|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?7udkqf/u8y+p8/lyxDw37Gk4RdbHOeu1EWlD/t4Y4IG71M5/WAH+yy1ShcSt?= =?us-ascii?Q?RF3RqR9vaWty999gS85mYs3vJxwoSWSkMk3WIiOBADi+na4S3nqJCxKIZClQ?= =?us-ascii?Q?EtX6svBenNx6Av0MExNjih9LccQPSi33gQnXkeFR8mBk1d5CKJxfXfKTlxKC?= =?us-ascii?Q?czjkc6kyjdMq05jmi9bk5jTClYE8nZw6teF/l5GSuolMQiVKpLLQU/5sxxtk?= =?us-ascii?Q?wVyTWvTpXnFwZJmiQxGSlQJsrw9o1++KNLV9+/tNoTv/2g8kKGG12T9KHx9E?= =?us-ascii?Q?aXpwpU6jxgVAgPnErAbWaFonZC6+xUkIhoZ2l0HQ+PG5UfQUkwakuXaxOV4K?= =?us-ascii?Q?6OqlIVLtOepGZr6DFyrxLbcBPwM57ameEcvEGUAWmWWeZroLQhIVhDNILWf8?= =?us-ascii?Q?cqQ7ZbfoYyJ7Alt8n0xCG6usb0WQMMnOM4eGVRpQBsdnS/cy64HWMLE3fuvm?= =?us-ascii?Q?jEWl6rLecss1IvL1jskwf6VyPvKmBgNjZIkNEXpTk51h5lgfQ0RF9G7GguLv?= =?us-ascii?Q?2kmNzpFx7lVG+sCFRa3oLaHv46oHw/2VpccxxkRZAHhpA615p/DIInSfpp6n?= =?us-ascii?Q?zSlegsC8NKqODzZyVbrLjbWxnZyKe6xxJH8/2z2rmYFpBRro9jjwQbRdiX5f?= =?us-ascii?Q?0PZZJ6IwQrMswFuFXFpt7X7Y//Gid1xPz/BUdj6rvYWwAAm7wprnoaAuYvBi?= =?us-ascii?Q?3qdcEVZE5gWRItp69zkGM8GLaLlHBROcwYpguAfpcS24wUn1u5Jzy7hpdsXF?= =?us-ascii?Q?k9nxYwlLn+ccmVa0gXL9ZwIqfsFdIBSGZh3b37sEybebJlmAnuBQEU6T2kwy?= =?us-ascii?Q?Een+AI+pqyeYRUmJ4/G2p88sTXHmsCrHnZjcmWaoEc9UH+T02JjWNWb9YpGD?= =?us-ascii?Q?xX12BYwCCDjDzMsHHJ4JTnCV1jMyq8uVAYYgUz5BM+f8yZaKcono8lsskasu?= =?us-ascii?Q?BiyOBRdMSTs95pOn3uAQhrO6V55tXSRs5rfQPq64R68brbeVj84pUYB7sFfl?= =?us-ascii?Q?6GOIFEuUlenCVhV6SQoT/oWY3x77FkMXa85k5ITEHregd91nXOuikpeKAUiq?= =?us-ascii?Q?FZLJ1gpBQLB+O+H149oekoX3MAJvzwLNjVjcDR9xQdsOmlPJFf3g0kxpGgSB?= =?us-ascii?Q?iEeE+0FdDYZY14tAQT+La15QHAa7uzQ/jmJnvJAdvp/j75/rH/re7rW0CRXg?= =?us-ascii?Q?VUnPexT+5z0DfhvILS3lT5Fi6bF6RNLuFAsVEXrercy1Dd1OalCr3gdu3Dt3?= =?us-ascii?Q?tUpysv5SeNG+R4HWOBONX4c4i/l/Mqo4nNInhOjPlViFYbeXCR2GCQYFIHYr?= =?us-ascii?Q?t5QTOhuIhQh2Q6APtFsIYY3CLueM4LGeq4KUZ/PtwwaT6ELsAEb+H1ED80AT?= =?us-ascii?Q?g0yWMM0dj/eLV+3DpMaiSHoCuPVSjHyhKFs1IczENillleyQ2txW+psviBoY?= =?us-ascii?Q?nx1j2tCCwiEhKblYKyL/x0EFMGBRUmYLp6qZ+tmuiq9kXhEcK0SluQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(7416014)(376014)(4022899009)(10070799003)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?eYGPmphfLkF0c9wK/KibDwcmrbxJfYqeK9ZT9zqQNTIEaEGKMZ21P6oAB+Fw?= =?us-ascii?Q?j2VV7OaG4IdZ4eDHv1dX5YWVq8/GI4t8Cr6+jrnb+F2OHYyRY52rMebgrxoO?= =?us-ascii?Q?v6vw3XZKZ5qeoMxv8yslduLMOFNo5wDitno2NYGRDgeLtJBzLa/NGxIzWS7K?= =?us-ascii?Q?SxedwMEXcVLstoJYb+IazMn1rQ8A+2dNfjSCcDodNkl3EeA5iA7y51+2HTVB?= =?us-ascii?Q?K19LZTrOcjMOwLFSahSF9V/IyMMwglqqeAq3hZkr2cridgu96IPnjMV4qbEh?= =?us-ascii?Q?mk36COpPDbCg7clPJivx3Rd8xtezCXGaeWEwS0jSiEMtGSfaIXWAmIW9MiBk?= =?us-ascii?Q?ovFC24mPD5FKwk+aiTAtbBiZJNpAlGnXoAyJY7qLdJWg/SVC0P7pu0ApgkiD?= =?us-ascii?Q?GoDcsjQXn/zQQfxq7lZBfN8drtAFK2cWs0fWQ1cb9DF2qdkRhtitCCWzyg33?= =?us-ascii?Q?hSpUGfABQ3aZcG6oxFDmBO856uz+Kvwl0Bea/4TMKKmyP1MKeN5kiOVCy0DB?= =?us-ascii?Q?qXUZm4RFqngYwsYbYrV+xFg9ajTOjViDr09A87nHRUw0TBEA0i+3ByR+5g2I?= =?us-ascii?Q?W4IicEF/saFEP2VX9ZU7ft/nUlV05yHzD7rY7HvbwZG7oNiP5UWFBkGN9axC?= =?us-ascii?Q?arLmOC1S60kiiEHWoaxHIi6hwvNvb+UEhZKN1x3MnVUf8K07YRAu7rQ+P1F2?= =?us-ascii?Q?OqiOxZO4FIKI0Gub1gs/yczIqU24pj/rdry8yXJu0XW45JQVKj+qw9IMRQk6?= =?us-ascii?Q?5EuIreHJzM07LwZUMHvHXIhQxfxfqFbiLTW9OBjndOO1L1Mw6qo08qH+iHA8?= =?us-ascii?Q?47HXWARKZ+k9GG45IVQ+qXTlEnfixkoqDExAJSLZczQ6kX7lNO491gR7l0jp?= =?us-ascii?Q?ZZvcsTIKbu8FsY9nfWkeROpLsQ0BgO2EfkXU7TKc5E9gBhJRtq+y2MMWiVS3?= =?us-ascii?Q?BbqZS8x3rEDDvkT/lmDPLF+fBpdXI/gfRfI6ax3IOcZP0fNlQER/v5mRi4vC?= =?us-ascii?Q?BARPNB+3F1BfeAzNvzisHLg4HNWm5XmYd/Ooiza7EB/uBSSdiVP1qDUgChrA?= =?us-ascii?Q?VfcFhAgRrkLfwGWY5vVYiSEqez9umBF4EVRCIJ9/G3sFqT7f/+9HlZHbfFeS?= =?us-ascii?Q?yhi5/fdQyRLBktThOPW/Y+BfNtkRArOZfm+TOOIk3dp0qbdoyxOriP/VdbBb?= =?us-ascii?Q?HKTSpa0DvL0kTA0rvW9IEqYjdGUMrIsREjB1vS+A56/c/f0E7OLJZDnZJrhp?= =?us-ascii?Q?SCFf8V0cozcZo5cz8VlkI+7JFaCy9k3J4DTk8IBFEcVEGi5+JeaY7XDySjx6?= =?us-ascii?Q?hih1QtOUZG5PW0vDye9S2qcl1dd14JbXniU5fbSr6w++aiM6M/NyW750OfjU?= =?us-ascii?Q?cshiML6RU0Ilkn5cbJafLuDZoArJufSGs9Rs3GF2pyHnPI1Zc1sM5F5vzbH1?= =?us-ascii?Q?pqR6PNacC9d7DDOQVMdlUGs6lQxjiTVALVAN4YtUTnP0qPoMnM5GyeZGTTPj?= =?us-ascii?Q?HMVQfMtVXpYHu6uVdKJ1Dfnsr40mePTP2N+LOLnPgOnaQa1NChWC+poJ6LZH?= =?us-ascii?Q?8mrfEkYXzuNS+voWB+QpKcp0R5rT0fMgUYEs10OrAnjWQXvcAi6wFfi/x6Uz?= =?us-ascii?Q?AIUa6oNLej7WRrP+F6MeqQSVtohtdc1VMoabx075nHR/pMQtfxbexiIa5mYf?= =?us-ascii?Q?2/W4Qg=3D=3D?= X-OriginatorOrg: allegrodvt.com X-MS-Exchange-CrossTenant-Network-Message-Id: 01ffcc7c-ae3b-4d29-f44b-08dd99ffe4b3 X-MS-Exchange-CrossTenant-AuthSource: MR1P264MB3140.FRAP264.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 May 2025 13:44:09.1286 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 6c7a5ec0-2d92-465a-a3e1-9e3f1e9fd917 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: j7w+3GU8w8vGJx3osGEdHJmU+xcKwDbtdL23XZXeuFqyXhkzxqDRKf0FDzI76V7TUK2LryUaaotlfuHXTa6McCKEAqIJ0bRwN7qXLeMASr4= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MRYP264MB6317 Content-Type: text/plain; charset="utf-8" This commit introduces a new allegro-dvt V4L2 stateful decoder driverfor the Gen 3 IP with support for: - AVC (H.264), HEVC (H.265), and JPEG decoding - Output formats: NV12, NV16, I420, and P010 for capture MAINTAINERS: Add entry for the allegro-dvt Gen 3 driver. Signed-off-by: Yassine Ouaissa Reviewed-by: or Acked-by:, please make sure to edit your commit message --- MAINTAINERS | 1 + drivers/media/platform/allegro-dvt/Kconfig | 1 + drivers/media/platform/allegro-dvt/Makefile | 1 + .../media/platform/allegro-dvt/al300/Kconfig | 23 + .../media/platform/allegro-dvt/al300/Makefile | 6 + .../allegro-dvt/al300/al_codec_common.c | 754 ++++++++ .../allegro-dvt/al300/al_codec_common.h | 247 +++ .../allegro-dvt/al300/al_codec_util.c | 177 ++ .../allegro-dvt/al300/al_codec_util.h | 185 ++ .../platform/allegro-dvt/al300/al_vdec_drv.c | 1530 +++++++++++++++++ .../platform/allegro-dvt/al300/al_vdec_drv.h | 94 + 11 files changed, 3019 insertions(+) create mode 100644 drivers/media/platform/allegro-dvt/al300/Kconfig create mode 100644 drivers/media/platform/allegro-dvt/al300/Makefile create mode 100644 drivers/media/platform/allegro-dvt/al300/al_codec_commo= n.c create mode 100644 drivers/media/platform/allegro-dvt/al300/al_codec_commo= n.h create mode 100644 drivers/media/platform/allegro-dvt/al300/al_codec_util.c create mode 100644 drivers/media/platform/allegro-dvt/al300/al_codec_util.h create mode 100644 drivers/media/platform/allegro-dvt/al300/al_vdec_drv.c create mode 100644 drivers/media/platform/allegro-dvt/al300/al_vdec_drv.h diff --git a/MAINTAINERS b/MAINTAINERS index 9285bb2f43d9..8912fabab6ed 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -808,6 +808,7 @@ L: linux-media@vger.kernel.org S: Maintained F: Documentation/devicetree/bindings/media/allegro,al5e.yaml F: Documentation/devicetree/bindings/media/allegrodvt,al300-vdec.yaml +F: drivers/media/platform/allegro-dvt/al300 F: drivers/media/platform/allegro-dvt/zynqmp =20 ALLIED VISION ALVIUM CAMERA DRIVER diff --git a/drivers/media/platform/allegro-dvt/Kconfig b/drivers/media/pla= tform/allegro-dvt/Kconfig index e9008614c27b..0d01ed0ad08a 100644 --- a/drivers/media/platform/allegro-dvt/Kconfig +++ b/drivers/media/platform/allegro-dvt/Kconfig @@ -2,4 +2,5 @@ =20 comment "Allegro DVT media platform drivers" =20 +source "drivers/media/platform/allegro-dvt/al300/Kconfig" source "drivers/media/platform/allegro-dvt/zynqmp/Kconfig" diff --git a/drivers/media/platform/allegro-dvt/Makefile b/drivers/media/pl= atform/allegro-dvt/Makefile index d2aa6875edcf..c70ca19a47fb 100644 --- a/drivers/media/platform/allegro-dvt/Makefile +++ b/drivers/media/platform/allegro-dvt/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 =20 +obj-y +=3D al300/ obj-y +=3D zynqmp/ diff --git a/drivers/media/platform/allegro-dvt/al300/Kconfig b/drivers/med= ia/platform/allegro-dvt/al300/Kconfig new file mode 100644 index 000000000000..0bc3d7a79f14 --- /dev/null +++ b/drivers/media/platform/allegro-dvt/al300/Kconfig @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: GPL-2.0-only + +config VIDEO_ALLEGRO_DVT_D300 + tristate "Allegro DVT Video IP Decode Gen 3" + depends on V4L_MEM2MEM_DRIVERS + depends on VIDEO_DEV && OF && HAS_DMA + select V4L2_MEM2MEM_DEV + select VIDEOBUF2_DMA_CONTIG + help + This is a video4linux2 driver for the Allegro DVT IP Decode Gen 3, + that support codecs : AVC (H.264), HEVC (H.265), and JPEG. + + The driver provides hardware acceleration for video decoding operations, + enabling efficient processing of compressed video streams on platforms + featuring this IP block. It handles memory management, buffer allocatio= n, + and decoder command sequencing to deliver optimized performance. + + The driver integrates with the V4L2 framework and videobuf2 subsystem + to provide a standard interface for applications requiring video + decoding capabilities. + + To compile this driver as a module, choose M here. The module + will be called al300-vdec. diff --git a/drivers/media/platform/allegro-dvt/al300/Makefile b/drivers/me= dia/platform/allegro-dvt/al300/Makefile new file mode 100644 index 000000000000..3c50caccb731 --- /dev/null +++ b/drivers/media/platform/allegro-dvt/al300/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0 + +al300-vdec-objs :=3D al_codec_common.o al_codec_util.o +al300-vdec-objs +=3D al_vdec_drv.o + +obj-$(CONFIG_VIDEO_ALLEGRO_DVT_D300) +=3D al300-vdec.o diff --git a/drivers/media/platform/allegro-dvt/al300/al_codec_common.c b/d= rivers/media/platform/allegro-dvt/al300/al_codec_common.c new file mode 100644 index 000000000000..0aee82b6335a --- /dev/null +++ b/drivers/media/platform/allegro-dvt/al300/al_codec_common.c @@ -0,0 +1,754 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Core MCU functionality including firmware loading, + * memory allocation, and general MCU interaction interfaces + * + * Copyright (c) 2025 Allegro DVT. + * Author: Yassine OUAISSA + */ +#include +#include +#include +#include +#include +#include +#include + +#include "al_codec_common.h" + +#define AL_CODEC_UID 0x0000 +#define AL_CODEC_RESET 0x0010 +#define AL_CODEC_IRQ_MASK 0x0014 +#define AL_CODEC_IRQ_STATUS_CLEAR 0x0018 +#define AL_CODEC_MCU_CLK 0x0400 +#define AL_CODEC_MCU_RST 0x0404 +#define AL_CODEC_MCU_IRQ 0x040C +#define AL_CODEC_MCU_BOOT_ADDR_HI 0x0410 +#define AL_CODEC_MCU_BOOT_ADDR_LO 0x0414 +#define AL_CODEC_MCU_IP_START_ADDR_HI 0x0418 +#define AL_CODEC_MCU_IP_START_ADDR_LO 0x041C +#define AL_CODEC_MCU_IP_END_ADDR_HI 0x0420 +#define AL_CODEC_MCU_IP_END_ADDR_LO 0x0424 +#define AL_CODEC_MCU_PERIPH_ADDR_HI 0x0428 +#define AL_CODEC_MCU_PERIPH_ADDR_LO 0x042C +#define AL_CODEC_MCU_IRQ_MASK 0x0440 +#define AL_CODEC_INST_OFFSET_HI 0x0450 +#define AL_CODEC_INST_OFFSET_LO 0x0454 +#define AL_CODEC_DATA_OFFSET_HI 0x0458 +#define AL_CODEC_DATA_OFFSET_LO 0x045C + +#define AL_CODEC_UID_ID 0x30AB6E51 +#define AL_CODEC_IRQ_MCU_2_CPU BIT(30) +#define AL_CODEC_IP_OFFSET GENMASK(26, 25) +#define AL_CODEC_APB_MASK GENMASK(26, 0) +#define AL_CODEC_MAX_ADDR GENMASK_ULL(38, 0) + +#define AL_CODEC_MCU_BOOT_RESET_WAIT 2 /* in ms */ +#define AL_CODEC_REG_ENABLE BIT(0) +#define AL_CODEC_REG_DISABLE 0 + +/* + * struct codec_dma_buf - Allocated dma buffer + * + * @list: list head for buffer queue + * @paddr: physical address of the allcated DMA buffer + * @vaddr: virtual address of the allocated DMA buffer + * @size: Size of allocated dma memory + */ +struct codec_dma_buf { + void *vaddr; + dma_addr_t paddr; + u32 size; + struct list_head list; +}; + +struct mb_header { + u64 start; + u64 end; +} __packed; + +struct boot_header { + u32 bh_version; + u32 fw_version; + char model[16]; + u64 vaddr_start; + u64 vaddr_end; + u64 vaddr_boot; + struct mb_header h2m; + struct mb_header m2h; + u64 machine_id; + /* fill by driver before fw boot */ + u64 ip_start; + u64 ip_end; + u64 mcu_clk_rate; +} __packed; + +static u32 al_common_read(struct al_codec_dev *dev, u32 offset) +{ + return readl(dev->regs + offset); +} + +static void al_common_write(struct al_codec_dev *dev, u32 offset, u32 val) +{ + writel(val, dev->regs + offset); +} + +static void al_common_trigger_mcu_irq(void *arg) +{ + struct al_codec_dev *dev =3D arg; + + al_common_write(dev, AL_CODEC_MCU_IRQ, BIT(0)); +} + +static inline void al_common_reset(struct al_codec_dev *dev) +{ + /* reset ip */ + al_common_write(dev, AL_CODEC_RESET, AL_CODEC_REG_ENABLE); + + /* reset and stop mcu */ + al_common_write(dev, AL_CODEC_MCU_CLK, AL_CODEC_REG_ENABLE); + al_common_write(dev, AL_CODEC_MCU_RST, AL_CODEC_REG_ENABLE); + /* time to reset the mct */ + mdelay(AL_CODEC_MCU_BOOT_RESET_WAIT); + al_common_write(dev, AL_CODEC_MCU_CLK, AL_CODEC_REG_DISABLE); + + al_common_write(dev, AL_CODEC_MCU_IRQ, AL_CODEC_REG_DISABLE); + al_common_write(dev, AL_CODEC_MCU_IRQ_MASK, AL_CODEC_REG_DISABLE); + + mdelay(AL_CODEC_MCU_BOOT_RESET_WAIT * 5); + al_common_write(dev, AL_CODEC_MCU_RST, AL_CODEC_REG_DISABLE); +} + +static int al_common_setup_hw_regs(struct al_codec_dev *dev) +{ + u64 reg_start, reg_end; + dma_addr_t boot_addr; + unsigned int id; + + id =3D al_common_read(dev, AL_CODEC_UID); + + if (id !=3D AL_CODEC_UID_ID) { + al_codec_err(dev, "bad device id, expected 0x%08x, got 0x%08x", + AL_CODEC_UID_ID, id); + return -ENODEV; + } + + boot_addr =3D dev->firmware.phys + dev->firmware.bin_data.offset; + + /* Reset MCU step */ + al_common_reset(dev); + + /* Configure the MCU*/ + al_common_write(dev, AL_CODEC_IRQ_MASK, AL_CODEC_IRQ_MCU_2_CPU); + /* Set Instruction and data offset */ + al_common_write(dev, AL_CODEC_INST_OFFSET_HI, 0); + al_common_write(dev, AL_CODEC_INST_OFFSET_LO, 0); + al_common_write(dev, AL_CODEC_DATA_OFFSET_HI, 0); + al_common_write(dev, AL_CODEC_DATA_OFFSET_LO, 0); + + reg_start =3D dev->regs_info->start; + reg_end =3D reg_start + resource_size(dev->regs_info); + al_common_write(dev, AL_CODEC_MCU_IP_START_ADDR_HI, + upper_32_bits(reg_start)); + al_common_write(dev, AL_CODEC_MCU_IP_START_ADDR_LO, + lower_32_bits(reg_start)); + al_common_write(dev, AL_CODEC_MCU_IP_END_ADDR_HI, + upper_32_bits(reg_end)); + al_common_write(dev, AL_CODEC_MCU_IP_END_ADDR_HI, + lower_32_bits(reg_end)); + + al_common_write(dev, AL_CODEC_MCU_PERIPH_ADDR_HI, + upper_32_bits(dev->apb)); + al_common_write(dev, AL_CODEC_MCU_PERIPH_ADDR_LO, + lower_32_bits(dev->apb)); + + al_common_write(dev, AL_CODEC_MCU_BOOT_ADDR_HI, + upper_32_bits(boot_addr)); + al_common_write(dev, AL_CODEC_MCU_BOOT_ADDR_LO, + lower_32_bits(boot_addr)); + + return 0; +} + +static void al_common_dma_buf_insert(struct al_codec_dev *dev, + struct codec_dma_buf *buf) +{ + mutex_lock(&dev->buf_lock); + list_add(&buf->list, &dev->alloc_buffers); + mutex_unlock(&dev->buf_lock); +} + +static void al_common_dma_buf_remove(struct al_codec_dev *dev, + struct codec_dma_buf *buf) +{ + mutex_lock(&dev->buf_lock); + list_del(&buf->list); + mutex_unlock(&dev->buf_lock); +} + +static struct codec_dma_buf *al_common_dma_buf_lookup(struct al_codec_dev = *dev, + dma_addr_t buf_paddr) +{ + struct codec_dma_buf *buf =3D NULL; + + mutex_lock(&dev->buf_lock); + list_for_each_entry(buf, &dev->alloc_buffers, list) + if (likely(buf->paddr =3D=3D buf_paddr)) + break; + + mutex_unlock(&dev->buf_lock); + + return list_entry_is_head(buf, &dev->alloc_buffers, list) ? NULL : buf; +} + +static void al_common_dma_buf_cleanup(struct al_codec_dev *dev) +{ + struct codec_dma_buf *buf, *tmp; + + mutex_lock(&dev->buf_lock); + list_for_each_entry_safe(buf, tmp, &dev->alloc_buffers, list) { + dma_free_coherent(&dev->pdev->dev, buf->size, buf->vaddr, + buf->paddr); + list_del(&buf->list); + kfree(buf); + } + mutex_unlock(&dev->buf_lock); +} + +static int al_common_setup_dma(struct al_codec_dev *dev) +{ + int ret; + + /* setup dma memory mask */ + ret =3D dma_set_mask_and_coherent(&dev->pdev->dev, DMA_BIT_MASK(64)); + if (ret) { + al_codec_err(dev, "failed to set dma"); + return -EINVAL; + } + + /* Try to use reserved memory if we got one */ + ret =3D of_reserved_mem_device_init(&dev->pdev->dev); + if (ret && ret !=3D ENODEV) + dev_warn(&dev->pdev->dev, + "No reserved memory, use cma instead\n"); + + return 0; +} + +static void *al_common_dma_alloc(struct al_codec_dev *dev, size_t size, + dma_addr_t *paddr, gfp_t flag) +{ + void *vaddr; + + vaddr =3D dma_alloc_coherent(&dev->pdev->dev, size, paddr, flag); + + if (!vaddr) + return NULL; + + /* PADDR <=3D (2^39 - 1) (39-bit MCU PADDR) */ + if ((*paddr + size) > AL_CODEC_MAX_ADDR) { + al_codec_err(dev, "mem check failed for 0x%16llx of size %zu", + *paddr, size); + dma_free_coherent(&dev->pdev->dev, size, vaddr, *paddr); + return NULL; + } + + return vaddr; +} + +void al_common_remove(struct al_codec_dev *dev) +{ + al_common_dma_buf_cleanup(dev); + + /* reset device */ + al_common_reset(dev); + clk_disable_unprepare(dev->clk); + dma_free_coherent(&dev->pdev->dev, dev->firmware.size, + dev->firmware.virt, dev->firmware.phys); + + if (dev->firmware.firmware) + release_firmware(dev->firmware.firmware); +} + +static void handle_alloc_memory_req(struct al_codec_dev *dev, + struct msg_itf_header *hdr) +{ + struct msg_itf_alloc_mem_reply_full reply; + struct msg_itf_alloc_mem_req req; + struct codec_dma_buf *buf; + int ret; + + reply.reply.phyAddr =3D 0; + reply.hdr.type =3D MSG_ITF_TYPE_ALLOC_MEM_REPLY; + /* both fields embed info need to finish request */ + reply.hdr.drv_ctx_hdl =3D hdr->drv_ctx_hdl; + reply.hdr.drv_cmd_hdl =3D hdr->drv_cmd_hdl; + reply.hdr.payload_len =3D sizeof(reply.reply); + + ret =3D al_common_get_data(dev, (char *)&req, hdr->payload_len); + if (ret) { + al_codec_err(dev, "Unable to get cma req"); + return; + } + + buf =3D kmalloc(sizeof(*buf), GFP_KERNEL); + if (!buf) + goto send_reply; + + buf->size =3D req.uSize; + buf->vaddr =3D + al_common_dma_alloc(dev, req.uSize, &buf->paddr, GFP_KERNEL); + if (!buf->vaddr) + goto send_reply; + + reply.reply.phyAddr =3D (u64)buf->paddr; + al_common_dma_buf_insert(dev, buf); + +send_reply: + ret =3D al_common_send(dev, &reply.hdr); + if (ret) { + al_codec_err(dev, "Unable to reply to cma alloc"); + al_common_dma_buf_remove(dev, buf); + } +} + +static void handle_free_memory_req(struct al_codec_dev *dev, + struct msg_itf_header *hdr) +{ + struct msg_itf_free_mem_reply_full reply; + struct msg_itf_free_mem_req req; + struct codec_dma_buf *buf; + int ret; + + reply.hdr.type =3D MSG_ITF_TYPE_FREE_MEM_REPLY; + /* both fields embed info need to hinish request */ + reply.hdr.drv_ctx_hdl =3D hdr->drv_ctx_hdl; + reply.hdr.drv_cmd_hdl =3D hdr->drv_cmd_hdl; + reply.hdr.payload_len =3D sizeof(reply.reply); + reply.reply.ret =3D -1; + + ret =3D al_common_get_data(dev, (char *)&req, hdr->payload_len); + if (ret) { + al_codec_err(dev, "Unable to put cma req"); + return; + } + + buf =3D al_common_dma_buf_lookup(dev, req.phyAddr); + al_codec_dbg(dev, "req.phyAddr =3D %p =3D> %p, Size %d", + (void *)(long)req.phyAddr, buf, buf->size); + if (!buf) { + al_codec_err(dev, "Unable to get dma handle for %p", + (void *)(long)req.phyAddr); + reply.reply.ret =3D -EINVAL; + goto send_reply; + } + + dma_free_coherent(&dev->pdev->dev, buf->size, buf->vaddr, buf->paddr); + al_common_dma_buf_remove(dev, buf); + reply.reply.ret =3D 0; + +send_reply: + ret =3D al_common_send(dev, &reply.hdr); + if (ret) + al_codec_err(dev, "Unable to reply to cma free"); +} + +static void handle_mcu_console_print(struct al_codec_dev *dev, + struct msg_itf_header *hdr) +{ +#if defined(DEBUG) + struct msg_itf_write_req *req; + int ret; + + /* one more byte to be sure to have a zero terminated string */ + req =3D kzalloc(hdr->payload_len + 1, GFP_KERNEL); + if (!req) { + al_common_skip_data(dev, hdr->payload_len); + al_codec_err(dev, "Unable to alloc memory"); + return; + } + + ret =3D al_codec_msg_get_data(&dev->mb_m2h, (char *)req, + hdr->payload_len); + if (ret) { + al_codec_err(dev, "Unable to get request"); + kfree(req); + return; + } + + /* Print the mcu logs */ + dev_dbg(&dev->pdev->dev, "[ALG_MCU] %s(),%d: %s\n", __func__, __LINE__, + (char *)(req + 1)); + kfree(req); +#else + al_common_skip_data(dev, hdr->payload_len); +#endif +} + +static void process_one_message(struct al_codec_dev *dev, + struct msg_itf_header *hdr) +{ + switch (hdr->type) { + case MSG_ITF_TYPE_ALLOC_MEM_REQ: + handle_alloc_memory_req(dev, hdr); + break; + case MSG_ITF_TYPE_FREE_MEM_REQ: + handle_free_memory_req(dev, hdr); + break; + case MSG_ITF_TYPE_WRITE_REQ: + handle_mcu_console_print(dev, hdr); + break; + case MSG_ITF_TYPE_MCU_ALIVE: + complete(&dev->completion); + break; + default: + dev->process_msg_cb(dev->cb_arg, hdr); + break; + } +} + +static irqreturn_t al_common_irq_handler(int irq, void *data) +{ + struct al_codec_dev *dev =3D data; + struct msg_itf_header hdr; + int ret; + + /* poll all messages */ + while (1) { + ret =3D al_codec_msg_get_header(&dev->mb_m2h, &hdr); + if (ret) + break; + + process_one_message(dev, &hdr); + } + + return IRQ_HANDLED; +} + +static irqreturn_t al_common_hardirq_handler(int irq, void *data) +{ + struct al_codec_dev *dev =3D data; + u32 irq_status; + + irq_status =3D al_common_read(dev, AL_CODEC_IRQ_STATUS_CLEAR); + if (!irq_status) + return IRQ_NONE; + + al_common_write(dev, AL_CODEC_IRQ_STATUS_CLEAR, AL_CODEC_IRQ_MCU_2_CPU); + + return IRQ_WAKE_THREAD; +} + +static int al_common_start_fw(struct al_codec_dev *dev) +{ + /* Enable the MCU clock */ + al_common_write(dev, AL_CODEC_MCU_CLK, AL_CODEC_REG_ENABLE); + + return !wait_for_completion_timeout(&dev->completion, 2 * HZ); +} + +static void al_common_copy_firmware_image(struct al_codec_dev *dev) +{ + const struct firmware *firmware =3D dev->firmware.firmware; + u32 *virt =3D dev->firmware.virt; + size_t i; + + /* copy the whole thing taking into account endianness */ + for (i =3D 0; i < firmware->size / sizeof(u32); i++) + virt[i] =3D le32_to_cpu(((__le32 *)firmware->data)[i]); +} + +static int al_common_read_firmware(struct al_codec_dev *dev, const char *n= ame) +{ + struct platform_device *pdev =3D dev->pdev; + const struct boot_header *bh; + int err; + + /* request_firmware prints error if it fails */ + err =3D request_firmware(&dev->firmware.firmware, name, &pdev->dev); + if (err < 0) + return err; + + bh =3D (struct boot_header *)dev->firmware.firmware->data; + dev->firmware.size =3D bh->vaddr_end - bh->vaddr_start; + + return 0; +} + +static int al_common_parse_firmware_image(struct al_codec_dev *dev) +{ + struct boot_header *bh =3D (void *)dev->firmware.virt; + + if (bh->bh_version < AL_BOOT_VERSION(2, 0, 0) || + bh->bh_version >=3D AL_BOOT_VERSION(3, 0, 0)) { + al_codec_err(dev, "Unsupported firmware version"); + return -EINVAL; + } + + dev->firmware.bin_data.offset =3D bh->vaddr_boot - bh->vaddr_start; + dev->firmware.bin_data.size =3D bh->vaddr_end - bh->vaddr_start; + + dev->firmware.mb_h2m.offset =3D bh->h2m.start - bh->vaddr_start; + dev->firmware.mb_h2m.size =3D bh->h2m.end - bh->h2m.start; + dev->firmware.mb_m2h.offset =3D bh->m2h.start - bh->vaddr_start; + dev->firmware.mb_m2h.size =3D bh->m2h.end - bh->m2h.start; + + /* Override some data */ + bh->ip_start =3D dev->apb + AL_CODEC_IP_OFFSET; + bh->ip_end =3D bh->ip_start + resource_size(dev->regs_info); + bh->mcu_clk_rate =3D clk_get_rate(dev->clk); + + al_codec_dbg(dev, "bh version =3D 0x%08x", bh->bh_version); + al_codec_dbg(dev, "fw version =3D 0x%08x", bh->fw_version); + al_codec_dbg(dev, "fw model =3D %s", bh->model); + al_codec_dbg(dev, "vaddress start =3D 0x%016llx", bh->vaddr_start); + al_codec_dbg(dev, "vaddress end =3D 0x%016llx", bh->vaddr_end); + al_codec_dbg(dev, "boot address =3D 0x%016llx", bh->vaddr_boot); + al_codec_dbg(dev, "machineid =3D %lld", bh->machine_id); + al_codec_dbg(dev, "periph address =3D 0x%016llx", dev->apb); + al_codec_dbg(dev, "ip start =3D 0x%016llx", bh->ip_start); + al_codec_dbg(dev, "ip end =3D 0x%016llx", bh->ip_end); + al_codec_dbg(dev, "mcu clk =3D %llu", bh->mcu_clk_rate); + + return 0; +} + +static int al_common_load_firmware_start(struct al_codec_dev *dev, + const char *name) +{ + struct platform_device *pdev =3D dev->pdev; + dma_addr_t phys; + size_t size; + void *virt; + int err; + + if (dev->firmware.virt) + return 0; + + err =3D al_common_read_firmware(dev, name); + if (err) + return err; + + size =3D dev->firmware.size; + + virt =3D dma_alloc_coherent(&pdev->dev, size, &phys, GFP_KERNEL); + err =3D dma_mapping_error(&pdev->dev, phys); + if (err < 0) + return err; + + dev->firmware.virt =3D virt; + dev->firmware.phys =3D phys; + + al_common_copy_firmware_image(dev); + err =3D al_common_parse_firmware_image(dev); + if (err) { + al_codec_err(dev, "failed to parse firmware image"); + goto cleanup; + } + + err =3D al_common_setup_hw_regs(dev); + if (err) { + al_codec_err(dev, "Unable to setup hw registers"); + goto cleanup; + } + + al_codec_mb_init(&dev->mb_h2m, virt + dev->firmware.mb_h2m.offset, + dev->firmware.mb_h2m.size, MB_IFT_MAGIC_H2M); + + al_codec_mb_init(&dev->mb_m2h, virt + dev->firmware.mb_m2h.offset, + dev->firmware.mb_m2h.size, MB_IFT_MAGIC_M2H); + + err =3D al_common_start_fw(dev); + if (err) { + al_codec_err(dev, "fw start has failed"); + goto cleanup; + } + + al_codec_dbg(dev, "mcu has boot successfully !"); + dev->fw_ready_cb(dev->cb_arg); + + release_firmware(dev->firmware.firmware); + dev->firmware.firmware =3D NULL; + + return 0; +cleanup: + dma_free_coherent(&pdev->dev, size, virt, phys); + + return err; +} + +static u64 al_common_get_periph_addr(struct al_codec_dev *dev) +{ + struct resource *res; + + res =3D platform_get_resource_byname(dev->pdev, IORESOURCE_MEM, "apb"); + if (!res) { + al_codec_err(dev, "Unable to find APB start address"); + return 0; + } + + if (res->start & AL_CODEC_APB_MASK) { + al_codec_err(dev, "APB start address is invalid"); + return 0; + } + + return res->start; +} + +int al_common_probe(struct al_codec_dev *dev, const char *name) +{ + struct platform_device *pdev =3D dev->pdev; + int irq; + int ret; + + mutex_init(&dev->buf_lock); + INIT_LIST_HEAD(&dev->alloc_buffers); + init_completion(&dev->completion); + + /* setup dma memory */ + ret =3D al_common_setup_dma(dev); + if (ret) + return ret; + + /* Hw registers */ + dev->regs_info =3D + platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs"); + if (!dev->regs_info) { + al_codec_err(dev, "regs resource missing from device tree"); + return -EINVAL; + } + + dev->regs =3D devm_ioremap_resource(&pdev->dev, dev->regs_info); + if (!dev->regs) { + al_codec_err(dev, "failed to map registers"); + return -ENOMEM; + } + + dev->apb =3D al_common_get_periph_addr(dev); + if (!dev->apb) + return -EINVAL; + + /* The MCU has already default clock value */ + dev->clk =3D devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(dev->clk)) { + al_codec_err(dev, "failed to get MCU core clock"); + return PTR_ERR(dev->clk); + } + + ret =3D clk_prepare_enable(dev->clk); + if (ret) { + al_codec_err(dev, "Cannot enable MCU clock: %d\n", ret); + return ret; + } + + irq =3D platform_get_irq(pdev, 0); + if (irq < 0) { + al_codec_err(dev, "Failed to get IRQ"); + ret =3D -EINVAL; + goto disable_clk; + } + + ret =3D devm_request_threaded_irq(&pdev->dev, irq, + al_common_hardirq_handler, + al_common_irq_handler, IRQF_SHARED, + dev_name(&pdev->dev), dev); + if (ret) { + al_codec_err(dev, "Unable to register irq handler"); + goto disable_clk; + } + + /* ok so request the fw */ + ret =3D al_common_load_firmware_start(dev, name); + if (ret) { + al_codec_err(dev, "failed to load firmware : %s", name); + goto disable_clk; + } + + return 0; + +disable_clk: + clk_disable_unprepare(dev->clk); + + return ret; +} + +int al_common_send(struct al_codec_dev *dev, struct msg_itf_header *hdr) +{ + return al_codec_msg_send(&dev->mb_h2m, hdr, al_common_trigger_mcu_irq, + dev); +} + +int al_common_send_req_reply(struct al_codec_dev *dev, + struct list_head *cmd_list, + struct msg_itf_header *hdr, + struct al_common_mcu_req *req) +{ + struct al_codec_cmd *cmd =3D NULL; + int ret; + + hdr->drv_cmd_hdl =3D 0; + + if (req->reply_size && req->reply) { + cmd =3D al_codec_cmd_create(req->reply_size); + if (!cmd) + return -ENOMEM; + + hdr->drv_cmd_hdl =3D al_virt_to_phys(cmd); + } + + hdr->drv_ctx_hdl =3D req->pCtx; + hdr->type =3D req->req_type; + hdr->payload_len =3D req->req_size; + + /* Add the list to the cmd list */ + if (cmd) + list_add(&cmd->list, cmd_list); + + ret =3D al_common_send(dev, hdr); + if (ret) + goto remove_cmd; + + al_codec_dbg(dev, "Send req to mcu %d : %ld ", req->req_type, + req->req_size); + + if (!cmd) + return 0; + + ret =3D wait_for_completion_timeout(&cmd->done, 5 * HZ); + if (ret <=3D 0) { + al_codec_err(dev, "cmd %p has %d (%s)", cmd, ret, + (ret =3D=3D 0) ? "failed" : "timedout"); + ret =3D -ETIMEDOUT; + goto remove_cmd; + } + + ret =3D 0; + memcpy(req->reply, cmd->reply, req->reply_size); + +remove_cmd: + + if (cmd) { + list_del(&cmd->list); + al_codec_cmd_put(cmd); + } + return ret; +} + +bool al_common_mcu_is_alive(struct al_codec_dev *dev) +{ + static const struct msg_itf_header hdr =3D { + .type =3D MSG_ITF_TYPE_MCU_ALIVE, + .payload_len =3D 0, + }; + int ret; + + ret =3D al_common_send(dev, (struct msg_itf_header *)&hdr); + if (ret) + return false; + + ret =3D wait_for_completion_timeout(&dev->completion, 5 * HZ); + if (ret <=3D 0) + return false; + + return true; +} diff --git a/drivers/media/platform/allegro-dvt/al300/al_codec_common.h b/d= rivers/media/platform/allegro-dvt/al300/al_codec_common.h new file mode 100644 index 000000000000..41373bbf3671 --- /dev/null +++ b/drivers/media/platform/allegro-dvt/al300/al_codec_common.h @@ -0,0 +1,247 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2025 Allegro DVT. + * Author: Yassine OUAISSA + */ + +#ifndef __AL_CODEC_COMMON__ +#define __AL_CODEC_COMMON__ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "al_codec_util.h" + +#define fh_to_ctx(ptr, type) container_of(ptr, type, fh) + +enum { + MSG_ITF_TYPE_CREATE_INST_REQ =3D MSG_ITF_TYPE_NEXT_REQ, + MSG_ITF_TYPE_DESTROY_INST_REQ, + MSG_ITF_TYPE_PUSH_BITSTREAM_BUFFER_REQ, + MSG_ITF_TYPE_PUT_DISPLAY_PICTURE_REQ, + MSG_ITF_TYPE_FLUSH_REQ, + MSG_ITF_TYPE_INFO_REQ, + MSG_ITF_TYPE_CREATE_INST_REPLY =3D MSG_ITF_TYPE_NEXT_REPLY, + MSG_ITF_TYPE_DESTROY_INST_REPLY, + MSG_ITF_TYPE_PUSH_BITSTREAM_BUFFER_REPLY, + MSG_ITF_TYPE_PUT_DISPLAY_PICTURE_REPLY, + MSG_ITF_TYPE_FLUSH_REPLY, + MSG_ITF_TYPE_INFO_REPLY, + MSG_ITF_TYPE_EVT_ERROR =3D MSG_ITF_TYPE_NEXT_EVT, +}; + +struct msg_itf_write_req { + u32 fd; + u32 len; + /* payload follow */ +} __packed; +DECLARE_FULL_REQ(msg_itf_write_req); + +struct msg_itf_free_mem_req { + phys_addr_t phyAddr; +} __packed; +DECLARE_FULL_REQ(msg_itf_free_mem_req); + +struct msg_itf_alloc_mem_req { + u64 uSize; +} __packed; +DECLARE_FULL_REQ(msg_itf_alloc_mem_req); + +struct msg_itf_alloc_mem_reply { + phys_addr_t phyAddr; +} __packed; +DECLARE_FULL_REPLY(msg_itf_alloc_mem_reply); + +struct msg_itf_free_mem_reply { + s64 ret; +}; +DECLARE_FULL_REPLY(msg_itf_free_mem_reply); + +struct msg_itf_create_codec_reply { + phys_addr_t hCodec; + s32 ret; +} __packed; +DECLARE_FULL_REPLY(msg_itf_create_codec_reply); + +struct msg_itf_destroy_codec_req { + phys_addr_t hCodec; +} __packed; +DECLARE_FULL_REQ(msg_itf_destroy_codec_req); + +/* + * Note : no need to know the status of this request + * The codec should be destroyed, in case of the mcu + * hasn't received any request with the codec handler + */ +struct msg_itf_destroy_codec_reply { + u32 unused; +} __packed; +DECLARE_FULL_REPLY(msg_itf_destroy_codec_reply); + +struct al_buffer_meta { + u64 timestamp; + struct v4l2_timecode timecode; + bool last; +}; + +struct msg_itf_push_src_buf_req { + phys_addr_t hCodec; + phys_addr_t bufferHandle; + phys_addr_t phyAddr; + u64 size; + struct al_buffer_meta meta; +} __packed; +DECLARE_FULL_REQ(msg_itf_push_src_buf_req); + +struct msg_itf_push_dst_buf_req { + phys_addr_t hCodec; + phys_addr_t bufferHandle; + phys_addr_t phyAddr; + u64 size; +} __packed; +DECLARE_FULL_REQ(msg_itf_push_dst_buf_req); + +struct msg_itf_push_buffer_req { + phys_addr_t hCodec; + phys_addr_t bufferHandle; + phys_addr_t phyAddr; + u64 size; +} __packed; +DECLARE_FULL_REQ(msg_itf_push_buffer_req); + +struct msg_itf_push_buffer_reply { + s32 res; +} __packed; +DECLARE_FULL_REPLY(msg_itf_push_buffer_reply); + +struct msg_itf_info_req { + u64 unused; +} __packed; +DECLARE_FULL_REQ(msg_itf_info_req); + +struct msg_itf_flush_req { + phys_addr_t hCodec; +} __packed; +DECLARE_FULL_REQ(msg_itf_flush_req); + +struct msg_itf_flush_reply { + int32_t unused; +} __packed; +DECLARE_FULL_REPLY(msg_itf_flush_reply); + +struct msg_itf_evt_error { + uint32_t errno; +} __packed; +DECLARE_FULL_EVENT(msg_itf_evt_error); + +struct al_match_data { + const char *fw_name; +}; + +struct al_common_mcu_req { + phys_addr_t pCtx; + int req_type; + size_t req_size; + size_t reply_size; + void *reply; +} __packed; + +struct al_firmware_section { + u64 offset; + size_t size; +}; + +struct al_firmware { + /* Firmware after it is read but not loaded */ + const struct firmware *firmware; + + /* Raw firmware data */ + dma_addr_t phys; + void *virt; + size_t size; + + /* Parsed firmware information */ + struct al_firmware_section bin_data; + struct al_firmware_section mb_m2h; + struct al_firmware_section mb_h2m; +}; + +struct al_codec_dev { + struct platform_device *pdev; + struct v4l2_device v4l2_dev; + struct v4l2_m2m_dev *m2m_dev; + struct video_device video_dev; + + /* Firmware */ + struct al_firmware firmware; + dma_addr_t apb; + + struct clk *clk; + void __iomem *regs; + struct resource *regs_info; + + /* Mailbox structs */ + struct al_codec_mb mb_h2m; + struct al_codec_mb mb_m2h; + + /* list of buffers used by the MCU */ + struct list_head alloc_buffers; + struct mutex buf_lock; + + /* mutex protecting vb2_queue structure */ + struct mutex lock; + + /* list of ctx (aka decoder) */ + struct mutex ctx_mlock; + struct list_head ctx_q_list; + int is_video_init_done; + + /* list of cap/out supported formats */ + struct list_head codec_q_list; + struct al_codec_cmd *codec_info_cmd; + + /* Command completion */ + struct completion completion; + /* Resolution found completion */ + struct completion res_done; + + /* callbacks set by client before common_probe */ + void *cb_arg; + void (*process_msg_cb)(void *cb_arg, struct msg_itf_header *hdr); + void (*fw_ready_cb)(void *cb_arg); +}; + +static inline int al_common_get_header(struct al_codec_dev *dev, + struct msg_itf_header *hdr) +{ + return al_codec_msg_get_header(&dev->mb_m2h, hdr); +} + +static inline int al_common_get_data(struct al_codec_dev *dev, char *data, + int len) +{ + return al_codec_msg_get_data(&dev->mb_m2h, data, len); +} + +static inline int al_common_skip_data(struct al_codec_dev *dev, int len) +{ + return al_common_get_data(dev, NULL, len); +} + +int al_common_send(struct al_codec_dev *dev, struct msg_itf_header *hdr); +int al_common_send_req_reply(struct al_codec_dev *dev, + struct list_head *cmd_list, + struct msg_itf_header *hdr, + struct al_common_mcu_req *req); +bool al_common_mcu_is_alive(struct al_codec_dev *dev); + +int al_common_probe(struct al_codec_dev *dev, const char *name); +void al_common_remove(struct al_codec_dev *dev); + +#endif /*__AL_CODEC_COMMON__*/ diff --git a/drivers/media/platform/allegro-dvt/al300/al_codec_util.c b/dri= vers/media/platform/allegro-dvt/al300/al_codec_util.c new file mode 100644 index 000000000000..6cc5b1322475 --- /dev/null +++ b/drivers/media/platform/allegro-dvt/al300/al_codec_util.c @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Mailbox communication utilities for command creation + * and message exchange with the MCU + * + * Copyright (c) 2025 Allegro DVT. + * Author: Yassine OUAISSA + */ + +#include +#include +#include +#include +#include +#include + +#include "al_codec_util.h" + +static int al_get_used_space(struct al_codec_mb *mb) +{ + u32 head =3D mb->hdr->head; + u32 tail =3D mb->hdr->tail; + + return head >=3D tail ? head - tail : mb->size - (tail - head); +} + +static int al_get_free_space(struct al_codec_mb *mb) +{ + return mb->size - al_get_used_space(mb) - 1; +} + +static int al_has_enough_space(struct al_codec_mb *mb, int len) +{ + return al_get_free_space(mb) >=3D len; +} + +static inline void al_copy_to_mb(struct al_codec_mb *mb, char *data, int l= en) +{ + u32 head =3D mb->hdr->head; + int copy_len =3D min(mb->size - head, (unsigned int)len); + int copied_len =3D len; + + memcpy(&mb->data[head], data, copy_len); + len -=3D copy_len; + if (len) + memcpy(&mb->data[0], &data[copy_len], len); + + /* Make sure that all messages are written before updating the head */ + dma_wmb(); + mb->hdr->head =3D (head + copied_len) % mb->size; + /* Make sure that the head is updated in DDR instead of cache */ + dma_wmb(); +} + +static inline void al_copy_from_mb(struct al_codec_mb *mb, char *data, int= len) +{ + u32 tail =3D mb->hdr->tail; + int copy_len =3D min(mb->size - tail, (unsigned int)len); + int copied_len =3D len; + + if (!data) + goto update_tail; + + memcpy(data, &mb->data[tail], copy_len); + len -=3D copy_len; + if (len) + memcpy(&data[copy_len], &mb->data[0], len); + +update_tail: + mb->hdr->tail =3D (tail + copied_len) % mb->size; + /* Make sure that the head is updated in DDR instead of cache */ + dma_wmb(); +} + +static int al_codec_mb_send(struct al_codec_mb *mb, char *data, int len) +{ + if (!al_has_enough_space(mb, len)) + return -ENOMEM; + + al_copy_to_mb(mb, data, len); + + return 0; +} + +static int al_codec_mb_receive(struct al_codec_mb *mb, char *data, int len) +{ + if (al_get_used_space(mb) < len) + return -ENOMEM; + + al_copy_from_mb(mb, data, len); + + return 0; +} + +void al_codec_mb_init(struct al_codec_mb *mb, char *addr, int size, u32 ma= gic) +{ + mb->hdr =3D (struct al_mb_itf *)addr; + mb->hdr->magic =3D magic; + mb->hdr->version =3D MB_IFT_VERSION; + mb->hdr->head =3D 0; + mb->hdr->tail =3D 0; + mb->data =3D addr + sizeof(struct al_mb_itf); + mb->size =3D size - sizeof(struct al_mb_itf); + mutex_init(&mb->lock); +} + +int al_codec_msg_get_header(struct al_codec_mb *mb, struct msg_itf_header = *hdr) +{ + return al_codec_mb_receive(mb, (char *)hdr, sizeof(*hdr)); +} + +int al_codec_msg_get_data(struct al_codec_mb *mb, char *data, int len) +{ + return al_codec_mb_receive(mb, data, len); +} + +int al_codec_msg_send(struct al_codec_mb *mb, struct msg_itf_header *hdr, + void (*trigger)(void *), void *trigger_arg) +{ + unsigned long timeout; + int ret; + + timeout =3D jiffies + HZ; + mutex_lock(&mb->lock); + do { + if (time_after(jiffies, timeout)) { + mutex_unlock(&mb->lock); + return -ETIMEDOUT; + } + ret =3D al_codec_mb_send(mb, (char *)hdr, + hdr->payload_len + + sizeof(struct msg_itf_header)); + + } while (ret); + mutex_unlock(&mb->lock); + + trigger(trigger_arg); + + return 0; +} + +static void al_codec_cmd_cleanup(struct kref *ref) +{ + struct al_codec_cmd *cmd =3D container_of(ref, typeof(*cmd), refcount); + + kfree(cmd->reply); + kfree(cmd); +} + +void al_codec_cmd_put(struct al_codec_cmd *cmd) +{ + if (WARN_ON(!cmd)) + return; + + kref_put(&cmd->refcount, al_codec_cmd_cleanup); +} + +struct al_codec_cmd *al_codec_cmd_create(int reply_size) +{ + struct al_codec_cmd *cmd; + + cmd =3D kmalloc(sizeof(*cmd), GFP_KERNEL); + if (!cmd) + return NULL; + + cmd->reply =3D kmalloc(reply_size, GFP_KERNEL); + if (!cmd->reply) { + kfree(cmd); + return NULL; + } + + kref_init(&cmd->refcount); + cmd->reply_size =3D reply_size; + init_completion(&cmd->done); + + return cmd; +} diff --git a/drivers/media/platform/allegro-dvt/al300/al_codec_util.h b/dri= vers/media/platform/allegro-dvt/al300/al_codec_util.h new file mode 100644 index 000000000000..1743877e9ff6 --- /dev/null +++ b/drivers/media/platform/allegro-dvt/al300/al_codec_util.h @@ -0,0 +1,185 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2025 Allegro DVT. + * Author: Yassine OUAISSA + */ + +#ifndef __AL_CODEC_UTIL__ +#define __AL_CODEC_UTIL__ + +#include +#include +#include + +#include +#include + +#define MB_IFT_MAGIC_H2M 0xabcd1230 +#define MB_IFT_MAGIC_M2H 0xabcd1231 +#define MB_IFT_VERSION 0x00010000 + +#define MAJOR_SHIFT 20 +#define MAJOR_MASK 0xfff +#define MINOR_SHIFT 8 +#define MINOR_MASK 0xfff +#define PATCH_SHIFT 0 +#define PATCH_MASK 0xff + +/* + * AL_BOOT_VERSION() - Version format 32-bit, 12 bits for the major, + * the same for minor, 8bits for the patch + */ +#define AL_BOOT_VERSION(major, minor, patch) \ + ((((major) & MAJOR_MASK) << MAJOR_SHIFT) | \ + (((minor) & MINOR_MASK) << MINOR_SHIFT) | \ + (((patch) & PATCH_MASK) << PATCH_SHIFT)) + +#define al_phys_to_virt(x) ((void *)(uintptr_t)x) +#define al_virt_to_phys(x) ((phys_addr_t)(uintptr_t)x) + +#define DECLARE_FULL_REQ(s) \ + struct s##_full { \ + struct msg_itf_header hdr; \ + struct s req; \ + } __packed + +#define DECLARE_FULL_REPLY(s) \ + struct s##_full { \ + struct msg_itf_header hdr; \ + struct s reply; \ + } __packed + +#define DECLARE_FULL_EVENT(s) \ + struct s##_full { \ + struct msg_itf_header hdr; \ + struct s event; \ + } __packed + +struct al_mb_itf { + u32 magic; + u32 version; + u32 head; + u32 tail; +} __packed; + +struct al_codec_mb { + struct al_mb_itf *hdr; + struct mutex lock; + char *data; + int size; +}; + +struct al_codec_cmd { + struct kref refcount; + struct list_head list; + struct completion done; + int reply_size; + void *reply; +}; + +#define al_codec_err(al_dev, fmt, args...) \ + dev_err(&(al_dev)->pdev->dev, "[ALG_CODEC][ERROR] %s():%d: " fmt "\n", \ + __func__, __LINE__, ##args) + +#define al_v4l2_err(al_dev, fmt, args...) \ + dev_err(&(al_dev)->pdev->dev, "[ALG_V4L2][ERROR] %s():%d: " fmt "\n", \ + __func__, __LINE__, ##args) + +#if defined(DEBUG) + +extern int debug; + +/* V4L2 logs */ +#define al_v4l2_dbg(al_dev, level, fmt, args...) \ + do { \ + if (debug >=3D level) \ + dev_dbg(&(al_dev)->pdev->dev, \ + "[ALG_V4L2] level=3D%d %s(),%d: " fmt "\n", \ + level, __func__, __LINE__, ##args); \ + } while (0) + +/* Codec logs */ +#define al_codec_dbg(al_dev, fmt, args...) \ + do { \ + if (debug) \ + dev_dbg(&(al_dev)->pdev->dev, \ + "[ALG_CODEC] %s(),%d: " fmt "\n", __func__, \ + __LINE__, ##args); \ + } while (0) + +#else + +#define al_v4l2_dbg(al_dev, level, fmt, args...) \ + do { \ + (void)level; \ + dev_dbg(&(al_dev)->pdev->dev, "[ALG_V4L2]: " fmt "\n", \ + ##args); \ + } while (0) + +#define al_codec_dbg(al_dev, fmt, args...) \ + dev_dbg(&(al_dev)->pdev->dev, "[ALG_CODEC]: " fmt "\n", ##args) +#endif + +#define MSG_ITF_TYPE_LIMIT BIT(10) + +/* Message types host <-> mcu */ +enum { + MSG_ITF_TYPE_MCU_ALIVE =3D 0, + MSG_ITF_TYPE_WRITE_REQ =3D 2, + MSG_ITF_TYPE_FIRST_REQ =3D 1024, + MSG_ITF_TYPE_NEXT_REQ, + MSG_ITF_TYPE_FIRST_REPLY =3D 2048, + MSG_ITF_TYPE_NEXT_REPLY, + MSG_ITF_TYPE_ALLOC_MEM_REQ =3D 3072, + MSG_ITF_TYPE_FREE_MEM_REQ, + MSG_ITF_TYPE_ALLOC_MEM_REPLY =3D 4096, + MSG_ITF_TYPE_FREE_MEM_REPLY, + MSG_ITF_TYPE_FIRST_EVT =3D 5120, + MSG_ITF_TYPE_NEXT_EVT =3D MSG_ITF_TYPE_FIRST_EVT +}; + +struct msg_itf_header { + u64 drv_ctx_hdl; + u64 drv_cmd_hdl; + u16 type; + u16 payload_len; + u16 padding[2]; +} __packed; + +void al_codec_mb_init(struct al_codec_mb *mb, char *addr, int size, u32 ma= gic); +int al_codec_msg_get_header(struct al_codec_mb *mb, struct msg_itf_header = *hdr); +int al_codec_msg_get_data(struct al_codec_mb *mb, char *data, int len); +int al_codec_msg_send(struct al_codec_mb *mb, struct msg_itf_header *hdr, + void (*trigger)(void *), void *trigger_arg); + +static inline bool is_type_reply(uint16_t type) +{ + return type >=3D MSG_ITF_TYPE_FIRST_REPLY && + type < MSG_ITF_TYPE_FIRST_REPLY + MSG_ITF_TYPE_LIMIT; +} + +static inline bool is_type_event(uint16_t type) +{ + return type >=3D MSG_ITF_TYPE_FIRST_EVT && + type < MSG_ITF_TYPE_FIRST_EVT + MSG_ITF_TYPE_LIMIT; +} + +void al_codec_cmd_put(struct al_codec_cmd *cmd); + +struct al_codec_cmd *al_codec_cmd_create(int reply_size); + +static inline struct al_codec_cmd *al_codec_cmd_get(struct list_head *cmd_= list, + uint64_t hdl) +{ + struct al_codec_cmd *cmd =3D NULL; + + list_for_each_entry(cmd, cmd_list, list) { + if (likely(cmd =3D=3D al_phys_to_virt(hdl))) { + kref_get(&cmd->refcount); + break; + } + } + return list_entry_is_head(cmd, cmd_list, list) ? NULL : cmd; +} + +#endif /* __AL_CODEC_UTIL__ */ diff --git a/drivers/media/platform/allegro-dvt/al300/al_vdec_drv.c b/drive= rs/media/platform/allegro-dvt/al300/al_vdec_drv.c new file mode 100644 index 000000000000..3d80b47d7056 --- /dev/null +++ b/drivers/media/platform/allegro-dvt/al300/al_vdec_drv.c @@ -0,0 +1,1530 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2025 Allegro DVT. + * Author: Yassine OUAISSA + * + * Allegro DVT stateful video decoder driver for the IP Gen 3 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "al_codec_common.h" +#include "al_vdec_drv.h" + +#if defined(DEBUG) +/* Log level */ +int debug; +module_param(debug, int, 0644); +MODULE_PARM_DESC(debug, "Debug level (0-3)"); +#endif + +/* default decoder params */ +#define DECODER_WIDTH_DEFAULT 640 +#define DECODER_HEIGHT_DEFAULT 480 +#define DECODER_WIDTH_MAX 3840 +#define DECODER_HEIGHT_MAX 2160 +#define DECODER_WIDTH_MIN 16 +#define DECODER_HEIGHT_MIN 16 +#define DEC_REQ_TIMEOUT msecs_to_jiffies(1000) +#define DEC_RES_EVT_TIMEOUT DEC_REQ_TIMEOUT + +/* Supported formats */ +static const struct al_fmt al_src_formats[] =3D { + { + .pixelformat =3D V4L2_PIX_FMT_H264, + .bpp =3D 20, + }, + { + .pixelformat =3D V4L2_PIX_FMT_HEVC, + .bpp =3D 20, + }, + { + .pixelformat =3D V4L2_PIX_FMT_JPEG, + .bpp =3D 8, + } +}; + +static const struct al_fmt al_dst_formats[] =3D { + { + .pixelformat =3D V4L2_PIX_FMT_NV12, + .bpp =3D 12, + }, + { + .pixelformat =3D V4L2_PIX_FMT_P010, + .bpp =3D 12, + }, + { + .pixelformat =3D V4L2_PIX_FMT_NV16, + .bpp =3D 16, + }, + { + .pixelformat =3D V4L2_PIX_FMT_YUV420, /* YUV 4:2:0 */ + .bpp =3D 12, + }, + { + .pixelformat =3D V4L2_PIX_FMT_YVU420, /* YVU 4:2:0 */ + .bpp =3D 12, + }, +}; + +/* Default format */ +static const struct al_frame al_default_fmt =3D { + + .width =3D DECODER_WIDTH_DEFAULT, + .height =3D DECODER_HEIGHT_DEFAULT, + .bytesperline =3D DECODER_WIDTH_MAX * 4, + .sizeimage =3D DECODER_WIDTH_DEFAULT * DECODER_HEIGHT_DEFAULT * 4, + .nbuffers =3D 1, + .fmt =3D &al_dst_formats[0], + .field =3D V4L2_FIELD_NONE, + .colorspace =3D V4L2_COLORSPACE_REC709, + .ycbcr_enc =3D V4L2_YCBCR_ENC_DEFAULT, + .quantization =3D V4L2_QUANTIZATION_DEFAULT, + .xfer_func =3D V4L2_XFER_FUNC_DEFAULT +}; + +static struct al_frame *al_get_frame(struct al_dec_ctx *ctx, + enum v4l2_buf_type type) +{ + if (WARN_ON(!ctx)) + return ERR_PTR(-EINVAL); + + if (type =3D=3D V4L2_BUF_TYPE_VIDEO_OUTPUT) + return &ctx->src; + else if (type =3D=3D V4L2_BUF_TYPE_VIDEO_CAPTURE) + return &ctx->dst; + + al_v4l2_err(ctx->dev, "Unsupported type (%d)", type); + + return ERR_PTR(-EINVAL); +} + +static const struct al_fmt *al_find_fmt(u32 pixelformat) +{ + const struct al_fmt *fmt; + unsigned int i; + + /* check if the pixelformat exist in the src formats list */ + for (i =3D 0; i < ARRAY_SIZE(al_src_formats); i++) { + fmt =3D &al_src_formats[i]; + if (fmt->pixelformat =3D=3D pixelformat) + return fmt; + } + + /* check if the pixelformat exist in the dst formats list */ + for (i =3D 0; i < ARRAY_SIZE(al_dst_formats); i++) { + fmt =3D &al_dst_formats[i]; + if (fmt->pixelformat =3D=3D pixelformat) + return fmt; + } + + return NULL; +} + +static int dec_fw_create_decoder(struct al_dec_ctx *ctx) +{ + struct msg_itf_create_decoder_req_full req; + struct msg_itf_create_codec_reply reply; + struct al_common_mcu_req mreq; + int ret; + + if (ctx->hDec) { + al_v4l2_dbg(ctx->dev, 3, "fw decoder already exist\n"); + return 0; + } + + req.req.codec =3D ctx->codec; + + mreq.pCtx =3D al_virt_to_phys(ctx); + mreq.req_type =3D MSG_ITF_TYPE_CREATE_INST_REQ; + mreq.req_size =3D sizeof(req.req); + mreq.reply_size =3D sizeof(reply); + mreq.reply =3D &reply; + + ret =3D al_common_send_req_reply(ctx->dev, &ctx->cmd_q_list, &req.hdr, + &mreq); + + if (!ret && !reply.ret) + ctx->hDec =3D reply.hCodec; + else if (reply.ret) + ret =3D -ENODEV; + + return ret; +} + +static void dec_fw_destroy_decoder(struct al_dec_ctx *ctx) +{ + struct msg_itf_destroy_codec_req_full req; + struct msg_itf_destroy_codec_reply reply; + struct al_common_mcu_req mreq; + int ret; + + if (WARN(!ctx->hDec, "NULL Decoder to destroy !")) + return; + + al_v4l2_dbg(ctx->dev, 3, "Destroy decoder %lld ", ctx->hDec); + + req.req.hCodec =3D ctx->hDec; + + mreq.pCtx =3D al_virt_to_phys(ctx); + mreq.req_type =3D MSG_ITF_TYPE_DESTROY_INST_REQ; + mreq.req_size =3D sizeof(req.req); + mreq.reply_size =3D sizeof(reply); + mreq.reply =3D &reply; + + ret =3D al_common_send_req_reply(ctx->dev, &ctx->cmd_q_list, &req.hdr, + &mreq); + + if (!ret) + ctx->hDec =3D 0; +} + +static int al_dec_fw_push_frame_buf(struct al_dec_ctx *ctx, + struct vb2_v4l2_buffer *vbuf) +{ + struct msg_itf_push_dst_buf_req_full req; + struct v4l2_m2m_buffer *m2m_buf; + struct al_common_mcu_req mreq =3D { 0 }; + int ret; + + if (WARN(!vbuf, "NULL frame Buffer to push!!")) + return -EINVAL; + + req.req.hCodec =3D ctx->hDec; + m2m_buf =3D container_of(vbuf, struct v4l2_m2m_buffer, vb); + req.req.bufferHandle =3D al_virt_to_phys(m2m_buf); + req.req.phyAddr =3D vb2_dma_contig_plane_dma_addr(&vbuf->vb2_buf, 0); + req.req.size =3D vb2_plane_size(&vbuf->vb2_buf, 0); + + mreq.pCtx =3D al_virt_to_phys(ctx); + mreq.req_type =3D MSG_ITF_TYPE_PUT_DISPLAY_PICTURE_REQ; + mreq.req_size =3D sizeof(req.req); + + ret =3D al_common_send_req_reply(ctx->dev, &ctx->cmd_q_list, &req.hdr, + &mreq); + if (ret) + al_v4l2_err(ctx->dev, "Failed to push frame buffer %p %d", + m2m_buf, ret); + + return ret; +} + +static int al_dec_fw_push_bitstream_buf(struct al_dec_ctx *ctx, + struct vb2_v4l2_buffer *vbuf) +{ + struct msg_itf_push_src_buf_req_full req; + struct v4l2_m2m_buffer *m2m_buf; + struct al_common_mcu_req mreq =3D { 0 }; + int ret; + + if (WARN(!vbuf, "NULL Buffer to push!!")) + return -EINVAL; + + req.req.hCodec =3D ctx->hDec; + m2m_buf =3D container_of(vbuf, struct v4l2_m2m_buffer, vb); + req.req.bufferHandle =3D al_virt_to_phys(m2m_buf); + req.req.phyAddr =3D vb2_dma_contig_plane_dma_addr(&vbuf->vb2_buf, 0); + req.req.size =3D vb2_plane_size(&vbuf->vb2_buf, 0); + + /* Fill the v4l2 metadata*/ + req.req.meta.timestamp =3D vbuf->vb2_buf.timestamp; + req.req.meta.timecode =3D vbuf->timecode; + req.req.meta.last =3D vbuf->flags & V4L2_BUF_FLAG_LAST; + + mreq.pCtx =3D al_virt_to_phys(ctx); + mreq.req_type =3D MSG_ITF_TYPE_PUSH_BITSTREAM_BUFFER_REQ; + mreq.req_size =3D sizeof(req.req); + + ret =3D al_common_send_req_reply(ctx->dev, &ctx->cmd_q_list, &req.hdr, + &mreq); + if (ret) + al_v4l2_err(ctx->dev, "Failed to push bitstream buffer %p %d", + m2m_buf, ret); + + return ret; +} + +static int dec_fw_flush_req(struct al_dec_ctx *ctx) +{ + struct msg_itf_flush_req_full req; + struct msg_itf_flush_reply reply; + struct al_common_mcu_req mreq; + int ret; + + req.req.hCodec =3D ctx->hDec; + + mreq.pCtx =3D al_virt_to_phys(ctx); + mreq.req_type =3D MSG_ITF_TYPE_FLUSH_REQ; + mreq.req_size =3D sizeof(req.req); + mreq.reply_size =3D sizeof(reply); + mreq.reply =3D &reply; + + ret =3D al_common_send_req_reply(ctx->dev, &ctx->cmd_q_list, &req.hdr, + &mreq); + + if (ret) + al_v4l2_err(ctx->dev, "Failed to flush the decoder %d", ret); + + return ret; +} + +static inline struct vb2_v4l2_buffer * +al_dec_dequeue_buf(struct al_dec_ctx *ctx, uint64_t hdl, + struct list_head *buffer_list) +{ + struct v4l2_m2m_buffer *buf, *tmp; + struct vb2_v4l2_buffer *ret =3D NULL; + + mutex_lock(&ctx->buf_q_mlock); + list_for_each_entry_safe(buf, tmp, buffer_list, list) { + if (buf =3D=3D al_phys_to_virt(hdl)) { + list_del(&buf->list); + ret =3D &buf->vb; + break; + } + } + mutex_unlock(&ctx->buf_q_mlock); + + return ret; +} + +static struct vb2_v4l2_buffer *al_dec_dequeue_src_buf(struct al_dec_ctx *c= tx, + uint64_t hdl) +{ + return al_dec_dequeue_buf(ctx, hdl, &ctx->stream_q_list); +} + +static struct vb2_v4l2_buffer *al_dec_dequeue_dst_buf(struct al_dec_ctx *c= tx, + uint64_t hdl) +{ + return al_dec_dequeue_buf(ctx, hdl, &ctx->frame_q_list); +} + +static void al_ctx_cleanup(struct kref *ref) +{ + struct al_dec_ctx *ctx =3D container_of(ref, struct al_dec_ctx, refcount); + + kfree(ctx); +} + +static inline struct al_dec_ctx *al_ctx_get(struct al_codec_dev *dev, + uint64_t hdl) +{ + struct al_dec_ctx *ctx; + struct al_dec_ctx *ret =3D NULL; + + mutex_lock(&dev->ctx_mlock); + list_for_each_entry(ctx, &dev->ctx_q_list, list) { + if (ctx =3D=3D al_phys_to_virt(hdl)) { + kref_get(&ctx->refcount); + ret =3D ctx; + break; + } + } + mutex_unlock(&dev->ctx_mlock); + + return ret; +} + +static void al_ctx_put(struct al_dec_ctx *ctx) +{ + kref_put(&ctx->refcount, al_ctx_cleanup); +} + +static int al_dec_start_streaming(struct vb2_queue *q, unsigned int count) +{ + struct al_dec_ctx *ctx =3D vb2_get_drv_priv(q); + struct al_codec_dev *dev =3D ctx->dev; + + v4l2_m2m_update_start_streaming_state(ctx->fh.m2m_ctx, q); + + if (V4L2_TYPE_IS_OUTPUT(q->type)) { + struct v4l2_m2m_buffer *buf; + int ret; + + if (list_empty(&ctx->stream_q_list)) { + al_v4l2_err(dev, "Empty stream list."); + return -EINVAL; + } + + if (!al_common_mcu_is_alive(dev)) { + al_v4l2_err(dev, "Unable to ping the mcu"); + return -ENODEV; + } + + ret =3D dec_fw_create_decoder(ctx); + if (ret) { + al_v4l2_err(dev, "Unable to create the fw decoder %d", + ret); + return ret; + } + + /* Get the first vid-out queued buffer */ + buf =3D list_first_entry(&ctx->stream_q_list, + struct v4l2_m2m_buffer, list); + + if (al_dec_fw_push_bitstream_buf(ctx, &buf->vb)) { + al_v4l2_err(ctx->dev, + "Unable to push the bitstream buffer"); + return -EINVAL; + } + + /* Wait until the mcu detect the resolution of the stream */ + ret =3D wait_for_completion_timeout(&ctx->res_done, + DEC_RES_EVT_TIMEOUT); + if (!ret) { + al_v4l2_err(ctx->dev, "unsupported stream"); + ctx->aborting =3D true; + } + + ctx->osequence =3D 0; + } else + ctx->csequence =3D 0; + + return 0; +} + +static void al_dec_stop_streaming_cap(struct al_dec_ctx *ctx) +{ + struct vb2_v4l2_buffer *vbuf; + struct v4l2_m2m_buffer *entry, *tmp; + + mutex_lock(&ctx->buf_q_mlock); + if (!list_empty(&ctx->frame_q_list)) + list_for_each_entry_safe(entry, tmp, &ctx->frame_q_list, list) { + list_del(&entry->list); + vbuf =3D &entry->vb; + vb2_set_plane_payload(&vbuf->vb2_buf, 0, 0); + v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR); + } + mutex_unlock(&ctx->buf_q_mlock); + + while (v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx)) { + vbuf =3D v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); + if (vbuf) { + vb2_set_plane_payload(&vbuf->vb2_buf, 0, 0); + v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR); + } + } + + v4l2_m2m_mark_stopped(ctx->fh.m2m_ctx); +} + +static void al_dec_stop_streaming_out(struct al_dec_ctx *ctx) +{ + struct vb2_v4l2_buffer *vbuf; + struct v4l2_m2m_buffer *entry, *tmp; + + mutex_lock(&ctx->buf_q_mlock); + if (!list_empty(&ctx->stream_q_list)) + list_for_each_entry_safe(entry, tmp, &ctx->stream_q_list, + list) { + list_del(&entry->list); + v4l2_m2m_buf_done(&entry->vb, VB2_BUF_STATE_ERROR); + } + mutex_unlock(&ctx->buf_q_mlock); + + if (v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx)) { + while ((vbuf =3D v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx))) + if (vbuf->vb2_buf.state =3D=3D VB2_BUF_STATE_ACTIVE) + v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR); + } + + dec_fw_destroy_decoder(ctx); +} + +static void al_dec_stop_streaming(struct vb2_queue *q) +{ + struct al_dec_ctx *ctx =3D vb2_get_drv_priv(q); + + v4l2_m2m_update_stop_streaming_state(ctx->fh.m2m_ctx, q); + + /* Releasing the dst and src buffers */ + ctx->stopped =3D true; + + if (V4L2_TYPE_IS_OUTPUT(q->type)) + al_dec_stop_streaming_out(ctx); + else + al_dec_stop_streaming_cap(ctx); +} + +static int al_dec_queue_setup(struct vb2_queue *vq, unsigned int *nbuffers, + unsigned int *nplanes, unsigned int sizes[], + struct device *alloc_devs[]) +{ + struct al_dec_ctx *ctx =3D vb2_get_drv_priv(vq); + struct al_frame *format =3D al_get_frame(ctx, vq->type); + + if (IS_ERR(format)) { + al_v4l2_err(ctx->dev, "Invalid format %p", format); + return PTR_ERR(format); + } + + if (*nplanes) + return ((sizes[0] < format->sizeimage) ? -EINVAL : 0); + + /* update queue num buffers */ + format->nbuffers =3D max(*nbuffers, format->nbuffers); + + *nplanes =3D 1; + sizes[0] =3D format->sizeimage; + *nbuffers =3D format->nbuffers; + + al_v4l2_dbg(ctx->dev, 2, "%s: Get %d buffers of size %d each ", + (vq->type =3D=3D V4L2_BUF_TYPE_VIDEO_OUTPUT) ? "OUT" : "CAP", + *nbuffers, sizes[0]); + + return 0; +} + +static int al_dec_buf_prepare(struct vb2_buffer *vb) +{ + struct al_dec_ctx *ctx =3D vb2_get_drv_priv(vb->vb2_queue); + struct vb2_v4l2_buffer *vbuf =3D to_vb2_v4l2_buffer(vb); + + if (ctx->aborting) + return -EINVAL; + + if (V4L2_TYPE_IS_CAPTURE(vb->type)) { + if (vbuf->field =3D=3D V4L2_FIELD_ANY) + vbuf->field =3D V4L2_FIELD_NONE; + if (vbuf->field !=3D V4L2_FIELD_NONE) + return -EINVAL; + } + + al_v4l2_dbg(ctx->dev, 3, "%s : Buffer (%p) prepared ", + (V4L2_TYPE_IS_OUTPUT(vb->type) ? "OUT" : "CAP"), vbuf); + + return 0; +} + +static inline void al_dec_fill_bitstream(struct al_dec_ctx *ctx) +{ + struct vb2_v4l2_buffer *src_buf; + struct v4l2_m2m_buffer *m2m_buf; + struct vb2_queue *src_vq; + + lockdep_assert_held(&ctx->buf_q_mlock); + + if (v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx) > 0) { + src_buf =3D v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); + if (!src_buf) + return; + + /* Dump empty buffers */ + if (!vb2_get_plane_payload(&src_buf->vb2_buf, 0)) { + src_buf =3D v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); + v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE); + return; + } + + src_vq =3D v4l2_m2m_get_src_vq(ctx->fh.m2m_ctx); + src_buf =3D v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); + + if (src_buf) { + src_buf->sequence =3D ctx->osequence++; + + if (vb2_is_streaming(src_vq) && + al_dec_fw_push_bitstream_buf(ctx, src_buf)) { + v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR); + return; + } + + m2m_buf =3D container_of(src_buf, struct v4l2_m2m_buffer, + vb); + list_add_tail(&m2m_buf->list, &ctx->stream_q_list); + } + } +} + +static void al_dec_buf_queue(struct vb2_buffer *vb) +{ + struct al_dec_ctx *ctx =3D vb2_get_drv_priv(vb->vb2_queue); + struct vb2_v4l2_buffer *vbuf =3D to_vb2_v4l2_buffer(vb); + + v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf); + + if (V4L2_TYPE_IS_OUTPUT(vb->type)) { + mutex_lock(&ctx->buf_q_mlock); + al_dec_fill_bitstream(ctx); + mutex_unlock(&ctx->buf_q_mlock); + } + + al_v4l2_dbg(ctx->dev, 3, "%s queued (%p) - (%d)", + V4L2_TYPE_IS_OUTPUT(vb->type) ? "OUT" : "CAP", vbuf, + vb->num_planes); +} + +static const struct vb2_ops dec_queue_ops =3D { + .queue_setup =3D al_dec_queue_setup, + .buf_prepare =3D al_dec_buf_prepare, + .buf_queue =3D al_dec_buf_queue, + .start_streaming =3D al_dec_start_streaming, + .stop_streaming =3D al_dec_stop_streaming, + .wait_prepare =3D vb2_ops_wait_prepare, + .wait_finish =3D vb2_ops_wait_finish, +}; + +static int al_dec_queue_init(void *priv, struct vb2_queue *src_vq, + struct vb2_queue *dst_vq) +{ + struct al_dec_ctx *ctx =3D priv; + struct al_codec_dev *al_dev =3D ctx->dev; + int ret; + + src_vq->dev =3D &al_dev->pdev->dev; + src_vq->type =3D V4L2_BUF_TYPE_VIDEO_OUTPUT; + src_vq->io_modes =3D VB2_MMAP | VB2_DMABUF; + src_vq->non_coherent_mem =3D false; + src_vq->dma_attrs |=3D DMA_ATTR_FORCE_CONTIGUOUS; + src_vq->mem_ops =3D &vb2_dma_contig_memops; + src_vq->drv_priv =3D ctx; + src_vq->timestamp_flags =3D V4L2_BUF_FLAG_TIMESTAMP_COPY; + src_vq->ops =3D &dec_queue_ops; + src_vq->buf_struct_size =3D sizeof(struct v4l2_m2m_buffer); + src_vq->lock =3D &ctx->dev->lock; + ret =3D vb2_queue_init(src_vq); + if (ret) + return ret; + + dst_vq->dev =3D &al_dev->pdev->dev; + dst_vq->type =3D V4L2_BUF_TYPE_VIDEO_CAPTURE; + dst_vq->io_modes =3D VB2_MMAP | VB2_DMABUF; + dst_vq->non_coherent_mem =3D false; + dst_vq->dma_attrs |=3D DMA_ATTR_FORCE_CONTIGUOUS; + dst_vq->mem_ops =3D &vb2_dma_contig_memops; + dst_vq->drv_priv =3D ctx; + dst_vq->timestamp_flags =3D V4L2_BUF_FLAG_TIMESTAMP_COPY; + dst_vq->ops =3D &dec_queue_ops; + dst_vq->buf_struct_size =3D sizeof(struct v4l2_m2m_buffer); + dst_vq->lock =3D &ctx->dev->lock; + ret =3D vb2_queue_init(dst_vq); + if (ret) { + vb2_queue_release(src_vq); + return ret; + } + + return 0; +} + +static int al_dec_querycap(struct file *file, void *fh, + struct v4l2_capability *cap) +{ + struct al_codec_dev *dev =3D video_drvdata(file); + + strscpy(cap->driver, KBUILD_MODNAME, sizeof(cap->driver)); + strscpy(cap->card, "Allegro DVT Video Decoder", sizeof(cap->card)); + snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s", + dev_name(&dev->pdev->dev)); + + return 0; +} + +static int al_dec_enum_fmt(struct file *file, void *fh, struct v4l2_fmtdes= c *f) +{ + const struct al_fmt *fmt; + + if (f->type !=3D V4L2_BUF_TYPE_VIDEO_OUTPUT && + f->type !=3D V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + + if (V4L2_TYPE_IS_OUTPUT(f->type)) { + if (f->index >=3D ARRAY_SIZE(al_src_formats)) + return -EINVAL; + + fmt =3D &al_src_formats[f->index]; + } else { + if (f->index >=3D ARRAY_SIZE(al_dst_formats)) + return -EINVAL; + + fmt =3D &al_dst_formats[f->index]; + } + + f->pixelformat =3D fmt->pixelformat; + return 0; +} + +static int al_dec_try_fmt(struct file *file, void *fh, struct v4l2_format = *f) +{ + struct al_dec_ctx *ctx =3D fh_to_ctx(fh, struct al_dec_ctx); + struct v4l2_pix_format *pix =3D &f->fmt.pix; + struct al_frame *pix_fmt; + + pix_fmt =3D al_get_frame(ctx, f->type); + if (IS_ERR(pix_fmt)) { + al_v4l2_err(ctx->dev, "Invalid frame (%p)", pix_fmt); + return PTR_ERR(pix_fmt); + } + + pix_fmt->fmt =3D al_find_fmt(pix->pixelformat); + if (!pix_fmt->fmt) { + al_v4l2_err(ctx->dev, "Unknown format 0x%x", pix->pixelformat); + return -EINVAL; + } + pix->field =3D V4L2_FIELD_NONE; + pix->width =3D clamp_t(__u32, pix->width, DECODER_WIDTH_MIN, + DECODER_WIDTH_MAX); + pix->height =3D clamp_t(__u32, pix->height, DECODER_HEIGHT_MIN, + DECODER_HEIGHT_MAX); + + pix->bytesperline =3D pix->width; + pix->sizeimage =3D (pix->width * pix->height * pix_fmt->fmt->bpp) / 8; + + if (V4L2_TYPE_IS_CAPTURE(f->type)) + if (pix->sizeimage < pix_fmt->sizeimage) + pix->sizeimage =3D pix_fmt->sizeimage; + + al_v4l2_dbg( + ctx->dev, 3, + "%s : width (%d) , height (%d), bytesperline (%d), sizeimage (%d) ", + (f->type =3D=3D V4L2_BUF_TYPE_VIDEO_CAPTURE) ? "CAP" : "OUT", + pix->width, pix->height, pix->bytesperline, pix->sizeimage); + + return 0; +} + +static int al_dec_g_fmt(struct file *file, void *fh, struct v4l2_format *f) +{ + struct al_dec_ctx *ctx =3D fh_to_ctx(fh, struct al_dec_ctx); + struct al_frame *pix_fmt =3D al_get_frame(ctx, f->type); + struct v4l2_pix_format *pix; + + if (IS_ERR(pix_fmt)) { + al_v4l2_err(ctx->dev, "Invalid pixel format %p", pix_fmt); + return PTR_ERR(pix_fmt); + } + + if (!pix_fmt->fmt) { + al_v4l2_err(ctx->dev, "Unknown format for %d", f->type); + return -EINVAL; + } + + pix =3D &f->fmt.pix; + pix->width =3D pix_fmt->width; + pix->height =3D pix_fmt->height; + pix->bytesperline =3D pix_fmt->bytesperline; + pix->sizeimage =3D pix_fmt->sizeimage; + pix->pixelformat =3D pix_fmt->fmt->pixelformat; + pix->field =3D V4L2_FIELD_NONE; + + if (f->type =3D=3D V4L2_BUF_TYPE_VIDEO_OUTPUT) { + pix->bytesperline =3D 0; + pix->pixelformat =3D ctx->codec; + } + + pix->ycbcr_enc =3D pix_fmt->ycbcr_enc; + pix->quantization =3D pix_fmt->quantization; + pix->xfer_func =3D pix_fmt->xfer_func; + pix->colorspace =3D pix_fmt->colorspace; + + al_v4l2_dbg( + ctx->dev, 3, + "%s : width (%d) , height (%d), bytesperline (%d) , sizeimage (%d)", + (f->type =3D=3D V4L2_BUF_TYPE_VIDEO_CAPTURE) ? "CAP" : "OUT", + pix->width, pix->height, pix->bytesperline, pix->sizeimage); + + return 0; +} + +static int al_dec_s_fmt(struct file *file, void *fh, struct v4l2_format *f) +{ + struct al_dec_ctx *ctx =3D fh_to_ctx(fh, struct al_dec_ctx); + struct v4l2_pix_format *pix; + struct al_frame *frame; + struct vb2_queue *vq; + int ret; + + ret =3D al_dec_try_fmt(file, fh, f); + if (ret) { + al_v4l2_err(ctx->dev, "Cannot set format (%d)", f->type); + return ret; + } + + frame =3D (f->type =3D=3D V4L2_BUF_TYPE_VIDEO_OUTPUT) ? &ctx->src : &ctx-= >dst; + + pix =3D &f->fmt.pix; + frame->fmt =3D al_find_fmt(pix->pixelformat); + if (!frame->fmt) { + al_v4l2_err(ctx->dev, "Unknown format for %d", + pix->pixelformat); + return -EINVAL; + } + + vq =3D v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type); + if (vb2_is_streaming(vq)) { + al_v4l2_err(ctx->dev, "queue %d busy", f->type); + return -EBUSY; + } + + frame->width =3D pix->width; + frame->height =3D pix->height; + frame->bytesperline =3D pix->bytesperline; + frame->sizeimage =3D pix->sizeimage; + frame->field =3D pix->field; + + frame->ycbcr_enc =3D pix->ycbcr_enc; + frame->quantization =3D pix->quantization; + frame->xfer_func =3D pix->xfer_func; + frame->colorspace =3D pix->colorspace; + + /* Set decoder pixelformat */ + if (f->type =3D=3D V4L2_BUF_TYPE_VIDEO_OUTPUT) + ctx->codec =3D pix->pixelformat; + + al_v4l2_dbg( + ctx->dev, 3, + " %s : width (%d) , height (%d), bytesperline (%d), sizeimage (%d)", + (f->type =3D=3D V4L2_BUF_TYPE_VIDEO_CAPTURE) ? "CAP" : "OUT", + pix->width, pix->height, pix->bytesperline, pix->sizeimage); + + return 0; +} + +static void al_queue_eos_event(struct al_dec_ctx *ctx) +{ + const struct v4l2_event eos_event =3D { + .id =3D 0, + .type =3D V4L2_EVENT_EOS, + }; + + v4l2_event_queue_fh(&ctx->fh, &eos_event); +} + +static void al_queue_res_chg_event(struct al_dec_ctx *ctx) +{ + static const struct v4l2_event ev_src_ch =3D { + .id =3D 0, + .type =3D V4L2_EVENT_SOURCE_CHANGE, + .u.src_change.changes =3D V4L2_EVENT_SRC_CH_RESOLUTION, + }; + + v4l2_event_queue_fh(&ctx->fh, &ev_src_ch); +} + +static int al_dec_decoder_cmd(struct file *file, void *fh, + struct v4l2_decoder_cmd *dcmd) +{ + struct al_dec_ctx *ctx =3D fh_to_ctx(fh, struct al_dec_ctx); + struct v4l2_m2m_ctx *m2m_ctx =3D ctx->fh.m2m_ctx; + struct vb2_v4l2_buffer *vbuf; + struct vb2_queue *dst_vq; + int ret; + + ret =3D v4l2_m2m_ioctl_try_decoder_cmd(file, fh, dcmd); + if (ret) + return ret; + + /* Get the vb2 queue for the Capture */ + dst_vq =3D v4l2_m2m_get_dst_vq(m2m_ctx); + + switch (dcmd->cmd) { + case V4L2_DEC_CMD_START: + vb2_clear_last_buffer_dequeued(dst_vq); + break; + case V4L2_DEC_CMD_STOP: + vbuf =3D v4l2_m2m_last_src_buf(m2m_ctx); + if (vbuf) { + al_v4l2_dbg(ctx->dev, 1, "marking last pending buffer"); + + vbuf->flags |=3D V4L2_BUF_FLAG_LAST; + if (v4l2_m2m_num_src_bufs_ready(m2m_ctx) =3D=3D 0) { + al_v4l2_dbg(ctx->dev, 1, + "all remaining buffers queued"); + v4l2_m2m_try_schedule(m2m_ctx); + } + } + dec_fw_flush_req(ctx); + break; + default: + return -EINVAL; + } + + return 0; +} + +static int al_dec_enum_framesizes(struct file *file, void *fh, + struct v4l2_frmsizeenum *fsize) +{ + if (!al_find_fmt(fsize->pixel_format)) + return -EINVAL; + + /* FIXME : check step size */ + fsize->type =3D V4L2_FRMSIZE_TYPE_STEPWISE; + fsize->stepwise.min_width =3D DECODER_WIDTH_MIN; + fsize->stepwise.max_width =3D DECODER_WIDTH_MAX; + fsize->stepwise.step_width =3D 8; + fsize->stepwise.min_height =3D DECODER_HEIGHT_MIN; + fsize->stepwise.max_height =3D DECODER_HEIGHT_MAX; + fsize->stepwise.step_height =3D 8; + + return 0; +} + +static int al_dec_subscribe_event(struct v4l2_fh *fh, + const struct v4l2_event_subscription *sub) +{ + switch (sub->type) { + case V4L2_EVENT_EOS: + return v4l2_event_subscribe(fh, sub, 0, NULL); + case V4L2_EVENT_SOURCE_CHANGE: + return v4l2_src_change_event_subscribe(fh, sub); + default: + return -EINVAL; + } + + return 0; +} + +static int al_dec_log_status(struct file *file, void *fh) +{ + struct al_codec_dev *al_dev =3D video_drvdata(file); + + v4l2_device_call_all(&al_dev->v4l2_dev, 0, core, log_status); + return 0; +} + +static const struct v4l2_ioctl_ops al_dec_ioctl_ops =3D { + .vidioc_querycap =3D al_dec_querycap, + .vidioc_enum_fmt_vid_cap =3D al_dec_enum_fmt, + .vidioc_enum_fmt_vid_out =3D al_dec_enum_fmt, + .vidioc_g_fmt_vid_cap =3D al_dec_g_fmt, + .vidioc_g_fmt_vid_out =3D al_dec_g_fmt, + .vidioc_try_fmt_vid_cap =3D al_dec_try_fmt, + .vidioc_try_fmt_vid_out =3D al_dec_try_fmt, + .vidioc_s_fmt_vid_cap =3D al_dec_s_fmt, + .vidioc_s_fmt_vid_out =3D al_dec_s_fmt, + + .vidioc_create_bufs =3D v4l2_m2m_ioctl_create_bufs, + .vidioc_reqbufs =3D v4l2_m2m_ioctl_reqbufs, + + .vidioc_expbuf =3D v4l2_m2m_ioctl_expbuf, + .vidioc_querybuf =3D v4l2_m2m_ioctl_querybuf, + .vidioc_qbuf =3D v4l2_m2m_ioctl_qbuf, + .vidioc_dqbuf =3D v4l2_m2m_ioctl_dqbuf, + .vidioc_prepare_buf =3D v4l2_m2m_ioctl_prepare_buf, + + .vidioc_streamon =3D v4l2_m2m_ioctl_streamon, + .vidioc_streamoff =3D v4l2_m2m_ioctl_streamoff, + .vidioc_log_status =3D al_dec_log_status, + + .vidioc_try_decoder_cmd =3D v4l2_m2m_ioctl_try_decoder_cmd, + .vidioc_decoder_cmd =3D al_dec_decoder_cmd, + .vidioc_enum_framesizes =3D al_dec_enum_framesizes, + + .vidioc_subscribe_event =3D al_dec_subscribe_event, + .vidioc_unsubscribe_event =3D v4l2_event_unsubscribe, +}; + +static void al_device_run(void *priv) +{ + struct al_dec_ctx *ctx =3D priv; + struct vb2_v4l2_buffer *dst_buf; + struct v4l2_m2m_buffer *m2m_buf; + + if (unlikely(!ctx)) + return; + + if (ctx->aborting) { + vb2_queue_error(v4l2_m2m_get_src_vq(ctx->fh.m2m_ctx)); + vb2_queue_error(v4l2_m2m_get_dst_vq(ctx->fh.m2m_ctx)); + return; + } + + if (!v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx)) + goto job_finish; + + dst_buf =3D v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); + if (!dst_buf) + goto job_finish; + + if (!al_common_mcu_is_alive(ctx->dev) || + al_dec_fw_push_frame_buf(ctx, dst_buf)) { + vb2_set_plane_payload(&dst_buf->vb2_buf, 0, 0); + v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR); + goto job_finish; + } + + mutex_lock(&ctx->buf_q_mlock); + m2m_buf =3D container_of(dst_buf, struct v4l2_m2m_buffer, vb); + list_add_tail(&m2m_buf->list, &ctx->frame_q_list); + mutex_unlock(&ctx->buf_q_mlock); + +job_finish: + v4l2_m2m_job_finish(ctx->dev->m2m_dev, ctx->fh.m2m_ctx); +} + +static const struct v4l2_m2m_ops al_dec_m2m_ops =3D { + .device_run =3D al_device_run, +}; + +static int al_dec_open(struct file *file) +{ + struct video_device *vdev =3D video_devdata(file); + struct al_codec_dev *dev =3D video_get_drvdata(vdev); + struct al_dec_ctx *ctx =3D NULL; + int ret; + + if (mutex_lock_interruptible(&dev->ctx_mlock)) + return -ERESTARTSYS; + + /* Aloocate memory for the dec ctx */ + ctx =3D kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) { + ret =3D -ENOMEM; + goto unlock; + } + + ctx->dev =3D dev; + /* Init ctx mutex */ + mutex_init(&ctx->buf_q_mlock); + /* Init ctx LISTHEADs*/ + INIT_LIST_HEAD(&ctx->cmd_q_list); + INIT_LIST_HEAD(&ctx->frame_q_list); + INIT_LIST_HEAD(&ctx->stream_q_list); + + /* Init the irq queue */ + init_completion(&ctx->res_done); + + v4l2_fh_init(&ctx->fh, vdev); + + v4l2_ctrl_handler_init(&ctx->ctrl_handler, 0); + if (ctx->ctrl_handler.error) { + ret =3D ctx->ctrl_handler.error; + al_v4l2_err(dev, "Failed to create control %d", ret); + goto handler_error; + } + + ctx->fh.ctrl_handler =3D &ctx->ctrl_handler; + v4l2_ctrl_handler_setup(&ctx->ctrl_handler); + + file->private_data =3D &ctx->fh; + v4l2_fh_add(&ctx->fh); + + /* Set default formats */ + ctx->src =3D ctx->dst =3D al_default_fmt; + + ctx->codec =3D V4L2_PIX_FMT_H264; + ctx->stopped =3D false; + ctx->aborting =3D false; + + /* Setup the ctx for m2m mode */ + ctx->fh.m2m_ctx =3D + v4l2_m2m_ctx_init(dev->m2m_dev, ctx, al_dec_queue_init); + if (IS_ERR(ctx->fh.m2m_ctx)) { + ret =3D PTR_ERR(ctx->fh.m2m_ctx); + al_v4l2_err(dev, "Failed to initialize m2m mode %d", ret); + goto error_ctrls; + } + + v4l2_m2m_set_src_buffered(ctx->fh.m2m_ctx, true); + /* v4l2_m2m_set_dst_buffered(ctx->fh.m2m_ctx, true); */ + + /* Add ctx to the LIST */ + kref_init(&ctx->refcount); + list_add(&ctx->list, &dev->ctx_q_list); + + mutex_unlock(&dev->ctx_mlock); + + return 0; + +error_ctrls: + v4l2_fh_del(&ctx->fh); +handler_error: + v4l2_ctrl_handler_free(&ctx->ctrl_handler); + v4l2_fh_exit(&ctx->fh); + kfree(ctx); + +unlock: + mutex_unlock(&dev->ctx_mlock); + return ret; +} + +static int al_dec_release(struct file *file) +{ + struct al_dec_ctx *ctx =3D + fh_to_ctx(file->private_data, struct al_dec_ctx); + struct al_codec_dev *dev =3D ctx->dev; + + mutex_lock(&dev->ctx_mlock); + + /* It is important to do this before removing ctx from dev list. + * Those commands will trigger some traffic towards fw and so we + * need completion to avoid deadlock if cmds can't find ctx. + */ + v4l2_m2m_ctx_release(ctx->fh.m2m_ctx); + v4l2_ctrl_handler_free(&ctx->ctrl_handler); + v4l2_fh_del(&ctx->fh); + v4l2_fh_exit(&ctx->fh); + + list_del(&ctx->list); + al_ctx_put(ctx); + mutex_unlock(&dev->ctx_mlock); + + return 0; +} + +static inline bool al_mark_last_dst_buf(struct al_dec_ctx *ctx) +{ + struct vb2_v4l2_buffer *buf; + struct vb2_buffer *dst_vb; + struct vb2_queue *dst_vq; + unsigned long flags; + + al_v4l2_dbg(ctx->dev, 1, "marking last capture buffer"); + + dst_vq =3D v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE); + spin_lock_irqsave(&dst_vq->done_lock, flags); + if (list_empty(&dst_vq->done_list)) { + spin_unlock_irqrestore(&dst_vq->done_lock, flags); + return false; + } + + dst_vb =3D list_last_entry(&dst_vq->done_list, struct vb2_buffer, + done_entry); + buf =3D to_vb2_v4l2_buffer(dst_vb); + buf->flags |=3D V4L2_BUF_FLAG_LAST; + + spin_unlock_irqrestore(&dst_vq->done_lock, flags); + return true; +} + +static const struct v4l2_file_operations al_dec_file_ops =3D { + .owner =3D THIS_MODULE, + .open =3D al_dec_open, + .release =3D al_dec_release, + .poll =3D v4l2_m2m_fop_poll, + .unlocked_ioctl =3D video_ioctl2, + .mmap =3D v4l2_m2m_fop_mmap, +}; + +static void handle_error_evt(struct al_dec_ctx *ctx, struct msg_itf_header= *hdr) +{ + struct al_codec_dev *dev =3D ctx->dev; + struct msg_itf_evt_error evt; + struct v4l2_m2m_buffer *vbuf; + + if (al_common_get_data(dev, (char *)&evt, hdr->payload_len)) { + al_v4l2_err(dev, "Unable to get resolution found event"); + return; + } + + al_v4l2_err(dev, "Decoding error %d", evt.errno); + + mutex_lock(&ctx->buf_q_mlock); + if (!list_empty(&ctx->stream_q_list)) { + vbuf =3D list_last_entry(&ctx->frame_q_list, + struct v4l2_m2m_buffer, list); + list_del(&vbuf->list); + v4l2_m2m_buf_done(&vbuf->vb, VB2_BUF_STATE_ERROR); + } + mutex_unlock(&ctx->buf_q_mlock); +} + +static void handle_resolution_found_evt(struct al_dec_ctx *ctx, + struct msg_itf_header *hdr) +{ + struct msg_itf_evt_resolution_found evt; + struct al_codec_dev *dev =3D ctx->dev; + struct al_frame *frame; + struct vb2_queue *dst_vq; + + if (al_common_get_data(dev, (char *)&evt, hdr->payload_len)) { + al_v4l2_err(dev, "Unable to get resolution found event"); + return; + } + + frame =3D &ctx->dst; + + if (frame->width !=3D evt.width || frame->height !=3D evt.height || + frame->nbuffers < evt.buffer_nb) { + /* Update frame properties */ + frame->width =3D evt.width; + frame->height =3D evt.height; + frame->bytesperline =3D evt.bytesperline; + frame->sizeimage =3D evt.sizeimage; + frame->nbuffers =3D evt.buffer_nb; + frame->fmt =3D al_find_fmt(evt.pixelformat); + + /* This has to be changed */ + if (!frame->fmt) + return; + + al_queue_res_chg_event(ctx); + } + + dst_vq =3D v4l2_m2m_get_dst_vq(ctx->fh.m2m_ctx); + if (!vb2_is_streaming(dst_vq)) + complete(&ctx->res_done); + + al_v4l2_dbg( + dev, 3, + "width(%d) , height(%d), bytesperline(%d), sizeimage(%d), n_bufs(%d)", + frame->width, frame->height, frame->bytesperline, + frame->sizeimage, frame->nbuffers); +} + +static void handle_bitstream_buffer_release_evt(struct al_dec_ctx *ctx, + struct msg_itf_header *hdr) +{ + struct msg_itf_evt_bitstream_buffer_release evt; + struct al_codec_dev *dev =3D ctx->dev; + struct vb2_v4l2_buffer *vbuf; + + if (al_common_get_data(dev, (char *)&evt, hdr->payload_len)) { + al_v4l2_err(dev, "Unable to get buffer release event"); + return; + } + + if (ctx->stopped) + return; + + vbuf =3D al_dec_dequeue_src_buf(ctx, evt.bufferHandle); + if (!vbuf) { + al_v4l2_err(dev, "Unable to find bitsream buffer 0x%llx", + evt.bufferHandle); + return; + } + + al_v4l2_dbg(dev, 3, "Release bitstream buffer %p", vbuf); + v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_DONE); +} + +static void handle_eos_evt(struct al_dec_ctx *ctx, struct msg_itf_header *= hdr) +{ + struct msg_itf_evt_frame_buffer_decode evt; + struct al_codec_dev *dev =3D ctx->dev; + + if (al_common_get_data(dev, (char *)&evt, hdr->payload_len)) { + al_v4l2_err(dev, "Unable to get frame buffer event"); + return; + } + + /* set LAST_FLAG to the last done CAPTURE buffer*/ + al_mark_last_dst_buf(ctx); + /* Set eos event */ + al_queue_eos_event(ctx); +} + +static void handle_frame_buffer_decode_evt(struct al_dec_ctx *ctx, + struct msg_itf_header *hdr) +{ + struct msg_itf_evt_frame_buffer_decode evt; + struct al_codec_dev *dev =3D ctx->dev; + struct vb2_v4l2_buffer *vbuf; + struct al_buffer_meta *meta; + + if (al_common_get_data(dev, (char *)&evt, hdr->payload_len)) { + al_v4l2_err(dev, "Unable to get frame buffer event"); + return; + } + + vbuf =3D al_dec_dequeue_dst_buf(ctx, evt.bufferHandle); + if (!vbuf) { + al_v4l2_err(dev, "Unable to find frame buffer 0x%llx", + evt.bufferHandle); + return; + } + + meta =3D &evt.meta; + al_v4l2_dbg(dev, 3, "Decoded frame done for buffer %p (%d) (%lld)", + vbuf, meta->last, evt.size); + + vb2_set_plane_payload(&vbuf->vb2_buf, 0, evt.size); + vbuf->field =3D V4L2_FIELD_NONE; + vbuf->sequence =3D ctx->csequence++; + vbuf->timecode =3D meta->timecode; + vbuf->vb2_buf.timestamp =3D meta->timestamp; + + if (meta->last || (vbuf->flags & V4L2_BUF_FLAG_LAST)) { + vbuf->flags |=3D V4L2_BUF_FLAG_LAST; + v4l2_m2m_mark_stopped(ctx->fh.m2m_ctx); + } + + v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_DONE); +} + +static int al_handle_cmd_reply(struct al_codec_dev *dev, + struct msg_itf_header *hdr) +{ + struct al_dec_ctx *ctx; + struct al_codec_cmd *cmd =3D NULL; + int ret =3D 0; + + ctx =3D al_ctx_get(dev, hdr->drv_ctx_hdl); + if (IS_ERR_OR_NULL(ctx)) { + al_v4l2_err(dev, "Unable to find ctx %p for reply %d", + al_phys_to_virt(hdr->drv_ctx_hdl), hdr->type); + return -EINVAL; + } + + cmd =3D al_codec_cmd_get(&ctx->cmd_q_list, hdr->drv_cmd_hdl); + if (!cmd) { + al_v4l2_err(dev, "Unable to find command %p for reply %d", + al_phys_to_virt(hdr->drv_cmd_hdl), hdr->type); + ret =3D -EINVAL; + goto ctx_put; + } + + if (cmd->reply_size !=3D hdr->payload_len) { + al_v4l2_err(dev, "mismatch size %d %d", cmd->reply_size, + hdr->payload_len); + ret =3D -EINVAL; + goto cmd_put; + } + + ret =3D al_common_get_data(dev, cmd->reply, hdr->payload_len); + if (ret) + al_v4l2_err(dev, "Unable to copy reply"); + + complete(&cmd->done); + ret =3D 0; + +cmd_put: + al_codec_cmd_put(cmd); +ctx_put: + al_ctx_put(ctx); + + return ret; +} + +static int al_handle_cmd_evt(struct al_codec_dev *dev, + struct msg_itf_header *hdr, int type) +{ + static u32 evt_sizes[] =3D { + sizeof(struct msg_itf_evt_error), + sizeof(struct msg_itf_evt_resolution_found), + sizeof(struct msg_itf_evt_bitstream_buffer_release), + sizeof(struct msg_itf_evt_frame_buffer_decode), + sizeof(struct msg_itf_evt_eos), + }; + + u32 evt_size; + struct al_dec_ctx *ctx =3D NULL; + int ret =3D 0; + + if (type < MSG_ITF_TYPE_NEXT_EVT || type > MSG_ITF_TYPE_END_EVT) { + al_v4l2_err(dev, "Unsupporting event type %d", type); + return -EINVAL; + } + + ctx =3D al_ctx_get(dev, hdr->drv_ctx_hdl); + if (!ctx) { + al_v4l2_err(dev, "Unable to find ctx %p for evt %d", + al_phys_to_virt(hdr->drv_ctx_hdl), type); + return -EINVAL; + } + + // Check the received event size and the expected one + evt_size =3D evt_sizes[type - MSG_ITF_TYPE_NEXT_EVT]; + if (hdr->payload_len !=3D evt_size) { + al_v4l2_err( + dev, + "Invalid event size for client (%p) for evt (%d) : Got (%d), expected (= %d)", + al_phys_to_virt(hdr->drv_ctx_hdl), type, + hdr->payload_len, evt_size); + ret =3D -EINVAL; + goto clean_ctx; + } + + al_v4l2_dbg(dev, 3, "Event received from MCU (%d)", type); + + switch (type) { + case MSG_ITF_TYPE_EVT_ERROR: + handle_error_evt(ctx, hdr); + break; + case MSG_ITF_TYPE_EVT_RESOLUTION_FOUND: + handle_resolution_found_evt(ctx, hdr); + break; + case MSG_ITF_TYPE_EVT_BITSTREAM_BUFFER_RELEASE: + handle_bitstream_buffer_release_evt(ctx, hdr); + break; + case MSG_ITF_TYPE_EVT_FRAME_BUFFER_DECODE: + handle_frame_buffer_decode_evt(ctx, hdr); + break; + case MSG_ITF_TYPE_EVT_EOS: + handle_eos_evt(ctx, hdr); + break; + default: + break; + } + +clean_ctx: + al_ctx_put(ctx); + return ret; +} + +static void al_dec_process_msg(void *cb_arg, struct msg_itf_header *hdr) +{ + struct al_codec_dev *dev =3D cb_arg; + int ret; + + if (is_type_reply(hdr->type)) + ret =3D al_handle_cmd_reply(dev, hdr); + else if (is_type_event(hdr->type)) + ret =3D al_handle_cmd_evt(dev, hdr, hdr->type); + else { + al_v4l2_err(dev, "Unsupported message type %d", hdr->type); + ret =3D -EINVAL; + } + + if (ret) { + al_v4l2_err(dev, "Skip received data"); + al_common_skip_data(dev, hdr->payload_len); + } +} + +static const struct video_device al_videodev =3D { + .name =3D "allegro-decoder", + .fops =3D &al_dec_file_ops, + .ioctl_ops =3D &al_dec_ioctl_ops, + .minor =3D -1, + .release =3D video_device_release_empty, + .vfl_dir =3D VFL_DIR_M2M, + .device_caps =3D V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING, +}; + +static void al_dec_register_v4l2(void *cb_arg) +{ + struct al_codec_dev *dev =3D cb_arg; + struct video_device *video_dev =3D NULL; + int ret; + + ret =3D v4l2_device_register(&dev->pdev->dev, &dev->v4l2_dev); + if (ret) { + al_v4l2_err(dev, "Unable to register v4l2 device %d", ret); + return; + } + + dev->m2m_dev =3D v4l2_m2m_init(&al_dec_m2m_ops); + if (IS_ERR(dev->m2m_dev)) { + ret =3D PTR_ERR(dev->m2m_dev); + al_v4l2_err(dev, "failed to init mem2mem device %d", ret); + goto v4l2_m2m_init_error; + } + + video_dev =3D &dev->video_dev; + *video_dev =3D al_videodev; + + video_dev->lock =3D &dev->lock; + video_dev->v4l2_dev =3D &dev->v4l2_dev; + + video_set_drvdata(video_dev, dev); + ret =3D video_register_device(video_dev, VFL_TYPE_VIDEO, -1); + if (ret) { + al_v4l2_err(dev, "failed to register video device %d", ret); + goto video_register_device_error; + } + + v4l2_info(&dev->v4l2_dev, "registered as /dev/video%d\n", + dev->video_dev.num); + + dev->is_video_init_done =3D 1; + + return; + +video_register_device_error: + v4l2_m2m_release(dev->m2m_dev); +v4l2_m2m_init_error: + v4l2_device_unregister(&dev->v4l2_dev); +} + +static int al_dec_probe(struct platform_device *pdev) +{ + struct al_codec_dev *al_dev; + struct device *dev =3D &pdev->dev; + struct device_node *np =3D dev->of_node; + const struct al_match_data *match_data; + const char *firmware; + int ret; + + dev_info(dev, "Probing ...\n"); + + match_data =3D device_get_match_data(dev); + if (!match_data) { + dev_err(dev, "Missing device match data\n"); + return -EINVAL; + } + + al_dev =3D devm_kzalloc(dev, sizeof(*al_dev), GFP_KERNEL); + if (!al_dev) + return -ENOMEM; + + al_dev->pdev =3D pdev; + al_dev->is_video_init_done =3D 0; + mutex_init(&al_dev->lock); + mutex_init(&al_dev->ctx_mlock); + INIT_LIST_HEAD(&al_dev->ctx_q_list); + + al_dev->cb_arg =3D al_dev; + al_dev->process_msg_cb =3D al_dec_process_msg; + al_dev->fw_ready_cb =3D al_dec_register_v4l2; + + /* firmware-name is optional in DT */ + of_property_read_string(np, "firmware-name", &firmware); + if (!firmware) + firmware =3D match_data->fw_name; + + ret =3D al_common_probe(al_dev, firmware); + if (ret) + return ret; + + platform_set_drvdata(pdev, al_dev); + dev_info(dev, "Probing done successfully %p\n", al_dev); + + return 0; +} + +static void al_dec_remove(struct platform_device *pdev) +{ + struct al_codec_dev *dev =3D platform_get_drvdata(pdev); + + dev_info(&pdev->dev, "remove %p\n", dev); + + if (dev->is_video_init_done) { + video_unregister_device(&dev->video_dev); + if (dev->m2m_dev) + v4l2_m2m_release(dev->m2m_dev); + v4l2_device_unregister(&dev->v4l2_dev); + } + + al_common_remove(dev); +} + +static const struct al_match_data ald300_data =3D { + .fw_name =3D "al300-vdec.fw", +}; + +static const struct of_device_id v4l2_al_dec_dt_match[] =3D { + { .compatible =3D "allegro,al300-vdec", .data =3D &ald300_data }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, v4l2_al_dec_dt_match); + +static struct platform_driver al300_vdec_drv =3D { + .probe =3D al_dec_probe, + .remove =3D al_dec_remove, + .driver =3D { + .name =3D "al300_vdec", + .of_match_table =3D of_match_ptr(v4l2_al_dec_dt_match), + }, +}; + +module_platform_driver(al300_vdec_drv); + +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:al300-vdec"); +MODULE_AUTHOR("Yassine OUAISSA "); +MODULE_DESCRIPTION("Allegro DVT V4l2 decoder driver gen 3"); diff --git a/drivers/media/platform/allegro-dvt/al300/al_vdec_drv.h b/drive= rs/media/platform/allegro-dvt/al300/al_vdec_drv.h new file mode 100644 index 000000000000..8d8f2b9e734a --- /dev/null +++ b/drivers/media/platform/allegro-dvt/al300/al_vdec_drv.h @@ -0,0 +1,94 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2025 Allegro DVT. + * Author: Yassine OUAISSA + */ + +#ifndef __AL_VDEC_DRV__ +#define __AL_VDEC_DRV__ + +#include "al_codec_util.h" + +enum { + MSG_ITF_TYPE_EVT_RESOLUTION_FOUND =3D MSG_ITF_TYPE_NEXT_EVT + 1, + MSG_ITF_TYPE_EVT_BITSTREAM_BUFFER_RELEASE, + MSG_ITF_TYPE_EVT_FRAME_BUFFER_DECODE, + MSG_ITF_TYPE_EVT_EOS, + /* Mark the end of the events list.*/ + MSG_ITF_TYPE_END_EVT, +}; + +struct msg_itf_create_decoder_req { + unsigned int codec; +} __packed; +DECLARE_FULL_REQ(msg_itf_create_decoder_req); + +struct msg_itf_evt_resolution_found { + u16 buffer_nb; + u16 width; + u16 height; + u32 pixelformat; + u32 sizeimage; + u32 bytesperline; +} __packed; +DECLARE_FULL_EVENT(msg_itf_evt_resolution_found); + +struct msg_itf_evt_bitstream_buffer_release { + u64 bufferHandle; +} __packed; +DECLARE_FULL_EVENT(msg_itf_evt_bitstream_buffer_release); + +struct msg_itf_evt_frame_buffer_decode { + u64 bufferHandle; + u64 size; + struct al_buffer_meta meta; +} __packed; +DECLARE_FULL_EVENT(msg_itf_evt_frame_buffer_decode); + +struct msg_itf_evt_eos { + u32 unused; +} __packed; +DECLARE_FULL_EVENT(msg_itf_evt_eos); + +struct al_fmt { + u32 pixelformat; + u8 bpp; +}; + +struct al_frame { + u32 width; + u32 height; + u32 bytesperline; + u32 sizeimage; + u32 nbuffers; + const struct al_fmt *fmt; + enum v4l2_field field; + enum v4l2_colorspace colorspace; + enum v4l2_ycbcr_encoding ycbcr_enc; + enum v4l2_quantization quantization; + enum v4l2_xfer_func xfer_func; +}; + +struct al_dec_ctx { + struct al_codec_dev *dev; + struct v4l2_fh fh; + struct v4l2_ctrl_handler ctrl_handler; + struct kref refcount; + struct list_head list; + /* CAP and OUT frames */ + struct al_frame src; + struct al_frame dst; + struct completion res_done; /* Resolution found event */ + u32 codec; + u64 hDec; + struct list_head cmd_q_list; /* Store active commands */ + struct mutex buf_q_mlock; + struct list_head frame_q_list; + struct list_head stream_q_list; + u32 csequence; + u32 osequence; + bool stopped; + bool aborting; +}; + +#endif /*__AL_VDEC_DRV__*/ --=20 2.30.2