get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2224192,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/2224192/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260417032837.2664122-16-jamin_lin@aspeedtech.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/1.2/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": "<20260417032837.2664122-16-jamin_lin@aspeedtech.com>",
    "list_archive_url": null,
    "date": "2026-04-17T03:28:58",
    "name": "[v4,15/21] hw/ssi/aspeed_smc: Add Data FIFO-based flash access support for AST2700",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "9db5a953d820264c9c2caabcb34f9950e3321f0d",
    "submitter": {
        "id": 81768,
        "url": "http://patchwork.ozlabs.org/api/1.2/people/81768/?format=api",
        "name": "Jamin Lin",
        "email": "jamin_lin@aspeedtech.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260417032837.2664122-16-jamin_lin@aspeedtech.com/mbox/",
    "series": [
        {
            "id": 500228,
            "url": "http://patchwork.ozlabs.org/api/1.2/series/500228/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=500228",
            "date": "2026-04-17T03:28:41",
            "name": "Add SSP/TSP power control and DRAM remap support for AST2700",
            "version": 4,
            "mbox": "http://patchwork.ozlabs.org/series/500228/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2224192/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2224192/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@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=aspeedtech.com header.i=@aspeedtech.com\n header.a=rsa-sha256 header.s=selector1 header.b=c/DWqeG4;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)",
            "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=aspeedtech.com;"
        ],
        "Received": [
            "from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fxgQk4SXhz1yHp\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 17 Apr 2026 13:31:26 +1000 (AEST)",
            "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wDZtb-0002fX-4V; Thu, 16 Apr 2026 23:29:31 -0400",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <jamin_lin@aspeedtech.com>)\n id 1wDZtM-0002PE-FC; Thu, 16 Apr 2026 23:29:19 -0400",
            "from mail-japaneastazlp170130007.outbound.protection.outlook.com\n ([2a01:111:f403:c405::7] helo=TYDPR03CU002.outbound.protection.outlook.com)\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <jamin_lin@aspeedtech.com>)\n id 1wDZtJ-0005q6-Sm; Thu, 16 Apr 2026 23:29:15 -0400",
            "from TYPPR06MB8206.apcprd06.prod.outlook.com (2603:1096:405:383::19)\n by KL1PR06MB6299.apcprd06.prod.outlook.com (2603:1096:820:ce::14)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9818.25; Fri, 17 Apr\n 2026 03:28:58 +0000",
            "from TYPPR06MB8206.apcprd06.prod.outlook.com\n ([fe80::e659:1ead:77cb:f6d3]) by TYPPR06MB8206.apcprd06.prod.outlook.com\n ([fe80::e659:1ead:77cb:f6d3%3]) with mapi id 15.20.9818.023; Fri, 17 Apr 2026\n 03:28:58 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=JKD9Rt/nd8gdsFKG3YlXztapqjRXEoucfhg0s5L2QNF99S6rjqRJ+fEbUl8Je4/l68ap6ACn+VYMlLkOsBpS/d6JRurAz4WM8FwzqZQxWq7+mqGJhTGRC2Ey4+I53P5oYxZCtZgnpn4miK8Q8O7JHwpgCNnDrPMe2VdekTE9Nf815TaF2rjrRlZmAob2ScYIuPY+x+uJAX6i70SzWAhwTGzoenQXdTOOGVr8OafDhF1JuzaDbOF7KuqWd61L7y8T7986tqYMLd1ee4ogCQiI3GtARc+7W3bok/5WsvI7cqdLCbYUzVgrsqAmLS0pOrRRkuv2qYt51QLIB68VrXnZBA==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=8ofljzjUgu5mmvrOIu0a56F6ltFXnA24cJupnUdHz2c=;\n b=GCCmDtDhuEONPDduIMkAM4kdPZyh1a3IogMoSycGPeb1He6KUZjPEUUlCpn0GnMI5yAIoE9lYCW5ZEYhAn2ktdN5euP4nNRj0cOjEa+nX7hb+TlHnXIlhAkflKiW/KDIrHY4ElG8mQ4pHRNuwNqXGUs9xnnv2HJg2iNuuy5rQQL1T2XF11TVVjXr8tLNPkF17k8JQeJIckmbW0/YJADYOev/EhgWmmhrVAvbezdm0skFUzM3nMjlhudmeiksqBQDuhsWojVggrx5Mr4RuTwOqomo71jABPKo84V3YRpZQZbip3DAQrCM2V9tvMdKZ6YRXwduXblXUh8STcy4Aa075A==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=aspeedtech.com; dmarc=pass action=none\n header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com;\n s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=8ofljzjUgu5mmvrOIu0a56F6ltFXnA24cJupnUdHz2c=;\n b=c/DWqeG4LrIzDBA2f9mBMeDhMy6DHdOUE3r0CfS+7EwqHgsAIY+Q96R4oHdWxsFZ0aRhmsPK65pArBO0ClGgFhh10gBIjz4pDtJHo2dzBn7b9SxL3+XkjlglBHGYOoNdr/sK/hNChpigeAZheTZEjnpGA3fuoGCMdbehzlFK8g+4lhQH/IXpU9iG7oy/mLYmWuK2KG50JouEPp7PvKFTLtBjmxBIXHOj1Wkh70ahjq7KSPSDHpoqvgpw0GOm9Q8FqyAX9zeaetEqWL2UNwfne+8QSEHCnkDLn02J5grUBlZMWW98dXxR8pI2edYrrztKHTsscfmu/OOyvEphCJ2NuQ==",
        "From": "Jamin Lin <jamin_lin@aspeedtech.com>",
        "To": "=?iso-8859-1?q?C=E9dric_Le_Goater?= <clg@kaod.org>,\n Peter Maydell <peter.maydell@linaro.org>,\n Steven Lee <steven_lee@aspeedtech.com>, Troy Lee <leetroy@gmail.com>,\n Kane Chen <kane_chen@aspeedtech.com>,\n Andrew Jeffery <andrew@codeconstruct.com.au>, Joel Stanley <joel@jms.id.au>,\n Pierrick Bouvier <pierrick.bouvier@linaro.org>,\n Alistair Francis <alistair@alistair23.me>, Kevin Wolf <kwolf@redhat.com>,\n Hanna Reitz <hreitz@redhat.com>,\n \"open list:ASPEED BMCs\" <qemu-arm@nongnu.org>,\n \"open list:All patches CC here\" <qemu-devel@nongnu.org>,\n \"open list:Block layer core\" <qemu-block@nongnu.org>",
        "CC": "Jamin Lin <jamin_lin@aspeedtech.com>, Troy Lee <troy_lee@aspeedtech.com>",
        "Subject": "[PATCH v4 15/21] hw/ssi/aspeed_smc: Add Data FIFO-based flash access\n support for AST2700",
        "Thread-Topic": "[PATCH v4 15/21] hw/ssi/aspeed_smc: Add Data FIFO-based flash\n access support for AST2700",
        "Thread-Index": "AQHczhpTBYUs0FuRPkSzZ2Mp/GAT4Q==",
        "Date": "Fri, 17 Apr 2026 03:28:58 +0000",
        "Message-ID": "<20260417032837.2664122-16-jamin_lin@aspeedtech.com>",
        "References": "<20260417032837.2664122-1-jamin_lin@aspeedtech.com>",
        "In-Reply-To": "<20260417032837.2664122-1-jamin_lin@aspeedtech.com>",
        "Accept-Language": "zh-TW, en-US",
        "Content-Language": "en-US",
        "X-MS-Has-Attach": "",
        "X-MS-TNEF-Correlator": "",
        "authentication-results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=aspeedtech.com header.i=@aspeedtech.com\n header.a=rsa-sha256 header.s=selector1 header.b=c/DWqeG4;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)",
            "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=aspeedtech.com;"
        ],
        "x-ms-publictraffictype": "Email",
        "x-ms-traffictypediagnostic": "TYPPR06MB8206:EE_|KL1PR06MB6299:EE_",
        "x-ms-office365-filtering-correlation-id": "8a906809-a6b3-4a4c-75f8-08de9c31765a",
        "x-ms-exchange-senderadcheck": "1",
        "x-ms-exchange-antispam-relay": "0",
        "x-microsoft-antispam": "BCL:0;\n ARA:13230040|1800799024|376014|7416014|366016|921020|38070700021|56012099003|18002099003|22082099003;",
        "x-microsoft-antispam-message-info": "\n u/HjIEYr+l97vZn01zzz+vU+GpWOmarprFnhmkTzSUeJoOCarjxO+MRoyEUlbj3izrPGp2eDq+gXa/ysKRSb75indXspxcZ69Spq2suTQonUoPXMURnHjGyuu4lPsLE1ljMyqDKEOhqwMTFkSMDtvJufar7hOZVb6hR8FEOKokfecm+TCmvDDHTXKC/k2UihHgWcJNw8ksvnO3ZDaKqHmUt4mShDiuiZEyQGQ+V6mnod4UNc6g/RmGS+mx3rJwzhuyNtNOEvxkAibHOoYA6uwxx7Ge7x9i226Mv+cllooPFx3t/g4nI9ft3SyKJ7lAaRNtELG17QW6/Li3vgvZb42+V1gSaUohshA3wbN8xb9nfj2YY/gL6ss2VX0bjH4QOTomLitVYn2rY6Zqq2tx9OVKqGfCkK9+ZKCDY53k6WcPnwrbSp38evvZOY1AJiqn9GZ9rqVTYBLn3z1hk/bdGojTVyaexoXBFdRMvmCgvYPoHKd2cis/WP6TovI2cEUhetG5cclfhhnGubZlXujbShdpZrP5nVcfWI8kggcFLT8pTH/d1V9zr4rsftwIB5NUomY4BYdQy9XLHu4zaK5uJFytjqdX5gTyixvI67GRM/+QPtrLDPnBZ/2kL2lp3FLbUES0wDQcnkWWbdBxLRjKrNdmuwmahve26PFsKSZF0NJJtHCMMNtGqTnEF4H8NzekDENFTFs9xUAmLTaI0W21muV+blnwFwZ3EAK+HqVYCJWnK4r2X4bwMBOLLeLQ3hs9ZtlHAD4RvFwljWDZeOyMMxg7YCOsDgrwpOcuxYtIbYAwp/57b7Snx+UCDTNJIOc2Wp",
        "x-forefront-antispam-report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:TYPPR06MB8206.apcprd06.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230040)(1800799024)(376014)(7416014)(366016)(921020)(38070700021)(56012099003)(18002099003)(22082099003);\n DIR:OUT; SFP:1102;",
        "x-ms-exchange-antispam-messagedata-chunkcount": "1",
        "x-ms-exchange-antispam-messagedata-0": "=?iso-8859-1?q?4zawAbNs2g/uU6wrlmRZ8u8?=\n\t=?iso-8859-1?q?sCWCdipN/+9A3IDqKHNA2gpYmzwhpOIBaCvFOfac+SOfEdar/mOtw7gDpDQc?=\n\t=?iso-8859-1?q?BaVsmRGBI02nalN7UEyW8Zq3qPM4oBBGBLAXcsLeajMo0eQkzk4KtZI2g71h?=\n\t=?iso-8859-1?q?yqaEKyLdfsTTRenEzyJXCCyDPYVPgsfmpUlO2fTioiNryb0tRzvXUPiU4x0w?=\n\t=?iso-8859-1?q?glP9HNC1/6sBcd++qvaOTzKoCx+TTM+N73JI6UFG8F6FCPQlrpU5o1jkIBN7?=\n\t=?iso-8859-1?q?e0ecEIDuGRJpvo/6VR2bovA2ZipoSOC7hVJuDkfnG+ezt5rwMyf6co4MZ63/?=\n\t=?iso-8859-1?q?fymIJutT1enmufa/2ccBPcV5VoQDiNJ9suRqh3nGqck83gjSHBifSguRtRhT?=\n\t=?iso-8859-1?q?1FPPi6pGmH+Uthq6HsdTNsJClLnBkCV3GsPn/YZWEGw74mlNR+klLTFX727e?=\n\t=?iso-8859-1?q?er8uVPSFrGEDj7mdFbm7VR/4a1h5Oj7x585rMcMcyIoDSwH/ChrhZXOsjPKO?=\n\t=?iso-8859-1?q?ULAi+kQ3hefM809zyMtccocwszGYBkRSpkUm2WdY0MTa1+qMxTQIIh3odGTv?=\n\t=?iso-8859-1?q?0NteTjJ3X712cxAeChKXH/wk0TGA8eL4qjBfWjcAI7TlyZ085poVNewpt3f+?=\n\t=?iso-8859-1?q?E1IkccbCyW+j+EmFuSJlo/j03GzCNmbmS6B0zf7wAP5n6Tpbq95KKJXNYjlP?=\n\t=?iso-8859-1?q?QHfi99G5dGABSvLaWHhvZpztcblUdrt4jC0JiyJPnVE6g7zOYo2OPBuLxfJA?=\n\t=?iso-8859-1?q?epEdAd8AxaRAVPXjd7lP355Rt8LmvNwa/UAx5kDUdFOiotcGezzwmuOS0Q1Y?=\n\t=?iso-8859-1?q?yZr1tT/zpVDJa7GNUYo2ZO08o52TDZJLiZyenauCVIIdmdDmkI14TNTxICX2?=\n\t=?iso-8859-1?q?vzuyzvYDnUW2iW0yfnsrCEs1TFtEw/FpWgbWYMZPE886/qvbXDsNybI3GdRF?=\n\t=?iso-8859-1?q?R3BX4CCqCU2/g8uDFRuEQJt7bkZaAVhtZfIju9krPwX5dxD1CzIMnGNinphB?=\n\t=?iso-8859-1?q?o9cjo/dVrVEsbeTmkYTSeNCdCWa4n1jIOqtZwuNZodr73W4lYC0SFhYRuUp6?=\n\t=?iso-8859-1?q?T2MVtL1GANWOGmR2t/EcYh/n/JCggtwbht1gBLG1Pcb4i7qtKM06hgYdL1MX?=\n\t=?iso-8859-1?q?V6ENwn260OBab+eDjwj4n8W4XezIE6htsyvDgEMRg4uKcyjm0m03rbS+B/dc?=\n\t=?iso-8859-1?q?KQ98jA2+s+rsvqSW6ZM3KGumiU0MoUGSMXkfdDVrAXlUkxNIWb/KAvNRR8co?=\n\t=?iso-8859-1?q?DPU8Q+e1gqgdjsvtsfKo7OvE5JeYww0fsPFBZp5tTtW/escXSv8e+sewXq6y?=\n\t=?iso-8859-1?q?UC9bJZn6JYoCL2ANCW+qQq73GciWPzef+F/cRM8QhcUrjdkwCpD1CpH9+3o6?=\n\t=?iso-8859-1?q?tz23MHvI0Sak4i2D1PVoPSlAgFb7hAFrd5wUFxqOd3IAgmtqrwfaxOc6Cfe8?=\n\t=?iso-8859-1?q?a1gwpTN0SE5ydA+J9Mp++Kt8OH+OpvS9oipdUlbP4wXFtsyxErs6NnqPcj9f?=\n\t=?iso-8859-1?q?dbJf1ETKpMOAKusGUpNDbUqQBIrEdlaHCN9o8SgkyszG16GhIyw8wFlaV+9n?=\n\t=?iso-8859-1?q?0mzoiKmrbAHd9+9M8GyXWgbpP1h5gFbuk/HSNndNRMKv7f8W7mg/XFvzr49Q?=\n\t=?iso-8859-1?q?ncjriCqwbo0wOsZoBUxG97SX9it48jqTj9fUOufqVqHpzRan3MFblB4fg72l?=\n\t=?iso-8859-1?q?ICOlbRjLVKafRBpe47pfBlFiVHKsHytfXQEQ34LmcNWHB8w36qowNmRwu/S5?=\n\t=?iso-8859-1?q?nBIsOM2BIeslJVGOjjJLnqgj5oPt+QqFza9nvowWRc2Wzzw=3D=3D?=",
        "Content-Type": "text/plain; charset=\"iso-8859-1\"",
        "Content-Transfer-Encoding": "quoted-printable",
        "MIME-Version": "1.0",
        "X-Exchange-RoutingPolicyChecked": "\n IaaQprGu9WfX4H809SQV2FyIw1qkNwp5fEsyU3lYWl6J6tYh5f2G/8oaj+hlH2FbcC2AkrHQ+Xw80hY1wpKp9BuzI6GBAk4PIrzMLm1X73qW/oG6K+RbJMXHfNYeKD++lFBSxomXRhPag3LzorVKA9LJRt1mw9m0hMQat6+Ln1fExfRZPbFrhicGfNWPNlpQiUiu9Z4s4yadOjYLMCr2kQ4tYZsCrho1K+d1bL2LqyTXmS7G8iUzk+VqvIeGx4L7eDubys8Kj+reDkO0/zZgpJDiSzAKtD2k5LSczzLnMNbLManC04f7Z88rQza61BvcfCK0aPpi1R3P32C/FOTDEw==",
        "X-OriginatorOrg": "aspeedtech.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-AuthSource": "TYPPR06MB8206.apcprd06.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 8a906809-a6b3-4a4c-75f8-08de9c31765a",
        "X-MS-Exchange-CrossTenant-originalarrivaltime": "17 Apr 2026 03:28:58.6066 (UTC)",
        "X-MS-Exchange-CrossTenant-fromentityheader": "Hosted",
        "X-MS-Exchange-CrossTenant-id": "43d4aa98-e35b-4575-8939-080e90d5a249",
        "X-MS-Exchange-CrossTenant-mailboxtype": "HOSTED",
        "X-MS-Exchange-CrossTenant-userprincipalname": "\n F5ZEjh1g1fgdJVG52C5nVcI8xAwjAV531cK/RKRHh1dMKSSNdSrXjk/20RXVkKCpGlZrdElnVUc4/75r2hmKryVN6l7cAHUSXP01cngIGKY=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "KL1PR06MB6299",
        "Received-SPF": "pass client-ip=2a01:111:f403:c405::7;\n envelope-from=jamin_lin@aspeedtech.com;\n helo=TYDPR03CU002.outbound.protection.outlook.com",
        "X-Spam_score_int": "-20",
        "X-Spam_score": "-2.1",
        "X-Spam_bar": "--",
        "X-Spam_report": "(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham autolearn_force=no",
        "X-Spam_action": "no action",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "qemu development <qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<https://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 <mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"
    },
    "content": "AST2700 supports a Data FIFO mode where flash accesses can be performed\ndirectly through Data FIFO MMIO offsets. The Data FIFO start offset\nincrements by one for every 16MB of flash address space, allowing the\nchip select (CS) to be decoded from the Data FIFO offset.\n\nThis change adds Data FIFO support to the Aspeed SMC model and introduces\na class callback to translate Data FIFO offsets into CS indices. For\nAST2700, the Data FIFO offset is matched against the segment start address\nof each CS to determine the target flash device.\n\nThe SMC register region size (nregs) is also extended dynamically\nbased on the number of supported chip selects to cover all possible\nData FIFO regions.\n\nSigned-off-by: Jamin Lin <jamin_lin@aspeedtech.com>\n---\n include/hw/ssi/aspeed_smc.h |   3 +-\n hw/ssi/aspeed_smc.c         | 113 +++++++++++++++++++++++++++++++++---\n 2 files changed, 107 insertions(+), 9 deletions(-)",
    "diff": "diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h\nindex 76831422c6..640efade94 100644\n--- a/include/hw/ssi/aspeed_smc.h\n+++ b/include/hw/ssi/aspeed_smc.h\n@@ -47,7 +47,7 @@ struct AspeedSMCFlash {\n #define TYPE_ASPEED_SMC \"aspeed.smc\"\n OBJECT_DECLARE_TYPE(AspeedSMCState, AspeedSMCClass, ASPEED_SMC)\n \n-#define ASPEED_SMC_R_MAX        (0x100 / 4)\n+#define ASPEED_SMC_R_MAX        (0x300 / 4)\n #define ASPEED_SMC_CS_MAX       5\n \n struct AspeedSMCState {\n@@ -116,6 +116,7 @@ struct AspeedSMCClass {\n                            AspeedSegments *seg);\n     void (*dma_ctrl)(AspeedSMCState *s, uint32_t value);\n     int (*addr_width)(const AspeedSMCState *s);\n+    int (*data_fifo_offset_to_cs)(const AspeedSMCState *s, uint32_t offset);\n     const MemoryRegionOps *reg_ops;\n };\n \ndiff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c\nindex f0deeea996..186446c1ec 100644\n--- a/hw/ssi/aspeed_smc.c\n+++ b/hw/ssi/aspeed_smc.c\n@@ -163,6 +163,9 @@\n /* Read Timing Compensation Register */\n #define R_TIMINGS         (0x94 / 4)\n \n+/* Data fifo */\n+#define R_DATA_FIFO       (0x200 / 4)\n+\n /* SPI controller registers and bits (AST2400) */\n #define R_SPI_CONF        (0x00 / 4)\n #define   SPI_CONF_ENABLE_W0   0\n@@ -212,6 +215,7 @@ static const AspeedSegments aspeed_2500_spi2_segments[];\n #define ASPEED_SMC_FEATURE_DMA_GRANT 0x2\n #define ASPEED_SMC_FEATURE_WDT_CONTROL 0x4\n #define ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH 0x08\n+#define ASPEED_SMC_FEATURE_DATA_FIFO 0x10\n \n static inline bool aspeed_smc_has_dma(const AspeedSMCClass *asc)\n {\n@@ -228,6 +232,11 @@ static inline bool aspeed_smc_has_dma64(const AspeedSMCClass *asc)\n     return !!(asc->features & ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH);\n }\n \n+static inline bool aspeed_smc_has_data_fifo(const AspeedSMCClass *asc)\n+{\n+    return !!(asc->features & ASPEED_SMC_FEATURE_DATA_FIFO);\n+}\n+\n #define aspeed_smc_error(fmt, ...)                                      \\\n     qemu_log_mask(LOG_GUEST_ERROR, \"%s: \" fmt \"\\n\", __func__, ## __VA_ARGS__)\n \n@@ -764,6 +773,7 @@ static MemTxResult aspeed_smc_read(void *opaque, hwaddr addr, uint64_t *data,\n {\n     AspeedSMCState *s = ASPEED_SMC(opaque);\n     AspeedSMCClass *asc = ASPEED_SMC_GET_CLASS(opaque);\n+    int cs;\n \n     addr >>= 2;\n \n@@ -789,6 +799,18 @@ static MemTxResult aspeed_smc_read(void *opaque, hwaddr addr, uint64_t *data,\n         trace_aspeed_smc_read(addr << 2, size, s->regs[addr]);\n \n         *data = s->regs[addr];\n+    } else if (aspeed_smc_has_data_fifo(asc) && addr >= R_DATA_FIFO) {\n+        cs = asc->data_fifo_offset_to_cs(s, addr << 2);\n+        if (cs >= 0) {\n+            /*\n+             * Data fifo mode only supports SPI user mode.\n+             * The flash address is provided by the SPI command/address cycles,\n+             * the MMIO addr parameter is ignored.\n+             */\n+            return aspeed_smc_flash_read(&s->flashes[cs], 0, data, size, attrs);\n+        }\n+        aspeed_smc_error(\"Invalid data fifo offset %\" HWADDR_PRIx, addr << 2);\n+        return MEMTX_ERROR;\n     } else {\n         qemu_log_mask(LOG_UNIMP, \"%s: not implemented: 0x%\" HWADDR_PRIx \"\\n\",\n                       __func__, addr);\n@@ -1163,6 +1185,19 @@ static MemTxResult aspeed_smc_write(void *opaque, hwaddr addr, uint64_t data,\n     } else if (aspeed_smc_has_dma(asc) && aspeed_smc_has_dma64(asc) &&\n                addr == R_DMA_DRAM_ADDR_HIGH) {\n         s->regs[addr] = DMA_DRAM_ADDR_HIGH(value);\n+    } else if (aspeed_smc_has_data_fifo(asc) && addr >= R_DATA_FIFO) {\n+        int cs = asc->data_fifo_offset_to_cs(s, addr << 2);\n+        if (cs >= 0) {\n+            /*\n+             * Data fifo mode only supports SPI user mode.\n+             * The flash address is provided by the SPI command/address cycles,\n+             * the MMIO addr parameter is ignored.\n+             */\n+            return aspeed_smc_flash_write(&s->flashes[cs], 0, data, size,\n+                                          attrs);\n+        }\n+        aspeed_smc_error(\"Invalid data fifo offset %\" HWADDR_PRIx, addr << 2);\n+        return MEMTX_ERROR;\n     } else {\n         qemu_log_mask(LOG_UNIMP, \"%s: not implemented: 0x%\" HWADDR_PRIx \"\\n\",\n                       __func__, addr);\n@@ -1996,6 +2031,39 @@ static void aspeed_2700_smc_reg_to_segment(const AspeedSMCState *s,\n     }\n }\n \n+/*\n+ * Convert a data fifo offset to a chip select (CS).\n+ *\n+ * Data fifo access starts at 0x200. The data fifo offset index is\n+ * calculated by subtracting the data fifo base offset from the MMIO address.\n+ *\n+ * The data fifo offset index increments by 1 for every 16MB of flash address\n+ * space. Each offset step therefore represents a 16MB address decode range.\n+ *\n+ * The CS is determined by matching the data fifo offset index against the\n+ * segment start address of each CS.\n+ *\n+ * Returns the CS index on success, or -1 if the offset is invalid.\n+ */\n+static int aspeed_2700_smc_data_fifo_offset_to_cs(const AspeedSMCState *s,\n+                                                  uint32_t offset)\n+{\n+    AspeedSMCClass *asc = ASPEED_SMC_GET_CLASS(s);\n+    uint32_t start_offset;\n+    uint32_t fifo_offset;\n+    int i;\n+\n+    for (i = 0; i < asc->cs_num_max; i++) {\n+        start_offset = (s->regs[R_SEG_ADDR0 + i] & 0x0000ffff) << 16;\n+        fifo_offset = start_offset / 0x1000000;\n+        if (fifo_offset == offset - (R_DATA_FIFO << 2)) {\n+            return i;\n+        }\n+    }\n+\n+    return -1;\n+}\n+\n static const uint32_t aspeed_2700_fmc_resets[ASPEED_SMC_R_MAX] = {\n     [R_CONF] = (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE0 |\n             CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE1),\n@@ -2030,6 +2098,27 @@ static const AspeedSegments aspeed_2700_fmc_segments[] = {\n     { 0x0, 0 }, /* disabled */\n };\n \n+/*\n+ * AST2700 supports data fifo mode with a base data fifo start offset of 0x200.\n+ *\n+ * The data fifo start offset increments by 1 for every 16MB of flash address\n+ * space. Each offset step therefore represents a 16MB address decode range.\n+ *\n+ * Assuming each chip select (CS) can use the maximum flash size of 256MB:\n+ *   256MB / 16MB = 0x10 offset steps per CS.\n+ *\n+ * Data fifo start offset for CSn:\n+ *   0x200 + (n * 0x10)\n+ *\n+ * Examples:\n+ *   CS0: 0x200\n+ *   CS1: 0x210\n+ *   CS2: 0x220\n+ *   CS3: 0x230\n+ *\n+ * asc->nregs should be set to: 0x200 + (asc->cs_num_max * 0x10)\n+ * to cover all possible data fifo regions.\n+ */\n static void aspeed_2700_fmc_class_init(ObjectClass *klass, const void *data)\n {\n     DeviceClass *dc = DEVICE_CLASS(klass);\n@@ -2049,14 +2138,16 @@ static void aspeed_2700_fmc_class_init(ObjectClass *klass, const void *data)\n     asc->flash_window_base = 0x100000000;\n     asc->flash_window_size = 1 * GiB;\n     asc->features          = ASPEED_SMC_FEATURE_DMA |\n-                             ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH;\n+                             ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH |\n+                             ASPEED_SMC_FEATURE_DATA_FIFO;\n     asc->dma_flash_mask    = 0x2FFFFFFC;\n     asc->dma_dram_mask     = 0xFFFFFFFC;\n     asc->dma_start_length  = 1;\n-    asc->nregs             = ASPEED_SMC_R_MAX;\n+    asc->nregs             = 0x200 + (asc->cs_num_max * 0x10);\n     asc->segment_to_reg    = aspeed_2700_smc_segment_to_reg;\n     asc->reg_to_segment    = aspeed_2700_smc_reg_to_segment;\n     asc->dma_ctrl          = aspeed_2600_smc_dma_ctrl;\n+    asc->data_fifo_offset_to_cs = aspeed_2700_smc_data_fifo_offset_to_cs;\n     asc->reg_ops           = &aspeed_2700_smc_flash_ops;\n }\n \n@@ -2090,14 +2181,16 @@ static void aspeed_2700_spi0_class_init(ObjectClass *klass, const void *data)\n     asc->flash_window_base = 0x180000000;\n     asc->flash_window_size = 1 * GiB;\n     asc->features          = ASPEED_SMC_FEATURE_DMA |\n-                             ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH;\n+                             ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH |\n+                             ASPEED_SMC_FEATURE_DATA_FIFO;\n     asc->dma_flash_mask    = 0x2FFFFFFC;\n     asc->dma_dram_mask     = 0xFFFFFFFC;\n     asc->dma_start_length  = 1;\n-    asc->nregs             = ASPEED_SMC_R_MAX;\n+    asc->nregs             = 0x200 + (asc->cs_num_max * 0x10);\n     asc->segment_to_reg    = aspeed_2700_smc_segment_to_reg;\n     asc->reg_to_segment    = aspeed_2700_smc_reg_to_segment;\n     asc->dma_ctrl          = aspeed_2600_smc_dma_ctrl;\n+    asc->data_fifo_offset_to_cs = aspeed_2700_smc_data_fifo_offset_to_cs;\n     asc->reg_ops           = &aspeed_2700_smc_flash_ops;\n }\n \n@@ -2130,14 +2223,16 @@ static void aspeed_2700_spi1_class_init(ObjectClass *klass, const void *data)\n     asc->flash_window_base = 0x200000000;\n     asc->flash_window_size = 1 * GiB;\n     asc->features          = ASPEED_SMC_FEATURE_DMA |\n-                             ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH;\n+                             ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH |\n+                             ASPEED_SMC_FEATURE_DATA_FIFO;\n     asc->dma_flash_mask    = 0x2FFFFFFC;\n     asc->dma_dram_mask     = 0xFFFFFFFC;\n     asc->dma_start_length  = 1;\n-    asc->nregs             = ASPEED_SMC_R_MAX;\n+    asc->nregs             = 0x200 + (asc->cs_num_max * 0x10);\n     asc->segment_to_reg    = aspeed_2700_smc_segment_to_reg;\n     asc->reg_to_segment    = aspeed_2700_smc_reg_to_segment;\n     asc->dma_ctrl          = aspeed_2600_smc_dma_ctrl;\n+    asc->data_fifo_offset_to_cs = aspeed_2700_smc_data_fifo_offset_to_cs;\n     asc->reg_ops           = &aspeed_2700_smc_flash_ops;\n }\n \n@@ -2170,14 +2265,16 @@ static void aspeed_2700_spi2_class_init(ObjectClass *klass, const void *data)\n     asc->flash_window_base = 0x280000000;\n     asc->flash_window_size = 1 * GiB;\n     asc->features          = ASPEED_SMC_FEATURE_DMA |\n-                             ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH;\n+                             ASPEED_SMC_FEATURE_DMA_DRAM_ADDR_HIGH |\n+                             ASPEED_SMC_FEATURE_DATA_FIFO;\n     asc->dma_flash_mask    = 0x0FFFFFFC;\n     asc->dma_dram_mask     = 0xFFFFFFFC;\n     asc->dma_start_length  = 1;\n-    asc->nregs             = ASPEED_SMC_R_MAX;\n+    asc->nregs             = 0x200 + (asc->cs_num_max * 0x10);\n     asc->segment_to_reg    = aspeed_2700_smc_segment_to_reg;\n     asc->reg_to_segment    = aspeed_2700_smc_reg_to_segment;\n     asc->dma_ctrl          = aspeed_2600_smc_dma_ctrl;\n+    asc->data_fifo_offset_to_cs = aspeed_2700_smc_data_fifo_offset_to_cs;\n     asc->reg_ops           = &aspeed_2700_smc_flash_ops;\n }\n \n",
    "prefixes": [
        "v4",
        "15/21"
    ]
}