From nobody Tue Feb 10 01:20:02 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=1675958224; cv=none; d=zohomail.com; s=zohoarc; b=V0BjybTToRgWbyJGx115O0nVxiHfDB+q9UbT5Qx20l1nw3ftnzUhMS0pzdRkFjulSdSfcNdXj/C/irOjeoui+bo6cdye1XBDr9PMOkRZOWg7rz+RYQevE3xOOQO5dIDySFHjbHcBX0fGfJT86GIQk+5aOfD+St7rdV9SgCDF+dw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1675958224; 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=hqOdci0RnBqfM9zuF9NcrL5pTTcWWQ4ya+aJqtMi5ro=; b=OMmM5vV79SYdgCfPYQIBwciTsdxFkUjX7hY/5XdItYyBS7ONTqEOiSjqrB9GhDV55mQ3+vVW3rpe9pf0cXyZuiits8joI41JB9DhWyNDRUoo1G5es7IEt/2+Il5sdyCRPG2IXeWda2BrTyQzHSQ+4syVtzxIuJcq68OvoUBPwhQ= 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 1675958224131560.6532165877583; Thu, 9 Feb 2023 07:57:04 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.492677.762368 (Exim 4.92) (envelope-from ) id 1pQ9Ho-0007qk-NV; Thu, 09 Feb 2023 15:56:36 +0000 Received: by outflank-mailman (output) from mailman id 492677.762368; Thu, 09 Feb 2023 15:56:36 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1pQ9Ho-0007nh-El; Thu, 09 Feb 2023 15:56:36 +0000 Received: by outflank-mailman (input) for mailman id 492677; Thu, 09 Feb 2023 15:56:35 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1pQ9Hn-0007Ak-Cl for xen-devel@lists.xenproject.org; Thu, 09 Feb 2023 15:56:35 +0000 Received: from mail-ej1-x635.google.com (mail-ej1-x635.google.com [2a00:1450:4864:20::635]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 53ffdf13-a892-11ed-933c-83870f6b2ba8; Thu, 09 Feb 2023 16:56:34 +0100 (CET) Received: by mail-ej1-x635.google.com with SMTP id lu11so7732123ejb.3 for ; Thu, 09 Feb 2023 07:56:34 -0800 (PST) Received: from dsemenets-HP-EliteBook-850-G8-Notebook-PC.. ([91.219.254.72]) by smtp.gmail.com with ESMTPSA id v1-20020a170906b00100b0087862f45a29sm1027594ejy.174.2023.02.09.07.56.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Feb 2023 07:56:33 -0800 (PST) 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: 53ffdf13-a892-11ed-933c-83870f6b2ba8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hqOdci0RnBqfM9zuF9NcrL5pTTcWWQ4ya+aJqtMi5ro=; b=KQTeOkBryB2Q8oZq5V1y4TlLeWD66B8FECePbXBBby9JLo4VuAk856HunjSpdJaKMU lZsB1d0mk7aghoHYPjZ4vDJ3hfInS2J5/I2e7NYut68prIHrSAsAOvGrwnP6PDJWGKTD dWfH5j03UBrsFxbP8xguXINWV05au4EpUFCMY7HuQ5yLOVhdNiEU6cQdeLmmC/SypO7D iPXF01qMycAZgo/4qgLjIYy6gRcfC86ekJulvV7UpJCi1z8VW2djKpoXL/5Ya7UEy4Ge TPgNYatHxQp9mUuZtiA5qDW4cjVzHmy+QOSPTXJ+j6xzscLt3J0ygTsvD/EnFFj24afN YkTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hqOdci0RnBqfM9zuF9NcrL5pTTcWWQ4ya+aJqtMi5ro=; b=NoWbTutExY9HiBS6LWNaQf8iW/06QCmB+TUdfiQ4fbOGSRaU9Qbq6zmisGUzcU4Fie XywC4tvyk8e2u94MjfcYRlrFIHz82q/mxyYXEqg2FegLK2/w2mbQ5qTtq16v3rd2hcgB gQVsS4aiKBIjonk9G+SFxzDoBpBY5kWDkrV2rAq5RztwcOU2ilj+nmR8TuSjGZMy0W7E 6IXLeSCwoZwJoIJ5UIBaidiyThHCi6/e1DGER+dsL7GnPsOGIkjv9a7KSIKE5w2IzqVX xlpBDzXcbps1sZu30Maf6dCI3EiFsSkl83lUi5+duUmWGa1+9moYsC/2dZyYEkAaAiEj jngA== X-Gm-Message-State: AO0yUKWZPVnht7F9wonUYI8eC5ePmTKVAiDJrMFQlGOHwrCdFiaC2KQD w2fjtJCMSygy3ilLYReMJdAuCCBvORGnbg== X-Google-Smtp-Source: AK7set8b/9mmAz5+IWSOO/j4AOTz5RYR51wseZ5L3zVSGxCuVqTqhs2WxC4zTSOAJxwdKL4In7fRcg== X-Received: by 2002:a17:906:1011:b0:8af:11b5:fabd with SMTP id 17-20020a170906101100b008af11b5fabdmr5210562ejm.5.1675958194017; Thu, 09 Feb 2023 07:56:34 -0800 (PST) From: dmitry.semenets@gmail.com To: xen-devel@lists.xenproject.org Cc: Dmytro Semenets , Wei Liu , Anthony PERARD , Juergen Gross Subject: [RFC PATCH v4 7/9] tools/libs/light: pcid: implement reset_device command Date: Thu, 9 Feb 2023 17:56:01 +0200 Message-Id: <20230209155604.2753219-8-dmitry.semenets@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230209155604.2753219-1-dmitry.semenets@gmail.com> References: <20230209155604.2753219-1-dmitry.semenets@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1675958225558100003 Content-Type: text/plain; charset="utf-8" From: Dmytro Semenets Signed-off-by: Dmytro Semenets --- tools/include/xen-pcid.h | 15 ++++++++ tools/libs/light/libxl_pci.c | 52 +++++++++++---------------- tools/libs/light/libxl_pcid.c | 66 +++++++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+), 31 deletions(-) diff --git a/tools/include/xen-pcid.h b/tools/include/xen-pcid.h index 843066a54c..65be441250 100644 --- a/tools/include/xen-pcid.h +++ b/tools/include/xen-pcid.h @@ -156,6 +156,21 @@ #define PCID_CMD_IS_ASSIGNED "is_device_assigned" #define PCID_MSG_FIELD_RESULT "result" =20 +/* + *************************************************************************= ****** + * Reset PCI device + * + * This command resets PCI device + * + * Request (see other mandatory fields above): + * - "cmd" field of the request must be set to "reset_device". + * - "sbdf" SBDF of the device in format defined by PCID_SBDF_FMT. + * + * Response (see other mandatory fields above): + * - "resp" field of the response must be set to "reset_device". + */ +#define PCID_CMD_RESET_DEVICE "reset_device" + int libxl_pcid_process(libxl_ctx *ctx); =20 #endif /* XEN_PCID_H */ diff --git a/tools/libs/light/libxl_pci.c b/tools/libs/light/libxl_pci.c index 841b97172d..e920a1fa4b 100644 --- a/tools/libs/light/libxl_pci.c +++ b/tools/libs/light/libxl_pci.c @@ -89,6 +89,8 @@ static int pci_handle_response(libxl__gc *gc, else if (strcmp(command_name, PCID_CMD_IS_ASSIGNED) =3D=3D 0) *result =3D (libxl__json_object *)libxl__json_map_get(PCID_MSG_FIE= LD_RESULT, response, JSON_B= OOL); + else if (strcmp(command_name, PCID_CMD_RESET_DEVICE) =3D=3D 0) + *result =3D libxl__json_object_alloc(gc, JSON_NULL); return ret; } =20 @@ -1518,38 +1520,26 @@ out: static int libxl__device_pci_reset(libxl__gc *gc, unsigned int domain, uns= igned int bus, unsigned int dev, unsigned int func) { - char *reset; - int fd, rc; - - reset =3D GCSPRINTF("%s/do_flr", SYSFS_PCIBACK_DRIVER); - fd =3D open(reset, O_WRONLY); - if (fd >=3D 0) { - char *buf =3D GCSPRINTF(PCI_BDF, domain, bus, dev, func); - rc =3D write(fd, buf, strlen(buf)); - if (rc < 0) - LOGD(ERROR, domain, "write to %s returned %d", reset, rc); - close(fd); - return rc < 0 ? rc : 0; - } - if (errno !=3D ENOENT) - LOGED(ERROR, domain, "Failed to access pciback path %s", reset); - reset =3D GCSPRINTF("%s/"PCI_BDF"/reset", SYSFS_PCI_DEV, domain, bus, = dev, func); - fd =3D open(reset, O_WRONLY); - if (fd >=3D 0) { - rc =3D write(fd, "1", 1); - if (rc < 0) - LOGED(ERROR, domain, "write to %s returned %d", reset, rc); - close(fd); - return rc < 0 ? rc : 0; - } - if (errno =3D=3D ENOENT) { - LOGD(ERROR, domain, - "The kernel doesn't support reset from sysfs for PCI device "= PCI_BDF, - domain, bus, dev, func); - } else { - LOGED(ERROR, domain, "Failed to access reset path %s", reset); + struct vchan_info *vchan; + int rc =3D 0; + libxl__json_object *args, *result; + + vchan =3D pci_vchan_get_client(gc); + if (!vchan) { + rc =3D ERROR_NOT_READY; + goto out; } - return -1; + args =3D libxl__vchan_start_args(gc); + + libxl__vchan_arg_add_string(gc, args, PCID_MSG_FIELD_SBDF, + GCSPRINTF(PCID_SBDF_FMT, domain, bus, dev, func)); + result =3D vchan_send_command(gc, vchan, PCID_CMD_RESET_DEVICE, args); + if (!result) + rc =3D ERROR_FAIL; + pci_vchan_free(gc, vchan); + + out: + return rc; } =20 int libxl__device_pci_setdefault(libxl__gc *gc, uint32_t domid, diff --git a/tools/libs/light/libxl_pcid.c b/tools/libs/light/libxl_pcid.c index 7b6c7fe6a6..05c0b69324 100644 --- a/tools/libs/light/libxl_pcid.c +++ b/tools/libs/light/libxl_pcid.c @@ -364,6 +364,69 @@ static int process_pciback_dev_is_assigned(libxl__gc *= gc, yajl_gen gen, return 0; } =20 +static int device_pci_reset(libxl__gc *gc, unsigned int domain, unsigned i= nt bus, + unsigned int dev, unsigned int func) +{ + char *reset; + int fd, rc; + + reset =3D GCSPRINTF("%s/do_flr", SYSFS_PCIBACK_DRIVER); + fd =3D open(reset, O_WRONLY); + if (fd >=3D 0) { + char *buf =3D GCSPRINTF(PCI_BDF, domain, bus, dev, func); + rc =3D write(fd, buf, strlen(buf)); + if (rc < 0) + LOGD(ERROR, domain, "write to %s returned %d", reset, rc); + close(fd); + return rc < 0 ? rc : 0; + } + if (errno !=3D ENOENT) + LOGED(ERROR, domain, "Failed to access pciback path %s", reset); + reset =3D GCSPRINTF("%s/"PCI_BDF"/reset", SYSFS_PCI_DEV, domain, bus, = dev, func); + fd =3D open(reset, O_WRONLY); + if (fd >=3D 0) { + rc =3D write(fd, "1", 1); + if (rc < 0) + LOGED(ERROR, domain, "write to %s returned %d", reset, rc); + close(fd); + return rc < 0 ? rc : 0; + } + if (errno =3D=3D ENOENT) { + LOGD(ERROR, domain, + "The kernel doesn't support reset from sysfs for PCI device "= PCI_BDF, + domain, bus, dev, func); + } else { + LOGED(ERROR, domain, "Failed to access reset path %s", reset); + } + return -1; +} + +static int process_device_pci_reset(libxl__gc *gc, yajl_gen gen, + char *command_name, + const struct libxl__json_object *reques= t, + struct libxl__json_object **response) +{ + const struct libxl__json_object *json_o; + unsigned int dom, bus, dev, func; + int rc; + + json_o =3D libxl__json_map_get(PCID_MSG_FIELD_SBDF, request, JSON_STRI= NG); + if (!json_o) { + make_error_reply(gc, gen, "No mandatory parameter 'sbdf'", command= _name); + return ERROR_FAIL; + } + + if (sscanf(libxl__json_object_get_string(json_o), PCID_SBDF_FMT, + &dom, &bus, &dev, &func) !=3D 4) { + make_error_reply(gc, gen, "Can't parse SBDF", command_name); + return ERROR_FAIL; + } + rc =3D device_pci_reset(gc, dom, bus, dev, func); + if (rc < 0) + return ERROR_FAIL; + return rc; +} + static int process_make_assignable(libxl__gc *gc, yajl_gen gen, char *command_name, const struct libxl__json_object *reques= t, @@ -570,6 +633,9 @@ static int pcid_handle_request(libxl__gc *gc, yajl_gen = gen, else if (strcmp(command_name, PCID_CMD_IS_ASSIGNED) =3D=3D 0) ret =3D process_pciback_dev_is_assigned(gc, gen, command_name, request, &command_response); + else if (strcmp(command_name, PCID_CMD_RESET_DEVICE) =3D=3D 0) + ret =3D process_device_pci_reset(gc, gen, command_name, + request, &command_response); else { /* * This is an unsupported command: make a reply and proceed over --=20 2.34.1