Message ID | 20210118095736.272473-1-heiko@sntech.de (mailing list archive) |
---|---|
Headers |
Received: from vger.kernel.org ([23.128.96.18]) by www.linuxtv.org with esmtp (Exim 4.92) (envelope-from <linux-media-owner@vger.kernel.org>) id 1l1SSz-002o9R-2l; Mon, 18 Jan 2021 11:13:01 +0000 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388745AbhARKrk (ORCPT <rfc822;mkrufky@linuxtv.org> + 1 other); Mon, 18 Jan 2021 05:47:40 -0500 Received: from gloria.sntech.de ([185.11.138.130]:46158 "EHLO gloria.sntech.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388620AbhARJ6c (ORCPT <rfc822;linux-media@vger.kernel.org>); Mon, 18 Jan 2021 04:58:32 -0500 Received: from ip5f5aa64a.dynamic.kabel-deutschland.de ([95.90.166.74] helo=phil.lan) by gloria.sntech.de with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from <heiko@sntech.de>) id 1l1RI2-0002qw-9g; Mon, 18 Jan 2021 10:57:38 +0100 From: Heiko Stuebner <heiko@sntech.de> To: dafna.hirschfeld@collabora.com, helen.koike@collabora.com, linux-media@vger.kernel.org, mchehab@kernel.org, Laurent.pinchart@ideasonboard.com, hverkuil@xs4all.nl Cc: linux-rockchip@lists.infradead.org, ezequiel@collabora.com, christoph.muellner@theobroma-systems.com, heiko@sntech.de, tfiga@chromium.org Subject: [PATCH v5 0/3] Fix the rkisp1 userspace API for later IP versions Date: Mon, 18 Jan 2021 10:57:33 +0100 Message-Id: <20210118095736.272473-1-heiko@sntech.de> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: <linux-media.vger.kernel.org> X-Mailing-List: linux-media@vger.kernel.org X-LSpam-Score: -2.4 (--) X-LSpam-Report: No, score=-2.4 required=5.0 tests=BAYES_00=-1.9,HEADER_FROM_DIFFERENT_DOMAINS=0.5,MAILING_LIST_MULTI=-1 autolearn=ham autolearn_force=no |
Series |
Fix the rkisp1 userspace API for later IP versions
|
|
Message
Heiko Stuebner
Jan. 18, 2021, 9:57 a.m. UTC
This NEEDs to go into 5.11 while we can still adapt the uapi during its RC-cycle. When looking into supporting the rkisp1 of the px30 I noticed that some fields got bigger in the uapi, caused by bigger number of samples for example for histograms or gamma values. The rkisp1 was destaged with 5.11-rc1 so we have still time during the 5.11 cycle to fix that without big hassles. This was discussed previously in a mail [0] and a rfc series [1] and this two-part series now splits out the important parts that really should become part of a 5.11-rc and thus the final 5.11. changes since v4: - set GAMMA_OUT to the real 25 instead of the 28 with 3 spares (Dafna) - start RKISP_Vxx enum with 10 for RKISP_V10 to make output easier and also allow userspace to differentiate between old (= 0) and newer driver variants (Dafna, Laurent) changes since v3: - add patch fixing the original histogram size comment - make comments in uapi more verbose (Hans) - fix wording in admin guide (Hans) - document version <-> soc in uapi as well (easier for people) (Dafna) changes since v2: - actually zero the correct sizes for u16 values (hist-bins) (kernel-test-robot) changes since v1: - drop duplicate isp_ver storage, hw_revision is enough (Dafna) - document multiple maximum sizes in uapi (Hans) - document usage of hw_revision field (Hans) - zero fields transmitted to userspace before adding data (Hans) - use _V10 field sizes when filling fields, as there is only v10 for now changes since rfc: - move rkisp1_version enum into uapo - show version in media-api hw_revision - introduce constants for versions and make max use the biggest Heiko Stuebner (3): media: rockchip: rkisp1: fix comment about number of histogram sub-windows media: rockchip: rkisp1: carry ip version information media: rockchip: rkisp1: extend uapi array sizes Documentation/admin-guide/media/rkisp1.rst | 16 ++++ .../platform/rockchip/rkisp1/rkisp1-dev.c | 21 +++--- .../platform/rockchip/rkisp1/rkisp1-params.c | 2 +- .../platform/rockchip/rkisp1/rkisp1-stats.c | 12 ++- include/uapi/linux/rkisp1-config.h | 74 +++++++++++++++++-- 5 files changed, 106 insertions(+), 19 deletions(-)
Comments
Hi Heiko, On 18/01/2021 10:57, Heiko Stuebner wrote: > From: Heiko Stuebner <heiko.stuebner@theobroma-systems.com> > > Later variants of the rkisp1 block use more entries in some arrays: > > RKISP1_CIF_ISP_AE_MEAN_MAX 25 -> 81 > RKISP1_CIF_ISP_HIST_BIN_N_MAX 16 -> 32 > RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES 17 -> 34 > RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE 28 -> 81 This still mentions 28. The commit message must say something about changing 28 to 25 as well. Actually, I think it would be best if that change (28 -> 25) is done in a separate 2/4 patch since this is independent of the V12/13 support. Otherwise this series looks good from my point of view. Regards, Hans > > and we can still extend the uapi during the 5.11-rc cycle, so do that > now to be on the safe side. > > V10 and V11 only need the smaller sizes, while V12 and V13 needed > the larger sizes. > > When adding the bigger sizes make sure, values filled from hardware > values and transmitted to userspace don't leak kernel data by zeroing > them beforehand. > > Signed-off-by: Heiko Stuebner <heiko.stuebner@theobroma-systems.com> > Reviewed-by: Ezequiel Garcia <ezequiel@collabora.com> > Reviewed-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com> > --- > .../platform/rockchip/rkisp1/rkisp1-params.c | 2 +- > .../platform/rockchip/rkisp1/rkisp1-stats.c | 12 +++- > include/uapi/linux/rkisp1-config.h | 58 ++++++++++++++++--- > 3 files changed, 62 insertions(+), 10 deletions(-) > > diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c > index 6af4d551ffb5..fa47fe2a02d0 100644 > --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c > +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c > @@ -391,7 +391,7 @@ static void rkisp1_goc_config(struct rkisp1_params *params, > RKISP1_CIF_ISP_CTRL_ISP_GAMMA_OUT_ENA); > rkisp1_write(params->rkisp1, arg->mode, RKISP1_CIF_ISP_GAMMA_OUT_MODE); > > - for (i = 0; i < RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES; i++) > + for (i = 0; i < RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10; i++) > rkisp1_write(params->rkisp1, arg->gamma_y[i], > RKISP1_CIF_ISP_GAMMA_OUT_Y_0 + i * 4); > } > diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-stats.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-stats.c > index 3ddab8fa8f2d..a26de388ca13 100644 > --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-stats.c > +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-stats.c > @@ -202,8 +202,12 @@ static void rkisp1_stats_get_aec_meas(struct rkisp1_stats *stats, > struct rkisp1_device *rkisp1 = stats->rkisp1; > unsigned int i; > > + /* the global max can be bigger than the version-specific one */ > + memset(pbuf->params.ae.exp_mean, 0, RKISP1_CIF_ISP_AE_MEAN_MAX * > + sizeof(*pbuf->params.ae.exp_mean)); > + > pbuf->meas_type |= RKISP1_CIF_ISP_STAT_AUTOEXP; > - for (i = 0; i < RKISP1_CIF_ISP_AE_MEAN_MAX; i++) > + for (i = 0; i < RKISP1_CIF_ISP_AE_MEAN_MAX_V10; i++) > pbuf->params.ae.exp_mean[i] = > (u8)rkisp1_read(rkisp1, > RKISP1_CIF_ISP_EXP_MEAN_00 + i * 4); > @@ -232,8 +236,12 @@ static void rkisp1_stats_get_hst_meas(struct rkisp1_stats *stats, > struct rkisp1_device *rkisp1 = stats->rkisp1; > unsigned int i; > > + /* the global max can be bigger then the version-specific one */ > + memset(pbuf->params.hist.hist_bins, 0, RKISP1_CIF_ISP_HIST_BIN_N_MAX * > + sizeof(*pbuf->params.hist.hist_bins)); > + > pbuf->meas_type |= RKISP1_CIF_ISP_STAT_HIST; > - for (i = 0; i < RKISP1_CIF_ISP_HIST_BIN_N_MAX; i++) > + for (i = 0; i < RKISP1_CIF_ISP_HIST_BIN_N_MAX_V10; i++) > pbuf->params.hist.hist_bins[i] = > (u8)rkisp1_read(rkisp1, > RKISP1_CIF_ISP_HIST_BIN_0 + i * 4); > diff --git a/include/uapi/linux/rkisp1-config.h b/include/uapi/linux/rkisp1-config.h > index d685b7371e71..c0c3abf5e50b 100644 > --- a/include/uapi/linux/rkisp1-config.h > +++ b/include/uapi/linux/rkisp1-config.h > @@ -49,8 +49,14 @@ > #define RKISP1_CIF_ISP_CTK_COEFF_MAX 0x100 > #define RKISP1_CIF_ISP_CTK_OFFSET_MAX 0x800 > > -#define RKISP1_CIF_ISP_AE_MEAN_MAX 25 > -#define RKISP1_CIF_ISP_HIST_BIN_N_MAX 16 > +#define RKISP1_CIF_ISP_AE_MEAN_MAX_V10 25 > +#define RKISP1_CIF_ISP_AE_MEAN_MAX_V12 81 > +#define RKISP1_CIF_ISP_AE_MEAN_MAX RKISP1_CIF_ISP_AE_MEAN_MAX_V12 > + > +#define RKISP1_CIF_ISP_HIST_BIN_N_MAX_V10 16 > +#define RKISP1_CIF_ISP_HIST_BIN_N_MAX_V12 32 > +#define RKISP1_CIF_ISP_HIST_BIN_N_MAX RKISP1_CIF_ISP_HIST_BIN_N_MAX_V12 > + > #define RKISP1_CIF_ISP_AFM_MAX_WINDOWS 3 > #define RKISP1_CIF_ISP_DEGAMMA_CURVE_SIZE 17 > > @@ -86,7 +92,9 @@ > * Gamma out > */ > /* Maximum number of color samples supported */ > -#define RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES 17 > +#define RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10 17 > +#define RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V12 34 > +#define RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V12 > > /* > * Lens shade correction > @@ -103,7 +111,9 @@ > * Histogram calculation > */ > /* Last 3 values unused. */ > -#define RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE 28 > +#define RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V10 25 > +#define RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V12 81 > +#define RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V12 > > /* > * Defect Pixel Cluster Correction > @@ -526,6 +536,15 @@ enum rkisp1_cif_isp_goc_mode { > * > * @mode: goc mode (from enum rkisp1_cif_isp_goc_mode) > * @gamma_y: gamma out curve y-axis for all color components > + * > + * The number of entries of @gamma_y depends on the hardware revision > + * as is reported by the hw_revision field of the struct media_device_info > + * that is returned by ioctl MEDIA_IOC_DEVICE_INFO. > + * > + * Versions <= V11 have RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V10 > + * entries, versions >= V12 have RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES_V12 > + * entries. RKISP1_CIF_ISP_GAMMA_OUT_MAX_SAMPLES is equal to the maximum > + * of the two. > */ > struct rkisp1_cif_isp_goc_config { > __u32 mode; > @@ -540,6 +559,15 @@ struct rkisp1_cif_isp_goc_config { > * skipped > * @meas_window: coordinates of the measure window > * @hist_weight: weighting factor for sub-windows > + * > + * The number of entries of @hist_weight depends on the hardware revision > + * as is reported by the hw_revision field of the struct media_device_info > + * that is returned by ioctl MEDIA_IOC_DEVICE_INFO. > + * > + * Versions <= V11 have RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V10 > + * entries, versions >= V12 have RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE_V12 > + * entries. RKISP1_CIF_ISP_HISTOGRAM_WEIGHT_GRIDS_SIZE is equal to the maximum > + * of the two. > */ > struct rkisp1_cif_isp_hst_config { > __u32 mode; > @@ -827,7 +855,15 @@ struct rkisp1_cif_isp_bls_meas_val { > * @exp_mean: Mean luminance value of block xx > * @bls_val: BLS measured values > * > - * Image is divided into 5x5 blocks. > + * The number of entries of @exp_mean depends on the hardware revision > + * as is reported by the hw_revision field of the struct media_device_info > + * that is returned by ioctl MEDIA_IOC_DEVICE_INFO. > + * > + * Versions <= V11 have RKISP1_CIF_ISP_AE_MEAN_MAX_V10 entries, > + * versions >= V12 have RKISP1_CIF_ISP_AE_MEAN_MAX_V12 entries. > + * RKISP1_CIF_ISP_AE_MEAN_MAX is equal to the maximum of the two. > + * > + * Image is divided into 5x5 blocks on V10 and 9x9 blocks on V12. > */ > struct rkisp1_cif_isp_ae_stat { > __u8 exp_mean[RKISP1_CIF_ISP_AE_MEAN_MAX]; > @@ -862,8 +898,16 @@ struct rkisp1_cif_isp_af_stat { > * > * @hist_bins: measured bin counters > * > - * Measurement window divided into 16 sub-windows, set > - * with ISP_HIST_XXX > + * The histogram values divided into 16 bins for V10/V11 and 32 bins > + * for V12/V13. It is configured within the struct rkisp1_cif_isp_hst_config. > + * > + * The number of entries of @hist_bins depends on the hardware revision > + * as is reported by the hw_revision field of the struct media_device_info > + * that is returned by ioctl MEDIA_IOC_DEVICE_INFO. > + * > + * Versions <= V11 have RKISP1_CIF_ISP_HIST_BIN_N_MAX_V10 entries, > + * versions >= V12 have RKISP1_CIF_ISP_HIST_BIN_N_MAX_V12 entries. > + * RKISP1_CIF_ISP_HIST_BIN_N_MAX is equal to the maximum of the two. > */ > struct rkisp1_cif_isp_hist_stat { > __u16 hist_bins[RKISP1_CIF_ISP_HIST_BIN_N_MAX]; >