From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 353EBA09FD; Sun, 20 Dec 2020 22:20:19 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 33D10CD8C; Sun, 20 Dec 2020 22:15:37 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 1C887CD84 for ; Sun, 20 Dec 2020 22:15:35 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498933; 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=JbB84VtxI9smY7R9kyT4vSea1pJWCWPdkHWveKBrxcY=; b=eIwYhFOWuIosjnQqjLUPGvS9o+XOHYwjNHi1EYEFG0P+o/Euz+XZUSXSszN9yrd7p49xV9 wOhyROkMF1fGmLd6vLGtVaSw9liGQ9cOtx+WjjIBfy9BWnQwBVE0L4Vq4FmXAXe8QcXlyW pgu4KnDeQQ/YfKQqbptSiCI8mChyvkM= 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-216-3HzqDh6iNF63ro4tsDeA0g-1; Sun, 20 Dec 2020 16:15:31 -0500 X-MC-Unique: 3HzqDh6iNF63ro4tsDeA0g-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 9F70110054FF; Sun, 20 Dec 2020 21:15:30 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1137960C43; Sun, 20 Dec 2020 21:15:28 +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: Sun, 20 Dec 2020 22:13:44 +0100 Message-Id: <20201220211405.313012-20-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII" Subject: [dpdk-dev] [PATCH 19/40] net/virtio: move config definitions to generic header X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 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 --- drivers/net/virtio/virtio.c | 43 +++++++++++++++++++ drivers/net/virtio/virtio.h | 52 ++++++++++++++++++++++- 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 | 12 +++--- 6 files changed, 118 insertions(+), 124 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 eeeb5dba4f..5169436c9f 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 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; + struct virtio_hw { struct virtqueue **vqs; uint64_t guest_features; @@ -159,7 +203,7 @@ struct virtio_ops { /* * While virtio_hw is stored in shared memory, this structure stores * some infos that may vary in the multiple process model locally. - * For example, the vtpci_ops pointer. + * For example, the virtio_ops pointer. */ struct virtio_hw_internal { const struct virtio_ops *virtio_ops; @@ -183,5 +227,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 c9085f2f35..560647f11b 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 { @@ -1298,7 +1298,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)); @@ -1321,9 +1321,9 @@ virtio_ethdev_negotiate_features(struct virtio_hw *hw, uint64_t req_features) } 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; } @@ -1455,7 +1455,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) { @@ -1637,7 +1637,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); @@ -1645,10 +1645,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; @@ -1683,10 +1683,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; @@ -1700,12 +1700,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 { @@ -1715,7 +1715,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)); @@ -1728,7 +1728,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)); @@ -1780,7 +1780,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) } } - vtpci_reinit_complete(hw); + virtio_reinit_complete(hw); return 0; } @@ -2352,7 +2352,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 9c07ebad00..29dd84888f 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -533,50 +533,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 249f9754cc..19d56c920c 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 */ @@ -136,32 +117,6 @@ struct virtio_pci_dev { #define virtio_pci_get_dev(hw) container_of(hw, 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. @@ -182,16 +137,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 d05613ba3b..0f252c0732 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -77,13 +77,13 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev) return -1; dev->vhostfd = connectfd; - old_status = vtpci_get_status(hw); + old_status = virtio_get_status(hw); - 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; -- 2.29.2