1893ce44dSCatherine Sullivan /* SPDX-License-Identifier: (GPL-2.0 OR MIT) 2893ce44dSCatherine Sullivan * Google virtual Ethernet (gve) driver 3893ce44dSCatherine Sullivan * 48a39d3e0SBailey Forrest * Copyright (C) 2015-2021 Google, Inc. 5893ce44dSCatherine Sullivan */ 6893ce44dSCatherine Sullivan 7893ce44dSCatherine Sullivan #ifndef _GVE_ADMINQ_H 8893ce44dSCatherine Sullivan #define _GVE_ADMINQ_H 9893ce44dSCatherine Sullivan 10893ce44dSCatherine Sullivan #include <linux/build_bug.h> 11893ce44dSCatherine Sullivan 12893ce44dSCatherine Sullivan /* Admin queue opcodes */ 13893ce44dSCatherine Sullivan enum gve_adminq_opcodes { 14893ce44dSCatherine Sullivan GVE_ADMINQ_DESCRIBE_DEVICE = 0x1, 15893ce44dSCatherine Sullivan GVE_ADMINQ_CONFIGURE_DEVICE_RESOURCES = 0x2, 16f5cedc84SCatherine Sullivan GVE_ADMINQ_REGISTER_PAGE_LIST = 0x3, 17f5cedc84SCatherine Sullivan GVE_ADMINQ_UNREGISTER_PAGE_LIST = 0x4, 18f5cedc84SCatherine Sullivan GVE_ADMINQ_CREATE_TX_QUEUE = 0x5, 19f5cedc84SCatherine Sullivan GVE_ADMINQ_CREATE_RX_QUEUE = 0x6, 20f5cedc84SCatherine Sullivan GVE_ADMINQ_DESTROY_TX_QUEUE = 0x7, 21f5cedc84SCatherine Sullivan GVE_ADMINQ_DESTROY_RX_QUEUE = 0x8, 22893ce44dSCatherine Sullivan GVE_ADMINQ_DECONFIGURE_DEVICE_RESOURCES = 0x9, 23893ce44dSCatherine Sullivan GVE_ADMINQ_SET_DRIVER_PARAMETER = 0xB, 2424aeb56fSKuo Zhao GVE_ADMINQ_REPORT_STATS = 0xC, 25c4b87ac8SBailey Forrest GVE_ADMINQ_REPORT_LINK_SPEED = 0xD, 26c4b87ac8SBailey Forrest GVE_ADMINQ_GET_PTYPE_MAP = 0xE, 27c2a0c3edSJeroen de Borst GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY = 0xF, 28893ce44dSCatherine Sullivan }; 29893ce44dSCatherine Sullivan 30893ce44dSCatherine Sullivan /* Admin queue status codes */ 31893ce44dSCatherine Sullivan enum gve_adminq_statuses { 32893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_UNSET = 0x0, 33893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_PASSED = 0x1, 34893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_ABORTED = 0xFFFFFFF0, 35893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_ALREADY_EXISTS = 0xFFFFFFF1, 36893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_CANCELLED = 0xFFFFFFF2, 37893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_DATALOSS = 0xFFFFFFF3, 38893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_DEADLINE_EXCEEDED = 0xFFFFFFF4, 39893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_FAILED_PRECONDITION = 0xFFFFFFF5, 40893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_INTERNAL_ERROR = 0xFFFFFFF6, 41893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_INVALID_ARGUMENT = 0xFFFFFFF7, 42893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_NOT_FOUND = 0xFFFFFFF8, 43893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_OUT_OF_RANGE = 0xFFFFFFF9, 44893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_PERMISSION_DENIED = 0xFFFFFFFA, 45893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_UNAUTHENTICATED = 0xFFFFFFFB, 46893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_RESOURCE_EXHAUSTED = 0xFFFFFFFC, 47893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_UNAVAILABLE = 0xFFFFFFFD, 48893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_UNIMPLEMENTED = 0xFFFFFFFE, 49893ce44dSCatherine Sullivan GVE_ADMINQ_COMMAND_ERROR_UNKNOWN_ERROR = 0xFFFFFFFF, 50893ce44dSCatherine Sullivan }; 51893ce44dSCatherine Sullivan 52893ce44dSCatherine Sullivan #define GVE_ADMINQ_DEVICE_DESCRIPTOR_VERSION 1 53893ce44dSCatherine Sullivan 54893ce44dSCatherine Sullivan /* All AdminQ command structs should be naturally packed. The static_assert 55893ce44dSCatherine Sullivan * calls make sure this is the case at compile time. 56893ce44dSCatherine Sullivan */ 57893ce44dSCatherine Sullivan 58893ce44dSCatherine Sullivan struct gve_adminq_describe_device { 59893ce44dSCatherine Sullivan __be64 device_descriptor_addr; 60893ce44dSCatherine Sullivan __be32 device_descriptor_version; 61893ce44dSCatherine Sullivan __be32 available_length; 62893ce44dSCatherine Sullivan }; 63893ce44dSCatherine Sullivan 64893ce44dSCatherine Sullivan static_assert(sizeof(struct gve_adminq_describe_device) == 16); 65893ce44dSCatherine Sullivan 66893ce44dSCatherine Sullivan struct gve_device_descriptor { 67893ce44dSCatherine Sullivan __be64 max_registered_pages; 68893ce44dSCatherine Sullivan __be16 reserved1; 69893ce44dSCatherine Sullivan __be16 tx_queue_entries; 70893ce44dSCatherine Sullivan __be16 rx_queue_entries; 71893ce44dSCatherine Sullivan __be16 default_num_queues; 72893ce44dSCatherine Sullivan __be16 mtu; 73893ce44dSCatherine Sullivan __be16 counters; 74893ce44dSCatherine Sullivan __be16 tx_pages_per_qpl; 75893ce44dSCatherine Sullivan __be16 rx_pages_per_qpl; 76893ce44dSCatherine Sullivan u8 mac[ETH_ALEN]; 77893ce44dSCatherine Sullivan __be16 num_device_options; 78893ce44dSCatherine Sullivan __be16 total_length; 79893ce44dSCatherine Sullivan u8 reserved2[6]; 80893ce44dSCatherine Sullivan }; 81893ce44dSCatherine Sullivan 82893ce44dSCatherine Sullivan static_assert(sizeof(struct gve_device_descriptor) == 40); 83893ce44dSCatherine Sullivan 844944db80SCatherine Sullivan struct gve_device_option { 854944db80SCatherine Sullivan __be16 option_id; 864944db80SCatherine Sullivan __be16 option_length; 878a39d3e0SBailey Forrest __be32 required_features_mask; 88893ce44dSCatherine Sullivan }; 89893ce44dSCatherine Sullivan 904944db80SCatherine Sullivan static_assert(sizeof(struct gve_device_option) == 8); 914944db80SCatherine Sullivan 928a39d3e0SBailey Forrest struct gve_device_option_gqi_rda { 938a39d3e0SBailey Forrest __be32 supported_features_mask; 948a39d3e0SBailey Forrest }; 958a39d3e0SBailey Forrest 968a39d3e0SBailey Forrest static_assert(sizeof(struct gve_device_option_gqi_rda) == 4); 978a39d3e0SBailey Forrest 988a39d3e0SBailey Forrest struct gve_device_option_gqi_qpl { 998a39d3e0SBailey Forrest __be32 supported_features_mask; 1008a39d3e0SBailey Forrest }; 1018a39d3e0SBailey Forrest 1028a39d3e0SBailey Forrest static_assert(sizeof(struct gve_device_option_gqi_qpl) == 4); 1038a39d3e0SBailey Forrest 1048a39d3e0SBailey Forrest struct gve_device_option_dqo_rda { 1058a39d3e0SBailey Forrest __be32 supported_features_mask; 1068a39d3e0SBailey Forrest __be16 tx_comp_ring_entries; 1078a39d3e0SBailey Forrest __be16 rx_buff_ring_entries; 1088a39d3e0SBailey Forrest }; 1098a39d3e0SBailey Forrest 1108a39d3e0SBailey Forrest static_assert(sizeof(struct gve_device_option_dqo_rda) == 8); 1118a39d3e0SBailey Forrest 112*66ce8e6bSRushil Gupta struct gve_device_option_dqo_qpl { 113*66ce8e6bSRushil Gupta __be32 supported_features_mask; 114*66ce8e6bSRushil Gupta __be16 tx_pages_per_qpl; 115*66ce8e6bSRushil Gupta __be16 rx_pages_per_qpl; 116*66ce8e6bSRushil Gupta }; 117*66ce8e6bSRushil Gupta 118*66ce8e6bSRushil Gupta static_assert(sizeof(struct gve_device_option_dqo_qpl) == 8); 119*66ce8e6bSRushil Gupta 120255489f5SShailend Chand struct gve_device_option_jumbo_frames { 121255489f5SShailend Chand __be32 supported_features_mask; 122255489f5SShailend Chand __be16 max_mtu; 123255489f5SShailend Chand u8 padding[2]; 124255489f5SShailend Chand }; 125255489f5SShailend Chand 126255489f5SShailend Chand static_assert(sizeof(struct gve_device_option_jumbo_frames) == 8); 127255489f5SShailend Chand 1288a39d3e0SBailey Forrest /* Terminology: 1298a39d3e0SBailey Forrest * 1308a39d3e0SBailey Forrest * RDA - Raw DMA Addressing - Buffers associated with SKBs are directly DMA 1318a39d3e0SBailey Forrest * mapped and read/updated by the device. 1328a39d3e0SBailey Forrest * 1338a39d3e0SBailey Forrest * QPL - Queue Page Lists - Driver uses bounce buffers which are DMA mapped with 1348a39d3e0SBailey Forrest * the device for read/write and data is copied from/to SKBs. 1358a39d3e0SBailey Forrest */ 1368a39d3e0SBailey Forrest enum gve_dev_opt_id { 1378a39d3e0SBailey Forrest GVE_DEV_OPT_ID_GQI_RAW_ADDRESSING = 0x1, 1388a39d3e0SBailey Forrest GVE_DEV_OPT_ID_GQI_RDA = 0x2, 1398a39d3e0SBailey Forrest GVE_DEV_OPT_ID_GQI_QPL = 0x3, 1408a39d3e0SBailey Forrest GVE_DEV_OPT_ID_DQO_RDA = 0x4, 141*66ce8e6bSRushil Gupta GVE_DEV_OPT_ID_DQO_QPL = 0x7, 142255489f5SShailend Chand GVE_DEV_OPT_ID_JUMBO_FRAMES = 0x8, 1438a39d3e0SBailey Forrest }; 1448a39d3e0SBailey Forrest 1458a39d3e0SBailey Forrest enum gve_dev_opt_req_feat_mask { 1468a39d3e0SBailey Forrest GVE_DEV_OPT_REQ_FEAT_MASK_GQI_RAW_ADDRESSING = 0x0, 1478a39d3e0SBailey Forrest GVE_DEV_OPT_REQ_FEAT_MASK_GQI_RDA = 0x0, 1488a39d3e0SBailey Forrest GVE_DEV_OPT_REQ_FEAT_MASK_GQI_QPL = 0x0, 1498a39d3e0SBailey Forrest GVE_DEV_OPT_REQ_FEAT_MASK_DQO_RDA = 0x0, 150255489f5SShailend Chand GVE_DEV_OPT_REQ_FEAT_MASK_JUMBO_FRAMES = 0x0, 151*66ce8e6bSRushil Gupta GVE_DEV_OPT_REQ_FEAT_MASK_DQO_QPL = 0x0, 152255489f5SShailend Chand }; 153255489f5SShailend Chand 154255489f5SShailend Chand enum gve_sup_feature_mask { 155255489f5SShailend Chand GVE_SUP_JUMBO_FRAMES_MASK = 1 << 2, 1568a39d3e0SBailey Forrest }; 1578a39d3e0SBailey Forrest 1588a39d3e0SBailey Forrest #define GVE_DEV_OPT_LEN_GQI_RAW_ADDRESSING 0x0 159893ce44dSCatherine Sullivan 160c2a0c3edSJeroen de Borst #define GVE_VERSION_STR_LEN 128 161c2a0c3edSJeroen de Borst 162c2a0c3edSJeroen de Borst enum gve_driver_capbility { 163c2a0c3edSJeroen de Borst gve_driver_capability_gqi_qpl = 0, 164c2a0c3edSJeroen de Borst gve_driver_capability_gqi_rda = 1, 165c2a0c3edSJeroen de Borst gve_driver_capability_dqo_qpl = 2, /* reserved for future use */ 166c2a0c3edSJeroen de Borst gve_driver_capability_dqo_rda = 3, 167a5affbd8SJeroen de Borst gve_driver_capability_alt_miss_compl = 4, 168c2a0c3edSJeroen de Borst }; 169c2a0c3edSJeroen de Borst 170c2a0c3edSJeroen de Borst #define GVE_CAP1(a) BIT((int)a) 171c2a0c3edSJeroen de Borst #define GVE_CAP2(a) BIT(((int)a) - 64) 172c2a0c3edSJeroen de Borst #define GVE_CAP3(a) BIT(((int)a) - 128) 173c2a0c3edSJeroen de Borst #define GVE_CAP4(a) BIT(((int)a) - 192) 174c2a0c3edSJeroen de Borst 175c2a0c3edSJeroen de Borst #define GVE_DRIVER_CAPABILITY_FLAGS1 \ 176c2a0c3edSJeroen de Borst (GVE_CAP1(gve_driver_capability_gqi_qpl) | \ 177c2a0c3edSJeroen de Borst GVE_CAP1(gve_driver_capability_gqi_rda) | \ 178a5affbd8SJeroen de Borst GVE_CAP1(gve_driver_capability_dqo_rda) | \ 179a5affbd8SJeroen de Borst GVE_CAP1(gve_driver_capability_alt_miss_compl)) 180c2a0c3edSJeroen de Borst 181c2a0c3edSJeroen de Borst #define GVE_DRIVER_CAPABILITY_FLAGS2 0x0 182c2a0c3edSJeroen de Borst #define GVE_DRIVER_CAPABILITY_FLAGS3 0x0 183c2a0c3edSJeroen de Borst #define GVE_DRIVER_CAPABILITY_FLAGS4 0x0 184c2a0c3edSJeroen de Borst 185c2a0c3edSJeroen de Borst struct gve_driver_info { 186c2a0c3edSJeroen de Borst u8 os_type; /* 0x01 = Linux */ 187c2a0c3edSJeroen de Borst u8 driver_major; 188c2a0c3edSJeroen de Borst u8 driver_minor; 189c2a0c3edSJeroen de Borst u8 driver_sub; 190c2a0c3edSJeroen de Borst __be32 os_version_major; 191c2a0c3edSJeroen de Borst __be32 os_version_minor; 192c2a0c3edSJeroen de Borst __be32 os_version_sub; 193c2a0c3edSJeroen de Borst __be64 driver_capability_flags[4]; 194c2a0c3edSJeroen de Borst u8 os_version_str1[GVE_VERSION_STR_LEN]; 195c2a0c3edSJeroen de Borst u8 os_version_str2[GVE_VERSION_STR_LEN]; 196c2a0c3edSJeroen de Borst }; 197c2a0c3edSJeroen de Borst 198c2a0c3edSJeroen de Borst struct gve_adminq_verify_driver_compatibility { 199c2a0c3edSJeroen de Borst __be64 driver_info_len; 200c2a0c3edSJeroen de Borst __be64 driver_info_addr; 201c2a0c3edSJeroen de Borst }; 202c2a0c3edSJeroen de Borst 203c2a0c3edSJeroen de Borst static_assert(sizeof(struct gve_adminq_verify_driver_compatibility) == 16); 204c2a0c3edSJeroen de Borst 205893ce44dSCatherine Sullivan struct gve_adminq_configure_device_resources { 206893ce44dSCatherine Sullivan __be64 counter_array; 207893ce44dSCatherine Sullivan __be64 irq_db_addr; 208893ce44dSCatherine Sullivan __be32 num_counters; 209893ce44dSCatherine Sullivan __be32 num_irq_dbs; 210893ce44dSCatherine Sullivan __be32 irq_db_stride; 211893ce44dSCatherine Sullivan __be32 ntfy_blk_msix_base_idx; 2121f6228e4SBailey Forrest u8 queue_format; 2131f6228e4SBailey Forrest u8 padding[7]; 214893ce44dSCatherine Sullivan }; 215893ce44dSCatherine Sullivan 2161f6228e4SBailey Forrest static_assert(sizeof(struct gve_adminq_configure_device_resources) == 40); 217893ce44dSCatherine Sullivan 218f5cedc84SCatherine Sullivan struct gve_adminq_register_page_list { 219f5cedc84SCatherine Sullivan __be32 page_list_id; 220f5cedc84SCatherine Sullivan __be32 num_pages; 221f5cedc84SCatherine Sullivan __be64 page_address_list_addr; 222f5cedc84SCatherine Sullivan }; 223f5cedc84SCatherine Sullivan 224f5cedc84SCatherine Sullivan static_assert(sizeof(struct gve_adminq_register_page_list) == 16); 225f5cedc84SCatherine Sullivan 226f5cedc84SCatherine Sullivan struct gve_adminq_unregister_page_list { 227f5cedc84SCatherine Sullivan __be32 page_list_id; 228f5cedc84SCatherine Sullivan }; 229f5cedc84SCatherine Sullivan 230f5cedc84SCatherine Sullivan static_assert(sizeof(struct gve_adminq_unregister_page_list) == 4); 231f5cedc84SCatherine Sullivan 2324944db80SCatherine Sullivan #define GVE_RAW_ADDRESSING_QPL_ID 0xFFFFFFFF 2334944db80SCatherine Sullivan 234f5cedc84SCatherine Sullivan struct gve_adminq_create_tx_queue { 235f5cedc84SCatherine Sullivan __be32 queue_id; 236f5cedc84SCatherine Sullivan __be32 reserved; 237f5cedc84SCatherine Sullivan __be64 queue_resources_addr; 238f5cedc84SCatherine Sullivan __be64 tx_ring_addr; 239f5cedc84SCatherine Sullivan __be32 queue_page_list_id; 240f5cedc84SCatherine Sullivan __be32 ntfy_id; 2411f6228e4SBailey Forrest __be64 tx_comp_ring_addr; 2421f6228e4SBailey Forrest __be16 tx_ring_size; 2431f6228e4SBailey Forrest __be16 tx_comp_ring_size; 2441f6228e4SBailey Forrest u8 padding[4]; 245f5cedc84SCatherine Sullivan }; 246f5cedc84SCatherine Sullivan 2471f6228e4SBailey Forrest static_assert(sizeof(struct gve_adminq_create_tx_queue) == 48); 248f5cedc84SCatherine Sullivan 249f5cedc84SCatherine Sullivan struct gve_adminq_create_rx_queue { 250f5cedc84SCatherine Sullivan __be32 queue_id; 251f5cedc84SCatherine Sullivan __be32 index; 252f5cedc84SCatherine Sullivan __be32 reserved; 253f5cedc84SCatherine Sullivan __be32 ntfy_id; 254f5cedc84SCatherine Sullivan __be64 queue_resources_addr; 255f5cedc84SCatherine Sullivan __be64 rx_desc_ring_addr; 256f5cedc84SCatherine Sullivan __be64 rx_data_ring_addr; 257f5cedc84SCatherine Sullivan __be32 queue_page_list_id; 2581f6228e4SBailey Forrest __be16 rx_ring_size; 2591f6228e4SBailey Forrest __be16 packet_buffer_size; 2601f6228e4SBailey Forrest __be16 rx_buff_ring_size; 2611f6228e4SBailey Forrest u8 enable_rsc; 2621f6228e4SBailey Forrest u8 padding[5]; 263f5cedc84SCatherine Sullivan }; 264f5cedc84SCatherine Sullivan 2651f6228e4SBailey Forrest static_assert(sizeof(struct gve_adminq_create_rx_queue) == 56); 266f5cedc84SCatherine Sullivan 267f5cedc84SCatherine Sullivan /* Queue resources that are shared with the device */ 268f5cedc84SCatherine Sullivan struct gve_queue_resources { 269f5cedc84SCatherine Sullivan union { 270f5cedc84SCatherine Sullivan struct { 271f5cedc84SCatherine Sullivan __be32 db_index; /* Device -> Guest */ 272f5cedc84SCatherine Sullivan __be32 counter_index; /* Device -> Guest */ 273f5cedc84SCatherine Sullivan }; 274f5cedc84SCatherine Sullivan u8 reserved[64]; 275f5cedc84SCatherine Sullivan }; 276f5cedc84SCatherine Sullivan }; 277f5cedc84SCatherine Sullivan 278f5cedc84SCatherine Sullivan static_assert(sizeof(struct gve_queue_resources) == 64); 279f5cedc84SCatherine Sullivan 280f5cedc84SCatherine Sullivan struct gve_adminq_destroy_tx_queue { 281f5cedc84SCatherine Sullivan __be32 queue_id; 282f5cedc84SCatherine Sullivan }; 283f5cedc84SCatherine Sullivan 284f5cedc84SCatherine Sullivan static_assert(sizeof(struct gve_adminq_destroy_tx_queue) == 4); 285f5cedc84SCatherine Sullivan 286f5cedc84SCatherine Sullivan struct gve_adminq_destroy_rx_queue { 287f5cedc84SCatherine Sullivan __be32 queue_id; 288f5cedc84SCatherine Sullivan }; 289f5cedc84SCatherine Sullivan 290f5cedc84SCatherine Sullivan static_assert(sizeof(struct gve_adminq_destroy_rx_queue) == 4); 291f5cedc84SCatherine Sullivan 292893ce44dSCatherine Sullivan /* GVE Set Driver Parameter Types */ 293893ce44dSCatherine Sullivan enum gve_set_driver_param_types { 294893ce44dSCatherine Sullivan GVE_SET_PARAM_MTU = 0x1, 295893ce44dSCatherine Sullivan }; 296893ce44dSCatherine Sullivan 297893ce44dSCatherine Sullivan struct gve_adminq_set_driver_parameter { 298893ce44dSCatherine Sullivan __be32 parameter_type; 299893ce44dSCatherine Sullivan u8 reserved[4]; 300893ce44dSCatherine Sullivan __be64 parameter_value; 301893ce44dSCatherine Sullivan }; 302893ce44dSCatherine Sullivan 303893ce44dSCatherine Sullivan static_assert(sizeof(struct gve_adminq_set_driver_parameter) == 16); 304893ce44dSCatherine Sullivan 30524aeb56fSKuo Zhao struct gve_adminq_report_stats { 30624aeb56fSKuo Zhao __be64 stats_report_len; 30724aeb56fSKuo Zhao __be64 stats_report_addr; 30824aeb56fSKuo Zhao __be64 interval; 30924aeb56fSKuo Zhao }; 31024aeb56fSKuo Zhao 31124aeb56fSKuo Zhao static_assert(sizeof(struct gve_adminq_report_stats) == 24); 31224aeb56fSKuo Zhao 3137e074d5aSDavid Awogbemila struct gve_adminq_report_link_speed { 3147e074d5aSDavid Awogbemila __be64 link_speed_address; 3157e074d5aSDavid Awogbemila }; 3167e074d5aSDavid Awogbemila 3177e074d5aSDavid Awogbemila static_assert(sizeof(struct gve_adminq_report_link_speed) == 8); 3187e074d5aSDavid Awogbemila 31924aeb56fSKuo Zhao struct stats { 32024aeb56fSKuo Zhao __be32 stat_name; 32124aeb56fSKuo Zhao __be32 queue_id; 32224aeb56fSKuo Zhao __be64 value; 32324aeb56fSKuo Zhao }; 32424aeb56fSKuo Zhao 32524aeb56fSKuo Zhao static_assert(sizeof(struct stats) == 16); 32624aeb56fSKuo Zhao 32724aeb56fSKuo Zhao struct gve_stats_report { 32824aeb56fSKuo Zhao __be64 written_count; 329691f4077SGustavo A. R. Silva struct stats stats[]; 33024aeb56fSKuo Zhao }; 33124aeb56fSKuo Zhao 33224aeb56fSKuo Zhao static_assert(sizeof(struct gve_stats_report) == 8); 33324aeb56fSKuo Zhao 33424aeb56fSKuo Zhao enum gve_stat_names { 33524aeb56fSKuo Zhao // stats from gve 33624aeb56fSKuo Zhao TX_WAKE_CNT = 1, 33724aeb56fSKuo Zhao TX_STOP_CNT = 2, 33824aeb56fSKuo Zhao TX_FRAMES_SENT = 3, 33924aeb56fSKuo Zhao TX_BYTES_SENT = 4, 34024aeb56fSKuo Zhao TX_LAST_COMPLETION_PROCESSED = 5, 34124aeb56fSKuo Zhao RX_NEXT_EXPECTED_SEQUENCE = 6, 34224aeb56fSKuo Zhao RX_BUFFERS_POSTED = 7, 34387a7f321SJohn Fraker TX_TIMEOUT_CNT = 8, 3442f523dc3SDavid Awogbemila // stats from NIC 3452f523dc3SDavid Awogbemila RX_QUEUE_DROP_CNT = 65, 3462f523dc3SDavid Awogbemila RX_NO_BUFFERS_POSTED = 66, 3472f523dc3SDavid Awogbemila RX_DROPS_PACKET_OVER_MRU = 67, 3482f523dc3SDavid Awogbemila RX_DROPS_INVALID_CHECKSUM = 68, 34924aeb56fSKuo Zhao }; 35024aeb56fSKuo Zhao 351c4b87ac8SBailey Forrest enum gve_l3_type { 352c4b87ac8SBailey Forrest /* Must be zero so zero initialized LUT is unknown. */ 353c4b87ac8SBailey Forrest GVE_L3_TYPE_UNKNOWN = 0, 354c4b87ac8SBailey Forrest GVE_L3_TYPE_OTHER, 355c4b87ac8SBailey Forrest GVE_L3_TYPE_IPV4, 356c4b87ac8SBailey Forrest GVE_L3_TYPE_IPV6, 357c4b87ac8SBailey Forrest }; 358c4b87ac8SBailey Forrest 359c4b87ac8SBailey Forrest enum gve_l4_type { 360c4b87ac8SBailey Forrest /* Must be zero so zero initialized LUT is unknown. */ 361c4b87ac8SBailey Forrest GVE_L4_TYPE_UNKNOWN = 0, 362c4b87ac8SBailey Forrest GVE_L4_TYPE_OTHER, 363c4b87ac8SBailey Forrest GVE_L4_TYPE_TCP, 364c4b87ac8SBailey Forrest GVE_L4_TYPE_UDP, 365c4b87ac8SBailey Forrest GVE_L4_TYPE_ICMP, 366c4b87ac8SBailey Forrest GVE_L4_TYPE_SCTP, 367c4b87ac8SBailey Forrest }; 368c4b87ac8SBailey Forrest 369c4b87ac8SBailey Forrest /* These are control path types for PTYPE which are the same as the data path 370c4b87ac8SBailey Forrest * types. 371c4b87ac8SBailey Forrest */ 372c4b87ac8SBailey Forrest struct gve_ptype_entry { 373c4b87ac8SBailey Forrest u8 l3_type; 374c4b87ac8SBailey Forrest u8 l4_type; 375c4b87ac8SBailey Forrest }; 376c4b87ac8SBailey Forrest 377c4b87ac8SBailey Forrest struct gve_ptype_map { 378c4b87ac8SBailey Forrest struct gve_ptype_entry ptypes[1 << 10]; /* PTYPES are always 10 bits. */ 379c4b87ac8SBailey Forrest }; 380c4b87ac8SBailey Forrest 381c4b87ac8SBailey Forrest struct gve_adminq_get_ptype_map { 382c4b87ac8SBailey Forrest __be64 ptype_map_len; 383c4b87ac8SBailey Forrest __be64 ptype_map_addr; 384c4b87ac8SBailey Forrest }; 385c4b87ac8SBailey Forrest 386893ce44dSCatherine Sullivan union gve_adminq_command { 387893ce44dSCatherine Sullivan struct { 388893ce44dSCatherine Sullivan __be32 opcode; 389893ce44dSCatherine Sullivan __be32 status; 390893ce44dSCatherine Sullivan union { 391893ce44dSCatherine Sullivan struct gve_adminq_configure_device_resources 392893ce44dSCatherine Sullivan configure_device_resources; 393f5cedc84SCatherine Sullivan struct gve_adminq_create_tx_queue create_tx_queue; 394f5cedc84SCatherine Sullivan struct gve_adminq_create_rx_queue create_rx_queue; 395f5cedc84SCatherine Sullivan struct gve_adminq_destroy_tx_queue destroy_tx_queue; 396f5cedc84SCatherine Sullivan struct gve_adminq_destroy_rx_queue destroy_rx_queue; 397893ce44dSCatherine Sullivan struct gve_adminq_describe_device describe_device; 398f5cedc84SCatherine Sullivan struct gve_adminq_register_page_list reg_page_list; 399f5cedc84SCatherine Sullivan struct gve_adminq_unregister_page_list unreg_page_list; 400893ce44dSCatherine Sullivan struct gve_adminq_set_driver_parameter set_driver_param; 40124aeb56fSKuo Zhao struct gve_adminq_report_stats report_stats; 4027e074d5aSDavid Awogbemila struct gve_adminq_report_link_speed report_link_speed; 403c4b87ac8SBailey Forrest struct gve_adminq_get_ptype_map get_ptype_map; 404c2a0c3edSJeroen de Borst struct gve_adminq_verify_driver_compatibility 405c2a0c3edSJeroen de Borst verify_driver_compatibility; 406893ce44dSCatherine Sullivan }; 407893ce44dSCatherine Sullivan }; 408893ce44dSCatherine Sullivan u8 reserved[64]; 409893ce44dSCatherine Sullivan }; 410893ce44dSCatherine Sullivan 411893ce44dSCatherine Sullivan static_assert(sizeof(union gve_adminq_command) == 64); 412893ce44dSCatherine Sullivan 413893ce44dSCatherine Sullivan int gve_adminq_alloc(struct device *dev, struct gve_priv *priv); 414893ce44dSCatherine Sullivan void gve_adminq_free(struct device *dev, struct gve_priv *priv); 415893ce44dSCatherine Sullivan void gve_adminq_release(struct gve_priv *priv); 416893ce44dSCatherine Sullivan int gve_adminq_describe_device(struct gve_priv *priv); 417893ce44dSCatherine Sullivan int gve_adminq_configure_device_resources(struct gve_priv *priv, 418893ce44dSCatherine Sullivan dma_addr_t counter_array_bus_addr, 419893ce44dSCatherine Sullivan u32 num_counters, 420893ce44dSCatherine Sullivan dma_addr_t db_array_bus_addr, 421893ce44dSCatherine Sullivan u32 num_ntfy_blks); 422893ce44dSCatherine Sullivan int gve_adminq_deconfigure_device_resources(struct gve_priv *priv); 4237fc2bf78SPraveen Kaligineedi int gve_adminq_create_tx_queues(struct gve_priv *priv, u32 start_id, u32 num_queues); 4247fc2bf78SPraveen Kaligineedi int gve_adminq_destroy_tx_queues(struct gve_priv *priv, u32 start_id, u32 num_queues); 4255cdad90dSSagi Shahar int gve_adminq_create_rx_queues(struct gve_priv *priv, u32 num_queues); 4265cdad90dSSagi Shahar int gve_adminq_destroy_rx_queues(struct gve_priv *priv, u32 queue_id); 427f5cedc84SCatherine Sullivan int gve_adminq_register_page_list(struct gve_priv *priv, 428f5cedc84SCatherine Sullivan struct gve_queue_page_list *qpl); 429f5cedc84SCatherine Sullivan int gve_adminq_unregister_page_list(struct gve_priv *priv, u32 page_list_id); 430893ce44dSCatherine Sullivan int gve_adminq_set_mtu(struct gve_priv *priv, u64 mtu); 43124aeb56fSKuo Zhao int gve_adminq_report_stats(struct gve_priv *priv, u64 stats_report_len, 43224aeb56fSKuo Zhao dma_addr_t stats_report_addr, u64 interval); 433c2a0c3edSJeroen de Borst int gve_adminq_verify_driver_compatibility(struct gve_priv *priv, 434c2a0c3edSJeroen de Borst u64 driver_info_len, 435c2a0c3edSJeroen de Borst dma_addr_t driver_info_addr); 4367e074d5aSDavid Awogbemila int gve_adminq_report_link_speed(struct gve_priv *priv); 437c4b87ac8SBailey Forrest 438c4b87ac8SBailey Forrest struct gve_ptype_lut; 439c4b87ac8SBailey Forrest int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv, 440c4b87ac8SBailey Forrest struct gve_ptype_lut *ptype_lut); 441c4b87ac8SBailey Forrest 442893ce44dSCatherine Sullivan #endif /* _GVE_ADMINQ_H */ 443