get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2230976,
    "url": "http://patchwork.ozlabs.org/api/1.1/patches/2230976/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260430091832.1846637-2-kchiu@axiado.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/1.1/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": ""
    },
    "msgid": "<20260430091832.1846637-2-kchiu@axiado.com>",
    "date": "2026-04-30T09:18:29",
    "name": "[v2,1/4] hw/arm: Add Axiado SoC AX3000",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "e01f6de394ebe8f9f62d16ba0f9ce29a166092b0",
    "submitter": {
        "id": 92340,
        "url": "http://patchwork.ozlabs.org/api/1.1/people/92340/?format=api",
        "name": "Kuan-Jui Chiu",
        "email": "kchiu@axiado.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260430091832.1846637-2-kchiu@axiado.com/mbox/",
    "series": [
        {
            "id": 502248,
            "url": "http://patchwork.ozlabs.org/api/1.1/series/502248/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=502248",
            "date": "2026-04-30T09:18:30",
            "name": "Add Axiado SoC AX3000 and EVK board",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/502248/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2230976/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2230976/checks/",
    "tags": {},
    "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=axiado.com header.i=@axiado.com header.a=rsa-sha256\n header.s=selector1 header.b=q8aumhUE;\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)"
        ],
        "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 4g5pXj3PyTz1yHZ\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 30 Apr 2026 19:19:49 +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 1wINXx-0007Ht-6Y; Thu, 30 Apr 2026 05:19:01 -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 <kchiu@axiado.com>) id 1wINXo-0007Gs-MP\n for qemu-devel@nongnu.org; Thu, 30 Apr 2026 05:18:53 -0400",
            "from mail-westcentralusazlp170100005.outbound.protection.outlook.com\n ([2a01:111:f403:c112::5] helo=CY7PR03CU001.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 <kchiu@axiado.com>) id 1wINXl-0005dE-O2\n for qemu-devel@nongnu.org; Thu, 30 Apr 2026 05:18:52 -0400",
            "from CY8P222CA0024.NAMP222.PROD.OUTLOOK.COM (2603:10b6:930:6b::9) by\n LV3PR18MB6282.namprd18.prod.outlook.com (2603:10b6:408:26d::10) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9870.21; Thu, 30 Apr\n 2026 09:18:42 +0000",
            "from CH1PEPF0000A34A.namprd04.prod.outlook.com\n (2603:10b6:930:6b:cafe::f6) by CY8P222CA0024.outlook.office365.com\n (2603:10b6:930:6b::9) with Microsoft SMTP Server (version=TLS1_3,\n cipher=TLS_AES_256_GCM_SHA384) id 15.20.9870.21 via Frontend Transport; Thu,\n 30 Apr 2026 09:18:42 +0000",
            "from smtp.corp.axiado.com (64.62.143.114) by\n CH1PEPF0000A34A.mail.protection.outlook.com (10.167.244.5) with Microsoft\n SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9846.18\n via Frontend Transport; Thu, 30 Apr 2026 09:18:42 +0000",
            "from axiado.com (vm-swbuild01.axiadoRD [10.4.1.181])\n by smtp.corp.axiado.com (Postfix) with ESMTP id 2B2AE4186B5A;\n Thu, 30 Apr 2026 02:16:49 -0700 (PDT)"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=ynT/drX+TQ17QGfB1J9r0ou56QvBu4r/nujlnl+iAMDQ9piirnBch8TbNhfzQ2u3OHKf8PgYLIF5HYgyjMr38oQ7kHtTfVK/BJ1XrhLcjVUznxPx9ci10vHH9CCAJ9+8G8BaiICdoUl/Yjjwji1SRhHQa5Qpw9QCwHcb05XQ4iXDOPRy4j2zwI6LJXPB1SUr1nrrjjYFxI3iQ9URYAobCkRGQ9U9nwIsYHPQJE8wS4O+/+H1OgJE4I6VtiXxfXnfCqNJFhdY4R1X6AFxU/ufAA58mLqIsnBZWTW5BVdT9BF5934BoHI3I82WoTUBFAlrnQyrlRxQrYLTS3HQP/MdWA==",
        "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=1z3L37m0lQ2h5Ohrva4ApyLn8+Bi7/AfdBhZfEs3G9E=;\n b=zQVI8uOdWmg5YmtW3F+RdQO3rpsnPWz5LEDY1DQ1kMfcMxXENTXDQ2HdkRDhOtYh6tNn/RnksjURhR55TyA5WwsXOyKTrXu9f5V4tu6eUUG3ZyBib3pXCv5lw35WvxrZZgQEHC7EJkFmWFxY0wn9FKLjUxcqwldVCs64bso7gx8D/Au4EpvxOWfMCWbiqSZEEsy3TrSSsBHDqiHqi8/2RRSgxrxnpxMJFjFDlEqdkCgF8KvtvFMZmY90Jc/0OtrPf8aPlA9nWwLQ4sA2JYCW8FvxRqF2TMxojxA5UlDofh5XDSApJHazDv/feikbRsqPHY4jk0sEDvCS7PQRXccuCw==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=fail (sender ip is\n 64.62.143.114) smtp.rcpttodomain=axiado.com smtp.mailfrom=axiado.com;\n dmarc=none action=none header.from=axiado.com; dkim=none (message not\n signed); arc=none (0)",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=axiado.com;\n s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=1z3L37m0lQ2h5Ohrva4ApyLn8+Bi7/AfdBhZfEs3G9E=;\n b=q8aumhUEqe1ftD45teqQB3dPclSXgUE+VrLWiNT3yh6ffskZED4bsSCkAvKOUNNCKfJxO1b4R5BNRdrmg4rQB9MSwqxgH7yJtOUbqfc11GoGMzRVtRqo/m5+fmFhXQIeFSrq/ZFwrNGV/aKDspHtIPrUd3TYo23Pc6ahC3UumoyTq0wGzOFkBA0xlUHDULS7vlveRzNXLzHBTIguJoyAy0zoRgTP25yHnLfC+CAKJkrJFwl0+mDGQrWBaC/rKcOXBvho0TBlVmMi5fuhfzrDiR+6ZrL3bOt95LT/dXhpobDCwQLkfohzLUwBPxK6lkEkq1zmPaf0xskQvWngCwRMBA==",
        "X-MS-Exchange-Authentication-Results": "spf=fail (sender IP is 64.62.143.114)\n smtp.mailfrom=axiado.com; dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=axiado.com;",
        "Received-SPF": [
            "Fail (protection.outlook.com: domain of axiado.com does not\n designate 64.62.143.114 as permitted sender) receiver=protection.outlook.com;\n client-ip=64.62.143.114; helo=smtp.corp.axiado.com;",
            "pass client-ip=2a01:111:f403:c112::5;\n envelope-from=kchiu@axiado.com;\n helo=CY7PR03CU001.outbound.protection.outlook.com"
        ],
        "From": "Kuan-Jui Chiu <kchiu@axiado.com>",
        "To": "qemu-devel@nongnu.org",
        "Cc": "Kuan-Jui Chiu <kchiu@axiado.com>",
        "Subject": "[PATCH v2 1/4] hw/arm: Add Axiado SoC AX3000",
        "Date": "Thu, 30 Apr 2026 02:18:29 -0700",
        "Message-Id": "<20260430091832.1846637-2-kchiu@axiado.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20260430091832.1846637-1-kchiu@axiado.com>",
        "References": "<20260430091832.1846637-1-kchiu@axiado.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-EOPAttributedMessage": "0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "CH1PEPF0000A34A:EE_|LV3PR18MB6282:EE_",
        "Content-Type": "text/plain",
        "X-MS-Office365-Filtering-Correlation-Id": "bad112fc-0198-4d03-521c-08dea69978e7",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;\n ARA:13230040|34020700016|82310400026|376014|36860700016|1800799024|18002099003|22082099003|56012099003;",
        "X-Microsoft-Antispam-Message-Info": "\n IEy+f09DF2HAXw/jJgI0VBvJmPwbuqb4//i0nI31j5e8iL+7pJ/PerapxcG4qcbqP67Qi5f8bG9xe3Q6tsOVNAwaC29JF4O0EMlzi3dn0nSp+HDwEGcypuMm5S+QB4VfR0RnimNU8N27T0mSgc/GC7E3Ma9nRYGOE6OjEwG5tXTxLHeUHQ+02P59yejcRwuTBP0v5IKPUzwU0g7grIEQu3Q5FpdDSYKWF7CQqu63IYmSEx6pld6dcE0v2mVH57S433J7yUXCAKyhQsqOLZL0/zb3WA2TtB286xV88M4PkWi4WIADSCGbVzuxUKfVHxui7VuJuhT6tbRUt+e3LJzlFbI66zE3z3N50BIV/mH9SiNjYi4VmaXSvBPTdbMb17mDg7J03Wrf3tjFcA7nxDPRfjg9BMUehpZWNpKISQtjWKKdRiCTYQ7hOpJG2ka/d+xmW69Y6AkEMi28pvHEpsNlJTPyl52qGrYePdw48SritM9MVJDOR5iQheMz6VMG9vn/p24DfKf/xc3Hw8BO3g24muiaEX5oybw5iDCxTdEAYyC0bbqvZ2VFYkVd0+mQxghbWLYJUXdVHTqUz7gyr0Qi3Y4varjVvselu7mUa6qcyhs7VmCpDXxcOMHXriMEuwjQ8LOuw46bz6MKzAbcFZ2z5rVvWweGUZffOl+tt8HIq8GHgqPbH/4yVAYNue3zEe5KfZcLwLzzwQ44Pr403UDVDaVRqKCfvx+BUsnORpgDHjjhtoSyQ64InA35HwlYC/XXK0Va1DOEG8mRCJNQwKr+tw==",
        "X-Forefront-Antispam-Report": "CIP:64.62.143.114; CTRY:US; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:smtp.corp.axiado.com; PTR:InfoDomainNonexistent;\n CAT:NONE;\n SFS:(13230040)(34020700016)(82310400026)(376014)(36860700016)(1800799024)(18002099003)(22082099003)(56012099003);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n XcC/6YaPhO1xXMp2dVFfxpJSYrRvgrgNYuvR3N03Vsl2u5VlGCBPWVtWLAbWEruCPGPcrtFcqF4ZVGCz0We08If1guvVGBcrwQ8I+sMvVXWUxtL4Dt53/nupbzjVqX4CPqHqbLhE1Cu8zrjiOLPygf5OwTfTPl0xUOSAgo9xLYiATSC0M3Q4HpB8X6Az26Q9wKOWh+RVAk9pcPwYumxtg/gwLWSRqdfXgmM1bVdffdNFgUPvW8OvCa2JkT3QKgvMsQyLxCxSkY21MmJcs3QdKx5wt72VRejYaBezSMo1M+0lrg0FLjnrNwhwSG2r1IvMdeVs2FCulMNY1O3O17fvar665DTq6CLyaXsv/wdNGftnGsKAV6c6Y8+30p418dz8QpP554cQj/vV7sSeGFYYzMWONs6qjL5if/Xl7AXEmRdJJTDy1MVckQysuF1opa6b",
        "X-OriginatorOrg": "axiado.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "30 Apr 2026 09:18:42.0422 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n bad112fc-0198-4d03-521c-08dea69978e7",
        "X-MS-Exchange-CrossTenant-Id": "ff2db17c-4338-408e-9036-2dee8e3e17d7",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=ff2db17c-4338-408e-9036-2dee8e3e17d7; Ip=[64.62.143.114];\n Helo=[smtp.corp.axiado.com]",
        "X-MS-Exchange-CrossTenant-AuthSource": "\n CH1PEPF0000A34A.namprd04.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "LV3PR18MB6282",
        "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,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_PASS=-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": "This patch adds new model for Axiado SoC AX3000 which supports\n    4 Cortex-A53 ARM64 CPUs\n    Arm Generic Interrupt Controller v3\n    4 Cadence UARTs\n    1 SDHCI controller with eMMC PHY\n\nSigned-off-by: Kuan-Jui Chiu <kchiu@axiado.com>\n---\n MAINTAINERS                  |   9 ++\n hw/arm/Kconfig               |   8 ++\n hw/arm/ax3000-soc.c          | 232 +++++++++++++++++++++++++++++++++++\n hw/arm/meson.build           |   3 +\n hw/sd/Kconfig                |   4 +\n hw/sd/axiado_sdhci.c         | 100 +++++++++++++++\n hw/sd/meson.build            |   1 +\n include/hw/arm/ax3000-soc.h  |  78 ++++++++++++\n include/hw/sd/axiado_sdhci.h |  21 ++++\n 9 files changed, 456 insertions(+)\n create mode 100644 hw/arm/ax3000-soc.c\n create mode 100644 hw/sd/axiado_sdhci.c\n create mode 100644 include/hw/arm/ax3000-soc.h\n create mode 100644 include/hw/sd/axiado_sdhci.h",
    "diff": "diff --git a/MAINTAINERS b/MAINTAINERS\nindex 0a90204ae9..69da0df99a 100644\n--- a/MAINTAINERS\n+++ b/MAINTAINERS\n@@ -1285,6 +1285,15 @@ M: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>\n S: Maintained\n F: rust/hw/char/pl011/\n \n+Axiado SoCs and EVKs\n+M: Kuan-Jui Chiu <kchiu@axiado.com>\n+L: qemu-arm@nongnu.org\n+S: Maintained\n+F: hw/arm/ax3000*.c\n+F: hw/*/axiado*.c\n+F: include/hw/arm/ax3000*.h\n+F: include/hw/*/axiado*.h\n+\n AVR Machines\n -------------\n \ndiff --git a/hw/arm/Kconfig b/hw/arm/Kconfig\nindex 4e50fb1111..4fb23122fd 100644\n--- a/hw/arm/Kconfig\n+++ b/hw/arm/Kconfig\n@@ -691,3 +691,11 @@ config ARMSSE\n     select UNIMP\n     select SSE_COUNTER\n     select SSE_TIMER\n+\n+config AXIADO_SOC\n+    bool\n+    depends on ARM\n+    select ARM_GIC\n+    select CADENCE # UART\n+    select AXIADO_SDHCI\n+    select UNIMP\ndiff --git a/hw/arm/ax3000-soc.c b/hw/arm/ax3000-soc.c\nnew file mode 100644\nindex 0000000000..e845a64c2a\n--- /dev/null\n+++ b/hw/arm/ax3000-soc.c\n@@ -0,0 +1,232 @@\n+/*\n+ * Axiado SoC AX3000\n+ *\n+ * Author: Kuan-Jui Chiu <kchiu@axiado.com>\n+ *\n+ * SPDX-License-Identifier: GPL-2.0-or-later\n+ */\n+\n+#include \"qemu/osdep.h\"\n+#include \"system/address-spaces.h\"\n+#include \"hw/arm/bsa.h\"\n+#include \"hw/arm/ax3000-soc.h\"\n+#include \"hw/misc/unimp.h\"\n+#include \"system/system.h\"\n+#include \"qobject/qlist.h\"\n+#include \"qom/object.h\"\n+#include \"hw/core/boards.h\"\n+\n+static uint64_t pll_read(void *opaque, hwaddr offset, unsigned size)\n+{\n+    switch (offset) {\n+    case CLKRST_CPU_PLL_POSTDIV_OFFSET:\n+        return 0x20891b;\n+    case CLKRST_CPU_PLL_STS_OFFSET:\n+        return 0x01;\n+    default:\n+        return 0x00;\n+    }\n+}\n+\n+static void pll_write(void *opaque, hwaddr offset, uint64_t val, unsigned size)\n+{\n+    /* TBD */\n+}\n+\n+static const MemoryRegionOps pll_ops = {\n+    .read = pll_read,\n+    .write = pll_write,\n+    .endianness = DEVICE_LITTLE_ENDIAN,\n+};\n+\n+static void ax3000_init(Object *obj)\n+{\n+    Ax3000SoCState *s = AX3000_SOC(obj);\n+    Ax3000SoCClass *sc = AX3000_SOC_GET_CLASS(s);\n+    int i;\n+\n+    for (i = 0; i < sc->num_cpus; i++) {\n+        g_autofree char *name = g_strdup_printf(\"cpu%d\", i);\n+        object_initialize_child(obj, name, &s->cpu[i],\n+                                ARM_CPU_TYPE_NAME(\"cortex-a53\"));\n+    }\n+\n+    object_initialize_child(obj, \"gic\", &s->gic, gicv3_class_name());\n+\n+    for (i = 0; i < AX3000_NUM_UARTS; i++) {\n+        g_autofree char *name = g_strdup_printf(\"uart%d\", i);\n+        object_initialize_child(obj, name, &s->uart[i], TYPE_CADENCE_UART);\n+    }\n+\n+    object_initialize_child(obj, \"sdhci0\", &s->sdhci0, TYPE_AXIADO_SDHCI);\n+}\n+\n+static void ax3000_realize(DeviceState *dev, Error **errp)\n+{\n+    Ax3000SoCState *s = AX3000_SOC(dev);\n+    Ax3000SoCClass *sc = AX3000_SOC_GET_CLASS(s);\n+    SysBusDevice *gic_sbd = SYS_BUS_DEVICE(&s->gic);\n+    DeviceState *gic_dev = DEVICE(&s->gic);\n+    QList *redist_region_count;\n+    SysBusDevice *sdhci0_sbd;\n+    DeviceState *card;\n+    int i;\n+\n+    /* CPUs */\n+    for (i = 0; i < sc->num_cpus; i++) {\n+        object_property_set_int(OBJECT(&s->cpu[i]), \"cntfrq\", 8000000,\n+                                &error_abort);\n+\n+        if (object_property_find(OBJECT(&s->cpu[i]), \"has_el3\")) {\n+            object_property_set_bool(OBJECT(&s->cpu[i]), \"has_el3\",\n+                                     false, &error_abort);\n+        }\n+\n+        if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {\n+            return;\n+        }\n+    }\n+\n+    /* GIC */\n+    qdev_prop_set_uint32(gic_dev, \"num-cpu\", sc->num_cpus);\n+    qdev_prop_set_uint32(gic_dev, \"num-irq\",\n+                         AX3000_NUM_IRQS + GIC_INTERNAL);\n+\n+    redist_region_count = qlist_new();\n+    qlist_append_int(redist_region_count, sc->num_cpus);\n+    qdev_prop_set_array(gic_dev, \"redist-region-count\", redist_region_count);\n+\n+    if (!sysbus_realize(gic_sbd, errp)) {\n+        return;\n+    }\n+\n+    sysbus_mmio_map(gic_sbd, 0, AX3000_GIC_DIST_BASE);\n+    sysbus_mmio_map(gic_sbd, 1, AX3000_GIC_REDIST_BASE);\n+\n+    /*\n+     * Wire the outputs from each CPU's generic timer and the GICv3\n+     * maintenance interrupt signal to the appropriate GIC PPI inputs, and\n+     * the GIC's IRQ/FIQ interrupt outputs to the CPU's inputs.\n+     */\n+    for (i = 0; i < sc->num_cpus; i++) {\n+        DeviceState *cpu_dev = DEVICE(&s->cpu[i]);\n+        int intidbase = AX3000_NUM_IRQS + i * GIC_INTERNAL;\n+        qemu_irq irq;\n+\n+        /*\n+         * Mapping from the output timer irq lines from the CPU to the\n+         * GIC PPI inputs.\n+         */\n+        static const int timer_irqs[] = {\n+            [GTIMER_PHYS] = ARCH_TIMER_NS_EL1_IRQ,\n+            [GTIMER_VIRT] = ARCH_TIMER_VIRT_IRQ,\n+            [GTIMER_HYP]  = ARCH_TIMER_NS_EL2_IRQ,\n+            [GTIMER_SEC]  = ARCH_TIMER_S_EL1_IRQ\n+        };\n+\n+        for (int j = 0; j < ARRAY_SIZE(timer_irqs); j++) {\n+            irq = qdev_get_gpio_in(gic_dev, intidbase + timer_irqs[j]);\n+            qdev_connect_gpio_out(cpu_dev, j, irq);\n+        }\n+\n+        irq = qdev_get_gpio_in(gic_dev, intidbase + ARCH_GIC_MAINT_IRQ);\n+        qdev_connect_gpio_out_named(cpu_dev, \"gicv3-maintenance-interrupt\",\n+                                        0, irq);\n+\n+        sysbus_connect_irq(gic_sbd, i,\n+                           qdev_get_gpio_in(cpu_dev, ARM_CPU_IRQ));\n+        sysbus_connect_irq(gic_sbd, i + sc->num_cpus,\n+                           qdev_get_gpio_in(cpu_dev, ARM_CPU_FIQ));\n+        sysbus_connect_irq(gic_sbd, i + 2 * sc->num_cpus,\n+                           qdev_get_gpio_in(cpu_dev, ARM_CPU_VIRQ));\n+        sysbus_connect_irq(gic_sbd, i + 3 * sc->num_cpus,\n+                           qdev_get_gpio_in(cpu_dev, ARM_CPU_VFIQ));\n+    }\n+\n+    /* DRAM */\n+    for (i = 0; i < AX3000_NUM_BANKS; i++) {\n+        struct {\n+            hwaddr addr;\n+            size_t size;\n+            const char *name;\n+        } dram_table[] = {\n+            { AX3000_DRAM0_BASE, AX3000_DRAM0_SIZE, \"dram0\" },\n+            { AX3000_DRAM1_BASE, AX3000_DRAM1_SIZE, \"dram1\" }\n+        };\n+\n+        memory_region_init_ram(&s->dram[i], OBJECT(s), dram_table[i].name,\n+                               dram_table[i].size, &error_fatal);\n+        memory_region_add_subregion(get_system_memory(), dram_table[i].addr,\n+                                    &s->dram[i]);\n+    }\n+\n+    /* UARTs */\n+    for (i = 0; i < AX3000_NUM_UARTS; i++) {\n+        struct {\n+            hwaddr addr;\n+            unsigned int irq;\n+        } serial_table[] = {\n+            { AX3000_UART0_BASE, AX3000_UART0_IRQ },\n+            { AX3000_UART1_BASE, AX3000_UART1_IRQ },\n+            { AX3000_UART2_BASE, AX3000_UART2_IRQ },\n+            { AX3000_UART3_BASE, AX3000_UART3_IRQ }\n+        };\n+\n+        qdev_prop_set_chr(DEVICE(&s->uart[i]), \"chardev\", serial_hd(i));\n+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {\n+            return;\n+        }\n+\n+        sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart[i]), 0, serial_table[i].addr);\n+        sysbus_connect_irq(SYS_BUS_DEVICE(&s->uart[i]), 0,\n+                           qdev_get_gpio_in(gic_dev, serial_table[i].irq));\n+    }\n+\n+    /* Timer control */\n+    create_unimplemented_device(\"ax3000.timerctrl\", AX3000_TIMER_CTRL, 32);\n+\n+    /* PLL control */\n+    memory_region_init_io(&s->pll_ctrl, OBJECT(s), &pll_ops, s,\n+                          \"ax3000.pllctrl\", 32);\n+    memory_region_add_subregion(get_system_memory(), AX3000_PLL_BASE,\n+                                &s->pll_ctrl);\n+\n+    /* SDHCI */\n+    sdhci0_sbd = SYS_BUS_DEVICE(&s->sdhci0);\n+    if (!sysbus_realize(sdhci0_sbd, errp)) {\n+        return;\n+    }\n+\n+    sysbus_mmio_map(sdhci0_sbd, 0, AX3000_SDHCI0_BASE);\n+    sysbus_mmio_map(sdhci0_sbd, 1, AX3000_EMMC_PHY_BASE);\n+    sysbus_connect_irq(sdhci0_sbd, 0,\n+                       qdev_get_gpio_in(gic_dev, AX3000_SDHCI0_IRQ));\n+\n+    card = qdev_new(TYPE_SD_CARD);\n+    qdev_prop_set_drive_err(card, \"drive\",\n+                            blk_by_legacy_dinfo((drive_get(IF_SD, 0, 0))),\n+                            &error_fatal);\n+    qdev_realize_and_unref(card, s->sdhci0.sd_bus, &error_fatal);\n+}\n+\n+static void ax3000_class_init(ObjectClass *oc, const void *data)\n+{\n+    DeviceClass *dc = DEVICE_CLASS(oc);\n+    Ax3000SoCClass *sc = AX3000_SOC_CLASS(oc);\n+\n+    dc->desc = \"Axiado SoC AX3000\";\n+    dc->realize = ax3000_realize;\n+    sc->num_cpus = AX3000_NUM_CPUS;\n+}\n+\n+static const TypeInfo axiado_soc_types[] = {\n+    {\n+        .name           = TYPE_AX3000_SOC,\n+        .parent         = TYPE_SYS_BUS_DEVICE,\n+        .instance_size  = sizeof(Ax3000SoCState),\n+        .instance_init  = ax3000_init,\n+        .class_init     = ax3000_class_init,\n+    }\n+};\n+\n+DEFINE_TYPES(axiado_soc_types)\ndiff --git a/hw/arm/meson.build b/hw/arm/meson.build\nindex b187b946f0..e32f5eb0c7 100644\n--- a/hw/arm/meson.build\n+++ b/hw/arm/meson.build\n@@ -105,6 +105,9 @@ arm_common_ss.add(when: 'CONFIG_SX1', if_true: files('omap_sx1.c'))\n arm_common_ss.add(when: 'CONFIG_VERSATILE', if_true: files('versatilepb.c'))\n arm_common_ss.add(when: 'CONFIG_VEXPRESS', if_true: files('vexpress.c'))\n \n+arm_common_ss.add(when: ['CONFIG_AXIADO_SOC', 'TARGET_AARCH64'], if_true: files(\n+  'ax3000-soc.c'))\n+\n arm_common_ss.add(files('boot.c'))\n \n hw_arch += {'arm': arm_ss}\ndiff --git a/hw/sd/Kconfig b/hw/sd/Kconfig\nindex 633b9afec9..c69bf24f8d 100644\n--- a/hw/sd/Kconfig\n+++ b/hw/sd/Kconfig\n@@ -23,3 +23,7 @@ config SDHCI_PCI\n config CADENCE_SDHCI\n     bool\n     select SDHCI\n+\n+config AXIADO_SDHCI\n+    bool\n+    select SDHCI\ndiff --git a/hw/sd/axiado_sdhci.c b/hw/sd/axiado_sdhci.c\nnew file mode 100644\nindex 0000000000..219d49079e\n--- /dev/null\n+++ b/hw/sd/axiado_sdhci.c\n@@ -0,0 +1,100 @@\n+/*\n+ * Axiado SD Host Controller\n+ *\n+ * Author: Kuan-Jui Chiu <kchiu@axiado.com>\n+ *\n+ * SPDX-License-Identifier: GPL-2.0-or-later\n+ */\n+\n+#include \"qemu/osdep.h\"\n+#include \"hw/sd/axiado_sdhci.h\"\n+#include \"sdhci-internal.h\"\n+#include \"qapi/error.h\"\n+#include \"hw/core/qdev-properties.h\"\n+\n+#define EMMC_PHY_ID     0x00\n+#define EMMC_PHY_STATUS 0x50\n+\n+static uint64_t emmc_phy_read(void *opaque, hwaddr offset, unsigned size)\n+{\n+    uint32_t val = 0x00;\n+\n+    switch (offset) {\n+    case EMMC_PHY_ID:\n+        val = 0x3dff6870;\n+        break;\n+    case EMMC_PHY_STATUS:\n+        /* Make DLL_RDY | CAL_DONE */\n+        val =  (1u << 0) | (1u << 6);\n+        break;\n+    default:\n+        break;\n+    }\n+\n+    return val;\n+}\n+\n+static void emmc_phy_write(void *opaque, hwaddr offset, uint64_t value,\n+                            unsigned size)\n+{\n+    /* TBD */\n+}\n+\n+static const MemoryRegionOps emmc_phy_ops = {\n+    .read = emmc_phy_read,\n+    .write = emmc_phy_write,\n+    .endianness = DEVICE_LITTLE_ENDIAN,\n+};\n+\n+static void axiado_sdhci_realize(DeviceState *dev, Error **errp)\n+{\n+    AxiadoSDHCIState *s = AXIADO_SDHCI(dev);\n+    SysBusDevice *sbd = SYS_BUS_DEVICE(dev);\n+    SysBusDevice *sdhci_sbd;\n+\n+    object_initialize_child(OBJECT(s), \"sdhci\", &s->sdhci,\n+                            TYPE_SYSBUS_SDHCI);\n+\n+    qdev_prop_set_uint64(DEVICE(&s->sdhci), \"capareg\", 0x216737eed0b0);\n+    qdev_prop_set_uint64(DEVICE(&s->sdhci), \"sd-spec-version\", 3);\n+\n+    sdhci_sbd = SYS_BUS_DEVICE(&s->sdhci);\n+    sysbus_realize(sdhci_sbd, errp);\n+    if (*errp) {\n+        return;\n+    }\n+\n+    sysbus_init_mmio(sbd, sysbus_mmio_get_region(sdhci_sbd, 0));\n+\n+    /* Propagate IRQ from SDHCI and SD bus  */\n+    sysbus_pass_irq(sbd, sdhci_sbd);\n+    s->sd_bus = qdev_get_child_bus(DEVICE(sdhci_sbd), \"sd-bus\");\n+\n+    /* Initialize eMMC PHY MMIO */\n+    memory_region_init_io(&s->emmc_phy, OBJECT(s), &emmc_phy_ops, s,\n+                          \"axiado.emmc-phy\", 0x1000);\n+\n+    sysbus_init_mmio(sbd, &s->emmc_phy);\n+}\n+\n+static void axiado_sdhci_class_init(ObjectClass *klass, const void *data)\n+{\n+    DeviceClass *dc = DEVICE_CLASS(klass);\n+\n+    dc->realize = axiado_sdhci_realize;\n+    dc->desc = \"Axiado SD Host Controller with eMMC PHY\";\n+}\n+\n+static const TypeInfo axiado_sdhci_info = {\n+    .name          = TYPE_AXIADO_SDHCI,\n+    .parent        = TYPE_SYS_BUS_DEVICE,\n+    .instance_size = sizeof(AxiadoSDHCIState),\n+    .class_init    = axiado_sdhci_class_init,\n+};\n+\n+static void axiado_sdhci_register_types(void)\n+{\n+    type_register_static(&axiado_sdhci_info);\n+}\n+\n+type_init(axiado_sdhci_register_types);\ndiff --git a/hw/sd/meson.build b/hw/sd/meson.build\nindex b43d45bc56..ebf09e30a4 100644\n--- a/hw/sd/meson.build\n+++ b/hw/sd/meson.build\n@@ -10,3 +10,4 @@ system_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_sdhci.c'))\n system_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-sdhost.c'))\n system_ss.add(when: 'CONFIG_NPCM7XX', if_true: files('npcm7xx_sdhci.c'))\n system_ss.add(when: 'CONFIG_CADENCE_SDHCI', if_true: files('cadence_sdhci.c'))\n+system_ss.add(when: 'CONFIG_AXIADO_SDHCI', if_true: files('axiado_sdhci.c'))\ndiff --git a/include/hw/arm/ax3000-soc.h b/include/hw/arm/ax3000-soc.h\nnew file mode 100644\nindex 0000000000..2708c9c672\n--- /dev/null\n+++ b/include/hw/arm/ax3000-soc.h\n@@ -0,0 +1,78 @@\n+/*\n+ * Axiado SoC AX3000\n+ *\n+ * Author: Kuan-Jui Chiu <kchiu@axiado.com>\n+ *\n+ * SPDX-License-Identifier: GPL-2.0-or-later\n+ */\n+\n+#ifndef AXIADO_AX3000_H\n+#define AXIADO_AX3000_H\n+\n+#include \"cpu.h\"\n+#include \"hw/intc/arm_gicv3_common.h\"\n+#include \"hw/char/cadence_uart.h\"\n+#include \"hw/sd/axiado_sdhci.h\"\n+#include \"hw/core/sysbus.h\"\n+#include \"qemu/units.h\"\n+\n+#define TYPE_AX3000_SOC \"ax3000\"\n+OBJECT_DECLARE_TYPE(Ax3000SoCState, Ax3000SoCClass, AX3000_SOC)\n+\n+#define AX3000_DRAM0_BASE       0x3C000000\n+#define AX3000_DRAM0_SIZE       (1088 * MiB)\n+#define AX3000_DRAM1_BASE       0x400000000\n+#define AX3000_DRAM1_SIZE       (2 * GiB)\n+\n+#define AX3000_GIC_DIST_BASE    0x80300000\n+#define AX3000_GIC_DIST_SIZE    (64 * KiB)\n+#define AX3000_GIC_REDIST_BASE  0x80380000\n+#define AX3000_GIC_REDIST_SIZE  (512 * KiB)\n+\n+#define AX3000_UART0_BASE       0x80520000\n+#define AX3000_UART1_BASE       0x805a0000\n+#define AX3000_UART2_BASE       0x80620000\n+#define AX3000_UART3_BASE       0x80520800\n+\n+#define AX3000_SDHCI0_BASE      0x86000000\n+#define AX3000_EMMC_PHY_BASE    0x80801C00\n+\n+#define AX3000_TIMER_CTRL       0x8A020000\n+#define AX3000_PLL_BASE         0x80000000\n+#define CLKRST_CPU_PLL_POSTDIV_OFFSET   0x0C\n+#define CLKRST_CPU_PLL_STS_OFFSET       0x14\n+\n+enum Ax3000Configuration {\n+    AX3000_NUM_CPUS     = 4,\n+    AX3000_NUM_IRQS     = 224,\n+    AX3000_NUM_BANKS    = 2,\n+    AX3000_NUM_UARTS    = 4,\n+};\n+\n+typedef struct Ax3000SoCState {\n+    SysBusDevice        parent;\n+\n+    ARMCPU              cpu[AX3000_NUM_CPUS];\n+    GICv3State          gic;\n+    MemoryRegion        dram[AX3000_NUM_BANKS];\n+    MemoryRegion        pll_ctrl;\n+    CadenceUARTState    uart[AX3000_NUM_UARTS];\n+    AxiadoSDHCIState    sdhci0;\n+} Ax3000SoCState;\n+\n+typedef struct Ax3000SoCClass {\n+    SysBusDeviceClass   parent;\n+\n+    uint32_t            num_cpus;\n+} Ax3000SoCClass;\n+\n+enum Ax3000Irqs {\n+    AX3000_UART0_IRQ    = 112,\n+    AX3000_UART1_IRQ    = 113,\n+    AX3000_UART2_IRQ    = 114,\n+    AX3000_UART3_IRQ    = 170,\n+\n+    AX3000_SDHCI0_IRQ    = 123,\n+};\n+\n+#endif /* AXIADO_AX3000_H */\ndiff --git a/include/hw/sd/axiado_sdhci.h b/include/hw/sd/axiado_sdhci.h\nnew file mode 100644\nindex 0000000000..85afebad93\n--- /dev/null\n+++ b/include/hw/sd/axiado_sdhci.h\n@@ -0,0 +1,21 @@\n+/*\n+ * Axiado SD Host Controller\n+ *\n+ * Author: Kuan-Jui Chiu <kchiu@axiado.com>\n+ *\n+ * SPDX-License-Identifier: GPL-2.0-or-later\n+ */\n+\n+#include \"hw/sd/sdhci.h\"\n+#include \"qom/object.h\"\n+\n+#define TYPE_AXIADO_SDHCI \"axiado-sdhci\"\n+OBJECT_DECLARE_SIMPLE_TYPE(AxiadoSDHCIState, AXIADO_SDHCI)\n+\n+typedef struct AxiadoSDHCIState {\n+    SysBusDevice parent;\n+\n+    SDHCIState sdhci;\n+    MemoryRegion emmc_phy;\n+    BusState *sd_bus;\n+} AxiadoSDHCIState;\n",
    "prefixes": [
        "v2",
        "1/4"
    ]
}