From nobody Wed Nov 5 08:16:24 2025 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 1533178104501114.40361529226766; Wed, 1 Aug 2018 19:48:24 -0700 (PDT) Received: from localhost ([::1]:43667 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fl3f1-0004st-HC for importer@patchew.org; Wed, 01 Aug 2018 22:48:19 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44530) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fl3a5-0001KD-OY for qemu-devel@nongnu.org; Wed, 01 Aug 2018 22:43:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fl3a2-0007Jq-Cq for qemu-devel@nongnu.org; Wed, 01 Aug 2018 22:43:13 -0400 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]:36801) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fl3a2-0007J7-2s for qemu-devel@nongnu.org; Wed, 01 Aug 2018 22:43:10 -0400 Received: by mail-wm0-x244.google.com with SMTP id w24-v6so729491wmc.1 for ; Wed, 01 Aug 2018 19:43:09 -0700 (PDT) Received: from bloodymary.ipads-lab.se.sjtu.edu.cn ([46.243.138.172]) by smtp.gmail.com with ESMTPSA id t2-v6sm389721wrv.63.2018.08.01.19.43.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 01 Aug 2018 19:43:08 -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=S12X3DUnWQ8UYo5PCCHZRgametyDPeXvNAJTiDiI48SxaTcjoCuSWmPQ3cgBRkGmU8 Gon63NepeWCpJO0cEA26rccOwv+KIrfAuwzORd1VlfztJ0Vc1/4BF9ZLU21E+BHDlVnm ybSSfIIAdzi9javCNELIr50mcnPk4eUSaUdb0fS1r8Vw3xD5u8sJQJuwZbZBjmYPDsWq qb1f9wjcnjzhYjHaBrNR1Zob/IswMhUeJj6vxQstfTaXgPCDNBL5coemmxM0Lr3dadcm Vk89tm3j6IEQ6+ujGHYRXo1pYmzoVFjk+lTE8eCQOZKEmtC7PY9sw4cAEuSjlw9iwoPi j75w== 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=HtVYIsNssXNmrfrOibiOn2Llij3izTyZX1iPMUu/71+OUVUmhkyGWqDSKMiae6X0rD 2sq6XSSq2r75hi2zABnjvLiZ+tT/Rp7M7cAsKXfavfXQeZ9LqNeyZ27p5S8HG7BSeQ8m RMT0QMiv9Bfah/uXCqFsb4pPfVvzoCHr7GbUUpRHXm5Muq8Kr+PtM5j2qf8u5resllFO gyyfguSLkyJQ/Y+A4ccH1ZvFd34BK7g3A7VsgU6m/5LzTFCen1sQgR5PuRbuMVKuotCW phKytGdh/YzHPeKjoOcbaVQcyndT84XMKCNPzn+9kxmh60CSQHCJua7HfEO3cklcnQwc Xhfg== X-Gm-Message-State: AOUpUlFwCD2qpaXyD02nzmA11t6GythxMWNkD7qwZ5imZzgmtp9j8NBW DS9lBXIZ0F0yxBv7gY4qo33o3PiSy74= X-Google-Smtp-Source: AAOMgpdaQbqV59BaY8TIOwscbc+tpNmMdmFaF+KBArRq5lTETgCrKTVYl8J8MtlK8b9q2aRglcSR3w== X-Received: by 2002:a1c:588d:: with SMTP id m135-v6mr576378wmb.118.1533177788989; Wed, 01 Aug 2018 19:43:08 -0700 (PDT) From: Zihan Yang To: qemu-devel@nongnu.org Date: Thu, 2 Aug 2018 10:42:21 +0800 Message-Id: <1533177743-20894-5-git-send-email-whois.zihan.yang@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533177743-20894-1-git-send-email-whois.zihan.yang@gmail.com> References: <1533177743-20894-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:400c:c09::244 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 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