From nobody Tue Feb 10 01:59:05 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=1628778202; cv=none; d=zohomail.com; s=zohoarc; b=Kx4uesDERKSoXDsd85vUMiLR1NImOkUxyeB6stfjvYSdgSAHalycMNSWd2z0zQJuDpTwsHSG3x2jbtgAKsbG32lppUw8CL6a85TnF7ygntAJKP5vKo//CG5k9nNlTalTu77d8WVZ316mk5GpM2stQv7i+px7wQOMtnyOx4Juyek= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1628778202; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=inCVhx2xTjXRTUWKhimZDtGVbzmLyu/AE4x7F5P7a2A=; b=T4ord8MjnFsvQgreURln1uG9ctMHsn8MhMyvJpKU/USDBkf1mW++C/sXspqS1TUlOVMosUe4J2IPRe1m4d09oE9sYbie0iVQnUnpqWIBdkxT8hDzE8fxHosTs31IuOXocSMlM33YEnmXJYehkCmzMQQArYR1esMWMlzU6WvXS5Y= 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 1628778202294583.3182128073092; Thu, 12 Aug 2021 07:23:22 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.166469.303855 (Exim 4.92) (envelope-from ) id 1mEBbv-00051K-MF; Thu, 12 Aug 2021 14:23:07 +0000 Received: by outflank-mailman (output) from mailman id 166469.303855; Thu, 12 Aug 2021 14:23:07 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mEBbv-00051D-IM; Thu, 12 Aug 2021 14:23:07 +0000 Received: by outflank-mailman (input) for mailman id 166469; Thu, 12 Aug 2021 14:23:06 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mEBbt-0002Q2-VL for xen-devel@lists.xenproject.org; Thu, 12 Aug 2021 14:23:05 +0000 Received: from mail-lj1-x22c.google.com (unknown [2a00:1450:4864:20::22c]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id cc5747a4-339f-47a8-9a74-7e8db8049f43; Thu, 12 Aug 2021 14:22:40 +0000 (UTC) Received: by mail-lj1-x22c.google.com with SMTP id n7so10906079ljq.0 for ; Thu, 12 Aug 2021 07:22:40 -0700 (PDT) Received: from localhost.localdomain (host-176-36-213-80.b024.la.net.ua. [176.36.213.80]) by smtp.gmail.com with ESMTPSA id s16sm329678ljj.48.2021.08.12.07.22.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Aug 2021 07:22:39 -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: cc5747a4-339f-47a8-9a74-7e8db8049f43 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=inCVhx2xTjXRTUWKhimZDtGVbzmLyu/AE4x7F5P7a2A=; b=BKNQKgQfIFzmnp49yQKqVc+Wv10iSeHUsbMgMt+mD6Wu3tsk/Lm4F/t4nTzrnt7EEk J7VKbpCbwnPg+4Ai593QxG8urtUKJP8jyI5BcXXtH5vtmZro3JSwuWxieqQPHDenqwO5 i0YZlVICZE5C0zzRH2SDHqPbQGF/vDiZ1nR8/rdyTxHBRAmYf19r1yW0y+WqHk9vA+ci I+8VTApj1PGd4Hx1YuZmOWHtMN1xlse0LfZNGXRKbrjZ3y3o2S7tAgQxgOURM5dFEp58 +yNnjFkjQU21d73zNPWqI8gX9otcPRYXUNsxK3sBhhV4/Jyw6rUzI+EVK0Mgi82/aR8d Xd4A== 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=inCVhx2xTjXRTUWKhimZDtGVbzmLyu/AE4x7F5P7a2A=; b=TPY6geC/dBkIfaa77bLplyftA+c9LfixGMauoU9nxQ6T7n3EU4PdRwrPs4b+HYxZuD lz/YrVjRxwCFAkbzd+nlOggFImVWbyJy4OHuoxLlAuyYZCQCDeHNjWpSIrlea+8qFHcs vh66tl3lQj27nDO2mhl8gxtOCd97nffOIxxRNUHC9VbsDb7uZFtWIAaczvI2dDmoK6eH 3+9Q1dWuj6aLd/NS9b711S3dHxrikuKDmJU4TIVJBRd2O/9JlBEtjv1yS3Tf5/DTT6Y2 twX3lqWiiBZD3RJfKPl4/ipJ3dHTFtyxzDlior/g7f9gh9L50ZRUYizAJf1oVKjjVLRd ys5g== X-Gm-Message-State: AOAM530+7BkI31P5yFsF/niZJDxOJyCw3AA4ZyHtrQhEjUwMUzn8tdj6 xYaDo3bswJwFs3dg4LQlBSxTy32k7xUOAQ== X-Google-Smtp-Source: ABdhPJxwm3kLJPptggDG2RO5Tjk5OHMSKE1fExFYfWB0/fupslRtVvVWhlmtzLwgbvYJAdn2Gdrz9Q== X-Received: by 2002:a05:651c:554:: with SMTP id q20mr3224240ljp.390.1628778159379; Thu, 12 Aug 2021 07:22:39 -0700 (PDT) From: Anastasiia Lukianenko To: xen-devel@lists.xenproject.org Cc: oleksandr_tyshchenko@epam.com, artem_mygaiev@epam.com, rahul.singh@arm.com, bertrand.marquis@arm.com, oleksandr_andrushchenko@epam.com, roger.pau@citrix.com, julien@xen.org, sstabellini@kernel.org, andr2000@gmail.com, vicooodin@gmail.com, Anastasiia Lukianenko Subject: [PATCH 6/9] tools/libs/light: Add "read" command to xl pcid and libxl PCI Date: Thu, 12 Aug 2021 17:22:27 +0300 Message-Id: <20210812142230.19353-7-vicooodin@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210812142230.19353-1-vicooodin@gmail.com> References: <20210812142230.19353-1-vicooodin@gmail.com> X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1628778203413100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Anastasiia Lukianenko Libxl PCI can use xl pcid server to read integer value from the given path. Signed-off-by: Anastasiia Lukianenko --- tools/include/pcid.h | 1 + tools/libs/light/libxl_pci.c | 125 ++++++++++++++++++---------------- tools/libs/light/libxl_pcid.c | 50 ++++++++++++++ 3 files changed, 119 insertions(+), 57 deletions(-) diff --git a/tools/include/pcid.h b/tools/include/pcid.h index 935d99b186..f39011ecb8 100644 --- a/tools/include/pcid.h +++ b/tools/include/pcid.h @@ -32,6 +32,7 @@ #define PCID_CMD_DIR_ID "dir_id" =20 #define PCID_CMD_WRITE "write" +#define PCID_CMD_READ_HEX "read_hex" #define PCID_CMD_PCI_PATH "pci_path" #define PCID_CMD_PCI_INFO "pci_info" =20 diff --git a/tools/libs/light/libxl_pci.c b/tools/libs/light/libxl_pci.c index 03ce42dec3..d5ddca4964 100644 --- a/tools/libs/light/libxl_pci.c +++ b/tools/libs/light/libxl_pci.c @@ -634,83 +634,94 @@ static int sysfs_dev_unbind(libxl__gc *gc, libxl_devi= ce_pci *pci, static uint16_t sysfs_dev_get_vendor(libxl__gc *gc, libxl_device_pci *pci) { char *pci_device_vendor_path =3D - GCSPRINTF(SYSFS_PCI_DEV"/"PCI_BDF"/vendor", - pci->domain, pci->bus, pci->dev, pci->func); - uint16_t read_items; + GCSPRINTF("/"PCI_BDF"/vendor", pci->domain, pci->bus, + pci->dev, pci->func); uint16_t pci_device_vendor; + struct vchan_info *vchan; + libxl__json_object *args =3D NULL, *result =3D NULL; =20 - FILE *f =3D fopen(pci_device_vendor_path, "r"); - if (!f) { - LOGE(ERROR, - "pci device "PCI_BDF" does not have vendor attribute", - pci->domain, pci->bus, pci->dev, pci->func); - return 0xffff; - } - read_items =3D fscanf(f, "0x%hx\n", &pci_device_vendor); - fclose(f); - if (read_items !=3D 1) { - LOGE(ERROR, - "cannot read vendor of pci device "PCI_BDF, - pci->domain, pci->bus, pci->dev, pci->func); - return 0xffff; - } + vchan =3D pci_prepare_vchan(gc); + if (!vchan) + goto fail; + libxl__vchan_param_add_string(gc, &args, PCID_CMD_PCI_INFO, + pci_device_vendor_path); + libxl__vchan_param_add_string(gc, &args, PCID_CMD_DIR_ID, + PCID_PCI_DEV); + result =3D vchan_send_command(gc, vchan, PCID_CMD_READ_HEX, args); + if (!result) + goto fail; + + pci_device_vendor =3D libxl__json_object_get_integer(result); =20 return pci_device_vendor; + +fail: + LOGE(ERROR, + "cannot read vendor of pci device "PCI_BDF, + pci->domain, pci->bus, pci->dev, pci->func); + return 0xffff; } =20 static uint16_t sysfs_dev_get_device(libxl__gc *gc, libxl_device_pci *pci) { char *pci_device_device_path =3D - GCSPRINTF(SYSFS_PCI_DEV"/"PCI_BDF"/device", - pci->domain, pci->bus, pci->dev, pci->func); - uint16_t read_items; + GCSPRINTF("/"PCI_BDF"/device", pci->domain, pci->bus, + pci->dev, pci->func); uint16_t pci_device_device; + struct vchan_info *vchan; + libxl__json_object *args =3D NULL, *result =3D NULL; =20 - FILE *f =3D fopen(pci_device_device_path, "r"); - if (!f) { - LOGE(ERROR, - "pci device "PCI_BDF" does not have device attribute", - pci->domain, pci->bus, pci->dev, pci->func); - return 0xffff; - } - read_items =3D fscanf(f, "0x%hx\n", &pci_device_device); - fclose(f); - if (read_items !=3D 1) { - LOGE(ERROR, - "cannot read device of pci device "PCI_BDF, - pci->domain, pci->bus, pci->dev, pci->func); - return 0xffff; - } + vchan =3D pci_prepare_vchan(gc); + if (!vchan) + goto fail; + libxl__vchan_param_add_string(gc, &args, PCID_CMD_PCI_INFO, + pci_device_device_path); + libxl__vchan_param_add_string(gc, &args, PCID_CMD_DIR_ID, + PCID_PCI_DEV); + result =3D vchan_send_command(gc, vchan, PCID_CMD_READ_HEX, args); + if (!result) + goto fail; + + pci_device_device =3D libxl__json_object_get_integer(result); =20 return pci_device_device; + +fail: + LOGE(ERROR, + "cannot read device of pci device "PCI_BDF, + pci->domain, pci->bus, pci->dev, pci->func); + return 0xffff; } =20 static int sysfs_dev_get_class(libxl__gc *gc, libxl_device_pci *pci, unsigned long *class) { - char *pci_device_class_path =3D GCSPRINTF(SYSFS_PCI_DEV"/"PCI_BDF"/cla= ss", - pci->domain, pci->bus, pci->dev, pci->func); - int read_items, ret =3D 0; + char *pci_device_class_path =3D GCSPRINTF("/"PCI_BDF"/class", + pci->domain, pci->bus, + pci->dev, pci->func); + struct vchan_info *vchan; + libxl__json_object *args =3D NULL, *result =3D NULL; =20 - FILE *f =3D fopen(pci_device_class_path, "r"); - if (!f) { - LOGE(ERROR, - "pci device "PCI_BDF" does not have class attribute", - pci->domain, pci->bus, pci->dev, pci->func); - ret =3D ERROR_FAIL; - goto out; - } - read_items =3D fscanf(f, "0x%lx\n", class); - fclose(f); - if (read_items !=3D 1) { - LOGE(ERROR, - "cannot read class of pci device "PCI_BDF, - pci->domain, pci->bus, pci->dev, pci->func); - ret =3D ERROR_FAIL; - } + vchan =3D pci_prepare_vchan(gc); + if (!vchan) + goto fail; + libxl__vchan_param_add_string(gc, &args, PCID_CMD_PCI_INFO, + pci_device_class_path); + libxl__vchan_param_add_string(gc, &args, PCID_CMD_DIR_ID, + PCID_PCI_DEV); + result =3D vchan_send_command(gc, vchan, PCID_CMD_READ_HEX, args); + if (!result) + goto fail; =20 -out: - return ret; + *class =3D libxl__json_object_get_integer(result); + + return 0; + +fail: + LOGE(ERROR, + "cannot read class of pci device "PCI_BDF, + pci->domain, pci->bus, pci->dev, pci->func); + return ERROR_FAIL; } =20 /* diff --git a/tools/libs/light/libxl_pcid.c b/tools/libs/light/libxl_pcid.c index ee4c832779..0f736c68af 100644 --- a/tools/libs/light/libxl_pcid.c +++ b/tools/libs/light/libxl_pcid.c @@ -154,6 +154,54 @@ out: return result; } =20 +static libxl__json_object *process_read_hex_cmd(libxl__gc *gc, + const struct libxl__json_o= bject *resp) +{ + libxl__json_object *result =3D NULL; + const struct libxl__json_object *args, *dir_id, *pci_info; + char *full_path; + uint16_t read_items; + long long read_number; + + args =3D libxl__json_map_get(PCID_MSG_FIELD_ARGS, resp, JSON_MAP); + if (!args) + goto out; + dir_id =3D libxl__json_map_get(PCID_CMD_DIR_ID, args, JSON_ANY); + if (!dir_id) + goto out; + pci_info =3D libxl__json_map_get(PCID_CMD_PCI_INFO, args, JSON_ANY); + if (!pci_info) + goto out; + + if (strcmp(PCID_PCI_DEV, dir_id->u.string) =3D=3D 0) + full_path =3D libxl__sprintf(gc, SYSFS_PCI_DEV"%s", pci_info->u.st= ring); + else + full_path =3D pci_info->u.string; + + FILE *f =3D fopen(full_path, "r"); + if (!f) { + LOGE(ERROR, "PCI device %s does not have needed attribute\n", + full_path); + goto out; + } + read_items =3D fscanf(f, "0x%llx\n", &read_number); + fclose(f); + if (read_items !=3D 1) { + LOGE(ERROR, "Cannot read attribute of pci device %s\n", full_path); + goto out; + } + + result =3D libxl__json_object_alloc(gc, JSON_INTEGER); + if (!result) { + LOGE(ERROR, "Memory allocation failed\n"); + goto out; + } + result->u.i =3D read_number; + +out: + return result; +} + static int pcid_handle_message(libxl__gc *gc, const libxl__json_object *re= quest, libxl__json_object **result) { @@ -171,6 +219,8 @@ static int pcid_handle_message(libxl__gc *gc, const lib= xl__json_object *request, *result =3D process_ls_cmd(gc, request); else if (strcmp(PCID_CMD_WRITE, command_name) =3D=3D 0) *result =3D process_write_cmd(gc, request); + else if (strcmp(command_name, PCID_CMD_READ_HEX) =3D=3D 0) + *result =3D process_read_hex_cmd(gc, request); else return ERROR_NOTFOUND; =20 --=20 2.17.1