From nobody Tue Feb 10 17:30:50 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1533178429221993.5577407294805; Wed, 1 Aug 2018 19:53:49 -0700 (PDT) Received: from localhost ([::1]:43693 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fl3kK-00016I-3V for importer@patchew.org; Wed, 01 Aug 2018 22:53:48 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46565) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fl3cp-0003pR-SZ for qemu-devel@nongnu.org; Wed, 01 Aug 2018 22:46:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fl3co-0001Wh-Ip for qemu-devel@nongnu.org; Wed, 01 Aug 2018 22:46:03 -0400 Received: from mail-wr1-x442.google.com ([2a00:1450:4864:20::442]:32893) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fl3co-0001VW-8n for qemu-devel@nongnu.org; Wed, 01 Aug 2018 22:46:02 -0400 Received: by mail-wr1-x442.google.com with SMTP id g6-v6so569532wrp.0 for ; Wed, 01 Aug 2018 19:46:02 -0700 (PDT) Received: from bloodymary.ipads-lab.se.sjtu.edu.cn ([46.243.138.172]) by smtp.gmail.com with ESMTPSA id c124-v6sm396303wma.47.2018.08.01.19.45.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 01 Aug 2018 19:46:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Ns0ncbHoDj2ZAHMl8vtEtKq32xRKOR8HFLSu6yjthOk=; b=KpejuPhgekVPA0Oo4P1xMTzzxCYT2T/eDN6YKo2OKxMR+J2HlnUvsoaU/b+Y09gt/C Eo4XyDvP3LYSuqzxJGiv8nA8IcYekMKodHQkxWdjssqlNxb0kLelmmnrtShI9aGYG/+0 S6Ny7BwQ4W63s/UER9Z4psMkGaTeIQZiXbjhFJjI+teHlV4icDCiic8yZu82RUxA26ro YQuKrTkDlimbOBXbJZd9ES/7nt7ENx8DzF/74ktgTR4S+8Bn/oy7e+kErUu5zDOGtTZ/ Lds+lS6aWv+/jvzDaYt3Bk6SXDnbVJ21PjSZwS+hk5taQTQLm2NyJFkj6Vw6Y3qmO5aa LwAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Ns0ncbHoDj2ZAHMl8vtEtKq32xRKOR8HFLSu6yjthOk=; b=fvMTrj/PimUaK1xwk9Ngej8yW0uaEBMqMpWDAysfdn1NYryEHTAG88kNkARSivVzcK vF/VjMu/R3tS83mHgyLZ16Tx73zAu3R8FhnaUQqjuO/p06yai3gRolyYuNPglkfUu/9W z6dhWVaqovCWdJVbNpCYwFGw87OFo4nx/wFq0P+0ZyNMLUnQu/i1EvdSem8Wi4Y3/yHQ iYX4zAaKqVwPtZJMArUUbxFXh548z7HnlBW4Qo5oEJOad/4Amk2TI9RN6g5OEqaOgP4e S6wEOyEvY9mhghrtwe0UPDT4SzcShTjProrpcP2U6OKRWuNWGnIiC6jmfqDAFRgAsSsn 5kpA== X-Gm-Message-State: AOUpUlGg0sjyn8S41sL++9eXwTefEkDW/Gqk/lZQycjSVF8eYhSQhJRt QoTy3k7vi1Jl4KnhoEqaE5zREWYDzKk= X-Google-Smtp-Source: AAOMgpd3i30aRRfHXoqxQdfctbSLPRzMCxJyGJOtmGksJLqmArVvGRJ3DrW6sraoSwRobT4KFvvlkA== X-Received: by 2002:adf:b786:: with SMTP id s6-v6mr486232wre.247.1533177961087; Wed, 01 Aug 2018 19:46:01 -0700 (PDT) From: Zihan Yang To: qemu-devel@nongnu.org Date: Thu, 2 Aug 2018 10:45:22 +0800 Message-Id: <1533177924-24765-5-git-send-email-whois.zihan.yang@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533177924-24765-1-git-send-email-whois.zihan.yang@gmail.com> References: <1533177924-24765-1-git-send-email-whois.zihan.yang@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::442 Subject: [Qemu-devel] [RFC v3 4/6] pci_expander_bridge: Add config_read callback X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Zihan Yang , "Michael S. Tsirkin" Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This allows SeaBIOS to retrieve MCFG base and size when it initializes pxb host bridges. A backlink to PXBPCIEHost is added in PXBDev to achieve above goal Signed-off-by: Zihan Yang --- hw/pci-bridge/pci_expander_bridge.c | 55 +++++++++++++++++++++++++= ++++ include/hw/pci-bridge/pci_expander_bridge.h | 1 + 2 files changed, 56 insertions(+) diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expand= er_bridge.c index f50938f..cdfdb90 100644 --- a/hw/pci-bridge/pci_expander_bridge.c +++ b/hw/pci-bridge/pci_expander_bridge.c @@ -49,11 +49,18 @@ typedef struct PXBBus { #define PROP_PXB_PCIE_MAX_BUS "max_bus" #define PROP_PXB_NUMA_NODE "numa_node" =20 +typedef struct PXBPCIEHost PXBPCIEHost; +typedef struct PXBDev PXBDev; + typedef struct PXBDev { /*< private >*/ PCIDevice parent_obj; /*< public >*/ =20 + /* backlink to PXBPCIEHost, this makes it easier to get + * mcfg properties in pxb-pcie-host bridge */ + PXBPCIEHost *pxbhost; + uint32_t domain_nr; /* PCI domain number, non-zero means separate doma= in */ uint8_t max_bus; /* max bus number to use(including this one) */ uint8_t bus_nr; @@ -342,9 +349,15 @@ static void pxb_dev_realize_common(PCIDevice *dev, boo= l pcie, Error **errp) if (pcie) { g_assert (pxb->max_bus >=3D pxb->bus_nr); ds =3D qdev_create(NULL, TYPE_PXB_PCIE_HOST); + /* attach it under /machine, so that we can resolve a valid path in + * object_property_set_link below */ + object_property_add_child(qdev_get_machine(), "pxb-pcie-host[*]", = OBJECT(ds), NULL); =20 + /* set link and backlink between PXBPCIEHost and PXBDev */ object_property_set_link(OBJECT(ds), OBJECT(pxb), PROP_PXB_PCIE_DEV, errp); + object_property_set_link(OBJECT(pxb), OBJECT(ds), + PROP_PXB_PCIE_HOST, errp); =20 /* will be overwritten by firmware, but kept for readability */ qdev_prop_set_uint64(ds, PCIE_HOST_MCFG_BASE, @@ -413,6 +426,36 @@ static void pxb_dev_exitfn(PCIDevice *pci_dev) pxb_dev_list =3D g_list_remove(pxb_dev_list, pxb); } =20 +static uint32_t pxb_pcie_config_read(PCIDevice *d, uint32_t address, int l= en) +{ + PXBDev *pxb =3D convert_to_pxb(d); + uint32_t val; + Object *host; + + switch (address) { + case MCH_HOST_BRIDGE_PCIEXBAR: + host =3D object_property_get_link(OBJECT(pxb), PROP_PXB_PCIE_HOST,= NULL); + assert(host); + val =3D object_property_get_uint(host, PCIE_HOST_MCFG_BASE, NULL) = & 0xFFFFFFFF; + break; + case MCH_HOST_BRIDGE_PCIEXBAR + 4: + host =3D object_property_get_link(OBJECT(pxb), PROP_PXB_PCIE_HOST,= NULL); + assert(host); + val =3D (object_property_get_uint(host, PCIE_HOST_MCFG_BASE, NULL)= >> 32) & 0xFFFFFFFF; + break; + case MCH_HOST_BRIDGE_PCIEXBAR + 8: // Fix me! + host =3D object_property_get_link(OBJECT(pxb), PROP_PXB_PCIE_HOST,= NULL); + assert(host); + val =3D object_property_get_uint(host, PCIE_HOST_MCFG_SIZE, NULL) = & 0xFFFFFFFF; + break; + default: + val =3D pci_default_read_config(d, address, len); + break; + } + + return val; +} + static Property pxb_dev_properties[] =3D { /* Note: 0 is not a legal PXB bus number. */ DEFINE_PROP_UINT8(PROP_PXB_BUS_NR, PXBDev, bus_nr, 0), @@ -447,6 +490,16 @@ static void pxb_dev_class_init(ObjectClass *klass, voi= d *data) set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); } =20 +static void pxb_pcie_dev_initfn(Object *obj) +{ + PXBDev *pxb =3D PXB_PCIE_DEV(obj); + + /* Add backlink to pxb-pcie-host */ + object_property_add_link(obj, PROP_PXB_PCIE_HOST, TYPE_PXB_PCIE_HOST, + (Object **)&pxb->pxbhost, + qdev_prop_allow_set_link_before_realize, 0, NULL); +} + static const TypeInfo pxb_dev_info =3D { .name =3D TYPE_PXB_DEVICE, .parent =3D TYPE_PCI_DEVICE, @@ -478,6 +531,7 @@ static void pxb_pcie_dev_class_init(ObjectClass *klass,= void *data) =20 k->realize =3D pxb_pcie_dev_realize; k->exit =3D pxb_dev_exitfn; + k->config_read =3D pxb_pcie_config_read; k->vendor_id =3D PCI_VENDOR_ID_REDHAT; k->device_id =3D PCI_DEVICE_ID_REDHAT_PXB_PCIE; k->class_id =3D PCI_CLASS_BRIDGE_HOST; @@ -492,6 +546,7 @@ static const TypeInfo pxb_pcie_dev_info =3D { .name =3D TYPE_PXB_PCIE_DEVICE, .parent =3D TYPE_PCI_DEVICE, .instance_size =3D sizeof(PXBDev), + .instance_init =3D pxb_pcie_dev_initfn, .class_init =3D pxb_pcie_dev_class_init, .interfaces =3D (InterfaceInfo[]) { { INTERFACE_CONVENTIONAL_PCI_DEVICE }, diff --git a/include/hw/pci-bridge/pci_expander_bridge.h b/include/hw/pci-b= ridge/pci_expander_bridge.h index 870c4cd..1119210 100644 --- a/include/hw/pci-bridge/pci_expander_bridge.h +++ b/include/hw/pci-bridge/pci_expander_bridge.h @@ -2,6 +2,7 @@ #define HW_PCI_EXPANDER_H =20 #define PROP_PXB_PCIE_DEV "pxbdev" +#define PROP_PXB_PCIE_HOST "x-pxb-host" =20 #define PROP_PXB_PCIE_DOMAIN_NR "domain_nr" #define PROP_PXB_BUS_NR "bus_nr" --=20 2.7.4