get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 809005,
    "url": "http://patchwork.ozlabs.org/api/patches/809005/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/e6193a53cd039029628c0e69bf267e0fe031b2eb.1504293917.git.alistair.francis@xilinx.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<e6193a53cd039029628c0e69bf267e0fe031b2eb.1504293917.git.alistair.francis@xilinx.com>",
    "list_archive_url": null,
    "date": "2017-09-01T21:00:42",
    "name": "[v2,4/6] xlnx-zynqmp-ipi: Initial version of the Xilinx IPI device",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "65372a9e3dc0f2399f56ee70b40d26429fddf0b3",
    "submitter": {
        "id": 47878,
        "url": "http://patchwork.ozlabs.org/api/people/47878/?format=api",
        "name": "Alistair Francis",
        "email": "alistair.francis@xilinx.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/e6193a53cd039029628c0e69bf267e0fe031b2eb.1504293917.git.alistair.francis@xilinx.com/mbox/",
    "series": [
        {
            "id": 1116,
            "url": "http://patchwork.ozlabs.org/api/series/1116/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=1116",
            "date": "2017-09-01T21:00:45",
            "name": "Add the ZynqMP PMU and IPI",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/1116/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/809005/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/809005/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org",
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)",
            "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=xilinx.onmicrosoft.com\n\theader.i=@xilinx.onmicrosoft.com header.b=\"sSwhiMRB\"; \n\tdkim-atps=neutral",
            "spf=pass (sender IP is 149.199.60.100)\n\tsmtp.mailfrom=xilinx.com; nongnu.org; dkim=none (message not signed)\n\theader.d=none;nongnu.org; dmarc=bestguesspass action=none\n\theader.from=xilinx.com;"
        ],
        "Received": [
            "from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xkX4d3BFSz9sPk\n\tfor <incoming@patchwork.ozlabs.org>;\n\tSat,  2 Sep 2017 07:12:17 +1000 (AEST)",
            "from localhost ([::1]:60861 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dntEd-0006le-II\n\tfor incoming@patchwork.ozlabs.org; Fri, 01 Sep 2017 17:12:15 -0400",
            "from eggs.gnu.org ([2001:4830:134:3::10]:52997)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <alistai@xilinx.com>) id 1dnt7P-0000cT-8z\n\tfor qemu-devel@nongnu.org; Fri, 01 Sep 2017 17:04:49 -0400",
            "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <alistai@xilinx.com>) id 1dnt7K-0006yz-7z\n\tfor qemu-devel@nongnu.org; Fri, 01 Sep 2017 17:04:47 -0400",
            "from mail-sn1nam02on0081.outbound.protection.outlook.com\n\t([104.47.36.81]:39053\n\thelo=NAM02-SN1-obe.outbound.protection.outlook.com)\n\tby eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <alistai@xilinx.com>)\n\tid 1dnt79-0006nz-AJ; Fri, 01 Sep 2017 17:04:31 -0400",
            "from BLUPR0201CA0020.namprd02.prod.outlook.com (10.163.116.30) by\n\tCY1PR0201MB1930.namprd02.prod.outlook.com (10.163.56.28) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id\n\t15.20.13.10; Fri, 1 Sep 2017 21:04:28 +0000",
            "from SN1NAM02FT060.eop-nam02.prod.protection.outlook.com\n\t(2a01:111:f400:7e44::200) by BLUPR0201CA0020.outlook.office365.com\n\t(2a01:111:e400:52e7::30) with Microsoft SMTP Server (version=TLS1_2, \n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.13.10 via\n\tFrontend Transport; Fri, 1 Sep 2017 21:04:28 +0000",
            "from xsj-pvapsmtpgw02 (149.199.60.100) by\n\tSN1NAM02FT060.mail.protection.outlook.com (10.152.72.192) with\n\tMicrosoft SMTP Server (version=TLS1_0,\n\tcipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1385.11\n\tvia Frontend Transport; Fri, 1 Sep 2017 21:04:27 +0000",
            "from unknown-38-66.xilinx.com ([149.199.38.66]:38307\n\thelo=xsj-pvapsmtp01) by xsj-pvapsmtpgw02 with esmtp (Exim 4.63)\n\t(envelope-from <alistair.francis@xilinx.com>)\n\tid 1dnt74-0002QH-Qs; Fri, 01 Sep 2017 14:04:26 -0700",
            "from [127.0.0.1] (helo=localhost)\n\tby xsj-pvapsmtp01 with smtp (Exim 4.63)\n\t(envelope-from <alistair.francis@xilinx.com>)\n\tid 1dnt74-0007gz-MY; Fri, 01 Sep 2017 14:04:26 -0700",
            "from xsj-pvapsmtp01 (xsj-mail.xilinx.com [149.199.38.66])\n\tby xsj-smtp-dlp1.xlnx.xilinx.com (8.13.8/8.13.1) with ESMTP id\n\tv81L4Ipr027555; Fri, 1 Sep 2017 14:04:18 -0700",
            "from [172.19.2.220] (helo=localhost.localdomain)\n\tby xsj-pvapsmtp01 with esmtp (Exim 4.63)\n\t(envelope-from <alistair.francis@xilinx.com>)\n\tid 1dnt6w-0007fj-BO; Fri, 01 Sep 2017 14:04:18 -0700"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=xilinx.onmicrosoft.com; s=selector1-xilinx-com;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version;\n\tbh=6s8IlTG7rJAoxlkF/dEU8PPQJ/D0rkbTxO/7xjwCW8Q=;\n\tb=sSwhiMRBtmOTeiiDZDPp9Hp/ek6eusZNdvjQuXpb7/z7hU7CcpbNkosfDr/9a5sHe2kBNgVIeG1LY9EUyOz21ejP/myCwyM3LI1aG+EdZ6F9tKC0jPpCEIQjfQ3bk2Rh0hXdP7XX50z/yFP68e3j0XU96K7+2d0nxBGymcCgO2Y=",
        "Received-SPF": "Pass (protection.outlook.com: domain of xilinx.com designates\n\t149.199.60.100 as permitted sender)\n\treceiver=protection.outlook.com; \n\tclient-ip=149.199.60.100; helo=xsj-pvapsmtpgw02;",
        "From": "Alistair Francis <alistair.francis@xilinx.com>",
        "To": "<qemu-devel@nongnu.org>, <edgar.iglesias@xilinx.com>,\n\t<edgar.iglesias@gmail.com>",
        "Date": "Fri, 1 Sep 2017 14:00:42 -0700",
        "Message-ID": "<e6193a53cd039029628c0e69bf267e0fe031b2eb.1504293917.git.alistair.francis@xilinx.com>",
        "X-Mailer": "git-send-email 2.11.0",
        "In-Reply-To": "<cover.1504293917.git.alistair.francis@xilinx.com>",
        "References": "<cover.1504293917.git.alistair.francis@xilinx.com>",
        "X-RCIS-Action": "ALLOW",
        "X-TM-AS-Product-Ver": "IMSS-7.1.0.1224-8.1.0.1062-23296.003",
        "X-TM-AS-User-Approved-Sender": "Yes;Yes",
        "X-EOPAttributedMessage": "0",
        "X-MS-Office365-Filtering-HT": "Tenant",
        "X-Forefront-Antispam-Report": "CIP:149.199.60.100; IPV:NLI; CTRY:US; EFV:NLI; \n\tSFV:NSPM;\n\tSFS:(10009020)(6009001)(39860400002)(2980300002)(438002)(189002)(199003)(50986999)(76176999)(118296001)(6666003)(2950100002)(63266004)(5003940100001)(33646002)(77096006)(106466001)(54906002)(189998001)(626005)(478600001)(36386004)(9786002)(230783001)(5660300001)(356003)(305945005)(81166006)(8936002)(81156014)(8676002)(2201001)(50226002)(50466002)(4326008)(48376002)(47776003)(36756003)(39060400002)(575784001)(2906002)(107986001)(2101003)(5001870100001);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR0201MB1930;\n\tH:xsj-pvapsmtpgw02; FPR:; SPF:Pass;\n\tPTR:xapps1.xilinx.com,unknown-60-100.xilinx.com; MX:1; A:1;\n\tLANG:en; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; SN1NAM02FT060;\n\t1:Z8hA5WCVrmLG+Ki6l9ix8nyebIZoWmI1fnqm6NJFJhTCHpLd3VEzHUvR9lYdpNYrpWqGAFOD8PmAJykdiWAa4WykzgQ7nDoqVPe5x2XoraV08r0BdV4SU1WZKVF9MXMx",
            "1; CY1PR0201MB1930;\n\t3:b451EjS5aPyfE6NZ3Dwb9c3f5rDAQX3eIDR7nFDPGVfw4gdHV3hS1NaXVylfKNAK1ia70XTVkyeudu3tb8IfifSmU9hUp1Lnio3slxedD1rmwpWyCuStwFBUti2a3MxZTrO5a5Tg3NtHMexFRl9YS1ItFIapeWDicl7P5/K+x8pcF5Mww6FRAM7uuNkI0nQRmEPXKFULdqmmPDyOmRGviriusGlcEGVBGLmEZRww2MPsydj0So+XCzPdga7hYtweHvxjKoPQNuQKuIqHqhqWlo8MADMQqkvrwGOmIyT0445cCb+CdokY0tuMlHCH3lvVoMpKT5forl0NEhihG3ocH5nTJMTXXN0j/7yGpjuQIlE=;\n\t25:0KHGhBAHQFt6phm79jinnD/HxAFdhulP7m4z/pBgoupsbnZ51domO3BYRmcO0xAadbikpftpCMGD++xQurq/LMoMRu6JIXGggXBCUxTzQAOlRTXWmzIKgadm9zKkMiLzWdIfumF/RMjifffz6F3YYPJf36qeruvP2oP7ZlOtLzIoxRcn4zeijPHeaiKqJydZz6MjEzn4k1ydZMuNcEFM4z6yDK+5tA5Q01e3L9fTG9QuX4tEiykSb4MF972LtaEwJ1CpLNFXQJwZbnCWrOn15mpVH/XKh3wLkboPB8e/ij5JSv1/B2bGQaQXUKQ95+pIe79m7a/IQdKkjDIgg+CrHQ==",
            "1; CY1PR0201MB1930;\n\t31:C8DZi8N7WXD6YoieiUFGz2OG0lq7YZLpoF50IhJYWjr5P+VNr1togmTYrdhHZC1dPZ99F9lyCbR7SCTObfhSFkfDQF44dqxqJBD0vyqf40fsNkcL50SlfMtCIxZTY3vmOy0KUsBm5xSKINtjjKQlsV8hsIN6oHSUBEFPv+cFW4GHs2rs2k93xppcQWxu9HrLbmSkukTjIFASoTwF9yy34PCHzVyxaa2EUZVKMwZ+DyQ=;\n\t20:oJSIIcCucpPNQ15B/Zi1GTDViuE2YYrJAx/MOg6tmIZYZJBertBBlmROaYaG6iZcVXXqjvF3HtwoXveTGks+6EUOESCsg928sWbVqbj/WxjQDnLTqD1198lJndh9/5v1ekPXX8JaFaGVaOes9GB+l21E6btTcHLHgNIux0q8qQlP6JrxHxrY8rJriFONvux3ak0FPwCvPsqmk5anjZlpLbYQw8UrF3OfjDRz/kvtGH/M9UIUfRjkJvKY9Y8EksFmtfavxVq0s0pFyiFqMTTknjseEXDp25+AZPolUrNmLbK5bvtQTgq+sFBJXmUGwWysE31WvAW1rduYk33J/TRFGXZj32hZWCFa2YiRn4Y8DVgvYiGuOXLbSq/lGfieIjdoluIcbjohMPBCyVChXepte9syC1vSlhsxUco8uXF5WwXZ4LGw66dgV54QN1CwVnCE5Picu9oDM6gSN0vm1pzXK8oF3TOqn6yUTjdVf5/tDifFJdwU3iCf5W3bPuN+6yv0",
            "1; CY1PR0201MB1930;\n\t4:tOXbp7NzD+OlNrQwK8k7mRZJ9RllOIk1gXcjx9uttYbT+UmdwtSRsa7UXMVa5x5sM3CRo3RtsppB4XhY3rnHGTqffyeyZV71jzlFi2ARJwTtPDCVyDAcAyxuO3JCoNewO18ecTI+xVjSqSvshnQawzrwQyzIMI5mZwPduqsPFQNrN2ucy4Qkgjy56KW1EflVOhYhZvYtyXBAq/m109u4zio9mRBvv7og6sY89LWnJbqW+KA87/zoS9EixtNn2T7bzkBBXdOtXyvjWHT2F/XNLE6evEcvjKLrLB6OfHnl64A=",
            "=?us-ascii?Q?1; CY1PR0201MB1930;\n\t23:8CqCx14qZjyFgQFm7g7Y5lE0/w2nA5ki8mFNYoc?=\n\tF6f/EsJV66chfRVypYDdVHiAoTB5HOX17dAPQORs8OgNbFKa5OB9me9rgdDGiZeRTexvsvJJFyEDP5ZHodhVyZGa2K+Dj1egOzqiXT0unwpBXrof4o+Bs2UG4/xL1d8TbeRe7qa4L98guYyeEXTTujc2gwVDFP5SOiHKzQZQeUpnXJeHvuImjQgW2DAzI1qnCw0DoA3ry+ybzqG4SwFqcSTUuJZZWjFdyvv6I4j+m5pexDRfOcHDeQilSdL6cDohffaLNHYj8zaAOvCJyKNMTUu/A1tk+7WaBt/ZHmt9QOSBL3xMlKGLbmW3XPJwKUHTkSzqhgeNffvN1rjx6N18Mpn8330RxZQkr4RNpiBDb/Ov2c1MjnAp2ZbnQ1iEExUt+qZ+IrlGxdgaGq6Wp3KXlQfmdV3wu6OBpHsohM9mjAZu0TPFIWzEA2LuppHmFs9quRhZHyXXAkNPYknQgJzSz8PMncaoDNrr9RyV0LRtuKaECwtJJmX2Wix8eVZRu/4YSUdp5v6qPi8jAoisXPC45F0vYaV/xmZZGMb3XoUjrG11PVGu663fHU8VyeyAbQ4VQxHzBYrCK5G1OP68EnQKB1mckHqqKLHAy2tJylc81sdf71qB2Q4QrOP9F5JxqqNCsOuBfbbuhm771uPSUYDkhH6LeW3u0vEaWf+sIiDId3F+XHfC3icWbE2S0qsl5zA96m5106xva5QYKiLijbWuY66F7PJ5EqlcYyLLljroKKwvhw0cllJy68NipSHTOQvTqJwd5ZmDhwI923y2s/aukFiuyde8n2+BYjELyQzLO1vHZ9858y7G+tMz5wH4DD1oNxOHId/4fL9l+i5ORhR2bk3zQvJSzGFn3M4nTGkzy1TFEYUiW+u7cECpsIGEywc3865PdyRy/nmjDhU90RD2zYA6186fLS63t/riGtCMMIy6B9hVGEyPAGfx5koJ+CsAAr9rSUs3d8bCkDB2nbVIKWiv5S/Jej/6Vb2nLRKG55A6dz5FFK4heY1V4Zuo4THGnirQ=",
            "1; CY1PR0201MB1930;\n\t6:JbDik1vE1Vu6rF7AuOc29zXzdCr4a55Y1oAo2C0qhmP3T5cKd20Y6do+F4jRI2GafG3Uc5Tqyd+uuZ2vpd/zTcdZN6hyAADP+4iTZ9gJMXMRsZNKQhO8oTjPMxQualu/F8ZTRCPJ1ydatBbvLuea5Dx9YGyjM/diDUq888kA8BtXAPVZ+ntp8/cIUNnWwjpxIFpXVDIVVKPPwKXa6c9J/0wEIfnoz7KPQam7TwdkoKByoP3JDF5lY7myw8loMv4d59uFW4t5usGr5u70n7/4q7YFrko47ifCkhwhDuQSwxYxlixglaApAZkmNNH0PhLZV8NNn10/JoBIg37cFbEiyQ==;\n\t5:pOR2OLk+VPL7Yu8EKcm3OHbLbmSl6589AfB3jL16o3bT63QxLhpF3KJojKkZvqhoJ8F4eCyNU/ANK8sl5TfdaAY3gEnMGnrOprHzyLyUFSeB5FYhcv4EOG8N9aML3uskmjt/nYIEys83t7E4N5nnLg==;\n\t24:hOvB6rUduVt3YFey1P57x904QtdNkzs8yPKP1LjdiH7YZOyFSbccFUmiuLk1kvxQ6vFRt0fOqwbaG/lyS0UAtfRl5TYFQFKiYT7toUxFfXA=;\n\t7:DT+EQz/xlgkra5d2+B9KEEzOWxbGD0ik3lHp+zaJFQD2txbtkc5E9GwRtQlsM1cwOjt2EJKHb8hBvjERND0UrT6LyQ/4f4jZFwscS32lGzvLXsOYpAIpjIGvE6T9qkqILFoBSPMC1PYE7Tywc3qNeg4RlNZcyaJyMw8OgPDLTPdx75klnEUUYKoS8UBOexJ9fqO3du44C7Hzg7TRs8eOYEZ0CazM7VflR+0Laq4fcVs="
        ],
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "976f1976-ad2f-4a07-ed83-08d4f17d0832",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0;\n\tRULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(8251501002)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);\n\tSRVR:CY1PR0201MB1930; ",
        "X-MS-TrafficTypeDiagnostic": "CY1PR0201MB1930:",
        "X-Exchange-Antispam-Report-Test": "UriScan:(192813158149592);",
        "X-Microsoft-Antispam-PRVS": "<CY1PR0201MB19309279A0ED241D1A23A207DC920@CY1PR0201MB1930.namprd02.prod.outlook.com>",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(13018025)(13016025)(100000703101)(100105400095)(10201501046)(93006095)(93004095)(3002001)(6055026)(6041248)(20161123555025)(20161123564025)(20161123558100)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);\n\tSRVR:CY1PR0201MB1930; BCL:0; PCL:0;\n\tRULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);\n\tSRVR:CY1PR0201MB1930; ",
        "X-Forefront-PRVS": "0417A3FFD2",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "xilinx.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "01 Sep 2017 21:04:27.3718\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Id": "657af505-d5df-48d0-8300-c31994686c5c",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "TenantId=657af505-d5df-48d0-8300-c31994686c5c; \n\tIp=[149.199.60.100]; Helo=[xsj-pvapsmtpgw02]",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "CY1PR0201MB1930",
        "X-detected-operating-system": "by eggs.gnu.org: Windows 7 or 8 [fuzzy]",
        "X-Received-From": "104.47.36.81",
        "Subject": "[Qemu-devel] [PATCH v2 4/6] xlnx-zynqmp-ipi: Initial version of the\n\tXilinx IPI device",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.21",
        "Precedence": "list",
        "List-Id": "<qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.nongnu.org/archive/html/qemu-devel/>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Cc": "alistair23@gmail.com, qemu-arm@nongnu.org, alistair.francis@xilinx.com",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"
    },
    "content": "This is the initial version of the Inter Processor Interrupt device.\n\nSigned-off-by: Alistair Francis <alistair.francis@xilinx.com>\n---\n\n default-configs/microblaze-softmmu.mak |   1 +\n hw/intc/Makefile.objs                  |   1 +\n hw/intc/xlnx-zynqmp-ipi.c              | 377 +++++++++++++++++++++++++++++++++\n include/hw/intc/xlnx-zynqmp-ipi.h      |  57 +++++\n 4 files changed, 436 insertions(+)\n create mode 100644 hw/intc/xlnx-zynqmp-ipi.c\n create mode 100644 include/hw/intc/xlnx-zynqmp-ipi.h",
    "diff": "diff --git a/default-configs/microblaze-softmmu.mak b/default-configs/microblaze-softmmu.mak\nindex ce2630818a..7fca8e4c99 100644\n--- a/default-configs/microblaze-softmmu.mak\n+++ b/default-configs/microblaze-softmmu.mak\n@@ -9,3 +9,4 @@ CONFIG_XILINX_SPI=y\n CONFIG_XILINX_ETHLITE=y\n CONFIG_SSI=y\n CONFIG_SSI_M25P80=y\n+CONFIG_XLNX_ZYNQMP=y\ndiff --git a/hw/intc/Makefile.objs b/hw/intc/Makefile.objs\nindex 78426a7daf..be3a1873d1 100644\n--- a/hw/intc/Makefile.objs\n+++ b/hw/intc/Makefile.objs\n@@ -3,6 +3,7 @@ common-obj-$(CONFIG_I8259) += i8259_common.o i8259.o\n common-obj-$(CONFIG_PL190) += pl190.o\n common-obj-$(CONFIG_PUV3) += puv3_intc.o\n common-obj-$(CONFIG_XILINX) += xilinx_intc.o\n+common-obj-$(CONFIG_XLNX_ZYNQMP) += xlnx-zynqmp-ipi.o\n common-obj-$(CONFIG_ETRAXFS) += etraxfs_pic.o\n common-obj-$(CONFIG_IMX) += imx_avic.o\n common-obj-$(CONFIG_LM32) += lm32_pic.o\ndiff --git a/hw/intc/xlnx-zynqmp-ipi.c b/hw/intc/xlnx-zynqmp-ipi.c\nnew file mode 100644\nindex 0000000000..6203b27e56\n--- /dev/null\n+++ b/hw/intc/xlnx-zynqmp-ipi.c\n@@ -0,0 +1,377 @@\n+/*\n+ * QEMU model of the IPI Inter Processor Interrupt block\n+ *\n+ * Copyright (c) 2014 Xilinx Inc.\n+ *\n+ * Written by Edgar E. Iglesias <edgar.iglesias@xilinx.com>\n+ * Written by Alistair Francis <alistair.francis@xilinx.com>\n+ *\n+ * Permission is hereby granted, free of charge, to any person obtaining a copy\n+ * of this software and associated documentation files (the \"Software\"), to deal\n+ * in the Software without restriction, including without limitation the rights\n+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n+ * copies of the Software, and to permit persons to whom the Software is\n+ * furnished to do so, subject to the following conditions:\n+ *\n+ * The above copyright notice and this permission notice shall be included in\n+ * all copies or substantial portions of the Software.\n+ *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n+ * THE SOFTWARE.\n+ */\n+\n+#include \"qemu/osdep.h\"\n+#include \"hw/sysbus.h\"\n+#include \"hw/register.h\"\n+#include \"qemu/bitops.h\"\n+#include \"qemu/log.h\"\n+#include \"hw/intc/xlnx-zynqmp-ipi.h\"\n+\n+#ifndef XLNX_ZYNQMP_IPI_ERR_DEBUG\n+#define XLNX_ZYNQMP_IPI_ERR_DEBUG 0\n+#endif\n+\n+#define DB_PRINT_L(lvl, fmt, args...) do {\\\n+    if (XLNX_ZYNQMP_IPI_ERR_DEBUG >= lvl) {\\\n+        qemu_log(TYPE_XLNX_ZYNQMP_IPI \": %s:\" fmt, __func__, ## args);\\\n+    } \\\n+} while (0);\n+\n+#define DB_PRINT(fmt, args...) DB_PRINT_L(1, fmt, ## args)\n+\n+REG32(IPI_TRIG, 0x0)\n+    FIELD(IPI_TRIG, PL_3, 27, 1)\n+    FIELD(IPI_TRIG, PL_2, 26, 1)\n+    FIELD(IPI_TRIG, PL_1, 25, 1)\n+    FIELD(IPI_TRIG, PL_0, 24, 1)\n+    FIELD(IPI_TRIG, PMU_3, 19, 1)\n+    FIELD(IPI_TRIG, PMU_2, 18, 1)\n+    FIELD(IPI_TRIG, PMU_1, 17, 1)\n+    FIELD(IPI_TRIG, PMU_0, 16, 1)\n+    FIELD(IPI_TRIG, RPU_1, 9, 1)\n+    FIELD(IPI_TRIG, RPU_0, 8, 1)\n+    FIELD(IPI_TRIG, APU, 0, 1)\n+REG32(IPI_OBS, 0x4)\n+    FIELD(IPI_OBS, PL_3, 27, 1)\n+    FIELD(IPI_OBS, PL_2, 26, 1)\n+    FIELD(IPI_OBS, PL_1, 25, 1)\n+    FIELD(IPI_OBS, PL_0, 24, 1)\n+    FIELD(IPI_OBS, PMU_3, 19, 1)\n+    FIELD(IPI_OBS, PMU_2, 18, 1)\n+    FIELD(IPI_OBS, PMU_1, 17, 1)\n+    FIELD(IPI_OBS, PMU_0, 16, 1)\n+    FIELD(IPI_OBS, RPU_1, 9, 1)\n+    FIELD(IPI_OBS, RPU_0, 8, 1)\n+    FIELD(IPI_OBS, APU, 0, 1)\n+REG32(IPI_ISR, 0x10)\n+    FIELD(IPI_ISR, PL_3, 27, 1)\n+    FIELD(IPI_ISR, PL_2, 26, 1)\n+    FIELD(IPI_ISR, PL_1, 25, 1)\n+    FIELD(IPI_ISR, PL_0, 24, 1)\n+    FIELD(IPI_ISR, PMU_3, 19, 1)\n+    FIELD(IPI_ISR, PMU_2, 18, 1)\n+    FIELD(IPI_ISR, PMU_1, 17, 1)\n+    FIELD(IPI_ISR, PMU_0, 16, 1)\n+    FIELD(IPI_ISR, RPU_1, 9, 1)\n+    FIELD(IPI_ISR, RPU_0, 8, 1)\n+    FIELD(IPI_ISR, APU, 0, 1)\n+REG32(IPI_IMR, 0x14)\n+    FIELD(IPI_IMR, PL_3, 27, 1)\n+    FIELD(IPI_IMR, PL_2, 26, 1)\n+    FIELD(IPI_IMR, PL_1, 25, 1)\n+    FIELD(IPI_IMR, PL_0, 24, 1)\n+    FIELD(IPI_IMR, PMU_3, 19, 1)\n+    FIELD(IPI_IMR, PMU_2, 18, 1)\n+    FIELD(IPI_IMR, PMU_1, 17, 1)\n+    FIELD(IPI_IMR, PMU_0, 16, 1)\n+    FIELD(IPI_IMR, RPU_1, 9, 1)\n+    FIELD(IPI_IMR, RPU_0, 8, 1)\n+    FIELD(IPI_IMR, APU, 0, 1)\n+REG32(IPI_IER, 0x18)\n+    FIELD(IPI_IER, PL_3, 27, 1)\n+    FIELD(IPI_IER, PL_2, 26, 1)\n+    FIELD(IPI_IER, PL_1, 25, 1)\n+    FIELD(IPI_IER, PL_0, 24, 1)\n+    FIELD(IPI_IER, PMU_3, 19, 1)\n+    FIELD(IPI_IER, PMU_2, 18, 1)\n+    FIELD(IPI_IER, PMU_1, 17, 1)\n+    FIELD(IPI_IER, PMU_0, 16, 1)\n+    FIELD(IPI_IER, RPU_1, 9, 1)\n+    FIELD(IPI_IER, RPU_0, 8, 1)\n+    FIELD(IPI_IER, APU, 0, 1)\n+REG32(IPI_IDR, 0x1c)\n+    FIELD(IPI_IDR, PL_3, 27, 1)\n+    FIELD(IPI_IDR, PL_2, 26, 1)\n+    FIELD(IPI_IDR, PL_1, 25, 1)\n+    FIELD(IPI_IDR, PL_0, 24, 1)\n+    FIELD(IPI_IDR, PMU_3, 19, 1)\n+    FIELD(IPI_IDR, PMU_2, 18, 1)\n+    FIELD(IPI_IDR, PMU_1, 17, 1)\n+    FIELD(IPI_IDR, PMU_0, 16, 1)\n+    FIELD(IPI_IDR, RPU_1, 9, 1)\n+    FIELD(IPI_IDR, RPU_0, 8, 1)\n+    FIELD(IPI_IDR, APU, 0, 1)\n+\n+/* APU\n+ * RPU_0\n+ * RPU_1\n+ * PMU_0\n+ * PMU_1\n+ * PMU_2\n+ * PMU_3\n+ * PL_0\n+ * PL_1\n+ * PL_2\n+ * PL_3\n+ */\n+int index_array[NUM_IPIS] = {0, 8, 9, 16, 17, 18, 19, 24, 25, 26, 27};\n+static const char *index_array_names[NUM_IPIS] = {\"APU\", \"RPU_0\", \"RPU_1\",\n+                                                  \"PMU_0\", \"PMU_1\", \"PMU_2\",\n+                                                  \"PMU_3\", \"PL_0\", \"PL_1\",\n+                                                  \"PL_2\", \"PL_3\"};\n+\n+static void xlnx_zynqmp_ipi_set_trig(XlnxZynqMPIPI *s, uint32_t val)\n+{\n+    int i, ipi_index, ipi_mask;\n+\n+    for (i = 0; i < NUM_IPIS; i++) {\n+        ipi_index = index_array[i];\n+        ipi_mask = (1 << ipi_index);\n+        DB_PRINT(\"Setting %s=%d\\n\", index_array_names[i],\n+                 !!(val & ipi_mask));\n+        qemu_set_irq(s->irq_trig_out[i], !!(val & ipi_mask));\n+    }\n+}\n+\n+static void xlnx_zynqmp_ipi_set_obs(XlnxZynqMPIPI *s, uint32_t val)\n+{\n+    int i, ipi_index, ipi_mask;\n+\n+    for (i = 0; i < NUM_IPIS; i++) {\n+        ipi_index = index_array[i];\n+        ipi_mask = (1 << ipi_index);\n+        DB_PRINT(\"Setting %s=%d\\n\", index_array_names[i],\n+                 !!(val & ipi_mask));\n+        qemu_set_irq(s->irq_obs_out[i], !!(val & ipi_mask));\n+    }\n+}\n+\n+static void xlnx_zynqmp_ipi_update_irq(XlnxZynqMPIPI *s)\n+{\n+    bool pending = s->regs[R_IPI_ISR] & ~s->regs[R_IPI_IMR];\n+\n+    DB_PRINT(\"irq=%d isr=%x mask=%x\\n\",\n+             pending, s->regs[R_IPI_ISR], s->regs[R_IPI_IMR]);\n+    qemu_set_irq(s->irq, pending);\n+}\n+\n+static uint64_t xlnx_zynqmp_ipi_trig_prew(RegisterInfo *reg, uint64_t val64)\n+{\n+    XlnxZynqMPIPI *s = XLNX_ZYNQMP_IPI(reg->opaque);\n+\n+    xlnx_zynqmp_ipi_set_trig(s, val64);\n+\n+    return val64;\n+}\n+\n+static void xlnx_zynqmp_ipi_trig_postw(RegisterInfo *reg, uint64_t val64)\n+{\n+    XlnxZynqMPIPI *s = XLNX_ZYNQMP_IPI(reg->opaque);\n+\n+    /* TRIG generates a pulse on the outbound signals. We use the\n+     * post-write callback to bring the signal back-down.\n+     */\n+    s->regs[R_IPI_TRIG] = 0;\n+\n+    xlnx_zynqmp_ipi_set_trig(s, 0);\n+}\n+\n+static uint64_t xlnx_zynqmp_ipi_isr_prew(RegisterInfo *reg, uint64_t val64)\n+{\n+    XlnxZynqMPIPI *s = XLNX_ZYNQMP_IPI(reg->opaque);\n+\n+    xlnx_zynqmp_ipi_set_obs(s, val64);\n+\n+    return val64;\n+}\n+\n+static void xlnx_zynqmp_ipi_isr_postw(RegisterInfo *reg, uint64_t val64)\n+{\n+    XlnxZynqMPIPI *s = XLNX_ZYNQMP_IPI(reg->opaque);\n+\n+    xlnx_zynqmp_ipi_update_irq(s);\n+}\n+\n+static uint64_t xlnx_zynqmp_ipi_ier_prew(RegisterInfo *reg, uint64_t val64)\n+{\n+    XlnxZynqMPIPI *s = XLNX_ZYNQMP_IPI(reg->opaque);\n+    uint32_t val = val64;\n+\n+    s->regs[R_IPI_IMR] &= ~val;\n+    xlnx_zynqmp_ipi_update_irq(s);\n+    return 0;\n+}\n+\n+static uint64_t xlnx_zynqmp_ipi_idr_prew(RegisterInfo *reg, uint64_t val64)\n+{\n+    XlnxZynqMPIPI *s = XLNX_ZYNQMP_IPI(reg->opaque);\n+    uint32_t val = val64;\n+\n+    s->regs[R_IPI_IMR] |= val;\n+    xlnx_zynqmp_ipi_update_irq(s);\n+    return 0;\n+}\n+\n+static const RegisterAccessInfo xlnx_zynqmp_ipi_regs_info[] = {\n+    {   .name = \"IPI_TRIG\",  .addr = A_IPI_TRIG,\n+        .rsvd = 0xf0f0fcfe,\n+        .ro = 0xf0f0fcfe,\n+        .pre_write = xlnx_zynqmp_ipi_trig_prew,\n+        .post_write = xlnx_zynqmp_ipi_trig_postw,\n+    },{ .name = \"IPI_OBS\",  .addr = A_IPI_OBS,\n+        .rsvd = 0xf0f0fcfe,\n+        .ro = 0xffffffff,\n+    },{ .name = \"IPI_ISR\",  .addr = A_IPI_ISR,\n+        .rsvd = 0xf0f0fcfe,\n+        .ro = 0xf0f0fcfe,\n+        .w1c = 0xf0f0301,\n+        .pre_write = xlnx_zynqmp_ipi_isr_prew,\n+        .post_write = xlnx_zynqmp_ipi_isr_postw,\n+    },{ .name = \"IPI_IMR\",  .addr = A_IPI_IMR,\n+        .reset = 0xf0f0301,\n+        .rsvd = 0xf0f0fcfe,\n+        .ro = 0xffffffff,\n+    },{ .name = \"IPI_IER\",  .addr = A_IPI_IER,\n+        .rsvd = 0xf0f0fcfe,\n+        .ro = 0xf0f0fcfe,\n+        .pre_write = xlnx_zynqmp_ipi_ier_prew,\n+    },{ .name = \"IPI_IDR\",  .addr = A_IPI_IDR,\n+        .rsvd = 0xf0f0fcfe,\n+        .ro = 0xf0f0fcfe,\n+        .pre_write = xlnx_zynqmp_ipi_idr_prew,\n+    }\n+};\n+\n+static void xlnx_zynqmp_ipi_reset(DeviceState *dev)\n+{\n+    XlnxZynqMPIPI *s = XLNX_ZYNQMP_IPI(dev);\n+    int i;\n+\n+    for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {\n+        register_reset(&s->regs_info[i]);\n+    }\n+\n+    xlnx_zynqmp_ipi_update_irq(s);\n+}\n+\n+static void xlnx_zynqmp_ipi_handler(void *opaque, int n, int level)\n+{\n+    XlnxZynqMPIPI *s = XLNX_ZYNQMP_IPI(opaque);\n+    uint32_t val = (!!level) << n;\n+\n+    DB_PRINT(\"IPI input irq[%d]=%d\\n\", n, level);\n+\n+    s->regs[R_IPI_ISR] |= val;\n+    xlnx_zynqmp_ipi_set_obs(s, s->regs[R_IPI_ISR]);\n+    xlnx_zynqmp_ipi_update_irq(s);\n+}\n+\n+static void xlnx_zynqmp_obs_handler(void *opaque, int n, int level)\n+{\n+    XlnxZynqMPIPI *s = XLNX_ZYNQMP_IPI(opaque);\n+\n+    DB_PRINT(\"OBS input irq[%d]=%d\\n\", n, level);\n+\n+    s->regs[R_IPI_OBS] &= ~(1ULL << n);\n+    s->regs[R_IPI_OBS] |= (level << n);\n+}\n+\n+static const MemoryRegionOps xlnx_zynqmp_ipi_ops = {\n+    .read = register_read_memory,\n+    .write = register_write_memory,\n+    .endianness = DEVICE_LITTLE_ENDIAN,\n+    .valid = {\n+        .min_access_size = 4,\n+        .max_access_size = 4,\n+    },\n+};\n+\n+static void xlnx_zynqmp_ipi_realize(DeviceState *dev, Error **errp)\n+{\n+    qdev_init_gpio_in_named(dev, xlnx_zynqmp_ipi_handler, \"IPI_INPUTS\", 32);\n+    qdev_init_gpio_in_named(dev, xlnx_zynqmp_obs_handler, \"OBS_INPUTS\", 32);\n+}\n+\n+static void xlnx_zynqmp_ipi_init(Object *obj)\n+{\n+    XlnxZynqMPIPI *s = XLNX_ZYNQMP_IPI(obj);\n+    DeviceState *dev = DEVICE(obj);\n+    SysBusDevice *sbd = SYS_BUS_DEVICE(obj);\n+    RegisterInfoArray *reg_array;\n+    char *irq_name;\n+    int i;\n+\n+    memory_region_init(&s->iomem, obj, TYPE_XLNX_ZYNQMP_IPI,\n+                       R_XLNX_ZYNQMP_IPI_MAX * 4);\n+    reg_array =\n+        register_init_block32(DEVICE(obj), xlnx_zynqmp_ipi_regs_info,\n+                              ARRAY_SIZE(xlnx_zynqmp_ipi_regs_info),\n+                              s->regs_info, s->regs,\n+                              &xlnx_zynqmp_ipi_ops,\n+                              XLNX_ZYNQMP_IPI_ERR_DEBUG,\n+                              R_XLNX_ZYNQMP_IPI_MAX * 4);\n+    memory_region_add_subregion(&s->iomem,\n+                                0x0,\n+                                &reg_array->mem);\n+    sysbus_init_mmio(sbd, &s->iomem);\n+    sysbus_init_irq(sbd, &s->irq);\n+\n+    for (i = 0; i < NUM_IPIS; i++) {\n+        qdev_init_gpio_out_named(dev, &s->irq_trig_out[i],\n+                                 index_array_names[i], 1);\n+\n+        irq_name = g_strdup_printf(\"OBS_%s\", index_array_names[i]);\n+        qdev_init_gpio_out_named(dev, &s->irq_obs_out[i],\n+                                 irq_name, 1);\n+        g_free(irq_name);\n+    }\n+}\n+\n+static const VMStateDescription vmstate_zynqmp_pmu_ipi = {\n+    .name = TYPE_XLNX_ZYNQMP_IPI,\n+    .version_id = 1,\n+    .minimum_version_id = 1,\n+    .fields = (VMStateField[]) {\n+        VMSTATE_UINT32_ARRAY(regs, XlnxZynqMPIPI, R_XLNX_ZYNQMP_IPI_MAX),\n+        VMSTATE_END_OF_LIST(),\n+    }\n+};\n+\n+static void xlnx_zynqmp_ipi_class_init(ObjectClass *klass, void *data)\n+{\n+    DeviceClass *dc = DEVICE_CLASS(klass);\n+\n+    dc->reset = xlnx_zynqmp_ipi_reset;\n+    dc->realize = xlnx_zynqmp_ipi_realize;\n+    dc->vmsd = &vmstate_zynqmp_pmu_ipi;\n+}\n+\n+static const TypeInfo xlnx_zynqmp_ipi_info = {\n+    .name          = TYPE_XLNX_ZYNQMP_IPI,\n+    .parent        = TYPE_SYS_BUS_DEVICE,\n+    .instance_size = sizeof(XlnxZynqMPIPI),\n+    .class_init    = xlnx_zynqmp_ipi_class_init,\n+    .instance_init = xlnx_zynqmp_ipi_init,\n+};\n+\n+static void xlnx_zynqmp_ipi_register_types(void)\n+{\n+    type_register_static(&xlnx_zynqmp_ipi_info);\n+}\n+\n+type_init(xlnx_zynqmp_ipi_register_types)\ndiff --git a/include/hw/intc/xlnx-zynqmp-ipi.h b/include/hw/intc/xlnx-zynqmp-ipi.h\nnew file mode 100644\nindex 0000000000..4afa4ff313\n--- /dev/null\n+++ b/include/hw/intc/xlnx-zynqmp-ipi.h\n@@ -0,0 +1,57 @@\n+/*\n+ * QEMU model of the IPI Inter Processor Interrupt block\n+ *\n+ * Copyright (c) 2014 Xilinx Inc.\n+ *\n+ * Permission is hereby granted, free of charge, to any person obtaining a copy\n+ * of this software and associated documentation files (the \"Software\"), to deal\n+ * in the Software without restriction, including without limitation the rights\n+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n+ * copies of the Software, and to permit persons to whom the Software is\n+ * furnished to do so, subject to the following conditions:\n+ *\n+ * The above copyright notice and this permission notice shall be included in\n+ * all copies or substantial portions of the Software.\n+ *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n+ * THE SOFTWARE.\n+ */\n+\n+#ifndef XLNX_ZYNQMP_IPI_H\n+#define XLNX_ZYNQMP_IPI_H\n+\n+#include \"qemu/osdep.h\"\n+#include \"hw/sysbus.h\"\n+#include \"hw/register.h\"\n+\n+#define TYPE_XLNX_ZYNQMP_IPI \"xlnx.zynqmp_ipi\"\n+\n+#define XLNX_ZYNQMP_IPI(obj) \\\n+     OBJECT_CHECK(XlnxZynqMPIPI, (obj), TYPE_XLNX_ZYNQMP_IPI)\n+\n+/* This is R_IPI_IDR + 1 */\n+#define R_XLNX_ZYNQMP_IPI_MAX ((0x1c / 4) + 1)\n+\n+#define NUM_IPIS 11\n+\n+typedef struct XlnxZynqMPIPI {\n+    /* Private */\n+    SysBusDevice parent_obj;\n+\n+    /* Public */\n+    MemoryRegion iomem;\n+    qemu_irq irq;\n+\n+    qemu_irq irq_trig_out[NUM_IPIS];\n+    qemu_irq irq_obs_out[NUM_IPIS];\n+\n+    uint32_t regs[R_XLNX_ZYNQMP_IPI_MAX];\n+    RegisterInfo regs_info[R_XLNX_ZYNQMP_IPI_MAX];\n+} XlnxZynqMPIPI;\n+\n+#endif /* XLNX_ZYNQMP_IPI_H */\n",
    "prefixes": [
        "v2",
        "4/6"
    ]
}