1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0 OR MIT) 2*4882a593Smuzhiyun * Google virtual Ethernet (gve) driver 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2015-2019 Google, Inc. 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef _GVE_ADMINQ_H 8*4882a593Smuzhiyun #define _GVE_ADMINQ_H 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <linux/build_bug.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* Admin queue opcodes */ 13*4882a593Smuzhiyun enum gve_adminq_opcodes { 14*4882a593Smuzhiyun GVE_ADMINQ_DESCRIBE_DEVICE = 0x1, 15*4882a593Smuzhiyun GVE_ADMINQ_CONFIGURE_DEVICE_RESOURCES = 0x2, 16*4882a593Smuzhiyun GVE_ADMINQ_REGISTER_PAGE_LIST = 0x3, 17*4882a593Smuzhiyun GVE_ADMINQ_UNREGISTER_PAGE_LIST = 0x4, 18*4882a593Smuzhiyun GVE_ADMINQ_CREATE_TX_QUEUE = 0x5, 19*4882a593Smuzhiyun GVE_ADMINQ_CREATE_RX_QUEUE = 0x6, 20*4882a593Smuzhiyun GVE_ADMINQ_DESTROY_TX_QUEUE = 0x7, 21*4882a593Smuzhiyun GVE_ADMINQ_DESTROY_RX_QUEUE = 0x8, 22*4882a593Smuzhiyun GVE_ADMINQ_DECONFIGURE_DEVICE_RESOURCES = 0x9, 23*4882a593Smuzhiyun GVE_ADMINQ_SET_DRIVER_PARAMETER = 0xB, 24*4882a593Smuzhiyun GVE_ADMINQ_REPORT_STATS = 0xC, 25*4882a593Smuzhiyun GVE_ADMINQ_REPORT_LINK_SPEED = 0xD 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /* Admin queue status codes */ 29*4882a593Smuzhiyun enum gve_adminq_statuses { 30*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_UNSET = 0x0, 31*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_PASSED = 0x1, 32*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_ABORTED = 0xFFFFFFF0, 33*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_ALREADY_EXISTS = 0xFFFFFFF1, 34*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_CANCELLED = 0xFFFFFFF2, 35*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_DATALOSS = 0xFFFFFFF3, 36*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_DEADLINE_EXCEEDED = 0xFFFFFFF4, 37*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_FAILED_PRECONDITION = 0xFFFFFFF5, 38*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_INTERNAL_ERROR = 0xFFFFFFF6, 39*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_INVALID_ARGUMENT = 0xFFFFFFF7, 40*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_NOT_FOUND = 0xFFFFFFF8, 41*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_OUT_OF_RANGE = 0xFFFFFFF9, 42*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_PERMISSION_DENIED = 0xFFFFFFFA, 43*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_UNAUTHENTICATED = 0xFFFFFFFB, 44*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_RESOURCE_EXHAUSTED = 0xFFFFFFFC, 45*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_UNAVAILABLE = 0xFFFFFFFD, 46*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_UNIMPLEMENTED = 0xFFFFFFFE, 47*4882a593Smuzhiyun GVE_ADMINQ_COMMAND_ERROR_UNKNOWN_ERROR = 0xFFFFFFFF, 48*4882a593Smuzhiyun }; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #define GVE_ADMINQ_DEVICE_DESCRIPTOR_VERSION 1 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* All AdminQ command structs should be naturally packed. The static_assert 53*4882a593Smuzhiyun * calls make sure this is the case at compile time. 54*4882a593Smuzhiyun */ 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun struct gve_adminq_describe_device { 57*4882a593Smuzhiyun __be64 device_descriptor_addr; 58*4882a593Smuzhiyun __be32 device_descriptor_version; 59*4882a593Smuzhiyun __be32 available_length; 60*4882a593Smuzhiyun }; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun static_assert(sizeof(struct gve_adminq_describe_device) == 16); 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun struct gve_device_descriptor { 65*4882a593Smuzhiyun __be64 max_registered_pages; 66*4882a593Smuzhiyun __be16 reserved1; 67*4882a593Smuzhiyun __be16 tx_queue_entries; 68*4882a593Smuzhiyun __be16 rx_queue_entries; 69*4882a593Smuzhiyun __be16 default_num_queues; 70*4882a593Smuzhiyun __be16 mtu; 71*4882a593Smuzhiyun __be16 counters; 72*4882a593Smuzhiyun __be16 tx_pages_per_qpl; 73*4882a593Smuzhiyun __be16 rx_pages_per_qpl; 74*4882a593Smuzhiyun u8 mac[ETH_ALEN]; 75*4882a593Smuzhiyun __be16 num_device_options; 76*4882a593Smuzhiyun __be16 total_length; 77*4882a593Smuzhiyun u8 reserved2[6]; 78*4882a593Smuzhiyun }; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun static_assert(sizeof(struct gve_device_descriptor) == 40); 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun struct device_option { 83*4882a593Smuzhiyun __be32 option_id; 84*4882a593Smuzhiyun __be32 option_length; 85*4882a593Smuzhiyun }; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun static_assert(sizeof(struct device_option) == 8); 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun struct gve_adminq_configure_device_resources { 90*4882a593Smuzhiyun __be64 counter_array; 91*4882a593Smuzhiyun __be64 irq_db_addr; 92*4882a593Smuzhiyun __be32 num_counters; 93*4882a593Smuzhiyun __be32 num_irq_dbs; 94*4882a593Smuzhiyun __be32 irq_db_stride; 95*4882a593Smuzhiyun __be32 ntfy_blk_msix_base_idx; 96*4882a593Smuzhiyun }; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun static_assert(sizeof(struct gve_adminq_configure_device_resources) == 32); 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun struct gve_adminq_register_page_list { 101*4882a593Smuzhiyun __be32 page_list_id; 102*4882a593Smuzhiyun __be32 num_pages; 103*4882a593Smuzhiyun __be64 page_address_list_addr; 104*4882a593Smuzhiyun }; 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun static_assert(sizeof(struct gve_adminq_register_page_list) == 16); 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun struct gve_adminq_unregister_page_list { 109*4882a593Smuzhiyun __be32 page_list_id; 110*4882a593Smuzhiyun }; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun static_assert(sizeof(struct gve_adminq_unregister_page_list) == 4); 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun struct gve_adminq_create_tx_queue { 115*4882a593Smuzhiyun __be32 queue_id; 116*4882a593Smuzhiyun __be32 reserved; 117*4882a593Smuzhiyun __be64 queue_resources_addr; 118*4882a593Smuzhiyun __be64 tx_ring_addr; 119*4882a593Smuzhiyun __be32 queue_page_list_id; 120*4882a593Smuzhiyun __be32 ntfy_id; 121*4882a593Smuzhiyun }; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun static_assert(sizeof(struct gve_adminq_create_tx_queue) == 32); 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun struct gve_adminq_create_rx_queue { 126*4882a593Smuzhiyun __be32 queue_id; 127*4882a593Smuzhiyun __be32 index; 128*4882a593Smuzhiyun __be32 reserved; 129*4882a593Smuzhiyun __be32 ntfy_id; 130*4882a593Smuzhiyun __be64 queue_resources_addr; 131*4882a593Smuzhiyun __be64 rx_desc_ring_addr; 132*4882a593Smuzhiyun __be64 rx_data_ring_addr; 133*4882a593Smuzhiyun __be32 queue_page_list_id; 134*4882a593Smuzhiyun u8 padding[4]; 135*4882a593Smuzhiyun }; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun static_assert(sizeof(struct gve_adminq_create_rx_queue) == 48); 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun /* Queue resources that are shared with the device */ 140*4882a593Smuzhiyun struct gve_queue_resources { 141*4882a593Smuzhiyun union { 142*4882a593Smuzhiyun struct { 143*4882a593Smuzhiyun __be32 db_index; /* Device -> Guest */ 144*4882a593Smuzhiyun __be32 counter_index; /* Device -> Guest */ 145*4882a593Smuzhiyun }; 146*4882a593Smuzhiyun u8 reserved[64]; 147*4882a593Smuzhiyun }; 148*4882a593Smuzhiyun }; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun static_assert(sizeof(struct gve_queue_resources) == 64); 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun struct gve_adminq_destroy_tx_queue { 153*4882a593Smuzhiyun __be32 queue_id; 154*4882a593Smuzhiyun }; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun static_assert(sizeof(struct gve_adminq_destroy_tx_queue) == 4); 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun struct gve_adminq_destroy_rx_queue { 159*4882a593Smuzhiyun __be32 queue_id; 160*4882a593Smuzhiyun }; 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun static_assert(sizeof(struct gve_adminq_destroy_rx_queue) == 4); 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun /* GVE Set Driver Parameter Types */ 165*4882a593Smuzhiyun enum gve_set_driver_param_types { 166*4882a593Smuzhiyun GVE_SET_PARAM_MTU = 0x1, 167*4882a593Smuzhiyun }; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun struct gve_adminq_set_driver_parameter { 170*4882a593Smuzhiyun __be32 parameter_type; 171*4882a593Smuzhiyun u8 reserved[4]; 172*4882a593Smuzhiyun __be64 parameter_value; 173*4882a593Smuzhiyun }; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun static_assert(sizeof(struct gve_adminq_set_driver_parameter) == 16); 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun struct gve_adminq_report_stats { 178*4882a593Smuzhiyun __be64 stats_report_len; 179*4882a593Smuzhiyun __be64 stats_report_addr; 180*4882a593Smuzhiyun __be64 interval; 181*4882a593Smuzhiyun }; 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun static_assert(sizeof(struct gve_adminq_report_stats) == 24); 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun struct gve_adminq_report_link_speed { 186*4882a593Smuzhiyun __be64 link_speed_address; 187*4882a593Smuzhiyun }; 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun static_assert(sizeof(struct gve_adminq_report_link_speed) == 8); 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun struct stats { 192*4882a593Smuzhiyun __be32 stat_name; 193*4882a593Smuzhiyun __be32 queue_id; 194*4882a593Smuzhiyun __be64 value; 195*4882a593Smuzhiyun }; 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun static_assert(sizeof(struct stats) == 16); 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun struct gve_stats_report { 200*4882a593Smuzhiyun __be64 written_count; 201*4882a593Smuzhiyun struct stats stats[]; 202*4882a593Smuzhiyun }; 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun static_assert(sizeof(struct gve_stats_report) == 8); 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun enum gve_stat_names { 207*4882a593Smuzhiyun // stats from gve 208*4882a593Smuzhiyun TX_WAKE_CNT = 1, 209*4882a593Smuzhiyun TX_STOP_CNT = 2, 210*4882a593Smuzhiyun TX_FRAMES_SENT = 3, 211*4882a593Smuzhiyun TX_BYTES_SENT = 4, 212*4882a593Smuzhiyun TX_LAST_COMPLETION_PROCESSED = 5, 213*4882a593Smuzhiyun RX_NEXT_EXPECTED_SEQUENCE = 6, 214*4882a593Smuzhiyun RX_BUFFERS_POSTED = 7, 215*4882a593Smuzhiyun TX_TIMEOUT_CNT = 8, 216*4882a593Smuzhiyun // stats from NIC 217*4882a593Smuzhiyun RX_QUEUE_DROP_CNT = 65, 218*4882a593Smuzhiyun RX_NO_BUFFERS_POSTED = 66, 219*4882a593Smuzhiyun RX_DROPS_PACKET_OVER_MRU = 67, 220*4882a593Smuzhiyun RX_DROPS_INVALID_CHECKSUM = 68, 221*4882a593Smuzhiyun }; 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun union gve_adminq_command { 224*4882a593Smuzhiyun struct { 225*4882a593Smuzhiyun __be32 opcode; 226*4882a593Smuzhiyun __be32 status; 227*4882a593Smuzhiyun union { 228*4882a593Smuzhiyun struct gve_adminq_configure_device_resources 229*4882a593Smuzhiyun configure_device_resources; 230*4882a593Smuzhiyun struct gve_adminq_create_tx_queue create_tx_queue; 231*4882a593Smuzhiyun struct gve_adminq_create_rx_queue create_rx_queue; 232*4882a593Smuzhiyun struct gve_adminq_destroy_tx_queue destroy_tx_queue; 233*4882a593Smuzhiyun struct gve_adminq_destroy_rx_queue destroy_rx_queue; 234*4882a593Smuzhiyun struct gve_adminq_describe_device describe_device; 235*4882a593Smuzhiyun struct gve_adminq_register_page_list reg_page_list; 236*4882a593Smuzhiyun struct gve_adminq_unregister_page_list unreg_page_list; 237*4882a593Smuzhiyun struct gve_adminq_set_driver_parameter set_driver_param; 238*4882a593Smuzhiyun struct gve_adminq_report_stats report_stats; 239*4882a593Smuzhiyun struct gve_adminq_report_link_speed report_link_speed; 240*4882a593Smuzhiyun }; 241*4882a593Smuzhiyun }; 242*4882a593Smuzhiyun u8 reserved[64]; 243*4882a593Smuzhiyun }; 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun static_assert(sizeof(union gve_adminq_command) == 64); 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun int gve_adminq_alloc(struct device *dev, struct gve_priv *priv); 248*4882a593Smuzhiyun void gve_adminq_free(struct device *dev, struct gve_priv *priv); 249*4882a593Smuzhiyun void gve_adminq_release(struct gve_priv *priv); 250*4882a593Smuzhiyun int gve_adminq_describe_device(struct gve_priv *priv); 251*4882a593Smuzhiyun int gve_adminq_configure_device_resources(struct gve_priv *priv, 252*4882a593Smuzhiyun dma_addr_t counter_array_bus_addr, 253*4882a593Smuzhiyun u32 num_counters, 254*4882a593Smuzhiyun dma_addr_t db_array_bus_addr, 255*4882a593Smuzhiyun u32 num_ntfy_blks); 256*4882a593Smuzhiyun int gve_adminq_deconfigure_device_resources(struct gve_priv *priv); 257*4882a593Smuzhiyun int gve_adminq_create_tx_queues(struct gve_priv *priv, u32 num_queues); 258*4882a593Smuzhiyun int gve_adminq_destroy_tx_queues(struct gve_priv *priv, u32 queue_id); 259*4882a593Smuzhiyun int gve_adminq_create_rx_queues(struct gve_priv *priv, u32 num_queues); 260*4882a593Smuzhiyun int gve_adminq_destroy_rx_queues(struct gve_priv *priv, u32 queue_id); 261*4882a593Smuzhiyun int gve_adminq_register_page_list(struct gve_priv *priv, 262*4882a593Smuzhiyun struct gve_queue_page_list *qpl); 263*4882a593Smuzhiyun int gve_adminq_unregister_page_list(struct gve_priv *priv, u32 page_list_id); 264*4882a593Smuzhiyun int gve_adminq_set_mtu(struct gve_priv *priv, u64 mtu); 265*4882a593Smuzhiyun int gve_adminq_report_stats(struct gve_priv *priv, u64 stats_report_len, 266*4882a593Smuzhiyun dma_addr_t stats_report_addr, u64 interval); 267*4882a593Smuzhiyun int gve_adminq_report_link_speed(struct gve_priv *priv); 268*4882a593Smuzhiyun #endif /* _GVE_ADMINQ_H */ 269