From nobody Fri Dec 19 22:03:20 2025 Received: from fout-b6-smtp.messagingengine.com (fout-b6-smtp.messagingengine.com [202.12.124.149]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4FE992C3258; Tue, 17 Jun 2025 10:33:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=202.12.124.149 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750156415; cv=none; b=WgFuap70ndG99yEaGZpfW7TpEolBcuY4MUNIF/oVO2a/AohowbUneMour99IVqg1rnLEh9jheGHhakaAo5v+YhJWSA7lmvPdmAvEBHxt/154xiObUaoIVYWifArXpr8OHVUnLYUQbUH/eTxZ8e+vYSOfNS4vuz/h+d3ZiEvHzBo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750156415; c=relaxed/simple; bh=usGA/ztoTSCGn/jZvi2XAFywO/ts7qJRn5/Z2pqkGlc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=qcwBmMlCvDxSlJOU6fr47ljwbbkFEXf7tQj0qABggTT0E6njv02h3wZbbT6zbWJukSH+qI9Yg8DAtQoo+8/090J3MtzXVzlsM1nul9yr7kQfANp6Mn41znaNYcnYa9Ko/LDizKJqsZxjhNt5ZeEPtAX3UelO71Nby06JXq2ZA9o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ragnatech.se; spf=pass smtp.mailfrom=ragnatech.se; dkim=pass (2048-bit key) header.d=ragnatech.se header.i=@ragnatech.se header.b=VXj0USuw; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=aejW49SR; arc=none smtp.client-ip=202.12.124.149 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ragnatech.se Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ragnatech.se Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ragnatech.se header.i=@ragnatech.se header.b="VXj0USuw"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="aejW49SR" Received: from phl-compute-05.internal (phl-compute-05.phl.internal [10.202.2.45]) by mailfout.stl.internal (Postfix) with ESMTP id 8D499114014B; Tue, 17 Jun 2025 06:33:32 -0400 (EDT) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-05.internal (MEProxy); Tue, 17 Jun 2025 06:33:32 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ragnatech.se; h= cc:cc:content-transfer-encoding:content-type:content-type:date :date:from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1750156412; x=1750242812; bh=5vWPq5aA7pzw3Y2BwWwnea/6QAgFy/Az5qps94X0dtI=; b= VXj0USuw/in1Cxm8JMhJs4NcDEjis3/vQH+4wVWoA4XybHWO9xUCxiKy07alWZQR ZHzO1uSx8kCIeNsoh9dQ/G2nZNZQbr1Ajxm6482d/+JEOatG0RAPpvvj72BQyEt0 DZCHUi/mNSsM/hWOCfno5eI5owS+72uG/okCT7f8K7n05DGObs79JVU4iTa3e8Q+ tAEMzhhl7dSa7KOb8MsvAy2o7IzwNbIel1kp1ClGc6SV4QxySpZZaGjsZqtzFC3Y HDw0nYHH7f/n1kj211G5mfkEbKQjeHgYJo7XUav5jtsWB/sSZNtbRV0aGzYfw9x4 3wHcq8bIgwUJ5g6vgFB60g== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm1; t=1750156412; x= 1750242812; bh=5vWPq5aA7pzw3Y2BwWwnea/6QAgFy/Az5qps94X0dtI=; b=a ejW49SR8wQzG/ConvLRsu/hZCTA3XVGp1uLsRyNoVFNjpxOul4iJ54eHu5P/ywrU 4Ow1z+zcAUe3qFD9p7KRSBD+wQ+DFPvp+gkU0aeuCw5W31XPk5vN+Z3Zlr2kugo6 wdBfZVShrbCO12RzjTqwBA9PFhwHzZ+6oqBPggKpOGDcAJDHAQIV8u1kM2jMlnKB gbNm2OlMsnA3aQB+wX3nB+mblAms1up6rUou6yuP+mVh1eMkkO5HMLzu+nS1+6br NMylhmw2PK8fgQLFjNLr4EGJtPytysno13XHRoSg10qUXhfDiWUGBUGzA8tBH7Sg 5SCqPa7fGsZR2iVlyrOsQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtddugddvledtfecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpggftfghnshhusghstghrihgsvgdp uffrtefokffrpgfnqfghnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivg hnthhsucdlqddutddtmdenucfjughrpefhvfevufffkffojghfgggtgfesthekredtredt jeenucfhrhhomheppfhikhhlrghsucfunpguvghrlhhunhguuceonhhikhhlrghsrdhsoh guvghrlhhunhguodhrvghnvghsrghssehrrghgnhgrthgvtghhrdhsvgeqnecuggftrfgr thhtvghrnhepheeigfeuveeutdefhfehgeekvedtleeuueekveefudehhffhjeffgfegff elfeegnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhep nhhikhhlrghsrdhsohguvghrlhhunhgusehrrghgnhgrthgvtghhrdhsvgdpnhgspghrtg hpthhtohepjedpmhhouggvpehsmhhtphhouhhtpdhrtghpthhtohepmhgthhgvhhgrsges khgvrhhnvghlrdhorhhgpdhrtghpthhtohepjhgrtghophhordhmohhnughisehiuggvrg hsohhnsghorghrugdrtghomhdprhgtphhtthhopehlrghurhgvnhhtrdhpihhntghhrghr thesihguvggrshhonhgsohgrrhgurdgtohhmpdhrtghpthhtoheplhhinhhugidqmhgvug hirgesvhhgvghrrdhkvghrnhgvlhdrohhrghdprhgtphhtthhopehlihhnuhigqdhrvghn vghsrghsqdhsohgtsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtoheplhhinh hugidqkhgvrhhnvghlsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtohepnhhi khhlrghsrdhsohguvghrlhhunhguodhrvghnvghsrghssehrrghgnhgrthgvtghhrdhsvg X-ME-Proxy: Feedback-ID: i80c9496c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Tue, 17 Jun 2025 06:33:31 -0400 (EDT) From: =?UTF-8?q?Niklas=20S=C3=B6derlund?= To: Mauro Carvalho Chehab , Jacopo Mondi , Laurent Pinchart , linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org Cc: =?UTF-8?q?Niklas=20S=C3=B6derlund?= Subject: [PATCH 2/7] media: rppx1: Add support for AWB measurement parameters and statistics Date: Tue, 17 Jun 2025 12:31:56 +0200 Message-ID: <20250617103201.1594152-3-niklas.soderlund+renesas@ragnatech.se> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250617103201.1594152-1-niklas.soderlund+renesas@ragnatech.se> References: <20250617103201.1594152-1-niklas.soderlund+renesas@ragnatech.se> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Extend the RPPX1 driver to parse parameter blocks configuring for the auto white balance measurement window and parameters. As well as producing the measurements as part of a statistics buffer. This is the first ISP algorithm added to the RPPX1 driver and exercises both the parameter and statistics API provided by the base driver. It shows how the RkISP1 parameter and statistics buffer data can be scaled and adopted to fit the RPPX1 hardware. It also uses the parameter writing interface which allows the framework user to specify how (and when) the configuration are applied to the RPPX1. As the RkISP1 parameters and statics buffers have lower precision then the RPPX1 hardware the values needs to be scaled. Signed-off-by: Niklas S=C3=B6derlund --- .../platform/dreamchip/rppx1/rpp_params.c | 3 + .../platform/dreamchip/rppx1/rpp_stats.c | 4 + .../platform/dreamchip/rppx1/rppx1_wbmeas.c | 127 ++++++++++++++++++ 3 files changed, 134 insertions(+) diff --git a/drivers/media/platform/dreamchip/rppx1/rpp_params.c b/drivers/= media/platform/dreamchip/rppx1/rpp_params.c index e0c5ceb4d72b..e7f18edc6819 100644 --- a/drivers/media/platform/dreamchip/rppx1/rpp_params.c +++ b/drivers/media/platform/dreamchip/rppx1/rpp_params.c @@ -23,6 +23,9 @@ int rppx1_params_rkisp1(struct rppx1 *rpp, struct rkisp1_= ext_params_cfg *cfg, block_offset +=3D block->header.size; =20 switch (block->header.type) { + case RKISP1_EXT_PARAMS_BLOCK_TYPE_AWB_MEAS: + module =3D &rpp->post.wbmeas; + break; default: module =3D NULL; break; diff --git a/drivers/media/platform/dreamchip/rppx1/rpp_stats.c b/drivers/m= edia/platform/dreamchip/rppx1/rpp_stats.c index a5daa28e09cf..a6abb85f0df1 100644 --- a/drivers/media/platform/dreamchip/rppx1/rpp_stats.c +++ b/drivers/media/platform/dreamchip/rppx1/rpp_stats.c @@ -11,5 +11,9 @@ void rppx1_stats_fill_isr(struct rppx1 *rpp, u32 isc, voi= d *buf) struct rkisp1_stat_buffer *stats =3D buf; =20 stats->meas_type =3D 0; + + if (isc & RPPX1_IRQ_ID_POST_AWB_MEAS) + if (!rpp_module_call(&rpp->post.wbmeas, stats_rkisp1, &stats->params)) + stats->meas_type |=3D RKISP1_CIF_ISP_STAT_AWB; } EXPORT_SYMBOL_GPL(rppx1_stats_fill_isr); diff --git a/drivers/media/platform/dreamchip/rppx1/rppx1_wbmeas.c b/driver= s/media/platform/dreamchip/rppx1/rppx1_wbmeas.c index 3d197d914d07..126972cfd57a 100644 --- a/drivers/media/platform/dreamchip/rppx1/rppx1_wbmeas.c +++ b/drivers/media/platform/dreamchip/rppx1/rppx1_wbmeas.c @@ -56,6 +56,133 @@ static int rppx1_wbmeas_probe(struct rpp_module *mod) return 0; } =20 +static int +rppx1_wbmeas_param_rkisp1(struct rpp_module *mod, + const union rppx1_params_rkisp1_config *block, + rppx1_reg_write write, void *priv) +{ + const struct rkisp1_ext_params_awb_meas_config *cfg =3D &block->awbm; + /* + * The RkISP params are 8-bit while the RPP can be 8, 20 or 24 bit. + * Figure out how much we need to adjust the input parameters. + */ + const unsigned int shift =3D mod->info.wbmeas.colorbits - 8; + + /* If the modules is disabled, simply bypass it. */ + if (cfg->header.flags & RKISP1_EXT_PARAMS_FL_BLOCK_DISABLE) { + write(priv, mod->base + AWB_MEAS_PROP_REG, 0); + return 0; + } + + /* Program measurement window. */ + write(priv, mod->base + AWB_MEAS_H_OFFS_REG, + cfg->config.awb_wnd.h_offs); + write(priv, mod->base + AWB_MEAS_V_OFFS_REG, + cfg->config.awb_wnd.v_offs); + write(priv, mod->base + AWB_MEAS_H_SIZE_REG, + cfg->config.awb_wnd.h_size); + write(priv, mod->base + AWB_MEAS_V_SIZE_REG, + cfg->config.awb_wnd.v_size); + + /* Set number of frames to sample. */ + write(priv, mod->base + AWB_MEAS_FRAMES_REG, cfg->config.frames); + + if (cfg->config.awb_mode =3D=3D RKISP1_CIF_ISP_AWB_MODE_YCBCR) { + write(priv, mod->base + AWB_MEAS_REF_CB_MAX_B_REG, + cfg->config.awb_ref_cb << shift); + write(priv, mod->base + AWB_MEAS_REF_CR_MAX_R_REG, + cfg->config.awb_ref_cr << shift); + write(priv, mod->base + AWB_MEAS_MAX_Y_REG, + cfg->config.max_y << shift); + write(priv, mod->base + AWB_MEAS_MIN_Y_MAX_G_REG, + cfg->config.min_y << shift); + write(priv, mod->base + AWB_MEAS_MAX_CSUM_REG, + cfg->config.max_csum << shift); + write(priv, mod->base + AWB_MEAS_MIN_C_REG, + cfg->config.min_c << shift); + + /* + * Match RkISP1 conversion, documented as + * Y =3D 16 + 0.2500 R + 0.5000 G + 0.1094 B + * Cb =3D 128 - 0.1406 R - 0.2969 G + 0.4375 B + * Cr =3D 128 + 0.4375 R - 0.3750 G - 0.0625 B + * + * Note map Y to G. Matrix is GBR, not RGB documented for RPPX1. + */ + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(0), 0x0800); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(1), 0x01c0); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(2), 0x0400); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(3), 0xfb40); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(4), 0x0700); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(5), 0xfdc0); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(6), 0xfa00); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(7), 0xff00); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(8), 0x0700); + + write(priv, mod->base + AWB_MEAS_CCOR_OFFSET_R_REG, 0x00100000); + write(priv, mod->base + AWB_MEAS_CCOR_OFFSET_G_REG, 0x00800000); + write(priv, mod->base + AWB_MEAS_CCOR_OFFSET_B_REG, 0x00800000); + + write(priv, mod->base + AWB_MEAS_PROP_REG, + cfg->config.enable_ymax_cmp ? AWB_MEAS_PROP_YMAX : 0 | + AWB_MEAS_PROP_AWB_MODE_ON); + } else { + /* The RkISP params are oddly named, but do map to RGB. */ + write(priv, mod->base + AWB_MEAS_REF_CB_MAX_B_REG, + cfg->config.awb_ref_cb << shift); + write(priv, mod->base + AWB_MEAS_REF_CR_MAX_R_REG, + cfg->config.awb_ref_cr << shift); + write(priv, mod->base + AWB_MEAS_MIN_Y_MAX_G_REG, + cfg->config.min_y << shift); + + /* Values from datasheet to map G to Y, B to Cb and R to Cr. */ + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(0), 0x1000); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(1), 0x0000); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(2), 0x0000); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(3), 0x0000); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(4), 0x1000); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(5), 0x0000); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(6), 0x0000); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(7), 0x0000); + write(priv, mod->base + AWB_MEAS_CCOR_COEFF_REG(8), 0x1000); + + /* Values from datasheet. */ + write(priv, mod->base + AWB_MEAS_CCOR_OFFSET_R_REG, 0x00000000); + write(priv, mod->base + AWB_MEAS_CCOR_OFFSET_G_REG, 0x00000000); + write(priv, mod->base + AWB_MEAS_CCOR_OFFSET_B_REG, 0x00000000); + + write(priv, mod->base + AWB_MEAS_PROP_REG, + AWB_MEAS_PROP_MEAS_MODE_RGB | + AWB_MEAS_PROP_AWB_MODE_ON); + } + + return 0; +} + +static int rppx1_wbmeas_stats_rkisp1(struct rpp_module *mod, + struct rkisp1_cif_isp_stat *stats) +{ + struct rkisp1_cif_isp_awb_meas *meas =3D &stats->awb.awb_mean[0]; + /* + * The RkISP YCbCr/RGB mean stats are 8-bit while the RPP can be 8, 20 + * or 24 bit. Figure out how much we need to adjust the output + * statistics. + */ + const unsigned int shift =3D mod->info.wbmeas.colorbits - 8; + + meas->cnt =3D rpp_module_read(mod, AWB_MEAS_WHITE_CNT_REG); + meas->mean_y_or_g =3D + rpp_module_read(mod, AWB_MEAS_MEAN_Y_G_REG) >> shift; + meas->mean_cb_or_b =3D + rpp_module_read(mod, AWB_MEAS_MEAN_CB_B_REG) >> shift; + meas->mean_cr_or_r =3D + rpp_module_read(mod, AWB_MEAS_MEAN_CR_R_REG) >> shift; + + return 0; +} + const struct rpp_module_ops rppx1_wbmeas_ops =3D { .probe =3D rppx1_wbmeas_probe, + .param_rkisp1 =3D rppx1_wbmeas_param_rkisp1, + .stats_rkisp1 =3D rppx1_wbmeas_stats_rkisp1 }; --=20 2.49.0