Re: rkisp in mainline (destaging) vs. rk3326/px30 uapi differences

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Laurent,

Am Montag, 11. Januar 2021, 12:04:56 CET schrieb Laurent Pinchart:
> On Mon, Jan 11, 2021 at 11:53:00AM +0100, Heiko Stuebner wrote:
> > Am Samstag, 9. Januar 2021, 02:21:43 CET schrieb Laurent Pinchart:
> > > On Fri, Jan 08, 2021 at 04:21:49PM +0100, Dafna Hirschfeld wrote:
> > > > Am 08.01.21 um 13:05 schrieb Heiko Stuebner:
> > > > > Am Freitag, 8. Januar 2021, 12:17:43 CET schrieb Dafna Hirschfeld:
> > > > >> Am 07.01.21 um 21:23 schrieb Heiko Stuebner:
> > > > >>> the rkisp driver in the mainline Linux kernel moved out of staging with
> > > > >>> 5.11-rc1, so the uapi will be fixed after 5.11 proper is released.
> > > > >>>
> > > > >>> The rkisp driver currently only supports the rk3399 and while working
> > > > >>> on porting the support for rk3326/px30 I noticed discrepancies.
> > > > >>>
> > > > >>> Hence it would be somewhat urgent to clarify this, as later it will get
> > > > >>> really cumbersome.
> > > > >>
> > > > >> I see that we are now on 5.11-rc2 so that gives us about 4-5 weeks,
> > > > >>
> > > > >>>
> > > > >>> ----
> > > > >>>
> > > > >>> The rkisp on the px30 (v12) has some changes compared to the rk3399 (v10).
> > > > >>
> > > > >> How do you know that the isp of rk3399 is v10 ? I looked at the RK3399 TRM
> > > > >> and the datasheet for the isp and could not find this information.
> > > > > 
> > > > > That's from Rockchip's upstream sources where they introduced the new code.
> > > > > There're some (if v12) conditionals in there ;-) .
> > > > > 
> > > > >>> Some sub-blocks moved around or seem to have been replaced with newer
> > > > >>> variants and the gist of changes can be seen in [0] with the important
> > > > >>> part being the uapi changes [1] and those values also exist in mainline.
> > > > >>>
> > > > >>>
> > > > >>> See functions in that patch:
> > > > >>> - isp_goc_config_v12()
> > > > >>> - rkisp1_stats_get_aec_meas_v12()
> > > > >>> - rkisp1_stats_get_hst_meas_v12()
> > > > >>>
> > > > >>> Looking at the code, the register locations are different, for gammas and
> > > > >>> the histogram the actual amount of raw registers is the same, while the
> > > > >>> "aec" seems to use 25 registers on V10 while 21 registers on V12. Though
> > > > >>> their content gets split into multiple values in that v12 variant.
> > > > >>>
> > > > >>>
> > > > >>> As somehow expected the whole thing is pretty undocumented and I
> > > > >>> have no clue what these "bins" or "gammas" mean and why the amount of
> > > > >>> entries now differs and how this relates to userspace at all.
> > > > >>>
> > > > >>> Also looking through libcamera as the one open user of the driver,
> > > > >>> the whole rkisp1_cif_isp_isp_other_cfg (containing the gamma config)
> > > > >>> as well as the rkisp1_cif_isp_stat struct (for ae and histogram)
> > > > >>> don't seem to be used so far.
> > > > >>
> > > > >> yes, that's a shame. There is a simple implementation using the ae in
> > > > >> stuct rkisp1_cif_isp_stat in src/ipa/rkisp1.c
> > > > > 
> > > > > Thanks for pointing me to that :-)
> > > > > 
> > > > >>> Hence I also added some Rockchip people in the hope of getting
> > > > >>> a bit of clarification ;-) .
> > > > >>>
> > > > >>> Ideas on how to proceed?
> > > > >>>
> > > > >>> Thanks
> > > > >>> Heiko
> > > > >>>
> > > > >>>
> > > > >>> [0] https://github.com/rockchip-linux/kernel/commit/2ff670508e8fdfefd67318e885effb8cee4a0f4c
> > > > >>> [1]
> > > > >>> diff --git a/include/uapi/linux/rkisp1-config.h b/include/uapi/linux/rkisp1-config.h
> > > > >>> index b471f01a8459..fbeb6b5dba03 100644
> > > > >>> --- a/include/uapi/linux/rkisp1-config.h
> > > > >>> +++ b/include/uapi/linux/rkisp1-config.h
> > > > >>> @@ -32,8 +32,8 @@
> > > > >>>    #define CIFISP_CTK_COEFF_MAX            0x100
> > > > >>>    #define CIFISP_CTK_OFFSET_MAX           0x800
> > > > >>>    
> > > > >>> -#define CIFISP_AE_MEAN_MAX              25
> > > > >>> -#define CIFISP_HIST_BIN_N_MAX           16
> > > > >>> +#define CIFISP_AE_MEAN_MAX              81
> > > > >>> +#define CIFISP_HIST_BIN_N_MAX           32
> > > > >>>    #define CIFISP_AFM_MAX_WINDOWS          3
> > > > >>>    #define CIFISP_DEGAMMA_CURVE_SIZE       17
> > > > >>>    
> > > > >>> @@ -69,7 +69,7 @@
> > > > >>>     * Gamma out
> > > > >>>     */
> > > > >>>    /* Maximum number of color samples supported */
> > > > >>> -#define CIFISP_GAMMA_OUT_MAX_SAMPLES       17
> > > > >>> +#define CIFISP_GAMMA_OUT_MAX_SAMPLES       34
> > > > >>
> > > > >> I see that in that code you use the old names of the registers.
> > > > >> The names are different in the current version of the driver,
> > > > >> in the media tree: git://linuxtv.org/media_tree.git
> > > > >> Also, I guess that instead of changing the values you should
> > > > >> add a separated define, something like:
> > > > >>
> > > > >> -#define CIFISP_GAMMA_OUT_MAX_SAMPLES       17
> > > > >> +#define CIFISP_GAMMA_OUT_MAX_SAMPLES_V10       17
> > > > >> +#define CIFISP_GAMMA_OUT_MAX_SAMPLES_v12       34
> > > > > 
> > > > > Just for clarity, that is Rockchip's commit in their vendor kernel.
> > > > > I'm just using that as base to get the changes needed for mainline :-) .
> > > > > 
> > > > > The main issue I see is that these max-values directly influence the sizes
> > > > > of arrays inside the uapi - where the "v12" seems to need bigger arrays
> > > > > on first glance.
> > > > > ^^^ which is essentially the part I'm mostly worried about
> > > > 
> > > > Oh, ok, I thought it's your code.
> > > > So maybe we should change the uapi to look like:
> > > > 
> > > > /* v10 is the isp version for rk3399 */
> > > > #define CIFISP_GAMMA_OUT_MAX_SAMPLES_V10       17
> > > > /* v12 is the isp version for rk3326/px30 */
> > > > #define CIFISP_GAMMA_OUT_MAX_SAMPLES_v12       34
> > > > #define CIFISP_GAMMA_OUT_MAX_SAMPLES       CIFISP_GAMMA_OUT_MAX_SAMPLES_v12
> > > > 
> > > > This way we inform userspace how many samples are supported according to the
> > > > version.
> > > > I don't know if there are other versions with higher maximum,
> > > > 
> > > > What do you think?
> > > 
> > > This makes sense to me. Userspace will need to know how many samples are
> > > actually present in the array, so corresponding macros should be defined
> > > in the header.
> > 
> > ok, though as it seems to have been discussed on irc, we'll also need a
> > version field to indicate the IP version.
> 
> In the statistics buffer that could be done, but in the params buffer it
> won't help userspace figure out what version of the IP is in use as
> params are filled by the application, not the kernel. I think reporting
> the IP version through the media controller API should be enough,
> possibly in media_device_info.hw_revision, and/or in the model string.

