[{"id":19689,"web_url":"https://patchwork.libcamera.org/comment/19689/","msgid":"<YUEhJEn21iaX9Tf8@pendragon.ideasonboard.com>","date":"2021-09-14T22:24:36","subject":"Re: [libcamera-devel] [PATCH v8 5/5] ipa: ipu3: Replace\n\tipa::ipu3::algorithms::Ipu3AwbCell","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jean-Michel,\n\nThank you for the patch.\n\nOn Tue, Sep 14, 2021 at 06:37:09PM +0200, Jean-Michel Hautbois wrote:\n> The intel-ipu3.h public interface from the kernel does not define how to\n> parse the statistics for a cell. This had to be identified by a process\n> of reverse engineering, and later identifying the structures from [0]\n> leading to our custom definition of struct Ipu3AwbCell.\n> \n> [0]\n> https://chromium.googlesource.com/chromiumos/platform/arc-camera/+/refs/heads/master/hal/intel/include/ia_imaging/awb_public.h\n> \n> To improve the kernel interface, a proposal has been made to the\n> linux-kernel [1] to incorporate the memory layout for each cell into the\n> intel-ipu3 header directly.\n> \n> [1]\n> https://lore.kernel.org/linux-media/20210831185140.77400-1-jeanmichel.hautbois@ideasonboard.com/\n> \n> Update our local copy of the intel-ipu3.h to match the proposal and\n> change the AGC and AWB algorithms to reference that structure directly,\n> allowing us to remove the deprecated custom Ipu3AwbCell definition.\n> \n> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>\n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  include/linux/intel-ipu3.h      | 28 ++++++++++++++++++++++++++--\n>  src/ipa/ipu3/algorithms/agc.cpp | 11 +++++------\n>  src/ipa/ipu3/algorithms/awb.cpp | 13 ++++++-------\n>  src/ipa/ipu3/algorithms/awb.h   | 10 ----------\n>  4 files changed, 37 insertions(+), 25 deletions(-)\n> \n> diff --git a/include/linux/intel-ipu3.h b/include/linux/intel-ipu3.h\n> index ee0e6d0e..a9de8c11 100644\n> --- a/include/linux/intel-ipu3.h\n> +++ b/include/linux/intel-ipu3.h\n> @@ -59,6 +59,29 @@ struct ipu3_uapi_grid_config {\n>  \t__u16 y_end;\n>  } __attribute__((packed));\n>  \n> +/**\n> + * struct ipu3_uapi_awb_set_item - Memory layout for each cell in AWB\n> + *\n> + * @Gr_avg:\tGreen average for red lines in the cell.\n> + * @R_avg:\tRed average in the cell.\n> + * @B_avg:\tBlue average in the cell.\n> + * @Gb_avg:\tGreen average for blue lines in the cell.\n> + * @sat_ratio:  Saturation ratio in the cell.\n> + * @padding0:   Unused byte for padding.\n> + * @padding1:   Unused byte for padding.\n> + * @padding2:   Unused byte for padding.\n> + */\n> +struct ipu3_uapi_awb_set_item {\n> +\tunsigned char Gr_avg;\n> +\tunsigned char R_avg;\n> +\tunsigned char B_avg;\n> +\tunsigned char Gb_avg;\n> +\tunsigned char sat_ratio;\n> +\tunsigned char padding0;\n> +\tunsigned char padding1;\n> +\tunsigned char padding2;\n> +} __attribute__((packed));\n> +\n>  /*\n>   * The grid based data is divided into \"slices\" called set, each slice of setX\n>   * refers to ipu3_uapi_grid_config width * height_per_slice.\n> @@ -72,7 +95,8 @@ struct ipu3_uapi_grid_config {\n>  \t IPU3_UAPI_AWB_MD_ITEM_SIZE)\n>  #define IPU3_UAPI_AWB_MAX_BUFFER_SIZE \\\n>  \t(IPU3_UAPI_AWB_MAX_SETS * \\\n> -\t (IPU3_UAPI_AWB_SET_SIZE + IPU3_UAPI_AWB_SPARE_FOR_BUBBLES))\n> +\t (IPU3_UAPI_AWB_SET_SIZE + IPU3_UAPI_AWB_SPARE_FOR_BUBBLES)) / \\\n> +\t sizeof(ipu3_uapi_awb_set_item)\n>  \n>  \n>  /**\n> @@ -82,7 +106,7 @@ struct ipu3_uapi_grid_config {\n>   *\t\tthe average values for each color channel.\n>   */\n>  struct ipu3_uapi_awb_raw_buffer {\n> -\t__u8 meta_data[IPU3_UAPI_AWB_MAX_BUFFER_SIZE]\n> +\tstruct ipu3_uapi_awb_set_item meta_data[IPU3_UAPI_AWB_MAX_BUFFER_SIZE]\n>  \t\t__attribute__((aligned(32)));\n>  } __attribute__((packed));\n>  \n> diff --git a/src/ipa/ipu3/algorithms/agc.cpp b/src/ipa/ipu3/algorithms/agc.cpp\n> index 52e8015e..a3e910b7 100644\n> --- a/src/ipa/ipu3/algorithms/agc.cpp\n> +++ b/src/ipa/ipu3/algorithms/agc.cpp\n> @@ -72,14 +72,13 @@ void Agc::processBrightness(const ipu3_uapi_stats_3a *stats,\n>  \n>  \tfor (unsigned int cellY = 0; cellY < grid.height; cellY++) {\n>  \t\tfor (unsigned int cellX = 0; cellX < grid.width; cellX++) {\n> -\t\t\tuint32_t cellPosition = (cellY * grid.width + cellX)\n> -\t\t\t\t\t      * sizeof(Ipu3AwbCell);\n> +\t\t\tuint32_t cellPosition = cellY * grid.width + cellX;\n>  \n>  \t\t\t/* Cast the initial IPU3 structure to simplify the reading */\n> -\t\t\tIpu3AwbCell *currentCell = reinterpret_cast<Ipu3AwbCell *>(const_cast<uint8_t *>(&stats->awb_raw_buffer.meta_data[cellPosition]));\n> -\t\t\tif (currentCell->satRatio == 0) {\n> -\t\t\t\tuint8_t Gr = currentCell->greenRedAvg;\n> -\t\t\t\tuint8_t Gb = currentCell->greenBlueAvg;\n> +\t\t\tconst ipu3_uapi_awb_set_item *currentCell = &stats->awb_raw_buffer.meta_data[cellPosition];\n\nNaming the variable \"cell\" will give you shorter lines without any\ndecrease in readability (I think). Same below.\n\n> +\t\t\tif (currentCell->sat_ratio == 0) {\n> +\t\t\t\tuint8_t Gr = currentCell->Gr_avg;\n> +\t\t\t\tuint8_t Gb = currentCell->Gb_avg;\n>  \t\t\t\thist[(Gr + Gb) / 2]++;\n>  \t\t\t}\n>  \t\t}\n> diff --git a/src/ipa/ipu3/algorithms/awb.cpp b/src/ipa/ipu3/algorithms/awb.cpp\n> index b96a6ebf..6d8438af 100644\n> --- a/src/ipa/ipu3/algorithms/awb.cpp\n> +++ b/src/ipa/ipu3/algorithms/awb.cpp\n> @@ -229,22 +229,21 @@ void Awb::generateAwbStats(const ipu3_uapi_stats_3a *stats,\n>  \t */\n>  \tfor (unsigned int cellY = 0; cellY < kAwbStatsSizeY * cellsPerZoneY; cellY++) {\n>  \t\tfor (unsigned int cellX = 0; cellX < kAwbStatsSizeX * cellsPerZoneX; cellX++) {\n> -\t\t\tuint32_t cellPosition = (cellY * grid.width + cellX)\n> -\t\t\t\t\t      * sizeof(Ipu3AwbCell);\n> +\t\t\tuint32_t cellPosition = cellY * grid.width + cellX;\n>  \t\t\tuint32_t zoneX = cellX / cellsPerZoneX;\n>  \t\t\tuint32_t zoneY = cellY / cellsPerZoneY;\n>  \n>  \t\t\tuint32_t awbZonePosition = zoneY * kAwbStatsSizeX + zoneX;\n>  \n>  \t\t\t/* Cast the initial IPU3 structure to simplify the reading */\n> -\t\t\tIpu3AwbCell *currentCell = reinterpret_cast<Ipu3AwbCell *>(const_cast<uint8_t *>(&stats->awb_raw_buffer.meta_data[cellPosition]));\n> -\t\t\tif (currentCell->satRatio == 0) {\n> +\t\t\tconst ipu3_uapi_awb_set_item *currentCell = &stats->awb_raw_buffer.meta_data[cellPosition];\n> +\t\t\tif (currentCell->sat_ratio == 0) {\n>  \t\t\t\t/* The cell is not saturated, use the current cell */\n>  \t\t\t\tawbStats_[awbZonePosition].counted++;\n> -\t\t\t\tuint32_t greenValue = currentCell->greenRedAvg + currentCell->greenBlueAvg;\n> +\t\t\t\tuint32_t greenValue = currentCell->Gr_avg + currentCell->Gb_avg;\n>  \t\t\t\tawbStats_[awbZonePosition].sum.green += greenValue / 2;\n> -\t\t\t\tawbStats_[awbZonePosition].sum.red += currentCell->redAvg;\n> -\t\t\t\tawbStats_[awbZonePosition].sum.blue += currentCell->blueAvg;\n> +\t\t\t\tawbStats_[awbZonePosition].sum.red += currentCell->R_avg;\n> +\t\t\t\tawbStats_[awbZonePosition].sum.blue += currentCell->B_avg;\n>  \t\t\t}\n>  \t\t}\n>  \t}\n> diff --git a/src/ipa/ipu3/algorithms/awb.h b/src/ipa/ipu3/algorithms/awb.h\n> index 3385ebe7..17905ae8 100644\n> --- a/src/ipa/ipu3/algorithms/awb.h\n> +++ b/src/ipa/ipu3/algorithms/awb.h\n> @@ -23,16 +23,6 @@ namespace ipa::ipu3::algorithms {\n>  static constexpr uint32_t kAwbStatsSizeX = 16;\n>  static constexpr uint32_t kAwbStatsSizeY = 12;\n>  \n> -/* \\todo Move the cell layout into intel-ipu3.h kernel header */\n> -struct Ipu3AwbCell {\n> -\tunsigned char greenRedAvg;\n> -\tunsigned char redAvg;\n> -\tunsigned char blueAvg;\n> -\tunsigned char greenBlueAvg;\n> -\tunsigned char satRatio;\n> -\tunsigned char padding[3];\n> -} __attribute__((packed));\n> -\n>  struct Accumulator {\n>  \tunsigned int counted;\n>  \tstruct {","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 79996BDB1D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 14 Sep 2021 22:25:04 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id DAA836918A;\n\tWed, 15 Sep 2021 00:25:03 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EE00360249\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 15 Sep 2021 00:25:01 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 615992A5;\n\tWed, 15 Sep 2021 00:25:01 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"S0Q9SDEd\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1631658301;\n\tbh=3XACy7h32Mu2ahrU7hQMfBANjpRkcYLB5VBdH6p5RQY=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=S0Q9SDEdfZHUVpVKY5gLvG4v4fdZREB9jPfABA9rklo43SgaWxXZwINH5wJc++nqt\n\t+9jXMLcr5UMDusLfKwny2Ud3KCumNr19XBEhpo7MzL1gn7hSAbnWMtRvSNHOsMYAlp\n\tWJtm/HBu1oH2QXyTRoaQGBQpYHQ7r6hITu/Misyg=","Date":"Wed, 15 Sep 2021 01:24:36 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>","Message-ID":"<YUEhJEn21iaX9Tf8@pendragon.ideasonboard.com>","References":"<20210914163709.85751-1-jeanmichel.hautbois@ideasonboard.com>\n\t<20210914163709.85751-6-jeanmichel.hautbois@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20210914163709.85751-6-jeanmichel.hautbois@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v8 5/5] ipa: ipu3: Replace\n\tipa::ipu3::algorithms::Ipu3AwbCell","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]