Show a patch.

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

{
    "id": 2069,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/2069/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/2069/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/1.1/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": "<20190930053520.2711-1-paul.elder@ideasonboard.com>",
    "date": "2019-09-30T05:35:18",
    "name": "[libcamera-devel,RFC,1/3] libcamera: pipeline: Add device IDs",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "18841bbe140d16d7a4b8f15fa2feab21f2089976",
    "submitter": {
        "id": 17,
        "url": "https://patchwork.libcamera.org/api/1.1/people/17/?format=api",
        "name": "Paul Elder",
        "email": "paul.elder@ideasonboard.com"
    },
    "delegate": {
        "id": 17,
        "url": "https://patchwork.libcamera.org/api/1.1/users/17/?format=api",
        "username": "epaul",
        "first_name": "Paul",
        "last_name": "Elder",
        "email": "paul.elder@ideasonboard.com"
    },
    "mbox": "https://patchwork.libcamera.org/patch/2069/mbox/",
    "series": [
        {
            "id": 513,
            "url": "https://patchwork.libcamera.org/api/1.1/series/513/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=513",
            "date": "2019-09-30T05:35:18",
            "name": "[libcamera-devel,RFC,1/3] libcamera: pipeline: Add device IDs",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/513/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/2069/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/2069/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<paul.elder@ideasonboard.com>",
        "Received": [
            "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 4D6F96101D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 30 Sep 2019 07:35:36 +0200 (CEST)",
            "from neptunite.amanokami.net (unknown [96.44.9.94])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 724B4311;\n\tMon, 30 Sep 2019 07:35:35 +0200 (CEST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1569821735;\n\tbh=/x5C6zWhUrqEDK1L/f8m6FH6A+YSTtWIQuSEdo0uw04=;\n\th=From:To:Cc:Subject:Date:From;\n\tb=QEUyAr3o16HuDVCr/l2Oj5lF38sxVBM89+UrNvSRsR/2EKP64V8uJOCmw8UahxbOV\n\tW2oMnBm1dEPGUIEiB2dRsyNCDkBHi6LOi9rjv1fJ3apBoBLg/Fw8qj0dfkgV1gQdra\n\tukQf5cozjFdgY8NXmBTYU0G55eXw4rz2/mdYLgro=",
        "From": "Paul Elder <paul.elder@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Mon, 30 Sep 2019 01:35:18 -0400",
        "Message-Id": "<20190930053520.2711-1-paul.elder@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.23.0",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [RFC PATCH 1/3] libcamera: pipeline: Add device\n\tIDs",
        "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>",
        "X-List-Received-Date": "Mon, 30 Sep 2019 05:35:36 -0000"
    },
    "content": "Allow pipeline handlers to declare a list of camera device IDs that they\nsupport. This list will eventually be used to check against the list of\ncamera devices that the system has, but have yet to be initialized by the\nkernel or by udev.\n\nPipelineHandlerFactory exposes a static method to retrieve the list of\nall such camera device IDs from all pipeline handlers.\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\n---\n src/libcamera/include/pipeline_handler.h | 58 +++++++++++++++++++++++-\n src/libcamera/pipeline/ipu3/ipu3.cpp     |  4 +-\n src/libcamera/pipeline/rkisp1/rkisp1.cpp |  2 +-\n src/libcamera/pipeline/uvcvideo.cpp      |  2 +-\n src/libcamera/pipeline/vimc.cpp          |  2 +-\n src/libcamera/pipeline_handler.cpp       | 16 +++++++\n 6 files changed, 79 insertions(+), 5 deletions(-)",
    "diff": "diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h\nindex 1fdef9ce..f16f37ab 100644\n--- a/src/libcamera/include/pipeline_handler.h\n+++ b/src/libcamera/include/pipeline_handler.h\n@@ -30,6 +30,48 @@ class MediaDevice;\n class PipelineHandler;\n class Request;\n \n+class DeviceID\n+{\n+public:\n+\tDeviceID(std::string type)\n+\t\t: type_(type){};\n+\t~DeviceID(){};\n+\n+\ttemplate<class IDType>\n+\tbool compare(const DeviceID &id) const\n+\t{\n+\t\treturn this->type_.compare(id.type_) ||\n+\t\t       static_cast<const IDType *>(this)->compare(static_cast<const IDType &>(id));\n+\t}\n+\n+\tconst std::string type_;\n+};\n+\n+class PCIDeviceID : public DeviceID\n+{\n+public:\n+\tPCIDeviceID(uint16_t vendor, uint16_t device)\n+\t\t: DeviceID(\"pci\"), vendor_(vendor), device_(device){};\n+\t~PCIDeviceID(){};\n+\n+\tbool compare(const PCIDeviceID &pci) const\n+\t{\n+\t\tuint32_t thisID = (vendor_ << 16) + device_;\n+\t\tuint32_t otherID = (pci.vendor_ << 16) + pci.device_;\n+\n+\t\treturn thisID < otherID;\n+\t}\n+\n+\tconst uint16_t vendor_;\n+\tconst uint16_t device_;\n+};\n+\n+template<class IDType>\n+bool compareDevices(const DeviceID &id1, const DeviceID &id2)\n+{\n+\treturn id1.compare<IDType>(id2);\n+}\n+\n class CameraData\n {\n public:\n@@ -117,6 +159,10 @@ public:\n \n \tstatic void registerType(PipelineHandlerFactory *factory);\n \tstatic std::vector<PipelineHandlerFactory *> &factories();\n+\tstatic std::vector<std::reference_wrapper<DeviceID>> &getDeviceIDs();\n+\n+protected:\n+\tvirtual std::vector<DeviceID> &deviceIDs() = 0;\n \n private:\n \tvirtual PipelineHandler *createInstance(CameraManager *manager) = 0;\n@@ -124,12 +170,22 @@ private:\n \tstd::string name_;\n };\n \n-#define REGISTER_PIPELINE_HANDLER(handler)\t\t\t\t\\\n+#define P99_PROTECT(...) __VA_ARGS__\n+\n+#define REGISTER_PIPELINE_HANDLER(handler, cameras)\t\t\t\\\n class handler##Factory final : public PipelineHandlerFactory\t\t\\\n {\t\t\t\t\t\t\t\t\t\\\n public:\t\t\t\t\t\t\t\t\t\\\n \thandler##Factory() : PipelineHandlerFactory(#handler) {}\t\\\n \t\t\t\t\t\t\t\t\t\\\n+protected:\t\t\t\t\t\t\t\t\\\n+\tstd::vector<DeviceID> &deviceIDs()\t\t\t\t\\\n+\t{\t\t\t\t\t\t\t\t\\\n+\t\tstatic std::vector<DeviceID> handler##Cameras =\t\t\\\n+\t\t       std::vector<DeviceID>(cameras);\t\t\t\\\n+\t\treturn handler##Cameras;\t\t\t\t\\\n+\t}\t\t\t\t\t\t\t\t\\\n+\t\t\t\t\t\t\t\t\t\\\n private:\t\t\t\t\t\t\t\t\\\n \tPipelineHandler *createInstance(CameraManager *manager)\t\t\\\n \t{\t\t\t\t\t\t\t\t\\\ndiff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\nindex 827906d5..562ee9fb 100644\n--- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n@@ -1504,6 +1504,8 @@ int CIO2Device::mediaBusToFormat(unsigned int code)\n \t}\n }\n \n-REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3);\n+REGISTER_PIPELINE_HANDLER(PipelineHandlerIPU3,\n+\t\t\t  P99_PROTECT({ PCIDeviceID(0x8086, 0x1919),\n+\t\t\t\t\tPCIDeviceID(0x8086, 0x9D32) }));\n \n } /* namespace libcamera */\ndiff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex de4ab523..85225f9b 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -513,6 +513,6 @@ void PipelineHandlerRkISP1::bufferReady(Buffer *buffer)\n \tcompleteRequest(activeCamera_, request);\n }\n \n-REGISTER_PIPELINE_HANDLER(PipelineHandlerRkISP1);\n+REGISTER_PIPELINE_HANDLER(PipelineHandlerRkISP1, {});\n \n } /* namespace libcamera */\ndiff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp\nindex 89652105..376eb92a 100644\n--- a/src/libcamera/pipeline/uvcvideo.cpp\n+++ b/src/libcamera/pipeline/uvcvideo.cpp\n@@ -390,6 +390,6 @@ void UVCCameraData::bufferReady(Buffer *buffer)\n \tpipe_->completeRequest(camera_, request);\n }\n \n-REGISTER_PIPELINE_HANDLER(PipelineHandlerUVC);\n+REGISTER_PIPELINE_HANDLER(PipelineHandlerUVC, {});\n \n } /* namespace libcamera */\ndiff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp\nindex f26a91f8..75d0236f 100644\n--- a/src/libcamera/pipeline/vimc.cpp\n+++ b/src/libcamera/pipeline/vimc.cpp\n@@ -459,6 +459,6 @@ void VimcCameraData::bufferReady(Buffer *buffer)\n \tpipe_->completeRequest(camera_, request);\n }\n \n-REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc);\n+REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc, {});\n \n } /* namespace libcamera */\ndiff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\nindex 3e54aa23..9113bf18 100644\n--- a/src/libcamera/pipeline_handler.cpp\n+++ b/src/libcamera/pipeline_handler.cpp\n@@ -593,6 +593,22 @@ std::vector<PipelineHandlerFactory *> &PipelineHandlerFactory::factories()\n \treturn factories;\n }\n \n+std::vector<std::reference_wrapper<DeviceID>> &PipelineHandlerFactory::getDeviceIDs()\n+{\n+\tstatic std::vector<std::reference_wrapper<DeviceID>> devices;\n+\tif (!devices.empty())\n+\t\treturn devices;\n+\n+\tstd::vector<PipelineHandlerFactory *> &factories = PipelineHandlerFactory::factories();\n+\n+\tfor (PipelineHandlerFactory *factory : factories) {\n+\t\tstd::vector<DeviceID> &factoryDevices = factory->deviceIDs();\n+\t\tdevices.insert(devices.end(), factoryDevices.begin(), factoryDevices.end());\n+\t}\n+\n+\treturn devices;\n+}\n+\n /**\n  * \\fn PipelineHandlerFactory::createInstance()\n  * \\brief Create an instance of the PipelineHandler corresponding to the factory\n",
    "prefixes": [
        "libcamera-devel",
        "RFC",
        "1/3"
    ]
}