get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2235165,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/2235165/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260508183717.193630-4-tdave@nvidia.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": "<20260508183717.193630-4-tdave@nvidia.com>",
    "list_archive_url": null,
    "date": "2026-05-08T18:37:12",
    "name": "[RFC,3/8] hw/pci: introduce allocator for fixed BAR placement",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "cfdf28120b6951ef029c7172d4b44745bd72a6c7",
    "submitter": {
        "id": 89928,
        "url": "http://patchwork.ozlabs.org/api/1.2/people/89928/?format=api",
        "name": "Tushar Dave",
        "email": "tdave@nvidia.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260508183717.193630-4-tdave@nvidia.com/mbox/",
    "series": [
        {
            "id": 503429,
            "url": "http://patchwork.ozlabs.org/api/1.2/series/503429/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=503429",
            "date": "2026-05-08T18:37:09",
            "name": "hw/arm/virt, hw/pci: PCI pre-enumeration and fixed BAR allocation",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/503429/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2235165/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2235165/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=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256\n header.s=selector2 header.b=uqoaK8TA;\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=nvidia.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 4gByYr27bHz1yCg\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 09 May 2026 04:38:40 +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 1wLQ5Q-0006hT-QS; Fri, 08 May 2026 14:38:08 -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 <tdave@nvidia.com>)\n id 1wLQ5K-0006fz-WE; Fri, 08 May 2026 14:38:04 -0400",
            "from mail-centralusazlp170100005.outbound.protection.outlook.com\n ([2a01:111:f403:c111::5] helo=DM1PR04CU001.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 <tdave@nvidia.com>)\n id 1wLQ5I-0002Yg-Pp; Fri, 08 May 2026 14:38:02 -0400",
            "from BY5PR12MB4179.namprd12.prod.outlook.com (2603:10b6:a03:211::8)\n by CH3PR12MB8482.namprd12.prod.outlook.com (2603:10b6:610:15b::8)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9891.20; Fri, 8 May\n 2026 18:37:46 +0000",
            "from BY5PR12MB4179.namprd12.prod.outlook.com\n ([fe80::2036:e8b:9b3:f325]) by BY5PR12MB4179.namprd12.prod.outlook.com\n ([fe80::2036:e8b:9b3:f325%4]) with mapi id 15.20.9891.019; Fri, 8 May 2026\n 18:37:46 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=s6vU6OVid0/K/O7U0+6y/Jz67LTbJoC1Jwor5p2QXbWAcrZEgYIo+gV9BZigATZmqnU+NAsScNEwBko8LmynNl1QoqzyvDjte5o7khOI2/4izSMHJ9pDFtUii5phLaENEVIOhygmHZ1exbGzFGjjtvlvMlTcWn7NcYyy39nuFdWW96COZivix1fRMyqpjOeXsbRNcWoFNQpcmYoBL48/eqjjvnOdonKdYKK3C9jPm2hF9QDEsH2FzQZjDPJZkQhylw1Gck+216g5F4TMqqd/yvXCoIcNza+VD1K6+8bEpCwAc/wFlPsNCN/aOtjLLZKrPDrxwDveJyowRvVo7xGlkQ==",
        "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=XqE/IoyY03xAlx51xRPj7NQYnIAcmcFFJKBlXu8boSc=;\n b=MVhntnwdiaAV8ZCA0S4FxH3zK11L9cdCUld/+QDBim2uab9ub86prTXw3Wb5FT5JIqA4VVsFiTnUEEr3UFkqmAgu5wbvMtjYive6oriXyV4L38H83LbGU8PiBivZkq5U8mfqIYd7+k7GVziAugPZSl3GOuWc58nSrguQPj0V/VAuIP1UOZAEFiVKIjGtKyv9j3cy13dOUqX40rAr/YXblLD72mipuh6XPDLXSYUyj0XBSw4qDSIJ/IaKtqvMQK4B7UF4GcPnPTaabc2BysrZmtIz1ES8hRPq6XxG9Rpysxah71/ubhZsgDCVeRWbJmfiwx9zGXgV3guNY0Nry39RDg==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com;\n dkim=pass header.d=nvidia.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com;\n s=selector2;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=XqE/IoyY03xAlx51xRPj7NQYnIAcmcFFJKBlXu8boSc=;\n b=uqoaK8TARKmErb2fLWt1zZkhm9NKtpAF+nuWMVdbJFySR1eRfEUnZGd3jZtcVvY3WmNANXAUJe63bl0rR1hSBBbMAtbN1ab7jJeJ1vHcjKASfJOX4CPrhul4q/8Ksiig/09xlxf/iK8X22fn9hWRHi0uXNwcgrNL0V3COt/UdF6NmWtLs8apSsUO0UZ5hgrzQaHiouwbLMInNhvdv3f6+oQs/6qpTkyaySpczS03HbVl+JPsGF6ggYhss3MSTjLrN2U2T+OEuugzaP+cjHycYuTldpaKe8Ix4wNi/ulmGM5g00hjOZ9f01rqQA959grg0p2tlxt24pcv7A8uUJ3Vww==",
        "From": "Tushar Dave <tdave@nvidia.com>",
        "To": "qemu-devel@nongnu.org",
        "Cc": "alwilliamson@nvidia.com, jgg@nvidia.com, skolothumtho@nvidia.com,\n qemu-arm@nongnu.org, peter.maydell@linaro.org, mst@redhat.com,\n marcel.apfelbaum@gmail.com, devel@edk2.groups.io",
        "Subject": "[RFC PATCH 3/8] hw/pci: introduce allocator for fixed BAR placement",
        "Date": "Fri,  8 May 2026 13:37:12 -0500",
        "Message-Id": "<20260508183717.193630-4-tdave@nvidia.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20260508183717.193630-1-tdave@nvidia.com>",
        "References": "<20260508183717.193630-1-tdave@nvidia.com>",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-ClientProxiedBy": "MN0P221CA0027.NAMP221.PROD.OUTLOOK.COM\n (2603:10b6:208:52a::21) To BY5PR12MB4179.namprd12.prod.outlook.com\n (2603:10b6:a03:211::8)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "BY5PR12MB4179:EE_|CH3PR12MB8482:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "eacdf569-593e-4b94-d89b-08dead30e627",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;\n ARA:13230040|366016|376014|1800799024|18002099003|56012099003|22082099003|3023799003;",
        "X-Microsoft-Antispam-Message-Info": "\n dZ6h6c7jE+Qf1rebWfnieA+8iH2ASY5zo+ZkOVilQWoqaQbDkoY16ldhyuXAPHpvb+HfxWF3KDm3qq4f9mFuVG4zlHKBm7MV6yaYpLYAnJlOjaEKp9tdiE8jM78QDi6jIcZlFaDbeZUcERu4colPgm/th9zXfPRueW8JBRcJRxOY7KRtuh49T2WzVVVXNDB84/9MsF6c93pQx6MgoBbZGmeVRQoCuiwM3qDFe4AsHY0jPx1AE3rG4Oi063zDmlzj0tkwIqCokckeFl8fSkWiwh6fM4L8fB/uhbMAZ5i5jz3pQPWf0q7ansiRre0hfWerftG92leNLhSwzkp5GUDZmqDPUUXAVYHEIULpUYYzrGT+uDlk46QJkSmFDMTKkSC1hSV9mOfIYkqL9m00owruhg5+O58snNGBDzhun7OEuP65c9qmH9WGWOiAwzvDHaewfQawmyOZKpIqSvmncbbTaREx4Q9DSvNDmwmAz/o7XmRYvW0qU6JYma93ExMG3uYDH3AOUvwSHfEILu2N2/Ukz6sKxH3bKnho696qt/OHynrFRHVtWkqJgq79kRhDsSqFLhhafW376G/iiSjRlggS1cjDd7Kk2r3hVZWQlNiqvb2mhtUa8pB4bgGgVIlNqTilTgAl4BJiXUc5o+BrLe8OeZCfcbVKzoOx+6rlqv/ely61E2C4GsSjr2zuTbGCs8A5",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:BY5PR12MB4179.namprd12.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230040)(366016)(376014)(1800799024)(18002099003)(56012099003)(22082099003)(3023799003);\n DIR:OUT; SFP:1101;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "=?utf-8?q?e1HXtdu6wO4GYtTWim3HBA/D6vn0?=\n\t=?utf-8?q?t51PjCREJkaVWTtBXD/4Hnl1HiT6D3mhMR0CyTMHjZnI2VeAE7obkVrHh0pbVcEze?=\n\t=?utf-8?q?yseJ/PZzZzzgZ5l3Qd1AhzZzesnu8jAQCJe5GThznnVuZQ1mppSPRK0OqmOAaZLfi?=\n\t=?utf-8?q?vU3cFOW29C3shfYN7h+eXJzrupYcWHelhKQ9goiYNiyVerJXu3gI9tX9f7F5Hr3GW?=\n\t=?utf-8?q?/nXwRnSsdyVI2vsd79Tu599c5NkTz/cqA9MBfF/utkf1JuE+yEmJKtZBPTscLnP1L?=\n\t=?utf-8?q?SmFf/wMoGsC6q+0lPccMgBT+GLwn7hqSMvthHOHg2JiqpuBsIytDHbZffYIAX2MIU?=\n\t=?utf-8?q?/Dq1baIP7laR/X7HjxLEw1/uakNjlRKVQjIiIg0R/31VXLgbhhZX/ZvSUhOwuyTnP?=\n\t=?utf-8?q?KcFJDDCZWEv8DQ1SiVVixfnxr9b78ObutDNBQ2U+QbTKkfxHb7EpxBtophxsPPybu?=\n\t=?utf-8?q?5FFQRlTF+DNYJLv5Jmk99bmTb9wfKW7bhHQhJOpa6ShCas58Ln1+FgiK8GdCp7/E9?=\n\t=?utf-8?q?va6byEJ5GHAzemAC74EO11bvFqVp4QcdrrGTZKo6MefYc1mrv7hSlSue0DXQgOZK0?=\n\t=?utf-8?q?XCWVM0hskCCTR8/UrR15OGUEdQheZwHcp8gU5qPNkgo0GEtgHyJi1YpFmECWVYXwa?=\n\t=?utf-8?q?wzO9Z6wx6ux78yAZjy9ci6v+0f7y0qKiuNPLPwIS0pfEFjyscyW9y8JxP6Utl5mk+?=\n\t=?utf-8?q?TzpiVJqgufKSCHcsffP5iqqe4mr9uPVeSd6GKY/92Usr735GbC8MwwsLwF2Pf8fCL?=\n\t=?utf-8?q?nlWBntPHe3zbhwYTYDWv6sNzkEnpDIOAcCGMF7rpaywpFGq1zfLE0kaAQ7lwF/obs?=\n\t=?utf-8?q?0ve+HSy7ap9miEz0dRnSs+gUqUeX0c7hTWIm0bNBka/kSuyqCWyiyLaZSe+/cLejN?=\n\t=?utf-8?q?67m465rU0rA2I0BMyCaNmJyY4sUwMg1NjY7gVY2RRXdRVYEufElvL33eLdcqStBic?=\n\t=?utf-8?q?hePXdV85RjtSunE9oZ9MbaU3Oys6TCe+gflM75dz+yrv+nzoY0wmgKFRLs8LtuXWG?=\n\t=?utf-8?q?Qydro27IxuN2zFruZe2VtMqB0Mc/w9PZKNRsnLmdcKL0bYv4MsKvFTQwqSc9hM9Tm?=\n\t=?utf-8?q?f7SqLnJCl8NbLTULXhWIr9fcxv5OIFKlkcsowz+NvYM+S9OSl7H3SggdVpMOgNcgF?=\n\t=?utf-8?q?/tDrP7FtN9E4TypkNe+E6gp/qQgy0vQioF/sBOtEsIYrwrQ1CmKMiJZ6xOwyV//ko?=\n\t=?utf-8?q?Yh3v23tw+VB7hOt+MkogvQ50hD2q1MIBNONAxcgsm4HUAz9ZDp6+le2Cww3VQecTw?=\n\t=?utf-8?q?56q+3gV/ArH0xwzT4yfwSnoB26w7lX5r0l/bLPCENwPVYKGO0u5ISpy3aMsOwEY/C?=\n\t=?utf-8?q?rMbUBEHuV0+dG+1mEdalmq3Vsi6bFffz4LUPJIZqA0Vi7JAiT/TxAnz7GaPkiSPEK?=\n\t=?utf-8?q?60BoXqtG4ih8GThLTc0LUV0/KZznOQGIke1ok9EdMiSFGXkYuEgEdLvQVQ/54W3u6?=\n\t=?utf-8?q?Bo4BA9/d4U5XOdCrtm7p994LvNdVo3zan94QDFi4Q9yDaYGvXruLFzSCOnPv1XVuJ?=\n\t=?utf-8?q?Bbahayn0mj9Dqc/5zB2e2cFlAzNHZce6cKg5VZf8xmzX3XVyA57m7Ofb266XbXVJC?=\n\t=?utf-8?q?49I1OuroFCW+I13M33KagUOsnquVwPZOhhUim0O/lIBu03kgHU1cFtZ69g6942099?=\n\t=?utf-8?q?LKxbY/k2YTCr3vVLQ7H9ddhFLCGA8UIA=3D=3D?=",
        "X-OriginatorOrg": "Nvidia.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n eacdf569-593e-4b94-d89b-08dead30e627",
        "X-MS-Exchange-CrossTenant-AuthSource": "BY5PR12MB4179.namprd12.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "08 May 2026 18:37:46.6434 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "43083d15-7273-40c1-b7db-39efd9ccc17a",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n 5UaUvuHsktB3tELt2jpUicythJuZG0gonqpLi4XP7WTxkc2I5DmvSLzQgQvwpBLBwPSfBXbVjGQiTARhfdbHLQ==",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "CH3PR12MB8482",
        "Received-SPF": "permerror client-ip=2a01:111:f403:c111::5;\n envelope-from=tdave@nvidia.com;\n helo=DM1PR04CU001.outbound.protection.outlook.com",
        "X-Spam_score_int": "-14",
        "X-Spam_score": "-1.5",
        "X-Spam_bar": "-",
        "X-Spam_report": "(-1.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.44,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n FORGED_SPF_HELO=1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_PASS=-0.001,\n SPF_NONE=0.001 autolearn=no 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": "The allocator walks the PCI topology and, for each device with fixed\nBAR requests, validates the BAR (type, size, alignment, and that the\nresulting range fits within the machine-provided MMIO64 window),\ndetects conflicts against already claimed ranges, and programs 64-bit\nprefetchable BARs.\n\nA global list of claimed ranges is maintained to detect overlapping\nallocations across devices. Overlapping fixed BARs within a device are\nalso detected, and any conflict results in an error.\n\nThis patch implements the initial phase of fixed BAR handling and\nreservation tracking. Allocation of remaining resources and bridge\nwindow setup will be added in follow-up patches.\n\nLimitations:\n\nOnly 64-bit prefetchable MMIO BARs within the MMIO64 window are\nhandled. This covers devices that use large prefetchable MMIO regions.\n32-bit MMIO, PIO, and 64-bit non-prefetchable BARs are not supported\nand will be addressed in future work.\n\nSigned-off-by: Tushar Dave <tdave@nvidia.com>\n---\n hw/pci/meson.build    |   1 +\n hw/pci/pci-resource.c | 255 ++++++++++++++++++++++++++++++++++++++++++\n hw/pci/pci-resource.h |  65 +++++++++++\n 3 files changed, 321 insertions(+)\n create mode 100644 hw/pci/pci-resource.c\n create mode 100644 hw/pci/pci-resource.h",
    "diff": "diff --git a/hw/pci/meson.build b/hw/pci/meson.build\nindex 7e8f5bb87d..d26695414f 100644\n--- a/hw/pci/meson.build\n+++ b/hw/pci/meson.build\n@@ -6,6 +6,7 @@ pci_ss.add(files(\n   'pci_bridge.c',\n   'pci_host.c',\n   'pci-enumerate.c',\n+  'pci-resource.c',\n   'pci-hmp-cmds.c',\n   'pci-qmp-cmds.c',\n   'pcie_sriov.c',\ndiff --git a/hw/pci/pci-resource.c b/hw/pci/pci-resource.c\nnew file mode 100644\nindex 0000000000..5e9a78ec16\n--- /dev/null\n+++ b/hw/pci/pci-resource.c\n@@ -0,0 +1,255 @@\n+/*\n+ * Copyright (C) 2026 NVIDIA\n+ * Written by Tushar Dave\n+ *\n+ * SPDX-License-Identifier: GPL-2.0-or-later\n+ */\n+\n+#include \"qemu/osdep.h\"\n+#include \"qemu/error-report.h\"\n+#include \"qemu/range.h\"\n+#include \"hw/pci/pci.h\"\n+#include \"hw/pci/pci_bridge.h\"\n+#include \"hw/pci/pci_bus.h\"\n+#include \"hw/pci/pci_host.h\"\n+#include \"hw/pci/pci-resource.h\"\n+\n+/* Global list of claimed fixed 64-bit prefetchable BAR ranges */\n+static GArray *fixed_claim_regions;\n+\n+static void fixed_claim_regions_reset(void)\n+{\n+    if (fixed_claim_regions) {\n+        g_array_free(fixed_claim_regions, true);\n+        fixed_claim_regions = NULL;\n+    }\n+    fixed_claim_regions = g_array_new(false, true, sizeof(FixedClaim));\n+}\n+\n+static bool fixed_claim_regions_conflicts(uint64_t start, uint64_t end,\n+                                          uint64_t wbase64, uint64_t wlimit64,\n+                                          uint64_t *conflict_end)\n+{\n+    /* Hard guard: out-of-window ranges are invalid input */\n+    if (start < wbase64 || end > wlimit64) {\n+        error_report(\"placement [0x%\"PRIx64\"..0x%\"PRIx64\"] out of window \"\n+                     \"[0x%\"PRIx64\"..0x%\"PRIx64\"]\",\n+                     start, end, wbase64, wlimit64);\n+        exit(1);\n+    }\n+    if (!fixed_claim_regions) {\n+        return false;\n+    }\n+    for (guint i = 0; i < fixed_claim_regions->len; i++) {\n+        FixedClaim *c = &g_array_index(fixed_claim_regions, FixedClaim, i);\n+        if (ranges_overlap(start, end - start + 1, c->start, c->end - c->start + 1)) {\n+            if (conflict_end) {\n+                *conflict_end = c->end;\n+            }\n+            return true;\n+        }\n+    }\n+    return false;\n+}\n+\n+static void fixed_claim_regions_add(uint64_t start, uint64_t end, PCIDevice *dev, int bar)\n+{\n+    FixedClaim cl = { .start = start, .end = end, .owner = dev, .bar = bar };\n+    g_array_append_val(fixed_claim_regions, cl);\n+}\n+\n+static void pci_validate_fixed_bar(PCIDevice *dev, int bar_index,\n+                                   uint64_t addr, uint64_t size,\n+                                   uint64_t wbase64, uint64_t wlimit64)\n+{\n+    PCIIORegion *r = &dev->io_regions[bar_index];\n+    uint64_t end;\n+\n+    if (!r->size || !(r->type & PCI_BASE_ADDRESS_MEM_TYPE_64)) {\n+        error_report(\"Invalid fixed-bars for %s [%02x:%02x.%x] BAR%d: \"\n+                     \"BAR not 64-bit or size=0 (type=0x%x size=0x%\"PRIx64\")\",\n+                     dev->name, pci_dev_bus_num(dev),\n+                     PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn),\n+                     bar_index, r->type, (uint64_t)r->size);\n+        exit(1);\n+    }\n+    /* This path only programs 64-bit prefetchable MMIO in the MMIO64 window. */\n+    if (!(r->type & PCI_BASE_ADDRESS_MEM_PREFETCH) &&\n+        !pci_bus_is_root(pci_get_bus(dev))) {\n+        error_report(\"Invalid fixed-bars for %s [%02x:%02x.%x] BAR%d: \"\n+                     \"this allocator only supports 64-bit prefetchable MMIO; \"\n+                     \"64-bit non-prefetchable is not supported\",\n+                     dev->name, pci_dev_bus_num(dev),\n+                     PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn), bar_index);\n+        exit(1);\n+    }\n+    end = addr + size - 1;\n+    if (addr & (size - 1)) {\n+        error_report(\"Invalid fixed-bars alignment for %s [%02x:%02x.%x] \"\n+                     \"BAR%d: addr=0x%\"PRIx64\" size=0x%\"PRIx64,\n+                     dev->name, pci_dev_bus_num(dev),\n+                     PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn),\n+                     bar_index, addr, size);\n+        exit(1);\n+    }\n+    if (addr < wbase64 || end > wlimit64) {\n+        error_report(\"fixed-bars out of window for %s [%02x:%02x.%x] BAR%d \"\n+                     \"range=[0x%\"PRIx64\"..0x%\"PRIx64\"] window=[0x%\"PRIx64\"..0x%\"PRIx64\"]\",\n+                     dev->name, pci_dev_bus_num(dev),\n+                     PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn),\n+                     bar_index, addr, end, wbase64, wlimit64);\n+        exit(1);\n+    }\n+}\n+\n+static void pci_check_fixed_bar_overlap(PCIDevice *dev, PhysBAR *pbars)\n+{\n+    for (int i = 0; i < PCI_ROM_SLOT; i++) {\n+        if (!(pbars[i].flags & IORESOURCE_PREFETCH)) {\n+            continue;\n+        }\n+        for (int j = i + 1; j < PCI_ROM_SLOT; j++) {\n+            if (!(pbars[j].flags & IORESOURCE_PREFETCH)) {\n+                continue;\n+            }\n+            if (ranges_overlap(pbars[i].addr, dev->io_regions[i].size,\n+                               pbars[j].addr, dev->io_regions[j].size)) {\n+                error_report(\"Invalid fixed-bars — fixed BAR overlap on %s [%02x:%02x.%x]: \"\n+                             \"BAR%d [0x%lx..0x%lx] vs BAR%d [0x%lx..0x%lx]\",\n+                             dev->name, pci_dev_bus_num(dev),\n+                             PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn),\n+                             i, pbars[i].addr, pbars[i].addr + dev->io_regions[i].size - 1,\n+                             j, pbars[j].addr, pbars[j].addr + dev->io_regions[j].size - 1);\n+                exit(1);\n+            }\n+        }\n+    }\n+}\n+\n+/* Program 64-bit prefetchable BARs */\n+static void pci_program_prefetch_bars(PCIDevice *dev, PhysBAR *pbars)\n+{\n+    int idx;\n+    uint32_t laddr;\n+\n+    for (idx = 0; idx < PCI_ROM_SLOT; idx++) {\n+        PhysBAR *pbar = &pbars[idx];\n+\n+        if (!(pbar->flags & IORESOURCE_PREFETCH)) {\n+            continue;\n+        }\n+        laddr = pbar->addr & PCI_BASE_ADDRESS_MEM_MASK;\n+        laddr |= PCI_BASE_ADDRESS_MEM_TYPE_64;\n+        /* Set PREFETCH bit only if the BAR itself is prefetchable */\n+        if (dev->io_regions[idx].type & PCI_BASE_ADDRESS_MEM_PREFETCH) {\n+            laddr |= PCI_BASE_ADDRESS_MEM_PREFETCH;\n+        }\n+\n+        pci_host_config_write_common(dev,\n+                                     PCI_BASE_ADDRESS_0 + (idx * 4),\n+                                     pci_config_size(dev),\n+                                     laddr,\n+                                     4);\n+        pci_host_config_write_common(dev,\n+                                     PCI_BASE_ADDRESS_0 + (idx * 4) + 4,\n+                                     pci_config_size(dev),\n+                                     (uint32_t)(pbar->addr >> 32),\n+                                     4);\n+    }\n+}\n+\n+/* Phase 1: claim and program fixed BARs for one device (per-device callback) */\n+static void pci_dev_claim_and_program_fixed_bars(PCIBus *bus, PCIDevice *dev, void *opaque)\n+{\n+    PciProgramCtx *pctx = (PciProgramCtx *)opaque;\n+    PhysBAR *pbar, pbars[PCI_ROM_SLOT];\n+    bool had_any_fixed = false;\n+    uint64_t start;\n+    uint64_t end;\n+    int idx;\n+\n+    pbar = pbars;\n+    memset(pbar, 0, sizeof(pbars));\n+\n+    if (!dev->fixed_bar_addrs) {\n+        return;\n+    }\n+    for (idx = 0; idx < PCI_ROM_SLOT; idx++) {\n+        PCIIORegion *r = &dev->io_regions[idx];\n+        if (dev->fixed_bar_addrs[idx] == PCI_BAR_UNMAPPED) {\n+            continue;\n+        }\n+        pci_validate_fixed_bar(dev, idx,\n+                                    dev->fixed_bar_addrs[idx],\n+                                    r->size,\n+                                    pctx->mmio64_base,\n+                                    pctx->mmio64_base + pctx->mmio64_size - 1);\n+\n+        start = dev->fixed_bar_addrs[idx];\n+        end = start + r->size - 1;\n+        if (fixed_claim_regions_conflicts(start, end,\n+                                            pctx->mmio64_base,\n+                                            pctx->mmio64_base + pctx->mmio64_size - 1,\n+                                            NULL)) {\n+            error_report(\"Invalid fixed-bars — fixed BAR for %s [%02x:%02x.%x] \"\n+                         \"BAR%d [0x%\"PRIx64\"..0x%\"PRIx64\"] overlaps an existing fixed range\",\n+                         dev->name, pci_dev_bus_num(dev),\n+                         PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn),\n+                         idx, start, end);\n+            exit(1);\n+        }\n+        fixed_claim_regions_add(start, end, dev, idx);\n+        pbars[idx].addr = dev->fixed_bar_addrs[idx];\n+        pbars[idx].end = pbars[idx].addr + r->size - 1;\n+        pbars[idx].flags = IORESOURCE_PREFETCH;\n+        had_any_fixed = true;\n+    }\n+    if (had_any_fixed) {\n+        g_hash_table_insert(pctx->had_fixed, dev, dev);\n+    }\n+    /* Abort if intra-device fixed overlap */\n+    pci_check_fixed_bar_overlap(dev, pbars);\n+    /* Program fixed BARs now */\n+    pci_program_prefetch_bars(dev, pbars);\n+}\n+\n+static void pci_bus_claim_and_program_fixed_bars(PCIBus *bus, void *opaque)\n+{\n+    pci_for_each_device_under_bus(bus, pci_dev_claim_and_program_fixed_bars, opaque);\n+}\n+\n+static void pci_resource_init_from_mmio(PciAllocCfg *pci_res,\n+                                   const PciFixedBarMmioParams *mmio)\n+{\n+    pci_res->mmio32_base = mmio->mmio32_base;\n+    pci_res->mmio32_size = mmio->mmio32_size;\n+    pci_res->mmio64_base = mmio->mmio64_base;\n+    pci_res->mmio64_size = mmio->mmio64_size;\n+}\n+\n+void pci_fixed_bar_allocator(PCIBus *root, const PciFixedBarMmioParams *mmio)\n+{\n+    PciAllocCfg pci_res_buf, *pci_res = &pci_res_buf;\n+    PCIBus *bus = root;\n+\n+    /* Fill allocator MMIO window once from machine memmap */\n+    pci_resource_init_from_mmio(pci_res, mmio);\n+\n+    /* Reset fixed-claims tracking */\n+    fixed_claim_regions_reset();\n+\n+    PciProgramCtx pctx = {\n+        .mmio64_base = pci_res->mmio64_base,\n+        .mmio64_size = pci_res->mmio64_size,\n+        .had_fixed = g_hash_table_new(NULL, NULL),\n+    };\n+\n+    /* Phase 1: program all fixed BARs and claim them */\n+    pci_for_each_bus(bus, pci_bus_claim_and_program_fixed_bars, &pctx);\n+\n+    /* TODOs: Phases 2–3, program remaining BARs, bridge window refresh etc,.  */\n+\n+    /* Cleanup */\n+    g_hash_table_destroy(pctx.had_fixed);\n+    fixed_claim_regions_reset();\n+}\ndiff --git a/hw/pci/pci-resource.h b/hw/pci/pci-resource.h\nnew file mode 100644\nindex 0000000000..cc4d6f71cb\n--- /dev/null\n+++ b/hw/pci/pci-resource.h\n@@ -0,0 +1,65 @@\n+/*\n+ * Copyright (C) 2026 NVIDIA\n+ * Written by Tushar Dave\n+ *\n+ * SPDX-License-Identifier: GPL-2.0-or-later\n+ */\n+\n+#ifndef HW_PCI_PCI_RESOURCE_H\n+#define HW_PCI_PCI_RESOURCE_H\n+\n+#include \"exec/hwaddr.h\"\n+#include \"hw/pci/pci.h\"\n+#include <glib.h>\n+\n+#define IORESOURCE_PREFETCH     0x00002000\n+\n+typedef struct {\n+    uint64_t addr;\n+    uint64_t end;\n+    uint64_t flags;\n+} PhysBAR;\n+\n+typedef struct {\n+    uint64_t wbase;\n+    uint64_t wlimit;\n+    uint64_t wbase64;\n+    uint64_t wlimit64;\n+    uint64_t rbase;\n+    uint64_t rlimit;\n+    uint64_t rsize;\n+    uint64_t piobase;\n+    bool     available;\n+    bool     search_mmio64;\n+    PCIDevice *dev;\n+    PCIBus *bus;\n+    /* Allocator window (filled once from machine memmap) */\n+    hwaddr   mmio32_base;\n+    hwaddr   mmio32_size;\n+    hwaddr   mmio64_base;\n+    hwaddr   mmio64_size;\n+} PciAllocCfg;\n+\n+typedef struct FixedClaim {\n+    uint64_t start;\n+    uint64_t end;\n+    PCIDevice *owner;\n+    int bar;\n+} FixedClaim;\n+\n+typedef struct {\n+    hwaddr mmio64_base;\n+    hwaddr mmio64_size;\n+    GHashTable *had_fixed; /* set of PCIDevice* that had at least one fixed BAR */\n+} PciProgramCtx;\n+\n+typedef struct PciFixedBarMmioParams {\n+    hwaddr mmio32_base;\n+    hwaddr mmio32_size;\n+    hwaddr mmio64_base;\n+    hwaddr mmio64_size;\n+} PciFixedBarMmioParams;\n+\n+void pci_fixed_bar_allocator(PCIBus *root, const PciFixedBarMmioParams *mmio);\n+\n+#endif\n",
    "prefixes": [
        "RFC",
        "3/8"
    ]
}