From patchwork Fri Mar 14 15:29:22 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017057 Received: from mail-lj1-f169.google.com (mail-lj1-f169.google.com [209.85.208.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 38A58202991; Fri, 14 Mar 2025 15:29:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966189; cv=none; b=b8Vxbm6cVZrELZmS5miYy0d9s24j4d2vv2uFYgplQMNrA29h65nilHWHZFPQfdIELqLedNE2YR7f30viN3jQZb2tw1z18tB5OHbH0ZvhNBfntU7qcA15U3G2sV+2qiTPAnHbHPXKB/Dr2rSPgtN04ZdK93dxQT4SyRAOEJFbX44= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966189; c=relaxed/simple; bh=3cmE2i1Gz9lClv3Jfpe/1r3UhrAIU3SNzkgw702sHyQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Pzt4YLPEjyHrdNVFvjaL6QeP69sWH/rkKOVhwAc4ypqlJbnOWsaAq5Rl0SzyqQoiZrWN+gWcDZFAgdyuNMxpHOYr7vIOqScw2LNV39vYjidiTlwZ/tmmVMD53/kpo72NjVAQfHSz6Q9u2viludB7TscZeLQm/rFjhyotb5xtv2Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=A3BJR+05; arc=none smtp.client-ip=209.85.208.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="A3BJR+05" Received: by mail-lj1-f169.google.com with SMTP id 38308e7fff4ca-30bf5d7d107so19330721fa.2; Fri, 14 Mar 2025 08:29:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966185; x=1742570985; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=g2TBxm9b4Z7DvE3zMi2yjLlJGaJTiMHJTb4BUjWKoMs=; b=A3BJR+05HQePvJEAmwRku6BSqPbRDeOuNLH4A4mTHyYc8BDk87pNr2BQ9Vy+vsuSSn gIOJNudDSg8LMGeLaIYJVjD7/wK5hmWwR4hp5utJBqFK5BqYI5xbUtR5kgMkxTooczYx 5DrG7AbTXwTjC4uDewRfRUuYyu+PcjtIiLHFeapM5CMr4mH0RCCRvJYTXfpf/JJEh406 7ADi9NX5hQPSXAhwbWnS3Pmk2HuL8pHaOR6tihNlVI46kW9w3uuNOCDBVRTeoxVp4IcC gTNZ8F24U1u4HxXXPFXuKzs+Y91/i2z9GlNSBnZcdxACxw6e/YGMllXalVHYeV0HSlxI fi9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966185; x=1742570985; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=g2TBxm9b4Z7DvE3zMi2yjLlJGaJTiMHJTb4BUjWKoMs=; b=eR/I/I8VkHZpml+HgI/bKwl0diqZg/W48JeT9kPsiu/gv716neFvCwQeX4zX+ZvFcn hpjcrbNA8/kLjDObTsSH3oVb2PIpY5S0aZmWiMYepmZWltOCUrYmSTt4rVYmpbdGTLNJ VfEbQ0eeR8YnL72ya7YVSQBEzk992TvKfbQwe/ypS9FwWi7ARBhhly8PC0gPv4y7LjXl 8Gzj/E6uEAZ1mWc2hwunVbF6dROpRRoRNyeKBInUg8T9keGTrmh2SfL1dYUcR+z40zJu qcVFcU80mzlzT/zEnhRmcrgujIL+q0J6VNq9Cl4RtbIa4JlIYA4EsmHVBErpZ3RRMZXO JP5w== X-Forwarded-Encrypted: i=1; AJvYcCXCTitxXjcoKMPsRPuKsWsSHq4lBDLSUIyR5AJ88t6I9EtLV//3VVb29waSnDcXdiDusshSVXvsGmI52Ss=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+ZsFLEVNYbCAZC32fZ/jnxdPxSeC/pa3rWdWqE+AaLaxai+6t zDtJVL+n+cRjpOtsE6O4UBlMzpfiG8DgvlnhVpDcnkB+Q05wd/SzEymLF4nAWvM= X-Gm-Gg: ASbGncsDmYIHVQmVQ/PFz7j7IS8AWt7/WKFJfTomnV9xONGrkidDhFQ8ED7FGIs1AIC nyBs4Oo4hypyB9g/k8WWqAQ35ERkNfH+DunLBEFrzCTX8KQhcroPBTgKnwF5NiIwCg5vqj9zOlw Ug45iOAPoQTy6mQgyU383zbGi6lBracJeLSDVcLi2RNaa5Wxwv6NFeWkcjZzJo6aJAeCtMq0Hjc G18/2cJipheAq2Ijf0zrXLTwmfIDTRX6w1rzI8U3ds8bwDcpFPyrK5BMsk2cb5ryzKhgNspVmOc rXQXIT5RSy7yKR7ngOrl59ixCyvJ2h6DBIeXjH/Bt980DwDMcvM0UVS/auk5JgdVo8Hc X-Google-Smtp-Source: AGHT+IHz3UFJwnIa4DizqArqEXe7UJKpqN6ShlYP0/kZkaZxijazQ/Qj3vUgdb2JaYqJb+fk32p4pg== X-Received: by 2002:a05:651c:198c:b0:30c:1441:9e84 with SMTP id 38308e7fff4ca-30c4a860201mr11324771fa.13.1741966185322; Fri, 14 Mar 2025 08:29:45 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.29.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:29:43 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 01/18] media: coda: Add print if irq isn't present Date: Fri, 14 Mar 2025 18:29:22 +0300 Message-Id: <20250314152939.2759573-2-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Vladimir Yakovlev Use dev_err_probe for print and return error if irq isn't present Co-developed-by: Sergey Khimich Signed-off-by: Sergey Khimich Signed-off-by: Vladimir Yakovlev --- drivers/media/platform/chips-media/coda/coda-common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/platform/chips-media/coda/coda-common.c b/drivers/media/platform/chips-media/coda/coda-common.c index 289a076c3bcc..84b9b75b382e 100644 --- a/drivers/media/platform/chips-media/coda/coda-common.c +++ b/drivers/media/platform/chips-media/coda/coda-common.c @@ -3178,7 +3178,7 @@ static int coda_probe(struct platform_device *pdev) if (irq < 0) irq = platform_get_irq(pdev, 0); if (irq < 0) - return irq; + return dev_err_probe(&pdev->dev, irq, "Failed to get irq 0 (bit)\n"); ret = devm_request_irq(&pdev->dev, irq, coda_irq_handler, 0, CODA_NAME "-video", dev); From patchwork Fri Mar 14 15:29:23 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017058 Received: from mail-lj1-f172.google.com (mail-lj1-f172.google.com [209.85.208.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6F856202C2F; Fri, 14 Mar 2025 15:29:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966191; cv=none; b=XvgvW0EOczxAKDWp30vmW262ZrJFGzq1B0KxadTZTB6myHLqAiPucq221v0M2vUx4DktvObFwslVjPV4C0lnaNLA2a08TlMb5Z2kxz2cX0fokGQlTZkg419+6EFuzXM8imptdXY0ARAMddIVT83COewg0p6Ts6PWRu6qPMY2Axc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966191; c=relaxed/simple; bh=Enkgjvb71dulleutPTpVfqToJIE49OWS87dqHhrphOU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Hzyr3OdeA2to3UmiP2sORlvW/a9C/wenAYMdw2TkWOoUrBFIW5ZZjP7KKMsuqBCWWHLnDPUcUP9Ix+RvQuChyGDGl0NGuw43JUbXYboogHMaDEr+SjJxqm4fGEC9lIpqY7LycmZXLEElwmknMOsoyb6MyUB1IP9fmiAeudUMsf8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=cn4nU35C; arc=none smtp.client-ip=209.85.208.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="cn4nU35C" Received: by mail-lj1-f172.google.com with SMTP id 38308e7fff4ca-30bae572157so22723981fa.3; Fri, 14 Mar 2025 08:29:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966187; x=1742570987; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=A/YRybNQurcImF9bl649NFtx5/LNSMtjat9hHQQagrE=; b=cn4nU35CTwY1H6wUy1L9SdUTs+3i2dJYEm2rNXYg15vGiqnhaajXQ3G93duVcBEc42 +StSrc4uKv/5MiGgukDODffAsKzQd1ySQSHeGuOGt4US+HTAoB5u+yO8eM0tjE2Tur5K kgeNeEok36fTltuBUTuWtTWNfI1gEAUeiCdYdl0NnyZDGAwT/jXdcbAjhW+Xk6In2mMJ Teu+umDX4ZZ5ssL+ciUOh2LHzaDAMnvYcPoBt5PruV/47MuV367JmQ+qemzWjn3A057N WkI2rtEn0aiKF+JWnUvI7AImhjgzgtSQ9jls5dcGsuKRRD/9jvcz3H4B1HWNiHsspOhO 2KKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966187; x=1742570987; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=A/YRybNQurcImF9bl649NFtx5/LNSMtjat9hHQQagrE=; b=RL82Sg0KA6QHeuPydmsW9IQyXoQ1Nu1IrxfVr0ihDLlrfTrfhY6fBKr93BvaoFUPaT hAJdeF74X3TbHxYvBb9VgzZCTFZaij3os0g7WevbU+JEPdg7Es1wuLuklJdor3j3Udcc z+s/u+lSarWl0bk2eEYuTaHgw1f3rJGrohR5NX39Lq4JtpCnKC9VHrJYd+nJbEh4Maw4 7TdpC/1Msy+ac+woQmYJOPmPxYnlL9j9Jsqnd244NV4fhveIw11OEAV4bf3yTgzxfzJ0 VLqbuqSTVHsNHrUazPvdOwQatoFevJFcUEeL5DDCJZ+YvXucW/e8GVbKk2iQLrf5eBvz D+5g== X-Forwarded-Encrypted: i=1; AJvYcCVAFXv0XOOAkrfHJalZiAW3DZhHnCr1FTWdedMqWuuJdZiNoeJlw/g8k3a2r+WD+F7vkL7jLrE1vnKfU6M=@vger.kernel.org X-Gm-Message-State: AOJu0YwZnytRaIyCvLTanOqG6pGKuAUHZzBvH3eac2fuGM53TrDs8xNM fF7al7FeI638glPfJkGe2Mn0e1qBoYXmfbUQw6EZ5tp/nK/3MdmGG9wnZk61wZg= X-Gm-Gg: ASbGncvPPFAvBWmcTzcOP9HROeahZTKoIBAIvqWs1D8qIwNJVxVx/mWl+KbWhAMbpIl 9ZW0rt05ipvHk6/VvidBqL99kQwN71/QIyD2Tj7sTgGZQed6M/IMPVkPd5DjHl6/2IS0qhQzw52 A+sbo2WsFVXsImT1xVSlpqyX+FTLnK2bIuGYdXSxjKqmDqZgyNwo4lHbR+E4TnHe5uiLbhjnMEv VLA4Waqy6KaSrs+zdfVNFCoFK/SNbtbXK2G+CcEsMkyzzUJrwYBFgdoSIb9SXUOxMc9u4MFgjAN zS8mvnoGYoz1HD8lAXYzEXJxj0xl0hjGM7Cd7MT16SO6CCgsgxb8vmSwTOG2AjpHebID X-Google-Smtp-Source: AGHT+IEUKH6W/KBteY579of61YGH2HGMQlmSc1eAFyht4NTRNZqOG/PG4F9YtxuFHPv3gPnogxdEoQ== X-Received: by 2002:a05:651c:1a0c:b0:30b:b78e:c449 with SMTP id 38308e7fff4ca-30c4a85c363mr11450701fa.11.1741966186911; Fri, 14 Mar 2025 08:29:46 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.29.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:29:45 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 02/18] media: coda: Use get_array to work use multiple reset Date: Fri, 14 Mar 2025 18:29:23 +0300 Message-Id: <20250314152939.2759573-3-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Vladimir Yakovlev Some Coda's IP blocks may require more than one reset signal. Than we must use get_array or bulk functions. For compatibility with old code it's better to use devm_reset_control_array_get_optional_exclusive(). Co-developed-by: Sergey Khimich Signed-off-by: Sergey Khimich Signed-off-by: Vladimir Yakovlev --- drivers/media/platform/chips-media/coda/coda-common.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/media/platform/chips-media/coda/coda-common.c b/drivers/media/platform/chips-media/coda/coda-common.c index 84b9b75b382e..c39ba4fba547 100644 --- a/drivers/media/platform/chips-media/coda/coda-common.c +++ b/drivers/media/platform/chips-media/coda/coda-common.c @@ -3203,8 +3203,7 @@ static int coda_probe(struct platform_device *pdev) } } - dev->rstc = devm_reset_control_get_optional_exclusive(&pdev->dev, - NULL); + dev->rstc = devm_reset_control_array_get_optional_exclusive(&pdev->dev); if (IS_ERR(dev->rstc)) { ret = PTR_ERR(dev->rstc); dev_err(&pdev->dev, "failed get reset control: %d\n", ret); From patchwork Fri Mar 14 15:29:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017059 Received: from mail-lj1-f178.google.com (mail-lj1-f178.google.com [209.85.208.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ED070202F9A; Fri, 14 Mar 2025 15:29:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966193; cv=none; b=tz/C17+ghFcFjxw6yyCAFNHSOo1h7lVFUupI80wPPlJ4HjBllUgc2mPPtaNyixyfEHBW8GHVGUwiANWKFs0aVpr05wMWuRa3rvtHtkBrhh3BcpF7nNbv5MnzX9fuSJQwZIAgM5iWbHLn7hoVRjLhRl1xrUnOP8+FvIZeX9NVLIk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966193; c=relaxed/simple; bh=dDfjSEMJqcbiFRRTXRgiBy29koeayW0JN3uv77D2LIs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=coY2gYWOsr9Wz2lfnKYn/m6r7FK92lUBkBjKJCfgAtB9QJaWvUHs/ahO5hvTx5ryBJAO/Nc/yGmgu3rW4ZqeX9ymvY/9QyNutCMlLCn9KQua8ezN47a7tyoi0eIx3I3h068rBRe/i+2k8VQ66li0ddySZVUCLjaIRVdK+Gy0K38= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ncarldHI; arc=none smtp.client-ip=209.85.208.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ncarldHI" Received: by mail-lj1-f178.google.com with SMTP id 38308e7fff4ca-30c461a45f8so13563981fa.1; Fri, 14 Mar 2025 08:29:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966189; x=1742570989; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=B+KjLHCq3Sx2kKjWPeGqmXEWfZAFtx8T+aLve8LuxuM=; b=ncarldHIG8NIB88IQ2IHHVYNfQwCDin5d+1xVKCdwYfvBeUYtGAu2cgCYn5ueIEEjS 7zYnerUkSwxo5KTZ2czeY4efq/KyGvgePnbf3FYsbUqV0ZxJorDfsMijYK3iTSIaxKaa Y4hn2r+7EvUGab3uLJovMGVoVYN3d1yvVlhh3paRWEvpqeqD+GtPUwA6w6liI+uVcS51 976ZjgWbnuf3Dz8HN8u/lBWboRKbSImzZmpREF5yK/paDRhnJUjZgvsjqZBw1d8mFeSu 79DwIPi3taI2hyxDx1DU6t4k5groJqDlicleCEn5IDlQclP/AqNBnasQtmXteK2JvI2a pp1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966189; x=1742570989; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=B+KjLHCq3Sx2kKjWPeGqmXEWfZAFtx8T+aLve8LuxuM=; b=MaHG5TgiOekxYjTd7kMoB1TKceekeFM/+bafrvDU+y4OmNxdUxQi94JfgE97OZpuk8 cEBLKBRprAXAUGI+aEkpg6+1Eu8CSPrs2+7qj1CQsQE8anZQpWd6DcJO/tc3WpYQaPIy VcxBJvTqbLQj1GyBJLSz0eAE9659TYvYsZ0FRWW9Z0Z7NjwUaYaurbC2pMvuQ2oydqvY JAts+Hz8Jx2+jZE6Kloq47rWSdKWtA3zP2ejuPN2KIrq/3N7pLiRGUQha41txhbZyBdw OurI4o8PrD+ZhhY1R34x42CDQO5Hpse2o7j8Sn09RNqdYBJdnWYXEMh7ZFvyWki0+VvK FVhg== X-Forwarded-Encrypted: i=1; AJvYcCVYmOSWZgxZjHnedQL7nl6eKc+i6r4iP22i10Ic0tqYXgqoltDHjuRbZnCnhx/zSwCbERVTcow1ungaySo=@vger.kernel.org X-Gm-Message-State: AOJu0YwnCEAPK0ZX03bYqelrS0hIOFbCSMaVrup6GnxL8HhjXKpjS7vs B32NRr2MmcaU5L6Z2vQZsw1F4yMnq/N0ccKO65sBEoBvnfXZijOpF4E5o+eMC78= X-Gm-Gg: ASbGnctnK3aeNV+o+zcEQ+i7X3JOHTCAfHWyicsGCv7hY18Y+NVby39wN2Q5OmhmGlo R1mYdp/mI9lJpOEka3jDKKo0kry5m+rZtuvadECsdXYNX704OSlv1ZfE+OdgKJOPP1qrOQcBFPt Roin5e8cBKOLgeJ1IkXjfva0mWwgxuzWKOnOmI+YEPhCop/FV8gJGB0Np6nth9PEh0r34mwpvHB foGOW7R5qBvEGbmzqWcyd/aqSte9fz4HmlDN8SPF4xcmJccHq5idHYSK3wXYsVfDMwCIklOQJmY hZQrXNIQiPyJaiE9UugPCMvaRx3WOk+NYbrG+HuTGmjC4sCi+cwZF4PELCrpxe5KQK/B X-Google-Smtp-Source: AGHT+IFt63GiJvYRhTbIvjnwU/PlkPSNrf5lKrSkW7Do/SjlTvnqNK4g893isi48FwqEKoOZwM5BoA== X-Received: by 2002:a05:651c:220c:b0:30b:cc6a:fff7 with SMTP id 38308e7fff4ca-30c4a852e04mr11269241fa.6.1741966189312; Fri, 14 Mar 2025 08:29:49 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.29.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:29:48 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 03/18] dt-bindings: media: coda: Fix resets count Date: Fri, 14 Mar 2025 18:29:24 +0300 Message-Id: <20250314152939.2759573-4-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Vladimir Yakovlev Change resets count because now we use get array function and reset signas may be more than 1. Co-developed-by: Sergey Khimich Signed-off-by: Sergey Khimich Signed-off-by: Vladimir Yakovlev --- Documentation/devicetree/bindings/media/coda.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/media/coda.yaml b/Documentation/devicetree/bindings/media/coda.yaml index c9d5adbc8c4a..3cb0e9afc100 100644 --- a/Documentation/devicetree/bindings/media/coda.yaml +++ b/Documentation/devicetree/bindings/media/coda.yaml @@ -60,7 +60,7 @@ properties: maxItems: 1 resets: - maxItems: 1 + minItems: 1 iram: $ref: /schemas/types.yaml#/definitions/phandle From patchwork Fri Mar 14 15:29:25 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017060 Received: from mail-lj1-f181.google.com (mail-lj1-f181.google.com [209.85.208.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4514820371B; Fri, 14 Mar 2025 15:29:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966196; cv=none; b=WQSgr6PVattnPfficcIWRMg44G3E42cpgqpdPp/4T4sPaSi6Zdo//bbt+FCKjzkL8EpOalpkcvhEPfQTi89KiKkYywvTn7T+VObRbwIHf6exyu3yXhv1uz7wACEIGb9NWVcbznbrqWaZmDJ88yicRKUW0IRezJVGqT+L9rKK0mw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966196; c=relaxed/simple; bh=yUOy+L9Ctomd5isY62yQF2ankxUxe03Hv9fx76BjX4A=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=NgDYSdyBURJu11NmLybH6emqVHdJxmz5IBwpC/JcmXull3AWIOQWKXD2Hb4vqur/ucnv0qO/T9akMSlyFc48QrmX8DYeHXBMy9sW/US6o33lL4R0sx/vbQ2T+mTCTWpRPoxgvdMSUiPBGsAi2EO9JuG6FuRexDKAp/8h1bl11k4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=FaqGJdA9; arc=none smtp.client-ip=209.85.208.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="FaqGJdA9" Received: by mail-lj1-f181.google.com with SMTP id 38308e7fff4ca-30bee1cb370so23673031fa.1; Fri, 14 Mar 2025 08:29:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966191; x=1742570991; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BuH1mlog415eNldUnRz1fZTPFld846wd4tkcoX0egoA=; b=FaqGJdA9B1r1eVwm4N8nBCH6vij2McyloQu04j5I2hriZ9HCd5BrrO2MExOWCO24tj IDcdWQhSAJc23QlXRtBjxMUhCBrUANsphtscVjzZnu/v9kQx8Zy9otQ07tdz4l626Iil om+T02LZ/XkQnOAduVq4XEErgm+pKbgQy4rfJ4g+NZPT5BL1X6ESVrYXZ4OTkv3ssmAW 0rNwR74rcDDusk9emWlfYnLnRRt+TO+V2c40kGtkc9pImOW5tCPDGGRrRMDQZ/WwkXGn 8QlrNN/FQ0dWXrF0lQAIZ75dLZh8TwUNwQqIbSbitBNtgGI2rbcJFh9s97yvNEyBfQ7n DUXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966191; x=1742570991; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BuH1mlog415eNldUnRz1fZTPFld846wd4tkcoX0egoA=; b=ATXgFEBV53qMV3qNuDVXQ8R3vGajvsNdEDedBOS3DCzlsD+AzUfeMlHORkd7CAZqnX MrAwCg4fjpLEQjsNKmUGvoeqTs2fcc95GFI8aO0wiSjbJfIECd7Rq5A+Xb+e0yE6qYMt YopCza+9AVe4MDHA/ea5ORgNamKOZOAstQ06Izco4jxiuDuxVcqwEKvkiVGAc+JtSqn9 U+ue2vd37stZivn6f9Wl6gUTPgJjhaqyCJXGcrgTvubJ3T5HgDFvRZB8sP3uqN+1wRCu dqUFdmhdjoN7Tz+QfG8vNiC8NGL6r+2Bk4qNrM+mn5lWUTKxoZw1NhIrmOcKwHY0Y0PH l6AA== X-Forwarded-Encrypted: i=1; AJvYcCU8JDl8sZcLK4mgkp4gVJCAGHEjiTF0REGdXd+T9m/ZO/qUlBylr0GW7fzCNRxOA7bvZRCLFV4sVS0oLto=@vger.kernel.org X-Gm-Message-State: AOJu0YyFIF5FLklBay4TFzlLFDnSVM00y3sEYFksNbIYZZ0omcsqLPmi hfQ/nGl3F4Rx4idc3/RZGUfsvkXV7z1G40Yeb/ZYyr51rM/M1Q/+jfcFXRAC/Kg= X-Gm-Gg: ASbGncvCs9zoWayvHwL+j7cmyYucY9Qq54nh1O6y88tdLIG9gs3MgA6B2L+1iNzjoaI +hRBGV4yYxahjPLol9+jd+F/vO9QYNxkqF7NDx3xEUZSDAu4CT7JPIn7aC7eV3Q2Vx5paCIdmTp MPe6cK/ts5kU2y39F3hnzJC9zNDtExTZpeXcpG8yYEYVOgj6Je9wD80icDDvnj8g2MqRL4rIU28 SvOyVJfmAwSJEGPHegE9DRhbbYbA76svdoXZ3+mYI+rSYD7+EWHk3cbfHVIlUVuOXvroCFA+lD7 9NzuDVTgXNklDyChW2oYgAO1mb9Vbw2SAULtKEdalnAu8r6lsjJPQyWk6Kh6vYTsBwUL X-Google-Smtp-Source: AGHT+IHEFM1Sw/Ll/yUngaFm30qGrYLFpIsHGFudFrTmpkSEWFxduSeAZd2+Vr9wBAlkwwJxR9l6Wg== X-Received: by 2002:a05:651c:b06:b0:308:e5e8:9d4c with SMTP id 38308e7fff4ca-30c4a8d9084mr11110871fa.28.1741966191369; Fri, 14 Mar 2025 08:29:51 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.29.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:29:49 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 04/18] media: coda: Add check result after reset Date: Fri, 14 Mar 2025 18:29:25 +0300 Message-Id: <20250314152939.2759573-5-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Vladimir Yakovlev Check result after reset IP block and disable all clocks if return error. Co-developed-by: Sergey Khimich Signed-off-by: Sergey Khimich Signed-off-by: Vladimir Yakovlev --- drivers/media/platform/chips-media/coda/coda-common.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/chips-media/coda/coda-common.c b/drivers/media/platform/chips-media/coda/coda-common.c index c39ba4fba547..64ba17d8adfb 100644 --- a/drivers/media/platform/chips-media/coda/coda-common.c +++ b/drivers/media/platform/chips-media/coda/coda-common.c @@ -2793,7 +2793,9 @@ static int coda_hw_init(struct coda_dev *dev) if (ret) goto err_clk_ahb; - reset_control_reset(dev->rstc); + ret = reset_control_reset(dev->rstc); + if (ret) + goto err_reset; /* * Copy the first CODA_ISRAM_SIZE in the internal SRAM. @@ -2872,6 +2874,8 @@ static int coda_hw_init(struct coda_dev *dev) return 0; +err_reset: + clk_disable_unprepare(dev->clk_ahb); err_clk_ahb: clk_disable_unprepare(dev->clk_per); err_clk_per: From patchwork Fri Mar 14 15:29:26 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017061 Received: from mail-lj1-f170.google.com (mail-lj1-f170.google.com [209.85.208.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3C48420409B; Fri, 14 Mar 2025 15:29:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966198; cv=none; b=HSX/POz3sbcM+gigjgpr3hCbcQmZcL71oJcXqOCy4qOtAWgBeWzSYy1AWNLbNdnV3NPyeDrKEEwwWJ3apuklaQdyeDnhdpDNLpdijO+mF1n9fDYskgNvtNXQVPM1bU/iune5NE00K4t63PicfBvpImxPVyud0GLUjdc4hR0Eb/k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966198; c=relaxed/simple; bh=I7pVhZ1m4laGSD4+BO4jNvJfowqtXOPdcOK/Y3r1/sQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Nq7/boTTYCtX8tYxWr72b2WbCy0FY3HV2E/b09QM2B76PaS3zP65TZRinWxINYiCbC5ARbJw/c69RToCJsJPjtudQ+7n4YhtJnhzZhCEwY8p8znLZ+uOw00ZK+5tndqcd5EsDFl5p1aDg7gP7BoP9qRMnxUWt+OMpjeS3v1+Qz4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=CK4geyJe; arc=none smtp.client-ip=209.85.208.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="CK4geyJe" Received: by mail-lj1-f170.google.com with SMTP id 38308e7fff4ca-3061513d353so26982721fa.2; Fri, 14 Mar 2025 08:29:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966194; x=1742570994; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=VBp+MyC/2lSvCtiHJgVjLDnI7aoBViMmFmchAxQ69hQ=; b=CK4geyJeJHm3EBoCdlLIN28FzgAkaexz41GkxNs1ySooeEcZ+diKLKjnzUzFGBpSSJ NLc1NZYFDewyw2moyhc66LuJ+1I+ge0YVWV/KmG1wLrK+ES3rU6+cVyNDRERJs+B5w5o jS3BE/yj3/Z3TM+Kttm0uSAbccVyGyBTkdVRIK5MBSRYEMl67rXOdd1ITa9TNftL7sD6 jPkkRSwdc1N1KQwyAowAINZqNJQ+/naxk41IRMoS0gOKMTR42ouZKmhNJTLNHJ3KXnKG Qpl5u4w2nzP3lusW3/LWF+Az+1vqiMQnFpXIto9gPIA8D7PNttDOdHgMiYACvZ0OE7Vq LBpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966194; x=1742570994; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=VBp+MyC/2lSvCtiHJgVjLDnI7aoBViMmFmchAxQ69hQ=; b=XA1OMrn5DNvw2MPaVJocCyA/W3g+Y75onZPKXJafAzdcjGoHLNXz9tptOA7Jv2DAd6 SO+hFb0VyHZeahkvGJxOaDDfDK+BnU9KVmjLagWbDoaI6UL1V/pCkowDbyXj49wlIay7 m6V0J8VMmLodLx0B4jlg2Cu68dzHFG+7kvulcgA5VwsCzXm0zKTCBTj7kF0YZuHUrTN4 1pRA+3/5bMrJnWA4s6j5BLB6CHhzAFEFra3CmURGRsmWKDF264B7FE7DVEVBfrDglz8A +efufKowYkYS08DTjY2ystLpvJimrKrGwrSLudphCYAemEokrFu8kP50LfAPSTNi540c a1sg== X-Forwarded-Encrypted: i=1; AJvYcCWsvRgZRHBt2qRLiUrueECIMo09dZOgX16haf8bLZT+9fbkUOEje1s9oWOYh06soyX6qKccqPIxv5Oeryk=@vger.kernel.org X-Gm-Message-State: AOJu0YxQMWzYLy+3CvOZq4G94GwXf5R1NWrBbY9nQaWyVjGGcYousAnH i/ndHTuJMRM2F+loSLEj62bFRK2fCkrrSePiUBV20e1Xr+GBVfpiGAQB00eobbE= X-Gm-Gg: ASbGncuYamqVVc/knG6QWxgdxetRxWkKVuze/IDKKfGEIQqbsPP7KS9g+MoAADPKCto 5d6FFPBttMshk59y550gVxiRWFHUIDpAL1vZ2B5vJa/ewSafAEzg96rQaSWk0q5BCj4sZIkMuVv sXRWDAJ7rSqhE8JX5fov7pHHsViDoeCJz7/Bza/Mm6sGkctl61kiKBhLpcTY7bR+O5O44oda5Ea gdj5+3O31vJGs1uMdJ0XbJ69aaW9VtO4NBwiLTk6MQmQLmms9WNVtuuF5fb7O3KF8HA5tnt/2yb NFW9HT1xvl+wxWXeb3iZAW2Fvz/y1ZIEls5vaXWbJ9pFRFqLyc0on1+wMArabyF/ie4Tvt679fr Lv3o= X-Google-Smtp-Source: AGHT+IG6QmzrcKWEFKz5AmgDsW3ngveYSn6bnD0b9EFvZzQXH1KPuBgJtH1TC0C2lneQJGDjamI/gQ== X-Received: by 2002:a2e:a370:0:b0:30b:c5e7:6e61 with SMTP id 38308e7fff4ca-30c4a875eb8mr9982751fa.20.1741966193506; Fri, 14 Mar 2025 08:29:53 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.29.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:29:53 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 05/18] media: coda: using threaded_irq for 0 (bit) interrupt Date: Fri, 14 Mar 2025 18:29:26 +0300 Message-Id: <20250314152939.2759573-6-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Sergey Khimich Use threaded_irq for 0 (bit) interrupt instead of lowlevel locked irq. Signed-off-by: Sergey Khimich --- drivers/media/platform/chips-media/coda/coda-common.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/chips-media/coda/coda-common.c b/drivers/media/platform/chips-media/coda/coda-common.c index 64ba17d8adfb..b240091cdc9d 100644 --- a/drivers/media/platform/chips-media/coda/coda-common.c +++ b/drivers/media/platform/chips-media/coda/coda-common.c @@ -3184,8 +3184,10 @@ static int coda_probe(struct platform_device *pdev) if (irq < 0) return dev_err_probe(&pdev->dev, irq, "Failed to get irq 0 (bit)\n"); - ret = devm_request_irq(&pdev->dev, irq, coda_irq_handler, 0, - CODA_NAME "-video", dev); + ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, + coda_irq_handler, + IRQF_ONESHOT, + CODA_NAME "-video", (void *)(dev)); if (ret < 0) { dev_err(&pdev->dev, "failed to request irq: %d\n", ret); return ret; From patchwork Fri Mar 14 15:29:27 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017062 Received: from mail-lj1-f173.google.com (mail-lj1-f173.google.com [209.85.208.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0E28D2040B6; Fri, 14 Mar 2025 15:29:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966198; cv=none; b=kjMgUNZEImpt19NSaB13vGTTjpO/nu8GwCC9f+a7I9YqieKxGA0jPde9nBPq2KRIBoKa0b8FQCgxSKVGzS9LzWoTjcejXBaf7exJAXhOZ5KLVFu32gt54haxFYD96gR9LPUf80l0UKpikO0fElgEy02QFuAMCg5K33NIxTLRQqI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966198; c=relaxed/simple; bh=8Zs+PBPoC3kb51uPMTZx9kF+EHe8w/CWDSAq9WtTXUc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=BlcbPG6FBnRvwgz9Y8kIgoGFKJ1gaDAbtkQSH5kP2kib51rvMY/p8KF/YE+wyPNNXnZ+RlCe6gQ9BtfsKht1WugdoJWVvtN4s9t4CR8zfZzzMfcwYlEnzHhyhJkb7OLas392jJdaCXXoKM8K0LfGOC3iDDHCVAiyC+d+6XFDifU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=eXvhkw4S; arc=none smtp.client-ip=209.85.208.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="eXvhkw4S" Received: by mail-lj1-f173.google.com with SMTP id 38308e7fff4ca-30bd11bfec6so22166221fa.0; Fri, 14 Mar 2025 08:29:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966195; x=1742570995; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gZs3N8nD9IyHy2mlq2aBpd6e9l7WhiS0ugLxFyieQjY=; b=eXvhkw4SgeNDvAmyEmMmCvEx00b36zPgt9kvQDqOHwFX3J3fGmLqqGz+FrsfvU1ynb 3hfMNUX48TOUx+XPP9sqxLMtRc2u9QKNv/A1CxmebNFQbEb30U0F6K+BjJMQ1h6B8iO+ amGx/BQzmhQbWGBEobZvkqC3nAxozJVejnPV9HiyN18+ezXYexGhOqS4Le4HHLH2STLq z429LJf34p7XSmCXCfVA281nHNghbmI/LM25n+eP29jSudnJeR/QBXReCXxdJhFqjz6C Uu4lNVwB/8KEqOgDxcuv8BKUGx96BlzSqHf13nq34EHnbpEiR4eiNHQsxNetTEOggFoC KJ4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966195; x=1742570995; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gZs3N8nD9IyHy2mlq2aBpd6e9l7WhiS0ugLxFyieQjY=; b=Yvm83LeXrItBah1ISIlwk/RIoeWImAKDn86Xy8IT153THVKYxZnJ8bjvv7N1bCjJbm Rog+R0ORXS0CX4QCJ8dx8U91r5Bh4ZzpzM4PR2FnG9BFf2yUx7bYIes3NLgHdIO6x2Ta 1UEIwvN6CaNNA6BRazSvZ7bS2n+vDPuS+XD60RZkfQ6KiQQSVyghQQ+WsI8ykl9dHmgV dQw8A3gVfL7DjXhdgQsJd3G12w7l//EQi6nisJEoGIFNds4KFZaSklUMbAbDHI3aMOfY njonvVvSIfiwYMM0rLX8g+K5ummckp2eLJImZk3ijkM0OMLco4psB4RcNoWbCDdXWOFr DlFQ== X-Forwarded-Encrypted: i=1; AJvYcCXJc4mHrQxwMCSO6zJblICYJy00mPZVi5sV9Oeu4jctbu6+2U1u/h52tEqNAxOkC9lNMT4ftN51WSGRV98=@vger.kernel.org X-Gm-Message-State: AOJu0YyTCPYrbvVoRef2PdS1mnQ1cVs19toXxNYj8vjXhr0rM/QPpbJe rc5DrdwO7F52XyatQuowU4WPzXLxcJkWqGB3gqKbdyFmjKljCarUnzioy+olkz4= X-Gm-Gg: ASbGnctUMLLpf9yTL/bKOD0ENFGjTGkAvHDHurQeE97LYf0NioZQZFJJGG/HrO2oDXX e2cKJVmAL/ryzobJdLqVHFHEJs9tB3P6Qnhptx1Kx/DE8JRjruOTcSGaZsoeYPXwYAXu8N8s9PT 0RYBffArcak2Qt/nSCjjWSr4SSRax3qwy8JAjS35nVv5cYOlxVtZX+LiJn4QH06Kku9PjTMHtrM 9/B2dEhMASHU08l8yRbe0LeTHDjVqFu+WUF5uvtg/X2LTYGycElRXpaGLjFzX4xrVtZhHUa0IM1 TEr3UbQC1BEiXaWB7DJpuGcxZEy7mIpNu2BqgeHZ3Sbh6x133gBCv6A3kOROblrZO5dE X-Google-Smtp-Source: AGHT+IE0B79UjQTJCfosyZDkT+YEYMdzxmpO/fO9UDyb4+Y8A0mio3D+ERyuty9yNBHepX0NeVrfZw== X-Received: by 2002:a05:651c:19ab:b0:30a:448a:467 with SMTP id 38308e7fff4ca-30c4a877e56mr10558261fa.21.1741966194631; Fri, 14 Mar 2025 08:29:54 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.29.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:29:54 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 06/18] media: coda: Add reset device before getting interrupt Date: Fri, 14 Mar 2025 18:29:27 +0300 Message-Id: <20250314152939.2759573-7-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Vladimir Yakovlev Get access to the reset and reset the Coda HW before getting interrupt because sometimes after hot boot(reboot) irq can remain from previous session. Co-developed-by: Sergey Khimich Signed-off-by: Sergey Khimich Signed-off-by: Vladimir Yakovlev --- .../platform/chips-media/coda/coda-common.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/drivers/media/platform/chips-media/coda/coda-common.c b/drivers/media/platform/chips-media/coda/coda-common.c index b240091cdc9d..33c7e8398f31 100644 --- a/drivers/media/platform/chips-media/coda/coda-common.c +++ b/drivers/media/platform/chips-media/coda/coda-common.c @@ -3177,6 +3177,15 @@ static int coda_probe(struct platform_device *pdev) if (IS_ERR(dev->regs_base)) return PTR_ERR(dev->regs_base); + dev->rstc = devm_reset_control_array_get_optional_exclusive(&pdev->dev); + if (IS_ERR(dev->rstc)) { + ret = PTR_ERR(dev->rstc); + dev_err(&pdev->dev, "failed get reset control: %d\n", ret); + return ret; + } + + reset_control_reset(dev->rstc); + /* IRQ */ irq = platform_get_irq_byname(pdev, "bit"); if (irq < 0) @@ -3209,13 +3218,6 @@ static int coda_probe(struct platform_device *pdev) } } - dev->rstc = devm_reset_control_array_get_optional_exclusive(&pdev->dev); - if (IS_ERR(dev->rstc)) { - ret = PTR_ERR(dev->rstc); - dev_err(&pdev->dev, "failed get reset control: %d\n", ret); - return ret; - } - /* Get IRAM pool from device tree */ pool = of_gen_pool_get(np, "iram", 0); if (!pool) { From patchwork Fri Mar 14 15:29:28 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017063 Received: from mail-lj1-f174.google.com (mail-lj1-f174.google.com [209.85.208.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B27C32045A0; Fri, 14 Mar 2025 15:29:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966200; cv=none; b=NNDpJ5FXpGVql7LYCbuTseBTZSgfRyZ305lsStiiNIxMXFT4QV44KvbOyBrpHNvhqRQZuNKlpXy818yICdvEXePqG72IOEP6ZSKUkg+9uBVsOrBzBTNYcu4OZeEALIBpvA1SL1d8XsEU1QJIf0L3yo99QLsk9H0CFMcFs9mm3wI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966200; c=relaxed/simple; bh=F85xUi/UAHMny6c6TSIiGL9bA21s135Gdddyr3EpVHA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=e464+P2cmYeFv8QJXzINT4ELDu9bnbFuNqWSyT7WMVrrKB72yenNLbQfhf8gxDoQydwV5In5K6Ic2epCuPlZ9Uh0sfo4DaP0CIzZcT8eQC8/OCdgh9mm+KLfhlehDDa3UddJxLuI3FNYzH1ov9b0YxrftFYaIzn/pF3QvTKu+VI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Hr9p+hu+; arc=none smtp.client-ip=209.85.208.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Hr9p+hu+" Received: by mail-lj1-f174.google.com with SMTP id 38308e7fff4ca-307bc125e2eso24927761fa.3; Fri, 14 Mar 2025 08:29:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966196; x=1742570996; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=AIOyg9U7oN/4rti1p3xjWta08jOexNwOZk/0TKQp7eQ=; b=Hr9p+hu+bEiJt41pO1+zMU34eop4wdA8skQYIm4XIlEd+7iOEXNjD57QTCgWr/BMWl gCL69lXZInm47KRzHDRrAm+Z6e1MV8+ii9LcIGAUe4W1/NFMRmK7cYlrib6dSggOqS9Q 3sExMSK1qYqaAvrv5ZzFDrAYwI9dq3X/16HfXtqBjc84TiWaOUkk+5ePNQLlam96IWib AOWhqBsGggR1jJgqF6vrmG5R/xPpsREgErXURZ/+X2sZTR+ePGzn/NzzfmSbJlqpbZo1 OIWUKPwsvfVfAslaTCw5tkgPW4sDCYp25PVy4eOFEA3W3aocaEq46SIwHrJENnQW/pV+ 852A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966196; x=1742570996; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=AIOyg9U7oN/4rti1p3xjWta08jOexNwOZk/0TKQp7eQ=; b=f7Gi29bS/Vq9tqBDbxJraTwDjTbdxIioDiqX2k4mskZ05JosPZDI5jwAT1KkT0P8E+ WFNphsN+d3xafcm0FwiFXR4upHJp8VMf9Mewbb6yspYdEzGfFV2bKK+AM7wcsh19fj38 L5lad5pJTM1odgz3V3jlp2LWYH0oThAESqvTiU3hSgOsVuS7smKJT4wPYcACzoldW+Zg jhPTV8d/eE71KsUOVOlgUlzvCu7Dn1Ulz/cZ1gSmWut9Gsd3bnU9bk8vutnZIZnDqri9 ab3D2jl1PjGg0VhAFsPYz1BO70yA2Ahh+MDPtf46Y2SAn3a/EZ5zPUZ+TeC0uyfa2gDM 4qWg== X-Forwarded-Encrypted: i=1; AJvYcCVFdMCPHWx1HuJWTMQkNoTEUTcMBe2/qr+3sVuOmkWVZSEcAK3rqycdPIuspmQmBeuLeDFS4y3GwBxjUMA=@vger.kernel.org X-Gm-Message-State: AOJu0YzvaZ00PLfIoffu9f1oAgxSHpxwC3A0g2deY/rviH8MhoBRB767 8e3QMGiA7Y3xDGohzkW1rbK+9ef5tNy3Tkg0nuTLFDv4biPKRJCcXzhy3bSERoU= X-Gm-Gg: ASbGncsHObd6nQyi1tps3nrWqxQwNQQvKp6EcvISErUyxccNYZRELQch4kAxhbnLHDa kZCQOrH7cPl2ns5dHoa5zF8p1AMSmvMh2NvSabGFOGQYoKV078BGRzywnx7G4MAUivSynZwfA7J YfBTp1YTkvHCQC5P0gl7fwrGmAo9B5+8KXYVV+WvZAtPaxIepjPrPcNPCR66xEqbX8X/2cRNi/H fUFZGswV6qYLE+Ipt6CmmT4tjG27n5eb89Rd+YbXHfgZuedzFw8xckSoaAXOKtgO400AvAXA0Zp axkpyClt57R80oeyRLbe+h2gYjhDr984BVCqpO+REvZLj2zjB190/CPywXju4fOiybt8gi4wEYG ATSc= X-Google-Smtp-Source: AGHT+IGI7akv8kxmPGyPe1epF+PCgNrUQ7LPeG2tv+/tXFRjBU3B63HCGyKWeADVlTHzDItEFj+/rg== X-Received: by 2002:a05:651c:210a:b0:30b:bf6f:66a3 with SMTP id 38308e7fff4ca-30c4a875ec3mr12115761fa.17.1741966195869; Fri, 14 Mar 2025 08:29:55 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.29.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:29:55 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 07/18] media: coda: Add fake IRQ check Date: Fri, 14 Mar 2025 18:29:28 +0300 Message-Id: <20250314152939.2759573-8-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Sergey Khimich Sometimes we receive fake interrupts. It's better to check status register and trace fake irq if occurred. Signed-off-by: Sergey Khimich --- .../media/platform/chips-media/coda/coda-bit.c | 16 +++++++++++++++- drivers/media/platform/chips-media/coda/trace.h | 16 ++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/chips-media/coda/coda-bit.c b/drivers/media/platform/chips-media/coda/coda-bit.c index 84ded154adfe..3e3bb3d64ec9 100644 --- a/drivers/media/platform/chips-media/coda/coda-bit.c +++ b/drivers/media/platform/chips-media/coda/coda-bit.c @@ -2635,9 +2635,23 @@ irqreturn_t coda_irq_handler(int irq, void *data) { struct coda_dev *dev = data; struct coda_ctx *ctx; + u32 status; /* read status register to attend the IRQ */ - coda_read(dev, CODA_REG_BIT_INT_STATUS); + status = coda_read(dev, CODA_REG_BIT_INT_STATUS); + if (!status) { + /* + * Sometimes we received wrong interrupts + * That's why we check status + * and if one of it is zero - wait next interrupts + * You need check your HW configuration + */ + dev_warn_ratelimited(dev->dev, "Fake irq status=0x%X\n", + status); + trace_coda_wrong_irq(dev); + return IRQ_HANDLED; + } + coda_write(dev, 0, CODA_REG_BIT_INT_REASON); coda_write(dev, CODA_REG_BIT_INT_CLEAR_SET, CODA_REG_BIT_INT_CLEAR); diff --git a/drivers/media/platform/chips-media/coda/trace.h b/drivers/media/platform/chips-media/coda/trace.h index abc6a01a74e9..15a96bab10ad 100644 --- a/drivers/media/platform/chips-media/coda/trace.h +++ b/drivers/media/platform/chips-media/coda/trace.h @@ -10,6 +10,22 @@ #include "coda.h" +TRACE_EVENT(coda_wrong_irq, + TP_PROTO(struct coda_dev *dev), + + TP_ARGS(dev), + + TP_STRUCT__entry( + __field(struct coda_dev *, dev) + ), + + TP_fast_assign( + __entry->dev = dev; + ), + + TP_printk(" dev = 0x%p", __entry->dev) +); + TRACE_EVENT(coda_bit_run, TP_PROTO(struct coda_ctx *ctx, int cmd), From patchwork Fri Mar 14 15:29:29 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017064 Received: from mail-lj1-f175.google.com (mail-lj1-f175.google.com [209.85.208.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B3B3220468C; Fri, 14 Mar 2025 15:29:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966201; cv=none; b=nfP/TtsQud06gllgPXU+sbtGcf4N84DA5cPZNlTikkXf4rsv1/E74lGwfqy8pRx07ODcJbju7VS3648XrSli7ReYtoFZ8CUjpLv6dhhVufhQ2KBv85RSVU2UrZ6iPh0bL/MkPAgPQlw+rpxUfJqYcGVh9iO/6Q9cdIrGW0VNPWo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966201; c=relaxed/simple; bh=MfFb4TSsTHgExw/bNlC74LQEEiUK9q6S52JUN2e1ORk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=d9hqzQPWXF3XusPIH0y5c+Nzg6kRQUbDwdcB48W6Uh7hEFy55RwmLWaZWEtlwBklYKp1hnwDht/OwBo/lHPdBGTCv+c46K4/8M79sV6t9NucrRcEQupw40jOthp/K1BsoZ65XWVMXj9xd28L19mImoUQAMgpxWsYaunc3HDPIFc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=j/aY8znW; arc=none smtp.client-ip=209.85.208.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="j/aY8znW" Received: by mail-lj1-f175.google.com with SMTP id 38308e7fff4ca-30bee1cb370so23674111fa.1; Fri, 14 Mar 2025 08:29:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966197; x=1742570997; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Z3qPgF58XqoAN9wHQNtUoZdYc3+FfRSVf/6v5XtHat8=; b=j/aY8znWRRPzNR2YyaYejqryWrfZeDZrv2EZoFg6IgIEVMw2vJLWd3vrcHXqpDA/pt hU3wCbq4YuC6yejO0nBS9SiTPqrNYABL5ExYFG876TMu4Nh4HkcCNXyemBrzE3cjMyNX SPv4N1OUpIyG83Dhy0t4QRLgQc/e61IjthinWfXUXWJtebfh/sZciN8UEA2NTrF2G0/A eguLG2Z5bbqJVlKC34eb7HV38H3YV7k67AzvzNnLMKlkUh2oe3eWQ0tbsSe3+Y7MehQt djMgqY8uRR8CW7M2WWZv92AtiS06qDA2KjBFASDZGn7RLDJid+rKUQZvbOJSR1es+Nay 1E9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966197; x=1742570997; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Z3qPgF58XqoAN9wHQNtUoZdYc3+FfRSVf/6v5XtHat8=; b=n5YwjRcawIoS+dcXFXvzH+K6Od9IFKVDe3LsJ/UvLEAtbxvxHaSr/5ri11AMvPG1Um af5q2Jh85KSxiWCIkBmeGzZDeFjKdBMKS14tTBzIiMmuuNwF/S34aLk8iFeMcELCNoc6 Hj9Usu0j68D1pHsqpSulMoAxK7LnFzLnFFYQmxW1ilC6SHhcGnZT/eu705pU2GhFgQwg 433O80DwBGEmbTVEGYsx1PFQUpGHh/L04iUA1vVafnMtyiAB+jViHVV9TSDjN+BPcq2r IUrSKncggn3qkVYdLFIMksOOmmfaRQGa3QQSCax2Wzki/rPBGVAMBBsBwTEqy7dKUPy6 n7JQ== X-Forwarded-Encrypted: i=1; AJvYcCXlJCsnYl7yG6pNzrnRtB6Qt3WNboH2/fwYCPPfnsROS3FpmSoP+V7CaIr0vtxB9TBqp+GCfr8pKR+vKrs=@vger.kernel.org X-Gm-Message-State: AOJu0YycyBQuqiDgd8wfPnmrfpItMCLoWclSzPGvXW/BaflgkGtMHaf0 uxIJLN5JJ8h6I5UE8uvyjcCaMInuXE2Xkn8Fs/w5c0J7+GI7lo9c5Xjtrq3lodk= X-Gm-Gg: ASbGncuYxEC4pZxrEbGlO8thncN3tYzidtjonwstvmx3V5bSjgRp2aKsWnLu5/M/P3I Nhsl1PkwgxMZBCUcuKqeXIR6ERy5gEYQ+C8r7ILcxEP3R1il9s6Cl2l22NN9A3NH+EwQ8NONMtc W94EXUn95VHrEs5CKNFGFCW62k1zsYGFueWobNgyJIbFYegKCLZsBWwY99UrQhOa7rGg00pf0S4 qKuo7bM2l72iATpJyfkdgB+zjnhIoQA/ZyEAgea5z4SHi4Qmzx7GZnUZ0yS3DaUrJ3wLI/kmfWU VKo/N1BoluXq+UgyXTb5HvQcRjEnziqiXW74azQQwOA/e2LYRCyFgTZgIdOK/fMf4MDM X-Google-Smtp-Source: AGHT+IHgTYth9pH/kXh/erBIKy+KvKZ0VtBGgdOmgV7ecUxcICS+rSa4TpOtROBXtf1rdXnvvB96mg== X-Received: by 2002:a05:651c:542:b0:30c:2e22:c893 with SMTP id 38308e7fff4ca-30c4a8d8c4emr11728251fa.23.1741966197228; Fri, 14 Mar 2025 08:29:57 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.29.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:29:56 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 08/18] media: coda: Add log to finish_encode if buffer is too small Date: Fri, 14 Mar 2025 18:29:29 +0300 Message-Id: <20250314152939.2759573-9-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Vladimir Yakovlev CODA_RET_ENC_PIC_FLAG flag means that bitstream buffer size is not enough to save one frame data when buffer reset mode is used. If this flag is set, currently encoded bitstream is corrupted. Co-developed-by: Sergey Khimich Signed-off-by: Sergey Khimich Signed-off-by: Vladimir Yakovlev --- drivers/media/platform/chips-media/coda/coda-bit.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/chips-media/coda/coda-bit.c b/drivers/media/platform/chips-media/coda/coda-bit.c index 3e3bb3d64ec9..515eb8be4b86 100644 --- a/drivers/media/platform/chips-media/coda/coda-bit.c +++ b/drivers/media/platform/chips-media/coda/coda-bit.c @@ -1641,6 +1641,7 @@ static void coda_finish_encode(struct coda_ctx *ctx) struct vb2_v4l2_buffer *src_buf, *dst_buf; struct coda_dev *dev = ctx->dev; u32 wr_ptr, start_ptr; + int val; if (ctx->aborting) return; @@ -1674,7 +1675,12 @@ static void coda_finish_encode(struct coda_ctx *ctx) coda_dbg(1, ctx, "frame size = %u\n", wr_ptr - start_ptr); coda_read(dev, CODA_RET_ENC_PIC_SLICE_NUM); - coda_read(dev, CODA_RET_ENC_PIC_FLAG); + val = coda_read(dev, CODA_RET_ENC_PIC_FLAG); + if (val > 0) { + v4l2_err(&dev->v4l2_dev, + "Encode fail. Encode buffer is too small\n"); + // TODO what to do next? + } dst_buf->flags &= ~(V4L2_BUF_FLAG_KEYFRAME | V4L2_BUF_FLAG_PFRAME | From patchwork Fri Mar 14 15:29:30 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017065 Received: from mail-lj1-f174.google.com (mail-lj1-f174.google.com [209.85.208.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0E177204878; Fri, 14 Mar 2025 15:30:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966203; cv=none; b=HPN7okMUxnqkHVR8cndgnbsLNDH4No7+ovpRJPl6lcjxy5gn+qXttfu7yegMt9i4uqYxmQNPcDi2xKibMOl2aHi869JHw7u8Q0WS7qvhCuowPGt+LDLu2bpyNnUeloF/gJ2gei/GLIrBZkozrCMnJLmXu05CXI1LEXNfdeFQ0eM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966203; c=relaxed/simple; bh=JPs95P7qvX/qFz5WsWKK3n3NUUKZ6s2zBvn8J8WqHVo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=PtsFJdZeBMKQbo8fGrGQSqa1jGGg4rzvBVCkvZ07L2YCzoLHq0EacJuH7xROqn7/ul1xm/zhywnckpAYp4XT6+LsbS+2W5l1N74iqTIKuybcIxdVvrbBD5s4iQwIm+cAPzJTahWUKbMSNwb78qVcm2VGYYxOLPuZNSHKu9QKtUg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=C+34aM4p; arc=none smtp.client-ip=209.85.208.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="C+34aM4p" Received: by mail-lj1-f174.google.com with SMTP id 38308e7fff4ca-30c091b54aaso20478241fa.3; Fri, 14 Mar 2025 08:30:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966200; x=1742571000; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=YKH3xVYSpPOpJIjUR/N4nEe7ND+fn1lAzizapSf4YhI=; b=C+34aM4pXfPplsV9+sYH58HVTMcNc4CkePwAb/68zm1d5ctin3Zh2PrXoGpTkfHvAf U3IoDU+jYgLxHxDgC7q7tkh1V5WRV9B1T6IrkCSYxFcXqR/Kix0HXhoGs/+eymDFNcw/ /n2ukX296YRQc7A+ENgMCDgXQaoTQaJEaPhwaSbXqlHDaKp5QiMAQwWDDe5vLHocYXRC FUC+TNDjgA3VUdPByofARNWm5J1zOOGpY+mn/WsncP72qIp7sK7nIYo+cWtFL9FIpZUC WsrkIjWOfHfgcMz70A4/iI8fwn8diurQxwW5KNAVqsaT5fn2618gXKPGH2fWG6D0ePq6 t10Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966200; x=1742571000; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YKH3xVYSpPOpJIjUR/N4nEe7ND+fn1lAzizapSf4YhI=; b=crnUVHhnh4zBSSIgr/CbRXalC1MzUS+5MS0prI1CUo+obf7EpLjt7fUrloObo3N7/v j7kXSxtSSDiTkbEhOpaML0tSkaRrDNKO8wDNVmEFIINrrOV13m9rOpMjFaEYh6LVcMpU TUjwlBL2RXYxNY628EUREyNb6CTuhmfwcUViJTa0thxtYBo/BRGJGxy3igZU9FbKLZxY 5MqxFKewp0CucAASJA4k7AfHlWf+ESGtScZ/d+BHyU4ocuXDT67+YVECOiDAOyNt77Ti uNMsSVADpv3kBv9aXMqNIswGXa8kBH1NxcUyMLPAJTnnTo0whSG6SMQFT6L/G/yKRor/ NenA== X-Forwarded-Encrypted: i=1; AJvYcCUPjTgUcK52AloC00Z3738TrascDT0V0IG2W8EY7Yogd7hCLJiVZu/A/kfA2H3TdUjXT03TCxCBTu3K6ZU=@vger.kernel.org X-Gm-Message-State: AOJu0Yxt+5T9vK9sRT+q6CrjSj78/WYgxw6X7lSSvL9LoxA3u17BLLQD fOeFF/B5y/ls3vZ4lT8i9qFsnbEXrUQ8/vU/0XBKBYL0S0D1ge1HltEj1pPMAlY= X-Gm-Gg: ASbGncu5vUXDe4KgGWcMRLn32msuIlGPcGXxJzlugTcyarDxhkySFnAPcGMvcFm3RG/ mEFgQI5LC/3jhLYRt9zfCTTb6XrreKjDMkAvZoS0Zie8hwKrtIJ6+/LkYhEDFWpHLzFTvE31trF 0ZDvniqbprGd8s3UcgPdTIiZjJWlWt6FGf/nuiCpnD6g63syenGMDzJmyxP69onpJ4MNu6OgRLW LlqsH7jd0NtCGXuWRXZf5tQuazbKGsyepuQ30sN22U8V9mUivrMHH9v9GNOh5zuiaV3M39s2osK t6vCpatkcV8uQQH9RVtYyvftFq5bMGkIJ70sEm0z3tWWZhLHZX/7Ix9AZhmTH0M7E5W4 X-Google-Smtp-Source: AGHT+IEpMlGIGU3WJ4ajdiFf6dboPCoZO9zDyRpfdZ6iR2pH1veBmqUleTEpCrOhFfmWzrP22oby6Q== X-Received: by 2002:a2e:bc1d:0:b0:30b:b987:b6a7 with SMTP id 38308e7fff4ca-30c4a64ead1mr11410261fa.0.1741966199540; Fri, 14 Mar 2025 08:29:59 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.29.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:29:58 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 09/18] media: coda: Fix max h.264 level for CODA_DX6 Date: Fri, 14 Mar 2025 18:29:30 +0300 Message-Id: <20250314152939.2759573-10-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Vladimir Yakovlev CODA_DX6 has h.264 decoder but v4l2_ctrls of level wasn't setting for this device. Co-developed-by: Sergey Khimich Signed-off-by: Sergey Khimich Signed-off-by: Vladimir Yakovlev --- drivers/media/platform/chips-media/coda/coda-common.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/chips-media/coda/coda-common.c b/drivers/media/platform/chips-media/coda/coda-common.c index 33c7e8398f31..555b73816952 100644 --- a/drivers/media/platform/chips-media/coda/coda-common.c +++ b/drivers/media/platform/chips-media/coda/coda-common.c @@ -2440,8 +2440,8 @@ static void coda_decode_ctrls(struct coda_ctx *ctx) max = V4L2_MPEG_VIDEO_H264_LEVEL_4_0; else if (ctx->dev->devtype->product == CODA_960) max = V4L2_MPEG_VIDEO_H264_LEVEL_4_1; - else - return; + else /* CODA_DX6 */ + max = V4L2_MPEG_VIDEO_H264_LEVEL_3_0; ctx->h264_level_ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_LEVEL, max, 0, max); if (ctx->h264_level_ctrl) From patchwork Fri Mar 14 15:29:31 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017066 Received: from mail-lj1-f174.google.com (mail-lj1-f174.google.com [209.85.208.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3EFF7204C1A; Fri, 14 Mar 2025 15:30:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966205; cv=none; b=JaznK8MVJyCXxxGxctFomahV0BhBhXxjmMVypdOhBLk4Ze4zrK2Py47c9u8VISEW696Ac/Ow71J6wzxYrYytD3+ixtXN3X/dekrQ+FY3QRxzYsfJe/b6NoxLS9fhb2Dd25mICpUDnfg/70FLJaOp7Lcf5jJxVFDq/PKkPSyodIw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966205; c=relaxed/simple; bh=dGiPk5gHk0jZtPoBAGfSfcUe54P8x+UUdkfV6S8GJHQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=KC0aoQ3fhe70k2Ll0o4BoVvuXQjM3DBTUSwfFxsP7vzU0DRtmm/fp0KxyLGjgHe4DrbWmPbXQ6m1lFgqMfjyvo85D1ZqqLLXivNuv6Bxg6kprurO8rpaf/S4EKRwXSl6obxDGuKaB0ChbaRDyhKA7/sDcE3/yV2cjQEDYggXbmg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=nQ7a3f3i; arc=none smtp.client-ip=209.85.208.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nQ7a3f3i" Received: by mail-lj1-f174.google.com with SMTP id 38308e7fff4ca-30bee1cb370so23675231fa.1; Fri, 14 Mar 2025 08:30:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966201; x=1742571001; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hqS4B4CwOyh2E3bKnakWiJheI/mGxkNpZiMGFD31Fmo=; b=nQ7a3f3iluVK60f/a54y7gj3gpDNNesn8+ZhERVqgFFX1sao4J9VwxjXzIowcWRLSX Vjxxw7StOTaqjIVZ3wArKbPyHN2ugIExCyrEVAUGo1gUrRqq0EJmuso3u9HKeBrYk/Cy Xr+EXxmHiKPdhMw8obgJ715Fv6nrXXBb+eH3kHXNXURv+yPoT8IKt3H2v6TJyqUYKk+W U9pg7tYbphGa62tLaSJx+lUsdBaZibNIatn5jNlpAQS44CbldCv5DVXINRRWyzBrzq2T 1H3/C7pKoQtTOVnm1NKDpjzkIY9OMkfMuOTSJ45a8zkiHdY+oGYYhQ1cOt54Z0/sIaOh 6GmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966201; x=1742571001; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hqS4B4CwOyh2E3bKnakWiJheI/mGxkNpZiMGFD31Fmo=; b=DUsdn5kNkV7asWvyZT1IBf+a8rColuMKQCIoqpuiFD0YA4Fxo9m97c3SgJC79um8qz SNZruKcfzsXXzRtU8tkqbFmc6U5u4kG3BBber6tFgawXCk5D4Yzy1gYZotvnru/r1LQr 0dzzcp6Cj4iFXv+ritxFEuO1GWAjL9p+y39RgvsB05PVNMmNVGdymnyuBdRFL2yFBIso zafMleyR3N6UcISPgIjYOmSLJqrfBJvgZBlB2MXSlMniv2KHYKPv8XreEtd5lcfgffO5 fQSJ4/pOzKL17s2k1ZdqqWuqrH48HFMpSUmojQRdjjhyssJ56/io1+ITYfuysOPPEIV8 6ybg== X-Forwarded-Encrypted: i=1; AJvYcCUAxZyXlL4v4VZgrLlVzIBAM8FuUDgxuoM5hVLjH2vbNxxedgshjwVjNOvGCbtjPW+w92HK6CdTAYLV+FI=@vger.kernel.org X-Gm-Message-State: AOJu0Yz5j6IqSLPW6ESbhKmkSP9YsrMjRb5gvcfEsuNvhkG5OBXWSh5U AirQ7mUbcY+kKYmSIbnwKYsk0v4eK2eOHqze1AYn2POQi8+tyJIVbl3jD9GBhrQ= X-Gm-Gg: ASbGncvdcnz3YC+feM0C3GVFQ8s5a/09K+RtmUVyfo4C/P6aJbn2UZEnIzHlC8UcOfU M79mff988taZcbBfSHJNZ8F0iSUUjs48Zt30ksHHI8QEcf6Mtre1gJ9rad/UMASYLXIAY130mqC jJxMFyf2jfUzAo3Woswy80Q42djTL/NoNr7PesI4UriXB3KRG1VxlL2N8AS6wWr8qbivHAMUVog ErltCMoOstLRSuNF2m1zv+C3Jqtg6JxjbN2EtDvLrBYZxdaDQ3rdCMkvhSBX4QlDVWByzqqNc77 1i/bZwbajMsBFSqfYxB7ZUVKeHCJ/z5iBu0mdhLjEZC5M8RhdXAui5AOM/kqrONw+3g7 X-Google-Smtp-Source: AGHT+IHtI6ZtSYX8gnrK5ojjc7dzjYkGzFn5hTA/QPbvLx15yRXMM8+IoboeXbttICCT4M9mxEpVOQ== X-Received: by 2002:a2e:9818:0:b0:30c:111d:d7b8 with SMTP id 38308e7fff4ca-30c4a8601ebmr9563091fa.10.1741966200700; Fri, 14 Mar 2025 08:30:00 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.29.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:30:00 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 10/18] media: coda: Remove double setting of stop flag Date: Fri, 14 Mar 2025 18:29:31 +0300 Message-Id: <20250314152939.2759573-11-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Vladimir Yakovlev Remove double setting flag 'CODA_BIT_STREAM_END_FLAG' and corresponding write to the coda's register. The flag is already set when system calls v4l2 function stop_streaming()->..- Signed-off-by: Sergey Khimich Signed-off-by: Vladimir Yakovlev --- drivers/media/platform/chips-media/coda/coda-bit.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/drivers/media/platform/chips-media/coda/coda-bit.c b/drivers/media/platform/chips-media/coda/coda-bit.c index 515eb8be4b86..05d62c7bc692 100644 --- a/drivers/media/platform/chips-media/coda/coda-bit.c +++ b/drivers/media/platform/chips-media/coda/coda-bit.c @@ -1611,13 +1611,6 @@ static int coda_prepare_encode(struct coda_ctx *ctx) coda_write(dev, pic_stream_buffer_size / 1024, CODA_CMD_ENC_PIC_BB_SIZE); - if (!ctx->streamon_out) { - /* After streamoff on the output side, set stream end flag */ - ctx->bit_stream_param |= CODA_BIT_STREAM_END_FLAG; - coda_write(dev, ctx->bit_stream_param, - CODA_REG_BIT_BIT_STREAM_PARAM); - } - if (dev->devtype->product != CODA_DX6) coda_write(dev, ctx->iram_info.axi_sram_use, CODA7_REG_BIT_AXI_SRAM_USE); From patchwork Fri Mar 14 15:29:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017067 Received: from mail-lj1-f180.google.com (mail-lj1-f180.google.com [209.85.208.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B3B43204F6C; Fri, 14 Mar 2025 15:30:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966206; cv=none; b=hQPvDE/F7RscKlV34u5Q6pe/M1Zh/HJJEqq5wbuOGinBdulH0MvhJyFc3ZBrNNL+N0VNFWBK55ICKJcbx23VgOmEUOGmt2WXFOQv0Yq+AITPXnRoc0wGaj2iGCm3pN4RopYuRyh/Aj2QDsygPImGHn5mORvy8uZkwcZxAUSSukE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966206; c=relaxed/simple; bh=iLbNHxnZFdW7NufxIvEf3x0IAc/VSokrS+nHxqQFBe4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=eK/YMIyVRiRnenqOFDvRGG85lguaipTNT9duUHqUH25qvz372HKUO42kt7SPS490eE/6uP8m4+ARLGd3W88+E82z6tyhcO47rRP7NuhRa8qBx2Cay/DbkVvNJHMbpAEaDD+eFc2cg8WTzcqK8fLHBFZGOn/8yPcdZDrH4cqXfuU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=RIjKAPhb; arc=none smtp.client-ip=209.85.208.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="RIjKAPhb" Received: by mail-lj1-f180.google.com with SMTP id 38308e7fff4ca-30761be8fcfso24667471fa.0; Fri, 14 Mar 2025 08:30:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966202; x=1742571002; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=WAe7Mq9PAoLxsqmL3ma6QJkF2PJXg5Q8DTTiDZQANqc=; b=RIjKAPhbCG2ypJsb/F1O2HrRYZnEwx88QyeFT8zgH4jLSyK//Iz0PHL7m3cHgMoucp BGI2TmkUcLF4XSfehRb7UIGtzOZgYXl3Uun63vxFH85Qxs/F3py/0+u5nZe9Aq6dU7Tg 4RDAY8ssrv8wM9LJFcfXUp+S9HqcpVEztN7Y2tuYiBm8ebBpfW0ECJM0oulbFqJ6FFT+ W06cabTCNdkmDAlV6XZqrL8o51U5QDPZ56F9sROdb1eg2LlcInTiNW53EVbQ1VBv1Vsk rEa/WnDg2PMiUOXtW9BNbMOHIsaG+2JbV5VKYyEGQ4s8+mzZYPkFnrunVzwIZSeMYlNG l/Tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966202; x=1742571002; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WAe7Mq9PAoLxsqmL3ma6QJkF2PJXg5Q8DTTiDZQANqc=; b=ZzfKBYZkbrSW8gOekoR+GMF5eK+XYf7YXCAmdfq8MADfki9oq4ywnQhjfkVJfA9BLq AcvfJOOvZHHMXDtwCsb0AgBog0ng/Z9E22SNC5RK67hsZhz2wOEsU1w1ry4prDIFWdPw EYhsjdyqNSHXsN4XFjlv3OfNN7R6LZeBc4yBnquDsqhkaBmUc4XDDwstqToGEdB/U0hS iU68AyMIcYLU++fmEMD9e+FkRYEogt35Q+yUpkrQU9TTECvMwIKyIxBCjf+xv5HQAT2c c+vsahR3FFp343X9z0s7RZxUcX9n/uwuxGl/c02qgNmAlSSmLWd6C0+Z+IjhsbP4HiEl iO6w== X-Forwarded-Encrypted: i=1; AJvYcCV09OGMuzKyawlFNqdDHSlrnawFSMcLZPWL3eONI5dofi5Mj6w9ryk5NEvw3on7pqxz3m4YnO4bmHTIge0=@vger.kernel.org X-Gm-Message-State: AOJu0Yz/zXRR3gpcg9tav49HxnRNvc9/msucBCZIlU0mCzhfJGZhTqs9 kaJ67ano1xVHj+l4TUnQAQKq121+VJUC3V1R5D5qNu98zo1oFCwDlQw6wL9wsGE= X-Gm-Gg: ASbGncuHILsTH82XxavYSnkqfYS20+gWau232t7opjoM2Lh49KFFiBuWThM6hvXwNLb gEfjwwJRBqB6Lb7HF9j+2FOL7ufa/ENFH4E32B9BQ0cL7/Brjo5huhRCmPHl1HirG2d+J1DckPx qQVTIag4kn2LwaDdzl64NqBRP8Pxc+W9LFGPZVf87bkVvZPCZSuoGynewp1G/C7rRgg2sp+Uelo wK1xrwCN9crl7QYCT513XCWx/odpjctaAt1EWdOUDm+fJFQlkw1Arpjdcqdn7kF4loCMFYjN+JM fWP0GXqpZOG9r1236tkTDj3P27wlHWJ+AsCDHqSfu+UlFiRjIvoX2qg1gGAVMcFc+X43 X-Google-Smtp-Source: AGHT+IHgMHyFZg83gyxkscaVVuzrEiCvVQb0cElVQ6Sj6WCyMl+WLpiWNxs1mRZkFu8V2UVDyshoTA== X-Received: by 2002:a2e:860f:0:b0:30b:e3d9:37e5 with SMTP id 38308e7fff4ca-30c4a861b95mr9020241fa.13.1741966201847; Fri, 14 Mar 2025 08:30:01 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.30.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:30:01 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 11/18] media: coda: Print size of encoded buff in other place Date: Fri, 14 Mar 2025 18:29:32 +0300 Message-Id: <20250314152939.2759573-12-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Vladimir Yakovlev Print debug log containing size of encoded buff along with other info of encoded buffer. This improves readability of the log. Co-developed-by: Sergey Khimich Signed-off-by: Sergey Khimich Signed-off-by: Vladimir Yakovlev --- drivers/media/platform/chips-media/coda/coda-bit.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/chips-media/coda/coda-bit.c b/drivers/media/platform/chips-media/coda/coda-bit.c index 05d62c7bc692..c323bc96b998 100644 --- a/drivers/media/platform/chips-media/coda/coda-bit.c +++ b/drivers/media/platform/chips-media/coda/coda-bit.c @@ -1665,7 +1665,6 @@ static void coda_finish_encode(struct coda_ctx *ctx) vb2_set_plane_payload(&dst_buf->vb2_buf, 0, wr_ptr - start_ptr); } - coda_dbg(1, ctx, "frame size = %u\n", wr_ptr - start_ptr); coda_read(dev, CODA_RET_ENC_PIC_SLICE_NUM); val = coda_read(dev, CODA_RET_ENC_PIC_FLAG); @@ -1696,9 +1695,9 @@ static void coda_finish_encode(struct coda_ctx *ctx) if (ctx->gopcounter < 0) ctx->gopcounter = ctx->params.gop_size - 1; - coda_dbg(1, ctx, "job finished: encoded %c frame (%d)%s\n", + coda_dbg(1, ctx, "job finished: encoded %c frame (%d)%s size=%d\n", coda_frame_type_char(dst_buf->flags), dst_buf->sequence, - (dst_buf->flags & V4L2_BUF_FLAG_LAST) ? " (last)" : ""); + (dst_buf->flags & V4L2_BUF_FLAG_LAST) ? " (last)" : "", wr_ptr - start_ptr); } static void coda_seq_end_work(struct work_struct *work) From patchwork Fri Mar 14 15:29:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017068 Received: from mail-lj1-f173.google.com (mail-lj1-f173.google.com [209.85.208.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A54B02054E1; Fri, 14 Mar 2025 15:30:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966208; cv=none; b=ZY1vOaYCVv/IS5TnDM6fjhKIYE2zwauip7MFFz2Xc6G8W/mZxEalv2mSu5wzFbZjhpvdOvGzBum8cEoVZLGPTAreQQdhp51RHmpYr/eikq4FK9giz58Nswz4hjI3gtcGRuTGrk7hA8A1R4hq5W26zoubpccTFKxLDPUu+I5t6dk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966208; c=relaxed/simple; bh=toPpkxJl8FMvhmsy8l9WkMOpYEAuM7iUbjuHqY+BG9o=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=LiGlGp+tK47P7PvfUVgWZta9fVPqUlDUgzQ/ckF5hzpOWWMBfHzWAEGtYYsZFe2vZ2kIGJkWPT9IayvIuhNvkVPv7fuGQQrzgUlcXr5oGksukjnw3wBTPpYiM6fSpS03RhJ7owWuxhIIs8i5TFDc+oIG5utZRyQPUxiOu6M8Gco= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=BhOJ7pP9; arc=none smtp.client-ip=209.85.208.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="BhOJ7pP9" Received: by mail-lj1-f173.google.com with SMTP id 38308e7fff4ca-307bc125e2eso24929441fa.3; Fri, 14 Mar 2025 08:30:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966204; x=1742571004; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=CRJu9F6oeIlyyMlHc75x+Nx5qVxYfbRFzUDlgViYj1Q=; b=BhOJ7pP95sQD45Afz9umNvwawktaUa8U7ScfsRXkJKJ3reNBuKgGQsRgvGQBdxdw9L Dj21YJKly5H2bv5X1EZE1JH9zXlOCkWT8ilDDP7TgMbe8cEhziWItBcFT4eOYkWnkYXp HXUnNTdrEuw/41YUabh9v7mu/G++CEA8Ga+ilntlL7e9Vq9663PfmckeI/AqC6gaYIfx cZCkRZxEr9LrGeIZ+LYi7YgzbMq6dUjn86UGhhoAX+/OVse9Z5/KSmd2n2NmIoYbQjGQ 3z31ndFFNzYTx+a1RvwqF31SRmyCfPAjjtQ0EL+HjeJ/75/lp+maPmBxck1Lnm1Ve6ev 30lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966204; x=1742571004; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CRJu9F6oeIlyyMlHc75x+Nx5qVxYfbRFzUDlgViYj1Q=; b=amx+hQ+J6J6elRrbLbGQKO9MWtbvOJPnTyUi+K+34deWeWIoXHg+Ie4XGlWRAFgLNF wIUftIjU3vv7B9reRcU8j1106LFlYV2mjHmOB0msWVpK1Ix7oO8AdKlQZEOnHTCkv/x2 x1X8Q8QzGTHPF9jy+zK9K/dZhfdfWkubW1wuNhWoe60UShY2nzhfj/MALEncj9dZzW+L wLeNHUOR1iHVYH0mK3LuNeTyt6Lxlkl5i0ImM7x3m/gQY7y3rQK5H1MCHI2GuEkUQ7Py XWQfK6rvvrPH2UfO1KKl8sjNpz4XQPWUEH0g2+CMGF3+fv2kZ3LkiPwGkA1yHKXCfsdH T+xQ== X-Forwarded-Encrypted: i=1; AJvYcCVyK9S74FcvHvRVTXpFaJcBYRsWucy60fmDJ6bKRLZKtSInJ2lccMwmzFa7Tf7lukaaDlbtKVUMNADU+2k=@vger.kernel.org X-Gm-Message-State: AOJu0YyJWD8J45HOQh/n0EFyzm/oUfe8VAYS4as4uXPA1Zb2WoEouJCU gcQpT04t4i2En0wwq8DGZHSBSF4Dvy/GO079XgqS8WIsSIOUbMqR0KBukW0jPHw= X-Gm-Gg: ASbGncvTITcEqC2ZRBnmjCC4+zgDrjdCEqCkdYIMpN7RZ2FdCnYhepTleicXT3yxy9k KbzgVwPFmrsnH7lXo8qJ3ZiIzvHaKsVIRswDgwOQzMdTdzsZEkOrbHfJrJvYYLcVKF4M0NQkK6w slItDX+2P8JrOIphZI+jt4sAA2Bt0gAxPFJXHki5/2R9lQCCrHyapdvJnkURnKZpwLds6L0j1PV QfI0SQNl5wGos3YR5RyOLzWvdQLZM7Ks8pcwWQm4BPkBajz2zofXYCulCQQT0MOZ1Aiis5XYB3L /rDKkg1Emuw/evEg0zWA+z5aGwInx+a3GJxeNuGjs42GkE80UYuPebsxNIDmrFB+70SWA/iv+jV //H8= X-Google-Smtp-Source: AGHT+IGccm1JiT1tGFptYJa2FTw3siYRxF4CtXV9gO0wXSh4cN1iSwYY4QvDk/gzlZEiPUAuBusPoA== X-Received: by 2002:a05:651c:b20:b0:30c:7fe:9c70 with SMTP id 38308e7fff4ca-30c4a863e2dmr10944911fa.15.1741966204087; Fri, 14 Mar 2025 08:30:04 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.30.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:30:03 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 12/18] media: coda: Fix loglevel for seq mismatch print Date: Fri, 14 Mar 2025 18:29:33 +0300 Message-Id: <20250314152939.2759573-13-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Sergey Khimich During decoding process some files (conceivably with max_dec_frame_buffering == 16) a situation may arise, in which after getting 'DEC_PIC_RUN' interrupt we have "-1" in 'CODA_RET_DEC_PIC_CUR_IDX' register. In such case it means that current picture has been decoded but there is no frame buffer to store the decoded picture (this is a kind of error situation). The documentation says that in such situation we have to rerun decoding the frame. On the other hand in the driver such situation leads to sequence number discrepancy whish in general is not good. Also for every discrepancy we get error message. But in real user scenarios (playing video) there is no any errors caused by this sequence number discrepancy. Althogh there is no real errors, lots of "error" messages, in turn, lead to decreasing fps and dropping frames in user space utils, e.g. in Gstreamer. The following Gstreamer log is obtained _without_ this patch: last-message = rendered: 17, dropped: 0, current: 33.76, average: 33.76 last-message = rendered: 33, dropped: 0, current: 30.01, average: 31.83 last-message = rendered: 49, dropped: 0, current: 30.01, average: 31.21 last-message = rendered: 65, dropped: 0, current: 30.00, average: 30.90 last-message = rendered: 81, dropped: 0, current: 30.00, average: 30.72 last-message = rendered: 97, dropped: 0, current: 30.00, average: 30.60 last-message = rendered: 112, dropped: 0, current: 30.00, average: 30.52 last-message = rendered: 127, dropped: 0, current: 30.00, average: 30.46 last-message = rendered: 142, dropped: 0, current: 30.00, average: 30.41 last-message = rendered: 157, dropped: 0, current: 30.00, average: 30.37 last-message = rendered: 173, dropped: 0, current: 30.00, average: 30.33 last-message = rendered: 189, dropped: 0, current: 30.00, average: 30.30 last-message = rendered: 205, dropped: 0, current: 30.00, average: 30.28 last-message = rendered: 220, dropped: 0, current: 30.00, average: 30.26 last-message = rendered: 236, dropped: 0, current: 30.00, average: 30.24 last-message = rendered: 251, dropped: 0, current: 24.84, average: 29.86 last-message = rendered: 264, dropped: 1, fps: 24.55, drop rate: 1.89 last-message = rendered: 279, dropped: 1, current: 30.00, average: 29.57 The next log is obtained _with_ this patch: last-message = rendered: 17, dropped: 0, current: 33.76, average: 33.76 last-message = rendered: 33, dropped: 0, current: 30.03, average: 31.84 last-message = rendered: 49, dropped: 0, current: 30.01, average: 31.22 last-message = rendered: 65, dropped: 0, current: 30.00, average: 30.91 last-message = rendered: 80, dropped: 0, current: 30.00, average: 30.73 last-message = rendered: 96, dropped: 0, current: 30.00, average: 30.61 last-message = rendered: 112, dropped: 0, current: 30.00, average: 30.52 last-message = rendered: 128, dropped: 0, current: 30.00, average: 30.46 last-message = rendered: 144, dropped: 0, current: 30.00, average: 30.40 last-message = rendered: 160, dropped: 0, current: 30.00, average: 30.36 last-message = rendered: 175, dropped: 0, current: 30.00, average: 30.33 last-message = rendered: 191, dropped: 0, current: 30.00, average: 30.30 last-message = rendered: 207, dropped: 0, current: 30.00, average: 30.28 last-message = rendered: 223, dropped: 0, current: 30.00, average: 30.26 last-message = rendered: 239, dropped: 0, current: 30.01, average: 30.24 last-message = rendered: 254, dropped: 0, current: 30.00, average: 30.23 last-message = rendered: 269, dropped: 0, current: 30.00, average: 30.22 last-message = rendered: 285, dropped: 0, current: 30.00, average: 30.20 So it is better to lower the message priority. Signed-off-by: Sergey Khimich --- drivers/media/platform/chips-media/coda/coda-bit.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/chips-media/coda/coda-bit.c b/drivers/media/platform/chips-media/coda/coda-bit.c index c323bc96b998..50350d657f91 100644 --- a/drivers/media/platform/chips-media/coda/coda-bit.c +++ b/drivers/media/platform/chips-media/coda/coda-bit.c @@ -2466,10 +2466,10 @@ static void coda_finish_decode(struct coda_ctx *ctx) * from doing different things based on the format. */ if ((sequence & 0xffff) != (meta->sequence & 0xffff)) { - v4l2_err(&dev->v4l2_dev, - "sequence number mismatch (%d(%d) != %d)\n", - sequence, ctx->sequence_offset, - meta->sequence); + v4l2_warn(&dev->v4l2_dev, + "sequence number mismatch (%d(%d) != %d)\n", + sequence, ctx->sequence_offset, + meta->sequence); } decoded_frame->meta = *meta; kfree(meta); From patchwork Fri Mar 14 15:29:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017069 Received: from mail-lj1-f174.google.com (mail-lj1-f174.google.com [209.85.208.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 01384205509; Fri, 14 Mar 2025 15:30:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966210; cv=none; b=mySMOa+MdYPdXxXJD/neP6/p0lLtBfRl+qSFzxDZSyb3nyzJWU2WaX7RH6oQwFWrz/CPsXVucnRFkFvNT35pE1hRJfa6vmNwcd3B+76OMMG9xwH7sW8w/g/Fnn9NhHBeIcssNezPXKtILCY8HdXdjCuqEuVKLArf24hLPM/o4A8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966210; c=relaxed/simple; bh=IYw8bQmY0zhIJDGNiGACVKHm0UdYuajycgMpjcWVlR8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ELJt5Mgcdyn+KNtH1v4T11UyjZZNJgRZsJ3sTPxTetNitXHshvjqgiiepqcQJHcQgGppFMK0fqfnikEXWGiXn0gPEBOxuSLDp4f6pjlXHv380RHxUguAI15imyyY41UkD4XXmElt5xFAWiWsvobl3ebUoxB6wgSDYCh1+hRK08s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ZMoqIfE+; arc=none smtp.client-ip=209.85.208.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ZMoqIfE+" Received: by mail-lj1-f174.google.com with SMTP id 38308e7fff4ca-30761be8fa8so24261741fa.2; Fri, 14 Mar 2025 08:30:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966206; x=1742571006; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=DqgNTYoxC0fFFzF4qZiqTPN5SVQGUZ+pgTF4nitLk24=; b=ZMoqIfE+1KpCr45/qvoyR7EZePoXcHnaJGlG/cst9P/JDOVZxSvRWVibYsaGhUTWsx 4z89+c5JIAveikCK+lcQwCFk8MqhRSvGyKloJMNBRGCq0wk6RuOetnYATHvZ07uKfKId mlIsENhSKAoBxPtBFKi/jwAIe+/OUfaz8YDSnRj0iOqFPnvYCq2e3uKxu1F604oHNw+A llxZMr0FBR2MzQQzoGUFcPeYVni9TWJGIU2mFu9L8wSPE1Uk1WUJIB4NLP3Op9BX33Jc yxtPdQJZXmTrl50U6YwM3133vACIHmT9oV3AcTRvJxldrLGXDKZXMxSRfx9FZof72vMr pWew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966206; x=1742571006; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=DqgNTYoxC0fFFzF4qZiqTPN5SVQGUZ+pgTF4nitLk24=; b=H8s688weozZNhnFXGD+JO2YtymZUWM94nzrcZ1IBPT/3/DVT/uTr1iKRNLhaDR0R43 H7Pwc/9duzbdZNuFX9mnmloen2t+O6+FLDH4NwrSx/20wDnggpedT0wK3wLeEAFsSJaM kd1/hbuePCCkmTmn0DUyQIkT7dzpP81AfB+nHWLB16mD6VYG34F+41Xub7qg5SQ8WQOf XhZ6h8A6Vo1+6fYhdf3I/Vn7Jy/4JAiaxk4BgHjWhOi6pyF06qXC/azjLkrZ2TudYD75 RPOn/28eXjJG1PuyjiSzjcclwt8QyX2Qnbk5KXZBoTy7ziTPzhTsqYOhBicUt88iqlke 07DA== X-Forwarded-Encrypted: i=1; AJvYcCUK+9mltXqsIGh2P8z7e7cu9NbE904WRhroq4BkEZR1+DVNQ1zm9p2veL/sxDwOYZ7o3EoYXfNlpvLUm3o=@vger.kernel.org X-Gm-Message-State: AOJu0YwK7Er2GOK1KX5ACBCg7iakCCNU81AhYXoi8d50skV/MnzE4krE 4H9n6jAbucAmOqut8Sf04eAynqm9gHlM6iabJ74gUe+8di3i5pvpqTMzajQa+Rw= X-Gm-Gg: ASbGncsIUapqhy1kCsKjaXFmPPNVpWSuNNNdfeiZ+AV1Ey27ToVoBJt2Xi2ZCIL4LZb aDfYyuPNQ8BKog0bihOh/rtGgfvBI8kf0H3cbrZZgWpqrJM5j1AvXTE8LHAiriSVtOT+cgNuwLJ z6Lt94aNZ1DL9uiPWMTDtdco8o3kzoz1JVESPt1QBjIG+FWPFOh1OJCBGZBRyp0NdVZ4+30oCyQ 6anaHpY7rKFWQJWPr3DtiIruwQI4YlPXpq2fVydFoSuHTNrojPUuLrVcrCnWP9p5TgD0B5njCWK K0DKgPQBj4moIOvogQI0XmyxxgbLON1kU80UmLxoJ1bhaofmBPPD6hB+0P46XEG19s4h X-Google-Smtp-Source: AGHT+IFkDKyABkKs01BMWlaO0zX3qY3/V3ioYwTNprK0FuL0fAgXrS0KkPQvm/KLdUlZXideJA8RlA== X-Received: by 2002:a05:651c:b22:b0:30b:fe19:b07a with SMTP id 38308e7fff4ca-30c4a8cea76mr10216971fa.25.1741966206282; Fri, 14 Mar 2025 08:30:06 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.30.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:30:05 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 13/18] media: coda: Fix support for all mpeg4 levels Date: Fri, 14 Mar 2025 18:29:34 +0300 Message-Id: <20250314152939.2759573-14-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Vladimir Yakovlev Mpeg-4 level also depends on img resolution. Therefore, driver must support all levels in the range of supported resolutions. Coda's hw can calculate level automatically. Co-developed-by: Sergey Khimich Signed-off-by: Sergey Khimich Signed-off-by: Vladimir Yakovlev --- drivers/media/platform/chips-media/coda/coda-common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/platform/chips-media/coda/coda-common.c b/drivers/media/platform/chips-media/coda/coda-common.c index 555b73816952..29b01ade8829 100644 --- a/drivers/media/platform/chips-media/coda/coda-common.c +++ b/drivers/media/platform/chips-media/coda/coda-common.c @@ -2383,7 +2383,7 @@ static void coda_encode_ctrls(struct coda_ctx *ctx) v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL, V4L2_MPEG_VIDEO_MPEG4_LEVEL_5, - ~(1 << V4L2_MPEG_VIDEO_MPEG4_LEVEL_5), + 0, V4L2_MPEG_VIDEO_MPEG4_LEVEL_5); } v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, From patchwork Fri Mar 14 15:29:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017070 Received: from mail-lj1-f172.google.com (mail-lj1-f172.google.com [209.85.208.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 51CA2205AB3; Fri, 14 Mar 2025 15:30:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966213; cv=none; b=oI4S7D1vLPwNzpxVbhp4G5BLtVxSeqAOY2aybJJ+y+ylg/UwTwOG0kEq/a4tJo4j5ZZLMzZoSfSwnaS9/BVXhZAhlvG0HEMjvrr0x4cwsUu0k5oufH8u8INnhm/FMVJ46+YC0VIIHu74upO2tBxsWXfqMlSjKXBL95p5CIoHNr4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966213; c=relaxed/simple; bh=+Ee55UAKk5zrbEA8ErCkGjdHBczjoD5DmzPAU62qWQM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=YMKf7lp0lcmSlvadDsqgcsumB47uzU7MG3ev2nY7PEEDOYeSZbQBMMBT0pIbEdAeotn/2J3EX//tZaqXsU4+nFc66uMPxysrLTn+MwkEex/NyJfaGg/WzJG0zTOrfUQsNVuo5R1/UUtMSsrcouGstLFTpZv2vSzVkbCDeUyqCrw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Y+6VWQBe; arc=none smtp.client-ip=209.85.208.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Y+6VWQBe" Received: by mail-lj1-f172.google.com with SMTP id 38308e7fff4ca-307325f2436so21483591fa.0; Fri, 14 Mar 2025 08:30:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966209; x=1742571009; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=4ce7ZcVdU8F9ZhytWxVKTsWW21I89t3dHhwkZN9/rME=; b=Y+6VWQBeIbNLbdtoc/cnQbRFWIgaTQ6/qnC1D9eCYskJJcee7u7N/Ye+jen//YMn3J ryU9vDSjbnO5ZukWNtD3gw6jzeZeT//S0xWok/hxw/caVWv+RDJSClvdvJTCLd7isJd5 fUfBPj0aizxLA1VZy8h24yEotTltE6DzBHEEFECqVB2K3NQmnPdfxB1YIPhP+opOQuzV RXgUQDMVwmvMcKoGqk0EGoDwVMhau0xGlqtYbW7S14RMqLp1xnFUBp6w9OUqnxS2QjSv /9JpbNT5x6mIu0X3aH3cxjQIDgrmDcHa5IOPbYk40rnoku2U0EYWvtGggvLm0Jp9MO4W GCPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966209; x=1742571009; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4ce7ZcVdU8F9ZhytWxVKTsWW21I89t3dHhwkZN9/rME=; b=onbCnRpagcA6CrXIVnvGrUvMjbVJIgKDMTLRJn8CAs8Yax1nXVa/mnoZPeOTid8hS2 7GbJ5dnTJNnYdTUyO+TUI7VfLS/aZIkpaInGS+oVIxncxd3j0+dxuCo+wt9dieDW8Coo oaiFWsjtrCJmaGJx0PWDsPuCkb8hw+7vW7VsNBghlG76zhOsarR4xYVSZMbAkatjaK65 K//DurBPGpmxSWN4wrTntXFphaaiWnqoPyPcywrIMAaegpq4eMEDh5Tt9eJiWgQ1f5Ed JLHFODB4pqfR8TSE9O/BEla9mLypIqoEZqFPjXynGtnKaD9/TCd8W53poxeaDWFqkn1p Qefw== X-Forwarded-Encrypted: i=1; AJvYcCVtNl+iEqlVuBIO3MH9bh445yT56JtyXJWeaQL7F6swv27Ry65gcBKPvdcMLusqSRTr7enuYCwFqZ0Tr6g=@vger.kernel.org X-Gm-Message-State: AOJu0Yw7eO4yy7HiZ6RFJuuliV+WWS6lH9ibERsMZtH0BFowJ58V74Ad /WTjMMyvLEM/53h18RatHwRfYX9lxNrXf3Ort6dbMtenQyDKLof58ILXneJZ4nI= X-Gm-Gg: ASbGncsXlzanx9zKbH30oI9LgqePs0BR6XY1Qj7tR1a1abMoUmxX/0XrgXPZ05dYv6P UtvkA8YSAgSPMjOw7ytyrHIafRCiqzUh9LJn7ZCZj1Wsu47x1vkUKwZDgJGll7G8n+S7ud77Bzl Hlqm32lM2Ywu6FCrODGMTzWMvRa4LNjCz/ljERV0U7MFV3KuPOE1ZdoQi4z0aclrM6fVi2HvFfc 0YicjZwYMFi6ddTbRDPTr9uR+pMPMbF6LFKKDixqsQMEV6n1CrHqdOUbH+BOWTk1HSrboggGQZa k0ApQi3rfuwNB0mXt9Bdn5CjqjRDMywytkS8WzBhj0rCmSnTkafh9FKIB/dSHSYW9YwTF3FOJ5X p0MU= X-Google-Smtp-Source: AGHT+IG2WaIUdbtUdDQlPOnd8dCw6Gy5P/QgElJCsSHT3I1U1RAJxRriknPgx2mG3XMb86XbYMCEpg== X-Received: by 2002:a05:651c:198c:b0:30c:1441:9e84 with SMTP id 38308e7fff4ca-30c4a860201mr11330141fa.13.1741966208483; Fri, 14 Mar 2025 08:30:08 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.30.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:30:06 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 14/18] media: coda: Fix handling wrong format in coda_try_fmt Date: Fri, 14 Mar 2025 18:29:35 +0300 Message-Id: <20250314152939.2759573-15-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Vladimir Yakovlev No need to print BUG() report when received wrong format in coda_try_fmt. It's enough to print log and return an error. Co-developed-by: Sergey Khimich Signed-off-by: Sergey Khimich Signed-off-by: Vladimir Yakovlev --- drivers/media/platform/chips-media/coda/coda-common.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/chips-media/coda/coda-common.c b/drivers/media/platform/chips-media/coda/coda-common.c index 29b01ade8829..9b443ddabeab 100644 --- a/drivers/media/platform/chips-media/coda/coda-common.c +++ b/drivers/media/platform/chips-media/coda/coda-common.c @@ -644,7 +644,9 @@ static int coda_try_fmt(struct coda_ctx *ctx, const struct coda_codec *codec, f->fmt.pix.height); break; default: - BUG(); + v4l2_warn(&dev->v4l2_dev, "Warning: wrong format=0x%04X", + f->fmt.pix.pixelformat); + return -EINVAL; } return 0; From patchwork Fri Mar 14 15:29:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017071 Received: from mail-lj1-f173.google.com (mail-lj1-f173.google.com [209.85.208.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 17DC7205AC7; Fri, 14 Mar 2025 15:30:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966214; cv=none; b=MWenkWnTJ302B+hxVeKj/aVyXY0l3ViFPapNMt0UMILQ4a2anqKR6sCIw71srK+dgQy1YH6AHDpV5pXzazv3EpaNLnDtf2iH95r4IhsIgeCAAtLyjrrZ88jY6y9HZkKvQt0iSgfONvuQDJ0UGQzT03yA4CyICVLyz82a9E2kQTE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966214; c=relaxed/simple; bh=HBais1f2vz4kMRf/cldht6E+mcty9TdtSZxdPWoqcfs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=cyHPxFfPrPY1Sx8A1JNN2u/GfU0f8AMFrykTa8RYZLrwLoo/1eigUEPtji41zaMc5HhCxxDSOseoLw/NqzmLjz6OTo/UyxZ3RDDEWbgInzKYmSUyY2c6/o3JJbw2ADbBrl1JLSpjco1jysI9ZofP1kL2KlLmVc3kdT/wMzRCIm8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=I2BDEDFU; arc=none smtp.client-ip=209.85.208.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="I2BDEDFU" Received: by mail-lj1-f173.google.com with SMTP id 38308e7fff4ca-30762598511so23188721fa.0; Fri, 14 Mar 2025 08:30:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966211; x=1742571011; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=uwwz1u8FJDnJhqE7LdfxAKBgdcZ4z4VuuYDXy4Qw3lk=; b=I2BDEDFUroHrDr9hl0hUaMh1yORGflu1T38vEaJXt0S3KUvVkH+ra+auXtd0Km2Egf ouj+X4+daPfyZ14LJb1aG56cJPWqoplk3NwmHym9xu+cmYNAGKGAUWK25Du4WBt1DhFz 26xeWr4VHq8aANO/RetvU635ENhbAZ/UGPrhZv3WKur8UQDliCNzQMGmoEvJFyaWPe5n tE3z6CrmSCTgJZvpy0zvJyNjrlBheHkk6miCWxB/05fed4VPqPXgDP6F5usPvO0oJ6bB AeCJXUJHJMXNI5meEba1bLjs+hfD+GnoUGxmbYiUsSOhkB8Kbkz/X0vmixUBypNjfWF+ Tb2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966211; x=1742571011; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uwwz1u8FJDnJhqE7LdfxAKBgdcZ4z4VuuYDXy4Qw3lk=; b=VFSgMm8WbqI+0ZttZEeoNmigs4UYKHHGxzxNjl26rUDSKXOjBCeHATBV2cARdHx9R2 +NtIP8dbqcXZPunyFguhnjHXzXw1Q6id5y56ypW5XuxoGQ1WIsyK3UkGmsQ6gDetS3Tv tzfFf5eA3qo/WBmfhXCrI/1QFEAlHkjI2MF4stFfvXzG2xUoK/BGfOFGeGAepUd9vbks Y+wQTaBFoTaQe9aIWvE6mcQZDT54rQp9dNCg5p321hLLBTuh5zUoNVs8QH/W61sVCeYW jc1ev03eYkc5VLkqxUO88IE3oMkZXPAdF2TYEM7nWn2IE7BsTgbodmM1YlSbSev1PSOg JIaA== X-Forwarded-Encrypted: i=1; AJvYcCVHMDDixpE2fCa0SvkKI5zsolKiwE5f1l8gEJ/rhnphrdrSzhoCrMub3mbtm/kYYh86+EMeZ7mBsIbvZZk=@vger.kernel.org X-Gm-Message-State: AOJu0YzmRRi3QumaifyQxBtReeKK0qX63RC0KekcYA/s08UQjra1hbcn jza11Kym/c2oORwMIztXSLKgycfxw+KcwqyRo1lHUNtTkrWY/a+IRiy5Ur/JwkQ= X-Gm-Gg: ASbGncu3XJMLZeoc7l8VSPMZfZaQz7L35i+BEpHBrGJzUZm9AMehNb7xZVhaNGjwVrB WSrjaAVySRD6bHhVSX0aK2bN35fppEeZhg36iS1HJr4YC9BKURig20Jkfh4vVmZ8FL+GrHTRpdH /sWso6BncG7wSsxq1sYtacbSt+xkvvBaP81cus9bG71iUU6+fZlFLJoIoAak0Esu+XAAMxYJAsk GVoLP2M4Edya2sgKXhTdm6KcRMniV4WIA5aCTWE4wL67nXFm4WbB3pwTa0EIJHo4B2uyPvkAInQ ym1NIRBtdE6BCHOkp2Jo9Dq5K/f29mb846YaRouPupXxpmg2FzS5f2KpQLZgNsYzTZWz X-Google-Smtp-Source: AGHT+IEhwe/I7cON1IM9+xq7BbkWIky5UqcKei97voBNkrPmSwIuzbNjKLzE12QptgVORsDRWur/vA== X-Received: by 2002:a2e:a781:0:b0:30b:a92c:7dd9 with SMTP id 38308e7fff4ca-30c4a875fd8mr9921781fa.17.1741966210634; Fri, 14 Mar 2025 08:30:10 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.30.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:30:10 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 15/18] media: coda: Use v4l2_ctrl to set gamma for h264enc Date: Fri, 14 Mar 2025 18:29:36 +0300 Message-Id: <20250314152939.2759573-16-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Vladimir Yakovlev We can use v4l2_ctrl (V4L2_CID_GAMMA) to set gamma for configuration h.264 encoder. Co-developed-by: Sergey Khimich Signed-off-by: Sergey Khimich Signed-off-by: Vladimir Yakovlev --- .../platform/chips-media/coda/coda-bit.c | 28 ++++++------------- .../platform/chips-media/coda/coda-common.c | 7 +++++ .../media/platform/chips-media/coda/coda.h | 4 +++ 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/drivers/media/platform/chips-media/coda/coda-bit.c b/drivers/media/platform/chips-media/coda/coda-bit.c index 50350d657f91..782b299e9b12 100644 --- a/drivers/media/platform/chips-media/coda/coda-bit.c +++ b/drivers/media/platform/chips-media/coda/coda-bit.c @@ -35,9 +35,6 @@ #define CODA7_PS_BUF_SIZE 0x28000 #define CODA9_PS_SAVE_SIZE (512 * 1024) -#define CODA_DEFAULT_GAMMA 4096 -#define CODA9_DEFAULT_GAMMA 24576 /* 0.75 * 32768 */ - static void coda_free_bitstream_buffer(struct coda_ctx *ctx); static inline int coda_is_initialized(struct coda_dev *dev) @@ -1065,7 +1062,7 @@ static int coda_start_encoding(struct coda_ctx *ctx) struct coda_q_data *q_data_src, *q_data_dst; u32 bitstream_buf, bitstream_size; struct vb2_v4l2_buffer *buf; - int gamma, ret, value; + int ret, value; u32 dst_fourcc; int num_fb; u32 stride; @@ -1251,13 +1248,14 @@ static int coda_start_encoding(struct coda_ctx *ctx) value = 0; - if (dev->devtype->product == CODA_960) - gamma = CODA9_DEFAULT_GAMMA; - else - gamma = CODA_DEFAULT_GAMMA; - if (gamma > 0) { - coda_write(dev, (gamma & CODA_GAMMA_MASK) << CODA_GAMMA_OFFSET, - CODA_CMD_ENC_SEQ_RC_GAMMA); + if (ctx->params.gamma > 0) { + if (dev->devtype->product == CODA_960) + value |= 1 << CODA9_OPTION_GAMMA_OFFSET; + else if (dev->devtype->product == CODA_DX6) + value |= 1 << CODADX6_OPTION_GAMMA_OFFSET; + else + value |= 1 << CODA7_OPTION_GAMMA_OFFSET; + coda_write(dev, ctx->params.gamma, CODA_CMD_ENC_SEQ_RC_GAMMA); } if (ctx->params.h264_min_qp || ctx->params.h264_max_qp) { @@ -1269,15 +1267,7 @@ static int coda_start_encoding(struct coda_ctx *ctx) if (dev->devtype->product == CODA_960) { if (ctx->params.h264_max_qp) value |= 1 << CODA9_OPTION_RCQPMAX_OFFSET; - if (CODA_DEFAULT_GAMMA > 0) - value |= 1 << CODA9_OPTION_GAMMA_OFFSET; } else { - if (CODA_DEFAULT_GAMMA > 0) { - if (dev->devtype->product == CODA_DX6) - value |= 1 << CODADX6_OPTION_GAMMA_OFFSET; - else - value |= 1 << CODA7_OPTION_GAMMA_OFFSET; - } if (ctx->params.h264_min_qp) value |= 1 << CODA7_OPTION_RCQPMIN_OFFSET; if (ctx->params.h264_max_qp) diff --git a/drivers/media/platform/chips-media/coda/coda-common.c b/drivers/media/platform/chips-media/coda/coda-common.c index 9b443ddabeab..9ca459793050 100644 --- a/drivers/media/platform/chips-media/coda/coda-common.c +++ b/drivers/media/platform/chips-media/coda/coda-common.c @@ -2205,6 +2205,9 @@ static int coda_s_ctrl(struct v4l2_ctrl *ctrl) ctx->params.bitrate = ctrl->val / 1000; ctx->params.bitrate_changed = true; break; + case V4L2_CID_GAMMA: + ctx->params.gamma = ctrl->val; + break; case V4L2_CID_MPEG_VIDEO_GOP_SIZE: ctx->params.gop_size = ctrl->val; break; @@ -2311,9 +2314,13 @@ static const struct v4l2_ctrl_ops coda_ctrl_ops = { static void coda_encode_ctrls(struct coda_ctx *ctx) { int max_gop_size = (ctx->dev->devtype->product == CODA_DX6) ? 60 : 99; + u32 def_gamma = (ctx->dev->devtype->product == CODA_960) ? + CODA9_DEFAULT_GAMMA : CODA_DEFAULT_GAMMA; v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_BITRATE, 0, 32767000, 1000, 0); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_GAMMA, 0, 0x7FFFFFFF, 1, def_gamma); v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_GOP_SIZE, 0, max_gop_size, 1, 16); v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, diff --git a/drivers/media/platform/chips-media/coda/coda.h b/drivers/media/platform/chips-media/coda/coda.h index ddfd0a32c653..007f56b24c61 100644 --- a/drivers/media/platform/chips-media/coda/coda.h +++ b/drivers/media/platform/chips-media/coda/coda.h @@ -29,6 +29,9 @@ #define CODA_MAX_FRAMEBUFFERS 19 #define FMO_SLICE_SAVE_BUF_SIZE (32) +#define CODA_DEFAULT_GAMMA 4096 +#define CODA9_DEFAULT_GAMMA 24576 /* 0.75 * 32768 */ + /* * This control allows applications to read the per-stream * (i.e. per-context) Macroblocks Error Count. This value @@ -150,6 +153,7 @@ struct coda_params { u32 vbv_size; u32 slice_max_bits; u32 slice_max_mb; + u32 gamma; bool force_ipicture; bool gop_size_changed; bool bitrate_changed; From patchwork Fri Mar 14 15:29:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017072 Received: from mail-lj1-f176.google.com (mail-lj1-f176.google.com [209.85.208.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0191E205E06; Fri, 14 Mar 2025 15:30:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966215; cv=none; b=Zj9zEVxZ6f7ae4kWwabBR4uBZ2c71xLuw6MygxRmXHEEcPb04KT2niAxko4QLO+XMaTOujr2qd0I1oqKMQVlOdo1uiUEHigXaCEtVuKlnBr7YQXS34Cu5OmnC3lmApQoEXe69Lj0SMZal5PZ1uYPzT+rs7s3eqsrSLi8/Pc3ab0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966215; c=relaxed/simple; bh=zT/zsO6S/pvuNe7KF+I9+O2nxoGs4TW9kijvWr6XPRg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=WEdj7z4YqgdSNb2uloiBzOFMNihBJ0/3qUrLiwv831QkWtK7VpAFffwqndRh4CPnKOXBDHsRS2dLyf0etiZMrFtjXmLVDvkakjXUMmMyK2oZMB/6CEpusm9ymgCdcIIWJY5hLzkxomcJdX+oXu7VgDla09a3DMkeVgEvtF6zLIg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Hc4OwL9i; arc=none smtp.client-ip=209.85.208.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Hc4OwL9i" Received: by mail-lj1-f176.google.com with SMTP id 38308e7fff4ca-30613802a04so24230881fa.2; Fri, 14 Mar 2025 08:30:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966212; x=1742571012; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=aus8alVfcXgy3DqFGnPFZeSY7UCOW1F3b7m6nzhuG6w=; b=Hc4OwL9i3zF0/xt/N0SZqn3IOFDMYzvBblnLw1Q6k6cWDuk5V0jFK7ydi1u3zjgAT/ Y3DJnTFwMzF3q3ru7vrESCAiIK8QDk0md3th/NPtZstVMmEZyvP8/ZU4ClXQ6YMhKFzD Ny9CkLPGJ4cEzlNI6ZsHjnOVimIAqXLZqTg86cYVqnC42HoNrL+mosKmSQApdkIHbqRu EUew/dzGJmvin4SIVIdcCu/wKoZutftwpEza57J7nxL8UJpGgeavkfLjQdnYalfpJihf 7MzBOZ7coJTVeERNHDw+DR604sfvmUpmLu9MM9B5EBwX4EGgZ5zI04U0xsAyOqn2eGVR dFww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966212; x=1742571012; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=aus8alVfcXgy3DqFGnPFZeSY7UCOW1F3b7m6nzhuG6w=; b=D231zGmRf5X3/V9jbERQyQmHbZ7N4JCoRGPY9hEZtpKTWkYOR/s02PaDZ9+OVIj/hO OkMfc/FvJfus8+mFnWFMtUc8nxMSOGIWVCZnxVlodctg/Iiyyaz9C+4b7YaQYhJ/j4u7 kDGeY1PSi40fTnIzlB55qMdukTsu21R1TbnbxGDe+Ryu6RC03rE12A/hdtet1mSqj5D+ de5v2ncoh4dmQXUrppVhMVZ4T8bDCC/4X2d91UA+l8gwBhbva6OedBgSA2pkL7/ImzAH 2ibIf0OMPph65XAo3CkdqgFyKCaDReqhr8U9TvbKxaM78u7a4EOk/aBJs/j/i/yLUxGq NYaw== X-Forwarded-Encrypted: i=1; AJvYcCVhYaGCdfyU/ABRvvdHXKUqfgIYF7XBPNQ/UCBkwKFp1ce1J++o4KtAO6fTx1dkgKrZwdHY2JBfpG2+EPQ=@vger.kernel.org X-Gm-Message-State: AOJu0YyxxkSND83K0ICRaShTe7AgQMB5PouplYtFNnUixl9qYNT6QEU1 52LMM/IunTT9yRA+KghcdK8qPOihkCXsFHJLmn7b4xJCQQhJo8o+tB0S8gg2+EI= X-Gm-Gg: ASbGncv4abFAcq16Yq+tOD2IRJdS7tmK1dLXWomCM27TyFjBQp85hdBe14h6RL/6vvg Jswd3QGw4SN/YiUe4ARG/cs4cm0ha/U7xi8DMLsJHQqpAf+VSz8nOzQWe4nBQ1sP2gbJHynO5LO QYiBMfOKhUe1jw/0dOugdf027XwhHmbnNqTK1gwUXjDbaC9+jPIb5/5mBX9wp3p8luVftAlSXfK hz3ne0mp5MZik5Q9qFFju4iyOmJ/OTNojmPjvKPyPglmbFtXqYAUbrEDllPKnQavEwvVOnEOGgP Z7l8mJ0ldU7/JZZLJHsqabHinLCeX/FSCJm6lGeua3w+Po96BchP1JrKn1lPCroLjZM+ X-Google-Smtp-Source: AGHT+IHDGA1iRf5cQswq6YP0aTuAv3KX4SeuG85fRkdGYV/K/6Lw+81yDy76NoPUfIAlDDyp9hZarA== X-Received: by 2002:a2e:be8c:0:b0:30b:b9e4:13c5 with SMTP id 38308e7fff4ca-30c4a754748mr11155011fa.4.1741966211563; Fri, 14 Mar 2025 08:30:11 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.30.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:30:11 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 16/18] media: coda: Update default velues of QP for mpeg4 I/P Date: Fri, 14 Mar 2025 18:29:37 +0300 Message-Id: <20250314152939.2759573-17-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Vladimir Yakovlev Use average values of QP range for mpeg4 I/P frames. In such case we get smaller size of output buffer and average quality of image. Co-developed-by: Sergey Khimich Signed-off-by: Sergey Khimich Signed-off-by: Vladimir Yakovlev --- drivers/media/platform/chips-media/coda/coda-common.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/chips-media/coda/coda-common.c b/drivers/media/platform/chips-media/coda/coda-common.c index 9ca459793050..3782219c8a2b 100644 --- a/drivers/media/platform/chips-media/coda/coda-common.c +++ b/drivers/media/platform/chips-media/coda/coda-common.c @@ -2379,9 +2379,9 @@ static void coda_encode_ctrls(struct coda_ctx *ctx) V4L2_MPEG_VIDEO_H264_LEVEL_4_0); } v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, - V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP, 1, 31, 1, 2); + V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP, 1, 31, 1, 15); v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, - V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP, 1, 31, 1, 2); + V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP, 1, 31, 1, 15); v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE, V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE, 0x0, From patchwork Fri Mar 14 15:29:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017073 Received: from mail-lj1-f170.google.com (mail-lj1-f170.google.com [209.85.208.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 43C112063C9; Fri, 14 Mar 2025 15:30:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966218; cv=none; b=uDQNhApkBWOHrwtppi/5atE3Raj3tXsx9tfISa8nqYjMApw+0AEaEtBvAwXzJZ77aZmGimqxnZWLFhNWQguqVO+DT3kQ2wAZYg7CqAUE+2MTeuA2hDVdT4DnWIXaUeClQmzLXMAyTaLRZeemjmbxiEzbxXPan9xYWezKvxdH3nI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966218; c=relaxed/simple; bh=5N2u8G6nb3cU5p7Tgm2pr0o+VlSCPNUWeJNIpV8hJ1Q=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ExZAJNcsJQ4fAIBszwdKEGf3M+AV6Ioc3ZipyXsL8hOywrDx+/ewYfba8Jim73RA9HoijQA6nH/OIDNZ86izdOWdvl/vOQIKxbjLePYOtS4dl8vxhtBY3W36wbCbVXIb1f/Cy/P1D0cOnSaH+/CtHNkI2pwEkREli1tRRzVTMao= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=KCKUOGSB; arc=none smtp.client-ip=209.85.208.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KCKUOGSB" Received: by mail-lj1-f170.google.com with SMTP id 38308e7fff4ca-30bae572157so22728581fa.3; Fri, 14 Mar 2025 08:30:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966213; x=1742571013; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=bNpMyAE2KOtdYpDUOPGQQ6FLlEA9+rQvOWYfiYfH2DM=; b=KCKUOGSB9c8IBiXWr4yDW8VIam7LQBUkfLOjvKJU02KgHCDV63yue2NxR/9DrUSSjz fWVlsU6Ao3Kb1EZ4kXJfUyFiAIbAyFebzu2TTdMQi7TZHstI5z1E+dLW33KJ48CD5eLM CTx2294z/3VlpwuXH0OMmCZOyBgS+de1X7yN9poKsGL/LrDMzqMC0GtpbpiWtFo8fCqL LhH4KNL8uQQsWhUe4xki3TX49sG5WJ+Vq16gXjUHGRYsSidiBuBp/glAuUZ5K4ksCQsK m///6XJRzDqLgyMLW4u8nOzXL8IfKL+t3/b3OSa6IPC1bmTKMmcgu4waR28WtugoAwi7 GCjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966213; x=1742571013; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bNpMyAE2KOtdYpDUOPGQQ6FLlEA9+rQvOWYfiYfH2DM=; b=ktMTtRe4FyjW7Iw5QqfvZtqtq9klOid9tk1qsUquhJ9giwrcS8agd3wsNRnm6MhWmK x+hgUxNYGtB2XroN4gaZfLB/18zHvPZdrXx9zxoXXlAV5+O2hAvmmsVEqBr2TcIKFFad gG3PnBLVHbSEUbHv60gQDatJqgPBfJp43rQ5UCyKH+cu15UqPo0kRO8mf8ROktdBIOi9 fidk3paUhQok0zlyaXQVn5zSdW4XVfV+UgxV9nPNy3GJTMl3M7wfmKZX/zqqLgl4Qd0V lJqe/MGnDwgKPiTgdCmT5Iw8wOps8iti8zwD2vdsvfCqx+b7mAzS4vetBJa6nUg2KLmd 2HoA== X-Forwarded-Encrypted: i=1; AJvYcCX3h0XiG64MJLML40NbXqAasQAZF+IH24P4qkKCcXhGNZCFLMteulc6LKafz5wi4O1HtoOKQeOYf9TRLWI=@vger.kernel.org X-Gm-Message-State: AOJu0YyLsM9QFgMq+m+BSMQ59Z8hJmlVBuGg54NTGacTgLA+jCcyPXTL RwKyMdjsfxt3k2Q+I5AaGJSdkj2hTWFu4XRYLXHJJko9AVzQutlFcTxJ+QY38aw= X-Gm-Gg: ASbGncuoAWl02fm+EUU4onP1KtaH77a8Hm0R3H8xoySQTC/5jaj8S9mTDQ4+Rvx6iX+ 4ckcVWQROaesDOYzbHfwEcC0uR4jaPOewV4RqkIAiHjHvfvkkJEQd+KnO2GC6vhmWk+3rjD88PM Lihwoiw+DsXmoGywBiBHR2vzBRk3U9AYceUZiImxdoKruibWe1WJkIrOZ9Aifv6OMPkMDFoZMp/ NW1tsN39AiQSWF/IP0OtvWhJUuL+4daM4q3dqCOxtt+fpvtg9xxmVA7KKvGpGco0YS7u78hkJlw fvuioPbbg4tMneoHePGL7KYJcbOlo8f6GFBjYI9W62iMGnnmwbIvxt+gF5MA27H8bFW4 X-Google-Smtp-Source: AGHT+IHFPlWpJwPb3KXLidiQ6UDzni1mwX2TdcWkQTVFuYE2n9zkAzmgPnikFA3MjhpzFumWLUq0Ig== X-Received: by 2002:a2e:be27:0:b0:30c:177c:9e64 with SMTP id 38308e7fff4ca-30c4a8d975fmr12410391fa.35.1741966212759; Fri, 14 Mar 2025 08:30:12 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.30.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:30:12 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 17/18] media: coda: Use preferred usleep_range than udelay Date: Fri, 14 Mar 2025 18:29:38 +0300 Message-Id: <20250314152939.2759573-18-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Vladimir Yakovlev usleep_range is preferred over udelay. see Documentation/timers/timers-howto.rst Co-developed-by: Sergey Khimich Signed-off-by: Sergey Khimich Signed-off-by: Vladimir Yakovlev --- drivers/media/platform/chips-media/coda/coda-common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/platform/chips-media/coda/coda-common.c b/drivers/media/platform/chips-media/coda/coda-common.c index 3782219c8a2b..b73b09b3baf9 100644 --- a/drivers/media/platform/chips-media/coda/coda-common.c +++ b/drivers/media/platform/chips-media/coda/coda-common.c @@ -2873,7 +2873,7 @@ static int coda_hw_init(struct coda_dev *dev) data = coda_read(dev, CODA_REG_BIT_CODE_RESET); data |= CODA_REG_RESET_ENABLE; coda_write(dev, data, CODA_REG_BIT_CODE_RESET); - udelay(10); + usleep_range(10, 20); data &= ~CODA_REG_RESET_ENABLE; coda_write(dev, data, CODA_REG_BIT_CODE_RESET); coda_write(dev, CODA_REG_RUN_ENABLE, CODA_REG_BIT_CODE_RUN); From patchwork Fri Mar 14 15:29:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Khimich X-Patchwork-Id: 14017074 Received: from mail-lj1-f171.google.com (mail-lj1-f171.google.com [209.85.208.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD3A42063DF; Fri, 14 Mar 2025 15:30:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966223; cv=none; b=geMIau31dZ0G3P16dIWknBrsMDw9THkNocf3JJOg0lgI+otjeg66bIuEYnBmL53hs10OyAgPHSqhbQAkGCyZJ/R0+Ao/tz6JllIVFk5qunjgewZupwa4LyFwbzjysVTK435Ch0IGoGBw+cqFkwEt0wfxpOEj9F8Bw6dXLLmxa0k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741966223; c=relaxed/simple; bh=r0sr/7YZuJt4Y9rovYJ5z7u6PGv6KqCVjK/ti+lW4mM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ZsAZVc/nvLSQDJfzAMqTeDq9Gff9t/XTmi3QkYtlhqWd4hiVdFxo8WTmjphPt8qsrXJ0z1RbLspW/jg59tMQpTi1Ih63OFLjEbTRtz6zhDPfBC/Yew9nKbSFSSWS9rGIR/XgxP9v0llsdivhRK9kOhaEg4YkiJrG6eEKWd2jQuQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=eAMrZt0h; arc=none smtp.client-ip=209.85.208.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="eAMrZt0h" Received: by mail-lj1-f171.google.com with SMTP id 38308e7fff4ca-30bf251025aso19082281fa.1; Fri, 14 Mar 2025 08:30:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741966215; x=1742571015; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=AR2TRuW5OEu1ldh093lsNiXcq3kCpToedKiVWBRuWm4=; b=eAMrZt0hA2uTX/ljkpsu0iL6284fpBBd1+T9kj24jFRuonCZ3rJBDAJKFeI/xOEsLp wE/UOTCApXiOUtMzqt2GkKMnXuedmG9M74INk3TT2y0M/1Rrya7uUra0bvWO34Y3SpHW XKMgwjRftDyRw+7Q44q66pjgkCfNKJdukL52aO7zqgl4qN6Icrv8sp+2Ew1FNdpm/s4M n5cVYhz79goTiLsdj5onbDITPu8QY1cdjE7sijixVvdCr1HOoTkdweq98cfvWjP94DCk P8VUx5If1e2TDwGbAD4hVYCpmcwVsUc7agsnXfqDzN8sNp0QXEgjFzKdWnyCN260nuIi /Bgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741966215; x=1742571015; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=AR2TRuW5OEu1ldh093lsNiXcq3kCpToedKiVWBRuWm4=; b=qEIOSY73GAIZMVFJ89TvKjCDVeQABdPKkjV4JKhzPC1gipfsh7XS5VxRQ5nEyk5KAk joQ58H7/njhAwycWvd1Fky7drJZAbZglVGjugUBgAsxfswpswQXX2CYlWLX8EglxzcJY rVaekWbecp0eb/ST3vGm6l/uSExPV8GtJxWcfxLHbvxmXjoOtcoZIOInGyiFxECL9vAy Pcoxai2UoVBEYdo0Op7xUloyTc/whMYTPLAm5P1T5bOiBhKhtsNZDHxjT4MwwhgInlIf 93BHmBpXJhM/2bvXh8UN9tkobHqjnOaGQWiOGD61jK30uchCIubMJyttRofIH1PjgEsU SZBg== X-Forwarded-Encrypted: i=1; AJvYcCUh0cHeacRx/jNG4SK2iWLvuKXPRkruDgWrWTAqwpAQyz8+DevFwqWkwgDdgJop1DNuEg5Vi9mWII5oc4s=@vger.kernel.org X-Gm-Message-State: AOJu0Yw8EX5FHBeYXRugTCO9/bb7iflZNMga0+FuXcAlv8/+qR9HouzZ WSFAtcc/ydGLPAO+ANjPnGnwvkFP5uqkSrtYsDcug81Ppsrqs9/tsk95KZC1EEs= X-Gm-Gg: ASbGncsNNRwtNNfFMavHd7KjiiknaPUJxlImd8JrLLYmZIJLCT75hgg6/rlx3UlmxtH CEcdJxeAn49xZnmHniIxm2qrmKOoR9Fi7mAoxvWQAdRdNLRxB60vgf4pgjNN9NTH0XL0CGWvmZa k+UBIWSkH79Ag0dj+7cac6hQPRVlETw9LH3ZJQNRXb04NQ+r1Dd2vOOdQmt5j654Cxx/KhGBnfK BS+v6+4t4kYgSJG9FJfxWo0Y0d8w7qW2GFLCX1KFs5zlbYShXKPYLE6omB/o8kIwNobLh/k3ip6 nQz9OC7QOa3EH4xGC2CK3kYpLNu/zj23T5OaaTbDWipd/SAs4SCbSkg1gvQcQtb+EZuX X-Google-Smtp-Source: AGHT+IHZabrxIKCeZnDK/3egOUwzqxtkUnxWRgwfQwAOSiw/zPLOyuEfKq6IPsOxcNf+xFP4TM35Lg== X-Received: by 2002:a05:651c:b22:b0:30c:aae:6d61 with SMTP id 38308e7fff4ca-30c4a8d8bcamr8783861fa.30.1741966214060; Fri, 14 Mar 2025 08:30:14 -0700 (PDT) Received: from skhimich.dev.yadro.com (avpn02.yadro.com. [89.207.88.245]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-30c3f0e99f6sm6253581fa.37.2025.03.14.08.30.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Mar 2025 08:30:13 -0700 (PDT) From: Sergey Khimich To: linux-media@vger.kernel.org Cc: Philipp Zabel , Mauro Carvalho Chehab , linux-kernel@vger.kernel.org, Vladimir Yakovlev , Maksim Turok Subject: [PATCH 18/18] media: coda: add support coda988 enc and dec Date: Fri, 14 Mar 2025 18:29:39 +0300 Message-Id: <20250314152939.2759573-19-serghox@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20250314152939.2759573-1-serghox@gmail.com> References: <20250314152939.2759573-1-serghox@gmail.com> Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Sergey Khimich Implemet support for Chips&Media coda988 encoder & decoder. support codecs h264enc/dec, h263enc/dec mpeg4enc/dec vp8dec support formats yuv420p(I420), yvu420p(YV12), NV12, NV21 special config for mem_ctrl special config for encoder header (sps and pps) special set profile_idc special set RC config special set QP special set slice mode special set Motion Extimation (ME) new v4l2_ctrls: update coda988's v4l2_ctrl for h264 profile update coda988's v4l2_ctrl for h264 level add coda988's v4l2_ctrl for h.264 RC mode add coda988's v4l2_ctrl for h.264 skipFrame add coda988's v4l2_ctrl for h.264 i-frame min/max qp add coda988's v4l2_ctrl for h.264 p-frame min/max qp add coda988's v4l2_ctrl for h.264 entropy mode add coda988's v4l2_ctrl for h.264 8x8transform add coda988's v4l2_ctrl for h.264 i-frame period add coda988's v4l2_ctrl for h.264 Access Unit Delimiter(AUD) add coda988's v4l2_ctrl for h.264 me x/y search range add coda988's v4l2_ctrl for h.264 intra refresh period add coda988's v4l2_ctrl for h.263 intra/inter qp add coda988's v4l2_ctrl for h.263 min/max qp add coda988's v4l2_ctrl for mpeg4 min/max qp Co-developed-by: Vladimir Yakovlev Signed-off-by: Vladimir Yakovlev Co-developed-by: Maksim Turok Signed-off-by: Maksim Turok Signed-off-by: Sergey Khimich --- .../platform/chips-media/coda/coda-bit.c | 1046 ++++++++++++++--- .../platform/chips-media/coda/coda-common.c | 382 +++++- .../platform/chips-media/coda/coda-gdi.c | 149 +++ .../platform/chips-media/coda/coda-h264.c | 10 + .../media/platform/chips-media/coda/coda.h | 37 +- .../platform/chips-media/coda/coda_regs.h | 157 +++ 6 files changed, 1615 insertions(+), 166 deletions(-) diff --git a/drivers/media/platform/chips-media/coda/coda-bit.c b/drivers/media/platform/chips-media/coda/coda-bit.c index 782b299e9b12..b580a41576aa 100644 --- a/drivers/media/platform/chips-media/coda/coda-bit.c +++ b/drivers/media/platform/chips-media/coda/coda-bit.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -35,6 +36,49 @@ #define CODA7_PS_BUF_SIZE 0x28000 #define CODA9_PS_SAVE_SIZE (512 * 1024) +/* + * For CODA988: + * In the parameter buffer, following sorts of buffer addresses + * are internally stored from their byte offset: + * 0-383: adressses of frame buffers + * 384-511: addresses of mv colocated buffers + * 512-895: bottom addresses of frambuffers (when tiled map is used) + * 896-1279: top address of WTL frame buffer (when WTL function is enabled) + * 1280: bottom address of WTL frame buffer (when WTL function is enabled) + */ +#define CODA988_MVC_BYTE_OFFSET 384 +#define CODA988_FB_BOT_BYTE_OFFSET (CODA988_MVC_BYTE_OFFSET + 128) +#define CODA988_WTL_FB_TOP_BYTE_OFFSET (CODA988_FB_BOT_BYTE_OFFSET + 384) +#define CODA988_WTL_FB_BOT_BYTE_OFFSET (CODA988_WTL_FB_TOP_BYTE_OFFSET + 384) + +/* Advanced INTRA Coding mode. */ +#define CODA988_H263_ANNEX_I_ENABLE 0 +/* Deblocking Filter mode */ +#define CODA988_H263_ANNEX_J_ENABLE 0 +/* Slice Structured mode */ +#define CODA988_H263_ANNEX_K_ENABLE 0 +/* Modified Quantization mode */ +#define CODA988_H263_ANNEX_T_ENABLE 0 + +/* MPEG-4 Data Partition */ +#define CODA988_MP4_INTRA_DC_VLC_THR 0 +/* MPEG-4 VLC table used 0-normal / 1-reversible */ +#define CODA988_MP4_REVERSIBLE_VLC_EN 0 +/* MPEG-4 Intra DC VLC Threshold [0~7] */ +#define CODA988_MP4_DATA_PARTITION_EN 0 +/* MPEG-4 Enable Header Extension Code (HEC) */ +#define CODA988_MP4_HEC_EN 1 +/* MPEG-4 Video Object layer version 1 or 2(default) */ +#define CODA988_MP4_VER_ID 2 + +/* sps[64], pps[256], backupPsBuf[8] for rollback, error concealment (each 4Kbyte) */ +#define CODA988_PS_SAVE_SIZE ((320 + 8) * 1024 * 4) + +#define CODA_988_CROP_SHIFT 16 +#define CODA_988_CROP_MASK 0xFFFF +#define CODA_COMMON_CROP_SHIFT 10 +#define CODA_COMMON_CROP_MASK 0x3FFF + static void coda_free_bitstream_buffer(struct coda_ctx *ctx); static inline int coda_is_initialized(struct coda_dev *dev) @@ -42,18 +86,21 @@ static inline int coda_is_initialized(struct coda_dev *dev) return coda_read(dev, CODA_REG_BIT_CUR_PC) != 0; } -static inline unsigned long coda_isbusy(struct coda_dev *dev) +static inline unsigned long coda_isbusy(struct coda_dev *dev, u32 reg_busy) { - return coda_read(dev, CODA_REG_BIT_BUSY); + return coda_read(dev, reg_busy); } -static int coda_wait_timeout(struct coda_dev *dev) +int coda_wait_timeout(struct coda_dev *dev, u32 reg_busy) { unsigned long timeout = jiffies + msecs_to_jiffies(1000); - while (coda_isbusy(dev)) { - if (time_after(jiffies, timeout)) + while (coda_isbusy(dev, reg_busy)) { + if (time_after(jiffies, timeout)) { + dev_err(dev->dev, "Error! Timeout waiting for reg 0x%x\n", + reg_busy); return -ETIMEDOUT; + } } return 0; } @@ -64,7 +111,8 @@ static void coda_command_async(struct coda_ctx *ctx, int cmd) if (dev->devtype->product == CODA_HX4 || dev->devtype->product == CODA_7541 || - dev->devtype->product == CODA_960) { + dev->devtype->product == CODA_960 || + dev->devtype->product == CODA_988) { /* Restore context related registers to CODA */ coda_write(dev, ctx->bit_stream_param, CODA_REG_BIT_BIT_STREAM_PARAM); @@ -75,7 +123,8 @@ static void coda_command_async(struct coda_ctx *ctx, int cmd) coda_write(dev, ctx->workbuf.paddr, CODA_REG_BIT_WORK_BUF_ADDR); } - if (dev->devtype->product == CODA_960) { + if (dev->devtype->product == CODA_960 || + dev->devtype->product == CODA_988) { coda_write(dev, 1, CODA9_GDI_WPROT_ERR_CLR); coda_write(dev, 0, CODA9_GDI_WPROT_RGN_EN); } @@ -99,12 +148,132 @@ static int coda_command_sync(struct coda_ctx *ctx, int cmd) lockdep_assert_held(&dev->coda_mutex); coda_command_async(ctx, cmd); - ret = coda_wait_timeout(dev); + ret = coda_wait_timeout(dev, CODA_REG_BIT_BUSY); trace_coda_bit_done(ctx); return ret; } +int coda988_hw_init_reset(struct coda_dev *dev) +{ + unsigned long timeout; + u32 reg, ret = 0; + + /* Waiting for completion of BWB transaction first */ + if (coda_wait_timeout(dev, CODA9_GDI_BWB_STATUS)) { + dev_err(dev->dev, "Error! Timeout waiting for completion of BWB transaction\n"); + return -ETIME; + } + + /* No more requests */ + coda_write(dev, 0x11, CODA9_GDI_BUS_CTRL); + /* Waiting for completion of bus transaction */ + timeout = jiffies + msecs_to_jiffies(100); + while (coda_read(dev, CODA9_GDI_BUS_STATUS) != 0x77) { + if (time_after(jiffies, timeout)) { + coda_write(dev, 0x0, CODA9_GDI_BUS_CTRL); + dev_err(dev->dev, "Error! Timeout waiting for completion of BUS transaction\n"); + return -ETIME; + } + cpu_relax(); + } + + /* Software Reset Trigger */ + reg = CODA9_SW_RESET_VCE_CORE | CODA9_SW_RESET_VCE_BUS | + CODA9_SW_RESET_GDI_CORE | CODA9_SW_RESET_GDI_BUS; + + dev_dbg(dev->dev, "ATTENTION! Resetting GDI: tiled map should be reconfigured\n"); + + coda_write(dev, reg, CODA9_REG_BIT_SW_RESET); + + /* Wait until reset is done */ + if (coda_wait_timeout(dev, CODA9_REG_BIT_SW_RESET_STATUS)) { + dev_err(dev->dev, "Error! Timeout waiting for completion of SW reset\n"); + ret = -ETIME; + } + + coda_write(dev, 0x0, CODA9_REG_BIT_SW_RESET); + coda_write(dev, 0x0, CODA9_GDI_BUS_CTRL); + + return ret; +} + +static int coda988_hw_runtime_reset(struct coda_ctx *ctx) +{ + struct coda_dev *dev = ctx->dev; + unsigned long timeout; + u32 reg, ret = 0; + + reg = coda_read(dev, CODA_REG_BIT_RUN_COMMAND); + if (reg == CODA_COMMAND_SEQ_INIT || reg == CODA_COMMAND_PIC_RUN) { + reg = coda_read(dev, CODA_REG_BIT_INT_REASON); + if (coda_isbusy(dev, CODA_REG_BIT_BUSY) || reg) { + /* + * Stop all of pipeline: + * subblk_man_mode[20] & cr_subblk_man_en[19:0] + */ + reg = (CODA9_MBC_SET_SUBBLK_EN_MANUAL | 0x0) & + CODA9_MBC_SET_SUBBLK_EN_MASK; + coda_write(dev, reg, CODA9_MBC_SET_SUBBLK_EN); + + /* Force to set the end of Bitstream to be decoded */ + coda_bit_stream_end_flag(ctx); + + /* + * Make the write pointer (where the buffer is being filled up) + * equal to read pointer (where VPU is reading stream data + * from the buffer) + */ + reg = coda_read(dev, CODA_REG_BIT_RD_PTR(ctx->reg_idx)); + coda_write(dev, reg, CODA_REG_BIT_WR_PTR(ctx->reg_idx)); + + ret = coda_wait_timeout(dev, CODA_REG_BIT_BUSY); + if (!ret) { + dev_err(dev->dev, "Error! Timeout waiting for interrupt while hw reset\n"); + return -ETIME; + } + } + } + + /* / Waiting for completion of BWB transaction first */ + if (coda_wait_timeout(dev, CODA9_GDI_BWB_STATUS)) { + dev_err(dev->dev, "Error! Timeout waiting for completion of BWB transaction\n"); + return -ETIME; + } + + /* No more requests */ + coda_write(dev, 0x11, CODA9_GDI_BUS_CTRL); + /* Waiting for completion of bus transaction */ + timeout = jiffies + msecs_to_jiffies(100); + while (coda_read(dev, CODA9_GDI_BUS_STATUS) != 0x77) { + if (time_after(jiffies, timeout)) { + coda_write(dev, 0x0, CODA9_GDI_BUS_CTRL); + dev_err(dev->dev, "Error! Timeout waiting for completion of BUS transaction\n"); + return -ETIME; + } + cpu_relax(); + } + + /* Software Reset Trigger */ + reg = CODA9_SW_RESET_BPU_CORE | CODA9_SW_RESET_BPU_BUS | + CODA9_SW_RESET_VCE_CORE | CODA9_SW_RESET_VCE_BUS; + + dev_dbg(dev->dev, "ATTENTION! Resetting GDI: tiled map should be reconfigured\n"); + + coda_write(dev, reg, CODA9_REG_BIT_SW_RESET); + + /* Wait until reset is done */ + if (coda_wait_timeout(dev, CODA9_REG_BIT_SW_RESET_STATUS)) { + dev_err(dev->dev, "Error! Timeout waiting for completion of SW reset\n"); + ret = -ETIME; + } + + coda_write(dev, 0x0, CODA9_REG_BIT_SW_RESET); + coda_write(dev, 0x0, CODA9_GDI_BUS_CTRL); + + return ret; +} + int coda_hw_reset(struct coda_ctx *ctx) { struct coda_dev *dev = ctx->dev; @@ -129,15 +298,21 @@ int coda_hw_reset(struct coda_ctx *ctx) } } + if (dev->devtype->product == CODA_988) { + ret = coda988_hw_runtime_reset(ctx); + if (ret) + return ret; + } + ret = reset_control_reset(dev->rstc); if (ret < 0) return ret; - if (dev->devtype->product == CODA_960) + if (dev->devtype->product == CODA_960 || dev->devtype->product == CODA_988) coda_write(dev, 0x00, CODA9_GDI_BUS_CTRL); coda_write(dev, CODA_REG_BIT_BUSY_FLAG, CODA_REG_BIT_BUSY); coda_write(dev, CODA_REG_RUN_ENABLE, CODA_REG_BIT_CODE_RUN); - ret = coda_wait_timeout(dev); + ret = coda_wait_timeout(dev, CODA_REG_BIT_BUSY); coda_write(dev, idx, CODA_REG_BIT_RUN_INDEX); return ret; @@ -235,6 +410,7 @@ static u32 coda_buffer_parse_headers(struct coda_ctx *ctx, case V4L2_PIX_FMT_MPEG2: size = coda_mpeg2_parse_headers(ctx, vaddr, payload); break; + case V4L2_PIX_FMT_H263: case V4L2_PIX_FMT_MPEG4: size = coda_mpeg4_parse_headers(ctx, vaddr, payload); break; @@ -284,7 +460,8 @@ static bool coda_bitstream_try_queue(struct coda_ctx *ctx, "bitstream buffer overflow\n"); return false; } - if (ctx->dev->devtype->product == CODA_960) + if (ctx->dev->devtype->product == CODA_960 || + ctx->dev->devtype->product == CODA_988) break; } } else { @@ -338,21 +515,23 @@ void coda_fill_bitstream(struct coda_ctx *ctx, struct list_head *buffer_list) ctx->num_metas > 1) break; - if (ctx->num_internal_frames && - ctx->num_metas >= ctx->num_internal_frames) { - meta = list_first_entry(&ctx->buffer_meta_list, - struct coda_buffer_meta, list); - - /* - * If we managed to fill in at least a full reorder - * window of buffers (num_internal_frames is a - * conservative estimate for this) and the bitstream - * prefetcher has at least 2 256 bytes periods beyond - * the first buffer to fetch, we can safely stop queuing - * in order to limit the decoder drain latency. - */ - if (coda_bitstream_can_fetch_past(ctx, meta->end)) - break; + if (ctx->dev->devtype->product != CODA_988) { + if (ctx->num_internal_frames && + ctx->num_metas >= ctx->num_internal_frames) { + meta = list_first_entry(&ctx->buffer_meta_list, + struct coda_buffer_meta, list); + + /* + * If we managed to fill in at least a full reorder + * window of buffers (num_internal_frames is a + * conservative estimate for this) and the bitstream + * prefetcher has at least 2 256 bytes periods beyond + * the first buffer to fetch, we can safely stop queuing + * in order to limit the decoder drain latency. + */ + if (coda_bitstream_can_fetch_past(ctx, meta->end)) + break; + } } src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); @@ -377,6 +556,31 @@ void coda_fill_bitstream(struct coda_ctx *ctx, struct list_head *buffer_list) continue; } + if (ctx->codec->src_fourcc == V4L2_PIX_FMT_VP8 && + ctx->dev->devtype->product == CODA_988){ + unsigned long payload_len; + int ret = 0; + + payload_len = vb2_get_plane_payload(&src_buf->vb2_buf, 0); + + if (ctx->params.vp8_fill_ivf_header) { + u8 dummy_ivf_header[32] = "DKIF\x00\x00\x20\x00"; + + ret |= coda_bitstream_queue(ctx, dummy_ivf_header, + sizeof(dummy_ivf_header)); + ctx->params.vp8_fill_ivf_header = 0; + } + u8 frame_header[12]; + *(unsigned long *)frame_header = payload_len; + v4l2_dbg(3, coda_debug, &ctx->dev->v4l2_dev, + "%s: feeding frame header into bitstream, frame len 0x%08lX\n", + __func__, payload_len); + ret |= coda_bitstream_queue(ctx, frame_header, sizeof(frame_header)); + if (ret) + v4l2_err(&ctx->dev->v4l2_dev, + "failed to add VP8 header into bitstream\n"); + } + /* Dump empty buffers */ if (!vb2_get_plane_payload(&src_buf->vb2_buf, 0)) { src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); @@ -436,9 +640,9 @@ void coda_bit_stream_end_flag(struct coda_ctx *ctx) ctx->bit_stream_param |= CODA_BIT_STREAM_END_FLAG; /* If this context is currently running, update the hardware flag */ - if ((dev->devtype->product == CODA_960) && - coda_isbusy(dev) && - (ctx->idx == coda_read(dev, CODA_REG_BIT_RUN_INDEX))) { + if ((dev->devtype->product == CODA_960 || dev->devtype->product == CODA_988) && + coda_isbusy(dev, CODA_REG_BIT_BUSY) && + ctx->idx == coda_read(dev, CODA_REG_BIT_RUN_INDEX)) { coda_write(dev, ctx->bit_stream_param, CODA_REG_BIT_BIT_STREAM_PARAM); } @@ -475,23 +679,35 @@ static int coda_alloc_framebuffers(struct coda_ctx *ctx, struct coda_q_data *q_data, u32 fourcc) { struct coda_dev *dev = ctx->dev; - unsigned int ysize, ycbcr_size; + unsigned int width, height, ysize, ycbcr_size, size_mvcolbuf; + unsigned char round; int ret; int i; if (ctx->codec->src_fourcc == V4L2_PIX_FMT_H264 || ctx->codec->dst_fourcc == V4L2_PIX_FMT_H264 || + ctx->codec->dst_fourcc == V4L2_PIX_FMT_H263 || + ctx->codec->src_fourcc == V4L2_PIX_FMT_H263 || ctx->codec->src_fourcc == V4L2_PIX_FMT_MPEG4 || - ctx->codec->dst_fourcc == V4L2_PIX_FMT_MPEG4) - ysize = round_up(q_data->rect.width, 16) * - round_up(q_data->rect.height, 16); - else - ysize = round_up(q_data->rect.width, 8) * q_data->rect.height; + ctx->codec->dst_fourcc == V4L2_PIX_FMT_MPEG4 || + ctx->codec->src_fourcc == V4L2_PIX_FMT_VP8) { + round = (dev->devtype->product == CODA_988) ? 32 : 16; + height = round_up(q_data->rect.height, round); + width = round_up(q_data->rect.width, round); + } else { + height = q_data->rect.height; + width = (dev->devtype->product == CODA_988) ? + round_up(q_data->rect.width, 32) : + round_up(q_data->rect.width, 8); + } - if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP) - ycbcr_size = round_up(ysize, 4096) + ysize / 2; - else + ysize = height * width; + if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP) { + round = (dev->devtype->product == CODA_988) ? 16384 : 4096; + ycbcr_size = round_up(ysize, round) + round_up(ysize / 2, round); + } else { ycbcr_size = ysize + ysize / 2; + } /* Allocate frame buffers */ for (i = 0; i < ctx->num_internal_frames; i++) { @@ -501,8 +717,20 @@ static int coda_alloc_framebuffers(struct coda_ctx *ctx, /* Add space for mvcol buffers */ if (dev->devtype->product != CODA_DX6 && (ctx->codec->src_fourcc == V4L2_PIX_FMT_H264 || - (ctx->codec->src_fourcc == V4L2_PIX_FMT_MPEG4 && i == 0))) - size += ysize / 4; + (ctx->codec->src_fourcc == V4L2_PIX_FMT_H263 && i == 0) || + (ctx->codec->src_fourcc == V4L2_PIX_FMT_MPEG4 && i == 0))) { + /* TODO add check for AVS format */ + if (dev->devtype->product == CODA_988) { + size_mvcolbuf = round_up(q_data->rect.height, 32) * + round_up(q_data->rect.width, 32); + size_mvcolbuf = (size_mvcolbuf * 3) / 2; + size_mvcolbuf = (size_mvcolbuf + 4) / 5; + size_mvcolbuf = ((size_mvcolbuf + 7) / 8) * 8; + } else { + size_mvcolbuf = ysize / 4; + } + size += size_mvcolbuf; + } name = kasprintf(GFP_KERNEL, "fb%d", i); if (!name) { coda_free_framebuffers(ctx); @@ -527,13 +755,19 @@ static int coda_alloc_framebuffers(struct coda_ctx *ctx, cr = y + ysize + ysize/4; mvcol = y + ysize + ysize/4 + ysize/4; if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP) { - cb = round_up(cb, 4096); - mvcol = cb + ysize/2; - cr = 0; - /* Packed 20-bit MSB of base addresses */ - /* YYYYYCCC, CCyyyyyc, cccc.... */ - y = (y & 0xfffff000) | cb >> 20; - cb = (cb & 0x000ff000) << 12; + if (dev->devtype->product == CODA_988) { + /* We assume that Linear Frame Map is used */ + cb = y + round_up(ysize, 16384); + cr = cb + round_up(ysize / 2, 16384); + } else { + cb = round_up(cb, 4096); + mvcol = cb + ysize / 2; + cr = 0; + /* Packed 20-bit MSB of base addresses */ + /* YYYYYCCC, CCyyyyyc, cccc.... */ + y = (y & 0xfffff000) | cb >> 20; + cb = (cb & 0x000ff000) << 12; + } } coda_parabuf_write(ctx, i * 3 + 0, y); coda_parabuf_write(ctx, i * 3 + 1, cb); @@ -547,6 +781,17 @@ static int coda_alloc_framebuffers(struct coda_ctx *ctx, coda_parabuf_write(ctx, 96 + i, mvcol); if (ctx->codec->src_fourcc == V4L2_PIX_FMT_MPEG4 && i == 0) coda_parabuf_write(ctx, 97, mvcol); + + if (ctx->codec->src_fourcc == V4L2_PIX_FMT_H263 && i == 0) + coda_parabuf_write(ctx, 97, mvcol); + + /* Bottom addresses of framebuffer */ + if (dev->devtype->product == CODA_988 && + ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP) { + coda_parabuf_write(ctx, i * 3 + 0 + CODA988_FB_BOT_BYTE_OFFSET / 4, 0); + coda_parabuf_write(ctx, i * 3 + 1 + CODA988_FB_BOT_BYTE_OFFSET / 4, 0); + coda_parabuf_write(ctx, i * 3 + 2 + CODA988_FB_BOT_BYTE_OFFSET / 4, 0); + } } return 0; @@ -556,6 +801,7 @@ static void coda_free_context_buffers(struct coda_ctx *ctx) { struct coda_dev *dev = ctx->dev; + coda_free_aux_buf(dev, &ctx->vp8mbbuf); coda_free_aux_buf(dev, &ctx->slicebuf); coda_free_aux_buf(dev, &ctx->psbuf); if (dev->devtype->product != CODA_DX6) @@ -581,9 +827,13 @@ static int coda_alloc_context_buffers(struct coda_ctx *ctx, return 0; if (!ctx->slicebuf.vaddr && q_data->fourcc == V4L2_PIX_FMT_H264) { - /* worst case slice size */ - size = (unsigned long)(DIV_ROUND_UP(q_data->rect.width, 16) * - DIV_ROUND_UP(q_data->rect.height, 16)) * 3200 / 8 + 512; + if (dev->devtype->product == CODA_988) { + size = ctx->codec->max_h * ctx->codec->max_w * 3 / 4; + } else { + /* worst case slice size */ + size = (unsigned long)(DIV_ROUND_UP(q_data->rect.width, 16) * + DIV_ROUND_UP(q_data->rect.height, 16)) * 3200 / 8 + 512; + } ret = coda_alloc_context_buf(ctx, &ctx->slicebuf, size, "slicebuf"); if (ret < 0) @@ -603,12 +853,29 @@ static int coda_alloc_context_buffers(struct coda_ctx *ctx, if (dev->devtype->product == CODA_960 && q_data->fourcc == V4L2_PIX_FMT_H264) size += CODA9_PS_SAVE_SIZE; + if (dev->devtype->product == CODA_988 && + q_data->fourcc == V4L2_PIX_FMT_H264) + size += CODA988_PS_SAVE_SIZE; ret = coda_alloc_context_buf(ctx, &ctx->workbuf, size, "workbuf"); if (ret < 0) goto err; } + if (!ctx->vp8mbbuf.vaddr && q_data->fourcc == V4L2_PIX_FMT_VP8) { + /* + * First partition information, 68 bytes per MB + * macroblock is 16x16 for Y component + */ + unsigned int stride = round_up(q_data->width, 16); + + size = 68 * (stride * q_data->width / 256); + ret = coda_alloc_context_buf(ctx, &ctx->vp8mbbuf, size, + "vp8mbbuf"); + if (ret < 0) + goto err; + } + return 0; err: @@ -627,13 +894,13 @@ static int coda_encode_header(struct coda_ctx *ctx, struct vb2_v4l2_buffer *buf, int ret; int i; - if (dev->devtype->product == CODA_960) + if (dev->devtype->product == CODA_960 || ctx->dev->devtype->product == CODA_988) memset(vb2_plane_vaddr(vb, 0), 0, 64); coda_write(dev, vb2_dma_contig_plane_dma_addr(vb, 0), CODA_CMD_ENC_HEADER_BB_START); bufsize = vb2_plane_size(vb, 0); - if (dev->devtype->product == CODA_960) + if (dev->devtype->product == CODA_960 || ctx->dev->devtype->product == CODA_988) bufsize /= 1024; coda_write(dev, bufsize, CODA_CMD_ENC_HEADER_BB_SIZE); if (dev->devtype->product == CODA_960 && @@ -652,6 +919,62 @@ static int coda_encode_header(struct coda_ctx *ctx, struct vb2_v4l2_buffer *buf, CODA9_CMD_ENC_HEADER_FRAME_CROP_V); header_code |= CODA9_HEADER_FRAME_CROP; } + } else if (ctx->dev->devtype->product == CODA_988 && + ctx->codec->dst_fourcc == V4L2_PIX_FMT_H264) { + int sps_id = 0; + + if (header_code == CODA_HEADER_H264_SPS_MVC) + sps_id = 1; + + q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT); + r = &q_data_src->rect; + + if (header_code == CODA_HEADER_H264_SPS || + header_code == CODA_HEADER_H264_SPS_MVC) { + coda_write(dev, + coda_h264enc_profile_id(ctx->params.h264_profile_idc), + CODA988_CMD_ENC_HEADER_PROFILE); + + /* TODO 1 for monochrome yuv400 */ + coda_write(dev, 0, + CODA988_CMD_ENC_HEADER_CHROMA_FORMAT); + + coda_write(dev, 0, + CODA988_CMD_ENC_HEADER_FIELD_FLAG); + + if (r->width % 32 || r->height % 32) { + u32 crop_right = round_up(r->width, 32) - r->width; + u32 crop_bottom = round_up(r->height, 32) - r->height; + + coda_write(dev, crop_right, + CODA9_CMD_ENC_HEADER_FRAME_CROP_H); + coda_write(dev, crop_bottom, + CODA9_CMD_ENC_HEADER_FRAME_CROP_V); + header_code |= CODA988_HEADER_FRAME_CROP; + } + } else if (header_code == CODA_HEADER_H264_PPS || + header_code == CODA_HEADER_H264_PPS_MVC) { + int cabac_init_idc = 0; + int pps_id = 0; + + coda_write(dev, ctx->params.h264_entropy_mode, + CODA988_CMD_ENC_HEADER_CABAC_MODE); + coda_write(dev, cabac_init_idc, + CODA988_CMD_ENC_HEADER_CABAC_INIT_IDC); + if (ctx->params.h264_profile_idc >= V4L2_MPEG_VIDEO_H264_PROFILE_HIGH) + coda_write(dev, ctx->params.h264_en_8x8_transform, + CODA988_CMD_ENC_HEADER_TRANSFORM_8X8); + + if (header_code == CODA_HEADER_H264_PPS_MVC) + header_code |= (1 << 24) | ((pps_id + 1) << 16); + else + header_code |= (pps_id << 16); + } + + if (ctx->params.h264_level_idc) + header_code |= CODA988_HEADER_USER_LEVEL(ctx->params.h264_level_idc) | + CODA988_HEADER_USER_LEVEL_ENABLE; + header_code |= (sps_id << 24); } coda_write(dev, header_code, CODA_CMD_ENC_HEADER_CODE); ret = coda_command_sync(ctx, CODA_COMMAND_ENCODE_HEADER); @@ -660,7 +983,7 @@ static int coda_encode_header(struct coda_ctx *ctx, struct vb2_v4l2_buffer *buf, return ret; } - if (dev->devtype->product == CODA_960) { + if (dev->devtype->product == CODA_960 || ctx->dev->devtype->product == CODA_988) { for (i = 63; i > 0; i--) if (((char *)vb2_plane_vaddr(vb, 0))[i] != 0) break; @@ -697,6 +1020,28 @@ static u32 coda_slice_mode(struct coda_ctx *ctx) ((1 & CODA_SLICING_MODE_MASK) << CODA_SLICING_MODE_OFFSET); } +static u32 coda988_slice_mode(struct coda_ctx *ctx) +{ + int size, unit; + + switch (ctx->params.slice_mode) { + case V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE: + default: + return 0; + case V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB: + size = ctx->params.slice_max_mb; + unit = 2; + break; + case V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES: + size = ctx->params.slice_max_bits; + unit = 1; + break; + } + + return ((size & CODA_SLICING_SIZE_MASK) << CODA_SLICING_SIZE_OFFSET) | + ((unit & CODA988_SLICING_UNIT_MASK) << CODA988_SLICING_UNIT_OFFSET); +} + static int coda_enc_param_change(struct coda_ctx *ctx) { struct coda_dev *dev = ctx->dev; @@ -748,11 +1093,23 @@ static int coda_enc_param_change(struct coda_ctx *ctx) ctx->params.intra_refresh_changed = false; } if (ctx->params.slice_mode_changed) { + int value = 0; + + if (dev->devtype->product == CODA_988) + value = coda988_slice_mode(ctx); + else + value = coda_slice_mode(ctx); change_enable |= CODA_PARAM_CHANGE_SLICE_MODE; - coda_write(dev, coda_slice_mode(ctx), + coda_write(dev, value, CODA_CMD_ENC_PARAM_SLICE_MODE); ctx->params.slice_mode_changed = false; } + if (ctx->params.entropy_mode_changed) { + change_enable |= CODA988_ENC_CHANGE_PARAM_CABAC_MODE; + coda_write(dev, ctx->params.h264_entropy_mode, + CODA988_CMD_ENC_PARAM_CHANGE_CABAC_MODE); + ctx->params.entropy_mode_changed = false; + } if (!change_enable) return 0; @@ -789,7 +1146,7 @@ static void coda_setup_iram(struct coda_ctx *ctx) { struct coda_iram_info *iram_info = &ctx->iram_info; struct coda_dev *dev = ctx->dev; - int w64, w128; + int w64, w128, w_bit; int mb_width; int dbk_bits; int bit_bits; @@ -817,6 +1174,7 @@ static void coda_setup_iram(struct coda_ctx *ctx) me_bits = CODA7_USE_HOST_ME_ENABLE | CODA7_USE_ME_ENABLE; break; case CODA_960: + case CODA_988: dbk_bits = CODA9_USE_HOST_DBK_ENABLE | CODA9_USE_DBK_ENABLE; bit_bits = CODA9_USE_HOST_BIT_ENABLE | CODA7_USE_BIT_ENABLE; ip_bits = CODA9_USE_HOST_IP_ENABLE | CODA7_USE_IP_ENABLE; @@ -848,9 +1206,16 @@ static void coda_setup_iram(struct coda_ctx *ctx) iram_info->axi_sram_use |= me_bits; } - /* Only H.264BP and H.263P3 are considered */ - iram_info->buf_dbk_y_use = coda_iram_alloc(iram_info, w64); - iram_info->buf_dbk_c_use = coda_iram_alloc(iram_info, w64); + if (dev->devtype->product == CODA_988 && + ctx->codec->src_fourcc == V4L2_PIX_FMT_H264) { + /* H.264HP */ + iram_info->buf_dbk_y_use = coda_iram_alloc(iram_info, w128); + iram_info->buf_dbk_c_use = coda_iram_alloc(iram_info, w128); + } else { + /* Only H.264BP and H.263P3 are considered */ + iram_info->buf_dbk_y_use = coda_iram_alloc(iram_info, w64); + iram_info->buf_dbk_c_use = coda_iram_alloc(iram_info, w64); + } if (!iram_info->buf_dbk_y_use || !iram_info->buf_dbk_c_use) goto out; iram_info->axi_sram_use |= dbk_bits; @@ -872,6 +1237,11 @@ static void coda_setup_iram(struct coda_ctx *ctx) q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE); mb_width = DIV_ROUND_UP(q_data_dst->width, 16); w128 = mb_width * 128; + if (ctx->codec->src_fourcc == V4L2_PIX_FMT_H264 && + dev->devtype->product == CODA_988) + w_bit = mb_width * 144; + else + w_bit = mb_width * 128; iram_info->buf_dbk_y_use = coda_iram_alloc(iram_info, w128); iram_info->buf_dbk_c_use = coda_iram_alloc(iram_info, w128); @@ -879,7 +1249,7 @@ static void coda_setup_iram(struct coda_ctx *ctx) goto out; iram_info->axi_sram_use |= dbk_bits; - iram_info->buf_bit_use = coda_iram_alloc(iram_info, w128); + iram_info->buf_bit_use = coda_iram_alloc(iram_info, w_bit); if (!iram_info->buf_bit_use) goto out; iram_info->axi_sram_use |= bit_bits; @@ -921,6 +1291,7 @@ static u32 coda_supported_firmwares[] = { CODA_FIRMWARE_VERNUM(CODA_960, 2, 1, 9), CODA_FIRMWARE_VERNUM(CODA_960, 2, 3, 10), CODA_FIRMWARE_VERNUM(CODA_960, 3, 1, 1), + CODA_FIRMWARE_VERNUM(CODA_988, 3, 0, 1), }; static bool coda_firmware_supported(u32 vernum) @@ -951,14 +1322,17 @@ int coda_check_firmware(struct coda_dev *dev) coda_write(dev, CODA_REG_BIT_BUSY_FLAG, CODA_REG_BIT_BUSY); coda_write(dev, 0, CODA_REG_BIT_RUN_INDEX); coda_write(dev, 0, CODA_REG_BIT_RUN_COD_STD); + if (dev->devtype->product == CODA_988) + coda_write(dev, 0, CODA7_REG_BIT_RUN_AUX_STD); + coda_write(dev, CODA_COMMAND_FIRMWARE_GET, CODA_REG_BIT_RUN_COMMAND); - if (coda_wait_timeout(dev)) { + if (coda_wait_timeout(dev, CODA_REG_BIT_BUSY)) { v4l2_err(&dev->v4l2_dev, "firmware get command error\n"); ret = -EIO; goto err_run_cmd; } - if (dev->devtype->product == CODA_960) { + if (dev->devtype->product == CODA_960 || dev->devtype->product == CODA_988) { data = coda_read(dev, CODA9_CMD_FIRMWARE_CODE_REV); v4l2_info(&dev->v4l2_dev, "Firmware code revision: %d\n", data); @@ -1018,7 +1392,8 @@ static void coda9_set_frame_cache(struct coda_ctx *ctx, u32 fourcc) cache_config = 1 << CODA9_CACHE_PAGEMERGE_OFFSET; } coda_write(ctx->dev, cache_size, CODA9_CMD_SET_FRAME_CACHE_SIZE); - if (fourcc == V4L2_PIX_FMT_NV12 || fourcc == V4L2_PIX_FMT_YUYV) { + if (fourcc == V4L2_PIX_FMT_NV12 || fourcc == V4L2_PIX_FMT_NV21 || + fourcc == V4L2_PIX_FMT_YUYV) { cache_config |= 32 << CODA9_CACHE_LUMA_BUFFER_SIZE_OFFSET | 16 << CODA9_CACHE_CR_BUFFER_SIZE_OFFSET | 0 << CODA9_CACHE_CB_BUFFER_SIZE_OFFSET; @@ -1030,6 +1405,21 @@ static void coda9_set_frame_cache(struct coda_ctx *ctx, u32 fourcc) coda_write(ctx->dev, cache_config, CODA9_CMD_SET_FRAME_CACHE_CONFIG); } +static void coda988_set_frame_cache(struct coda_ctx *ctx, u32 fourcc) +{ + u32 cache_config = 0; + + cache_config = CODA988_CACHE_BURST_MODE_4 | + CODA988_CACHE_CHROMA_INTERLEAVED_SZ_128_16 | + CODA988_CACHE_LUMA_SZ_128_32 | + CODA988_CACHE_LINE_VERT_PROC_MERGE; + + if (ctx->tiled_map_type != GDI_LINEAR_FRAME_MAP) + cache_config |= CODA988_CACHE_MAP_TYPE_TILED; + + coda_write(ctx->dev, cache_config, CODA9_CMD_SET_FRAME_CACHE_CONFIG); +} + /* * Encoder context operations */ @@ -1105,6 +1495,7 @@ static int coda_start_encoding(struct coda_ctx *ctx) CODADX6_STREAM_BUF_PIC_RESET, CODA_REG_BIT_STREAM_CTRL); break; case CODA_960: + case CODA_988: coda_write(dev, 0, CODA9_GDI_WPROT_RGN_EN); fallthrough; case CODA_HX4: @@ -1114,12 +1505,36 @@ static int coda_start_encoding(struct coda_ctx *ctx) break; } - ctx->frame_mem_ctrl &= ~(CODA_FRAME_CHROMA_INTERLEAVE | (0x3 << 9) | - CODA9_FRAME_TILED2LINEAR); - if (q_data_src->fourcc == V4L2_PIX_FMT_NV12) - ctx->frame_mem_ctrl |= CODA_FRAME_CHROMA_INTERLEAVE; - if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP) - ctx->frame_mem_ctrl |= (0x3 << 9) | CODA9_FRAME_TILED2LINEAR; + if (dev->devtype->product == CODA_988) { + ctx->frame_mem_ctrl &= ~(CODA_FRAME_CHROMA_INTERLEAVE | + CODA988_FRAME_CHROMA_NV21_SWAP | + CODA988_FRAME_TILED_MAP_MASK | + CODA988_FRAME_TILED2LINEAR_MASK); + + if (q_data_src->fourcc == V4L2_PIX_FMT_NV12 || + q_data_src->fourcc == V4L2_PIX_FMT_NV21 || + q_data_src->fourcc == V4L2_PIX_FMT_YUYV) + ctx->frame_mem_ctrl |= CODA_FRAME_CHROMA_INTERLEAVE; + + if (q_data_src->fourcc == V4L2_PIX_FMT_NV21) + ctx->frame_mem_ctrl |= CODA988_FRAME_CHROMA_NV21_SWAP; + + if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP) { + dev_warn(dev->dev, "%s() :%d WARNING! Set TILED_FRAME_MB_RASTER\n", + __func__, __LINE__); + ctx->frame_mem_ctrl |= CODA988_FRAME_TILED2LINEAR_FRAME_MAP | + CODA988_FRAME_TILED_MAP_TILED_FRAME_MB_RAST; + } + + } else { + ctx->frame_mem_ctrl &= ~(CODA_FRAME_CHROMA_INTERLEAVE | (0x3 << 9) | + CODA9_FRAME_TILED2LINEAR); + if (q_data_src->fourcc == V4L2_PIX_FMT_NV12 || + q_data_src->fourcc == V4L2_PIX_FMT_NV21) + ctx->frame_mem_ctrl |= CODA_FRAME_CHROMA_INTERLEAVE; + if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP) + ctx->frame_mem_ctrl |= (0x3 << 9) | CODA9_FRAME_TILED2LINEAR; + } coda_write(dev, ctx->frame_mem_ctrl, CODA_REG_BIT_FRAME_MEM_CTRL); if (dev->devtype->product == CODA_DX6) { @@ -1147,11 +1562,13 @@ static int coda_start_encoding(struct coda_ctx *ctx) break; } fallthrough; + case CODA_988: case CODA_960: value = (q_data_src->rect.width & CODA7_PICWIDTH_MASK) << CODA7_PICWIDTH_OFFSET; value |= (q_data_src->rect.height & CODA7_PICHEIGHT_MASK) << CODA_PICHEIGHT_OFFSET; + break; } coda_write(dev, value, CODA_CMD_ENC_SEQ_SRC_SIZE); if (dst_fourcc == V4L2_PIX_FMT_JPEG) @@ -1161,19 +1578,46 @@ static int coda_start_encoding(struct coda_ctx *ctx) ctx->params.codec_mode = ctx->codec->mode; switch (dst_fourcc) { + case V4L2_PIX_FMT_H263: + if (dev->devtype->product == CODA_960 || + dev->devtype->product == CODA_988) + coda_write(dev, CODA9_STD_H263, CODA_CMD_ENC_SEQ_COD_STD); + else + coda_write(dev, CODA_STD_H263, CODA_CMD_ENC_SEQ_COD_STD); + value = 0; + if (dev->devtype->product == CODA_988) { + value = CODA988_H263_ANNEX_I_ENABLE << 3 | + CODA988_H263_ANNEX_J_ENABLE << 2 | + CODA988_H263_ANNEX_K_ENABLE << 1 | + CODA988_H263_ANNEX_T_ENABLE; + } + coda_write(dev, value, CODA_CMD_ENC_SEQ_263_PARA); + break; case V4L2_PIX_FMT_MPEG4: - if (dev->devtype->product == CODA_960) - coda_write(dev, CODA9_STD_MPEG4, - CODA_CMD_ENC_SEQ_COD_STD); + if (dev->devtype->product == CODA_960 || + dev->devtype->product == CODA_988) + coda_write(dev, CODA9_STD_MPEG4, CODA_CMD_ENC_SEQ_COD_STD); else - coda_write(dev, CODA_STD_MPEG4, - CODA_CMD_ENC_SEQ_COD_STD); - coda_write(dev, 0, CODA_CMD_ENC_SEQ_MP4_PARA); + coda_write(dev, CODA_STD_MPEG4, CODA_CMD_ENC_SEQ_COD_STD); + value = 0; + if (dev->devtype->product == CODA_988) { + value = CODA988_MP4_INTRA_DC_VLC_THR << 2 | + CODA988_MP4_REVERSIBLE_VLC_EN << 1 | + CODA988_MP4_DATA_PARTITION_EN; + + value |= ((CODA988_MP4_HEC_EN > 0) ? 1 : 0) << 5; + value |= ((CODA988_MP4_VER_ID == 2) ? 0 : 1) << 6; + } + coda_write(dev, value, CODA_CMD_ENC_SEQ_MP4_PARA); break; case V4L2_PIX_FMT_H264: if (dev->devtype->product == CODA_960) coda_write(dev, CODA9_STD_H264, CODA_CMD_ENC_SEQ_COD_STD); + else if (dev->devtype->product == CODA_988) + coda_write(dev, CODA9_STD_H264 | + coda_h264enc_profile_id(ctx->params.h264_profile_idc) << 4, + CODA_CMD_ENC_SEQ_COD_STD); else coda_write(dev, CODA_STD_H264, CODA_CMD_ENC_SEQ_COD_STD); @@ -1214,42 +1658,131 @@ static int coda_start_encoding(struct coda_ctx *ctx) * in JPEG mode */ if (dst_fourcc != V4L2_PIX_FMT_JPEG) { - value = coda_slice_mode(ctx); + if (dev->devtype->product == CODA_988) + value = coda988_slice_mode(ctx); + else + value = coda_slice_mode(ctx); coda_write(dev, value, CODA_CMD_ENC_SEQ_SLICE_MODE); - value = ctx->params.gop_size; - coda_write(dev, value, CODA_CMD_ENC_SEQ_GOP_SIZE); } if (ctx->params.bitrate && (ctx->params.frame_rc_enable || ctx->params.mb_rc_enable)) { + int skip_frame = ctx->params.frame_skip_mode == + V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED ? 1 : 0; ctx->params.bitrate_changed = false; ctx->params.h264_intra_qp_changed = false; - - /* Rate control enabled */ - value = (ctx->params.bitrate & CODA_RATECONTROL_BITRATE_MASK) - << CODA_RATECONTROL_BITRATE_OFFSET; - value |= 1 & CODA_RATECONTROL_ENABLE_MASK; - value |= (ctx->params.vbv_delay & - CODA_RATECONTROL_INITIALDELAY_MASK) - << CODA_RATECONTROL_INITIALDELAY_OFFSET; - if (dev->devtype->product == CODA_960) - value |= BIT(31); /* disable autoskip */ + coda_dbg(1, ctx, "CODA RateControl Enable\n"); + + if (dev->devtype->product == CODA_988) { + value = ctx->params.max_intra_size; + if (ctx->params.max_intra_size > 0) + value = (1 << 16); + coda_write(dev, value, CODA988_CMD_ENC_SEQ_RC_MAX_INTRA_SIZE); + + if (dst_fourcc == V4L2_PIX_FMT_MPEG4 || + dst_fourcc == V4L2_PIX_FMT_H263) { + coda_write(dev, ctx->params.gop_size, CODA_CMD_ENC_SEQ_GOP_SIZE); + + value = CODA_RATECONTROL_AUTOSKIP_DISABLE(skip_frame); + value |= CODA_RATECONTROL_INITIALDELAY(ctx->params.vbv_delay); + coda_write(dev, value, CODA_CMD_ENC_SEQ_RC_PARA); + + value = 0; + coda_write(dev, value, CODA988_CMD_ENC_SEQ_QP_RANGE_SET); + + /* For MPEG4 encoder, BitRateKBPS occupies [18:4] bit field */ + value = (min(ctx->params.bitrate, 16383) << 4) | 1; + coda_write(dev, value, CODA988_CMD_ENC_SEQ_RC_PARA2); + } else if (dst_fourcc == V4L2_PIX_FMT_H264) { + /* + * -4..4 An initial QP offset for I in GOP. + * bit[3] is sign, bit[2..0] is value + * ex. -2 = BIT(3) | 2; + */ + u8 gop_qp_offset = 0; + bool gop_qp_en = false; + bool rc_cbr_srtict = false; + /* + * RC_MODE_OFF : Rate-control is off (Constant QP) + * RC_MODE_CBR : Rate-control is on (CBR) + * RC_MODE_ABR : Rate-control is on (ABR) recomended as default + * RC_MODE_VENDOR : Rate-control is on (Picture-level RC) + */ + int rc_mode = CODA988_RC_MODE_OFF; + + if (ctx->params.bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) + rc_mode = CODA988_RC_MODE_CBR; + else + rc_mode = CODA988_RC_MODE_ABR; + + if (rc_mode == CODA988_RC_MODE_CBR && ctx->params.vbv_delay < 20000) + ctx->params.vbv_delay = 20000; + + value = ctx->params.gop_size; + value |= (ctx->params.h264_i_frame_period << 21); + value |= gop_qp_en << 20; + value |= (gop_qp_offset & 0xF) << 16; + + coda_write(dev, value, CODA_CMD_ENC_SEQ_GOP_SIZE); + + value = CODA_RATECONTROL_AUTOSKIP_DISABLE(skip_frame); + value |= CODA_RATECONTROL_INITIALDELAY(ctx->params.vbv_delay); + coda_write(dev, value, CODA_CMD_ENC_SEQ_RC_PARA); + + if (rc_mode == 1) + value |= rc_cbr_srtict << 22; + value |= ((ctx->params.bitrate) << 4) | rc_mode; + coda_write(dev, value, CODA988_CMD_ENC_SEQ_RC_PARA2); + } + } else { + coda_write(dev, ctx->params.gop_size, CODA_CMD_ENC_SEQ_GOP_SIZE); + value = (ctx->params.bitrate & CODA_RATECONTROL_BITRATE_MASK) + << CODA_RATECONTROL_BITRATE_OFFSET; + value |= 1 & CODA_RATECONTROL_ENABLE_MASK; + value |= CODA_RATECONTROL_INITIALDELAY(ctx->params.vbv_delay); + if (dev->devtype->product == CODA_960) + value |= BIT(31); /* disable autoskip */ + coda_write(dev, value, CODA_CMD_ENC_SEQ_RC_PARA); + } } else { + coda_dbg(1, ctx, "CODA RateControl Disable\n"); + value = ctx->params.gop_size; + if (dev->devtype->product == CODA_988 && dst_fourcc == V4L2_PIX_FMT_H264) + value |= (ctx->params.h264_i_frame_period << 21); + + coda_write(dev, value, CODA_CMD_ENC_SEQ_GOP_SIZE); + value = 0; + coda_write(dev, value, CODA_CMD_ENC_SEQ_RC_PARA); + if (dev->devtype->product == CODA_988) { + coda_write(dev, 0, CODA988_CMD_ENC_SEQ_QP_RANGE_SET); + coda_write(dev, 0, CODA988_CMD_ENC_SEQ_RC_PARA2); + } } - coda_write(dev, value, CODA_CMD_ENC_SEQ_RC_PARA); - coda_write(dev, ctx->params.vbv_size, CODA_CMD_ENC_SEQ_RC_BUF_SIZE); + value = 0; + if (ctx->params.vbv_size && dev->devtype->product == CODA_988) + value = ctx->params.vbv_size | BIT(16); + else + value = ctx->params.vbv_size; + coda_write(dev, value, CODA_CMD_ENC_SEQ_RC_BUF_SIZE); coda_write(dev, ctx->params.intra_refresh, CODA_CMD_ENC_SEQ_INTRA_REFRESH); + value = 0; + if (ctx->params.intra_refresh && dev->devtype->product == CODA_988) + value = ctx->params.intra_refresh | BIT(16); + else + value = ctx->params.intra_refresh; + coda_write(dev, value, CODA_CMD_ENC_SEQ_INTRA_REFRESH); + coda_write(dev, bitstream_buf, CODA_CMD_ENC_SEQ_BB_START); coda_write(dev, bitstream_size / 1024, CODA_CMD_ENC_SEQ_BB_SIZE); value = 0; if (ctx->params.gamma > 0) { - if (dev->devtype->product == CODA_960) + if (dev->devtype->product == CODA_960 || dev->devtype->product == CODA_988) value |= 1 << CODA9_OPTION_GAMMA_OFFSET; else if (dev->devtype->product == CODA_DX6) value |= 1 << CODADX6_OPTION_GAMMA_OFFSET; @@ -1258,13 +1791,66 @@ static int coda_start_encoding(struct coda_ctx *ctx) coda_write(dev, ctx->params.gamma, CODA_CMD_ENC_SEQ_RC_GAMMA); } - if (ctx->params.h264_min_qp || ctx->params.h264_max_qp) { + if (dev->devtype->product == CODA_988) { + int qp_range_h264 = 0; + int qp_range_mpeg = 0; + int qp_delta_h264 = 0; + + /* min/max qp special for every frame type (I/P) used first */ + /* min/max qp common for all frame type (I/P) used second */ + if (dst_fourcc == V4L2_PIX_FMT_H264) { + /* TODO delta QP don't use now */ + int min_delta_qp = 0; + int max_delta_qp = 0; + + if (min_delta_qp > 0) + qp_delta_h264 = (BIT(6) | min_delta_qp) << 8; + + if (max_delta_qp > 0) + qp_delta_h264 = BIT(6) | max_delta_qp; + + if (ctx->params.h264_min_i_qp) + qp_range_h264 |= (BIT(6) | ctx->params.h264_min_i_qp); + else if (ctx->params.h264_min_qp) + qp_range_h264 |= (BIT(6) | ctx->params.h264_min_qp); + + if (ctx->params.h264_max_i_qp) + qp_range_h264 |= (BIT(6) | ctx->params.h264_max_i_qp) << 8; + else if (ctx->params.h264_max_qp) + qp_range_h264 |= (BIT(6) | ctx->params.h264_max_qp) << 8; + + if (ctx->params.h264_min_p_qp) + qp_range_h264 |= (BIT(6) | ctx->params.h264_min_p_qp) << 16; + else if (ctx->params.h264_min_qp) + qp_range_h264 |= (BIT(6) | ctx->params.h264_min_qp) << 16; + + if (ctx->params.h264_max_p_qp) + qp_range_h264 |= (BIT(6) | ctx->params.h264_max_p_qp) << 24; + else if (ctx->params.h264_max_qp) + qp_range_h264 |= (BIT(6) | ctx->params.h264_max_qp) << 24; + } else if (dst_fourcc == V4L2_PIX_FMT_MPEG4) { + qp_range_mpeg = ctx->params.mpeg4_max_qp; + } else if (dst_fourcc == V4L2_PIX_FMT_H263) { + qp_range_mpeg = ctx->params.h263_max_qp; + } + + coda_write(dev, qp_delta_h264, CODA988_CMD_ENC_SEQ_DELTA_QP); + coda_write(dev, qp_range_mpeg, CODA988_CMD_ENC_SEQ_RC_QP_MAX); + coda_write(dev, qp_range_h264, CODA988_CMD_ENC_SEQ_QP_RANGE_SET); + } else if (dst_fourcc == V4L2_PIX_FMT_H264 || + ctx->params.h264_min_qp || + ctx->params.h264_max_qp) { coda_write(dev, ctx->params.h264_min_qp << CODA_QPMIN_OFFSET | ctx->params.h264_max_qp << CODA_QPMAX_OFFSET, CODA_CMD_ENC_SEQ_RC_QP_MIN_MAX); + } else { + coda_write(dev, 0, CODA_CMD_ENC_SEQ_RC_QP_MIN_MAX); } - if (dev->devtype->product == CODA_960) { + + if (dev->devtype->product == CODA_988) { + value |= ctx->params.encode_aud_en << 2; + } else if (dev->devtype->product == CODA_960) { if (ctx->params.h264_max_qp) value |= 1 << CODA9_OPTION_RCQPMAX_OFFSET; } else { @@ -1275,10 +1861,16 @@ static int coda_start_encoding(struct coda_ctx *ctx) } coda_write(dev, value, CODA_CMD_ENC_SEQ_OPTION); - if (ctx->params.frame_rc_enable && !ctx->params.mb_rc_enable) - value = 1; - else + if (dev->devtype->product == CODA_988) { + /* TODO check mode = 3 */ value = 0; + } else { + if (ctx->params.frame_rc_enable && !ctx->params.mb_rc_enable) + value = 1; + else + value = 0; + } + coda_write(dev, value, CODA_CMD_ENC_SEQ_RC_INTERVAL_MODE); coda_setup_iram(ctx); @@ -1299,6 +1891,40 @@ static int coda_start_encoding(struct coda_ctx *ctx) case CODA_960: coda_write(dev, 0, CODA9_CMD_ENC_SEQ_ME_OPTION); coda_write(dev, 0, CODA9_CMD_ENC_SEQ_INTRA_WEIGHT); + break; + case CODA_988: + /* An intra cost weight factor for Intra/Inter type decision */ + u32 intra_const_weight = 0; + /* A block mode enable flag for Motion Estimation */ + u32 me_blk_mode = 0; + /* A Motion Estimation PMV option */ + u32 me_use_zero_pmv = 0; + /* A line buffer mode for Motion Estimation*/ + u32 me_line_buf_mode = 2; + + /* For conservative operation as defined in each of the video codec + * specification, it would be better to set 0 for H.264/AVC encoder + * and 1 for MPEG-4 encoder. + * Programmer's Guide Version 3.13.45.4 page 205 + */ + if (dst_fourcc == V4L2_PIX_FMT_MPEG4 || dst_fourcc == V4L2_PIX_FMT_H263) + me_use_zero_pmv = 1; + + /* always use constant values for h.263 */ + if (dst_fourcc == V4L2_PIX_FMT_H263) { + ctx->params.me_search_range_y = 3; + ctx->params.me_search_range_x = 2; + } + + value = CODA9_CMD_ENC_SEQ_ME_LINE_BUF_MODE(me_line_buf_mode) | + CODA9_CMD_ENC_SEQ_ME_BLK_MODE_EN(me_blk_mode) | + CODA9_CMD_ENC_SEQ_ME_USE_ZERO_PMV(me_use_zero_pmv) | + CODA9_CMD_ENC_SEQ_ME_SEARCH_RANGE_X(ctx->params.me_search_range_y) | + CODA9_CMD_ENC_SEQ_ME_SEARCH_RANGE_X(ctx->params.me_search_range_x); + coda_write(dev, value, CODA9_CMD_ENC_SEQ_ME_OPTION); + coda_write(dev, intra_const_weight, + CODA9_CMD_ENC_SEQ_INTRA_WEIGHT); + break; } } @@ -1316,7 +1942,7 @@ static int coda_start_encoding(struct coda_ctx *ctx) ctx->initialized = 1; if (dst_fourcc != V4L2_PIX_FMT_JPEG) { - if (dev->devtype->product == CODA_960) + if (dev->devtype->product == CODA_960 || dev->devtype->product == CODA_988) ctx->num_internal_frames = 4; else ctx->num_internal_frames = 2; @@ -1362,6 +1988,8 @@ static int coda_start_encoding(struct coda_ctx *ctx) CODA9_CMD_SET_FRAME_SUBSAMP_A); coda_write(dev, ctx->internal_frames[3].buf.paddr, CODA9_CMD_SET_FRAME_SUBSAMP_B); + } else if (dev->devtype->product == CODA_988) { + coda988_set_frame_cache(ctx, q_data_src->fourcc); } } @@ -1395,12 +2023,13 @@ static int coda_start_encoding(struct coda_ctx *ctx) * If visible width or height are not aligned to macroblock * size, the crop_right and crop_bottom SPS fields must be set * to the difference between visible and coded size. This is - * only supported by CODA960 firmware. All others do not allow + * only supported by CODA960/980 firmware. All others do not allow * writing frame cropping parameters, so we have to manually * fix up the SPS RBSP (Sequence Parameter Set Raw Byte * Sequence Payload) ourselves. */ if (ctx->dev->devtype->product != CODA_960 && + dev->devtype->product != CODA_988 && ((q_data_src->rect.width % 16) || (q_data_src->rect.height % 16))) { ret = coda_h264_sps_fixup(ctx, q_data_src->rect.width, @@ -1455,6 +2084,8 @@ static int coda_start_encoding(struct coda_ctx *ctx) if (ret < 0) goto out; break; + case V4L2_PIX_FMT_H263: + /* In H.263, ENC_HEADER command is ignored.*/ default: /* No more formats need to save headers at the moment */ break; @@ -1556,6 +2187,9 @@ static int coda_prepare_encode(struct coda_ctx *ctx) case V4L2_PIX_FMT_JPEG: quant_param = 30; break; + case V4L2_PIX_FMT_H263: + quant_param = ctx->params.h263_intra_qp; + break; default: v4l2_warn(&ctx->dev->v4l2_dev, "cannot set intra qp, fmt not supported\n"); @@ -1569,6 +2203,9 @@ static int coda_prepare_encode(struct coda_ctx *ctx) case V4L2_PIX_FMT_MPEG4: quant_param = ctx->params.mpeg4_inter_qp; break; + case V4L2_PIX_FMT_H263: + quant_param = ctx->params.h263_inter_qp; + break; default: v4l2_warn(&ctx->dev->v4l2_dev, "cannot set inter qp, fmt not supported\n"); @@ -1579,14 +2216,25 @@ static int coda_prepare_encode(struct coda_ctx *ctx) /* submit */ if (ctx->params.rot_mode) rot_mode = CODA_ROT_MIR_ENABLE | ctx->params.rot_mode; + + if (dev->devtype->product == CODA_988) { + if (q_data_src->fourcc == V4L2_PIX_FMT_NV12 || + q_data_src->fourcc == V4L2_PIX_FMT_NV21) + rot_mode |= CODA988_CBCR_INTERLIVE; + if (q_data_src->fourcc == V4L2_PIX_FMT_NV21) + rot_mode |= CODA988_SELECT_NV21; + } coda_write(dev, rot_mode, CODA_CMD_ENC_PIC_ROT_MODE); coda_write(dev, quant_param, CODA_CMD_ENC_PIC_QS); - if (dev->devtype->product == CODA_960) { + if (dev->devtype->product == CODA_960 || + dev->devtype->product == CODA_988) { coda_write(dev, 4/*FIXME: 0*/, CODA9_CMD_ENC_PIC_SRC_INDEX); coda_write(dev, q_data_src->bytesperline, CODA9_CMD_ENC_PIC_SRC_STRIDE); - coda_write(dev, 0, CODA9_CMD_ENC_PIC_SUB_FRAME_SYNC); + + if (dev->devtype->product == CODA_960) + coda_write(dev, 0, CODA9_CMD_ENC_PIC_SUB_FRAME_SYNC); reg = CODA9_CMD_ENC_PIC_SRC_ADDR_Y; } else { @@ -1712,7 +2360,8 @@ static void coda_seq_end_work(struct work_struct *work) * from the output stream after the h.264 decoder has run. Resetting the * hardware after the decoder has finished seems to help. */ - if (dev->devtype->product == CODA_960) + if (dev->devtype->product == CODA_960 || + dev->devtype->product == CODA_988) coda_hw_reset(ctx); kfifo_init(&ctx->bitstream_fifo, @@ -1815,7 +2464,8 @@ static bool coda_reorder_enable(struct coda_ctx *ctx) if (dev->devtype->product != CODA_HX4 && dev->devtype->product != CODA_7541 && - dev->devtype->product != CODA_960) + dev->devtype->product != CODA_960 && + dev->devtype->product != CODA_988) return false; if (ctx->codec->src_fourcc == V4L2_PIX_FMT_JPEG) @@ -1864,7 +2514,9 @@ static int __coda_decoder_seq_init(struct coda_ctx *ctx) int width, height; u32 src_fourcc, dst_fourcc; u32 val; - int ret; + u8 crop_shift; + u16 crop_mask; + int ret = 0; lockdep_assert_held(&dev->coda_mutex); @@ -1882,13 +2534,27 @@ static int __coda_decoder_seq_init(struct coda_ctx *ctx) /* Update coda bitstream read and write pointers from kfifo */ coda_kfifo_sync_to_device_full(ctx); - ctx->frame_mem_ctrl &= ~(CODA_FRAME_CHROMA_INTERLEAVE | (0x3 << 9) | - CODA9_FRAME_TILED2LINEAR); - if (dst_fourcc == V4L2_PIX_FMT_NV12 || dst_fourcc == V4L2_PIX_FMT_YUYV) + if (dev->devtype->product == CODA_988) { + ctx->frame_mem_ctrl &= ~(CODA_FRAME_CHROMA_INTERLEAVE | + CODA988_FRAME_CHROMA_NV21_SWAP | + CODA988_FRAME_TILED_MAP_MASK | + CODA988_FRAME_TILED2LINEAR_MASK); + if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP) { + ctx->frame_mem_ctrl |= CODA988_FRAME_TILED2LINEAR_FRAME_MAP | + CODA988_FRAME_TILED_MAP_TILED_FRAME_MB_RAST; + } + } else { + ctx->frame_mem_ctrl &= ~(CODA_FRAME_CHROMA_INTERLEAVE | (0x3 << 9) | + CODA9_FRAME_TILED2LINEAR); + if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP) + ctx->frame_mem_ctrl |= (0x3 << 9) | + ((ctx->use_vdoa) ? 0 : CODA9_FRAME_TILED2LINEAR); + } + if (dst_fourcc == V4L2_PIX_FMT_NV12 || dst_fourcc == V4L2_PIX_FMT_NV21 || + dst_fourcc == V4L2_PIX_FMT_YUYV) ctx->frame_mem_ctrl |= CODA_FRAME_CHROMA_INTERLEAVE; - if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP) - ctx->frame_mem_ctrl |= (0x3 << 9) | - ((ctx->use_vdoa) ? 0 : CODA9_FRAME_TILED2LINEAR); + if (dst_fourcc == V4L2_PIX_FMT_NV21 && dev->devtype->product == CODA_988) + ctx->frame_mem_ctrl |= CODA988_FRAME_CHROMA_NV21_SWAP; coda_write(dev, ctx->frame_mem_ctrl, CODA_REG_BIT_FRAME_MEM_CTRL); ctx->display_idx = -1; @@ -1897,6 +2563,12 @@ static int __coda_decoder_seq_init(struct coda_ctx *ctx) coda_write(dev, bitstream_buf, CODA_CMD_DEC_SEQ_BB_START); coda_write(dev, bitstream_size / 1024, CODA_CMD_DEC_SEQ_BB_SIZE); + if (dev->devtype->product == CODA_988) { + coda_write(dev, 0x0, CODA988_CMD_DEC_SEQ_USER_DATA_OPTION); + coda_write(dev, 0x0, CODA988_CMD_DEC_SEQ_USER_DATA_BASE_ADDR); + coda_write(dev, 0x0, CODA988_CMD_DEC_SEQ_USER_DATA_BUF_SIZE); + } + val = 0; if (coda_reorder_enable(ctx)) val |= CODA_REORDER_ENABLE; @@ -1908,6 +2580,16 @@ static int __coda_decoder_seq_init(struct coda_ctx *ctx) if (dev->devtype->product == CODA_960 && src_fourcc == V4L2_PIX_FMT_MPEG4) ctx->params.codec_mode_aux = CODA_MP4_AUX_MPEG4; + else if (dev->devtype->product == CODA_988) { + if (src_fourcc == V4L2_PIX_FMT_MPEG4 || src_fourcc == V4L2_PIX_FMT_H263) + ctx->params.codec_mode_aux = CODA_MP4_AUX_MPEG4; + if (src_fourcc == V4L2_PIX_FMT_VP8) + ctx->params.codec_mode_aux = CODA_VPX_AUX_VP8; + if (src_fourcc == V4L2_PIX_FMT_H264_MVC) + ctx->params.codec_mode_aux = CODA_H264_AUX_MVC; + if (src_fourcc == V4L2_PIX_FMT_H264) + ctx->params.codec_mode_aux = CODA_H264_AUX_AVC; + } else ctx->params.codec_mode_aux = 0; if (src_fourcc == V4L2_PIX_FMT_MPEG4) { @@ -1925,14 +2607,22 @@ static int __coda_decoder_seq_init(struct coda_ctx *ctx) if (dev->devtype->product == CODA_960) { coda_write(dev, 0, CODA_CMD_DEC_SEQ_X264_MV_EN); coda_write(dev, 512, CODA_CMD_DEC_SEQ_SPP_CHUNK_SIZE); + } else if (dev->devtype->product == CODA_988) { + coda_write(dev, 1, CODA_CMD_DEC_SEQ_X264_MV_EN); + coda_write(dev, 1024, CODA_CMD_DEC_SEQ_SPP_CHUNK_SIZE); } } if (src_fourcc == V4L2_PIX_FMT_JPEG) coda_write(dev, 0, CODA_CMD_DEC_SEQ_JPG_THUMB_EN); - if (dev->devtype->product != CODA_960) + if (dev->devtype->product != CODA_960 && dev->devtype->product != CODA_988) coda_write(dev, 0, CODA_CMD_DEC_SEQ_SRC_SIZE); - ctx->bit_stream_param = CODA_BIT_DEC_SEQ_INIT_ESCAPE; + /* SeqInitEscape flag is obsoleted for coda988 */ + if (dev->devtype->product == CODA_988) + ctx->bit_stream_param = 0x0; + else + ctx->bit_stream_param = CODA_BIT_DEC_SEQ_INIT_ESCAPE; + ret = coda_command_sync(ctx, CODA_COMMAND_SEQ_INIT); ctx->bit_stream_param = 0; if (ret) { @@ -1981,6 +2671,16 @@ static int __coda_decoder_seq_init(struct coda_ctx *ctx) coda_dbg(1, ctx, "start decoding: %dx%d\n", width, height); ctx->num_internal_frames = coda_read(dev, CODA_RET_DEC_SEQ_FRAME_NEED); + + /* + * For coda988 there is a bug with the number of required frame buffers. + * We need at least 8 to avoid getting "-1" in CODA_RET_DEC_PIC_CUR_IDX reg + * that means BIT does not decode a picture at this picture run command + * because there is not enough frame buffer to continue decoding process. + */ + if (dev->devtype->product == CODA_988) + ctx->num_internal_frames = max(ctx->num_internal_frames, CODA988_MIN_FRAMEBUFFERS); + /* * If the VDOA is used, the decoder needs one additional frame, * because the frames are freed when the next frame is decoded. @@ -2004,12 +2704,20 @@ static int __coda_decoder_seq_init(struct coda_ctx *ctx) left_right = coda_read(dev, CODA_RET_DEC_SEQ_CROP_LEFT_RIGHT); top_bottom = coda_read(dev, CODA_RET_DEC_SEQ_CROP_TOP_BOTTOM); - q_data_dst->rect.left = (left_right >> 10) & 0x3ff; - q_data_dst->rect.top = (top_bottom >> 10) & 0x3ff; + if (dev->devtype->product == CODA_988) { + crop_shift = CODA_988_CROP_SHIFT; + crop_mask = CODA_988_CROP_MASK; + } else { + crop_shift = CODA_COMMON_CROP_SHIFT; + crop_mask = CODA_COMMON_CROP_MASK; + } + + q_data_dst->rect.left = (left_right >> crop_shift) & crop_mask; + q_data_dst->rect.top = (top_bottom >> crop_shift) & crop_mask; q_data_dst->rect.width = width - q_data_dst->rect.left - - (left_right & 0x3ff); + (left_right & crop_mask); q_data_dst->rect.height = height - q_data_dst->rect.top - - (top_bottom & 0x3ff); + (top_bottom & crop_mask); } if (dev->devtype->product != CODA_DX6) { @@ -2059,13 +2767,27 @@ static int __coda_start_decoding(struct coda_ctx *ctx) if (ret < 0) return ret; } else { - ctx->frame_mem_ctrl &= ~(CODA_FRAME_CHROMA_INTERLEAVE | (0x3 << 9) | - CODA9_FRAME_TILED2LINEAR); - if (dst_fourcc == V4L2_PIX_FMT_NV12 || dst_fourcc == V4L2_PIX_FMT_YUYV) + if (dev->devtype->product == CODA_988) { + ctx->frame_mem_ctrl &= ~(CODA_FRAME_CHROMA_INTERLEAVE | + CODA988_FRAME_CHROMA_NV21_SWAP | + CODA988_FRAME_TILED_MAP_MASK | + CODA988_FRAME_TILED2LINEAR_MASK); + if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP) { + ctx->frame_mem_ctrl |= CODA988_FRAME_TILED2LINEAR_FRAME_MAP | + CODA988_FRAME_TILED_MAP_TILED_FRAME_MB_RAST; + } + } else { + ctx->frame_mem_ctrl &= ~(CODA_FRAME_CHROMA_INTERLEAVE | (0x3 << 9) | + CODA9_FRAME_TILED2LINEAR); + if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP) + ctx->frame_mem_ctrl |= (0x3 << 9) | + ((ctx->use_vdoa) ? 0 : CODA9_FRAME_TILED2LINEAR); + } + if (dst_fourcc == V4L2_PIX_FMT_NV12 || dst_fourcc == V4L2_PIX_FMT_NV21 || + dst_fourcc == V4L2_PIX_FMT_YUYV) ctx->frame_mem_ctrl |= CODA_FRAME_CHROMA_INTERLEAVE; - if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP) - ctx->frame_mem_ctrl |= (0x3 << 9) | - ((ctx->use_vdoa) ? 0 : CODA9_FRAME_TILED2LINEAR); + if (dst_fourcc == V4L2_PIX_FMT_NV21 && dev->devtype->product == CODA_988) + ctx->frame_mem_ctrl |= CODA988_FRAME_CHROMA_NV21_SWAP; } coda_write(dev, ctx->parabuf.paddr, CODA_REG_BIT_PARA_BUF_ADDR); @@ -2078,8 +2800,13 @@ static int __coda_start_decoding(struct coda_ctx *ctx) /* Tell the decoder how many frame buffers we allocated. */ coda_write(dev, ctx->num_internal_frames, CODA_CMD_SET_FRAME_BUF_NUM); - coda_write(dev, round_up(q_data_dst->rect.width, 16), - CODA_CMD_SET_FRAME_BUF_STRIDE); + if (dev->devtype->product == CODA_988) { + coda_write(dev, round_up(q_data_dst->rect.width, 32), + CODA_CMD_SET_FRAME_BUF_STRIDE); + } else { + coda_write(dev, round_up(q_data_dst->rect.width, 16), + CODA_CMD_SET_FRAME_BUF_STRIDE); + } if (dev->devtype->product != CODA_DX6) { /* Set secondary AXI IRAM */ @@ -2095,15 +2822,23 @@ static int __coda_start_decoding(struct coda_ctx *ctx) CODA7_CMD_SET_FRAME_AXI_DBKC_ADDR); coda_write(dev, ctx->iram_info.buf_ovl_use, CODA7_CMD_SET_FRAME_AXI_OVL_ADDR); - if (dev->devtype->product == CODA_960) { - coda_write(dev, ctx->iram_info.buf_btp_use, - CODA9_CMD_SET_FRAME_AXI_BTP_ADDR); - + if (dev->devtype->product == CODA_960 || + dev->devtype->product == CODA_988) { coda_write(dev, -1, CODA9_CMD_SET_FRAME_DELAY); - coda9_set_frame_cache(ctx, dst_fourcc); + if (dev->devtype->product == CODA_960) { + coda_write(dev, (u32)ctx->iram_info.buf_btp_use, + CODA9_CMD_SET_FRAME_AXI_BTP_ADDR); + coda9_set_frame_cache(ctx, dst_fourcc); + } else { + coda988_set_frame_cache(ctx, dst_fourcc); + } } } + if (src_fourcc == V4L2_PIX_FMT_VP8) { + coda_write(dev, ctx->vp8mbbuf.paddr, CODA9_CMD_SET_FRAME_MB_BUF_BASE); + } + if (src_fourcc == V4L2_PIX_FMT_H264) { coda_write(dev, ctx->slicebuf.paddr, CODA_CMD_SET_FRAME_SLICE_BB_START); @@ -2134,6 +2869,16 @@ static int __coda_start_decoding(struct coda_ctx *ctx) return -ETIMEDOUT; } + if (dev->devtype->product == CODA_988) { + u32 val = coda_read(dev, CODA988_RET_SET_FRAME_SUCCESS); + + if (!(val & 0x1)) + pr_err("SET_FRAME_SUCCESS = %d\n", val); + + if (val & (1 << 31)) + v4l2_err(&dev->v4l2_dev, "set frame: memory access violation\n"); + } + return 0; } @@ -2187,6 +2932,9 @@ static int coda_prepare_decode(struct coda_ctx *ctx) if (dev->devtype->product == CODA_960) coda_set_gdi_regs(ctx); + else if (dev->devtype->product == CODA_988 && + ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP) + coda988_set_gdi_regs(ctx); if (ctx->use_vdoa && ctx->display_idx >= 0 && @@ -2195,7 +2943,8 @@ static int coda_prepare_decode(struct coda_ctx *ctx) vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0), ctx->internal_frames[ctx->display_idx].buf.paddr); } else { - if (dev->devtype->product == CODA_960) { + if (dev->devtype->product == CODA_960 || + dev->devtype->product == CODA_988) { /* * It was previously assumed that the CODA960 has an * internal list of 64 buffer entries that contains @@ -2239,12 +2988,19 @@ static int coda_prepare_decode(struct coda_ctx *ctx) /* 'hardcode to use interrupt disable mode'? */ coda_write(dev, (1 << 10), CODA_CMD_DEC_PIC_OPTION); break; + case CODA_988: + coda_write(dev, 0x0, CODA988_CMD_DEC_PIC_USER_DATA_BASE_ADDR); + coda_write(dev, 0x0, CODA988_CMD_DEC_PIC_USER_DATA_BUF_SIZE); + coda_write(dev, 0x0, CODA988_CMD_DEC_PIC_NUM_ROWS); + coda_write(dev, CODA988_UDATA_REPORT_INT_DISABLE, CODA_CMD_DEC_PIC_OPTION); + break; } - coda_write(dev, 0, CODA_CMD_DEC_PIC_SKIP_NUM); - - coda_write(dev, 0, CODA_CMD_DEC_PIC_BB_START); - coda_write(dev, 0, CODA_CMD_DEC_PIC_START_BYTE); + if (dev->devtype->product != CODA_988) { + coda_write(dev, 0, CODA_CMD_DEC_PIC_SKIP_NUM); + coda_write(dev, 0, CODA_CMD_DEC_PIC_BB_START); + coda_write(dev, 0, CODA_CMD_DEC_PIC_START_BYTE); + } if (dev->devtype->product != CODA_DX6) coda_write(dev, ctx->iram_info.axi_sram_use, @@ -2339,6 +3095,19 @@ static void coda_finish_decode(struct coda_ctx *ctx) v4l2_err(&dev->v4l2_dev, "insufficient slice buffer space (%d bytes)\n", ctx->slicebuf.size); + if (ctx->dev->devtype->product == CODA_988 && val & (1 << 16)) + v4l2_err(&dev->v4l2_dev, + "in-stream should be reused by Non-Paired field\n"); + if (ctx->dev->devtype->product == CODA_988 && val & (1 << 17)) + v4l2_err(&dev->v4l2_dev, "syntax error in the picture header\n"); + if (ctx->dev->devtype->product == CODA_988 && val & (1 << 19)) + v4l2_err(&dev->v4l2_dev, "the current frame number is wrapped around\n"); + if (ctx->dev->devtype->product == CODA_988 && val & (1 << 20)) + v4l2_err(&dev->v4l2_dev, "there is a change of sequence\n"); + if (ctx->dev->devtype->product == CODA_988 && val & (1 << 21)) + v4l2_err(&dev->v4l2_dev, "reference frame is missing\n"); + if (ctx->dev->devtype->product == CODA_988 && val & (1 << 31)) + v4l2_err(&dev->v4l2_dev, "pic dec: memory access violation\n"); } val = coda_read(dev, CODA_RET_DEC_PIC_SIZE); @@ -2624,6 +3393,10 @@ irqreturn_t coda_irq_handler(int irq, void *data) struct coda_dev *dev = data; struct coda_ctx *ctx; u32 status; + u32 irq_reason; + + if (dev->devtype->product == CODA_988) + irq_reason = coda_read(dev, CODA_REG_BIT_INT_REASON); /* read status register to attend the IRQ */ status = coda_read(dev, CODA_REG_BIT_INT_STATUS); @@ -2657,7 +3430,14 @@ irqreturn_t coda_irq_handler(int irq, void *data) coda_dbg(1, ctx, "task has been aborted\n"); } - if (coda_isbusy(ctx->dev)) { + if (dev->devtype->product == CODA_988) { + if (irq_reason & CODA988_INT_BIT_BIT_BUF_FULL) + coda_dbg(1, ctx, "Error! External bitsteam buffer is in full status\n"); + else if (irq_reason & CODA988_INT_BIT_BIT_BUF_EMPTY) + coda_dbg(1, ctx, "Error! External bitsteam buffer is in empty status\n"); + } + + if (coda_isbusy(ctx->dev, CODA_REG_BIT_BUSY)) { coda_dbg(1, ctx, "coda is still busy!!!!\n"); return IRQ_NONE; } diff --git a/drivers/media/platform/chips-media/coda/coda-common.c b/drivers/media/platform/chips-media/coda/coda-common.c index b73b09b3baf9..fabf7bc4d34f 100644 --- a/drivers/media/platform/chips-media/coda/coda-common.c +++ b/drivers/media/platform/chips-media/coda/coda-common.c @@ -43,7 +43,7 @@ #define CODA_NAME "coda" #define CODADX6_MAX_INSTANCES 4 -#define CODA_MAX_FORMATS 5 +#define CODA_MAX_FORMATS 6 #define CODA_ISRAM_SIZE (2048 * 2) @@ -104,6 +104,14 @@ void coda_write_base(struct coda_ctx *ctx, struct coda_q_data *q_data, base_cb = base_y + q_data->bytesperline * q_data->height; base_cr = base_cb + q_data->bytesperline * q_data->height / 4; break; + case V4L2_PIX_FMT_NV21: + if (ctx->dev->devtype->product == CODA_988) { + /* for coda988 uses swap control bits */ + base_cb = base_y + q_data->bytesperline * q_data->height; + base_cr = base_cb + q_data->bytesperline * q_data->height / 4; + break; + } + fallthrough; case V4L2_PIX_FMT_YVU420: /* Switch Cb and Cr for YVU420 format */ base_cr = base_y + q_data->bytesperline * q_data->height; @@ -117,6 +125,22 @@ void coda_write_base(struct coda_ctx *ctx, struct coda_q_data *q_data, coda_write(ctx->dev, base_y, reg_y); coda_write(ctx->dev, base_cb, reg_y + 4); coda_write(ctx->dev, base_cr, reg_y + 8); + + if (ctx->dev->devtype->product == CODA_988) { + if (ctx->inst_type == CODA_INST_DECODER) { + coda_write(ctx->dev, 0x0, CODA988_CMD_DEC_PIC_ROT_BOTTOM_Y); + coda_write(ctx->dev, 0x0, CODA988_CMD_DEC_PIC_ROT_BOTTOM_CB); + coda_write(ctx->dev, 0x0, CODA988_CMD_DEC_PIC_ROT_BOTTOM_CR); + } else if (ctx->inst_type == CODA_INST_ENCODER) { + coda_write(ctx->dev, 0x0, CODA988_CMD_ENC_PIC_SRC_BOTTOM_Y); + coda_write(ctx->dev, 0x0, CODA988_CMD_ENC_PIC_SRC_BOTTOM_CB); + coda_write(ctx->dev, 0x0, CODA988_CMD_ENC_PIC_SRC_BOTTOM_CR); + } else { + dev_warn(ctx->dev->dev, + "Unimplemented functionality for coda988: %s() :%d\n", + __func__, __LINE__); + } + } } #define CODA_CODEC(mode, src_fourcc, dst_fourcc, max_w, max_h) \ @@ -162,6 +186,16 @@ static const struct coda_codec coda9_codecs[] = { CODA_CODEC(CODA9_MODE_DECODE_MJPG, V4L2_PIX_FMT_JPEG, V4L2_PIX_FMT_YUV420, 8192, 8192), }; +static const struct coda_codec coda988_codecs[] = { + CODA_CODEC(CODA9_MODE_ENCODE_H264, V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_H264, 4096, 2304), + CODA_CODEC(CODA9_MODE_ENCODE_MP4, V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_MPEG4, 1920, 1088), + CODA_CODEC(CODA9_MODE_ENCODE_MP4, V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_H263, 1920, 1088), + CODA_CODEC(CODA9_MODE_DECODE_H264, V4L2_PIX_FMT_H264, V4L2_PIX_FMT_YUV420, 4096, 2304), + CODA_CODEC(CODA9_MODE_DECODE_MP4, V4L2_PIX_FMT_MPEG4, V4L2_PIX_FMT_YUV420, 1920, 1088), + CODA_CODEC(CODA9_MODE_DECODE_MP4, V4L2_PIX_FMT_H263, V4L2_PIX_FMT_YUV420, 1920, 1088), + CODA_CODEC(CODA9_MODE_DECODE_VPX, V4L2_PIX_FMT_VP8, V4L2_PIX_FMT_YUV420, 1920, 1088), +}; + struct coda_video_device { const char *name; enum coda_inst_type type; @@ -186,6 +220,23 @@ static const struct coda_video_device coda_bit_encoder = { }, }; +static const struct coda_video_device coda988_bit_encoder = { + .name = "coda988-video-encoder", + .type = CODA_INST_ENCODER, + .ops = &coda_bit_encode_ops, + .src_formats = { + V4L2_PIX_FMT_NV12, + V4L2_PIX_FMT_NV21, + V4L2_PIX_FMT_YUV420, + V4L2_PIX_FMT_YVU420, + }, + .dst_formats = { + V4L2_PIX_FMT_H264, + V4L2_PIX_FMT_MPEG4, + V4L2_PIX_FMT_H263, + }, +}; + static const struct coda_video_device coda_bit_jpeg_encoder = { .name = "coda-jpeg-encoder", .type = CODA_INST_ENCODER, @@ -222,6 +273,24 @@ static const struct coda_video_device coda_bit_decoder = { }, }; +static const struct coda_video_device coda988_bit_decoder = { + .name = "coda988-video-decoder", + .type = CODA_INST_DECODER, + .ops = &coda_bit_decode_ops, + .src_formats = { + V4L2_PIX_FMT_H264, + V4L2_PIX_FMT_MPEG4, + V4L2_PIX_FMT_H263, + V4L2_PIX_FMT_VP8, + }, + .dst_formats = { + V4L2_PIX_FMT_NV12, + V4L2_PIX_FMT_NV21, + V4L2_PIX_FMT_YUV420, + V4L2_PIX_FMT_YVU420, + }, +}; + static const struct coda_video_device coda_bit_jpeg_decoder = { .name = "coda-jpeg-decoder", .type = CODA_INST_DECODER, @@ -293,6 +362,12 @@ static const struct coda_video_device *coda9_video_devices[] = { &coda_bit_decoder, }; +__maybe_unused +static const struct coda_video_device *coda988_video_devices[] = { + &coda988_bit_encoder, + &coda988_bit_decoder, +}; + /* * Normalize all supported YUV 4:2:0 formats to the value used in the codec * tables. @@ -301,6 +376,7 @@ static u32 coda_format_normalize_yuv(u32 fourcc) { switch (fourcc) { case V4L2_PIX_FMT_NV12: + case V4L2_PIX_FMT_NV21: case V4L2_PIX_FMT_YUV420: case V4L2_PIX_FMT_YVU420: case V4L2_PIX_FMT_YUV422P: @@ -385,6 +461,8 @@ const char *coda_product_name(int product) return "CODA7541"; case CODA_960: return "CODA960"; + case CODA_988: + return "CODA988"; default: snprintf(buf, sizeof(buf), "(0x%04x)", product); return buf; @@ -433,6 +511,7 @@ static int coda_querycap(struct file *file, void *priv, static const u32 coda_formats_420[CODA_MAX_FORMATS] = { V4L2_PIX_FMT_NV12, + V4L2_PIX_FMT_NV21, V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_YVU420, }; @@ -608,6 +687,7 @@ static int coda_try_fmt(struct coda_ctx *ctx, const struct coda_codec *codec, switch (f->fmt.pix.pixelformat) { case V4L2_PIX_FMT_NV12: + case V4L2_PIX_FMT_NV21: case V4L2_PIX_FMT_YUV420: case V4L2_PIX_FMT_YVU420: /* @@ -637,6 +717,8 @@ static int coda_try_fmt(struct coda_ctx *ctx, const struct coda_codec *codec, case V4L2_PIX_FMT_H264: case V4L2_PIX_FMT_MPEG4: case V4L2_PIX_FMT_MPEG2: + case V4L2_PIX_FMT_H263: + case V4L2_PIX_FMT_VP8: f->fmt.pix.bytesperline = 0; f->fmt.pix.sizeimage = coda_estimate_sizeimage(ctx, f->fmt.pix.sizeimage, @@ -819,6 +901,7 @@ static int coda_s_fmt(struct coda_ctx *ctx, struct v4l2_format *f, ctx->tiled_map_type = GDI_TILED_FRAME_MB_RASTER_MAP; break; case V4L2_PIX_FMT_NV12: + case V4L2_PIX_FMT_NV21: if (!disable_tiling && ctx->use_bit && ctx->dev->devtype->product == CODA_960) { ctx->tiled_map_type = GDI_TILED_FRAME_MB_RASTER_MAP; @@ -1820,6 +1903,7 @@ void coda_update_profile_level_ctrls(struct coda_ctx *ctx, u8 profile_idc, level = coda_mpeg2_level(level_idc); break; case V4L2_PIX_FMT_MPEG4: + case V4L2_PIX_FMT_H263: codec_name = "MPEG-4"; profile_cid = V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE; level_cid = V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL; @@ -1992,6 +2076,7 @@ static int coda_start_streaming(struct vb2_queue *q, unsigned int count) mutex_unlock(&ctx->bitstream_mutex); if (ctx->dev->devtype->product != CODA_960 && + ctx->dev->devtype->product != CODA_988 && coda_get_bitstream_payload(ctx) < 512) { v4l2_err(v4l2_dev, "start payload < 512\n"); ret = -EINVAL; @@ -2078,6 +2163,13 @@ static int coda_start_streaming(struct vb2_queue *q, unsigned int count) if (ctx->mb_err_cnt_ctrl) v4l2_ctrl_s_ctrl(ctx->mb_err_cnt_ctrl, 0); + /* + * VP8 decoder requires complete IVF bitstream instead of + * just compressed frames + */ + if (q_data_dst->fourcc == V4L2_PIX_FMT_VP8) + ctx->params.vp8_fill_ivf_header = 1; + ret = ctx->ops->start_streaming(ctx); if (ctx->inst_type == CODA_INST_DECODER) { if (ret == -EAGAIN) @@ -2246,9 +2338,25 @@ static int coda_s_ctrl(struct v4l2_ctrl *ctrl) ctx->params.h264_chroma_qp_index_offset = ctrl->val; break; case V4L2_CID_MPEG_VIDEO_H264_PROFILE: - /* TODO: switch between baseline and constrained baseline */ - if (ctx->inst_type == CODA_INST_ENCODER) + if (ctx->dev->devtype->product == CODA_988 && + ctx->inst_type == CODA_INST_ENCODER) { + switch (ctrl->val) { + case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE: + ctx->params.h264_profile_idc = 66; + break; + case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN: + ctx->params.h264_profile_idc = 77; + break; + case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH: + ctx->params.h264_profile_idc = 100; + break; + default: + return -EINVAL; + } + } else if (ctx->inst_type == CODA_INST_ENCODER) { + /* TODO: switch between baseline and constrained baseline */ ctx->params.h264_profile_idc = 66; + } break; case V4L2_CID_MPEG_VIDEO_H264_LEVEL: /* nothing to do, this is set by the encoder */ @@ -2298,6 +2406,64 @@ static int coda_s_ctrl(struct v4l2_ctrl *ctrl) case V4L2_CID_MPEG_VIDEO_VBV_SIZE: ctx->params.vbv_size = min(ctrl->val * 8192, 0x7fffffff); break; + case V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE: + ctx->params.frame_skip_mode = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP: + ctx->params.h264_min_i_qp = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP: + ctx->params.h264_max_i_qp = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP: + ctx->params.h264_min_p_qp = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP: + ctx->params.h264_max_p_qp = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE: + ctx->params.h264_entropy_mode = ctrl->val; + ctx->params.entropy_mode_changed = true; + break; + case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: + ctx->params.bitrate_mode = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM: + ctx->params.h264_en_8x8_transform = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_H264_I_PERIOD: + ctx->params.h264_i_frame_period = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_AU_DELIMITER: + ctx->params.encode_aud_en = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_MV_H_SEARCH_RANGE: + ctx->params.me_search_range_x = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE: + ctx->params.me_search_range_y = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP: + ctx->params.h263_intra_qp = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP: + ctx->params.h263_inter_qp = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_H263_MIN_QP: + ctx->params.h263_min_qp = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_H263_MAX_QP: + ctx->params.h263_max_qp = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP: + ctx->params.mpeg4_min_qp = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP: + ctx->params.mpeg4_max_qp = ctrl->val; + break; + case V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD: + ctx->params.max_intra_size = ctrl->val; + break; default: coda_dbg(1, ctx, "Invalid control, id=%d, val=%d\n", ctrl->id, ctrl->val); @@ -2313,12 +2479,17 @@ static const struct v4l2_ctrl_ops coda_ctrl_ops = { static void coda_encode_ctrls(struct coda_ctx *ctx) { - int max_gop_size = (ctx->dev->devtype->product == CODA_DX6) ? 60 : 99; - u32 def_gamma = (ctx->dev->devtype->product == CODA_960) ? - CODA9_DEFAULT_GAMMA : CODA_DEFAULT_GAMMA; + int max_gop_size = (ctx->dev->devtype->product == CODA_DX6) ? + CODADX6_MAX_GOP_SIZE : CODA_MAX_GOP_SIZE; + u32 def_gamma = (ctx->dev->devtype->product == CODA_988 ? + CODA988_DEFAULT_GAMMA : + (ctx->dev->devtype->product == CODA_960) ? + CODA9_DEFAULT_GAMMA : CODA_DEFAULT_GAMMA); + u32 max_bitrate = (ctx->dev->devtype->product == CODA_988) ? + CODA988_MAX_BITRATE : CODA_MAX_BITRATE; v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, - V4L2_CID_MPEG_VIDEO_BITRATE, 0, 32767000, 1000, 0); + V4L2_CID_MPEG_VIDEO_BITRATE, 0, max_bitrate, 1000, 0); v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, V4L2_CID_GAMMA, 0, 0x7FFFFFFF, 1, def_gamma); v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, @@ -2350,10 +2521,20 @@ static void coda_encode_ctrls(struct coda_ctx *ctx) V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE, 0, 1, 1, 1); v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET, -12, 12, 1, 0); - v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, - V4L2_CID_MPEG_VIDEO_H264_PROFILE, - V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE, 0x0, - V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE); + if (ctx->dev->devtype->product == CODA_988) { + v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H264_PROFILE, + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, + ~((1 << V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) | + (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) | + (1 << V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)), + V4L2_MPEG_VIDEO_H264_PROFILE_MAIN); + } else { + v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H264_PROFILE, + V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE, 0x0, + V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE); + } if (ctx->dev->devtype->product == CODA_HX4 || ctx->dev->devtype->product == CODA_7541) { v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, @@ -2377,6 +2558,21 @@ static void coda_encode_ctrls(struct coda_ctx *ctx) (1 << V4L2_MPEG_VIDEO_H264_LEVEL_4_1) | (1 << V4L2_MPEG_VIDEO_H264_LEVEL_4_2)), V4L2_MPEG_VIDEO_H264_LEVEL_4_0); + } else if (ctx->dev->devtype->product == CODA_988) { + v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H264_LEVEL, + V4L2_MPEG_VIDEO_H264_LEVEL_5_1, + ~((1 << V4L2_MPEG_VIDEO_H264_LEVEL_1_0) | + (1 << V4L2_MPEG_VIDEO_H264_LEVEL_2_0) | + (1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_0) | + (1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_1) | + (1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_2) | + (1 << V4L2_MPEG_VIDEO_H264_LEVEL_4_0) | + (1 << V4L2_MPEG_VIDEO_H264_LEVEL_4_1) | + (1 << V4L2_MPEG_VIDEO_H264_LEVEL_4_2) | + (1 << V4L2_MPEG_VIDEO_H264_LEVEL_5_0) | + (1 << V4L2_MPEG_VIDEO_H264_LEVEL_5_1)), + V4L2_MPEG_VIDEO_H264_LEVEL_5_0); } v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP, 1, 31, 1, 15); @@ -2388,7 +2584,8 @@ static void coda_encode_ctrls(struct coda_ctx *ctx) V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE); if (ctx->dev->devtype->product == CODA_HX4 || ctx->dev->devtype->product == CODA_7541 || - ctx->dev->devtype->product == CODA_960) { + ctx->dev->devtype->product == CODA_960 || + ctx->dev->devtype->product == CODA_988) { v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL, V4L2_MPEG_VIDEO_MPEG4_LEVEL_5, @@ -2412,14 +2609,81 @@ static void coda_encode_ctrls(struct coda_ctx *ctx) v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB, 0, 1920 * 1088 / 256, 1, 0); - v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, - V4L2_CID_MPEG_VIDEO_VBV_DELAY, 0, 0x7fff, 1, 0); + if (ctx->dev->devtype->product == CODA_988) { + /* 20 to 200(ms) : Low latency coding + * more than 200(ms): Normal delay coding + */ + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_VBV_DELAY, 20, 0x7fff, 1, 200); + } else { + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_VBV_DELAY, 0, 0x7fff, 1, 0); + } /* * The maximum VBV size value is 0x7fffffff bits, * one bit less than 262144 KiB */ v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_VBV_SIZE, 0, 262144, 1, 0); + + if (ctx->dev->devtype->product == CODA_988) { + v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_BITRATE_MODE, + V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, + ~((1 << V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) | + (1 << V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)), + V4L2_MPEG_VIDEO_BITRATE_MODE_VBR); + v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE, + V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT, + ~((1 << V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED) | + (1 << V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_LEVEL_LIMIT) | + (1 << V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT)), + V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP, 0, 51, 1, 20); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP, 0, 51, 1, 40); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP, 0, 51, 1, 20); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP, 0, 51, 1, 40); + v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE, + V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC, + ~((1 << V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC) | + (1 << V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC)), + V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM, + 0, 1, 1, 0); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H264_I_PERIOD, + 0, 2047, 1, 0); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_AU_DELIMITER, + 0, 1, 1, 0); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_MV_H_SEARCH_RANGE, + 0, 3, 1, 0); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE, + 0, 2, 1, 0); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP, 1, 31, 1, 15); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP, 1, 31, 1, 15); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H263_MIN_QP, 1, 31, 1, 15); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H263_MAX_QP, 1, 31, 1, 25); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP, 1, 31, 1, 15); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP, 1, 31, 1, 25); + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD, 0, 0xFFFF, 1, 0); + } } static void coda_jpeg_encode_ctrls(struct coda_ctx *ctx) @@ -2434,13 +2698,27 @@ static void coda_decode_ctrls(struct coda_ctx *ctx) { u8 max; - ctx->h264_profile_ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrls, - &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_PROFILE, - V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, - ~((1 << V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) | - (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) | - (1 << V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)), - V4L2_MPEG_VIDEO_H264_PROFILE_HIGH); + if (ctx->dev->devtype->product != CODA_988) { + ctx->h264_profile_ctrl = + v4l2_ctrl_new_std_menu(&ctx->ctrls, + &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_PROFILE, + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, + ~((1 << V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) | + (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) | + (1 << V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)), + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH); + } else { + ctx->h264_profile_ctrl = + v4l2_ctrl_new_std_menu(&ctx->ctrls, + &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_PROFILE, + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, + ~((1 << V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) | + (1 << V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) | + (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) | + (1 << V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)), + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH); + } + if (ctx->h264_profile_ctrl) ctx->h264_profile_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; @@ -2449,6 +2727,8 @@ static void coda_decode_ctrls(struct coda_ctx *ctx) max = V4L2_MPEG_VIDEO_H264_LEVEL_4_0; else if (ctx->dev->devtype->product == CODA_960) max = V4L2_MPEG_VIDEO_H264_LEVEL_4_1; + else if (ctx->dev->devtype->product == CODA_988) + max = V4L2_MPEG_VIDEO_H264_LEVEL_5_1; else /* CODA_DX6 */ max = V4L2_MPEG_VIDEO_H264_LEVEL_3_0; ctx->h264_level_ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrls, @@ -2664,6 +2944,7 @@ static int coda_open(struct file *file) if (enable_bwb || ctx->inst_type == CODA_INST_ENCODER) ctx->frame_mem_ctrl = CODA9_FRAME_ENABLE_BWB; fallthrough; + case CODA_988: case CODA_HX4: case CODA_7541: ctx->reg_idx = 0; @@ -2806,6 +3087,16 @@ static int coda_hw_init(struct coda_dev *dev) if (ret) goto err_reset; + if (dev->devtype->product == CODA_988) { + /* Reset at init stage */ + ret = coda988_hw_init_reset(dev); + if (ret) + goto err_reset; + + coda_write(dev, 0, CODA_REG_BIT_INT_ENABLE); + coda_write(dev, 0, CODA_REG_BIT_CODE_RUN); + } + /* * Copy the first CODA_ISRAM_SIZE in the internal SRAM. * The 16-bit chars in the code buffer are in memory access @@ -2835,7 +3126,8 @@ static int coda_hw_init(struct coda_dev *dev) /* Tell the BIT where to find everything it needs */ if (dev->devtype->product == CODA_960 || dev->devtype->product == CODA_7541 || - dev->devtype->product == CODA_HX4) { + dev->devtype->product == CODA_HX4 || + dev->devtype->product == CODA_988) { coda_write(dev, dev->tempbuf.paddr, CODA_REG_BIT_TEMP_BUF_ADDR); coda_write(dev, 0, CODA_REG_BIT_BIT_STREAM_PARAM); @@ -2845,7 +3137,8 @@ static int coda_hw_init(struct coda_dev *dev) } coda_write(dev, dev->codebuf.paddr, CODA_REG_BIT_CODE_BUF_ADDR); - coda_write(dev, 0, CODA_REG_BIT_CODE_RUN); + if (dev->devtype->product != CODA_988) + coda_write(dev, 0, CODA_REG_BIT_CODE_RUN); /* Set default values */ switch (dev->devtype->product) { @@ -2860,23 +3153,48 @@ static int coda_hw_init(struct coda_dev *dev) if (dev->devtype->product == CODA_960) coda_write(dev, CODA9_FRAME_ENABLE_BWB, CODA_REG_BIT_FRAME_MEM_CTRL); + else if (dev->devtype->product == CODA_988) + coda_write(dev, CODA988_FRAME_ENABLE_BWB, + CODA_REG_BIT_FRAME_MEM_CTRL); else coda_write(dev, 0, CODA_REG_BIT_FRAME_MEM_CTRL); if (dev->devtype->product != CODA_DX6) coda_write(dev, 0, CODA7_REG_BIT_AXI_SRAM_USE); - coda_write(dev, CODA_INT_INTERRUPT_ENABLE, - CODA_REG_BIT_INT_ENABLE); + if (dev->devtype->product == CODA_988) { + coda_write(dev, 0, CODA9_REG_BIT_RESET_CTRL); + data = CODA988_INT_BIT_BIT_BUF_FULL | + CODA988_INT_BIT_BIT_BUF_EMPTY | + CODA988_INT_BIT_DEC_MB_ROWS | + CODA988_INT_BIT_DEC_FIELD | + CODA988_INT_BIT_PIC_RUN; + coda_write(dev, data, CODA_REG_BIT_INT_ENABLE); + coda_write(dev, CODA_REG_BIT_INT_CLEAR_SET, CODA_REG_BIT_INT_CLEAR); + } else { + coda_write(dev, CODA_INT_INTERRUPT_ENABLE, + CODA_REG_BIT_INT_ENABLE); + } /* Reset VPU and start processor */ - data = coda_read(dev, CODA_REG_BIT_CODE_RESET); - data |= CODA_REG_RESET_ENABLE; - coda_write(dev, data, CODA_REG_BIT_CODE_RESET); - usleep_range(10, 20); - data &= ~CODA_REG_RESET_ENABLE; - coda_write(dev, data, CODA_REG_BIT_CODE_RESET); - coda_write(dev, CODA_REG_RUN_ENABLE, CODA_REG_BIT_CODE_RUN); + if (dev->devtype->product == CODA_988) { + coda_write(dev, CODA_REG_BIT_BUSY_FLAG, CODA_REG_BIT_BUSY); + coda_write(dev, CODA_REG_RESET_ENABLE, CODA_REG_BIT_CODE_RESET); + coda_write(dev, CODA_REG_RUN_ENABLE, CODA_REG_BIT_CODE_RUN); + ret = coda_wait_timeout(dev, CODA_REG_BIT_BUSY); + if (ret) { + dev_err(dev->dev, "Error! Timeout during reset and start BPU\n"); + goto err_clk_ahb; + } + } else { + data = coda_read(dev, CODA_REG_BIT_CODE_RESET); + data |= CODA_REG_RESET_ENABLE; + coda_write(dev, data, CODA_REG_BIT_CODE_RESET); + usleep_range(10, 20); + data &= ~CODA_REG_RESET_ENABLE; + coda_write(dev, data, CODA_REG_BIT_CODE_RESET); + coda_write(dev, CODA_REG_RUN_ENABLE, CODA_REG_BIT_CODE_RUN); + } clk_disable_unprepare(dev->clk_ahb); clk_disable_unprepare(dev->clk_per); diff --git a/drivers/media/platform/chips-media/coda/coda-gdi.c b/drivers/media/platform/chips-media/coda/coda-gdi.c index 59d65daca153..9f1006f450b6 100644 --- a/drivers/media/platform/chips-media/coda/coda-gdi.c +++ b/drivers/media/platform/chips-media/coda/coda-gdi.c @@ -107,6 +107,116 @@ static const u16 rbc2axi_tiled_map[32] = { RBC(RA, 15, ZERO, 0), }; +#define XY2AXI(inv, zero, tbx, xy, bit) \ + ((inv) << 7 | (zero) << 6 | (tbx) << 5 | (XY2_##xy) | (bit)) + +#define XY2AXI_ZERO 1 + +static const u32 xy2axi_zero_map[32] = { + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), +}; + +static const u32 xy2axi_tiled_luma_map[32] = { + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, 0, 0, Y, 0), + XY2AXI(0, 0, 0, Y, 1), + XY2AXI(0, 0, 0, Y, 2), + XY2AXI(0, 0, 0, Y, 3), + XY2AXI(0, 0, 0, X, 3), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), +}; + +static const u32 xy2axi_tiled_chroma_map[32] = { + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, 0, 0, Y, 0), + XY2AXI(0, 0, 0, Y, 1), + XY2AXI(0, 0, 0, Y, 2), + XY2AXI(0, 0, 0, X, 3), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), + XY2AXI(0, XY2AXI_ZERO, 0, X, 0), +}; + void coda_set_gdi_regs(struct coda_ctx *ctx) { struct coda_dev *dev = ctx->dev; @@ -144,3 +254,42 @@ void coda_set_gdi_regs(struct coda_ctx *ctx) CODA9_GDI_RBC2_AXI_0 + 4 * i); } } + +void coda988_set_gdi_regs(struct coda_ctx *ctx) +{ + struct coda_dev *dev = ctx->dev; + const u32 *xy2axi_lum_map, *xy2axi_chr_map; + u32 xy2axiConfig; + int i; + + switch (ctx->tiled_map_type) { + case GDI_LINEAR_FRAME_MAP: + default: + xy2axi_lum_map = xy2axi_zero_map; + xy2axi_chr_map = xy2axi_zero_map; + xy2axiConfig = 0; + break; + case GDI_TILED_FRAME_MB_RASTER_MAP: + /* + * mb_addr = mby*stride + mbx + * mb_addr mapping: + * luma : axi_addr[~:8] => axi_addr = {mb_addr[23:0],map_addr[7:0]} + * chroma : axi_addr[~:7] => axi_addr = {mb_addr[23:0],map_addr[6:0]} + */ + xy2axi_lum_map = xy2axi_tiled_luma_map; + xy2axi_chr_map = xy2axi_tiled_chroma_map; + xy2axiConfig = CODA9_XY2RBC_TILED_MAP | + CODA9_XY2RBC_CA_INC_HOR | + (0xF << CODA988_GDI_XY2AXI_GRAN_FRAME_LUM_SHIFT) | + (0x7 << CODA988_GDI_XY2AXI_GRAN_FRAME_CHR_SHIFT); + break; + } + + for (i = 0; i < 32; i++) + coda_write(dev, xy2axi_lum_map[i], CODA988_GDI_XY2AXI_LUM_BIT00 + 4 * i); + + for (i = 0; i < 32; i++) + coda_write(dev, xy2axi_chr_map[i], CODA988_GDI_XY2AXI_CHR_BIT00 + 4 * i); + + coda_write(dev, xy2axiConfig, CODA988_GDI_XY2AXI_CONFIG); +} diff --git a/drivers/media/platform/chips-media/coda/coda-h264.c b/drivers/media/platform/chips-media/coda/coda-h264.c index 8bd0aa8af114..b4cb14721da0 100644 --- a/drivers/media/platform/chips-media/coda/coda-h264.c +++ b/drivers/media/platform/chips-media/coda/coda-h264.c @@ -89,6 +89,16 @@ int coda_h264_profile(int profile_idc) } } +int coda_h264enc_profile_id(int profile_idc) +{ + switch (profile_idc) { + case 66: return 0; + case 77: return 1; + case 100: return 2; + default: return 2; + } +} + int coda_h264_level(int level_idc) { switch (level_idc) { diff --git a/drivers/media/platform/chips-media/coda/coda.h b/drivers/media/platform/chips-media/coda/coda.h index 007f56b24c61..9684b7069825 100644 --- a/drivers/media/platform/chips-media/coda/coda.h +++ b/drivers/media/platform/chips-media/coda/coda.h @@ -27,10 +27,18 @@ #include "coda_regs.h" #define CODA_MAX_FRAMEBUFFERS 19 +#define CODA988_MIN_FRAMEBUFFERS 8 #define FMO_SLICE_SAVE_BUF_SIZE (32) #define CODA_DEFAULT_GAMMA 4096 #define CODA9_DEFAULT_GAMMA 24576 /* 0.75 * 32768 */ +#define CODA988_DEFAULT_GAMMA 0 /* uses value defined in FW */ + +#define CODADX6_MAX_GOP_SIZE 60 +#define CODA_MAX_GOP_SIZE 99 + +#define CODA_MAX_BITRATE 32767000 +#define CODA988_MAX_BITRATE 262143000 /* * This control allows applications to read the per-stream @@ -54,6 +62,7 @@ enum coda_product { CODA_HX4 = 0xf00a, CODA_7541 = 0xf012, CODA_960 = 0xf020, + CODA_988 = 0xcc28, }; struct coda_video_device; @@ -133,6 +142,8 @@ struct coda_params { u8 mpeg2_level_idc; u8 mpeg4_intra_qp; u8 mpeg4_inter_qp; + u8 h263_intra_qp; + u8 h263_inter_qp; u8 gop_size; int intra_refresh; enum v4l2_jpeg_chroma_subsampling jpeg_chroma_subsampling; @@ -148,7 +159,7 @@ struct coda_params { int codec_mode_aux; enum v4l2_mpeg_video_multi_slice_mode slice_mode; u32 framerate; - u16 bitrate; + u32 bitrate; u16 vbv_delay; u32 vbv_size; u32 slice_max_bits; @@ -163,6 +174,25 @@ struct coda_params { bool slice_mode_changed; bool frame_rc_enable; bool mb_rc_enable; + bool entropy_mode_changed; + u8 bitrate_mode; + u32 frame_skip_mode; + u8 h264_min_i_qp; + u8 h264_max_i_qp; + u8 h264_min_p_qp; + u8 h264_max_p_qp; + u8 h264_entropy_mode; + u8 h264_en_8x8_transform; + int h264_i_frame_period; + bool encode_aud_en; + u8 me_search_range_x; + u8 me_search_range_y; + u8 h263_min_qp; + u8 h263_max_qp; + u8 mpeg4_min_qp; + u8 mpeg4_max_qp; + u32 max_intra_size; + u8 vp8_fill_ivf_header; }; struct coda_buffer_meta { @@ -269,6 +299,7 @@ struct coda_ctx { struct coda_aux_buf parabuf; struct coda_aux_buf psbuf; struct coda_aux_buf slicebuf; + struct coda_aux_buf vp8mbbuf; struct coda_internal_frame internal_frames[CODA_MAX_FRAMEBUFFERS]; struct list_head buffer_meta_list; spinlock_t buffer_meta_lock; @@ -325,6 +356,7 @@ int coda_hw_reset(struct coda_ctx *ctx); void coda_fill_bitstream(struct coda_ctx *ctx, struct list_head *buffer_list); void coda_set_gdi_regs(struct coda_ctx *ctx); +void coda988_set_gdi_regs(struct coda_ctx *ctx); static inline struct coda_q_data *get_q_data(struct coda_ctx *ctx, enum v4l2_buf_type type) @@ -369,6 +401,7 @@ void coda_m2m_buf_done(struct coda_ctx *ctx, struct vb2_v4l2_buffer *buf, int coda_h264_filler_nal(int size, char *p); int coda_h264_padding(int size, char *p); int coda_h264_profile(int profile_idc); +int coda_h264enc_profile_id(int profile_idc); int coda_h264_level(int level_idc); int coda_sps_parse_profile(struct coda_ctx *ctx, struct vb2_buffer *vb); int coda_h264_sps_fixup(struct coda_ctx *ctx, int width, int height, char *buf, @@ -395,6 +428,7 @@ bool coda_jpeg_check_buffer(struct coda_ctx *ctx, struct vb2_buffer *vb); int coda_jpeg_decode_header(struct coda_ctx *ctx, struct vb2_buffer *vb); int coda_jpeg_write_tables(struct coda_ctx *ctx); void coda_set_jpeg_compression_quality(struct coda_ctx *ctx, int quality); +int coda988_hw_init_reset(struct coda_dev *dev); extern const struct coda_context_ops coda_bit_encode_ops; extern const struct coda_context_ops coda_bit_decode_ops; @@ -404,4 +438,5 @@ extern const struct coda_context_ops coda9_jpeg_decode_ops; irqreturn_t coda_irq_handler(int irq, void *data); irqreturn_t coda9_jpeg_irq_handler(int irq, void *data); +int coda_wait_timeout(struct coda_dev *dev, uint32_t reg_busy); #endif /* __CODA_H__ */ diff --git a/drivers/media/platform/chips-media/coda/coda_regs.h b/drivers/media/platform/chips-media/coda/coda_regs.h index db81a904cf3f..eb74c25b6d92 100644 --- a/drivers/media/platform/chips-media/coda/coda_regs.h +++ b/drivers/media/platform/chips-media/coda/coda_regs.h @@ -10,6 +10,8 @@ #ifndef _REGS_CODA_H_ #define _REGS_CODA_H_ +#include + /* HW registers */ #define CODA_REG_BIT_CODE_RUN 0x000 #define CODA_REG_RUN_ENABLE (1 << 0) @@ -41,6 +43,8 @@ #define CODADX6_STREAM_BUF_PIC_RESET (1 << 3) #define CODA7_STREAM_BUF_PIC_FLUSH (1 << 3) #define CODADX6_STREAM_BUF_PIC_FLUSH (1 << 2) +#define CODA9_STREAM_BUF_LINEBUF_EN BIT(6) +#define CODA9_STREAM_BUF_RUNGBUF_EN BIT(5) #define CODA7_STREAM_BUF_DYNALLOC_EN (1 << 5) #define CODADX6_STREAM_BUF_DYNALLOC_EN (1 << 4) #define CODADX6_STREAM_CHKDIS_OFFSET (1 << 1) @@ -48,8 +52,26 @@ #define CODA_STREAM_ENDIAN_SELECT (1 << 0) #define CODA_REG_BIT_FRAME_MEM_CTRL 0x110 #define CODA9_FRAME_ENABLE_BWB (1 << 12) +#define CODA988_FRAME_ENABLE_BWB BIT(15) #define CODA9_FRAME_TILED2LINEAR (1 << 11) +#define CODA988_FRAME_TILED2LINEAR_MASK GENMASK(14, 13) +#define CODA988_FRAME_TILED2LINEAR_FRAME_MAP BIT(13) +#define CODA988_FRAME_TILED2LINEAR_FIELD_MAP BIT(14) +#define CODA988_FRAME_TILED_MAP_MASK GENMASK(12, 9) +#define CODA988_FRAME_TILED_MAP_LINEAR_FRAME (0 << 9) +#define CODA988_FRAME_TILED_MAP_TILED_FRAME_V BIT(9) +#define CODA988_FRAME_TILED_MAP_TILED_FRAME_H (2 << 9) +#define CODA988_FRAME_TILED_MAP_TILED_FIELD_V (3 << 9) +#define CODA988_FRAME_TILED_MAP_TILED_MIXED_V (4 << 9) +#define CODA988_FRAME_TILED_MAP_TILED_FRAME_MB_RAST (5 << 9) +#define CODA988_FRAME_TILED_MAP_TILED_FIELD_MB_RAST (6 << 9) +#define CODA988_FRAME_TILED_MAP_TILED_FRAME_NO_BANK (7 << 9) +#define CODA988_FRAME_TILED_MAP_TILED_FIELD_NO_BANK (8 << 9) +#define CODA988_FRAME_TILED_MAP_LINEAR_FIELD (9 << 9) +#define CODA988_FRAME_MONOCHROME_YUV400_SELECT BIT(6) +#define CODA988_FRAME_CHROMA_NV21_SWAP BIT(3) #define CODA_FRAME_CHROMA_INTERLEAVE (1 << 2) +#define CODA988_IMAGE_64BIT_BIGENDIAN_SELECT BIT(1) #define CODA_IMAGE_ENDIAN_SELECT (1 << 0) #define CODA_REG_BIT_BIT_STREAM_PARAM 0x114 #define CODA_BIT_STREAM_END_FLAG (1 << 2) @@ -57,6 +79,7 @@ #define CODA_REG_BIT_TEMP_BUF_ADDR 0x118 #define CODA_REG_BIT_RD_PTR(x) (0x120 + 8 * (x)) #define CODA_REG_BIT_WR_PTR(x) (0x124 + 8 * (x)) +#define CODA9_REG_BIT_RESET_CTRL 0x128 #define CODA_REG_BIT_FRM_DIS_FLG(x) (0x150 + 4 * (x)) #define CODADX6_REG_BIT_SEARCH_RAM_BASE_ADDR 0x140 #define CODA7_REG_BIT_AXI_SRAM_USE 0x140 @@ -124,6 +147,12 @@ #define CODA_MODE_INVALID 0xffff #define CODA_REG_BIT_INT_ENABLE 0x170 #define CODA_INT_INTERRUPT_ENABLE (1 << 3) +#define CODA988_INT_BIT_SEQ_INIT BIT(1) +#define CODA988_INT_BIT_PIC_RUN BIT(3) +#define CODA988_INT_BIT_DEC_FIELD BIT(10) +#define CODA988_INT_BIT_DEC_MB_ROWS BIT(13) +#define CODA988_INT_BIT_BIT_BUF_EMPTY BIT(14) +#define CODA988_INT_BIT_BIT_BUF_FULL BIT(15) #define CODA_REG_BIT_INT_REASON 0x174 #define CODA7_REG_BIT_RUN_AUX_STD 0x178 #define CODA_MP4_AUX_MPEG4 0 @@ -152,14 +181,17 @@ #define CODA_CMD_DEC_SEQ_SRC_SIZE 0x18c #define CODA_CMD_DEC_SEQ_START_BYTE 0x190 #define CODA_CMD_DEC_SEQ_PS_BB_START 0x194 +#define CODA988_CMD_DEC_SEQ_USER_DATA_OPTION 0x194 #define CODA_CMD_DEC_SEQ_PS_BB_SIZE 0x198 #define CODA_CMD_DEC_SEQ_JPG_THUMB_EN 0x19c #define CODA_CMD_DEC_SEQ_MP4_ASP_CLASS 0x19c #define CODA_MP4_CLASS_MPEG4 0 #define CODA_CMD_DEC_SEQ_X264_MV_EN 0x19c #define CODA_CMD_DEC_SEQ_SPP_CHUNK_SIZE 0x1a0 +#define CODA988_CMD_DEC_SEQ_USER_DATA_BASE_ADDR 0x1ac #define CODA7_RET_DEC_SEQ_ASPECT 0x1b0 +#define CODA988_CMD_DEC_SEQ_USER_DATA_BUF_SIZE 0x1b0 #define CODA9_RET_DEC_SEQ_BITRATE 0x1b4 #define CODA_RET_DEC_SEQ_SUCCESS 0x1c0 #define CODA_RET_DEC_SEQ_SRC_FMT 0x1c4 /* SRC_SIZE on CODA7 */ @@ -189,6 +221,9 @@ #define CODA9_CMD_DEC_PIC_ROT_ADDR_CB 0x18c #define CODA_CMD_DEC_PIC_ROT_STRIDE 0x190 #define CODA9_CMD_DEC_PIC_ROT_ADDR_CR 0x190 +#define CODA988_CMD_DEC_PIC_ROT_BOTTOM_Y 0x1E8 +#define CODA988_CMD_DEC_PIC_ROT_BOTTOM_CB 0x1EC +#define CODA988_CMD_DEC_PIC_ROT_BOTTOM_CR 0x1F0 #define CODA9_CMD_DEC_PIC_ROT_STRIDE 0x1b8 #define CODA_CMD_DEC_PIC_OPTION 0x194 @@ -197,10 +232,14 @@ #define CODA_PRE_SCAN_MODE_RETURN (1 << 1) #define CODA_IFRAME_SEARCH_EN (1 << 2) #define CODA_SKIP_FRAME_MODE (0x3 << 3) +#define CODA988_UDATA_REPORT_INT_DISABLE BIT(10) #define CODA_CMD_DEC_PIC_SKIP_NUM 0x198 #define CODA_CMD_DEC_PIC_CHUNK_SIZE 0x19c #define CODA_CMD_DEC_PIC_BB_START 0x1a0 #define CODA_CMD_DEC_PIC_START_BYTE 0x1a4 +#define CODA988_CMD_DEC_PIC_USER_DATA_BASE_ADDR 0x1ac +#define CODA988_CMD_DEC_PIC_USER_DATA_BUF_SIZE 0x1b0 +#define CODA988_CMD_DEC_PIC_NUM_ROWS 0x1b4 #define CODA_RET_DEC_PIC_SIZE 0x1bc #define CODA_RET_DEC_PIC_FRAME_NUM 0x1c0 #define CODA_RET_DEC_PIC_FRAME_IDX 0x1c4 @@ -227,6 +266,9 @@ #define CODA9_RET_DEC_PIC_FRATE_NR 0x1f4 #define CODA9_RET_DEC_PIC_FRATE_DR 0x1f8 +/* Decoder Set Fram Buffer */ +#define CODA988_RET_SET_FRAME_SUCCESS 0x1c0 + /* Encoder Sequence Initialization */ #define CODA_CMD_ENC_SEQ_BB_START 0x180 #define CODA_CMD_ENC_SEQ_BB_SIZE 0x184 @@ -252,6 +294,7 @@ #define CODA_STD_H263 1 #define CODA_STD_H264 2 #define CODA9_STD_MPEG4 3 +#define CODA9_STD_H263 11 #define CODA_CMD_ENC_SEQ_SRC_SIZE 0x190 #define CODA7_PICWIDTH_OFFSET 16 @@ -298,6 +341,8 @@ #define CODA_SLICING_SIZE_MASK 0x3fffffff #define CODA_SLICING_UNIT_OFFSET 1 #define CODA_SLICING_UNIT_MASK 0x01 +#define CODA988_SLICING_UNIT_OFFSET 0 +#define CODA988_SLICING_UNIT_MASK 0x03 #define CODA_SLICING_MODE_OFFSET 0 #define CODA_SLICING_MODE_MASK 0x01 #define CODA_CMD_ENC_SEQ_GOP_SIZE 0x1a8 @@ -306,9 +351,12 @@ #define CODA_CMD_ENC_SEQ_RC_PARA 0x1ac #define CODA_RATECONTROL_AUTOSKIP_OFFSET 31 #define CODA_RATECONTROL_AUTOSKIP_MASK 0x01 +#define CODA_RATECONTROL_AUTOSKIP_DISABLE(x) (((x) & 0x1) << 31) #define CODA_RATECONTROL_INITIALDELAY_OFFSET 16 #define CODA_RATECONTROL_INITIALDELAY_MASK 0x7fff +#define CODA_RATECONTROL_INITIALDELAY(x) (((x) & 0x7fff) << 16) #define CODA_RATECONTROL_BITRATE_OFFSET 1 +#define CODA9_RATECONTROL_BITRATE_OFFSET 4 #define CODA_RATECONTROL_BITRATE_MASK 0x7fff #define CODA_RATECONTROL_ENABLE_OFFSET 0 #define CODA_RATECONTROL_ENABLE_MASK 0x01 @@ -323,17 +371,35 @@ #define CODA7_CMD_ENC_SEQ_SEARCH_BASE 0x1b8 #define CODA7_CMD_ENC_SEQ_SEARCH_SIZE 0x1bc #define CODA7_CMD_ENC_SEQ_INTRA_QP 0x1c4 +#define CODA9_CMD_ENC_SEQ_INTRA_QP 0x1c4 #define CODA_CMD_ENC_SEQ_RC_QP_MIN_MAX 0x1c8 #define CODA_QPMIN_OFFSET 8 #define CODA_QPMIN_MASK 0x3f #define CODA_QPMAX_OFFSET 0 #define CODA_QPMAX_MASK 0x3f +#define CODA988_CMD_ENC_SEQ_RC_QP_MAX 0x1c8 #define CODA_CMD_ENC_SEQ_RC_GAMMA 0x1cc #define CODA_GAMMA_OFFSET 0 #define CODA_GAMMA_MASK 0xffff #define CODA_CMD_ENC_SEQ_RC_INTERVAL_MODE 0x1d0 #define CODA9_CMD_ENC_SEQ_INTRA_WEIGHT 0x1d4 #define CODA9_CMD_ENC_SEQ_ME_OPTION 0x1d8 +#define CODA9_CMD_ENC_SEQ_ME_SEARCH_RANGE_X(x) (((x) & 0x3) << 0) +#define CODA9_CMD_ENC_SEQ_ME_SEARCH_RANGE_Y(x) (((x) & 0x3) << 2) +#define CODA9_CMD_ENC_SEQ_ME_USE_ZERO_PMV(x) (((x) & 0x1) << 4) +#define CODA9_CMD_ENC_SEQ_ME_BLK_MODE_EN(x) (((x) & 0xF) << 5) +#define CODA9_CMD_ENC_SEQ_ME_LINE_BUF_MODE(x) (((x) & 0x7) << 9) +#define CODA988_CMD_ENC_SEQ_RC_PARA2 0x1DC +#define CODA988_CMD_RC_PARA2_RC_TYPE(x) (((x) & 0xF) << 0) +#define CODA988_CMD_RC_PARA2_BITRATE(x) (((x) & 0x3FFFF) << 4) +#define CODA988_RC_MODE_OFF 0 +#define CODA988_RC_MODE_CBR 1 +#define CODA988_RC_MODE_ABR 2 +#define CODA988_RC_MODE_VENDOR 4 +#define CODA988_CMD_ENC_SEQ_QP_RANGE_SET 0x1E0 +#define CODA988_CMD_ENC_SEQ_RC_MAX_INTRA_SIZE 0x1F0 +#define CODA988_CMD_ENC_SEQ_DELTA_QP 0x1F4 + #define CODA_RET_ENC_SEQ_SUCCESS 0x1c0 #define CODA_CMD_ENC_SEQ_JPG_PARA 0x198 @@ -351,6 +417,9 @@ #define CODA_PARAM_CHANGE_INTRA_MB_NUM BIT(4) #define CODA_PARAM_CHANGE_SLICE_MODE BIT(5) #define CODA_PARAM_CHANGE_HEC_MODE BIT(6) +#define CODA988_ENC_CHANGE_PARAM_CABAC_MODE BIT(7) +#define CODA988_ENC_CHANGE_PARAM_PPS_ID BIT(11) +#define CODA988_ENC_CHANGE_PARAM_PIC_PARAM BIT(14) #define CODA_CMD_ENC_PARAM_RC_GOP 0x184 #define CODA_CMD_ENC_PARAM_RC_INTRA_QP 0x188 #define CODA_CMD_ENC_PARAM_RC_BITRATE 0x18c @@ -358,6 +427,9 @@ #define CODA_CMD_ENC_PARAM_INTRA_MB_NUM 0x194 #define CODA_CMD_ENC_PARAM_SLICE_MODE 0x198 #define CODA_CMD_ENC_PARAM_HEC_MODE 0x19c +#define CODA988_CMD_ENC_PARAM_CHANGE_CABAC_MODE 0x1a0 +#define CODA988_CMD_ENC_PARAM_CHANGE_PPS_ID 0x1b4 +#define CODA988_CMD_ENC_PARAM_CHANGE_MIN_MAX_QP 0x1bC #define CODA_RET_ENC_PARAM_CHANGE_SUCCESS 0x1c0 /* Encoder Picture Run */ @@ -370,6 +442,14 @@ #define CODA_CMD_ENC_PIC_SRC_ADDR_Y 0x180 #define CODA_CMD_ENC_PIC_SRC_ADDR_CB 0x184 #define CODA_CMD_ENC_PIC_SRC_ADDR_CR 0x188 +#define CODA988_CMD_ENC_PIC_TARGET_BIT 0x1C0 +#define CODA988_CMD_ENC_PIC_QP 0x1C8 +#define CODA988_CMD_ENC_PIC_RC_BUF_SIZE 0x1CC +#define CODA988_CMD_ENC_PIC_RC_BUF_LEVEL 0x1C8 +#define CODA988_CMD_ENC_PIC_RC_QP 0x1D4 +#define CODA988_CMD_ENC_PIC_SRC_BOTTOM_Y 0x1E8 +#define CODA988_CMD_ENC_PIC_SRC_BOTTOM_CB 0x1EC +#define CODA988_CMD_ENC_PIC_SRC_BOTTOM_CR 0x1F0 #define CODA_CMD_ENC_PIC_QS 0x18c #define CODA_CMD_ENC_PIC_ROT_MODE 0x190 #define CODA_ROT_MIR_ENABLE (1 << 4) @@ -381,6 +461,17 @@ #define CODA_MIR_VER (0x1 << 2) #define CODA_MIR_HOR (0x2 << 2) #define CODA_MIR_VER_HOR (0x3 << 2) +#define CODA988_LONG_BURST_MODE BIT(4) +#define CODA988_DMA_MODE_1MB \ + FIELD_PREP(GENMASK(6, 5), 0) +#define CODA988_DMA_MODE_2MB \ + FIELD_PREP(GENMASK(6, 5), 1) +#define CODA988_DMA_MODE_8MB \ + FIELD_PREP(GENMASK(6, 5), 2) +#define CODA988_SEL_BIG_ENDIAN BIT(16) +#define CODA988_SEL_32BIT BIT(17) +#define CODA988_CBCR_INTERLIVE BIT(18) +#define CODA988_SELECT_NV21 BIT(21) #define CODA_CMD_ENC_PIC_OPTION 0x194 #define CODA_FORCE_IPICTURE BIT(1) #define CODA_REPORT_MB_INFO BIT(3) @@ -388,12 +479,17 @@ #define CODA_REPORT_SLICE_INFO BIT(5) #define CODA_CMD_ENC_PIC_BB_START 0x198 #define CODA_CMD_ENC_PIC_BB_SIZE 0x19c +#define CODA988_RET_ENC_PIC_RC 0x188 +#define CODA988_RET_ENC_PIC_USED_BIT 0x18c #define CODA_RET_ENC_FRAME_NUM 0x1c0 #define CODA_RET_ENC_PIC_TYPE 0x1c4 #define CODA_RET_ENC_PIC_FRAME_IDX 0x1c8 #define CODA_RET_ENC_PIC_SLICE_NUM 0x1cc #define CODA_RET_ENC_PIC_FLAG 0x1d0 #define CODA_RET_ENC_PIC_SUCCESS 0x1d8 +#define CODA988_RET_ENC_PIC_SKIPPED_MB_NUM 0x1dc +#define CODA988_RET_ENC_PIC_INTRA_MB_NUM 0x1e0 +#define CODA988_RET_ENC_PIC_SUM_QP 0x1e4 /* Set Frame Buffer */ #define CODA_CMD_SET_FRAME_BUF_NUM 0x180 @@ -418,7 +514,31 @@ #define CODA9_CACHE_LUMA_BUFFER_SIZE_OFFSET 16 #define CODA9_CACHE_CB_BUFFER_SIZE_OFFSET 8 #define CODA9_CACHE_CR_BUFFER_SIZE_OFFSET 0 +#define CODA988_CACHE_BYPASS_MC_ENABLE BIT(0) +#define CODA988_CACHE_MAP_TYPE_LINEAR (0 << 2) +#define CODA988_CACHE_MAP_TYPE_TILED BIT(2) +#define CODA988_CACHE_BURST_MODE_4 (0 << 3) +#define CODA988_CACHE_BURST_MODE_8 BIT(3) +#define CODA988_CACHE_CHROMA_INTERLEAVED_SZ_32_64 \ + FIELD_PREP(GENMASK(6, 5), 1) +#define CODA988_CACHE_CHROMA_INTERLEAVED_SZ_64_32 \ + FIELD_PREP(GENMASK(6, 5), 2) +#define CODA988_CACHE_CHROMA_INTERLEAVED_SZ_128_16 \ + FIELD_PREP(GENMASK(6, 5), 3) +#define CODA988_CACHE_CHROMA_SEPARATED_SZ_64_32 \ + FIELD_PREP(GENMASK(6, 5), 1) +#define CODA988_CACHE_CHROMA_SEPARATED_SZ_64_16 \ + FIELD_PREP(GENMASK(6, 5), 3) +#define CODA988_CACHE_LUMA_SZ_64_64 BIT(7) +#define CODA988_CACHE_LUMA_SZ_128_32 (3 << 7) +#define CODA988_CACHE_LINE_HORZ_PROC_NO_MERGE \ + FIELD_PREP(GENMASK(10, 9), 0) +#define CODA988_CACHE_LINE_VERT_PROC_NO_MERGE \ + FIELD_PREP(GENMASK(10, 9), 1) +#define CODA988_CACHE_LINE_VERT_PROC_MERGE \ + FIELD_PREP(GENMASK(10, 9), 3) #define CODA9_CMD_SET_FRAME_SUBSAMP_A_MVC 0x1b0 +#define CODA9_CMD_SET_FRAME_MB_BUF_BASE 0x1b0 #define CODA9_CMD_SET_FRAME_SUBSAMP_B_MVC 0x1b4 #define CODA9_CMD_SET_FRAME_DP_BUF_BASE 0x1b0 #define CODA9_CMD_SET_FRAME_DP_BUF_SIZE 0x1b4 @@ -430,14 +550,28 @@ #define CODA_GAMMA_OFFSET 0 #define CODA_HEADER_H264_SPS 0 #define CODA_HEADER_H264_PPS 1 +#define CODA_HEADER_H264_SPS_MVC 2 //Subset SPS rbsp for 2nd view +#define CODA_HEADER_H264_PPS_MVC 3 //PPS rbsp for 2nd view #define CODA_HEADER_MP4V_VOL 0 #define CODA_HEADER_MP4V_VOS 1 #define CODA_HEADER_MP4V_VIS 2 #define CODA9_HEADER_FRAME_CROP (1 << 3) +#define CODA988_HEADER_FRAME_CROP BIT(2) +#define CODA988_HEADER_USER_LEVEL_ENABLE BIT(4) +#define CODA988_HEADER_USER_LEVEL(x) (((x) & 0xff) << 8) #define CODA_CMD_ENC_HEADER_BB_START 0x184 #define CODA_CMD_ENC_HEADER_BB_SIZE 0x188 #define CODA9_CMD_ENC_HEADER_FRAME_CROP_H 0x18c #define CODA9_CMD_ENC_HEADER_FRAME_CROP_V 0x190 +#define CODA988_CMD_ENC_HEADER_CABAC_MODE 0x194 +#define CODA988_CMD_ENC_HEADER_CABAC_INIT_IDC 0x198 +#define CODA988_CMD_ENC_HEADER_TRANSFORM_8X8 0x19C +#define CODA988_CMD_ENC_HEADER_CHROMA_FORMAT 0x1A0 +#define CODA988_CMD_ENC_HEADER_FIELD_FLAG 0x1A4 +#define CODA988_CMD_ENC_HEADER_PROFILE 0x1A8 +#define CODA988_CMD_ENC_HEADER_SVC_SEI_INFO1 0x1B4 +#define CODA988_CMD_ENC_HEADER_SVC_SEI_INFO2 0x1B8 +#define CODA988_CMD_ENC_HEADER_FRAME 0x1BC /* Get Version */ #define CODA_CMD_FIRMWARE_VERNUM 0x1c0 @@ -450,9 +584,23 @@ ((minor) << 8) | (release)) #define CODA9_CMD_FIRMWARE_CODE_REV 0x1c4 +#define CODA9_MBC_BASE 0x400 +/* + * This register controlled by internal DSP(bpu processor) in order to + * activate the pipeline of internal hw sub blocks. + */ +#define CODA9_MBC_SET_SUBBLK_EN (CODA9_MBC_BASE + 0x0A0) +/* + * MBC_SET_SUBBLK_EN[19:0]: enable bit for each subblock HW for encoder/decoder. + * MBC_SET_SUBBLK_EN[20]: control mode bit : 0 - auto, 1 - manual by host directly. + */ +#define CODA9_MBC_SET_SUBBLK_EN_MASK GENMASK(20, 0) +#define CODA9_MBC_SET_SUBBLK_EN_MANUAL BIT(20) + #define CODA9_GDMA_BASE 0x1000 #define CODA9_GDI_CONTROL (CODA9_GDMA_BASE + 0x034) #define CODA9_GDI_PIC_INIT_HOST (CODA9_GDMA_BASE + 0x038) +#define CODA9_GDI_BWB_STATUS (CODA9_GDMA_BASE + 0x07c) #define CODA9_GDI_STATUS (CODA9_GDMA_BASE + 0x080) #define CODA9_GDI_WPROT_ERR_CLR (CODA9_GDMA_BASE + 0x0a0) #define CODA9_GDI_WPROT_RGN_EN (CODA9_GDMA_BASE + 0x0ac) @@ -486,6 +634,15 @@ #define CODA9_GDI_RBC2_AXI_1F (CODA9_GDMA_BASE + 0x91c) #define CODA9_GDI_TILEDBUF_BASE (CODA9_GDMA_BASE + 0x920) +/* GDI 2.0 registers */ +#define CODA988_GDI_XY2AXI_LUM_BIT00 (CODA9_GDMA_BASE + 0x800) +#define CODA988_GDI_XY2AXI_CHR_BIT00 (CODA9_GDMA_BASE + 0x880) +#define CODA988_GDI_XY2AXI_CONFIG (CODA9_GDMA_BASE + 0x900) +#define CODA988_GDI_XY2AXI_GRAN_FRAME_LUM_SHIFT 12 +#define CODA988_GDI_XY2AXI_GRAN_FIELD_LUM_SHIFT 8 +#define CODA988_GDI_XY2AXI_GRAN_FRAME_CHR_SHIFT 4 +#define CODA988_GDI_XY2AXI_GRAN_FIELD_CHR_SHIFT 0 + #define CODA9_JPEG_BASE 0x3000 #define CODA9_REG_JPEG_PIC_START (CODA9_JPEG_BASE + 0x000) #define CODA9_REG_JPEG_PIC_STATUS (CODA9_JPEG_BASE + 0x004)