Patch Detail
Show a patch.
GET /api/patches/9209/?format=api
{ "id": 9209, "url": "https://patchwork.libcamera.org/api/patches/9209/?format=api", "web_url": "https://patchwork.libcamera.org/patch/9209/", "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": "<20200805104900.2172763-3-niklas.soderlund@ragnatech.se>", "date": "2020-08-05T10:48:53", "name": "[libcamera-devel,v8,2/9] libcamera: sysfs: Add helper to lookup device firmware node path", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "baea8f1dff7dbabd110fe24674c8fd9b59a97a51", "submitter": { "id": 5, "url": "https://patchwork.libcamera.org/api/people/5/?format=api", "name": "Niklas Söderlund", "email": "niklas.soderlund@ragnatech.se" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/9209/mbox/", "series": [ { "id": 1192, "url": "https://patchwork.libcamera.org/api/series/1192/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1192", "date": "2020-08-05T10:48:51", "name": "libcamera: Generate unique and stable camera IDs", "version": 8, "mbox": "https://patchwork.libcamera.org/series/1192/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/9209/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/9209/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 D0861BD86F\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 5 Aug 2020 10:49:16 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A9B3A6055E;\n\tWed, 5 Aug 2020 12:49:16 +0200 (CEST)", "from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net\n\t[195.74.38.227])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8D94F60555\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 5 Aug 2020 12:49:12 +0200 (CEST)", "from bismarck.berto.se (p54ac52a8.dip0.t-ipconnect.de\n\t[84.172.82.168]) by bin-vsp-out-02.atm.binero.net (Halon) with ESMTPA\n\tid 4bd20296-d709-11ea-a39b-005056917f90;\n\tWed, 05 Aug 2020 12:49:11 +0200 (CEST)" ], "X-Halon-ID": "4bd20296-d709-11ea-a39b-005056917f90", "Authorized-sender": "niklas@soderlund.pp.se", "From": "=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Wed, 5 Aug 2020 12:48:53 +0200", "Message-Id": "<20200805104900.2172763-3-niklas.soderlund@ragnatech.se>", "X-Mailer": "git-send-email 2.28.0", "In-Reply-To": "<20200805104900.2172763-1-niklas.soderlund@ragnatech.se>", "References": "<20200805104900.2172763-1-niklas.soderlund@ragnatech.se>", "MIME-Version": "1.0", "Subject": "[libcamera-devel] [PATCH v8 2/9] libcamera: sysfs: Add helper to\n\tlookup device firmware node path", "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>", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "base64", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "A system's firmware description is recorded differently in sysfs\ndepending if the system uses DT or ACPI. Add a helper to abstract\nthis, allowing users not to care which of the two are used.\n\nFor DT-based systems, the path is the full name of the DT node that\nrepresents the device. For ACPI-based systems, the path is the absolute\nnamespace path to the ACPI object that represents the device. In both\ncases, the path is guaranteed to be unique and persistent as long as the\nsystem firmware is not modified.\n\nSigned-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n---\n* Changes since v7\n- Rename function to firmwareNodePath()\n- Rename argument to device\n- Return firmware path instead of passing storage as argument\n- Update documentation\n- Keep leading slash for DT-based paths\n- Use File::exists()\n---\n include/libcamera/internal/sysfs.h | 2 ++\n src/libcamera/sysfs.cpp | 57 ++++++++++++++++++++++++++++++\n 2 files changed, 59 insertions(+)", "diff": "diff --git a/include/libcamera/internal/sysfs.h b/include/libcamera/internal/sysfs.h\nindex 247a376ab7e0e8ee..bc6c1620b55d43a2 100644\n--- a/include/libcamera/internal/sysfs.h\n+++ b/include/libcamera/internal/sysfs.h\n@@ -15,6 +15,8 @@ namespace sysfs {\n \n std::string charDevPath(const std::string &deviceNode);\n \n+std::string firmwareNodePath(const std::string &device);\n+\n } /* namespace sysfs */\n \n } /* namespace libcamera */\ndiff --git a/src/libcamera/sysfs.cpp b/src/libcamera/sysfs.cpp\nindex 398df2c2be114908..39fe0c468f5e703a 100644\n--- a/src/libcamera/sysfs.cpp\n+++ b/src/libcamera/sysfs.cpp\n@@ -7,10 +7,12 @@\n \n #include \"libcamera/internal/sysfs.h\"\n \n+#include <fstream>\n #include <sstream>\n #include <sys/stat.h>\n #include <sys/sysmacros.h>\n \n+#include \"libcamera/internal/file.h\"\n #include \"libcamera/internal/log.h\"\n \n /**\n@@ -47,6 +49,61 @@ std::string charDevPath(const std::string &deviceNode)\n \treturn dev.str();\n }\n \n+/**\n+ * \\brief Retrieve the path of the firmware node for a device\n+ * \\param[in] device Path in sysfs to search\n+ *\n+ * Physical devices in a system are described by the system firmware. Depending\n+ * on the type of platform, devices are identified using different naming\n+ * schemes. The Linux kernel abstract those differences with \"firmware nodes\".\n+ * This function retrieves the firmware node path corresponding to the\n+ * \\a device.\n+ *\n+ * For DT-based systems, the path is the full name of the DT node that\n+ * represents the device. For ACPI-based systems, the path is the absolute\n+ * namespace path to the ACPI object that represents the device. In both cases,\n+ * the path is guaranteed to be unique and persistent as long as the system\n+ * firmware is not modified.\n+ *\n+ * \\return The firmware node path on success or an empty string on failure\n+ */\n+std::string firmwareNodePath(const std::string &device)\n+{\n+\tstd::string fwPath, node;\n+\n+\t/* Lookup for DT-based systems */\n+\tnode = device + \"/of_node\";\n+\tif (File::exists(node)) {\n+\t\tchar *ofPath = realpath(node.c_str(), nullptr);\n+\t\tif (!ofPath)\n+\t\t\treturn {};\n+\n+\t\tfwPath = ofPath;\n+\t\tfree(ofPath);\n+\n+\t\tstatic const std::string dropStr = \"/sys/firmware/devicetree\";\n+\t\tif (fwPath.find(dropStr) == 0)\n+\t\t\tfwPath.erase(0, dropStr.length());\n+\n+\t\treturn fwPath;\n+\t}\n+\n+\t/* Lookup for ACPI-based systems */\n+\tnode = device + \"/firmware_node/path\";\n+\tif (File::exists(node)) {\n+\t\tstd::ifstream file(node);\n+\t\tif (!file.is_open())\n+\t\t\treturn {};\n+\n+\t\tstd::getline(file, fwPath);\n+\t\tfile.close();\n+\n+\t\treturn fwPath;\n+\t}\n+\n+\treturn {};\n+}\n+\n } /* namespace sysfs */\n \n } /* namespace libcamera */\n", "prefixes": [ "libcamera-devel", "v8", "2/9" ] }