From nobody Wed Dec 17 17:11:40 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass header.i=@intel.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1681856570; cv=none; d=zohomail.com; s=zohoarc; b=aYPbaH7t34sqGo6dMAeR7faS67nujVOJm3iOscHUGoli7fCGMmYRAbNrC54Pfox2WSrMHzktLTqDG0NWfU+KnEtQB9nVGlVGYhWPt3QbQBLDr/1PJ/BjfWb9EwCy6blo6vPaPx85dHUY0OP3evw9rsEA1aiWe6PnV5ovU+Pwbww= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1681856570; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=LrmRf4SIT/easUl3w4bdzSiXInDOkkYjYgj1ohVagSc=; b=fMxDxjsjy90uA1UylY6viQiAaQKgeaX5gTQVzMcdQDLdgurYLxYjwRYdEC0Lpto8R59LKL1r7BXeE1avjEK6DvMclO8iPoI8UCmDq6bvgicriYjc6V4Q1L9vfesgvPYEmh/PktgQEY1u30oY9wPdDBe3X3Y2Y57Z587P52JLhlA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=@intel.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 168185657054550.048634989833886; Tue, 18 Apr 2023 15:22:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1poti6-0002tY-Ul; Tue, 18 Apr 2023 18:22:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1poti4-0002tB-GW for qemu-devel@nongnu.org; Tue, 18 Apr 2023 18:22:00 -0400 Received: from mga18.intel.com ([134.134.136.126]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1poti0-0004DW-Ji for qemu-devel@nongnu.org; Tue, 18 Apr 2023 18:22:00 -0400 Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Apr 2023 15:21:55 -0700 Received: from djiang5-mobl3.amr.corp.intel.com (HELO [192.168.1.177]) ([10.212.29.141]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Apr 2023 15:21:54 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1681856516; x=1713392516; h=subject:from:to:cc:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=y83SEf3huL2egk1Tk0hLPZdVSqwdxnpe4xWNLb/AoEQ=; b=VRRQ1EE6giKqkGECEKWc6J1Ar0LwTZ5kvuExA7a/pFbSDOUNmisfVtCr KVW3zWJ/FAMTlKyjXKCxtyj1RG5Q4NN82C8jPdx8o+WwMQ2TUplxEN7oj muad7u6ioVasLCtaW9w1jPyoqPYKCA33CodgLISo2hJSZ69CDMKR4Gok8 jbIZEIgpTfB78Fwa8qDsOD1B170lHeCjtG08soKsQnrCx1oLBZ3iuDunV M9rTBcPi1iI5oHLK1fslwyvxbdQEyqgvBh2al2BbVG7W5QqGKKeswpPPH pQuYgY8WIv9plCSoTg/rROCXSsvQBa/cz9x4ZKovUOfH91o/kj/xtnwMX w==; X-IronPort-AV: E=McAfee;i="6600,9927,10684"; a="329472118" X-IronPort-AV: E=Sophos;i="5.99,207,1677571200"; d="scan'208";a="329472118" X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10684"; a="693796525" X-IronPort-AV: E=Sophos;i="5.99,207,1677571200"; d="scan'208";a="693796525" Subject: [RFC PATCH 3/3] acpi: add generic port device object From: Dave Jiang To: qemu-devel@nongnu.org Cc: imammedo@redhat.com, Jonathan.Cameron@huawei.com, ira.weiny@intel.com, mst@redhat.com, bwidawsk@kernel.org Bcc: dave.jiang@intel.com Date: Tue, 18 Apr 2023 15:21:54 -0700 Message-ID: <168185651484.899932.17321694701773193620.stgit@djiang5-mobl3> In-Reply-To: <168185633821.899932.322047053764766056.stgit@djiang5-mobl3> References: <168185633821.899932.322047053764766056.stgit@djiang5-mobl3> User-Agent: StGit/1.5 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=134.134.136.126; envelope-from=dave.jiang@intel.com; helo=mga18.intel.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, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @intel.com) X-ZM-MESSAGEID: 1681856571635100001 Signed-off-by: Dave Jiang --- hw/acpi/genport.c | 61 +++++++++++++++++++++++++++++++++++++++= ++++ hw/acpi/meson.build | 1 + hw/i386/acpi-build.c | 32 ++++++++++++++++++----- include/hw/acpi/aml-build.h | 4 +-- softmmu/vl.c | 26 ++++++++++++++++++ 5 files changed, 115 insertions(+), 9 deletions(-) create mode 100644 hw/acpi/genport.c diff --git a/hw/acpi/genport.c b/hw/acpi/genport.c new file mode 100644 index 000000000000..5738730323c2 --- /dev/null +++ b/hw/acpi/genport.c @@ -0,0 +1,61 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Generic Port device implementation + * + * Copyright (C) 2023 Intel Corporation + */ +#include "qemu/osdep.h" +#include "hw/qdev-properties.h" +#include "qapi/error.h" +#include "qapi/visitor.h" +#include "qom/object_interfaces.h" +#include "hw/qdev-core.h" + +#define TYPE_GENERIC_PORT_DEVICE "genport" + +#define GENPORT_NUMA_NODE_PROP "node" +#define GENPORT_DEV_PROP "genport" + +typedef struct GenericPortDevice { + /* private */ + DeviceState parent_obj; + + /* public */ + uint32_t node; +} GenericPortDevice; + +typedef struct GenericPortDeviceClass { + DeviceClass parent_class; +} GenericPortDeviceClass; + +static Property genport_properties[] =3D { + DEFINE_PROP_UINT32(GENPORT_NUMA_NODE_PROP, GenericPortDevice, node, 0), + DEFINE_PROP_END_OF_LIST(), +}; + +OBJECT_DEFINE_TYPE_WITH_INTERFACES(GenericPortDevice, genport_device, + GENERIC_PORT_DEVICE, DEVICE, + { TYPE_USER_CREATABLE }, + { NULL }) + +static void genport_device_init(Object *obj) +{ +} + +static void genport_device_finalize(Object *obj) +{ +} + +static void genport_device_realize(DeviceState *dev, Error **errp) +{ +} + +static void genport_device_class_init(ObjectClass *oc, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(oc); + + dc->realize =3D genport_device_realize; + dc->desc =3D "Generic Port"; + device_class_set_props(dc, genport_properties); +} + diff --git a/hw/acpi/meson.build b/hw/acpi/meson.build index e0bf39bf4cd6..5247554998b0 100644 --- a/hw/acpi/meson.build +++ b/hw/acpi/meson.build @@ -5,6 +5,7 @@ acpi_ss.add(files( 'bios-linker-loader.c', 'core.c', 'utils.c', + 'genport.c', )) acpi_ss.add(when: 'CONFIG_ACPI_CPU_HOTPLUG', if_true: files('cpu.c', 'cpu_= hotplug.c')) acpi_ss.add(when: 'CONFIG_ACPI_CPU_HOTPLUG', if_false: files('acpi-cpu-hot= plug-stub.c')) diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 0d9e610af12b..db850bfd170d 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -1514,12 +1514,22 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, aml_append(dev, aml_name_decl("_UID", aml_int(bus_num))); aml_append(dev, aml_name_decl("_BBN", aml_int(bus_num))); if (pci_bus_is_cxl(bus)) { - CxlHBDev *hb_entry; + CxlHBDev *hb_entry, *match; + bool found =3D false; struct Aml *pkg =3D aml_package(2); =20 - hb_entry =3D g_malloc0(sizeof(*hb_entry)); - hb_entry->uid =3D bus_num; - QSLIST_INSERT_HEAD(&cxl_hb_list_head, hb_entry, entry); + QSLIST_FOREACH(match, &cxl_hb_list_head, entry) + { + if (match->uid =3D=3D bus_num) { + found =3D true; + break; + } + } + if (!found) { + hb_entry =3D g_malloc0(sizeof(*hb_entry)); + hb_entry->uid =3D bus_num; + QSLIST_INSERT_HEAD(&cxl_hb_list_head, hb_entry, entry); + } =20 aml_append(dev, aml_name_decl("_HID", aml_string("ACPI0016= "))); aml_append(pkg, aml_eisaid("PNP0A08")); @@ -1892,6 +1902,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, Ma= chineState *machine) NULL); AcpiTable table =3D { .sig =3D "SRAT", .rev =3D 1, .oem_id =3D x86ms->= oem_id, .oem_table_id =3D x86ms->oem_table_id }; + int pxm_domain; =20 acpi_table_begin(&table, table_data); build_append_int_noprefix(table_data, 1, 4); /* Reserved */ @@ -1986,16 +1997,23 @@ build_srat(GArray *table_data, BIOSLinker *linker, = MachineState *machine) =20 sgx_epc_build_srat(table_data); =20 + /* FIXME: this is a hack, need a node property for genport */ + pxm_domain =3D 6; QSLIST_FOREACH(hb_entry, &cxl_hb_list_head, entry) { ACPIDeviceHandle handle =3D { .hid =3D "ACPI0016", - .uid =3D hb_entry->uid, + .reserved =3D { 0 }, }; + char uid_str[5]; uint32_t flags =3D GEN_AFFINITY_ENABLED; =20 - build_srat_generic_port_affinity(table_data, 0, nb_numa_nodes, - &handle, flags); + snprintf(uid_str, 4, "%u", hb_entry->uid); + memcpy(handle.uid, uid_str, 4); + + build_srat_generic_port_affinity(table_data, 0, pxm_domain, &handl= e, + flags); + pxm_domain++; } =20 /* diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h index 32a4f574abaa..4ad7f0268f65 100644 --- a/include/hw/acpi/aml-build.h +++ b/include/hw/acpi/aml-build.h @@ -222,8 +222,8 @@ typedef enum { typedef union ACPIDeviceHandle { struct { uint8_t hid[8]; - uint32_t uid; - uint32_t reserved; + uint8_t uid[4]; + uint8_t reserved[4]; }; uint64_t raw[2]; } ACPIDeviceHandle; diff --git a/softmmu/vl.c b/softmmu/vl.c index 459588aa7d14..1ef1d9e5f383 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -2523,6 +2523,31 @@ static void qemu_init_board(void) } } =20 +static int genport_realize_cb(Object *obj, void *opaque) +{ + DeviceState *dev =3D DEVICE(object_dynamic_cast(obj, TYPE_DEVICE)); + ObjectClass *klass =3D object_get_class(obj); + ObjectClass *type_klass =3D object_class_by_name("genport"); + + if (!dev) + return 0; + + if (dev->realized) + return 0; + + if (klass !=3D type_klass) + return 0; + + qdev_realize(dev, NULL, &error_fatal); + return 0; +} + +static void genports_realize(void) +{ + object_child_foreach_recursive(object_get_root(), + genport_realize_cb, NULL); +} + static void qemu_create_cli_devices(void) { DeviceOption *opt; @@ -2557,6 +2582,7 @@ static void qemu_create_cli_devices(void) loc_pop(&opt->loc); } rom_reset_order_override(); + genports_realize(); } =20 static void qemu_machine_creation_done(void)