hw_revision sounds like the ideal place :-)

and I've added a line doing that, thanks for the pointer.


> > > > > The vendor-code only used the MAX-constants for the uapi to get the
> > > > > biggest size needed and then defines the real per-version maximums
> > > > > inside the driver, see
> > > > > https://github.com/rockchip-linux/kernel/commit/2ff670508e8fdfefd67318e885effb8cee4a0f4c#diff-961dbaed00164098bb082b01d6c9446501cfcef808cf5a71bf18405067fb5426R378
> > > > > 
> > > > > and for the auto-exposure:
> > > > > https://github.com/rockchip-linux/kernel/commit/2ff670508e8fdfefd67318e885effb8cee4a0f4c#diff-961dbaed00164098bb082b01d6c9446501cfcef808cf5a71bf18405067fb5426R265
> > > > > >> Thanks for working on that, hope we could still fix this in 5.11,
> > > > >>
> > > > >> I don't have a rk3326/px30 hardware so I can't test your patches.
> > > > >> Do you have a hardware to test it?
> > > > > 
> > > > > Yep, I'm working on a px30-evb and thankfully the driver for the camera
> > > > > on it is also already part of mainline.
> > > > > 
> > > > >> I suggest that you send a patchset to the mailing list then I can
> > > > >> review it and test it on rk3399. Unfortunately there is indeed no way
> > > > >> to thoroughly test the params/stats since there is no userspace for that.
> > > > > 
> > > > >  From looking at the currently newest version [0] it looks like these
> > > > > new max values seem to have stayed the same, so one solution might be
> > > > > to just make the uapi structures bigger to these new max values and
> > > > > hope for the best?
> > > 
> > > This is one option, the other option would be to make the array size
> > > dynamic by turning them into pointers. That leads to additional
> > > complications though, so given that the extra memory consumed for the
> > > largest array is reasonable, simply increasing the array size may be the
> > > best option. Do we expect other ISP versions in the future with
> > > differences that would require other changes to the userspace API ? How
> > > about v1 to v9 and v11, do they exist ?
> > 
> > I do believe the version indication is v10 for v1.0 and so on.
> > 
> > Looking at the vendor tree, I see versions:
> > 
> > - V10: rk3288 + rk3399
> > - V10_1: rk3368 (only supports MP streams - whatever these are)
> > - V11: unused
> > - V12: rk3326 / px30
> > - V13: rk1808
> > - V20: rk3568 and probably following
> >
> > gamma_out, hist_grid_size, ae_mean_max, hist_bin
> > v10:  17, 28, 25, 16
> > v12: 34, 81, 81, 32
> > v13: same as v12
> 
> Are v10 and v12 software versions introduced by rockchip, or is there a
> version reported in the hardware registers ?

The version designations are introduced by Rockchip - living in the
dt-compatible-based match-data.

Looking at the registers in the regs header, I sadly didn't see any
version-registers - though V12 moved a number of registers arond
and introduced new ones (for the data sources requiring these
bigger arrays)


> > Looking at the general change for V20 [0] it really looks like a big rework
> > of the ISP block happenend with 100K of new register definitions and there
> > are of course no chips nor boards on the market yet at all, so part of me
> > would expect this to need a separate userspace when the time comes.
> 
> Is it an evoluation of the IP core, or something completely different ?
> It may even make sense to have a separate kernel driver.

>From my short glance it seems to share a lot of the basic parts for capture
etc with small evolutions ... but the stats and params parts seem to have
gotten a major evolution.

I guess we'll cross that bridge after the chips are actually available ;-) .
Rockchip pushed that code into their public repo only last week after all.


Heiko





[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux