From nobody Sun Feb 8 14:35:21 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1630663750; cv=none; d=zohomail.com; s=zohoarc; b=N/mwzbCcPZzMUNraoD7HDEwj6tLnE4zBu24Djqr0ACJoK7cWygmIi/Opld9o9XbPoAncbGaDPrm3IlWYrNdogzFWglTptyeOZGk7FaShYHJOdeR6jxwKI0aelLdlxmqn65U9AK0HCF35d6zIacY51OdCmRr1/TDqnehzOHqP/rw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1630663750; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=xpLp7pLNUQ/DHxUjEhr/yTY0NKqDW6A0T3pZsizfVtE=; b=dKyh7F0U4ofAahISfBsfBBs/NrhKnKfgT062dFb3n6SBt2XdVVqjfx8grSfM5IiyeBBsuMffj8wH+l7ZfZJYAjGZmWRMct0oSFLysUu/CoduywZ/7NFAJio/rrxZ34PnFDoqq7Xbf3WjMzZoPiu+hoKLOzFJn7jGz3SKbEsP51I= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1630663750770591.8945207008927; Fri, 3 Sep 2021 03:09:10 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.177975.323819 (Exim 4.92) (envelope-from ) id 1mM681-0005gd-Ne; Fri, 03 Sep 2021 10:08:57 +0000 Received: by outflank-mailman (output) from mailman id 177975.323819; Fri, 03 Sep 2021 10:08:57 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mM681-0005gQ-Jh; Fri, 03 Sep 2021 10:08:57 +0000 Received: by outflank-mailman (input) for mailman id 177975; Fri, 03 Sep 2021 10:08:56 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mM680-0004Cr-AA for xen-devel@lists.xenproject.org; Fri, 03 Sep 2021 10:08:56 +0000 Received: from mail-ed1-x533.google.com (unknown [2a00:1450:4864:20::533]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id cfb4143e-4d10-43e8-a103-28cf681063e9; Fri, 03 Sep 2021 10:08:40 +0000 (UTC) Received: by mail-ed1-x533.google.com with SMTP id z19so7227660edi.9 for ; Fri, 03 Sep 2021 03:08:40 -0700 (PDT) Received: from a2klaptop.epam.com (host-176-36-245-220.b024.la.net.ua. [176.36.245.220]) by smtp.gmail.com with ESMTPSA id p5sm2427187eju.30.2021.09.03.03.08.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 03 Sep 2021 03:08:38 -0700 (PDT) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: cfb4143e-4d10-43e8-a103-28cf681063e9 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=xpLp7pLNUQ/DHxUjEhr/yTY0NKqDW6A0T3pZsizfVtE=; b=aS6tQADQYeExZDhOABC9iBB8GoJc3IuoFCRob+Cctdwhth+nveel2KGxkARVYlU6Jd Qgnsw8axED8hMhxC2pYHQ9oNoSo/Olz1veZ4TZuqbKzQZivPkh6by4D4cHiKbYkHSK91 YRf3tKX+OFy/jc8fvxtX6h9mWPRbWAPECFFsxFE+A6QKglW5XRGmbuMg67a0TGkoDIJw /eSmzbrBWGArGKWd2yxvzNtdGv662yFyuBYuegN1QYkQSgbHkEqDsAUOzpcLfZcumjrq cZ2XfDNZRq17L5VjX+W5pDzGFNH7tT+468gnBCcwp09gPnFouOqA3oPEThxmheEzgx36 8JiA== 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:mime-version:content-transfer-encoding; bh=xpLp7pLNUQ/DHxUjEhr/yTY0NKqDW6A0T3pZsizfVtE=; b=hGnApIAP71TtOCLXUjUKPy4WIrMPkur5k+NPSUeWn7p/Bf8CxvczUWGnlwjKqpPQcP 9Y0eVWNEsj5402YA2Gbn//AJYvDDKoVXzV9QDF/Ps+iNmInd9cB0Cc+SOoFZS8/asqwT tTfsJeeSHJaC2dhpcFjiFNFectWoPuWWPGg0Z7aGKDHciQp/Z5hDb51wcF6vB7kI2N1r o0cFz+f9LWpM7xDisrSAzoVOdv0ooVvwsKGxRdZ2MfEA96Rzwy9NPLeVRX8dmbhQM0j6 ZYj5JkfP2reHEmbEYz3M/2N8AeaN+RpskyCOLs7iDYTcCtetuKAJNg2RtePNh6AlqiEw d1Mw== X-Gm-Message-State: AOAM5334/en9MEUJvPwecu2YmyDa6bOMJinsNafy5DPz5/8RswTn4lXw mt9V6eUOxVENPqJZI0u2GjZF5lc+2Bo= X-Google-Smtp-Source: ABdhPJwZyi4jY7+BYhHRUtcHJ71NsVbFBf7jRjXcdY+sWwfFplhPMgxjOeq7kjOI9krtIeEBDoMxMA== X-Received: by 2002:aa7:da8c:: with SMTP id q12mr3199500eds.380.1630663718806; Fri, 03 Sep 2021 03:08:38 -0700 (PDT) From: Oleksandr Andrushchenko To: xen-devel@lists.xenproject.org Cc: julien@xen.org, sstabellini@kernel.org, oleksandr_tyshchenko@epam.com, volodymyr_babchuk@epam.com, Artem_Mygaiev@epam.com, roger.pau@citrix.com, jbeulich@suse.com, bertrand.marquis@arm.com, rahul.singh@arm.com, Oleksandr Andrushchenko Subject: [PATCH 4/9] vpci/header: Add and remove register handlers dynamically Date: Fri, 3 Sep 2021 13:08:26 +0300 Message-Id: <20210903100831.177748-5-andr2000@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210903100831.177748-1-andr2000@gmail.com> References: <20210903100831.177748-1-andr2000@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1630663752341100001 Content-Type: text/plain; charset="utf-8" From: Oleksandr Andrushchenko Add relevant vpci register handlers when assigning PCI device to a domain and remove those when de-assigning. This allows having different handlers for different domains, e.g. hwdom and other guests. Use stubs for guest domains for now. Signed-off-by: Oleksandr Andrushchenko --- xen/drivers/vpci/header.c | 78 +++++++++++++++++++++++++++++++++++---- xen/drivers/vpci/vpci.c | 4 +- xen/include/xen/vpci.h | 4 ++ 3 files changed, 76 insertions(+), 10 deletions(-) diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c index 31bca7a12942..5218b1af247e 100644 --- a/xen/drivers/vpci/header.c +++ b/xen/drivers/vpci/header.c @@ -397,6 +397,17 @@ static void bar_write(const struct pci_dev *pdev, unsi= gned int reg, pci_conf_write32(pdev->sbdf, reg, val); } =20 +static void guest_bar_write(const struct pci_dev *pdev, unsigned int reg, + uint32_t val, void *data) +{ +} + +static uint32_t guest_bar_read(const struct pci_dev *pdev, unsigned int re= g, + void *data) +{ + return 0xffffffff; +} + static void rom_write(const struct pci_dev *pdev, unsigned int reg, uint32_t val, void *data) { @@ -445,14 +456,25 @@ static void rom_write(const struct pci_dev *pdev, uns= igned int reg, rom->addr =3D val & PCI_ROM_ADDRESS_MASK; } =20 -static int add_bar_handlers(struct pci_dev *pdev) +static void guest_rom_write(const struct pci_dev *pdev, unsigned int reg, + uint32_t val, void *data) +{ +} + +static uint32_t guest_rom_read(const struct pci_dev *pdev, unsigned int re= g, + void *data) +{ + return 0xffffffff; +} + +static int add_bar_handlers(struct pci_dev *pdev, bool is_hwdom) { unsigned int i; struct vpci_header *header =3D &pdev->vpci->header; struct vpci_bar *bars =3D header->bars; int rc; =20 - /* Setup a handler for the command register. */ + /* Setup a handler for the command register: same for hwdom and guests= . */ rc =3D vpci_add_register(pdev->vpci, vpci_hw_read16, cmd_write, PCI_CO= MMAND, 2, header); if ( rc ) @@ -475,8 +497,13 @@ static int add_bar_handlers(struct pci_dev *pdev) rom_reg =3D PCI_ROM_ADDRESS; else rom_reg =3D PCI_ROM_ADDRESS1; - rc =3D vpci_add_register(pdev->vpci, vpci_hw_read32, rom_write, - rom_reg, 4, &bars[i]); + if ( is_hwdom ) + rc =3D vpci_add_register(pdev->vpci, vpci_hw_read32, rom_w= rite, + rom_reg, 4, &bars[i]); + else + rc =3D vpci_add_register(pdev->vpci, + guest_rom_read, guest_rom_write, + rom_reg, 4, &bars[i]); if ( rc ) return rc; } @@ -485,8 +512,13 @@ static int add_bar_handlers(struct pci_dev *pdev) uint8_t reg =3D PCI_BASE_ADDRESS_0 + i * 4; =20 /* This is either VPCI_BAR_MEM32 or VPCI_BAR_MEM64_{LO|HI}. */ - rc =3D vpci_add_register(pdev->vpci, vpci_hw_read32, bar_write= , reg, - 4, &bars[i]); + if ( is_hwdom ) + rc =3D vpci_add_register(pdev->vpci, vpci_hw_read32, bar_w= rite, + reg, 4, &bars[i]); + else + rc =3D vpci_add_register(pdev->vpci, + guest_bar_read, guest_bar_write, + reg, 4, &bars[i]); if ( rc ) return rc; } @@ -520,7 +552,7 @@ static int init_bars(struct pci_dev *pdev) } =20 if ( pdev->ignore_bars ) - return add_bar_handlers(pdev); + return add_bar_handlers(pdev, true); =20 /* Disable memory decoding before sizing. */ cmd =3D pci_conf_read16(pdev->sbdf, PCI_COMMAND); @@ -582,7 +614,7 @@ static int init_bars(struct pci_dev *pdev) PCI_ROM_ADDRESS_ENABLE; } =20 - rc =3D add_bar_handlers(pdev); + rc =3D add_bar_handlers(pdev, true); if ( rc ) { pci_conf_write16(pdev->sbdf, PCI_COMMAND, cmd); @@ -593,6 +625,36 @@ static int init_bars(struct pci_dev *pdev) } REGISTER_VPCI_INIT(init_bars, VPCI_PRIORITY_MIDDLE); =20 +int vpci_bar_add_handlers(const struct domain *d, struct pci_dev *pdev) +{ + int rc; + + /* Remove previously added registers. */ + vpci_remove_device_registers(pdev); + + /* It only makes sense to add registers for hwdom or guest domain. */ + if ( d->domain_id >=3D DOMID_FIRST_RESERVED ) + return 0; + + if ( is_hardware_domain(d) ) + rc =3D add_bar_handlers(pdev, true); + else + rc =3D add_bar_handlers(pdev, false); + + if ( rc ) + gprintk(XENLOG_ERR, + "%pp: failed to add BAR handlers for dom%d\n", &pdev->sbdf, + d->domain_id); + return rc; +} + +int vpci_bar_remove_handlers(const struct domain *d, struct pci_dev *pdev) +{ + /* Remove previously added registers. */ + vpci_remove_device_registers(pdev); + return 0; +} + /* * Local variables: * mode: C diff --git a/xen/drivers/vpci/vpci.c b/xen/drivers/vpci/vpci.c index ee0ad63a3c12..4530313f01e7 100644 --- a/xen/drivers/vpci/vpci.c +++ b/xen/drivers/vpci/vpci.c @@ -94,7 +94,7 @@ int vpci_assign_device(struct domain *d, struct pci_dev *= dev) if ( !has_vpci(d) || (d->domain_id >=3D DOMID_FIRST_RESERVED) ) return 0; =20 - return 0; + return vpci_bar_add_handlers(d, dev); } =20 /* Notify vPCI that device is de-assigned from guest. */ @@ -104,7 +104,7 @@ int vpci_deassign_device(struct domain *d, struct pci_d= ev *dev) if ( !has_vpci(d) || (d->domain_id >=3D DOMID_FIRST_RESERVED) ) return 0; =20 - return 0; + return vpci_bar_remove_handlers(d, dev); } =20 #endif /* __XEN__ */ diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h index e7a1a09ab4c9..4aa2941a1081 100644 --- a/xen/include/xen/vpci.h +++ b/xen/include/xen/vpci.h @@ -63,6 +63,10 @@ uint32_t vpci_hw_read32(const struct pci_dev *pdev, unsi= gned int reg, */ bool __must_check vpci_process_pending(struct vcpu *v); =20 +/* Add/remove BAR handlers for a domain. */ +int vpci_bar_add_handlers(const struct domain *d, struct pci_dev *pdev); +int vpci_bar_remove_handlers(const struct domain *d, struct pci_dev *pdev); + struct vpci { /* List of vPCI handlers for a device. */ struct list_head handlers; --=20 2.25.1