[{"id":24184,"web_url":"https://patchwork.libcamera.org/comment/24184/","msgid":"<CAEmqJPq+VT5gdoRpk6KODaudxXt=O+5==WzKHyjeDptHnD=DgQ@mail.gmail.com>","date":"2022-07-27T10:54:54","subject":"Re: [libcamera-devel] [PATCH v7 07/14] ipa: raspberrypi: Replace\n\tFatal log by error propagation","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Laurent,\n\nThank you for your patch.\n\nOn Wed, 27 Jul 2022 at 03:38, Laurent Pinchart <\nlaurent.pinchart@ideasonboard.com> wrote:\n\n> Replace the Fatal log messages that cause an abort during tuning data\n> read with Error messages and proper error propagation to the caller.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n>\n\nReviewed-by: Naushir Patuck <naush@raspberrypi.com>\n\n\n> ---\n>  src/ipa/raspberrypi/controller/rpi/agc.cpp  | 36 ++++++++++----\n>  src/ipa/raspberrypi/controller/rpi/alsc.cpp | 52 ++++++++++++++-------\n>  src/ipa/raspberrypi/controller/rpi/awb.cpp  | 42 +++++++++++------\n>  src/ipa/raspberrypi/controller/rpi/ccm.cpp  | 24 ++++++----\n>  src/ipa/raspberrypi/controller/rpi/dpc.cpp  |  6 ++-\n>  src/ipa/raspberrypi/controller/rpi/geq.cpp  |  6 ++-\n>  6 files changed, 113 insertions(+), 53 deletions(-)\n>\n> diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> index 93f966a1d5ce..153493f8b8e2 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> @@ -34,13 +34,20 @@ static constexpr unsigned int PipelineBits = 13; /*\n> seems to be a 13-bit pipelin\n>  int AgcMeteringMode::read(boost::property_tree::ptree const &params)\n>  {\n>         int num = 0;\n> +\n>         for (auto &p : params.get_child(\"weights\")) {\n> -               if (num == AgcStatsSize)\n> -                       LOG(RPiAgc, Fatal) << \"AgcMeteringMode: too many\n> weights\";\n> +               if (num == AgcStatsSize) {\n> +                       LOG(RPiAgc, Error) << \"AgcMeteringMode: too many\n> weights\";\n> +                       return -EINVAL;\n> +               }\n>                 weights[num++] = p.second.get_value<double>();\n>         }\n> -       if (num != AgcStatsSize)\n> -               LOG(RPiAgc, Fatal) << \"AgcMeteringMode: insufficient\n> weights\";\n> +\n> +       if (num != AgcStatsSize) {\n> +               LOG(RPiAgc, Error) << \"AgcMeteringMode: insufficient\n> weights\";\n> +               return -EINVAL;\n> +       }\n> +\n>         return 0;\n>  }\n>\n> @@ -85,12 +92,19 @@ int AgcExposureMode::read(boost::property_tree::ptree\n> const &params)\n>  {\n>         int numShutters = readList(shutter, params.get_child(\"shutter\"));\n>         int numAgs = readList(gain, params.get_child(\"gain\"));\n> -       if (numShutters < 2 || numAgs < 2)\n> -               LOG(RPiAgc, Fatal)\n> +\n> +       if (numShutters < 2 || numAgs < 2) {\n> +               LOG(RPiAgc, Error)\n>                         << \"AgcExposureMode: must have at least two\n> entries in exposure profile\";\n> -       if (numShutters != numAgs)\n> -               LOG(RPiAgc, Fatal)\n> +               return -EINVAL;\n> +       }\n> +\n> +       if (numShutters != numAgs) {\n> +               LOG(RPiAgc, Error)\n>                         << \"AgcExposureMode: expect same number of\n> exposure and gain entries in exposure profile\";\n> +               return -EINVAL;\n> +       }\n> +\n>         return 0;\n>  }\n>\n> @@ -120,8 +134,10 @@ int AgcConstraint::read(boost::property_tree::ptree\n> const &params)\n>         std::string boundString = params.get<std::string>(\"bound\", \"\");\n>         transform(boundString.begin(), boundString.end(),\n>                   boundString.begin(), ::toupper);\n> -       if (boundString != \"UPPER\" && boundString != \"LOWER\")\n> -               LOG(RPiAgc, Fatal) << \"AGC constraint type should be UPPER\n> or LOWER\";\n> +       if (boundString != \"UPPER\" && boundString != \"LOWER\") {\n> +               LOG(RPiAgc, Error) << \"AGC constraint type should be UPPER\n> or LOWER\";\n> +               return -EINVAL;\n> +       }\n>         bound = boundString == \"UPPER\" ? Bound::UPPER : Bound::LOWER;\n>         qLo = params.get<double>(\"q_lo\");\n>         qHi = params.get<double>(\"q_hi\");\n> diff --git a/src/ipa/raspberrypi/controller/rpi/alsc.cpp\n> b/src/ipa/raspberrypi/controller/rpi/alsc.cpp\n> index b36277696a52..49aaf6b74603 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/alsc.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/alsc.cpp\n> @@ -53,11 +53,17 @@ char const *Alsc::name() const\n>  static int generateLut(double *lut, boost::property_tree::ptree const\n> &params)\n>  {\n>         double cstrength = params.get<double>(\"corner_strength\", 2.0);\n> -       if (cstrength <= 1.0)\n> -               LOG(RPiAlsc, Fatal) << \"Alsc: corner_strength must be >\n> 1.0\";\n> +       if (cstrength <= 1.0) {\n> +               LOG(RPiAlsc, Error) << \"corner_strength must be > 1.0\";\n> +               return -EINVAL;\n> +       }\n> +\n>         double asymmetry = params.get<double>(\"asymmetry\", 1.0);\n> -       if (asymmetry < 0)\n> -               LOG(RPiAlsc, Fatal) << \"Alsc: asymmetry must be >= 0\";\n> +       if (asymmetry < 0) {\n> +               LOG(RPiAlsc, Error) << \"asymmetry must be >= 0\";\n> +               return -EINVAL;\n> +       }\n> +\n>         double f1 = cstrength - 1, f2 = 1 + sqrt(cstrength);\n>         double R2 = X * Y / 4 * (1 + asymmetry * asymmetry);\n>         int num = 0;\n> @@ -78,13 +84,19 @@ static int readLut(double *lut,\n> boost::property_tree::ptree const &params)\n>  {\n>         int num = 0;\n>         const int maxNum = XY;\n> +\n>         for (auto &p : params) {\n> -               if (num == maxNum)\n> -                       LOG(RPiAlsc, Fatal) << \"Alsc: too many entries in\n> LSC table\";\n> +               if (num == maxNum) {\n> +                       LOG(RPiAlsc, Error) << \"Too many entries in LSC\n> table\";\n> +                       return -EINVAL;\n> +               }\n>                 lut[num++] = p.second.get_value<double>();\n>         }\n> -       if (num < maxNum)\n> -               LOG(RPiAlsc, Fatal) << \"Alsc: too few entries in LSC\n> table\";\n> +\n> +       if (num < maxNum) {\n> +               LOG(RPiAlsc, Error) << \"Too few entries in LSC table\";\n> +               return -EINVAL;\n> +       }\n>         return 0;\n>  }\n>\n> @@ -96,24 +108,30 @@ static int\n> readCalibrations(std::vector<AlscCalibration> &calibrations,\n>                 double lastCt = 0;\n>                 for (auto &p : params.get_child(name)) {\n>                         double ct = p.second.get<double>(\"ct\");\n> -                       if (ct <= lastCt)\n> -                               LOG(RPiAlsc, Fatal)\n> -                                       << \"Alsc: entries in \" << name <<\n> \" must be in increasing ct order\";\n> +                       if (ct <= lastCt) {\n> +                               LOG(RPiAlsc, Error)\n> +                                       << \"Entries in \" << name << \" must\n> be in increasing ct order\";\n> +                               return -EINVAL;\n> +                       }\n>                         AlscCalibration calibration;\n>                         calibration.ct = lastCt = ct;\n>                         boost::property_tree::ptree const &table =\n>                                 p.second.get_child(\"table\");\n>                         int num = 0;\n>                         for (auto it = table.begin(); it != table.end();\n> it++) {\n> -                               if (num == XY)\n> -                                       LOG(RPiAlsc, Fatal)\n> -                                               << \"Alsc: too many values\n> for ct \" << ct << \" in \" << name;\n> +                               if (num == XY) {\n> +                                       LOG(RPiAlsc, Error)\n> +                                               << \"Too many values for ct\n> \" << ct << \" in \" << name;\n> +                                       return -EINVAL;\n> +                               }\n>                                 calibration.table[num++] =\n>                                         it->second.get_value<double>();\n>                         }\n> -                       if (num != XY)\n> -                               LOG(RPiAlsc, Fatal)\n> -                                       << \"Alsc: too few values for ct \"\n> << ct << \" in \" << name;\n> +                       if (num != XY) {\n> +                               LOG(RPiAlsc, Error)\n> +                                       << \"Too few values for ct \" << ct\n> << \" in \" << name;\n> +                               return -EINVAL;\n> +                       }\n>                         calibrations.push_back(calibration);\n>                         LOG(RPiAlsc, Debug)\n>                                 << \"Read \" << name << \" calibration for ct\n> \" << ct;\n> diff --git a/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> b/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> index a9e776a344a1..10c49c126341 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> @@ -46,16 +46,22 @@ static int readCtCurve(Pwl &ctR, Pwl &ctB,\n>         for (auto it = params.begin(); it != params.end(); it++) {\n>                 double ct = it->second.get_value<double>();\n>                 assert(it == params.begin() || ct != ctR.domain().end);\n> -               if (++it == params.end())\n> -                       LOG(RPiAwb, Fatal) << \"AwbConfig: incomplete CT\n> curve entry\";\n> +               if (++it == params.end()) {\n> +                       LOG(RPiAwb, Error) << \"AwbConfig: incomplete CT\n> curve entry\";\n> +                       return -EINVAL;\n> +               }\n>                 ctR.append(ct, it->second.get_value<double>());\n> -               if (++it == params.end())\n> -                       LOG(RPiAwb, Fatal) << \"AwbConfig: incomplete CT\n> curve entry\";\n> +               if (++it == params.end()) {\n> +                       LOG(RPiAwb, Error) << \"AwbConfig: incomplete CT\n> curve entry\";\n> +                       return -EINVAL;\n> +               }\n>                 ctB.append(ct, it->second.get_value<double>());\n>                 num++;\n>         }\n> -       if (num < 2)\n> -               LOG(RPiAwb, Fatal) << \"AwbConfig: insufficient points in\n> CT curve\";\n> +       if (num < 2) {\n> +               LOG(RPiAwb, Error) << \"AwbConfig: insufficient points in\n> CT curve\";\n> +               return -EINVAL;\n> +       }\n>         return 0;\n>  }\n>\n> @@ -78,12 +84,16 @@ int AwbConfig::read(boost::property_tree::ptree const\n> &params)\n>                         ret = prior.read(p.second);\n>                         if (ret)\n>                                 return ret;\n> -                       if (!priors.empty() && prior.lux <=\n> priors.back().lux)\n> -                               LOG(RPiAwb, Fatal) << \"AwbConfig: Prior\n> must be ordered in increasing lux value\";\n> +                       if (!priors.empty() && prior.lux <=\n> priors.back().lux) {\n> +                               LOG(RPiAwb, Error) << \"AwbConfig: Prior\n> must be ordered in increasing lux value\";\n> +                               return -EINVAL;\n> +                       }\n>                         priors.push_back(prior);\n>                 }\n> -               if (priors.empty())\n> -                       LOG(RPiAwb, Fatal) << \"AwbConfig: no AWB priors\n> configured\";\n> +               if (priors.empty()) {\n> +                       LOG(RPiAwb, Error) << \"AwbConfig: no AWB priors\n> configured\";\n> +                       return ret;\n> +               }\n>         }\n>         if (params.get_child_optional(\"modes\")) {\n>                 for (auto &p : params.get_child(\"modes\")) {\n> @@ -93,8 +103,10 @@ int AwbConfig::read(boost::property_tree::ptree const\n> &params)\n>                         if (defaultMode == nullptr)\n>                                 defaultMode = &modes[p.first];\n>                 }\n> -               if (defaultMode == nullptr)\n> -                       LOG(RPiAwb, Fatal) << \"AwbConfig: no AWB modes\n> configured\";\n> +               if (defaultMode == nullptr) {\n> +                       LOG(RPiAwb, Error) << \"AwbConfig: no AWB modes\n> configured\";\n> +                       return -EINVAL;\n> +               }\n>         }\n>         minPixels = params.get<double>(\"min_pixels\", 16.0);\n>         minG = params.get<uint16_t>(\"min_G\", 32);\n> @@ -103,8 +115,10 @@ int AwbConfig::read(boost::property_tree::ptree const\n> &params)\n>         coarseStep = params.get<double>(\"coarse_step\", 0.2);\n>         transversePos = params.get<double>(\"transverse_pos\", 0.01);\n>         transverseNeg = params.get<double>(\"transverse_neg\", 0.01);\n> -       if (transversePos <= 0 || transverseNeg <= 0)\n> -               LOG(RPiAwb, Fatal) << \"AwbConfig: transverse_pos/neg must\n> be > 0\";\n> +       if (transversePos <= 0 || transverseNeg <= 0) {\n> +               LOG(RPiAwb, Error) << \"AwbConfig: transverse_pos/neg must\n> be > 0\";\n> +               return -EINVAL;\n> +       }\n>         sensitivityR = params.get<double>(\"sensitivity_r\", 1.0);\n>         sensitivityB = params.get<double>(\"sensitivity_b\", 1.0);\n>         if (bayes) {\n> diff --git a/src/ipa/raspberrypi/controller/rpi/ccm.cpp\n> b/src/ipa/raspberrypi/controller/rpi/ccm.cpp\n> index f0110d38f548..9588e94adeb1 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/ccm.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/ccm.cpp\n> @@ -44,12 +44,16 @@ int Matrix::read(boost::property_tree::ptree const\n> &params)\n>         double *ptr = (double *)m;\n>         int n = 0;\n>         for (auto it = params.begin(); it != params.end(); it++) {\n> -               if (n++ == 9)\n> -                       LOG(RPiCcm, Fatal) << \"Ccm: too many values in\n> CCM\";\n> +               if (n++ == 9) {\n> +                       LOG(RPiCcm, Error) << \"Too many values in CCM\";\n> +                       return -EINVAL;\n> +               }\n>                 *ptr++ = it->second.get_value<double>();\n>         }\n> -       if (n < 9)\n> -               LOG(RPiCcm, Fatal) << \"Ccm: too few values in CCM\";\n> +       if (n < 9) {\n> +               LOG(RPiCcm, Error) << \"Too few values in CCM\";\n> +               return -EINVAL;\n> +       }\n>         return 0;\n>  }\n>\n> @@ -78,13 +82,17 @@ int Ccm::read(boost::property_tree::ptree const\n> &params)\n>                 if (ret)\n>                         return ret;\n>                 if (!config_.ccms.empty() &&\n> -                   ctCcm.ct <= config_.ccms.back().ct)\n> -                       LOG(RPiCcm, Fatal) << \"Ccm: CCM not in increasing\n> colour temperature order\";\n> +                   ctCcm.ct <= config_.ccms.back().ct) {\n> +                       LOG(RPiCcm, Error) << \"CCM not in increasing\n> colour temperature order\";\n> +                       return -EINVAL;\n> +               }\n>                 config_.ccms.push_back(std::move(ctCcm));\n>         }\n>\n> -       if (config_.ccms.empty())\n> -               LOG(RPiCcm, Fatal) << \"Ccm: no CCMs specified\";\n> +       if (config_.ccms.empty()) {\n> +               LOG(RPiCcm, Error) << \"No CCMs specified\";\n> +               return -EINVAL;\n> +       }\n>\n>         return 0;\n>  }\n> diff --git a/src/ipa/raspberrypi/controller/rpi/dpc.cpp\n> b/src/ipa/raspberrypi/controller/rpi/dpc.cpp\n> index be014a05fd41..def39bb7416a 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/dpc.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/dpc.cpp\n> @@ -34,8 +34,10 @@ char const *Dpc::name() const\n>  int Dpc::read(boost::property_tree::ptree const &params)\n>  {\n>         config_.strength = params.get<int>(\"strength\", 1);\n> -       if (config_.strength < 0 || config_.strength > 2)\n> -               LOG(RPiDpc, Fatal) << \"Dpc: bad strength value\";\n> +       if (config_.strength < 0 || config_.strength > 2) {\n> +               LOG(RPiDpc, Error) << \"bad strength value\";\n> +               return -EINVAL;\n> +       }\n>         return 0;\n>  }\n>\n> diff --git a/src/ipa/raspberrypi/controller/rpi/geq.cpp\n> b/src/ipa/raspberrypi/controller/rpi/geq.cpp\n> index a74447877bf8..106f0a40dfc1 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/geq.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/geq.cpp\n> @@ -39,8 +39,10 @@ int Geq::read(boost::property_tree::ptree const &params)\n>  {\n>         config_.offset = params.get<uint16_t>(\"offset\", 0);\n>         config_.slope = params.get<double>(\"slope\", 0.0);\n> -       if (config_.slope < 0.0 || config_.slope >= 1.0)\n> -               LOG(RPiGeq, Fatal) << \"Geq: bad slope value\";\n> +       if (config_.slope < 0.0 || config_.slope >= 1.0) {\n> +               LOG(RPiGeq, Error) << \"Bad slope value\";\n> +               return -EINVAL;\n> +       }\n>\n>         if (params.get_child_optional(\"strength\")) {\n>                 int ret =\n> config_.strength.read(params.get_child(\"strength\"));\n> --\n> Regards,\n>\n> Laurent Pinchart\n>\n>","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 0E667BE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 27 Jul 2022 10:55:13 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5DFF663313;\n\tWed, 27 Jul 2022 12:55:12 +0200 (CEST)","from mail-lf1-x12e.google.com (mail-lf1-x12e.google.com\n\t[IPv6:2a00:1450:4864:20::12e])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 05C9863309\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 27 Jul 2022 12:55:11 +0200 (CEST)","by mail-lf1-x12e.google.com with SMTP id t17so14297202lfk.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 27 Jul 2022 03:55:10 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1658919312;\n\tbh=9l1j7oxN7VVn2xsqAcYC/IkxYfbcBl00YVv4tM8YJnk=;\n\th=References:In-Reply-To:Date:To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=TZ9uo1Gyiri3omBQCRwTG/fvTqN7Y/XpuzaXy3P35wGhamvrKhVvDysvD2KvuAojj\n\tgCtsNQzXZNhWCrRf/NIO2f+FcIF/jdlgoQM16mUjAR0lr5W8cLDOz9MkNYBSQKV1qw\n\tuyDJo4q2OkN2KmIX2MKXMbyDaasO6+8KxWgwKvemFV3IkLdQTR8bnOl9wXlDhKZol1\n\tppP2MgHfbMKUHEhupGk30L6O7Fy2urbRVEblKrHL0C+Vr+GvbcKwaQVJvTad87IUvH\n\tEHO0Dh6aw01jffrj94AL0hqw4jrvljRI4PR0b4FkLaYoRH82JZ/EmAQeE5QYUUZGQX\n\td+mGf76BbHuBg==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=0q76Iw+Qh6HwYIfSnmtjpYlOqfqribkLN3IgK2oxu9M=;\n\tb=pn8mGGWM+jXrgYNMp2JSdr79Ydqp4tGy15pgb+56j6DbClGxHSSE+lUhFfALxOVEHC\n\ttDRx9OQ2HHNa+0JOiwuu8dSr4dp0Jfex9Xvgarn+KLvfS5gQj/kce2LDpY5A0Xf0oUBU\n\trJtGKsTrkx/LQHhpfc8xmgDjLXMsuuy1SNaAy7KNK9/LjgLYQYrTeQy6tl1BAOZBwNzL\n\t5qzv+zM0CYU7rWnURuaL6t9kRZQL45Q89bl2iAM3dHff/rh691ctGySsmJ7b9HNN4sqa\n\tBmcVvU6cy3Ew6QTX5at15cfyDMRcCfgwoJgxv3MK6JhD7SU3bRPxbFzcLTZBZiRgurZt\n\tvWLw=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"pn8mGGWM\"; dkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=0q76Iw+Qh6HwYIfSnmtjpYlOqfqribkLN3IgK2oxu9M=;\n\tb=CMOJRZ/qC31YcGltZ6gVX6uPCJvCioFwVZ/BM9Ql+pnJepXkY10Wib2hQbSq5ocfLK\n\t43oX8cSfD1KU2RTFPGH5vCJ6fbJhE4laKcqZ37qFckzGiuo5WaRAfBUU3Q2a7gk8kXs/\n\t7ocz+mcHPp4XLk6o7Qo0xwl9X5Ok744oxTWCg+i6H0Qh4kRi/6JiT7jDTxQ3/+Ej9ouY\n\tjRaMgho2ZtvkS4E0RXX4AnyDMnrLUIwSzIPHN2UvpyPJPE3xUXsxpXxBiGnW4LihVVJK\n\t5xizVG0FBFU1xZtfsFhKQdSWE8ePZfFIx5M4jZiRTB8OU003yMmmqXh/pM2EAFVCzDp/\n\tLtTQ==","X-Gm-Message-State":"AJIora9zz46b/I/q1baccibxwi8r9XtVb0MPUinbgRxRIUXZygW8Rl/M\n\tBmBsghJo8NK4E38jiwuFQqkWIHAx1uCP1viT5U80ng==","X-Google-Smtp-Source":"AGRyM1tduabl4ii7XmTnF+Jfddct5Haoy6pxPu/w8PbbJQgstiV3qgCOp4rd04A2U8Pj+6eTdmE9qoNleMHlt6UhMlU=","X-Received":"by 2002:ac2:4a85:0:b0:48a:95fb:7e1f with SMTP id\n\tl5-20020ac24a85000000b0048a95fb7e1fmr4352052lfp.354.1658919310247;\n\tWed, 27 Jul 2022 03:55:10 -0700 (PDT)","MIME-Version":"1.0","References":"<20220727023816.30008-1-laurent.pinchart@ideasonboard.com>\n\t<20220727023816.30008-8-laurent.pinchart@ideasonboard.com>","In-Reply-To":"<20220727023816.30008-8-laurent.pinchart@ideasonboard.com>","Date":"Wed, 27 Jul 2022 11:54:54 +0100","Message-ID":"<CAEmqJPq+VT5gdoRpk6KODaudxXt=O+5==WzKHyjeDptHnD=DgQ@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"00000000000032e10105e4c74074\"","Subject":"Re: [libcamera-devel] [PATCH v7 07/14] ipa: raspberrypi: Replace\n\tFatal log by error propagation","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>","From":"Naushir Patuck via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Naushir Patuck <naush@raspberrypi.com>","Cc":"libcamera devel <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]