From patchwork Tue Jan 19 21:24:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 86918 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 8D1BEA0A05; Tue, 19 Jan 2021 22:28:51 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C0CC2140F09; Tue, 19 Jan 2021 22:27:20 +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 17271140EDC for ; Tue, 19 Jan 2021 22:27:18 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1611091637; 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=VDaJWd0DFdDJcA9ZpsoIUgjS7QM9mUzQY0IOs84O5dA=; b=UkVy4WE3f/aemrN/eDeEEp8nnTgZWr97HUcxrF3yPrVqpvQHd7fEioGnYXnkunuW8/ydmL 8LppB2DsC7z+5ioKSNnkSWttkiDsp19RaZkHqxPXqsC7F1DS7TevOEVuSG95ip87R3EbeI x+yoLfvervEnAghXrA8JJc/d2PKSyeo= 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-566-MvJ_N1TqM2CtlMtDn9TgHg-1; Tue, 19 Jan 2021 16:27:13 -0500 X-MC-Unique: MvJ_N1TqM2CtlMtDn9TgHg-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 CCC1210054FF; Tue, 19 Jan 2021 21:27:12 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.29]) by smtp.corp.redhat.com (Postfix) with ESMTP id CD28D5D9DD; Tue, 19 Jan 2021 21:27:07 +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:44 +0100 Message-Id: <20210119212507.1043636-22-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 21/44] net/virtio: move config definitions to generic header 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 moves config and status definitions from the PCI header to the generic one. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- drivers/net/virtio/virtio.c | 43 +++++++++++++++++++ drivers/net/virtio/virtio.h | 50 ++++++++++++++++++++++ drivers/net/virtio/virtio_ethdev.c | 36 ++++++++-------- drivers/net/virtio/virtio_pci.c | 44 -------------------- drivers/net/virtio/virtio_pci.h | 55 ------------------------- drivers/net/virtio/virtio_user_ethdev.c | 10 ++--- 6 files changed, 116 insertions(+), 122 deletions(-) diff --git a/drivers/net/virtio/virtio.c b/drivers/net/virtio/virtio.c index d8d6bf7add..ba3203e68b 100644 --- a/drivers/net/virtio/virtio.c +++ b/drivers/net/virtio/virtio.c @@ -20,3 +20,46 @@ virtio_negotiate_features(struct virtio_hw *hw, uint64_t host_features) return features; } + +void +virtio_read_dev_config(struct virtio_hw *hw, size_t offset, + void *dst, int length) +{ + VIRTIO_OPS(hw)->read_dev_cfg(hw, offset, dst, length); +} + +void +virtio_write_dev_config(struct virtio_hw *hw, size_t offset, + const void *src, int length) +{ + VIRTIO_OPS(hw)->write_dev_cfg(hw, offset, src, length); +} + +void +virtio_reset(struct virtio_hw *hw) +{ + VIRTIO_OPS(hw)->set_status(hw, VIRTIO_CONFIG_STATUS_RESET); + /* flush status write */ + VIRTIO_OPS(hw)->get_status(hw); +} + +void +virtio_reinit_complete(struct virtio_hw *hw) +{ + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER_OK); +} + +void +virtio_set_status(struct virtio_hw *hw, uint8_t status) +{ + if (status != VIRTIO_CONFIG_STATUS_RESET) + status |= VIRTIO_OPS(hw)->get_status(hw); + + VIRTIO_OPS(hw)->set_status(hw, status); +} + +uint8_t +virtio_get_status(struct virtio_hw *hw) +{ + return VIRTIO_OPS(hw)->get_status(hw); +} diff --git a/drivers/net/virtio/virtio.h b/drivers/net/virtio/virtio.h index cfd2913420..81eaff23ce 100644 --- a/drivers/net/virtio/virtio.h +++ b/drivers/net/virtio/virtio.h @@ -106,6 +106,50 @@ #define VIRTIO_MAX_VIRTQUEUE_PAIRS 8 #define VIRTIO_MAX_VIRTQUEUES (VIRTIO_MAX_VIRTQUEUE_PAIRS * 2 + 1) +/* VirtIO device IDs. */ +#define VIRTIO_ID_NETWORK 0x01 +#define VIRTIO_ID_BLOCK 0x02 +#define VIRTIO_ID_CONSOLE 0x03 +#define VIRTIO_ID_ENTROPY 0x04 +#define VIRTIO_ID_BALLOON 0x05 +#define VIRTIO_ID_IOMEMORY 0x06 +#define VIRTIO_ID_9P 0x09 + +/* Status byte for guest to report progress. */ +#define VIRTIO_CONFIG_STATUS_RESET 0x00 +#define VIRTIO_CONFIG_STATUS_ACK 0x01 +#define VIRTIO_CONFIG_STATUS_DRIVER 0x02 +#define VIRTIO_CONFIG_STATUS_DRIVER_OK 0x04 +#define VIRTIO_CONFIG_STATUS_FEATURES_OK 0x08 +#define VIRTIO_CONFIG_STATUS_DEV_NEED_RESET 0x40 +#define VIRTIO_CONFIG_STATUS_FAILED 0x80 + +/* + * This structure is just a reference to read net device specific + * config space; it is just a shadow structure. + * + */ +struct virtio_net_config { + /* The config defining mac address (if VIRTIO_NET_F_MAC) */ + uint8_t mac[RTE_ETHER_ADDR_LEN]; + /* See VIRTIO_NET_F_STATUS and VIRTIO_NET_S_* above */ + uint16_t status; + uint16_t max_virtqueue_pairs; + uint16_t mtu; + /* + * speed, in units of 1Mb. All values 0 to INT_MAX are legal. + * Any other value stands for unknown. + */ + uint32_t speed; + /* + * 0x00 - half duplex + * 0x01 - full duplex + * Any other value stands for unknown. + */ + uint8_t duplex; + +} __rte_packed; + struct virtio_hw { struct virtqueue **vqs; uint64_t guest_features; @@ -182,5 +226,11 @@ virtio_with_packed_queue(struct virtio_hw *hw) } uint64_t virtio_negotiate_features(struct virtio_hw *hw, uint64_t host_features); +uint8_t virtio_get_status(struct virtio_hw *hw); +void virtio_set_status(struct virtio_hw *hw, uint8_t status); +void virtio_write_dev_config(struct virtio_hw *hw, size_t offset, const void *src, int length); +void virtio_read_dev_config(struct virtio_hw *hw, size_t offset, void *dst, int length); +void virtio_reset(struct virtio_hw *hw); +void virtio_reinit_complete(struct virtio_hw *hw); #endif /* _VIRTIO_H_ */ diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index ea81340997..aacc335a85 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -714,7 +714,7 @@ virtio_dev_close(struct rte_eth_dev *dev) dev->intr_handle->intr_vec = NULL; } - vtpci_reset(hw); + virtio_reset(hw); virtio_dev_free_mbufs(dev); virtio_free_queues(hw); @@ -1096,7 +1096,7 @@ virtio_dev_stats_reset(struct rte_eth_dev *dev) static void virtio_set_hwaddr(struct virtio_hw *hw) { - vtpci_write_dev_config(hw, + virtio_write_dev_config(hw, offsetof(struct virtio_net_config, mac), &hw->mac_addr, RTE_ETHER_ADDR_LEN); } @@ -1105,7 +1105,7 @@ static void virtio_get_hwaddr(struct virtio_hw *hw) { if (virtio_with_feature(hw, VIRTIO_NET_F_MAC)) { - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, mac), &hw->mac_addr, RTE_ETHER_ADDR_LEN); } else { @@ -1313,7 +1313,7 @@ virtio_ethdev_negotiate_features(struct virtio_hw *hw, uint64_t req_features) if (host_features & req_features & (1ULL << VIRTIO_NET_F_MTU)) { struct virtio_net_config config; - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, mtu), &config.mtu, sizeof(config.mtu)); @@ -1334,9 +1334,9 @@ virtio_ethdev_negotiate_features(struct virtio_hw *hw, uint64_t req_features) return -1; if (virtio_with_feature(hw, VIRTIO_F_VERSION_1)) { - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK); + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK); - if (!(vtpci_get_status(hw) & VIRTIO_CONFIG_STATUS_FEATURES_OK)) { + if (!(virtio_get_status(hw) & VIRTIO_CONFIG_STATUS_FEATURES_OK)) { PMD_INIT_LOG(ERR, "Failed to set FEATURES_OK status!"); return -1; } @@ -1468,7 +1468,7 @@ virtio_interrupt_handler(void *param) NULL); if (virtio_with_feature(hw, VIRTIO_NET_F_STATUS)) { - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, status), &status, sizeof(status)); if (status & VIRTIO_NET_S_ANNOUNCE) { @@ -1650,7 +1650,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) int ret; /* Reset the device although not necessary at startup */ - vtpci_reset(hw); + virtio_reset(hw); if (hw->vqs) { virtio_dev_free_mbufs(eth_dev); @@ -1658,10 +1658,10 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) } /* Tell the host we've noticed this device. */ - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_ACK); + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_ACK); /* Tell the host we've known how to drive the device. */ - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER); + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER); if (virtio_ethdev_negotiate_features(hw, req_features) < 0) return -1; @@ -1696,10 +1696,10 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) if (hw->speed == ETH_SPEED_NUM_UNKNOWN) { if (virtio_with_feature(hw, VIRTIO_NET_F_SPEED_DUPLEX)) { config = &local_config; - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, speed), &config->speed, sizeof(config->speed)); - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, duplex), &config->duplex, sizeof(config->duplex)); hw->speed = config->speed; @@ -1713,12 +1713,12 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) if (virtio_with_feature(hw, VIRTIO_NET_F_CTRL_VQ)) { config = &local_config; - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, mac), &config->mac, sizeof(config->mac)); if (virtio_with_feature(hw, VIRTIO_NET_F_STATUS)) { - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, status), &config->status, sizeof(config->status)); } else { @@ -1728,7 +1728,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) } if (virtio_with_feature(hw, VIRTIO_NET_F_MQ)) { - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, max_virtqueue_pairs), &config->max_virtqueue_pairs, sizeof(config->max_virtqueue_pairs)); @@ -1741,7 +1741,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) hw->max_queue_pairs = config->max_virtqueue_pairs; if (virtio_with_feature(hw, VIRTIO_NET_F_MTU)) { - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, mtu), &config->mtu, sizeof(config->mtu)); @@ -1793,7 +1793,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) } } - vtpci_reinit_complete(hw); + virtio_reinit_complete(hw); return 0; } @@ -2374,7 +2374,7 @@ virtio_dev_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_complet link.link_speed = ETH_SPEED_NUM_NONE; } else if (virtio_with_feature(hw, VIRTIO_NET_F_STATUS)) { PMD_INIT_LOG(DEBUG, "Get link status from hw"); - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, status), &status, sizeof(status)); if ((status & VIRTIO_NET_S_LINK_UP) == 0) { diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index 760d404a5a..b5748a3441 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -603,50 +603,6 @@ const struct virtio_ops modern_ops = { .dev_close = modern_dev_close, }; - -void -vtpci_read_dev_config(struct virtio_hw *hw, size_t offset, - void *dst, int length) -{ - VIRTIO_OPS(hw)->read_dev_cfg(hw, offset, dst, length); -} - -void -vtpci_write_dev_config(struct virtio_hw *hw, size_t offset, - const void *src, int length) -{ - VIRTIO_OPS(hw)->write_dev_cfg(hw, offset, src, length); -} - -void -vtpci_reset(struct virtio_hw *hw) -{ - VIRTIO_OPS(hw)->set_status(hw, VIRTIO_CONFIG_STATUS_RESET); - /* flush status write */ - VIRTIO_OPS(hw)->get_status(hw); -} - -void -vtpci_reinit_complete(struct virtio_hw *hw) -{ - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER_OK); -} - -void -vtpci_set_status(struct virtio_hw *hw, uint8_t status) -{ - if (status != VIRTIO_CONFIG_STATUS_RESET) - status |= VIRTIO_OPS(hw)->get_status(hw); - - VIRTIO_OPS(hw)->set_status(hw, status); -} - -uint8_t -vtpci_get_status(struct virtio_hw *hw) -{ - return VIRTIO_OPS(hw)->get_status(hw); -} - uint8_t vtpci_isr(struct virtio_hw *hw) { diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index 2c27c906fb..cc1a3a37fd 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -49,25 +49,6 @@ struct virtnet_ctl; /* Vector value used to disable MSI for queue. */ #define VIRTIO_MSI_NO_VECTOR 0xFFFF -/* VirtIO device IDs. */ -#define VIRTIO_ID_NETWORK 0x01 -#define VIRTIO_ID_BLOCK 0x02 -#define VIRTIO_ID_CONSOLE 0x03 -#define VIRTIO_ID_ENTROPY 0x04 -#define VIRTIO_ID_BALLOON 0x05 -#define VIRTIO_ID_IOMEMORY 0x06 -#define VIRTIO_ID_9P 0x09 - -/* Status byte for guest to report progress. */ -#define VIRTIO_CONFIG_STATUS_RESET 0x00 -#define VIRTIO_CONFIG_STATUS_ACK 0x01 -#define VIRTIO_CONFIG_STATUS_DRIVER 0x02 -#define VIRTIO_CONFIG_STATUS_DRIVER_OK 0x04 -#define VIRTIO_CONFIG_STATUS_FEATURES_OK 0x08 -#define VIRTIO_CONFIG_STATUS_DEV_NEED_RESET 0x40 -#define VIRTIO_CONFIG_STATUS_FAILED 0x80 - - /* Common configuration */ #define VIRTIO_PCI_CAP_COMMON_CFG 1 /* Notifications */ @@ -135,32 +116,6 @@ struct virtio_pci_dev { #define virtio_pci_get_dev(hwp) container_of(hwp, struct virtio_pci_dev, hw) -/* - * This structure is just a reference to read - * net device specific config space; it just a chodu structure - * - */ -struct virtio_net_config { - /* The config defining mac address (if VIRTIO_NET_F_MAC) */ - uint8_t mac[RTE_ETHER_ADDR_LEN]; - /* See VIRTIO_NET_F_STATUS and VIRTIO_NET_S_* above */ - uint16_t status; - uint16_t max_virtqueue_pairs; - uint16_t mtu; - /* - * speed, in units of 1Mb. All values 0 to INT_MAX are legal. - * Any other value stands for unknown. - */ - uint32_t speed; - /* - * 0x00 - half duplex - * 0x01 - full duplex - * Any other value stands for unknown. - */ - uint8_t duplex; - -} __rte_packed; - /* * How many bits to shift physical queue address written to QUEUE_PFN. * 12 is historical, and due to x86 page size. @@ -181,16 +136,6 @@ enum virtio_msix_status { * Function declaration from virtio_pci.c */ int vtpci_init(struct rte_pci_device *pci_dev, struct virtio_pci_dev *dev); -void vtpci_reset(struct virtio_hw *); - -void vtpci_reinit_complete(struct virtio_hw *); - -uint8_t vtpci_get_status(struct virtio_hw *); -void vtpci_set_status(struct virtio_hw *, uint8_t); - -void vtpci_write_dev_config(struct virtio_hw *, size_t, const void *, int); - -void vtpci_read_dev_config(struct virtio_hw *, size_t, void *, int); uint8_t vtpci_isr(struct virtio_hw *); diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 8e609333c6..6e59fe4b58 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -79,11 +79,11 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev) dev->vhostfd = connectfd; old_status = dev->status; - vtpci_reset(hw); + virtio_reset(hw); - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_ACK); + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_ACK); - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER); + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER); if (dev->ops->send_request(dev, VHOST_USER_GET_FEATURES, &dev->device_features) < 0) { @@ -129,10 +129,10 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev) virtio_user_reset_queues_packed(eth_dev); } - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK); + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK); /* Start the device */ - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER_OK); + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER_OK); if (!dev->started) return -1;