Show a patch.

GET /api/patches/27514/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 27514,
    "url": "https://patchwork.libcamera.org/api/patches/27514/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/27514/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/projects/1/?format=api",
        "name": "libcamera",
        "link_name": "libcamera",
        "list_id": "libcamera_core",
        "list_email": "libcamera-devel@lists.libcamera.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20260728172447.68551-2-johannes.goede@oss.qualcomm.com>",
    "date": "2026-07-28T17:24:43",
    "name": "[v6,1/5] libcamera: Create IPA by name",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "bebbda4bd6176e4f0fae2bab955598dbc5d2929d",
    "submitter": {
        "id": 242,
        "url": "https://patchwork.libcamera.org/api/people/242/?format=api",
        "name": "Hans de Goede",
        "email": "johannes.goede@oss.qualcomm.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/27514/mbox/",
    "series": [
        {
            "id": 6088,
            "url": "https://patchwork.libcamera.org/api/series/6088/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=6088",
            "date": "2026-07-28T17:24:42",
            "name": "ipa: Allow IPA creation by name",
            "version": 6,
            "mbox": "https://patchwork.libcamera.org/series/6088/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/27514/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/27514/checks/",
    "tags": {},
    "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 13C4CC3264\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 28 Jul 2026 17:24:58 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 12EC967FA0;\n\tTue, 28 Jul 2026 19:24:56 +0200 (CEST)",
            "from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com\n\t[205.220.180.131])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2BABC67F96\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 28 Jul 2026 19:24:53 +0200 (CEST)",
            "from pps.filterd (m0279873.ppops.net [127.0.0.1])\n\tby mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n\t66SEcdGk3063296 for <libcamera-devel@lists.libcamera.org>;\n\tTue, 28 Jul 2026 17:24:52 GMT",
            "from mail-qt1-f200.google.com (mail-qt1-f200.google.com\n\t[209.85.160.200])\n\tby mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fpuyg9x4w-1\n\t(version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 28 Jul 2026 17:24:51 +0000 (GMT)",
            "by mail-qt1-f200.google.com with SMTP id\n\td75a77b69052e-51bfe3fa93bso864971cf.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 28 Jul 2026 10:24:51 -0700 (PDT)",
            "from t14s\n\t(2001-1c00-0c32-7800-07d4-cca3-ec08-7ac7.cable.dynamic.v6.ziggo.nl.\n\t[2001:1c00:c32:7800:7d4:cca3:ec08:7ac7])\n\tby smtp.gmail.com with ESMTPSA id\n\ta640c23a62f3a-c1f83fabcdasm11136466b.48.2026.07.28.10.24.49\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 28 Jul 2026 10:24:49 -0700 (PDT)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=qualcomm.com header.i=@qualcomm.com\n\theader.b=\"Qch0L7cE\"; dkim=pass (2048-bit key;\n\tunprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n\theader.b=\"L/P5KRic\"; dkim-atps=neutral",
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n\tcc:content-transfer-encoding:content-type:date:from:in-reply-to\n\t:message-id:mime-version:references:subject:to; s=qcppdkim1; bh=\n\tYvOLWZaa2ARsXpTzaMH55lyGJ5u3pN7HFbz+LZe8YQQ=; b=Qch0L7cEY48MxcM0\n\tGJZF+16564a02xvRswuEeAYffi5zIiBtZE6wB7by1WYn2L7a+fHZYRtY91hfls/x\n\tUQnjC62JmmfSk841+0yRbu8pN7StpA9PEm3qrmANe0Gc4OqKaoycgOsKo+2+0OCu\n\tkzmcy6L+Q6tycA1GQPhjlmDJBug88sByqsf711X6d5QuWpHDmq087oWiO8D2AsyK\n\taqWoLFn81NT0T3R3Bj0aAI2xIGBx1EA8OO8QWZ7Me4xBOpe8+3+c/6lXpKiP2jwG\n\tetJBFS9IGOrlbfXDRsevz0MqyVV784uJ3T5YLBzcwbN0n/q9EPh/moqInzSzfC1H\n\tsauX1A==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=oss.qualcomm.com; s=google; t=1785259491; x=1785864291;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:content-type:mime-version:references\n\t:in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject\n\t:date:message-id:reply-to:content-type;\n\tbh=YvOLWZaa2ARsXpTzaMH55lyGJ5u3pN7HFbz+LZe8YQQ=;\n\tb=L/P5KRiccpf/72wXhIa+YYlj9oxRqc8rKisYjViVqPLUP52UYviFrKV0K7WpfLj1LH\n\tZ5kMCkdyyQHUURa55sK040WNpLlCn9bjwI0nQqgA4JqPsdKvzF+IbAjfhgQXLKQTz5Vn\n\tx0wWWbeDRrBdLju7HrjGCyi1WJs7r99cn9nYQC//jcLc0LJI+B37G0yTBCy3wX5kpBqP\n\t8AQ/2PC/RN3yxbOnBWoFismj0aG1PXnRpgJZk6fZ/6TYrlVzuIA4iNB91hNj1iydRXV4\n\t3QZZM6ODypF9OXH5JtZed2/GWVKP3/u/mAOItU1+d0RGHRXaI64JWyh8Rge8kNcm8isl\n\t7oTA=="
        ],
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1785259491; x=1785864291;\n\th=content-transfer-encoding:content-type:mime-version:references\n\t:in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg\n\t:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to\n\t:content-type;\n\tbh=YvOLWZaa2ARsXpTzaMH55lyGJ5u3pN7HFbz+LZe8YQQ=;\n\tb=lf3tBOIbZpzq3T8I8lyLItgmlL4BQDYTY2u+NoftnrdEcutcjoZltGJk0gBIljGTSn\n\tAYRvo2RcXAnD8LymRhr/JGZezfmQk7V4WS5uSH4vNIjEg9mhAikdfwMU+pCtKYdo81Vj\n\tKUK3LvjpjYcYWDlFTe/WcXDdItcIK59XTZNgupWYchdYZqG54dy1Oa4cBgfjiCTRs82b\n\tkE8ur5WOiZTpKL4UG+u88kDNagKAcOQRJ6nes3q2UT7Lyb9Il9g7AxiKv20zYDEdSazN\n\tF2grznBuAJGGVyhsMilWuR0qERCMuZ1OyrMryoKtaKW6I10JYH3/OiHoUUibAhF8DFxP\n\tJBTw==",
        "X-Gm-Message-State": "AOJu0Yyb0d17ZPk0VBJRgPpO5LFicrbRDCPuSnLi9oCJrSBzrYt1GEMj\n\tjfYJizN1HJzTQjwmtLpppqcGeD/v8va/sGctXVZuRIs5wvqFaWu52yCfXaxm2wiWbXBoeXa8XrK\n\tbjOh4x2z3STxGmfgjOPN7kwabKsgfaopRDbTagNBPZY0oReabEhzLkWfpvnoAqxIXOjK+abLJwk\n\tvs/j+oiL5v",
        "X-Gm-Gg": "AR+sD13jX2DKJ+xANqP73PZYRJTgPThpS70DKIUbimyPEH07yE7Hqge+tgOZYkRhBdk\n\tflTcjJWc8tAi5cVtvtnyP1glqY9UUY9HgaWXjcw/vf2O5UgkSDdv86r4ixKU/QPKEUyfthJpRCP\n\tUnPP2MlFtdqgJkY/a4WQt8OYydpsrLOrl8POaIBfSclNg6+fUh5ruF1BJ2/efRydwC4e0rD2x2i\n\ti2NdTI+BVe4yuvIJE7EVXxTzhSzmGnCEeso5zyChZOpoM6LM4Bcoz572z5MRjSSpFszXcKwWw/N\n\toxioGEjnpyC3jwL6tCH1xlyTlsySj3P1Zyzs1m9HmkqtbY++XQvz9O4cxmVqBfJF4xKN8b/oM0I\n\tfHk1ONTTy/6WDMaXBFtGHVjHNJtVaFNkNwaiWzJrhTbdTDbjlZ3l8HJo6XktiFMk45BHcNel/8s\n\t5XSNIleMKoXFI=",
        "X-Received": [
            "by 2002:ac8:7fc5:0:b0:51c:1590:8e28 with SMTP id\n\td75a77b69052e-529d6ffc7cfmr29856371cf.25.1785259490989; \n\tTue, 28 Jul 2026 10:24:50 -0700 (PDT)",
            "by 2002:ac8:7fc5:0:b0:51c:1590:8e28 with SMTP id\n\td75a77b69052e-529d6ffc7cfmr29856041cf.25.1785259490373; \n\tTue, 28 Jul 2026 10:24:50 -0700 (PDT)"
        ],
        "From": "Hans de Goede <johannes.goede@oss.qualcomm.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Jacopo Mondi <jacopo.mondi@ideasonboard.com>, =?utf-8?q?Niklas_S=C3=B6?=\n\t=?utf-8?q?derlund?= <niklas.soderlund+renesas@ragnatech.se>, Loic Poulain\n\t<loic.poulain@oss.qualcomm.com>, Hans de Goede\n\t<johannes.goede@oss.qualcomm.com>, Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>",
        "Subject": "[PATCH v6 1/5] libcamera: Create IPA by name",
        "Date": "Tue, 28 Jul 2026 19:24:43 +0200",
        "Message-ID": "<20260728172447.68551-2-johannes.goede@oss.qualcomm.com>",
        "X-Mailer": "git-send-email 2.54.0",
        "In-Reply-To": "<20260728172447.68551-1-johannes.goede@oss.qualcomm.com>",
        "References": "<20260728172447.68551-1-johannes.goede@oss.qualcomm.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-Proofpoint-GUID": "tqh5v5NryZ2WJYXHLAI6fOmY9xV2LnSN",
        "X-Proofpoint-ORIG-GUID": "tqh5v5NryZ2WJYXHLAI6fOmY9xV2LnSN",
        "X-Proofpoint-Spam-Details-Enc": "AW1haW4tMjYwNzI4MDE1MyBTYWx0ZWRfX0t+W1GchHYiI\n\t2g5SXiAzuB7tF3lNmlwLIi/vP+P8HLb0eFjcnG0eoDXyRMkgGBQwkPJKFkatw4ahqu9ljlQrqmX\n\tlHLK95bUeKFSI65fvKf3gRTfrSps+bmn+HMnlCLLJSuh+97tBUhYZ4wV1ZEC2hua//+4LSoyfJZ\n\tW+8qxZWLXUCiT7YgRK9jnhIG/xW0IQr7X/2o/NjKjuRLDo1uX6cFpg3MwYk9vtViF0B4HEgEOQJ\n\tUkGvo7jJVN3JPc0ETf+9sSADxEI5+KhmMklLh6A47UoCSplX+rKtKqDbnnqZGZycZvRiccOjXl2\n\tgn88rzx/96vt9lqA39zyrofVdWUqjQWKxV6c6e7sexpEq3Cajf1siysCvvviAvn8+dATrZo3xWH\n\tBnuU1AJBaa47pvM3q3YJGUgNt5wC1og3EjS3c9b+8+CTpzZkA4gPxaQ/2y0KHnrd0DeV+XKY3Ls\n\tLkH1mLGMA9ysGq0OAXw==",
        "X-Authority-Analysis": "v=2.4 cv=aoWCzyZV c=1 sm=1 tr=0 ts=6a68e5e3 cx=c_pps\n\ta=JbAStetqSzwMeJznSMzCyw==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10\n\ta=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22\n\ta=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=P1BnusSwAAAA:8\n\ta=EUspDBNiAAAA:8 a=rl81jYYfPRFGC34jM1YA:9 a=3ZKOabzyN94A:10\n\ta=QEXdDO2ut3YA:10\n\ta=uxP6HrT_eTzRwkO_Te1X:22 a=D0XLA9XvdZm18NrgonBM:22",
        "X-Proofpoint-Spam-Info": "AW1haW4tMjYwNzI4MDE1MyBTYWx0ZWRfX3zxqPGQssvqH\n\t8yiqM8G/Vtl45YIVXxKXhl13/7Q1dzTXCQFwkH96Z5I+c/K6TObGe9Ig2t+uRm0FSRf3TNcFEF+\n\tN3NMlNf5VoEc2YmIVOFuCzbylGW9ONE=",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n\tengine=ICAP:2.0.293, Aquarius:18.0.1143, Hydra:6.1.134,\n\tFMLib:17.12.100.49\n\tdefinitions=2026-07-28_04,2026-07-28_02,2025-10-01_01",
        "X-Proofpoint-Spam-Details": "rule=outbound_notspam policy=outbound score=0\n\tpriorityscore=1501 lowpriorityscore=0 clxscore=1015 spamscore=0\n\tbulkscore=0\n\tadultscore=0 malwarescore=0 impostorscore=0 phishscore=0\n\tsuspectscore=0\n\tclassifier=typeunknown authscore=0 authtc= authcc= route=outbound\n\tadjust=0\n\treason=mlx scancount=1 engine=8.22.0-2606150000\n\tdefinitions=main-2607280153",
        "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>",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "Currently createIPA() / IPAManager::module() assume that there is a 1:1\nrelationship between pipeline handlers and IPAs and IPA matching is done\nbased on matching the pipe to ipaModuleInfo.pipelineName[].\n\nOne way to allow using a single IPA with multiple pipelines would be to\nallow the IPA to declare itself compatible with more than one pipeline,\nturning ipaModuleInfo.pipelineName[] into e.g. a vector. But the way\nipaModuleInfo is loaded as an ELF symbol requires it to be a simple flat\nC-struct.\n\nInstead, move the IPA creation procedure to be name-based, introducing\na PipelineHandler::createIPA(name, minVer, maxVer) overload that allows\nto specify the name of the IPA module to match. Pipeline handlers that\nwants to use their name as matching criteria can continue doing so using\nthe already existing PipelineHandler::createIPA(minVer, maxVer) overload.\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\nTested-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>\nSigned-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\nSigned-off-by: Hans de Goede <johannes.goede@oss.qualcomm.com>\n---\nChanges in v5:\n- Rebase on top of db998e618aaa (\"libcamera: pipeline_handler: Add\n  createIPA() function\") which moved the createIPA() wrapper for\n  pipeline-handlers into the PipelineHandler class\n\nChanges in v4:\n- Rebase, change author to Hans' new email address\n\nChanges in v1 from Hans' original patch:\n- Slightly different approach addressing the review comments on Hans' v1\n  by creating an overload for PipelineHandler::createIPA() that allows\n  pipelines to specify the IPA module name.\n---\n include/libcamera/internal/ipa_manager.h      |  6 ++---\n include/libcamera/internal/ipa_module.h       |  4 +--\n include/libcamera/internal/pipeline_handler.h |  9 ++++++-\n src/libcamera/ipa_manager.cpp                 |  8 +++---\n src/libcamera/ipa_module.cpp                  | 14 +++++------\n src/libcamera/pipeline_handler.cpp            | 25 +++++++++++++++++--\n test/ipa/ipa_interface_test.cpp               |  2 +-\n 7 files changed, 48 insertions(+), 20 deletions(-)",
    "diff": "diff --git a/include/libcamera/internal/ipa_manager.h b/include/libcamera/internal/ipa_manager.h\nindex aaa3ca37c..7ab193112 100644\n--- a/include/libcamera/internal/ipa_manager.h\n+++ b/include/libcamera/internal/ipa_manager.h\n@@ -34,10 +34,10 @@ public:\n \t~IPAManager();\n \n \ttemplate<typename T>\n-\tstd::unique_ptr<T> createIPA(PipelineHandler *pipe, uint32_t minVersion,\n+\tstd::unique_ptr<T> createIPA(const char *name, uint32_t minVersion,\n \t\t\t\t     uint32_t maxVersion)\n \t{\n-\t\tIPAModule *m = module(pipe, minVersion, maxVersion);\n+\t\tIPAModule *m = module(name, minVersion, maxVersion);\n \t\tif (!m)\n \t\t\treturn nullptr;\n \n@@ -68,7 +68,7 @@ private:\n \t\t      std::vector<std::string> &files);\n \tunsigned int addDir(const char *libDir, unsigned int maxDepth = 0);\n \n-\tIPAModule *module(PipelineHandler *pipe, uint32_t minVersion,\n+\tIPAModule *module(const char *name, uint32_t minVersion,\n \t\t\t  uint32_t maxVersion);\n \n \tbool isSignatureValid(IPAModule *ipa) const;\ndiff --git a/include/libcamera/internal/ipa_module.h b/include/libcamera/internal/ipa_module.h\nindex 15f19492c..a0a53764e 100644\n--- a/include/libcamera/internal/ipa_module.h\n+++ b/include/libcamera/internal/ipa_module.h\n@@ -36,8 +36,8 @@ public:\n \n \tIPAInterface *createInterface();\n \n-\tbool match(PipelineHandler *pipe,\n-\t\t   uint32_t minVersion, uint32_t maxVersion) const;\n+\tbool match(const char *name, uint32_t minVersion,\n+\t\t   uint32_t maxVersion) const;\n \n protected:\n \tstd::string logPrefix() const override;\ndiff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h\nindex 6922ce18e..b60c07b13 100644\n--- a/include/libcamera/internal/pipeline_handler.h\n+++ b/include/libcamera/internal/pipeline_handler.h\n@@ -76,7 +76,14 @@ public:\n \tstd::unique_ptr<T> createIPA(uint32_t minVersion, uint32_t maxVersion)\n \t{\n \t\tIPAManager *ipaManager = manager_->_d()->ipaManager();\n-\t\treturn ipaManager->createIPA<T>(this, minVersion, maxVersion);\n+\t\treturn ipaManager->createIPA<T>(name_, minVersion, maxVersion);\n+\t}\n+\n+\ttemplate<typename T>\n+\tstd::unique_ptr<T> createIPA(const char *ipaName, uint32_t minVersion, uint32_t maxVersion)\n+\t{\n+\t\tIPAManager *ipaManager = manager_->_d()->ipaManager();\n+\t\treturn ipaManager->createIPA<T>(ipaName, minVersion, maxVersion);\n \t}\n \n protected:\ndiff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp\nindex 41918e4c2..b709a024e 100644\n--- a/src/libcamera/ipa_manager.cpp\n+++ b/src/libcamera/ipa_manager.cpp\n@@ -248,15 +248,15 @@ unsigned int IPAManager::addDir(const char *libDir, unsigned int maxDepth)\n \n /**\n  * \\brief Retrieve an IPA module that matches a given pipeline handler\n- * \\param[in] pipe The pipeline handler\n+ * \\param[in] name The IPA module string identifier\n  * \\param[in] minVersion Minimum acceptable version of IPA module\n  * \\param[in] maxVersion Maximum acceptable version of IPA module\n  */\n-IPAModule *IPAManager::module(PipelineHandler *pipe, uint32_t minVersion,\n+IPAModule *IPAManager::module(const char *name, uint32_t minVersion,\n \t\t\t      uint32_t maxVersion)\n {\n \tfor (const auto &module : modules_) {\n-\t\tif (module->match(pipe, minVersion, maxVersion))\n+\t\tif (module->match(name, minVersion, maxVersion))\n \t\t\treturn module.get();\n \t}\n \n@@ -266,7 +266,7 @@ IPAModule *IPAManager::module(PipelineHandler *pipe, uint32_t minVersion,\n /**\n  * \\fn IPAManager::createIPA()\n  * \\brief Create an IPA proxy that matches a given pipeline handler\n- * \\param[in] pipe The pipeline handler that wants a matching IPA proxy\n+ * \\param[in] name The IPA module name\n  * \\param[in] minVersion Minimum acceptable version of IPA module\n  * \\param[in] maxVersion Maximum acceptable version of IPA module\n  *\ndiff --git a/src/libcamera/ipa_module.cpp b/src/libcamera/ipa_module.cpp\nindex e6ea61e44..c89887954 100644\n--- a/src/libcamera/ipa_module.cpp\n+++ b/src/libcamera/ipa_module.cpp\n@@ -462,22 +462,22 @@ IPAInterface *IPAModule::createInterface()\n }\n \n /**\n- * \\brief Verify if the IPA module matches a given pipeline handler\n- * \\param[in] pipe Pipeline handler to match with\n+ * \\brief Verify if the IPA module matches a given name\n+ * \\param[in] name The IPA module name\n  * \\param[in] minVersion Minimum acceptable version of IPA module\n  * \\param[in] maxVersion Maximum acceptable version of IPA module\n  *\n- * This function checks if this IPA module matches the \\a pipe pipeline handler,\n+ * This function checks if this IPA module matches the requested \\a name\n  * and the input version range.\n  *\n- * \\return True if the pipeline handler matches the IPA module, or false otherwise\n+ * \\return True if the IPA module matches, or false otherwise\n  */\n-bool IPAModule::match(PipelineHandler *pipe,\n-\t\t      uint32_t minVersion, uint32_t maxVersion) const\n+bool IPAModule::match(const char *name, uint32_t minVersion,\n+\t\t      uint32_t maxVersion) const\n {\n \treturn info_.pipelineVersion >= minVersion &&\n \t       info_.pipelineVersion <= maxVersion &&\n-\t       !strcmp(info_.pipelineName, pipe->name());\n+\t       !strcmp(info_.name, name);\n }\n \n std::string IPAModule::logPrefix() const\ndiff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\nindex e7145c1d4..25fc11989 100644\n--- a/src/libcamera/pipeline_handler.cpp\n+++ b/src/libcamera/pipeline_handler.cpp\n@@ -836,11 +836,32 @@ void PipelineHandler::disconnect()\n  */\n \n /**\n- * \\fn PipelineHandler::createIPA()\n- * \\brief Create an IPA proxy that matches this pipeline handler\n+ * \\fn PipelineHandler::createIPA(const char *ipaName, uint32_t minVersion, uint32_t maxVersion)\n+ * \\brief Create an IPA proxy that matches the requested name and version\n+ * \\param[in] ipaName The IPA module name\n  * \\param[in] minVersion Minimum acceptable version of IPA module\n  * \\param[in] maxVersion Maximum acceptable version of IPA module\n  *\n+ * Create an IPA module using \\a ipaName as the matching identifier. This\n+ * overload allows pipeline handlers to create an IPA module by specifying its\n+ * name instead of relying on the fact that the IPA module matches the pipeline\n+ * handler's one.\n+ *\n+ * \\return A newly created IPA proxy, or nullptr if no matching IPA module is\n+ * found or if the IPA proxy fails to initialize\n+ */\n+\n+/**\n+ * \\fn PipelineHandler::createIPA(uint32_t minVersion, uint32_t maxVersion)\n+ * \\brief Create an IPA proxy that matches the pipeline handler name and the\n+ * requested version\n+ * \\param[in] minVersion Minimum acceptable version of IPA module\n+ * \\param[in] maxVersion Maximum acceptable version of IPA module\n+ *\n+ * Create an IPA module using the pipeline handler name as the matching\n+ * identifier. This overload allows pipeline handler to create an IPA module\n+ * whose name matches the pipeline handler one.\n+ *\n  * \\return A newly created IPA proxy, or nullptr if no matching IPA module is\n  * found or if the IPA proxy fails to initialize\n  */\ndiff --git a/test/ipa/ipa_interface_test.cpp b/test/ipa/ipa_interface_test.cpp\nindex 271c4e2c9..0b01a396e 100644\n--- a/test/ipa/ipa_interface_test.cpp\n+++ b/test/ipa/ipa_interface_test.cpp\n@@ -99,7 +99,7 @@ protected:\n \t\tEventDispatcher *dispatcher = thread()->eventDispatcher();\n \t\tTimer timer;\n \n-\t\tipa_ = ipaManager_->createIPA<ipa::vimc::IPAProxyVimc>(pipe_.get(), 0, 0);\n+\t\tipa_ = ipaManager_->createIPA<ipa::vimc::IPAProxyVimc>(pipe_->name(), 0, 0);\n \t\tif (!ipa_) {\n \t\t\tcerr << \"Failed to create VIMC IPA interface\" << endl;\n \t\t\treturn TestFail;\n",
    "prefixes": [
        "v6",
        "1/5"
    ]
}