Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2227048/?format=api
{ "id": 2227048, "url": "http://patchwork.ozlabs.org/api/patches/2227048/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260423051804.362095-9-jamin_lin@aspeedtech.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": "<20260423051804.362095-9-jamin_lin@aspeedtech.com>", "list_archive_url": null, "date": "2026-04-23T05:18:15", "name": "[v4,08/17] hw/usb/hcd-ehci: Change descriptor addresses to 64-bit with migration compatibility", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "db42ae306acb4390f875b1374cde3f0ee985d652", "submitter": { "id": 81768, "url": "http://patchwork.ozlabs.org/api/people/81768/?format=api", "name": "Jamin Lin", "email": "jamin_lin@aspeedtech.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260423051804.362095-9-jamin_lin@aspeedtech.com/mbox/", "series": [ { "id": 501145, "url": "http://patchwork.ozlabs.org/api/series/501145/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=501145", "date": "2026-04-23T05:18:08", "name": "hw/usb/ehci: Add 64-bit descriptor addressing support", "version": 4, "mbox": "http://patchwork.ozlabs.org/series/501145/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2227048/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2227048/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=mstCAIBB;\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 4g1PZR6Rj2z1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 23 Apr 2026 15:21:03 +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 1wFmSO-0007YG-US; Thu, 23 Apr 2026 01:18:32 -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 1wFmSN-0007WL-0k; Thu, 23 Apr 2026 01:18:31 -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 1wFmSK-0003Bi-6Y; Thu, 23 Apr 2026 01:18:30 -0400", "from TYPPR06MB8206.apcprd06.prod.outlook.com (2603:1096:405:383::19)\n by KUXPR06MB8534.apcprd06.prod.outlook.com (2603:1096:d10:9d::22)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.16; Thu, 23 Apr\n 2026 05:18:15 +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.9846.021; Thu, 23 Apr 2026\n 05:18:15 +0000" ], "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=ayMJlWquCBkSIkVuI35CGIuJ7lDIYp3qUG/kGvIy5L2aAyD9EECx5MSjT13bK1MeDwzsqSP8tJjZK0lRussds5Zwl76q5y4Z2eVIMEPhTii7xmUUBfA4SQnRvaI6IS+wT4plijKEE8+Sh91oF8FYWoWGn8nt6QwmeSOGGEXoxQnfxNFXheIfPumTQl+O49oJWIWXgcvQy51qsp7c9ttLF5bOj1tfHcVLDv0QyRqpgx+PMS2He84VVYS4VPHArXAtO2BEt7Tn4jHsNWJZCTcZFNFePguZYPbO+aq6trlqefMc/X5xncA5nfETlppkeupz2Mwm9jpB69t/KroGZ/ySHw==", "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=/lR+qOgCDhbIdGpAqtRkQ08DD3pdGI/PWZGjDn/NDkw=;\n b=pwWg8S03ROuQqakWj87zEADI6kVXFnISKKcFKWSgvjOdZZ3MbEMldPJCpewgHBqxOnNd0zL/cwLW2+8INcD6Rwa8uix7au75RHOSGmc22FSsIQFz8DIuJMd+XVizh7u0USOfPG3RzRz5jbuYLBrsbXz1hDyoVT27zQGO+jGVi76LJdqS/gikYH5GoGIb8DBkSK2pU1dfekG26prJ0UNhRwfl/P+qrC/9/4m2WqPplWj2ynnVhdxHayo7rMhqpKSSlp/PGm2QRSOARwURrC3XQ3vBxEaWqaowPPGP7SxbkYN63FATY4AqQ3tNJ8sK/8D18vWzlcxIOYlm+JfTBh0PJA==", "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=/lR+qOgCDhbIdGpAqtRkQ08DD3pdGI/PWZGjDn/NDkw=;\n b=mstCAIBBSlr+9TeyNKxw/OApdxSujcD3mrNZPznVjFaXtc9ZoMWWRfGJ6Gask+zOQNhyoqa5K4xWszHprdHFmEWTDMES9DosfJDj+5ItV5Y+ZsAYMUog/vs/MDXsaypfG7JYu+CAnb4u2j4J3AjDZ2DgYG3fN7n/n9m9IDLmDbrda3ar0+EW4zKvOPvRE9GTzVYU6d0HKwlcOKAnluGeC5ATCNxHNxCSkYLeD5usEFmuNdggt7IpcRDQDp33CpRO/pJrSnuCYssnX9JFiFcCLAXBSRuxekKdduhfgRJRgmFCZp5EwMdCv1PCBz2zW5dCZ8BycYfvX/0E0UhmlTfWnw==", "From": "Jamin Lin <jamin_lin@aspeedtech.com>", "To": "\"philmd@linaro.org\" <philmd@linaro.org>,\n \"peterx@redhat.com\" <peterx@redhat.com>,\n =?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 Marcel Apfelbaum <marcel.apfelbaum@gmail.com>,\n Yanan Wang <wangyanan55@huawei.com>, Zhao Liu <zhao1.liu@intel.com>,\n \"open list:ASPEED BMCs\" <qemu-arm@nongnu.org>,\n \"open list:All patches CC here\" <qemu-devel@nongnu.org>", "CC": "Jamin Lin <jamin_lin@aspeedtech.com>, Troy Lee <troy_lee@aspeedtech.com>,\n \"flwu@google.com\" <flwu@google.com>, \"nabihestefan@google.com\"\n <nabihestefan@google.com>, \"farosas@suse.de\" <farosas@suse.de>", "Subject": "[PATCH v4 08/17] hw/usb/hcd-ehci: Change descriptor addresses to\n 64-bit with migration compatibility", "Thread-Topic": "[PATCH v4 08/17] hw/usb/hcd-ehci: Change descriptor addresses to\n 64-bit with migration compatibility", "Thread-Index": "AQHc0uCWDRW5scSU9kSZ62gwOB1gJA==", "Date": "Thu, 23 Apr 2026 05:18:15 +0000", "Message-ID": "<20260423051804.362095-9-jamin_lin@aspeedtech.com>", "References": "<20260423051804.362095-1-jamin_lin@aspeedtech.com>", "In-Reply-To": "<20260423051804.362095-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=mstCAIBB;\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_|KUXPR06MB8534:EE_", "x-ms-office365-filtering-correlation-id": "0b961e91-5f90-4423-b050-08dea0f7b923", "x-ms-exchange-senderadcheck": "1", "x-ms-exchange-antispam-relay": "0", "x-microsoft-antispam": "BCL:0;\n ARA:13230040|376014|7416014|1800799024|366016|38070700021|921020|18002099003|22082099003|56012099003;", "x-microsoft-antispam-message-info": "\n Au6gdh90on4aBopaZjb7WWhidJWZq3Ps5p/CdZN2qtHwrDQa16Axf+B+6dsg8WSAAnr6twbg1iTfLwOKr/a3EPkfabDWAOyqEvTYQlmreDSGyTY9604XXiAbzn8LYO0sUHkyH5JVi/xJWZsR6Rl66CYxfT2lOrFCK1EKYmqty+NjLTgoYZArfApoyP6X/xqDtmBkaMq+VIODQ93REl781ryFqzX+J90b2lkHS6XDKTd4T2MqKy3p/j1FO4ta5rb+Xn3uBT5AAfeGtv/8+i/Zid8rURjcxugs1qx4qmImmBC39B0xdhfFf6dGkTyJO5vd4qGvaGaFvW7HdZEPKul2ZCtME9ujRDYrdpgjpo5o8uktV9hrj7IqHm3mWXgByVwJsn7uZX26oUv2Mt9x0s2yAD4Iz97m6Z6uZVFFNfA5XMu06zxhzy8NK4wdzgEoSmJ9/wZ6MzDkoYGNDOh6AneI4EroA72BkSdaF7xepiWwHkADyb5rDiSwlf0zywkMux7TiIiyKszS0LHslVY2cWNUhLEPrdZTkhqe8Yo48wFGqR2jWqxXfrxelrKLzenpkyoc8bq7SGMRSlZNzY1PQ5Dw4mQBTjunCGEHVegmV4Ob0tEKMyuXTtXOSbECY0SvbTI/avj0NPnQ9RD90rt4CItnuSM9W5YjHVAwufooeIAm4nTUWO3ZpS2p8a5MGTTIJcxAMkRIXlt+uxrCkWx2qTEkHoLClKnJmz5kKmW/mzhBqRCdHssj3iizjDzeZBrwznbZwW84wIYJdymH5CJA4QZe4W/MIxlZAy4JcQb4pGawOpvHooa9GqEwY9qd/xCEz4P+", "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)(376014)(7416014)(1800799024)(366016)(38070700021)(921020)(18002099003)(22082099003)(56012099003);\n DIR:OUT; SFP:1102;", "x-ms-exchange-antispam-messagedata-chunkcount": "1", "x-ms-exchange-antispam-messagedata-0": "=?iso-8859-1?q?IsW90doKFs258L48TZ6v1nk?=\n\t=?iso-8859-1?q?nF0wB6QVBlvRPxxAweVE5VMf+TxRL3d3tzHSgeaHISKr419cNSn/IcAd3Lr6?=\n\t=?iso-8859-1?q?qqATdvowvmbBP/u8xDDZ604wl8P0eWqgewxU3p5/MTdXBpsRapnxAc/uZFb5?=\n\t=?iso-8859-1?q?mjrRJIQmTDxO6EpOIbLAcXmUypH+uuKkk9ZRpDA76IhvQ9JZuDjWAFsbARCo?=\n\t=?iso-8859-1?q?620BT11O5wmj1y+qsrVbibhO2WrDs+Fdz0SMDHs+PpWhE7WqC0ODnVlHhf/y?=\n\t=?iso-8859-1?q?xn3wCJripclek3ICvj5zJFWgI4S+rGEWAndE5IsXXZXVkDFmt23wBLsV1riK?=\n\t=?iso-8859-1?q?bKMLTwyE07gRJ877RgVjPRQgyJQfMSFTT1V9IzZOZwwkrpOLgxaksmNvYU6e?=\n\t=?iso-8859-1?q?0GER8eGEc6PvM8IIq8C2FS1wJlyLG75mHQ+5sJAQMJUHZpV5yMmp73rENCMB?=\n\t=?iso-8859-1?q?QBeSJ7YcjXFD203DhJ2GADGaeNaCjHbIzNu5Niuv2rDRCaOGPs1l7TVNLdeB?=\n\t=?iso-8859-1?q?tBaP0MQGzTB+d6EjEcO8wEJN/qT/PWSDdtPX1OD/DgeOgBK6vvp9XCGB0LHN?=\n\t=?iso-8859-1?q?mJ7a5NWfjHZYY1Upj4i9g1nTtHofpQDlwc/H0f6R7OPWH4ON7litRN0Y8O4d?=\n\t=?iso-8859-1?q?VNvogPk7LNC4JNOLMlnUb5OyQVZqpF9xljvzs/DBUq4p9J2YgXqgP8f5aLBV?=\n\t=?iso-8859-1?q?7rNDvJX8Tl5Ftn0+Y8k3p4aCfhThaSLN30Na6eNeMy0T8W/9KYzFZXgSOiN3?=\n\t=?iso-8859-1?q?dsHOkgfjX7LeWTl/3ASzZL9XfTANrgyZATnMusTvFxzyf1MWYHHeCGnELpUk?=\n\t=?iso-8859-1?q?Wvk9/SVdj2X5D3BxB9d49gef9Plvl63CljDVU6tL38f6LnixZ/dpuLtiS5+t?=\n\t=?iso-8859-1?q?ts0zCz4CiUWW6U7bAHrI1ojCtysBxhuxgyEpGp2PAElVBiXq4KVB1xG1+R1l?=\n\t=?iso-8859-1?q?Vf07qUG8zqojRQsWLD7xZ+2qcI05FlzWJbAHEVHYniF1C61DqLfDFf29TFbx?=\n\t=?iso-8859-1?q?lT11/fgsnp/fRt5/x8uikJmSiiLcwi3LifbXfxV2hKD2OQMre8NY3ou8ByUf?=\n\t=?iso-8859-1?q?ltyX7XgFc+bUp5eFVX0HBHhf6SJon/K5MW2GLw7ItB9V0tw9mFf3zrJBOSh3?=\n\t=?iso-8859-1?q?Nx2ros5R/rI/+hd3d6jq5WxJA7XTvA3G+kS0cfbXNO9m5QH3PyirXmnbN9/O?=\n\t=?iso-8859-1?q?Bfdf9hziHe/e8gH9c2R0vWUT226RcxhwBAJgtyXLW1ziE/Hbqe3I25ESwOIS?=\n\t=?iso-8859-1?q?XSiULuHeOQGLlcggjH3pfPxi6x/t9TCDcwvjJrxGUpIotDtdw1xaOwKtov1r?=\n\t=?iso-8859-1?q?MSNvEG8dO8udKeJ9AjokNznlSbyZG8uHiSmXCazUqtMQshcjE0PVigzCn/iA?=\n\t=?iso-8859-1?q?oD6DDOGYomUEc7KJqwfyVX/gfcyYPXp7LdVXljaIjuxU0zyEWp7+M6pFmWbp?=\n\t=?iso-8859-1?q?NNQijnuROQ2BwNYDUczuEWIKjKjZ6ZnxsyKUeNkOTwTebXO+GlpwZrahiLHL?=\n\t=?iso-8859-1?q?PNg/M6oF6Oc/tpyliG3yQjSfSaSQGjsHwCRmt6VFiVgzgRT8KzXNHDK90PwB?=\n\t=?iso-8859-1?q?IDI1ft0lVMJUmXuH/iYaKRM5HDad44znNawb8YhRFNouJNOvHlVoSxaN05TF?=\n\t=?iso-8859-1?q?fDhDR1mf4CSPRPdmIV6nY1dtEYdAMar/By1CO98J09dFaTruW4AUdTcA5RfW?=\n\t=?iso-8859-1?q?TlfVNqCGtLr196IUKDAWLv4GgxugLZYnf/2kAn8t5JT2omkK44D7oak2449e?=\n\t=?iso-8859-1?q?YAXvkiavSgDtYJY4Zhc0OZm3e8Ri2Zq+oFeOW8umBOuV5ug=3D=3D?=", "Content-Type": "text/plain; charset=\"iso-8859-1\"", "Content-Transfer-Encoding": "quoted-printable", "MIME-Version": "1.0", "X-Exchange-RoutingPolicyChecked": "\n f2CJUu6MJhGkzbZs+pbfcTMYCVoIbfP2zyIWxF6Q6kVe+q2TRosGDwTW8SFSYXhNacyXCL1RQBkR8p9j31m61MEj87SL9WHy5hmg3Sd1ngbH/fklQScy7q2T4nm5Y8yIuO9GYv9PGYU+z6yC4yPVStOVkR4Q03pynkG6UASuXN/i5giXF7hyLdR/MKutVw23gTxjdGkjJObejQZxo+5YhcnvfHGaCEq5nGsqVBBdPbXbfS2XRR2MRIJ/nEmKPx+wL0esH7IjYfeDvt4JkcIR0/a1ovgpqgpagsnFdJm2YmVPiS0qIfnDG1cHTqK7QuSrKWorpPRMQwfHhG3IvE8HtQ==", "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 0b961e91-5f90-4423-b050-08dea0f7b923", "X-MS-Exchange-CrossTenant-originalarrivaltime": "23 Apr 2026 05:18:15.6051 (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 mT5P3OyZN6+FHT//hhNRuhciucKbrhrAwLwDNNepOs8YULBfMshNM2Lx3dkAWgEvAWZv3hqYpdyy/Y2F9hdgIOl/3UygPupfwXr5fSZjXNM=", "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "KUXPR06MB8534", "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": "Change internal EHCI descriptor addresses from uint32_t to uint64_t.\n\nThe following fields are updated:\n- EHCIPacket::qtdaddr\n- EHCIQueue::{qhaddr, qtdaddr}\n- EHCIState::{a_fetch_addr, p_fetch_addr}\n\nUpdate get_dwords() and put_dwords() to take 64-bit addresses and\npropagate the type change through the descriptor traversal paths.\n\nAdjust NLPTR_GET() to operate on 64-bit values:\n\n #define NLPTR_GET(x) ((x) & ~0x1fULL)\n\nso that link pointer masking works correctly when descriptor\naddresses exceed 32-bit space. The previous mask (0xffffffe0)\nimplicitly truncated addresses to 32 bits.\n\nThis patch does not change the on-wire descriptor layout yet.\nIt only removes the internal 32-bit address limit and prepares\nfor later patches that will add full 64-bit QH/qTD/iTD/siTD support.\n\nUpdate the EHCI trace-events prototypes for QH, qTD, iTD, and siTD to\nuse uint64_t for the address argument and print it with PRIx64. This\nensures full 64-bit addresses are shown in trace output and improves\ndebugging of queue heads and transfer descriptors.\n\nMigration compatibility:\n\nTo preserve backward migration compatibility, keep the legacy 32-bit\nfetch address fields (a_fetch_addr_32, p_fetch_addr_32) alongside the\nnew 64-bit fields.\n\nMigration format is selected using a machine compat property\n\"x-migrate-fetch-addr-64bit\":\n\n- Old machine types migrate 32-bit fetch addresses\n- New machine types migrate full 64-bit fetch addresses\n\nThis is implemented using VMSTATE_UINT32_TEST() and\nVMSTATE_UINT64_TEST() so that only the appropriate format is migrated.\n\nIn pre_save, the 32-bit shadow fields are populated when migrating\nto old machine types. In post_load, the 32-bit values are restored\ninto the 64-bit fields when loading old migration streams.\n\nNo functional change.\n\nSigned-off-by: Jamin Lin <jamin_lin@aspeedtech.com>\nReviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>\n---\n hw/usb/hcd-ehci.h | 17 +++++++----\n hw/core/machine.c | 2 ++\n hw/usb/hcd-ehci.c | 72 ++++++++++++++++++++++++++++++++-------------\n hw/usb/trace-events | 24 +++++++--------\n 4 files changed, 76 insertions(+), 39 deletions(-)", "diff": "diff --git a/hw/usb/hcd-ehci.h b/hw/usb/hcd-ehci.h\nindex d038ee1e31..3acbddfc5c 100644\n--- a/hw/usb/hcd-ehci.h\n+++ b/hw/usb/hcd-ehci.h\n@@ -208,7 +208,7 @@ struct EHCIPacket {\n QTAILQ_ENTRY(EHCIPacket) next;\n \n EHCIqtd qtd; /* copy of current QTD (being worked on) */\n- uint32_t qtdaddr; /* address QTD read from */\n+ uint64_t qtdaddr; /* address QTD read from */\n \n USBPacket packet;\n QEMUSGList sgl;\n@@ -229,8 +229,8 @@ struct EHCIQueue {\n * when guest removes an entry (doorbell, handshake sequence)\n */\n EHCIqh qh; /* copy of current QH (being worked on) */\n- uint32_t qhaddr; /* address QH read from */\n- uint32_t qtdaddr; /* address QTD read from */\n+ uint64_t qhaddr; /* address QH read from */\n+ uint64_t qtdaddr; /* address QTD read from */\n int last_pid; /* pid of last packet executed */\n USBDevice *dev;\n QTAILQ_HEAD(, EHCIPacket) packets;\n@@ -256,6 +256,7 @@ struct EHCIState {\n \n /* properties */\n uint32_t maxframes;\n+ bool migrate_fetch_addr_64bit;\n \n /*\n * EHCI spec version 1.0 Section 2.3\n@@ -294,8 +295,10 @@ struct EHCIState {\n EHCIQueueHead pqueues;\n \n /* which address to look at next */\n- uint32_t a_fetch_addr;\n- uint32_t p_fetch_addr;\n+ uint32_t a_fetch_addr_32;\n+ uint32_t p_fetch_addr_32;\n+ uint64_t a_fetch_addr;\n+ uint64_t p_fetch_addr;\n \n USBPacket ipacket;\n QEMUSGList isgl;\n@@ -308,7 +311,9 @@ struct EHCIState {\n };\n \n #define DEFINE_EHCI_COMMON_PROPERTIES(_state) \\\n- DEFINE_PROP_UINT32(\"maxframes\", _state, ehci.maxframes, 128)\n+ DEFINE_PROP_UINT32(\"maxframes\", _state, ehci.maxframes, 128), \\\n+ DEFINE_PROP_BOOL(\"x-migrate-fetch-addr-64bit\", _state, \\\n+ ehci.migrate_fetch_addr_64bit, true)\n \n extern const VMStateDescription vmstate_ehci;\n \ndiff --git a/hw/core/machine.c b/hw/core/machine.c\nindex 0aa77a57e9..e77400c7ab 100644\n--- a/hw/core/machine.c\n+++ b/hw/core/machine.c\n@@ -41,6 +41,8 @@\n GlobalProperty hw_compat_10_2[] = {\n { \"scsi-block\", \"migrate-pr\", \"off\" },\n { \"isa-cirrus-vga\", \"global-vmstate\", \"true\" },\n+ { \"sysbus-ehci-usb\", \"x-migrate-fetch-addr-64bit\", \"off\" },\n+ { \"pci-ehci-usb\", \"x-migrate-fetch-addr-64bit\", \"off\" },\n };\n const size_t hw_compat_10_2_len = G_N_ELEMENTS(hw_compat_10_2);\n \ndiff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c\nindex 28a60e4c1a..0c8bdb48ad 100644\n--- a/hw/usb/hcd-ehci.c\n+++ b/hw/usb/hcd-ehci.c\n@@ -72,7 +72,7 @@ typedef enum {\n } EHCI_STATES;\n \n /* macros for accessing fields within next link pointer entry */\n-#define NLPTR_GET(x) ((x) & 0xffffffe0)\n+#define NLPTR_GET(x) ((x) & ~0x1fULL)\n #define NLPTR_TYPE_GET(x) (((x) >> 1) & 3)\n #define NLPTR_TBIT(x) ((x) & 1) /* 1=invalid, 0=valid */\n \n@@ -287,7 +287,7 @@ static int ehci_get_state(EHCIState *s, int async)\n return async ? s->astate : s->pstate;\n }\n \n-static void ehci_set_fetch_addr(EHCIState *s, int async, uint32_t addr)\n+static void ehci_set_fetch_addr(EHCIState *s, int async, uint64_t addr)\n {\n if (async) {\n s->a_fetch_addr = addr;\n@@ -296,7 +296,7 @@ static void ehci_set_fetch_addr(EHCIState *s, int async, uint32_t addr)\n }\n }\n \n-static int ehci_get_fetch_addr(EHCIState *s, int async)\n+static uint64_t ehci_get_fetch_addr(EHCIState *s, int async)\n {\n return async ? s->a_fetch_addr : s->p_fetch_addr;\n }\n@@ -373,7 +373,7 @@ static inline bool ehci_periodic_enabled(EHCIState *s)\n }\n \n /* Get an array of dwords from main memory */\n-static inline int get_dwords(EHCIState *ehci, uint32_t addr,\n+static inline int get_dwords(EHCIState *ehci, uint64_t addr,\n uint32_t *buf, int num)\n {\n int i;\n@@ -395,7 +395,7 @@ static inline int get_dwords(EHCIState *ehci, uint32_t addr,\n }\n \n /* Put an array of dwords in to main memory */\n-static inline int put_dwords(EHCIState *ehci, uint32_t addr,\n+static inline int put_dwords(EHCIState *ehci, uint64_t addr,\n uint32_t *buf, int num)\n {\n int i;\n@@ -549,7 +549,7 @@ static void ehci_free_packet(EHCIPacket *p)\n \n /* queue management */\n \n-static EHCIQueue *ehci_alloc_queue(EHCIState *ehci, uint32_t addr, int async)\n+static EHCIQueue *ehci_alloc_queue(EHCIState *ehci, uint64_t addr, int async)\n {\n EHCIQueueHead *head = async ? &ehci->aqueues : &ehci->pqueues;\n EHCIQueue *q;\n@@ -622,7 +622,7 @@ static void ehci_free_queue(EHCIQueue *q, const char *warn)\n g_free(q);\n }\n \n-static EHCIQueue *ehci_find_queue_by_qh(EHCIState *ehci, uint32_t addr,\n+static EHCIQueue *ehci_find_queue_by_qh(EHCIState *ehci, uint64_t addr,\n int async)\n {\n EHCIQueueHead *head = async ? &ehci->aqueues : &ehci->pqueues;\n@@ -1135,7 +1135,7 @@ static void ehci_flush_qh(EHCIQueue *q)\n {\n uint32_t *qh = (uint32_t *) &q->qh;\n uint32_t dwords = sizeof(EHCIqh) >> 2;\n- uint32_t addr = NLPTR_GET(q->qhaddr);\n+ uint64_t addr = NLPTR_GET(q->qhaddr);\n \n put_dwords(q->ehci, addr + 3 * sizeof(uint32_t), qh + 3, dwords - 3);\n }\n@@ -1406,12 +1406,13 @@ static int ehci_execute(EHCIPacket *p, const char *action)\n /* 4.7.2 */\n static int ehci_process_itd(EHCIState *ehci,\n EHCIitd *itd,\n- uint32_t addr)\n+ uint64_t addr)\n {\n USBDevice *dev;\n USBEndpoint *ep;\n uint32_t i, len, pid, dir, devaddr, endp;\n- uint32_t pg, off, ptr1, ptr2, max, mult;\n+ uint32_t pg, off, max, mult;\n+ uint64_t ptr1, ptr2;\n \n ehci->periodic_sched_active = PERIODIC_ACTIVE;\n \n@@ -1528,7 +1529,7 @@ static int ehci_state_waitlisthead(EHCIState *ehci, int async)\n EHCIqh qh;\n int i = 0;\n int again = 0;\n- uint32_t entry = ehci->asynclistaddr;\n+ uint64_t entry = ehci->asynclistaddr;\n \n /* set reclamation flag at start event (4.8.6) */\n if (async) {\n@@ -1578,7 +1579,7 @@ out:\n static int ehci_state_fetchentry(EHCIState *ehci, int async)\n {\n int again = 0;\n- uint32_t entry = ehci_get_fetch_addr(ehci, async);\n+ uint64_t entry = ehci_get_fetch_addr(ehci, async);\n \n if (NLPTR_TBIT(entry)) {\n ehci_set_state(ehci, async, EST_ACTIVE);\n@@ -1611,7 +1612,7 @@ static int ehci_state_fetchentry(EHCIState *ehci, int async)\n default:\n /* TODO: handle FSTN type */\n qemu_log_mask(LOG_GUEST_ERROR,\n- \"FETCHENTRY: entry at 0x%x is of type %u \"\n+ \"FETCHENTRY: entry at %\" PRIx64 \"is of type %\" PRIu64\n \"which is not supported yet\\n\",\n entry, NLPTR_TYPE_GET(entry));\n return -1;\n@@ -1623,7 +1624,7 @@ out:\n \n static EHCIQueue *ehci_state_fetchqh(EHCIState *ehci, int async)\n {\n- uint32_t entry;\n+ uint64_t entry;\n EHCIQueue *q;\n EHCIqh qh;\n \n@@ -1712,7 +1713,7 @@ out:\n \n static int ehci_state_fetchitd(EHCIState *ehci, int async)\n {\n- uint32_t entry;\n+ uint64_t entry;\n EHCIitd itd;\n \n assert(!async);\n@@ -1738,7 +1739,7 @@ static int ehci_state_fetchitd(EHCIState *ehci, int async)\n \n static int ehci_state_fetchsitd(EHCIState *ehci, int async)\n {\n- uint32_t entry;\n+ uint64_t entry;\n EHCIsitd sitd;\n \n assert(!async);\n@@ -1802,7 +1803,7 @@ static int ehci_state_fetchqtd(EHCIQueue *q)\n EHCIqtd qtd;\n EHCIPacket *p;\n int again = 1;\n- uint32_t addr;\n+ uint64_t addr;\n \n addr = NLPTR_GET(q->qtdaddr);\n if (get_dwords(q->ehci, addr + 8, &qtd.token, 1) < 0) {\n@@ -1885,7 +1886,7 @@ static int ehci_fill_queue(EHCIPacket *p)\n USBEndpoint *ep = p->packet.ep;\n EHCIQueue *q = p->queue;\n EHCIqtd qtd = p->qtd;\n- uint32_t qtdaddr;\n+ uint64_t qtdaddr;\n \n for (;;) {\n if (NLPTR_TBIT(qtd.next) != 0) {\n@@ -2008,7 +2009,8 @@ static int ehci_state_executing(EHCIQueue *q)\n static int ehci_state_writeback(EHCIQueue *q)\n {\n EHCIPacket *p = QTAILQ_FIRST(&q->packets);\n- uint32_t *qtd, addr;\n+ uint32_t *qtd;\n+ uint64_t addr;\n int again = 0;\n \n /* Write back the QTD from the QH area */\n@@ -2414,6 +2416,18 @@ static USBBusOps ehci_bus_ops_standalone = {\n .wakeup_endpoint = ehci_wakeup_endpoint,\n };\n \n+static bool ehci_fetch_addr_64_needed(void *opaque, int version_id)\n+{\n+ EHCIState *s = opaque;\n+\n+ return s->migrate_fetch_addr_64bit;\n+}\n+\n+static bool ehci_fetch_addr_32_needed(void *opaque, int version_id)\n+{\n+ return !ehci_fetch_addr_64_needed(opaque, version_id);\n+}\n+\n static int usb_ehci_pre_save(void *opaque)\n {\n EHCIState *ehci = opaque;\n@@ -2424,6 +2438,11 @@ static int usb_ehci_pre_save(void *opaque)\n ehci->last_run_ns -= (ehci->frindex - new_frindex) * UFRAME_TIMER_NS;\n ehci->frindex = new_frindex;\n \n+ if (!ehci->migrate_fetch_addr_64bit) {\n+ ehci->a_fetch_addr_32 = ehci->a_fetch_addr;\n+ ehci->p_fetch_addr_32 = ehci->p_fetch_addr;\n+ }\n+\n return 0;\n }\n \n@@ -2444,6 +2463,11 @@ static int usb_ehci_post_load(void *opaque, int version_id)\n }\n }\n \n+ if (!s->migrate_fetch_addr_64bit) {\n+ s->a_fetch_addr = s->a_fetch_addr_32;\n+ s->p_fetch_addr = s->p_fetch_addr_32;\n+ }\n+\n return 0;\n }\n \n@@ -2504,8 +2528,14 @@ const VMStateDescription vmstate_ehci = {\n /* schedule state */\n VMSTATE_UINT32(astate, EHCIState),\n VMSTATE_UINT32(pstate, EHCIState),\n- VMSTATE_UINT32(a_fetch_addr, EHCIState),\n- VMSTATE_UINT32(p_fetch_addr, EHCIState),\n+ VMSTATE_UINT32_TEST(a_fetch_addr_32, EHCIState,\n+ ehci_fetch_addr_32_needed),\n+ VMSTATE_UINT32_TEST(p_fetch_addr_32, EHCIState,\n+ ehci_fetch_addr_32_needed),\n+ VMSTATE_UINT64_TEST(a_fetch_addr, EHCIState,\n+ ehci_fetch_addr_64_needed),\n+ VMSTATE_UINT64_TEST(p_fetch_addr, EHCIState,\n+ ehci_fetch_addr_64_needed),\n VMSTATE_END_OF_LIST()\n }\n };\ndiff --git a/hw/usb/trace-events b/hw/usb/trace-events\nindex 0d4318dcf1..8c90688bb3 100644\n--- a/hw/usb/trace-events\n+++ b/hw/usb/trace-events\n@@ -86,15 +86,15 @@ usb_ehci_portsc_write(uint32_t addr, uint32_t port, uint32_t val) \"wr mmio 0x%04\n usb_ehci_portsc_change(uint32_t addr, uint32_t port, uint32_t new, uint32_t old) \"ch mmio 0x%04x [port %d] = 0x%x (old: 0x%x)\"\n usb_ehci_usbsts(const char *sts, int state) \"usbsts %s %d\"\n usb_ehci_state(const char *schedule, const char *state) \"%s schedule %s\"\n-usb_ehci_qh_ptrs(void *q, uint32_t addr, uint32_t nxt, uint32_t c_qtd, uint32_t n_qtd, uint32_t a_qtd) \"q %p - QH @ 0x%08x: next 0x%08x qtds 0x%08x,0x%08x,0x%08x\"\n-usb_ehci_qh_fields(uint32_t addr, int rl, int mplen, int eps, int ep, int devaddr) \"QH @ 0x%08x - rl %d, mplen %d, eps %d, ep %d, dev %d\"\n-usb_ehci_qh_bits(uint32_t addr, int c, int h, int dtc, int i) \"QH @ 0x%08x - c %d, h %d, dtc %d, i %d\"\n+usb_ehci_qh_ptrs(void *q, uint64_t addr, uint32_t nxt, uint32_t c_qtd, uint32_t n_qtd, uint32_t a_qtd) \"q %p - QH @ 0x%\" PRIx64 \": next 0x%08x qtds 0x%08x,0x%08x,0x%08x\"\n+usb_ehci_qh_fields(uint64_t addr, int rl, int mplen, int eps, int ep, int devaddr) \"QH @ 0x%\" PRIx64 \" - rl %d, mplen %d, eps %d, ep %d, dev %d\"\n+usb_ehci_qh_bits(uint64_t addr, int c, int h, int dtc, int i) \"QH @ 0x%\" PRIx64 \" - c %d, h %d, dtc %d, i %d\"\n usb_ehci_qh_tbytes(uint32_t tbytes) \"updating tbytes to %d\"\n-usb_ehci_qtd_ptrs(void *q, uint32_t addr, uint32_t nxt, uint32_t altnext) \"q %p - QTD @ 0x%08x: next 0x%08x altnext 0x%08x\"\n-usb_ehci_qtd_fields(uint32_t addr, int tbytes, int cpage, int cerr, int pid) \"QTD @ 0x%08x - tbytes %d, cpage %d, cerr %d, pid %d\"\n-usb_ehci_qtd_bits(uint32_t addr, int ioc, int active, int halt, int babble, int xacterr) \"QTD @ 0x%08x - ioc %d, active %d, halt %d, babble %d, xacterr %d\"\n-usb_ehci_itd(uint32_t addr, uint32_t nxt, uint32_t mplen, uint32_t mult, uint32_t ep, uint32_t devaddr) \"ITD @ 0x%08x: next 0x%08x - mplen %d, mult %d, ep %d, dev %d\"\n-usb_ehci_sitd(uint32_t addr, uint32_t nxt, uint32_t active) \"ITD @ 0x%08x: next 0x%08x - active %d\"\n+usb_ehci_qtd_ptrs(void *q, uint64_t addr, uint32_t nxt, uint32_t altnext) \"q %p - QTD @ 0x%\" PRIx64 \": next 0x%08x altnext 0x%08x\"\n+usb_ehci_qtd_fields(uint64_t addr, int tbytes, int cpage, int cerr, int pid) \"QTD @ 0x%\" PRIx64 \" - tbytes %d, cpage %d, cerr %d, pid %d\"\n+usb_ehci_qtd_bits(uint64_t addr, int ioc, int active, int halt, int babble, int xacterr) \"QTD @ 0x%\" PRIx64 \" - ioc %d, active %d, halt %d, babble %d, xacterr %d\"\n+usb_ehci_itd(uint64_t addr, uint32_t nxt, uint32_t mplen, uint32_t mult, uint32_t ep, uint32_t devaddr) \"ITD @ 0x%\" PRIx64 \": next 0x%08x - mplen %d, mult %d, ep %d, dev %d\"\n+usb_ehci_sitd(uint64_t addr, uint32_t nxt, uint32_t active) \"SITD @ 0x%\" PRIx64 \": next 0x%08x - active %d\"\n usb_ehci_port_attach(uint32_t port, const char *owner, const char *device) \"attach port #%d, owner %s, device %s\"\n usb_ehci_port_detach(uint32_t port, const char *owner) \"detach port #%d, owner %s\"\n usb_ehci_port_reset(uint32_t port, int enable) \"reset port #%d - %d\"\n@@ -104,15 +104,15 @@ usb_ehci_port_resume(uint32_t port) \"port #%d\"\n usb_ehci_port_disable(uint32_t port) \"port #%d\"\n usb_ehci_queue_action(void *q, const char *action) \"q %p: %s\"\n usb_ehci_packet_action(void *q, void *p, const char *action) \"q %p p %p: %s\"\n-usb_ehci_packet_submit(uint32_t qhaddr, uint32_t next, uint32_t qtdaddr, int pid, size_t len, int endp, int status, int actual_length) \"qh=0x%x, next=0x%x, qtd=0x%x, pid=0x%x, len=%zd, endp=0x%x, status=%d, actual_length=%d\"\n+usb_ehci_packet_submit(uint64_t qhaddr, uint32_t next, uint64_t qtdaddr, int pid, size_t len, int endp, int status, int actual_length) \"qh=0x%\" PRIx64 \", next=0x%x, qtd=0x%\" PRIx64 \", pid=0x%x, len=%zd, endp=0x%x, status=%d, actual_length=%d\"\n usb_ehci_irq(uint32_t level, uint32_t frindex, uint32_t sts, uint32_t mask) \"level %d, frindex 0x%04x, sts 0x%x, mask 0x%x\"\n usb_ehci_guest_bug(const char *reason) \"%s\"\n usb_ehci_doorbell_ring(void) \"\"\n usb_ehci_doorbell_ack(void) \"\"\n usb_ehci_dma_error(void) \"\"\n-usb_ehci_execute_complete(uint32_t qhaddr, uint32_t next, uint32_t qtdaddr, int status, int actual_length) \"qhaddr=0x%x, next=0x%x, qtdaddr=0x%x, status=%d, actual_length=%d\"\n-usb_ehci_fetchqh_reclaim_done(uint32_t qhaddr) \"QH 0x%08x H-bit set, reclamation status reset - done processing\"\n-usb_ehci_fetchqh_dbg(uint32_t qhaddr, uint32_t h, uint32_t halt, uint32_t active, uint32_t next) \"QH 0x%08x (h 0x%x halt 0x%x active 0x%x) next 0x%08x\"\n+usb_ehci_execute_complete(uint64_t qhaddr, uint32_t next, uint64_t qtdaddr, int status, int actual_length) \"qhaddr=0x%\" PRIx64 \", next=0x%x, qtdaddr=0x%\" PRIx64 \", status=%d, actual_length=%d\"\n+usb_ehci_fetchqh_reclaim_done(uint64_t qhaddr) \"QH 0x%\" PRIx64 \" H-bit set, reclamation status reset - done processing\"\n+usb_ehci_fetchqh_dbg(uint64_t qhaddr, uint32_t h, uint32_t halt, uint32_t active, uint32_t next) \"QH 0x%\" PRIx64 \" (h 0x%x halt 0x%x active 0x%x) next 0x%08x\"\n usb_ehci_periodic_state_advance(uint32_t frame, uint32_t list, uint32_t entry) \"frame=%d, list=0x%x, entry=0x%x\"\n usb_ehci_skipped_uframes(uint64_t skipped_uframes) \"skipped %\" PRIu64 \" uframes\"\n usb_ehci_log(const char *msg) \"%s\"\n", "prefixes": [ "v4", "08/17" ] }