From patchwork Tue Jan 19 21:24:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 86909 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 59AAEA0A05; Tue, 19 Jan 2021 22:27:39 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 73C07140E99; Tue, 19 Jan 2021 22:26:38 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by mails.dpdk.org (Postfix) with ESMTP id 702A1140EA0 for ; Tue, 19 Jan 2021 22:26:36 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1611091596; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5y2S5mJgyrkv8JvZLThn2oqepx66yvWg+qRyvJHNtEo=; b=X1Xxs2cIsq7adkFCoz5xRGVnwW5wzoVip/ZBJI9vqzFki+LkM8hh2y4wN8tuSN2GuWIll1 gBnJe1VLpuN1wVAb+0c1qgA7acJ2Dlvw3czAPvYU/ncPOoc10IG3HBgSGapPkEKac4NWOg 7GCqdqpZ5Ec3jPfXvnh7IZNkYpMkoBA= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-202-3czQywzONsW_hnl6aXiXxw-1; Tue, 19 Jan 2021 16:26:32 -0500 X-MC-Unique: 3czQywzONsW_hnl6aXiXxw-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C704D801817; Tue, 19 Jan 2021 21:26:30 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.29]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5D2905D9DD; Tue, 19 Jan 2021 21:26:29 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Tue, 19 Jan 2021 22:24:36 +0100 Message-Id: <20210119212507.1043636-14-maxime.coquelin@redhat.com> In-Reply-To: <20210119212507.1043636-1-maxime.coquelin@redhat.com> References: <20210119212507.1043636-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=maxime.coquelin@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [dpdk-dev] [PATCH v2 13/44] net/virtio: validate features at bus level X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This patch provides a new callback for the bus type to validate negotiated features are compatible with it. Only user for now is PCI modern bus type, which implies that the device supports Virtio 1.0+. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- drivers/net/virtio/virtio_ethdev.c | 11 ++++------- drivers/net/virtio/virtio_pci.c | 19 +++++++++++++++++++ drivers/net/virtio/virtio_pci.h | 1 + drivers/net/virtio/virtio_user_ethdev.c | 7 +++++++ 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 7e2240fd79..747e70171f 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1330,17 +1330,14 @@ virtio_negotiate_features(struct virtio_hw *hw, uint64_t req_features) PMD_INIT_LOG(DEBUG, "features after negotiate = %" PRIx64, hw->guest_features); - if (hw->bus_type == VIRTIO_BUS_PCI_MODERN && !vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) { - PMD_INIT_LOG(ERR, - "VIRTIO_F_VERSION_1 features is not enabled."); + if (VTPCI_OPS(hw)->features_ok(hw) < 0) return -1; - } - if (hw->bus_type == VIRTIO_BUS_PCI_MODERN || hw->bus_type == VIRTIO_BUS_USER) { + if (vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) { vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK); + if (!(vtpci_get_status(hw) & VIRTIO_CONFIG_STATUS_FEATURES_OK)) { - PMD_INIT_LOG(ERR, - "failed to set FEATURES_OK status!"); + PMD_INIT_LOG(ERR, "Failed to set FEATURES_OK status!"); return -1; } } diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index 145bc38de3..41571522df 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -201,6 +201,12 @@ legacy_set_features(struct virtio_hw *hw, uint64_t features) VIRTIO_PCI_GUEST_FEATURES); } +static int +legacy_features_ok(struct virtio_hw *hw __rte_unused) +{ + return 0; +} + static uint8_t legacy_get_status(struct virtio_hw *hw) { @@ -315,6 +321,7 @@ const struct virtio_pci_ops legacy_ops = { .set_status = legacy_set_status, .get_features = legacy_get_features, .set_features = legacy_set_features, + .features_ok = legacy_features_ok, .get_isr = legacy_get_isr, .set_config_irq = legacy_set_config_irq, .set_queue_irq = legacy_set_queue_irq, @@ -389,6 +396,17 @@ modern_set_features(struct virtio_hw *hw, uint64_t features) &hw->common_cfg->guest_feature); } +static int +modern_features_ok(struct virtio_hw *hw) +{ + if (!vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) { + PMD_INIT_LOG(ERR, "Version 1+ required with modern devices\n"); + return -1; + } + + return 0; +} + static uint8_t modern_get_status(struct virtio_hw *hw) { @@ -540,6 +558,7 @@ const struct virtio_pci_ops modern_ops = { .set_status = modern_set_status, .get_features = modern_get_features, .set_features = modern_set_features, + .features_ok = modern_features_ok, .get_isr = modern_get_isr, .set_config_irq = modern_set_config_irq, .set_queue_irq = modern_set_queue_irq, diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index d1bed0ad59..ce43b40330 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -227,6 +227,7 @@ struct virtio_pci_ops { uint64_t (*get_features)(struct virtio_hw *hw); void (*set_features)(struct virtio_hw *hw, uint64_t features); + int (*features_ok)(struct virtio_hw *hw); uint8_t (*get_isr)(struct virtio_hw *hw); diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 3cbf310c03..bf958de571 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -327,6 +327,12 @@ virtio_user_set_features(struct virtio_hw *hw, uint64_t features) dev->features = features & dev->device_features; } +static int +virtio_user_features_ok(struct virtio_hw *hw __rte_unused) +{ + return 0; +} + static uint8_t virtio_user_get_isr(struct virtio_hw *hw __rte_unused) { @@ -479,6 +485,7 @@ const struct virtio_pci_ops virtio_user_ops = { .set_status = virtio_user_set_status, .get_features = virtio_user_get_features, .set_features = virtio_user_set_features, + .features_ok = virtio_user_features_ok, .get_isr = virtio_user_get_isr, .set_config_irq = virtio_user_set_config_irq, .set_queue_irq = virtio_user_set_queue_irq,