at master 42 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* Copyright(c) 2023 Advanced Micro Devices, Inc */ 3 4#ifndef _PDS_CORE_ADMINQ_H_ 5#define _PDS_CORE_ADMINQ_H_ 6 7#define PDSC_ADMINQ_MAX_POLL_INTERVAL 256000 /* usecs */ 8 9enum pds_core_adminq_flags { 10 PDS_AQ_FLAG_FASTPOLL = BIT(1), /* completion poll at 1ms */ 11}; 12 13/* 14 * enum pds_core_adminq_opcode - AdminQ command opcodes 15 * These commands are only processed on AdminQ, not available in devcmd 16 */ 17enum pds_core_adminq_opcode { 18 PDS_AQ_CMD_NOP = 0, 19 20 /* Client control */ 21 PDS_AQ_CMD_CLIENT_REG = 6, 22 PDS_AQ_CMD_CLIENT_UNREG = 7, 23 PDS_AQ_CMD_CLIENT_CMD = 8, 24 25 /* LIF commands */ 26 PDS_AQ_CMD_LIF_IDENTIFY = 20, 27 PDS_AQ_CMD_LIF_INIT = 21, 28 PDS_AQ_CMD_LIF_RESET = 22, 29 PDS_AQ_CMD_LIF_GETATTR = 23, 30 PDS_AQ_CMD_LIF_SETATTR = 24, 31 PDS_AQ_CMD_LIF_SETPHC = 25, 32 33 PDS_AQ_CMD_RX_MODE_SET = 30, 34 PDS_AQ_CMD_RX_FILTER_ADD = 31, 35 PDS_AQ_CMD_RX_FILTER_DEL = 32, 36 37 /* Queue commands */ 38 PDS_AQ_CMD_Q_IDENTIFY = 39, 39 PDS_AQ_CMD_Q_INIT = 40, 40 PDS_AQ_CMD_Q_CONTROL = 41, 41 42 /* SR/IOV commands */ 43 PDS_AQ_CMD_VF_GETATTR = 60, 44 PDS_AQ_CMD_VF_SETATTR = 61, 45}; 46 47/* 48 * enum pds_core_notifyq_opcode - NotifyQ event codes 49 */ 50enum pds_core_notifyq_opcode { 51 PDS_EVENT_LINK_CHANGE = 1, 52 PDS_EVENT_RESET = 2, 53 PDS_EVENT_XCVR = 5, 54 PDS_EVENT_CLIENT = 6, 55}; 56 57#define PDS_COMP_COLOR_MASK 0x80 58 59/** 60 * struct pds_core_notifyq_event - Generic event reporting structure 61 * @eid: event number 62 * @ecode: event code 63 * 64 * This is the generic event report struct from which the other 65 * actual events will be formed. 66 */ 67struct pds_core_notifyq_event { 68 __le64 eid; 69 __le16 ecode; 70}; 71 72/** 73 * struct pds_core_link_change_event - Link change event notification 74 * @eid: event number 75 * @ecode: event code = PDS_EVENT_LINK_CHANGE 76 * @link_status: link up/down, with error bits 77 * @link_speed: speed of the network link 78 * 79 * Sent when the network link state changes between UP and DOWN 80 */ 81struct pds_core_link_change_event { 82 __le64 eid; 83 __le16 ecode; 84 __le16 link_status; 85 __le32 link_speed; /* units of 1Mbps: e.g. 10000 = 10Gbps */ 86}; 87 88/** 89 * struct pds_core_reset_event - Reset event notification 90 * @eid: event number 91 * @ecode: event code = PDS_EVENT_RESET 92 * @reset_code: reset type 93 * @state: 0=pending, 1=complete, 2=error 94 * 95 * Sent when the NIC or some subsystem is going to be or 96 * has been reset. 97 */ 98struct pds_core_reset_event { 99 __le64 eid; 100 __le16 ecode; 101 u8 reset_code; 102 u8 state; 103}; 104 105/** 106 * struct pds_core_client_event - Client event notification 107 * @eid: event number 108 * @ecode: event code = PDS_EVENT_CLIENT 109 * @client_id: client to sent event to 110 * @client_event: wrapped event struct for the client 111 * 112 * Sent when an event needs to be passed on to a client 113 */ 114struct pds_core_client_event { 115 __le64 eid; 116 __le16 ecode; 117 __le16 client_id; 118 u8 client_event[54]; 119}; 120 121/** 122 * struct pds_core_notifyq_cmd - Placeholder for building qcq 123 * @data: anonymous field for building the qcq 124 */ 125struct pds_core_notifyq_cmd { 126 __le32 data; /* Not used but needed for qcq structure */ 127}; 128 129/* 130 * union pds_core_notifyq_comp - Overlay of notifyq event structures 131 */ 132union pds_core_notifyq_comp { 133 struct { 134 __le64 eid; 135 __le16 ecode; 136 }; 137 struct pds_core_notifyq_event event; 138 struct pds_core_link_change_event link_change; 139 struct pds_core_reset_event reset; 140 u8 data[64]; 141}; 142 143#define PDS_DEVNAME_LEN 32 144/** 145 * struct pds_core_client_reg_cmd - Register a new client with DSC 146 * @opcode: opcode PDS_AQ_CMD_CLIENT_REG 147 * @rsvd: word boundary padding 148 * @devname: text name of client device 149 * @vif_type: what type of device (enum pds_core_vif_types) 150 * 151 * Tell the DSC of the new client, and receive a client_id from DSC. 152 */ 153struct pds_core_client_reg_cmd { 154 u8 opcode; 155 u8 rsvd[3]; 156 char devname[PDS_DEVNAME_LEN]; 157 u8 vif_type; 158}; 159 160/** 161 * struct pds_core_client_reg_comp - Client registration completion 162 * @status: Status of the command (enum pdc_core_status_code) 163 * @rsvd: Word boundary padding 164 * @comp_index: Index in the descriptor ring for which this is the completion 165 * @client_id: New id assigned by DSC 166 * @rsvd1: Word boundary padding 167 * @color: Color bit 168 */ 169struct pds_core_client_reg_comp { 170 u8 status; 171 u8 rsvd; 172 __le16 comp_index; 173 __le16 client_id; 174 u8 rsvd1[9]; 175 u8 color; 176}; 177 178/** 179 * struct pds_core_client_unreg_cmd - Unregister a client from DSC 180 * @opcode: opcode PDS_AQ_CMD_CLIENT_UNREG 181 * @rsvd: word boundary padding 182 * @client_id: id of client being removed 183 * 184 * Tell the DSC this client is going away and remove its context 185 * This uses the generic completion. 186 */ 187struct pds_core_client_unreg_cmd { 188 u8 opcode; 189 u8 rsvd; 190 __le16 client_id; 191}; 192 193/** 194 * struct pds_core_client_request_cmd - Pass along a wrapped client AdminQ cmd 195 * @opcode: opcode PDS_AQ_CMD_CLIENT_CMD 196 * @rsvd: word boundary padding 197 * @client_id: id of client being removed 198 * @client_cmd: the wrapped client command 199 * 200 * Proxy post an adminq command for the client. 201 * This uses the generic completion. 202 */ 203struct pds_core_client_request_cmd { 204 u8 opcode; 205 u8 rsvd; 206 __le16 client_id; 207 u8 client_cmd[60]; 208}; 209 210#define PDS_CORE_MAX_FRAGS 16 211 212#define PDS_CORE_QCQ_F_INITED BIT(0) 213#define PDS_CORE_QCQ_F_SG BIT(1) 214#define PDS_CORE_QCQ_F_INTR BIT(2) 215#define PDS_CORE_QCQ_F_TX_STATS BIT(3) 216#define PDS_CORE_QCQ_F_RX_STATS BIT(4) 217#define PDS_CORE_QCQ_F_NOTIFYQ BIT(5) 218#define PDS_CORE_QCQ_F_CMB_RINGS BIT(6) 219#define PDS_CORE_QCQ_F_CORE BIT(7) 220 221enum pds_core_lif_type { 222 PDS_CORE_LIF_TYPE_DEFAULT = 0, 223}; 224 225#define PDS_CORE_IFNAMSIZ 16 226 227/** 228 * enum pds_core_logical_qtype - Logical Queue Types 229 * @PDS_CORE_QTYPE_ADMINQ: Administrative Queue 230 * @PDS_CORE_QTYPE_NOTIFYQ: Notify Queue 231 * @PDS_CORE_QTYPE_RXQ: Receive Queue 232 * @PDS_CORE_QTYPE_TXQ: Transmit Queue 233 * @PDS_CORE_QTYPE_EQ: Event Queue 234 * @PDS_CORE_QTYPE_MAX: Max queue type supported 235 */ 236enum pds_core_logical_qtype { 237 PDS_CORE_QTYPE_ADMINQ = 0, 238 PDS_CORE_QTYPE_NOTIFYQ = 1, 239 PDS_CORE_QTYPE_RXQ = 2, 240 PDS_CORE_QTYPE_TXQ = 3, 241 PDS_CORE_QTYPE_EQ = 4, 242 243 PDS_CORE_QTYPE_MAX = 16 /* don't change - used in struct size */ 244}; 245 246/** 247 * union pds_core_lif_config - LIF configuration 248 * @state: LIF state (enum pds_core_lif_state) 249 * @rsvd: Word boundary padding 250 * @name: LIF name 251 * @rsvd2: Word boundary padding 252 * @features: LIF features active (enum pds_core_hw_features) 253 * @queue_count: Queue counts per queue-type 254 * @words: Full union buffer size 255 */ 256union pds_core_lif_config { 257 struct { 258 u8 state; 259 u8 rsvd[3]; 260 char name[PDS_CORE_IFNAMSIZ]; 261 u8 rsvd2[12]; 262 __le64 features; 263 __le32 queue_count[PDS_CORE_QTYPE_MAX]; 264 } __packed; 265 __le32 words[64]; 266}; 267 268/** 269 * struct pds_core_lif_status - LIF status register 270 * @eid: most recent NotifyQ event id 271 * @rsvd: full struct size 272 */ 273struct pds_core_lif_status { 274 __le64 eid; 275 u8 rsvd[56]; 276}; 277 278/** 279 * struct pds_core_lif_info - LIF info structure 280 * @config: LIF configuration structure 281 * @status: LIF status structure 282 */ 283struct pds_core_lif_info { 284 union pds_core_lif_config config; 285 struct pds_core_lif_status status; 286}; 287 288/** 289 * struct pds_core_lif_identity - LIF identity information (type-specific) 290 * @features: LIF features (see enum pds_core_hw_features) 291 * @version: Identify structure version 292 * @hw_index: LIF hardware index 293 * @rsvd: Word boundary padding 294 * @max_nb_sessions: Maximum number of sessions supported 295 * @rsvd2: buffer padding 296 * @config: LIF config struct with features, q counts 297 */ 298struct pds_core_lif_identity { 299 __le64 features; 300 u8 version; 301 u8 hw_index; 302 u8 rsvd[2]; 303 __le32 max_nb_sessions; 304 u8 rsvd2[120]; 305 union pds_core_lif_config config; 306}; 307 308/** 309 * struct pds_core_lif_identify_cmd - Get LIF identity info command 310 * @opcode: Opcode PDS_AQ_CMD_LIF_IDENTIFY 311 * @type: LIF type (enum pds_core_lif_type) 312 * @client_id: Client identifier 313 * @ver: Version of identify returned by device 314 * @rsvd: Word boundary padding 315 * @ident_pa: DMA address to receive identity info 316 * 317 * Firmware will copy LIF identity data (struct pds_core_lif_identity) 318 * into the buffer address given. 319 */ 320struct pds_core_lif_identify_cmd { 321 u8 opcode; 322 u8 type; 323 __le16 client_id; 324 u8 ver; 325 u8 rsvd[3]; 326 __le64 ident_pa; 327}; 328 329/** 330 * struct pds_core_lif_identify_comp - LIF identify command completion 331 * @status: Status of the command (enum pds_core_status_code) 332 * @ver: Version of identify returned by device 333 * @bytes: Bytes copied into the buffer 334 * @rsvd: Word boundary padding 335 * @color: Color bit 336 */ 337struct pds_core_lif_identify_comp { 338 u8 status; 339 u8 ver; 340 __le16 bytes; 341 u8 rsvd[11]; 342 u8 color; 343}; 344 345/** 346 * struct pds_core_lif_init_cmd - LIF init command 347 * @opcode: Opcode PDS_AQ_CMD_LIF_INIT 348 * @type: LIF type (enum pds_core_lif_type) 349 * @client_id: Client identifier 350 * @rsvd: Word boundary padding 351 * @info_pa: Destination address for LIF info (struct pds_core_lif_info) 352 */ 353struct pds_core_lif_init_cmd { 354 u8 opcode; 355 u8 type; 356 __le16 client_id; 357 __le32 rsvd; 358 __le64 info_pa; 359}; 360 361/** 362 * struct pds_core_lif_init_comp - LIF init command completion 363 * @status: Status of the command (enum pds_core_status_code) 364 * @rsvd: Word boundary padding 365 * @hw_index: Hardware index of the initialized LIF 366 * @rsvd1: Word boundary padding 367 * @color: Color bit 368 */ 369struct pds_core_lif_init_comp { 370 u8 status; 371 u8 rsvd; 372 __le16 hw_index; 373 u8 rsvd1[11]; 374 u8 color; 375}; 376 377/** 378 * struct pds_core_lif_reset_cmd - LIF reset command 379 * Will reset only the specified LIF. 380 * @opcode: Opcode PDS_AQ_CMD_LIF_RESET 381 * @rsvd: Word boundary padding 382 * @client_id: Client identifier 383 */ 384struct pds_core_lif_reset_cmd { 385 u8 opcode; 386 u8 rsvd; 387 __le16 client_id; 388}; 389 390/** 391 * enum pds_core_lif_attr - List of LIF attributes 392 * @PDS_CORE_LIF_ATTR_STATE: LIF state attribute 393 * @PDS_CORE_LIF_ATTR_NAME: LIF name attribute 394 * @PDS_CORE_LIF_ATTR_FEATURES: LIF features attribute 395 * @PDS_CORE_LIF_ATTR_STATS_CTRL: LIF statistics control attribute 396 */ 397enum pds_core_lif_attr { 398 PDS_CORE_LIF_ATTR_STATE = 0, 399 PDS_CORE_LIF_ATTR_NAME = 1, 400 PDS_CORE_LIF_ATTR_FEATURES = 4, 401 PDS_CORE_LIF_ATTR_STATS_CTRL = 6, 402}; 403 404/** 405 * struct pds_core_lif_setattr_cmd - Set LIF attributes on the NIC 406 * @opcode: Opcode PDS_AQ_CMD_LIF_SETATTR 407 * @attr: Attribute type (enum pds_core_lif_attr) 408 * @client_id: Client identifier 409 * @state: LIF state (enum pds_core_lif_state) 410 * @name: The name string, 0 terminated 411 * @features: Features (enum pds_core_hw_features) 412 * @stats_ctl: Stats control commands (enum pds_core_stats_ctl_cmd) 413 * @rsvd: Command Buffer padding 414 */ 415struct pds_core_lif_setattr_cmd { 416 u8 opcode; 417 u8 attr; 418 __le16 client_id; 419 union { 420 u8 state; 421 char name[PDS_CORE_IFNAMSIZ]; 422 __le64 features; 423 u8 stats_ctl; 424 u8 rsvd[60]; 425 } __packed; 426}; 427 428/** 429 * struct pds_core_lif_setattr_comp - LIF set attr command completion 430 * @status: Status of the command (enum pds_core_status_code) 431 * @rsvd: Word boundary padding 432 * @comp_index: Index in the descriptor ring for which this is the completion 433 * @features: Features (enum pds_core_hw_features) 434 * @rsvd2: Word boundary padding 435 * @color: Color bit 436 */ 437struct pds_core_lif_setattr_comp { 438 u8 status; 439 u8 rsvd; 440 __le16 comp_index; 441 union { 442 __le64 features; 443 u8 rsvd2[11]; 444 } __packed; 445 u8 color; 446}; 447 448/** 449 * struct pds_core_lif_getattr_cmd - Get LIF attributes from the NIC 450 * @opcode: Opcode PDS_AQ_CMD_LIF_GETATTR 451 * @attr: Attribute type (enum pds_core_lif_attr) 452 * @client_id: Client identifier 453 */ 454struct pds_core_lif_getattr_cmd { 455 u8 opcode; 456 u8 attr; 457 __le16 client_id; 458}; 459 460/** 461 * struct pds_core_lif_getattr_comp - LIF get attr command completion 462 * @status: Status of the command (enum pds_core_status_code) 463 * @rsvd: Word boundary padding 464 * @comp_index: Index in the descriptor ring for which this is the completion 465 * @state: LIF state (enum pds_core_lif_state) 466 * @features: Features (enum pds_core_hw_features) 467 * @rsvd2: Word boundary padding 468 * @color: Color bit 469 */ 470struct pds_core_lif_getattr_comp { 471 u8 status; 472 u8 rsvd; 473 __le16 comp_index; 474 union { 475 u8 state; 476 __le64 features; 477 u8 rsvd2[11]; 478 } __packed; 479 u8 color; 480}; 481 482/** 483 * union pds_core_q_identity - Queue identity information 484 * @version: Queue type version that can be used with FW 485 * @supported: Bitfield of queue versions, first bit = ver 0 486 * @rsvd: Word boundary padding 487 * @features: Queue features 488 * @desc_sz: Descriptor size 489 * @comp_sz: Completion descriptor size 490 * @rsvd2: Word boundary padding 491 */ 492struct pds_core_q_identity { 493 u8 version; 494 u8 supported; 495 u8 rsvd[6]; 496#define PDS_CORE_QIDENT_F_CQ 0x01 /* queue has completion ring */ 497 __le64 features; 498 __le16 desc_sz; 499 __le16 comp_sz; 500 u8 rsvd2[6]; 501}; 502 503/** 504 * struct pds_core_q_identify_cmd - queue identify command 505 * @opcode: Opcode PDS_AQ_CMD_Q_IDENTIFY 506 * @type: Logical queue type (enum pds_core_logical_qtype) 507 * @client_id: Client identifier 508 * @ver: Highest queue type version that the driver supports 509 * @rsvd: Word boundary padding 510 * @ident_pa: DMA address to receive the data (struct pds_core_q_identity) 511 */ 512struct pds_core_q_identify_cmd { 513 u8 opcode; 514 u8 type; 515 __le16 client_id; 516 u8 ver; 517 u8 rsvd[3]; 518 __le64 ident_pa; 519}; 520 521/** 522 * struct pds_core_q_identify_comp - queue identify command completion 523 * @status: Status of the command (enum pds_core_status_code) 524 * @rsvd: Word boundary padding 525 * @comp_index: Index in the descriptor ring for which this is the completion 526 * @ver: Queue type version that can be used with FW 527 * @rsvd1: Word boundary padding 528 * @color: Color bit 529 */ 530struct pds_core_q_identify_comp { 531 u8 status; 532 u8 rsvd; 533 __le16 comp_index; 534 u8 ver; 535 u8 rsvd1[10]; 536 u8 color; 537}; 538 539/** 540 * struct pds_core_q_init_cmd - Queue init command 541 * @opcode: Opcode PDS_AQ_CMD_Q_INIT 542 * @type: Logical queue type 543 * @client_id: Client identifier 544 * @ver: Queue type version 545 * @rsvd: Word boundary padding 546 * @index: (LIF, qtype) relative admin queue index 547 * @intr_index: Interrupt control register index, or Event queue index 548 * @pid: Process ID 549 * @flags: 550 * IRQ: Interrupt requested on completion 551 * ENA: Enable the queue. If ENA=0 the queue is initialized 552 * but remains disabled, to be later enabled with the 553 * Queue Enable command. If ENA=1, then queue is 554 * initialized and then enabled. 555 * @cos: Class of service for this queue 556 * @ring_size: Queue ring size, encoded as a log2(size), in 557 * number of descriptors. The actual ring size is 558 * (1 << ring_size). For example, to select a ring size 559 * of 64 descriptors write ring_size = 6. The minimum 560 * ring_size value is 2 for a ring of 4 descriptors. 561 * The maximum ring_size value is 12 for a ring of 4k 562 * descriptors. Values of ring_size <2 and >12 are 563 * reserved. 564 * @ring_base: Queue ring base address 565 * @cq_ring_base: Completion queue ring base address 566 */ 567struct pds_core_q_init_cmd { 568 u8 opcode; 569 u8 type; 570 __le16 client_id; 571 u8 ver; 572 u8 rsvd[3]; 573 __le32 index; 574 __le16 pid; 575 __le16 intr_index; 576 __le16 flags; 577#define PDS_CORE_QINIT_F_IRQ 0x01 /* Request interrupt on completion */ 578#define PDS_CORE_QINIT_F_ENA 0x02 /* Enable the queue */ 579 u8 cos; 580#define PDS_CORE_QSIZE_MIN_LG2 2 581#define PDS_CORE_QSIZE_MAX_LG2 12 582 u8 ring_size; 583 __le64 ring_base; 584 __le64 cq_ring_base; 585} __packed; 586 587/** 588 * struct pds_core_q_init_comp - Queue init command completion 589 * @status: Status of the command (enum pds_core_status_code) 590 * @rsvd: Word boundary padding 591 * @comp_index: Index in the descriptor ring for which this is the completion 592 * @hw_index: Hardware Queue ID 593 * @hw_type: Hardware Queue type 594 * @rsvd2: Word boundary padding 595 * @color: Color 596 */ 597struct pds_core_q_init_comp { 598 u8 status; 599 u8 rsvd; 600 __le16 comp_index; 601 __le32 hw_index; 602 u8 hw_type; 603 u8 rsvd2[6]; 604 u8 color; 605}; 606 607/* 608 * enum pds_vdpa_cmd_opcode - vDPA Device commands 609 */ 610enum pds_vdpa_cmd_opcode { 611 PDS_VDPA_CMD_INIT = 48, 612 PDS_VDPA_CMD_IDENT = 49, 613 PDS_VDPA_CMD_RESET = 51, 614 PDS_VDPA_CMD_VQ_RESET = 52, 615 PDS_VDPA_CMD_VQ_INIT = 53, 616 PDS_VDPA_CMD_STATUS_UPDATE = 54, 617 PDS_VDPA_CMD_SET_FEATURES = 55, 618 PDS_VDPA_CMD_SET_ATTR = 56, 619}; 620 621/** 622 * struct pds_vdpa_cmd - generic command 623 * @opcode: Opcode 624 * @vdpa_index: Index for vdpa subdevice 625 * @vf_id: VF id 626 */ 627struct pds_vdpa_cmd { 628 u8 opcode; 629 u8 vdpa_index; 630 __le16 vf_id; 631}; 632 633/** 634 * struct pds_vdpa_init_cmd - INIT command 635 * @opcode: Opcode PDS_VDPA_CMD_INIT 636 * @vdpa_index: Index for vdpa subdevice 637 * @vf_id: VF id 638 */ 639struct pds_vdpa_init_cmd { 640 u8 opcode; 641 u8 vdpa_index; 642 __le16 vf_id; 643}; 644 645/** 646 * struct pds_vdpa_ident - vDPA identification data 647 * @hw_features: vDPA features supported by device 648 * @max_vqs: max queues available (2 queues for a single queuepair) 649 * @max_qlen: log(2) of maximum number of descriptors 650 * @min_qlen: log(2) of minimum number of descriptors 651 * 652 * This struct is used in a DMA block that is set up for the PDS_VDPA_CMD_IDENT 653 * transaction. Set up the DMA block and send the address in the IDENT cmd 654 * data, the DSC will write the ident information, then we can remove the DMA 655 * block after reading the answer. If the completion status is 0, then there 656 * is valid information, else there was an error and the data should be invalid. 657 */ 658struct pds_vdpa_ident { 659 __le64 hw_features; 660 __le16 max_vqs; 661 __le16 max_qlen; 662 __le16 min_qlen; 663}; 664 665/** 666 * struct pds_vdpa_ident_cmd - IDENT command 667 * @opcode: Opcode PDS_VDPA_CMD_IDENT 668 * @rsvd: Word boundary padding 669 * @vf_id: VF id 670 * @len: length of ident info DMA space 671 * @ident_pa: address for DMA of ident info (struct pds_vdpa_ident) 672 * only used for this transaction, then forgotten by DSC 673 */ 674struct pds_vdpa_ident_cmd { 675 u8 opcode; 676 u8 rsvd; 677 __le16 vf_id; 678 __le32 len; 679 __le64 ident_pa; 680}; 681 682/** 683 * struct pds_vdpa_status_cmd - STATUS_UPDATE command 684 * @opcode: Opcode PDS_VDPA_CMD_STATUS_UPDATE 685 * @vdpa_index: Index for vdpa subdevice 686 * @vf_id: VF id 687 * @status: new status bits 688 */ 689struct pds_vdpa_status_cmd { 690 u8 opcode; 691 u8 vdpa_index; 692 __le16 vf_id; 693 u8 status; 694}; 695 696/** 697 * enum pds_vdpa_attr - List of VDPA device attributes 698 * @PDS_VDPA_ATTR_MAC: MAC address 699 * @PDS_VDPA_ATTR_MAX_VQ_PAIRS: Max virtqueue pairs 700 */ 701enum pds_vdpa_attr { 702 PDS_VDPA_ATTR_MAC = 1, 703 PDS_VDPA_ATTR_MAX_VQ_PAIRS = 2, 704}; 705 706/** 707 * struct pds_vdpa_setattr_cmd - SET_ATTR command 708 * @opcode: Opcode PDS_VDPA_CMD_SET_ATTR 709 * @vdpa_index: Index for vdpa subdevice 710 * @vf_id: VF id 711 * @attr: attribute to be changed (enum pds_vdpa_attr) 712 * @pad: Word boundary padding 713 * @mac: new mac address to be assigned as vdpa device address 714 * @max_vq_pairs: new limit of virtqueue pairs 715 */ 716struct pds_vdpa_setattr_cmd { 717 u8 opcode; 718 u8 vdpa_index; 719 __le16 vf_id; 720 u8 attr; 721 u8 pad[3]; 722 union { 723 u8 mac[6]; 724 __le16 max_vq_pairs; 725 } __packed; 726}; 727 728/** 729 * struct pds_vdpa_vq_init_cmd - queue init command 730 * @opcode: Opcode PDS_VDPA_CMD_VQ_INIT 731 * @vdpa_index: Index for vdpa subdevice 732 * @vf_id: VF id 733 * @qid: Queue id (bit0 clear = rx, bit0 set = tx, qid=N is ctrlq) 734 * @len: log(2) of max descriptor count 735 * @desc_addr: DMA address of descriptor area 736 * @avail_addr: DMA address of available descriptors (aka driver area) 737 * @used_addr: DMA address of used descriptors (aka device area) 738 * @intr_index: interrupt index 739 * @avail_index: initial device position in available ring 740 * @used_index: initial device position in used ring 741 */ 742struct pds_vdpa_vq_init_cmd { 743 u8 opcode; 744 u8 vdpa_index; 745 __le16 vf_id; 746 __le16 qid; 747 __le16 len; 748 __le64 desc_addr; 749 __le64 avail_addr; 750 __le64 used_addr; 751 __le16 intr_index; 752 __le16 avail_index; 753 __le16 used_index; 754}; 755 756/** 757 * struct pds_vdpa_vq_init_comp - queue init completion 758 * @status: Status of the command (enum pds_core_status_code) 759 * @hw_qtype: HW queue type, used in doorbell selection 760 * @hw_qindex: HW queue index, used in doorbell selection 761 * @rsvd: Word boundary padding 762 * @color: Color bit 763 */ 764struct pds_vdpa_vq_init_comp { 765 u8 status; 766 u8 hw_qtype; 767 __le16 hw_qindex; 768 u8 rsvd[11]; 769 u8 color; 770}; 771 772/** 773 * struct pds_vdpa_vq_reset_cmd - queue reset command 774 * @opcode: Opcode PDS_VDPA_CMD_VQ_RESET 775 * @vdpa_index: Index for vdpa subdevice 776 * @vf_id: VF id 777 * @qid: Queue id 778 */ 779struct pds_vdpa_vq_reset_cmd { 780 u8 opcode; 781 u8 vdpa_index; 782 __le16 vf_id; 783 __le16 qid; 784}; 785 786/** 787 * struct pds_vdpa_vq_reset_comp - queue reset completion 788 * @status: Status of the command (enum pds_core_status_code) 789 * @rsvd0: Word boundary padding 790 * @avail_index: current device position in available ring 791 * @used_index: current device position in used ring 792 * @rsvd: Word boundary padding 793 * @color: Color bit 794 */ 795struct pds_vdpa_vq_reset_comp { 796 u8 status; 797 u8 rsvd0; 798 __le16 avail_index; 799 __le16 used_index; 800 u8 rsvd[9]; 801 u8 color; 802}; 803 804/** 805 * struct pds_vdpa_set_features_cmd - set hw features 806 * @opcode: Opcode PDS_VDPA_CMD_SET_FEATURES 807 * @vdpa_index: Index for vdpa subdevice 808 * @vf_id: VF id 809 * @rsvd: Word boundary padding 810 * @features: Feature bit mask 811 */ 812struct pds_vdpa_set_features_cmd { 813 u8 opcode; 814 u8 vdpa_index; 815 __le16 vf_id; 816 __le32 rsvd; 817 __le64 features; 818}; 819 820#define PDS_LM_DEVICE_STATE_LENGTH 65536 821#define PDS_LM_CHECK_DEVICE_STATE_LENGTH(X) \ 822 PDS_CORE_SIZE_CHECK(union, PDS_LM_DEVICE_STATE_LENGTH, X) 823 824/* 825 * enum pds_lm_cmd_opcode - Live Migration Device commands 826 */ 827enum pds_lm_cmd_opcode { 828 PDS_LM_CMD_HOST_VF_STATUS = 1, 829 830 /* Device state commands */ 831 PDS_LM_CMD_STATE_SIZE = 16, 832 PDS_LM_CMD_SUSPEND = 18, 833 PDS_LM_CMD_SUSPEND_STATUS = 19, 834 PDS_LM_CMD_RESUME = 20, 835 PDS_LM_CMD_SAVE = 21, 836 PDS_LM_CMD_RESTORE = 22, 837 838 /* Dirty page tracking commands */ 839 PDS_LM_CMD_DIRTY_STATUS = 32, 840 PDS_LM_CMD_DIRTY_ENABLE = 33, 841 PDS_LM_CMD_DIRTY_DISABLE = 34, 842 PDS_LM_CMD_DIRTY_READ_SEQ = 35, 843 PDS_LM_CMD_DIRTY_WRITE_ACK = 36, 844}; 845 846/** 847 * struct pds_lm_cmd - generic command 848 * @opcode: Opcode 849 * @rsvd: Word boundary padding 850 * @vf_id: VF id 851 * @rsvd2: Structure padding to 60 Bytes 852 */ 853struct pds_lm_cmd { 854 u8 opcode; 855 u8 rsvd; 856 __le16 vf_id; 857 u8 rsvd2[56]; 858}; 859 860/** 861 * struct pds_lm_state_size_cmd - STATE_SIZE command 862 * @opcode: Opcode 863 * @rsvd: Word boundary padding 864 * @vf_id: VF id 865 */ 866struct pds_lm_state_size_cmd { 867 u8 opcode; 868 u8 rsvd; 869 __le16 vf_id; 870}; 871 872/** 873 * struct pds_lm_state_size_comp - STATE_SIZE command completion 874 * @status: Status of the command (enum pds_core_status_code) 875 * @rsvd: Word boundary padding 876 * @comp_index: Index in the desc ring for which this is the completion 877 * @size: Size of the device state 878 * @rsvd2: Word boundary padding 879 * @color: Color bit 880 */ 881struct pds_lm_state_size_comp { 882 u8 status; 883 u8 rsvd; 884 __le16 comp_index; 885 union { 886 __le64 size; 887 u8 rsvd2[11]; 888 } __packed; 889 u8 color; 890}; 891 892enum pds_lm_suspend_resume_type { 893 PDS_LM_SUSPEND_RESUME_TYPE_FULL = 0, 894 PDS_LM_SUSPEND_RESUME_TYPE_P2P = 1, 895}; 896 897/** 898 * struct pds_lm_suspend_cmd - SUSPEND command 899 * @opcode: Opcode PDS_LM_CMD_SUSPEND 900 * @rsvd: Word boundary padding 901 * @vf_id: VF id 902 * @type: Type of suspend (enum pds_lm_suspend_resume_type) 903 */ 904struct pds_lm_suspend_cmd { 905 u8 opcode; 906 u8 rsvd; 907 __le16 vf_id; 908 u8 type; 909}; 910 911/** 912 * struct pds_lm_suspend_status_cmd - SUSPEND status command 913 * @opcode: Opcode PDS_AQ_CMD_LM_SUSPEND_STATUS 914 * @rsvd: Word boundary padding 915 * @vf_id: VF id 916 * @type: Type of suspend (enum pds_lm_suspend_resume_type) 917 */ 918struct pds_lm_suspend_status_cmd { 919 u8 opcode; 920 u8 rsvd; 921 __le16 vf_id; 922 u8 type; 923}; 924 925/** 926 * struct pds_lm_resume_cmd - RESUME command 927 * @opcode: Opcode PDS_LM_CMD_RESUME 928 * @rsvd: Word boundary padding 929 * @vf_id: VF id 930 * @type: Type of resume (enum pds_lm_suspend_resume_type) 931 */ 932struct pds_lm_resume_cmd { 933 u8 opcode; 934 u8 rsvd; 935 __le16 vf_id; 936 u8 type; 937}; 938 939/** 940 * struct pds_lm_sg_elem - Transmit scatter-gather (SG) descriptor element 941 * @addr: DMA address of SG element data buffer 942 * @len: Length of SG element data buffer, in bytes 943 * @rsvd: Word boundary padding 944 */ 945struct pds_lm_sg_elem { 946 __le64 addr; 947 __le32 len; 948 __le16 rsvd[2]; 949}; 950 951/** 952 * struct pds_lm_save_cmd - SAVE command 953 * @opcode: Opcode PDS_LM_CMD_SAVE 954 * @rsvd: Word boundary padding 955 * @vf_id: VF id 956 * @rsvd2: Word boundary padding 957 * @sgl_addr: IOVA address of the SGL to dma the device state 958 * @num_sge: Total number of SG elements 959 */ 960struct pds_lm_save_cmd { 961 u8 opcode; 962 u8 rsvd; 963 __le16 vf_id; 964 u8 rsvd2[4]; 965 __le64 sgl_addr; 966 __le32 num_sge; 967} __packed; 968 969/** 970 * struct pds_lm_restore_cmd - RESTORE command 971 * @opcode: Opcode PDS_LM_CMD_RESTORE 972 * @rsvd: Word boundary padding 973 * @vf_id: VF id 974 * @rsvd2: Word boundary padding 975 * @sgl_addr: IOVA address of the SGL to dma the device state 976 * @num_sge: Total number of SG elements 977 */ 978struct pds_lm_restore_cmd { 979 u8 opcode; 980 u8 rsvd; 981 __le16 vf_id; 982 u8 rsvd2[4]; 983 __le64 sgl_addr; 984 __le32 num_sge; 985} __packed; 986 987/** 988 * union pds_lm_dev_state - device state information 989 * @words: Device state words 990 */ 991union pds_lm_dev_state { 992 __le32 words[PDS_LM_DEVICE_STATE_LENGTH / sizeof(__le32)]; 993}; 994 995enum pds_lm_host_vf_status { 996 PDS_LM_STA_NONE = 0, 997 PDS_LM_STA_IN_PROGRESS, 998 PDS_LM_STA_MAX, 999}; 1000 1001/** 1002 * struct pds_lm_dirty_region_info - Memory region info for STATUS and ENABLE 1003 * @dma_base: Base address of the DMA-contiguous memory region 1004 * @page_count: Number of pages in the memory region 1005 * @page_size_log2: Log2 page size in the memory region 1006 * @rsvd: Word boundary padding 1007 */ 1008struct pds_lm_dirty_region_info { 1009 __le64 dma_base; 1010 __le32 page_count; 1011 u8 page_size_log2; 1012 u8 rsvd[3]; 1013}; 1014 1015/** 1016 * struct pds_lm_dirty_status_cmd - DIRTY_STATUS command 1017 * @opcode: Opcode PDS_LM_CMD_DIRTY_STATUS 1018 * @rsvd: Word boundary padding 1019 * @vf_id: VF id 1020 * @max_regions: Capacity of the region info buffer 1021 * @rsvd2: Word boundary padding 1022 * @regions_dma: DMA address of the region info buffer 1023 * 1024 * The minimum of max_regions (from the command) and num_regions (from the 1025 * completion) of struct pds_lm_dirty_region_info will be written to 1026 * regions_dma. 1027 * 1028 * The max_regions may be zero, in which case regions_dma is ignored. In that 1029 * case, the completion will only report the maximum number of regions 1030 * supported by the device, and the number of regions currently enabled. 1031 */ 1032struct pds_lm_dirty_status_cmd { 1033 u8 opcode; 1034 u8 rsvd; 1035 __le16 vf_id; 1036 u8 max_regions; 1037 u8 rsvd2[3]; 1038 __le64 regions_dma; 1039} __packed; 1040 1041/** 1042 * enum pds_lm_dirty_bmp_type - Type of dirty page bitmap 1043 * @PDS_LM_DIRTY_BMP_TYPE_NONE: No bitmap / disabled 1044 * @PDS_LM_DIRTY_BMP_TYPE_SEQ_ACK: Seq/Ack bitmap representation 1045 */ 1046enum pds_lm_dirty_bmp_type { 1047 PDS_LM_DIRTY_BMP_TYPE_NONE = 0, 1048 PDS_LM_DIRTY_BMP_TYPE_SEQ_ACK = 1, 1049}; 1050 1051/** 1052 * struct pds_lm_dirty_status_comp - STATUS command completion 1053 * @status: Status of the command (enum pds_core_status_code) 1054 * @rsvd: Word boundary padding 1055 * @comp_index: Index in the desc ring for which this is the completion 1056 * @max_regions: Maximum number of regions supported by the device 1057 * @num_regions: Number of regions currently enabled 1058 * @bmp_type: Type of dirty bitmap representation 1059 * @rsvd2: Word boundary padding 1060 * @bmp_type_mask: Mask of supported bitmap types, bit index per type 1061 * @rsvd3: Word boundary padding 1062 * @color: Color bit 1063 * 1064 * This completion descriptor is used for STATUS, ENABLE, and DISABLE. 1065 */ 1066struct pds_lm_dirty_status_comp { 1067 u8 status; 1068 u8 rsvd; 1069 __le16 comp_index; 1070 u8 max_regions; 1071 u8 num_regions; 1072 u8 bmp_type; 1073 u8 rsvd2; 1074 __le32 bmp_type_mask; 1075 u8 rsvd3[3]; 1076 u8 color; 1077}; 1078 1079/** 1080 * struct pds_lm_dirty_enable_cmd - DIRTY_ENABLE command 1081 * @opcode: Opcode PDS_LM_CMD_DIRTY_ENABLE 1082 * @rsvd: Word boundary padding 1083 * @vf_id: VF id 1084 * @bmp_type: Type of dirty bitmap representation 1085 * @num_regions: Number of entries in the region info buffer 1086 * @rsvd2: Word boundary padding 1087 * @regions_dma: DMA address of the region info buffer 1088 * 1089 * The num_regions must be nonzero, and less than or equal to the maximum 1090 * number of regions supported by the device. 1091 * 1092 * The memory regions should not overlap. 1093 * 1094 * The information should be initialized by the driver. The device may modify 1095 * the information on successful completion, such as by size-aligning the 1096 * number of pages in a region. 1097 * 1098 * The modified number of pages will be greater than or equal to the page count 1099 * given in the enable command, and at least as coarsly aligned as the given 1100 * value. For example, the count might be aligned to a multiple of 64, but 1101 * if the value is already a multiple of 128 or higher, it will not change. 1102 * If the driver requires its own minimum alignment of the number of pages, the 1103 * driver should account for that already in the region info of this command. 1104 * 1105 * This command uses struct pds_lm_dirty_status_comp for its completion. 1106 */ 1107struct pds_lm_dirty_enable_cmd { 1108 u8 opcode; 1109 u8 rsvd; 1110 __le16 vf_id; 1111 u8 bmp_type; 1112 u8 num_regions; 1113 u8 rsvd2[2]; 1114 __le64 regions_dma; 1115} __packed; 1116 1117/** 1118 * struct pds_lm_dirty_disable_cmd - DIRTY_DISABLE command 1119 * @opcode: Opcode PDS_LM_CMD_DIRTY_DISABLE 1120 * @rsvd: Word boundary padding 1121 * @vf_id: VF id 1122 * 1123 * Dirty page tracking will be disabled. This may be called in any state, as 1124 * long as dirty page tracking is supported by the device, to ensure that dirty 1125 * page tracking is disabled. 1126 * 1127 * This command uses struct pds_lm_dirty_status_comp for its completion. On 1128 * success, num_regions will be zero. 1129 */ 1130struct pds_lm_dirty_disable_cmd { 1131 u8 opcode; 1132 u8 rsvd; 1133 __le16 vf_id; 1134}; 1135 1136/** 1137 * struct pds_lm_dirty_seq_ack_cmd - DIRTY_READ_SEQ or _WRITE_ACK command 1138 * @opcode: Opcode PDS_LM_CMD_DIRTY_[READ_SEQ|WRITE_ACK] 1139 * @rsvd: Word boundary padding 1140 * @vf_id: VF id 1141 * @off_bytes: Byte offset in the bitmap 1142 * @len_bytes: Number of bytes to transfer 1143 * @num_sge: Number of DMA scatter gather elements 1144 * @rsvd2: Word boundary padding 1145 * @sgl_addr: DMA address of scatter gather list 1146 * 1147 * Read bytes from the SEQ bitmap, or write bytes into the ACK bitmap. 1148 * 1149 * This command treats the entire bitmap as a byte buffer. It does not 1150 * distinguish between guest memory regions. The driver should refer to the 1151 * number of pages in each region, according to PDS_LM_CMD_DIRTY_STATUS, to 1152 * determine the region boundaries in the bitmap. Each region will be 1153 * represented by exactly the number of bits as the page count for that region, 1154 * immediately following the last bit of the previous region. 1155 */ 1156struct pds_lm_dirty_seq_ack_cmd { 1157 u8 opcode; 1158 u8 rsvd; 1159 __le16 vf_id; 1160 __le32 off_bytes; 1161 __le32 len_bytes; 1162 __le16 num_sge; 1163 u8 rsvd2[2]; 1164 __le64 sgl_addr; 1165} __packed; 1166 1167/** 1168 * struct pds_lm_host_vf_status_cmd - HOST_VF_STATUS command 1169 * @opcode: Opcode PDS_LM_CMD_HOST_VF_STATUS 1170 * @rsvd: Word boundary padding 1171 * @vf_id: VF id 1172 * @status: Current LM status of host VF driver (enum pds_lm_host_status) 1173 */ 1174struct pds_lm_host_vf_status_cmd { 1175 u8 opcode; 1176 u8 rsvd; 1177 __le16 vf_id; 1178 u8 status; 1179}; 1180 1181enum pds_fwctl_cmd_opcode { 1182 PDS_FWCTL_CMD_IDENT = 70, 1183 PDS_FWCTL_CMD_RPC = 71, 1184 PDS_FWCTL_CMD_QUERY = 72, 1185}; 1186 1187/** 1188 * struct pds_fwctl_cmd - Firmware control command structure 1189 * @opcode: Opcode 1190 * @rsvd: Reserved 1191 * @ep: Endpoint identifier 1192 * @op: Operation identifier 1193 */ 1194struct pds_fwctl_cmd { 1195 u8 opcode; 1196 u8 rsvd[3]; 1197 __le32 ep; 1198 __le32 op; 1199} __packed; 1200 1201/** 1202 * struct pds_fwctl_comp - Firmware control completion structure 1203 * @status: Status of the firmware control operation 1204 * @rsvd: Reserved 1205 * @comp_index: Completion index in little-endian format 1206 * @rsvd2: Reserved 1207 * @color: Color bit indicating the state of the completion 1208 */ 1209struct pds_fwctl_comp { 1210 u8 status; 1211 u8 rsvd; 1212 __le16 comp_index; 1213 u8 rsvd2[11]; 1214 u8 color; 1215} __packed; 1216 1217/** 1218 * struct pds_fwctl_ident_cmd - Firmware control identification command structure 1219 * @opcode: Operation code for the command 1220 * @rsvd: Reserved 1221 * @version: Interface version 1222 * @rsvd2: Reserved 1223 * @len: Length of the identification data 1224 * @ident_pa: Physical address of the identification data 1225 */ 1226struct pds_fwctl_ident_cmd { 1227 u8 opcode; 1228 u8 rsvd; 1229 u8 version; 1230 u8 rsvd2; 1231 __le32 len; 1232 __le64 ident_pa; 1233} __packed; 1234 1235/* future feature bits here 1236 * enum pds_fwctl_features { 1237 * }; 1238 * (compilers don't like empty enums) 1239 */ 1240 1241/** 1242 * struct pds_fwctl_ident - Firmware control identification structure 1243 * @features: Supported features (enum pds_fwctl_features) 1244 * @version: Interface version 1245 * @rsvd: Reserved 1246 * @max_req_sz: Maximum request size 1247 * @max_resp_sz: Maximum response size 1248 * @max_req_sg_elems: Maximum number of request SGs 1249 * @max_resp_sg_elems: Maximum number of response SGs 1250 */ 1251struct pds_fwctl_ident { 1252 __le64 features; 1253 u8 version; 1254 u8 rsvd[3]; 1255 __le32 max_req_sz; 1256 __le32 max_resp_sz; 1257 u8 max_req_sg_elems; 1258 u8 max_resp_sg_elems; 1259} __packed; 1260 1261enum pds_fwctl_query_entity { 1262 PDS_FWCTL_RPC_ROOT = 0, 1263 PDS_FWCTL_RPC_ENDPOINT = 1, 1264 PDS_FWCTL_RPC_OPERATION = 2, 1265}; 1266 1267#define PDS_FWCTL_RPC_OPCODE_CMD_SHIFT 0 1268#define PDS_FWCTL_RPC_OPCODE_CMD_MASK GENMASK(15, PDS_FWCTL_RPC_OPCODE_CMD_SHIFT) 1269#define PDS_FWCTL_RPC_OPCODE_VER_SHIFT 16 1270#define PDS_FWCTL_RPC_OPCODE_VER_MASK GENMASK(23, PDS_FWCTL_RPC_OPCODE_VER_SHIFT) 1271 1272#define PDS_FWCTL_RPC_OPCODE_GET_CMD(op) FIELD_GET(PDS_FWCTL_RPC_OPCODE_CMD_MASK, op) 1273#define PDS_FWCTL_RPC_OPCODE_GET_VER(op) FIELD_GET(PDS_FWCTL_RPC_OPCODE_VER_MASK, op) 1274 1275#define PDS_FWCTL_RPC_OPCODE_CMP(op1, op2) \ 1276 (PDS_FWCTL_RPC_OPCODE_GET_CMD(op1) == PDS_FWCTL_RPC_OPCODE_GET_CMD(op2) && \ 1277 PDS_FWCTL_RPC_OPCODE_GET_VER(op1) <= PDS_FWCTL_RPC_OPCODE_GET_VER(op2)) 1278 1279/* 1280 * FW command attributes that map to the FWCTL scope values 1281 */ 1282#define PDSFC_FW_CMD_ATTR_READ 0x00 1283#define PDSFC_FW_CMD_ATTR_DEBUG_READ 0x02 1284#define PDSFC_FW_CMD_ATTR_WRITE 0x04 1285#define PDSFC_FW_CMD_ATTR_DEBUG_WRITE 0x08 1286#define PDSFC_FW_CMD_ATTR_SYNC 0x10 1287 1288/** 1289 * struct pds_fwctl_query_cmd - Firmware control query command structure 1290 * @opcode: Operation code for the command 1291 * @entity: Entity type to query (enum pds_fwctl_query_entity) 1292 * @version: Version of the query data structure supported by the driver 1293 * @rsvd: Reserved 1294 * @query_data_buf_len: Length of the query data buffer 1295 * @query_data_buf_pa: Physical address of the query data buffer 1296 * @ep: Endpoint identifier to query (when entity is PDS_FWCTL_RPC_ENDPOINT) 1297 * @op: Operation identifier to query (when entity is PDS_FWCTL_RPC_OPERATION) 1298 * 1299 * This structure is used to send a query command to the firmware control 1300 * interface. The structure is packed to ensure there is no padding between 1301 * the fields. 1302 */ 1303struct pds_fwctl_query_cmd { 1304 u8 opcode; 1305 u8 entity; 1306 u8 version; 1307 u8 rsvd; 1308 __le32 query_data_buf_len; 1309 __le64 query_data_buf_pa; 1310 union { 1311 __le32 ep; 1312 __le32 op; 1313 }; 1314} __packed; 1315 1316/** 1317 * struct pds_fwctl_query_comp - Firmware control query completion structure 1318 * @status: Status of the query command 1319 * @rsvd: Reserved 1320 * @comp_index: Completion index in little-endian format 1321 * @version: Version of the query data structure returned by firmware. This 1322 * should be less than or equal to the version supported by the driver 1323 * @rsvd2: Reserved 1324 * @color: Color bit indicating the state of the completion 1325 */ 1326struct pds_fwctl_query_comp { 1327 u8 status; 1328 u8 rsvd; 1329 __le16 comp_index; 1330 u8 version; 1331 u8 rsvd2[2]; 1332 u8 color; 1333} __packed; 1334 1335/** 1336 * struct pds_fwctl_query_data_endpoint - query data for entity PDS_FWCTL_RPC_ROOT 1337 * @id: The identifier for the data endpoint 1338 */ 1339struct pds_fwctl_query_data_endpoint { 1340 __le32 id; 1341} __packed; 1342 1343/** 1344 * struct pds_fwctl_query_data_operation - query data for entity PDS_FWCTL_RPC_ENDPOINT 1345 * @id: Operation identifier 1346 * @scope: Scope of the operation (enum fwctl_rpc_scope) 1347 * @rsvd: Reserved 1348 */ 1349struct pds_fwctl_query_data_operation { 1350 __le32 id; 1351 u8 scope; 1352 u8 rsvd[3]; 1353} __packed; 1354 1355/** 1356 * struct pds_fwctl_query_data - query data structure 1357 * @version: Version of the query data structure 1358 * @rsvd: Reserved 1359 * @num_entries: Number of entries in the union 1360 * @entries: Array of query data entries, depending on the entity type 1361 */ 1362struct pds_fwctl_query_data { 1363 u8 version; 1364 u8 rsvd[3]; 1365 __le32 num_entries; 1366 u8 entries[] __counted_by_le(num_entries); 1367} __packed; 1368 1369/** 1370 * struct pds_fwctl_rpc_cmd - Firmware control RPC command 1371 * @opcode: opcode PDS_FWCTL_CMD_RPC 1372 * @rsvd: Reserved 1373 * @flags: Indicates indirect request and/or response handling 1374 * @ep: Endpoint identifier 1375 * @op: Operation identifier 1376 * @inline_req0: Buffer for inline request 1377 * @inline_req1: Buffer for inline request 1378 * @req_pa: Physical address of request data 1379 * @req_sz: Size of the request 1380 * @req_sg_elems: Number of request SGs 1381 * @req_rsvd: Reserved 1382 * @inline_req2: Buffer for inline request 1383 * @resp_pa: Physical address of response data 1384 * @resp_sz: Size of the response 1385 * @resp_sg_elems: Number of response SGs 1386 * @resp_rsvd: Reserved 1387 */ 1388struct pds_fwctl_rpc_cmd { 1389 u8 opcode; 1390 u8 rsvd; 1391 __le16 flags; 1392#define PDS_FWCTL_RPC_IND_REQ 0x1 1393#define PDS_FWCTL_RPC_IND_RESP 0x2 1394 __le32 ep; 1395 __le32 op; 1396 u8 inline_req0[16]; 1397 union { 1398 u8 inline_req1[16]; 1399 struct { 1400 __le64 req_pa; 1401 __le32 req_sz; 1402 u8 req_sg_elems; 1403 u8 req_rsvd[3]; 1404 }; 1405 }; 1406 union { 1407 u8 inline_req2[16]; 1408 struct { 1409 __le64 resp_pa; 1410 __le32 resp_sz; 1411 u8 resp_sg_elems; 1412 u8 resp_rsvd[3]; 1413 }; 1414 }; 1415} __packed; 1416 1417/** 1418 * struct pds_sg_elem - Transmit scatter-gather (SG) descriptor element 1419 * @addr: DMA address of SG element data buffer 1420 * @len: Length of SG element data buffer, in bytes 1421 * @rsvd: Reserved 1422 */ 1423struct pds_sg_elem { 1424 __le64 addr; 1425 __le32 len; 1426 u8 rsvd[4]; 1427} __packed; 1428 1429/** 1430 * struct pds_fwctl_rpc_comp - Completion of a firmware control RPC 1431 * @status: Status of the command 1432 * @rsvd: Reserved 1433 * @comp_index: Completion index of the command 1434 * @err: Error code, if any, from the RPC 1435 * @resp_sz: Size of the response 1436 * @rsvd2: Reserved 1437 * @color: Color bit indicating the state of the completion 1438 */ 1439struct pds_fwctl_rpc_comp { 1440 u8 status; 1441 u8 rsvd; 1442 __le16 comp_index; 1443 __le32 err; 1444 __le32 resp_sz; 1445 u8 rsvd2[3]; 1446 u8 color; 1447} __packed; 1448 1449union pds_core_adminq_cmd { 1450 u8 opcode; 1451 u8 bytes[64]; 1452 1453 struct pds_core_client_reg_cmd client_reg; 1454 struct pds_core_client_unreg_cmd client_unreg; 1455 struct pds_core_client_request_cmd client_request; 1456 1457 struct pds_core_lif_identify_cmd lif_ident; 1458 struct pds_core_lif_init_cmd lif_init; 1459 struct pds_core_lif_reset_cmd lif_reset; 1460 struct pds_core_lif_setattr_cmd lif_setattr; 1461 struct pds_core_lif_getattr_cmd lif_getattr; 1462 1463 struct pds_core_q_identify_cmd q_ident; 1464 struct pds_core_q_init_cmd q_init; 1465 1466 struct pds_vdpa_cmd vdpa; 1467 struct pds_vdpa_init_cmd vdpa_init; 1468 struct pds_vdpa_ident_cmd vdpa_ident; 1469 struct pds_vdpa_status_cmd vdpa_status; 1470 struct pds_vdpa_setattr_cmd vdpa_setattr; 1471 struct pds_vdpa_set_features_cmd vdpa_set_features; 1472 struct pds_vdpa_vq_init_cmd vdpa_vq_init; 1473 struct pds_vdpa_vq_reset_cmd vdpa_vq_reset; 1474 1475 struct pds_lm_suspend_cmd lm_suspend; 1476 struct pds_lm_suspend_status_cmd lm_suspend_status; 1477 struct pds_lm_resume_cmd lm_resume; 1478 struct pds_lm_state_size_cmd lm_state_size; 1479 struct pds_lm_save_cmd lm_save; 1480 struct pds_lm_restore_cmd lm_restore; 1481 struct pds_lm_host_vf_status_cmd lm_host_vf_status; 1482 struct pds_lm_dirty_status_cmd lm_dirty_status; 1483 struct pds_lm_dirty_enable_cmd lm_dirty_enable; 1484 struct pds_lm_dirty_disable_cmd lm_dirty_disable; 1485 struct pds_lm_dirty_seq_ack_cmd lm_dirty_seq_ack; 1486 1487 struct pds_fwctl_cmd fwctl; 1488 struct pds_fwctl_ident_cmd fwctl_ident; 1489 struct pds_fwctl_rpc_cmd fwctl_rpc; 1490 struct pds_fwctl_query_cmd fwctl_query; 1491}; 1492 1493union pds_core_adminq_comp { 1494 struct { 1495 u8 status; 1496 u8 rsvd; 1497 __le16 comp_index; 1498 u8 rsvd2[11]; 1499 u8 color; 1500 }; 1501 u32 words[4]; 1502 1503 struct pds_core_client_reg_comp client_reg; 1504 1505 struct pds_core_lif_identify_comp lif_ident; 1506 struct pds_core_lif_init_comp lif_init; 1507 struct pds_core_lif_setattr_comp lif_setattr; 1508 struct pds_core_lif_getattr_comp lif_getattr; 1509 1510 struct pds_core_q_identify_comp q_ident; 1511 struct pds_core_q_init_comp q_init; 1512 1513 struct pds_vdpa_vq_init_comp vdpa_vq_init; 1514 struct pds_vdpa_vq_reset_comp vdpa_vq_reset; 1515 1516 struct pds_lm_state_size_comp lm_state_size; 1517 struct pds_lm_dirty_status_comp lm_dirty_status; 1518 1519 struct pds_fwctl_comp fwctl; 1520 struct pds_fwctl_rpc_comp fwctl_rpc; 1521 struct pds_fwctl_query_comp fwctl_query; 1522}; 1523 1524#ifndef __CHECKER__ 1525static_assert(sizeof(union pds_core_adminq_cmd) == 64); 1526static_assert(sizeof(union pds_core_adminq_comp) == 16); 1527static_assert(sizeof(union pds_core_notifyq_comp) == 64); 1528#endif /* __CHECKER__ */ 1529 1530/* The color bit is a 'done' bit for the completion descriptors 1531 * where the meaning alternates between '1' and '0' for alternating 1532 * passes through the completion descriptor ring. 1533 */ 1534static inline bool pdsc_color_match(u8 color, bool done_color) 1535{ 1536 return (!!(color & PDS_COMP_COLOR_MASK)) == done_color; 1537} 1538 1539struct pdsc; 1540int pdsc_adminq_post(struct pdsc *pdsc, 1541 union pds_core_adminq_cmd *cmd, 1542 union pds_core_adminq_comp *comp, 1543 bool fast_poll); 1544 1545#endif /* _PDS_CORE_ADMINQ_H_ */