1f86e5ed8SJunfeng Guo /* SPDX-License-Identifier: MIT 2f86e5ed8SJunfeng Guo * Google Virtual Ethernet (gve) driver 3748d0e7fSRushil Gupta * Copyright (C) 2015-2023 Google, Inc. 4f86e5ed8SJunfeng Guo */ 5f86e5ed8SJunfeng Guo 6f86e5ed8SJunfeng Guo #ifndef _GVE_ADMINQ_H 7f86e5ed8SJunfeng Guo #define _GVE_ADMINQ_H 8f86e5ed8SJunfeng Guo 9c9ba2cafSJunfeng Guo #include "gve_osdep.h" 10c9ba2cafSJunfeng Guo 11f86e5ed8SJunfeng Guo /* Admin queue opcodes */ 12f86e5ed8SJunfeng Guo enum gve_adminq_opcodes { 13f86e5ed8SJunfeng Guo GVE_ADMINQ_DESCRIBE_DEVICE = 0x1, 14f86e5ed8SJunfeng Guo GVE_ADMINQ_CONFIGURE_DEVICE_RESOURCES = 0x2, 15f86e5ed8SJunfeng Guo GVE_ADMINQ_REGISTER_PAGE_LIST = 0x3, 16f86e5ed8SJunfeng Guo GVE_ADMINQ_UNREGISTER_PAGE_LIST = 0x4, 17f86e5ed8SJunfeng Guo GVE_ADMINQ_CREATE_TX_QUEUE = 0x5, 18f86e5ed8SJunfeng Guo GVE_ADMINQ_CREATE_RX_QUEUE = 0x6, 19f86e5ed8SJunfeng Guo GVE_ADMINQ_DESTROY_TX_QUEUE = 0x7, 20f86e5ed8SJunfeng Guo GVE_ADMINQ_DESTROY_RX_QUEUE = 0x8, 21f86e5ed8SJunfeng Guo GVE_ADMINQ_DECONFIGURE_DEVICE_RESOURCES = 0x9, 22179f293bSJoshua Washington GVE_ADMINQ_CONFIGURE_RSS = 0xA, 23f86e5ed8SJunfeng Guo GVE_ADMINQ_SET_DRIVER_PARAMETER = 0xB, 24f86e5ed8SJunfeng Guo GVE_ADMINQ_REPORT_STATS = 0xC, 25f86e5ed8SJunfeng Guo GVE_ADMINQ_REPORT_LINK_SPEED = 0xD, 26f86e5ed8SJunfeng Guo GVE_ADMINQ_GET_PTYPE_MAP = 0xE, 27748d0e7fSRushil Gupta GVE_ADMINQ_VERIFY_DRIVER_COMPATIBILITY = 0xF, 28f86e5ed8SJunfeng Guo }; 29f86e5ed8SJunfeng Guo 30f86e5ed8SJunfeng Guo /* Admin queue status codes */ 31f86e5ed8SJunfeng Guo enum gve_adminq_statuses { 32f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_UNSET = 0x0, 33f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_PASSED = 0x1, 34f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_ABORTED = 0xFFFFFFF0, 35f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_ALREADY_EXISTS = 0xFFFFFFF1, 36f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_CANCELLED = 0xFFFFFFF2, 37f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_DATALOSS = 0xFFFFFFF3, 38f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_DEADLINE_EXCEEDED = 0xFFFFFFF4, 39f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_FAILED_PRECONDITION = 0xFFFFFFF5, 40f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_INTERNAL_ERROR = 0xFFFFFFF6, 41f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_INVALID_ARGUMENT = 0xFFFFFFF7, 42f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_NOT_FOUND = 0xFFFFFFF8, 43f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_OUT_OF_RANGE = 0xFFFFFFF9, 44f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_PERMISSION_DENIED = 0xFFFFFFFA, 45f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_UNAUTHENTICATED = 0xFFFFFFFB, 46f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_RESOURCE_EXHAUSTED = 0xFFFFFFFC, 47f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_UNAVAILABLE = 0xFFFFFFFD, 48f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_UNIMPLEMENTED = 0xFFFFFFFE, 49f86e5ed8SJunfeng Guo GVE_ADMINQ_COMMAND_ERROR_UNKNOWN_ERROR = 0xFFFFFFFF, 50f86e5ed8SJunfeng Guo }; 51f86e5ed8SJunfeng Guo 52f86e5ed8SJunfeng Guo #define GVE_ADMINQ_DEVICE_DESCRIPTOR_VERSION 1 53f86e5ed8SJunfeng Guo 54f86e5ed8SJunfeng Guo /* All AdminQ command structs should be naturally packed. 55f86e5ed8SJunfeng Guo * GVE_CHECK_STRUCT/UNION_LEN will check struct/union length and throw 56f86e5ed8SJunfeng Guo * error at compile time when the size is not correct. 57f86e5ed8SJunfeng Guo */ 58f86e5ed8SJunfeng Guo 59f86e5ed8SJunfeng Guo struct gve_adminq_describe_device { 60f86e5ed8SJunfeng Guo __be64 device_descriptor_addr; 61f86e5ed8SJunfeng Guo __be32 device_descriptor_version; 62f86e5ed8SJunfeng Guo __be32 available_length; 63f86e5ed8SJunfeng Guo }; 64f86e5ed8SJunfeng Guo 65f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(16, gve_adminq_describe_device); 66f86e5ed8SJunfeng Guo 67f86e5ed8SJunfeng Guo struct gve_device_descriptor { 68f86e5ed8SJunfeng Guo __be64 max_registered_pages; 69f86e5ed8SJunfeng Guo __be16 reserved1; 70f86e5ed8SJunfeng Guo __be16 tx_queue_entries; 71f86e5ed8SJunfeng Guo __be16 rx_queue_entries; 72f86e5ed8SJunfeng Guo __be16 default_num_queues; 73f86e5ed8SJunfeng Guo __be16 mtu; 74f86e5ed8SJunfeng Guo __be16 counters; 75f86e5ed8SJunfeng Guo __be16 tx_pages_per_qpl; 76f86e5ed8SJunfeng Guo __be16 rx_pages_per_qpl; 77f86e5ed8SJunfeng Guo u8 mac[ETH_ALEN]; 78f86e5ed8SJunfeng Guo __be16 num_device_options; 79f86e5ed8SJunfeng Guo __be16 total_length; 80f86e5ed8SJunfeng Guo u8 reserved2[6]; 81f86e5ed8SJunfeng Guo }; 82f86e5ed8SJunfeng Guo 83f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(40, gve_device_descriptor); 84f86e5ed8SJunfeng Guo 85f86e5ed8SJunfeng Guo struct gve_device_option { 86f86e5ed8SJunfeng Guo __be16 option_id; 87f86e5ed8SJunfeng Guo __be16 option_length; 88f86e5ed8SJunfeng Guo __be32 required_features_mask; 89f86e5ed8SJunfeng Guo }; 90f86e5ed8SJunfeng Guo 91f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(8, gve_device_option); 92f86e5ed8SJunfeng Guo 93f86e5ed8SJunfeng Guo struct gve_device_option_gqi_rda { 94f86e5ed8SJunfeng Guo __be32 supported_features_mask; 95f86e5ed8SJunfeng Guo }; 96f86e5ed8SJunfeng Guo 97f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(4, gve_device_option_gqi_rda); 98f86e5ed8SJunfeng Guo 99f86e5ed8SJunfeng Guo struct gve_device_option_gqi_qpl { 100f86e5ed8SJunfeng Guo __be32 supported_features_mask; 101f86e5ed8SJunfeng Guo }; 102f86e5ed8SJunfeng Guo 103f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(4, gve_device_option_gqi_qpl); 104f86e5ed8SJunfeng Guo 105f86e5ed8SJunfeng Guo struct gve_device_option_dqo_rda { 106f86e5ed8SJunfeng Guo __be32 supported_features_mask; 107f86e5ed8SJunfeng Guo __be16 tx_comp_ring_entries; 108f86e5ed8SJunfeng Guo __be16 rx_buff_ring_entries; 109f86e5ed8SJunfeng Guo }; 110f86e5ed8SJunfeng Guo 111f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(8, gve_device_option_dqo_rda); 112f86e5ed8SJunfeng Guo 113*eb8ec5c3SJoshua Washington struct gve_ring_size_bound { 114*eb8ec5c3SJoshua Washington __be16 rx; 115*eb8ec5c3SJoshua Washington __be16 tx; 116b6af400eSJoshua Washington }; 117b6af400eSJoshua Washington 118*eb8ec5c3SJoshua Washington GVE_CHECK_STRUCT_LEN(4, gve_ring_size_bound); 119*eb8ec5c3SJoshua Washington 120*eb8ec5c3SJoshua Washington struct gve_device_option_modify_ring { 121*eb8ec5c3SJoshua Washington __be32 supported_features_mask; 122*eb8ec5c3SJoshua Washington struct gve_ring_size_bound max_ring_size; 123*eb8ec5c3SJoshua Washington struct gve_ring_size_bound min_ring_size; 124*eb8ec5c3SJoshua Washington }; 125*eb8ec5c3SJoshua Washington 126*eb8ec5c3SJoshua Washington GVE_CHECK_STRUCT_LEN(12, gve_device_option_modify_ring); 127b6af400eSJoshua Washington 128f86e5ed8SJunfeng Guo struct gve_device_option_jumbo_frames { 129f86e5ed8SJunfeng Guo __be32 supported_features_mask; 130f86e5ed8SJunfeng Guo __be16 max_mtu; 131f86e5ed8SJunfeng Guo u8 padding[2]; 132f86e5ed8SJunfeng Guo }; 133f86e5ed8SJunfeng Guo 134f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(8, gve_device_option_jumbo_frames); 135f86e5ed8SJunfeng Guo 136f86e5ed8SJunfeng Guo /* Terminology: 137f86e5ed8SJunfeng Guo * 138f86e5ed8SJunfeng Guo * RDA - Raw DMA Addressing - Buffers associated with SKBs are directly DMA 139f86e5ed8SJunfeng Guo * mapped and read/updated by the device. 140f86e5ed8SJunfeng Guo * 141f86e5ed8SJunfeng Guo * QPL - Queue Page Lists - Driver uses bounce buffers which are DMA mapped with 142f86e5ed8SJunfeng Guo * the device for read/write and data is copied from/to SKBs. 143f86e5ed8SJunfeng Guo */ 144f86e5ed8SJunfeng Guo enum gve_dev_opt_id { 145f86e5ed8SJunfeng Guo GVE_DEV_OPT_ID_GQI_RAW_ADDRESSING = 0x1, 146f86e5ed8SJunfeng Guo GVE_DEV_OPT_ID_GQI_RDA = 0x2, 147f86e5ed8SJunfeng Guo GVE_DEV_OPT_ID_GQI_QPL = 0x3, 148f86e5ed8SJunfeng Guo GVE_DEV_OPT_ID_DQO_RDA = 0x4, 149b6af400eSJoshua Washington GVE_DEV_OPT_ID_MODIFY_RING = 0x6, 150f86e5ed8SJunfeng Guo GVE_DEV_OPT_ID_JUMBO_FRAMES = 0x8, 151f86e5ed8SJunfeng Guo }; 152f86e5ed8SJunfeng Guo 153f86e5ed8SJunfeng Guo enum gve_dev_opt_req_feat_mask { 154f86e5ed8SJunfeng Guo GVE_DEV_OPT_REQ_FEAT_MASK_GQI_RAW_ADDRESSING = 0x0, 155f86e5ed8SJunfeng Guo GVE_DEV_OPT_REQ_FEAT_MASK_GQI_RDA = 0x0, 156f86e5ed8SJunfeng Guo GVE_DEV_OPT_REQ_FEAT_MASK_GQI_QPL = 0x0, 157f86e5ed8SJunfeng Guo GVE_DEV_OPT_REQ_FEAT_MASK_DQO_RDA = 0x0, 158b6af400eSJoshua Washington GVE_DEV_OPT_REQ_FEAT_MASK_MODIFY_RING = 0x0, 159f86e5ed8SJunfeng Guo GVE_DEV_OPT_REQ_FEAT_MASK_JUMBO_FRAMES = 0x0, 160f86e5ed8SJunfeng Guo }; 161f86e5ed8SJunfeng Guo 162f86e5ed8SJunfeng Guo enum gve_sup_feature_mask { 163b6af400eSJoshua Washington GVE_SUP_MODIFY_RING_MASK = 1 << 0, 164f86e5ed8SJunfeng Guo GVE_SUP_JUMBO_FRAMES_MASK = 1 << 2, 165f86e5ed8SJunfeng Guo }; 166f86e5ed8SJunfeng Guo 167f86e5ed8SJunfeng Guo #define GVE_DEV_OPT_LEN_GQI_RAW_ADDRESSING 0x0 168748d0e7fSRushil Gupta enum gve_driver_capbility { 169748d0e7fSRushil Gupta gve_driver_capability_gqi_qpl = 0, 170748d0e7fSRushil Gupta gve_driver_capability_gqi_rda = 1, 171748d0e7fSRushil Gupta gve_driver_capability_dqo_qpl = 2, /* reserved for future use */ 172748d0e7fSRushil Gupta gve_driver_capability_dqo_rda = 3, 173748d0e7fSRushil Gupta }; 174748d0e7fSRushil Gupta 175748d0e7fSRushil Gupta #define GVE_CAP1(a) BIT((int)a) 176748d0e7fSRushil Gupta 177748d0e7fSRushil Gupta #define GVE_DRIVER_CAPABILITY_FLAGS1 \ 178748d0e7fSRushil Gupta (GVE_CAP1(gve_driver_capability_gqi_qpl) | \ 179748d0e7fSRushil Gupta GVE_CAP1(gve_driver_capability_gqi_rda) | \ 180748d0e7fSRushil Gupta GVE_CAP1(gve_driver_capability_dqo_rda)) 181748d0e7fSRushil Gupta 182748d0e7fSRushil Gupta #define GVE_DRIVER_CAPABILITY_FLAGS2 0x0 183748d0e7fSRushil Gupta #define GVE_DRIVER_CAPABILITY_FLAGS3 0x0 184748d0e7fSRushil Gupta #define GVE_DRIVER_CAPABILITY_FLAGS4 0x0 185748d0e7fSRushil Gupta 186748d0e7fSRushil Gupta struct gve_driver_info { 187748d0e7fSRushil Gupta u8 os_type; /* 0x05 = DPDK */ 188748d0e7fSRushil Gupta u8 driver_major; 189748d0e7fSRushil Gupta u8 driver_minor; 190748d0e7fSRushil Gupta u8 driver_sub; 191748d0e7fSRushil Gupta __be32 os_version_major; 192748d0e7fSRushil Gupta __be32 os_version_minor; 193748d0e7fSRushil Gupta __be32 os_version_sub; 194748d0e7fSRushil Gupta __be64 driver_capability_flags[4]; 195748d0e7fSRushil Gupta u8 os_version_str1[OS_VERSION_STRLEN]; 196748d0e7fSRushil Gupta u8 os_version_str2[OS_VERSION_STRLEN]; 197748d0e7fSRushil Gupta }; 198748d0e7fSRushil Gupta 199748d0e7fSRushil Gupta struct gve_adminq_verify_driver_compatibility { 200748d0e7fSRushil Gupta __be64 driver_info_len; 201748d0e7fSRushil Gupta __be64 driver_info_addr; 202748d0e7fSRushil Gupta }; 203748d0e7fSRushil Gupta 204748d0e7fSRushil Gupta GVE_CHECK_STRUCT_LEN(16, gve_adminq_verify_driver_compatibility); 205748d0e7fSRushil Gupta 206f86e5ed8SJunfeng Guo 207f86e5ed8SJunfeng Guo struct gve_adminq_configure_device_resources { 208f86e5ed8SJunfeng Guo __be64 counter_array; 209f86e5ed8SJunfeng Guo __be64 irq_db_addr; 210f86e5ed8SJunfeng Guo __be32 num_counters; 211f86e5ed8SJunfeng Guo __be32 num_irq_dbs; 212f86e5ed8SJunfeng Guo __be32 irq_db_stride; 213f86e5ed8SJunfeng Guo __be32 ntfy_blk_msix_base_idx; 214f86e5ed8SJunfeng Guo u8 queue_format; 215f86e5ed8SJunfeng Guo u8 padding[7]; 216f86e5ed8SJunfeng Guo }; 217f86e5ed8SJunfeng Guo 218f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(40, gve_adminq_configure_device_resources); 219f86e5ed8SJunfeng Guo 220f86e5ed8SJunfeng Guo struct gve_adminq_register_page_list { 221f86e5ed8SJunfeng Guo __be32 page_list_id; 222f86e5ed8SJunfeng Guo __be32 num_pages; 223f86e5ed8SJunfeng Guo __be64 page_address_list_addr; 224f86e5ed8SJunfeng Guo }; 225f86e5ed8SJunfeng Guo 226f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(16, gve_adminq_register_page_list); 227f86e5ed8SJunfeng Guo 228f86e5ed8SJunfeng Guo struct gve_adminq_unregister_page_list { 229f86e5ed8SJunfeng Guo __be32 page_list_id; 230f86e5ed8SJunfeng Guo }; 231f86e5ed8SJunfeng Guo 232f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(4, gve_adminq_unregister_page_list); 233f86e5ed8SJunfeng Guo 234f86e5ed8SJunfeng Guo #define GVE_RAW_ADDRESSING_QPL_ID 0xFFFFFFFF 235f86e5ed8SJunfeng Guo 236f86e5ed8SJunfeng Guo struct gve_adminq_create_tx_queue { 237f86e5ed8SJunfeng Guo __be32 queue_id; 238f86e5ed8SJunfeng Guo __be32 reserved; 239f86e5ed8SJunfeng Guo __be64 queue_resources_addr; 240f86e5ed8SJunfeng Guo __be64 tx_ring_addr; 241f86e5ed8SJunfeng Guo __be32 queue_page_list_id; 242f86e5ed8SJunfeng Guo __be32 ntfy_id; 243f86e5ed8SJunfeng Guo __be64 tx_comp_ring_addr; 244f86e5ed8SJunfeng Guo __be16 tx_ring_size; 245f86e5ed8SJunfeng Guo __be16 tx_comp_ring_size; 246f86e5ed8SJunfeng Guo u8 padding[4]; 247f86e5ed8SJunfeng Guo }; 248f86e5ed8SJunfeng Guo 249f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(48, gve_adminq_create_tx_queue); 250f86e5ed8SJunfeng Guo 251f86e5ed8SJunfeng Guo struct gve_adminq_create_rx_queue { 252f86e5ed8SJunfeng Guo __be32 queue_id; 253f86e5ed8SJunfeng Guo __be32 index; 254f86e5ed8SJunfeng Guo __be32 reserved; 255f86e5ed8SJunfeng Guo __be32 ntfy_id; 256f86e5ed8SJunfeng Guo __be64 queue_resources_addr; 257f86e5ed8SJunfeng Guo __be64 rx_desc_ring_addr; 258f86e5ed8SJunfeng Guo __be64 rx_data_ring_addr; 259f86e5ed8SJunfeng Guo __be32 queue_page_list_id; 260f86e5ed8SJunfeng Guo __be16 rx_ring_size; 261f86e5ed8SJunfeng Guo __be16 packet_buffer_size; 262f86e5ed8SJunfeng Guo __be16 rx_buff_ring_size; 263f86e5ed8SJunfeng Guo u8 enable_rsc; 264f86e5ed8SJunfeng Guo u8 padding[5]; 265f86e5ed8SJunfeng Guo }; 266f86e5ed8SJunfeng Guo 267f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(56, gve_adminq_create_rx_queue); 268f86e5ed8SJunfeng Guo 269f86e5ed8SJunfeng Guo /* Queue resources that are shared with the device */ 270f86e5ed8SJunfeng Guo struct gve_queue_resources { 271f86e5ed8SJunfeng Guo union { 272f86e5ed8SJunfeng Guo struct { 273f86e5ed8SJunfeng Guo __be32 db_index; /* Device -> Guest */ 274f86e5ed8SJunfeng Guo __be32 counter_index; /* Device -> Guest */ 275f86e5ed8SJunfeng Guo }; 276f86e5ed8SJunfeng Guo u8 reserved[64]; 277f86e5ed8SJunfeng Guo }; 278f86e5ed8SJunfeng Guo }; 279f86e5ed8SJunfeng Guo 280f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(64, gve_queue_resources); 281f86e5ed8SJunfeng Guo 282f86e5ed8SJunfeng Guo struct gve_adminq_destroy_tx_queue { 283f86e5ed8SJunfeng Guo __be32 queue_id; 284f86e5ed8SJunfeng Guo }; 285f86e5ed8SJunfeng Guo 286f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(4, gve_adminq_destroy_tx_queue); 287f86e5ed8SJunfeng Guo 288f86e5ed8SJunfeng Guo struct gve_adminq_destroy_rx_queue { 289f86e5ed8SJunfeng Guo __be32 queue_id; 290f86e5ed8SJunfeng Guo }; 291f86e5ed8SJunfeng Guo 292f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(4, gve_adminq_destroy_rx_queue); 293f86e5ed8SJunfeng Guo 294f86e5ed8SJunfeng Guo /* GVE Set Driver Parameter Types */ 295f86e5ed8SJunfeng Guo enum gve_set_driver_param_types { 296f86e5ed8SJunfeng Guo GVE_SET_PARAM_MTU = 0x1, 297f86e5ed8SJunfeng Guo }; 298f86e5ed8SJunfeng Guo 299f86e5ed8SJunfeng Guo struct gve_adminq_set_driver_parameter { 300f86e5ed8SJunfeng Guo __be32 parameter_type; 301f86e5ed8SJunfeng Guo u8 reserved[4]; 302f86e5ed8SJunfeng Guo __be64 parameter_value; 303f86e5ed8SJunfeng Guo }; 304f86e5ed8SJunfeng Guo 305f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(16, gve_adminq_set_driver_parameter); 306f86e5ed8SJunfeng Guo 307f86e5ed8SJunfeng Guo struct gve_adminq_report_stats { 308f86e5ed8SJunfeng Guo __be64 stats_report_len; 309f86e5ed8SJunfeng Guo __be64 stats_report_addr; 310f86e5ed8SJunfeng Guo __be64 interval; 311f86e5ed8SJunfeng Guo }; 312f86e5ed8SJunfeng Guo 313f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(24, gve_adminq_report_stats); 314f86e5ed8SJunfeng Guo 315f86e5ed8SJunfeng Guo struct gve_adminq_report_link_speed { 316f86e5ed8SJunfeng Guo __be64 link_speed_address; 317f86e5ed8SJunfeng Guo }; 318f86e5ed8SJunfeng Guo 319f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(8, gve_adminq_report_link_speed); 320f86e5ed8SJunfeng Guo 321f86e5ed8SJunfeng Guo struct stats { 322f86e5ed8SJunfeng Guo __be32 stat_name; 323f86e5ed8SJunfeng Guo __be32 queue_id; 324f86e5ed8SJunfeng Guo __be64 value; 325f86e5ed8SJunfeng Guo }; 326f86e5ed8SJunfeng Guo 327f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(16, stats); 328f86e5ed8SJunfeng Guo 329f86e5ed8SJunfeng Guo struct gve_stats_report { 330f86e5ed8SJunfeng Guo __be64 written_count; 331f86e5ed8SJunfeng Guo struct stats stats[]; 332f86e5ed8SJunfeng Guo }; 333f86e5ed8SJunfeng Guo 334f86e5ed8SJunfeng Guo GVE_CHECK_STRUCT_LEN(8, gve_stats_report); 335f86e5ed8SJunfeng Guo 336458b53deSRushil Gupta /* Numbers of gve tx/rx stats in stats report. */ 337458b53deSRushil Gupta #define GVE_TX_STATS_REPORT_NUM 6 338458b53deSRushil Gupta #define GVE_RX_STATS_REPORT_NUM 2 339458b53deSRushil Gupta 340458b53deSRushil Gupta /* Interval to schedule a stats report update, 20000ms. */ 341458b53deSRushil Gupta #define GVE_STATS_REPORT_TIMER_PERIOD 20000 342458b53deSRushil Gupta 343458b53deSRushil Gupta /* Numbers of NIC tx/rx stats in stats report. */ 344458b53deSRushil Gupta #define NIC_TX_STATS_REPORT_NUM 0 345458b53deSRushil Gupta #define NIC_RX_STATS_REPORT_NUM 4 346458b53deSRushil Gupta 347f86e5ed8SJunfeng Guo enum gve_stat_names { 348f86e5ed8SJunfeng Guo /* stats from gve */ 349f86e5ed8SJunfeng Guo TX_WAKE_CNT = 1, 350f86e5ed8SJunfeng Guo TX_STOP_CNT = 2, 351f86e5ed8SJunfeng Guo TX_FRAMES_SENT = 3, 352f86e5ed8SJunfeng Guo TX_BYTES_SENT = 4, 353f86e5ed8SJunfeng Guo TX_LAST_COMPLETION_PROCESSED = 5, 354f86e5ed8SJunfeng Guo RX_NEXT_EXPECTED_SEQUENCE = 6, 355f86e5ed8SJunfeng Guo RX_BUFFERS_POSTED = 7, 356f86e5ed8SJunfeng Guo TX_TIMEOUT_CNT = 8, 357f86e5ed8SJunfeng Guo /* stats from NIC */ 358f86e5ed8SJunfeng Guo RX_QUEUE_DROP_CNT = 65, 359f86e5ed8SJunfeng Guo RX_NO_BUFFERS_POSTED = 66, 360f86e5ed8SJunfeng Guo RX_DROPS_PACKET_OVER_MRU = 67, 361f86e5ed8SJunfeng Guo RX_DROPS_INVALID_CHECKSUM = 68, 362f86e5ed8SJunfeng Guo }; 363f86e5ed8SJunfeng Guo 364f86e5ed8SJunfeng Guo enum gve_l3_type { 365f86e5ed8SJunfeng Guo /* Must be zero so zero initialized LUT is unknown. */ 366f86e5ed8SJunfeng Guo GVE_L3_TYPE_UNKNOWN = 0, 367f86e5ed8SJunfeng Guo GVE_L3_TYPE_OTHER, 368f86e5ed8SJunfeng Guo GVE_L3_TYPE_IPV4, 369f86e5ed8SJunfeng Guo GVE_L3_TYPE_IPV6, 370f86e5ed8SJunfeng Guo }; 371f86e5ed8SJunfeng Guo 372f86e5ed8SJunfeng Guo enum gve_l4_type { 373f86e5ed8SJunfeng Guo /* Must be zero so zero initialized LUT is unknown. */ 374f86e5ed8SJunfeng Guo GVE_L4_TYPE_UNKNOWN = 0, 375f86e5ed8SJunfeng Guo GVE_L4_TYPE_OTHER, 376f86e5ed8SJunfeng Guo GVE_L4_TYPE_TCP, 377f86e5ed8SJunfeng Guo GVE_L4_TYPE_UDP, 378f86e5ed8SJunfeng Guo GVE_L4_TYPE_ICMP, 379f86e5ed8SJunfeng Guo GVE_L4_TYPE_SCTP, 380f86e5ed8SJunfeng Guo }; 381f86e5ed8SJunfeng Guo 382f86e5ed8SJunfeng Guo /* These are control path types for PTYPE which are the same as the data path 383f86e5ed8SJunfeng Guo * types. 384f86e5ed8SJunfeng Guo */ 385f86e5ed8SJunfeng Guo struct gve_ptype_entry { 386f86e5ed8SJunfeng Guo u8 l3_type; 387f86e5ed8SJunfeng Guo u8 l4_type; 388f86e5ed8SJunfeng Guo }; 389f86e5ed8SJunfeng Guo 390f86e5ed8SJunfeng Guo struct gve_ptype_map { 391f86e5ed8SJunfeng Guo struct gve_ptype_entry ptypes[1 << 10]; /* PTYPES are always 10 bits. */ 392f86e5ed8SJunfeng Guo }; 393f86e5ed8SJunfeng Guo 394f86e5ed8SJunfeng Guo struct gve_adminq_get_ptype_map { 395f86e5ed8SJunfeng Guo __be64 ptype_map_len; 396f86e5ed8SJunfeng Guo __be64 ptype_map_addr; 397f86e5ed8SJunfeng Guo }; 398f86e5ed8SJunfeng Guo 399179f293bSJoshua Washington 400179f293bSJoshua Washington /* RSS configuration command */ 401179f293bSJoshua Washington struct gve_adminq_configure_rss { 402179f293bSJoshua Washington __be16 hash_types; 403179f293bSJoshua Washington u8 halg; /* hash algorithm */ 404179f293bSJoshua Washington u8 reserved; 405179f293bSJoshua Washington __be16 hkey_len; 406179f293bSJoshua Washington __be16 indir_len; 407179f293bSJoshua Washington __be64 hkey_addr; 408179f293bSJoshua Washington __be64 indir_addr; 409179f293bSJoshua Washington }; 410179f293bSJoshua Washington 411f86e5ed8SJunfeng Guo union gve_adminq_command { 412f86e5ed8SJunfeng Guo struct { 413f86e5ed8SJunfeng Guo __be32 opcode; 414f86e5ed8SJunfeng Guo __be32 status; 415f86e5ed8SJunfeng Guo union { 416f86e5ed8SJunfeng Guo struct gve_adminq_configure_device_resources 417f86e5ed8SJunfeng Guo configure_device_resources; 418f86e5ed8SJunfeng Guo struct gve_adminq_create_tx_queue create_tx_queue; 419f86e5ed8SJunfeng Guo struct gve_adminq_create_rx_queue create_rx_queue; 420f86e5ed8SJunfeng Guo struct gve_adminq_destroy_tx_queue destroy_tx_queue; 421f86e5ed8SJunfeng Guo struct gve_adminq_destroy_rx_queue destroy_rx_queue; 422f86e5ed8SJunfeng Guo struct gve_adminq_describe_device describe_device; 423f86e5ed8SJunfeng Guo struct gve_adminq_register_page_list reg_page_list; 424f86e5ed8SJunfeng Guo struct gve_adminq_unregister_page_list unreg_page_list; 425179f293bSJoshua Washington struct gve_adminq_configure_rss configure_rss; 426f86e5ed8SJunfeng Guo struct gve_adminq_set_driver_parameter set_driver_param; 427f86e5ed8SJunfeng Guo struct gve_adminq_report_stats report_stats; 428f86e5ed8SJunfeng Guo struct gve_adminq_report_link_speed report_link_speed; 429f86e5ed8SJunfeng Guo struct gve_adminq_get_ptype_map get_ptype_map; 430748d0e7fSRushil Gupta struct gve_adminq_verify_driver_compatibility 431748d0e7fSRushil Gupta verify_driver_compatibility; 432f86e5ed8SJunfeng Guo }; 433f86e5ed8SJunfeng Guo }; 434f86e5ed8SJunfeng Guo u8 reserved[64]; 435f86e5ed8SJunfeng Guo }; 436f86e5ed8SJunfeng Guo 437f86e5ed8SJunfeng Guo GVE_CHECK_UNION_LEN(64, gve_adminq_command); 438f86e5ed8SJunfeng Guo 439179f293bSJoshua Washington struct gve_priv; 440d6ac6f45SJoshua Washington struct gve_rss_config; 441179f293bSJoshua Washington struct gve_queue_page_list; 442f86e5ed8SJunfeng Guo int gve_adminq_alloc(struct gve_priv *priv); 443f86e5ed8SJunfeng Guo void gve_adminq_free(struct gve_priv *priv); 444f86e5ed8SJunfeng Guo void gve_adminq_release(struct gve_priv *priv); 445f86e5ed8SJunfeng Guo int gve_adminq_describe_device(struct gve_priv *priv); 446f86e5ed8SJunfeng Guo int gve_adminq_configure_device_resources(struct gve_priv *priv, 447f86e5ed8SJunfeng Guo dma_addr_t counter_array_bus_addr, 448f86e5ed8SJunfeng Guo u32 num_counters, 449f86e5ed8SJunfeng Guo dma_addr_t db_array_bus_addr, 450f86e5ed8SJunfeng Guo u32 num_ntfy_blks); 451f86e5ed8SJunfeng Guo int gve_adminq_deconfigure_device_resources(struct gve_priv *priv); 452f86e5ed8SJunfeng Guo int gve_adminq_create_tx_queues(struct gve_priv *priv, u32 num_queues); 453f86e5ed8SJunfeng Guo int gve_adminq_destroy_tx_queues(struct gve_priv *priv, u32 queue_id); 454f86e5ed8SJunfeng Guo int gve_adminq_create_rx_queues(struct gve_priv *priv, u32 num_queues); 455f86e5ed8SJunfeng Guo int gve_adminq_destroy_rx_queues(struct gve_priv *priv, u32 queue_id); 456f86e5ed8SJunfeng Guo int gve_adminq_register_page_list(struct gve_priv *priv, 457f86e5ed8SJunfeng Guo struct gve_queue_page_list *qpl); 458f86e5ed8SJunfeng Guo int gve_adminq_unregister_page_list(struct gve_priv *priv, u32 page_list_id); 459f86e5ed8SJunfeng Guo int gve_adminq_set_mtu(struct gve_priv *priv, u64 mtu); 460f86e5ed8SJunfeng Guo int gve_adminq_report_stats(struct gve_priv *priv, u64 stats_report_len, 461f86e5ed8SJunfeng Guo dma_addr_t stats_report_addr, u64 interval); 462f86e5ed8SJunfeng Guo int gve_adminq_report_link_speed(struct gve_priv *priv); 463f86e5ed8SJunfeng Guo 464f86e5ed8SJunfeng Guo struct gve_ptype_lut; 465f86e5ed8SJunfeng Guo int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv, 466f86e5ed8SJunfeng Guo struct gve_ptype_lut *ptype_lut); 467f86e5ed8SJunfeng Guo 468748d0e7fSRushil Gupta int gve_adminq_verify_driver_compatibility(struct gve_priv *priv, 469748d0e7fSRushil Gupta u64 driver_info_len, 470748d0e7fSRushil Gupta dma_addr_t driver_info_addr); 471179f293bSJoshua Washington 472179f293bSJoshua Washington int gve_adminq_configure_rss(struct gve_priv *priv, 473179f293bSJoshua Washington struct gve_rss_config *rss_config); 474179f293bSJoshua Washington 475f86e5ed8SJunfeng Guo #endif /* _GVE_ADMINQ_H */ 476