> -----Original Message----- > From: Maxime Coquelin <maxime.coque...@redhat.com> > Sent: Monday, December 21, 2020 5:14 AM > To: dev@dpdk.org; Xia, Chenbo <chenbo....@intel.com>; olivier.m...@6wind.com; > amore...@redhat.com; david.march...@redhat.com > Cc: Maxime Coquelin <maxime.coque...@redhat.com> > Subject: [PATCH 19/40] net/virtio: move config definitions to generic header > > This patch moves config and status definitions from the PCI > header to the generic one. > > Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com> > --- > 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
Reviewed-by: Chenbo Xia <chenbo....@intel.com>