1 /* 2 * BSD LICENSE 3 * 4 * Copyright(c) 2017 Cavium, Inc.. All rights reserved. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * * Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * * Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * * Neither the name of Cavium, Inc. nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 * OWNER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 /*$FreeBSD$*/ 34 35 /* 36 * \brief Host Driver: This file defines the octeon device structure. 37 */ 38 39 #ifndef _LIO_DEVICE_H_ 40 #define _LIO_DEVICE_H_ 41 42 #include <sys/endian.h> /* for BYTE_ORDER */ 43 44 /* PCI VendorId Device Id */ 45 #define LIO_CN23XX_PF_PCIID 0x9702177d 46 /* 47 * Driver identifies chips by these Ids, created by clubbing together 48 * DeviceId+RevisionId; Where Revision Id is not used to distinguish 49 * between chips, a value of 0 is used for revision id. 50 */ 51 #define LIO_CN23XX_PF_VID 0x9702 52 #define LIO_CN2350_10G_SUBDEVICE 0x03 53 #define LIO_CN2350_10G_SUBDEVICE1 0x04 54 #define LIO_CN2360_10G_SUBDEVICE 0x05 55 #define LIO_CN2350_25G_SUBDEVICE 0x07 56 #define LIO_CN2360_25G_SUBDEVICE 0x06 57 58 59 /* Endian-swap modes supported by Octeon. */ 60 enum lio_pci_swap_mode { 61 LIO_PCI_PASSTHROUGH = 0, 62 LIO_PCI_SWAP_64BIT = 1, 63 LIO_PCI_SWAP_32BIT = 2, 64 LIO_PCI_LW_SWAP_32BIT = 3 65 }; 66 67 enum { 68 LIO_CFG_TYPE_DEFAULT = 0, 69 LIO_NUM_CFGS, 70 }; 71 72 #define OCTEON_OUTPUT_INTR (2) 73 #define OCTEON_ALL_INTR 0xff 74 75 /*--------------- PCI BAR1 index registers -------------*/ 76 77 /* BAR1 Mask */ 78 #define LIO_PCI_BAR1_ENABLE_CA 1 79 #define LIO_PCI_BAR1_ENDIAN_MODE LIO_PCI_SWAP_64BIT 80 #define LIO_PCI_BAR1_ENTRY_VALID 1 81 #define LIO_PCI_BAR1_MASK ((LIO_PCI_BAR1_ENABLE_CA << 3) | \ 82 (LIO_PCI_BAR1_ENDIAN_MODE << 1) | \ 83 LIO_PCI_BAR1_ENTRY_VALID) 84 85 /* 86 * Octeon Device state. 87 * Each octeon device goes through each of these states 88 * as it is initialized. 89 */ 90 #define LIO_DEV_BEGIN_STATE 0x0 91 #define LIO_DEV_PCI_ENABLE_DONE 0x1 92 #define LIO_DEV_PCI_MAP_DONE 0x2 93 #define LIO_DEV_DISPATCH_INIT_DONE 0x3 94 #define LIO_DEV_INSTR_QUEUE_INIT_DONE 0x4 95 #define LIO_DEV_SC_BUFF_POOL_INIT_DONE 0x5 96 #define LIO_DEV_MSIX_ALLOC_VECTOR_DONE 0x6 97 #define LIO_DEV_RESP_LIST_INIT_DONE 0x7 98 #define LIO_DEV_DROQ_INIT_DONE 0x8 99 #define LIO_DEV_INTR_SET_DONE 0xa 100 #define LIO_DEV_IO_QUEUES_DONE 0xb 101 #define LIO_DEV_CONSOLE_INIT_DONE 0xc 102 #define LIO_DEV_HOST_OK 0xd 103 #define LIO_DEV_CORE_OK 0xe 104 #define LIO_DEV_RUNNING 0xf 105 #define LIO_DEV_IN_RESET 0x10 106 #define LIO_DEV_STATE_INVALID 0x11 107 108 #define LIO_DEV_STATES LIO_DEV_STATE_INVALID 109 110 /* 111 * Octeon Device interrupts 112 * These interrupt bits are set in int_status filed of 113 * octeon_device structure 114 */ 115 #define LIO_DEV_INTR_DMA0_FORCE 0x01 116 #define LIO_DEV_INTR_DMA1_FORCE 0x02 117 #define LIO_DEV_INTR_PKT_DATA 0x04 118 119 #define LIO_RESET_MSECS (3000) 120 121 /*---------------------------DISPATCH LIST-------------------------------*/ 122 123 /* 124 * The dispatch list entry. 125 * The driver keeps a record of functions registered for each 126 * response header opcode in this structure. Since the opcode is 127 * hashed to index into the driver's list, more than one opcode 128 * can hash to the same entry, in which case the list field points 129 * to a linked list with the other entries. 130 */ 131 struct lio_dispatch { 132 /* Singly-linked tail queue node for this entry */ 133 struct lio_stailq_node node; 134 135 /* Singly-linked tail queue head for this entry */ 136 struct lio_stailq_head head; 137 138 /* The opcode for which the dispatch function & arg should be used */ 139 uint16_t opcode; 140 141 /* The function to be called for a packet received by the driver */ 142 lio_dispatch_fn_t dispatch_fn; 143 144 /* 145 * The application specified argument to be passed to the above 146 * function along with the received packet 147 */ 148 void *arg; 149 }; 150 151 /* The dispatch list structure. */ 152 struct lio_dispatch_list { 153 /* access to dispatch list must be atomic */ 154 struct mtx lock; 155 156 /* Count of dispatch functions currently registered */ 157 uint32_t count; 158 159 /* The list of dispatch functions */ 160 struct lio_dispatch *dlist; 161 }; 162 163 /*----------------------- THE OCTEON DEVICE ---------------------------*/ 164 165 #define LIO_MEM_REGIONS 3 166 /* 167 * PCI address space information. 168 * Each of the 3 address spaces given by BAR0, BAR2 and BAR4 of 169 * Octeon gets mapped to different physical address spaces in 170 * the kernel. 171 */ 172 struct lio_mem_bus_space { 173 struct resource *pci_mem; 174 bus_space_tag_t tag; 175 bus_space_handle_t handle; 176 }; 177 178 #define LIO_MAX_MAPS 32 179 180 struct lio_io_enable { 181 uint64_t iq; 182 uint64_t oq; 183 uint64_t iq64B; 184 }; 185 186 struct lio_reg_list { 187 uint32_t pci_win_wr_addr; 188 189 uint32_t pci_win_rd_addr_hi; 190 uint32_t pci_win_rd_addr_lo; 191 uint32_t pci_win_rd_addr; 192 193 uint32_t pci_win_wr_data_hi; 194 uint32_t pci_win_wr_data_lo; 195 uint32_t pci_win_wr_data; 196 197 uint32_t pci_win_rd_data; 198 }; 199 200 #define LIO_MAX_CONSOLE_READ_BYTES 512 201 202 typedef int (*octeon_console_print_fn)(struct octeon_device *oct, 203 uint32_t num, char *pre, char *suf); 204 struct lio_console { 205 uint32_t active; 206 uint32_t waiting; 207 uint64_t addr; 208 uint32_t buffer_size; 209 uint64_t input_base_addr; 210 uint64_t output_base_addr; 211 octeon_console_print_fn print; 212 char leftover[LIO_MAX_CONSOLE_READ_BYTES]; 213 }; 214 215 struct lio_board_info { 216 char name[LIO_BOARD_NAME]; 217 char serial_number[LIO_SERIAL_NUM_LEN]; 218 uint64_t major; 219 uint64_t minor; 220 }; 221 222 struct lio_fn_list { 223 void (*setup_iq_regs) (struct octeon_device *, uint32_t); 224 void (*setup_oq_regs) (struct octeon_device *, uint32_t); 225 226 void (*process_interrupt_regs) (void *); 227 uint64_t (*msix_interrupt_handler) (void *); 228 int (*soft_reset) (struct octeon_device *); 229 int (*setup_device_regs) (struct octeon_device *); 230 void (*bar1_idx_setup) (struct octeon_device *, uint64_t, 231 uint32_t, int); 232 void (*bar1_idx_write) (struct octeon_device *, uint32_t, 233 uint32_t); 234 uint32_t (*bar1_idx_read) (struct octeon_device *, uint32_t); 235 uint32_t (*update_iq_read_idx) (struct lio_instr_queue *); 236 237 void (*enable_interrupt) (struct octeon_device *, uint8_t); 238 void (*disable_interrupt) (struct octeon_device *, uint8_t); 239 240 int (*enable_io_queues) (struct octeon_device *); 241 void (*disable_io_queues) (struct octeon_device *); 242 }; 243 244 /* Must be multiple of 8, changing breaks ABI */ 245 #define LIO_BOOTMEM_NAME_LEN 128 246 247 /* 248 * Structure for named memory blocks 249 * Number of descriptors 250 * available can be changed without affecting compatibility, 251 * but name length changes require a bump in the bootmem 252 * descriptor version 253 * Note: This structure must be naturally 64 bit aligned, as a single 254 * memory image will be used by both 32 and 64 bit programs. 255 */ 256 struct cvmx_bootmem_named_block_desc { 257 /* Base address of named block */ 258 uint64_t base_addr; 259 260 /* Size actually allocated for named block */ 261 uint64_t size; 262 263 /* name of named block */ 264 char name[LIO_BOOTMEM_NAME_LEN]; 265 }; 266 267 struct lio_fw_info { 268 uint32_t max_nic_ports; /* max nic ports for the device */ 269 uint32_t num_gmx_ports; /* num gmx ports */ 270 uint64_t app_cap_flags; /* firmware cap flags */ 271 272 /* 273 * The core application is running in this mode. 274 * See octeon-drv-opcodes.h for values. 275 */ 276 uint32_t app_mode; 277 char lio_firmware_version[32]; 278 }; 279 280 struct lio_callout { 281 struct callout timer; 282 void *ctxptr; 283 uint64_t ctxul; 284 }; 285 286 #define LIO_NIC_STARTER_TIMEOUT 30000 /* 30000ms (30s) */ 287 288 struct lio_tq { 289 struct taskqueue *tq; 290 struct timeout_task work; 291 void *ctxptr; 292 uint64_t ctxul; 293 }; 294 295 struct lio_if_props { 296 /* 297 * Each interface in the Octeon device has a network 298 * device pointer (used for OS specific calls). 299 */ 300 int rx_on; 301 int gmxport; 302 struct ifnet *ifp; 303 }; 304 305 #define LIO_MSIX_PO_INT 0x1 306 #define LIO_MSIX_PI_INT 0x2 307 308 struct lio_pf_vf_hs_word { 309 #if BYTE_ORDER == LITTLE_ENDIAN 310 /* PKIND value assigned for the DPI interface */ 311 uint64_t pkind:8; 312 313 /* OCTEON core clock multiplier */ 314 uint64_t core_tics_per_us:16; 315 316 /* OCTEON coprocessor clock multiplier */ 317 uint64_t coproc_tics_per_us:16; 318 319 /* app that currently running on OCTEON */ 320 uint64_t app_mode:8; 321 322 /* RESERVED */ 323 uint64_t reserved:16; 324 325 #else /* BYTE_ORDER != LITTLE_ENDIAN */ 326 327 /* RESERVED */ 328 uint64_t reserved:16; 329 330 /* app that currently running on OCTEON */ 331 uint64_t app_mode:8; 332 333 /* OCTEON coprocessor clock multiplier */ 334 uint64_t coproc_tics_per_us:16; 335 336 /* OCTEON core clock multiplier */ 337 uint64_t core_tics_per_us:16; 338 339 /* PKIND value assigned for the DPI interface */ 340 uint64_t pkind:8; 341 #endif /* BYTE_ORDER == LITTLE_ENDIAN */ 342 }; 343 344 struct lio_sriov_info { 345 346 /* Actual rings left for PF device */ 347 uint32_t num_pf_rings; 348 349 /* SRN of PF usable IO queues */ 350 uint32_t pf_srn; 351 352 /* total pf rings */ 353 uint32_t trs; 354 }; 355 356 struct lio_ioq_vector { 357 struct octeon_device *oct_dev; 358 struct resource *msix_res; 359 void *tag; 360 int droq_index; 361 int vector; 362 cpuset_t affinity_mask; 363 uint32_t ioq_num; 364 }; 365 366 /* 367 * The Octeon device. 368 * Each Octeon device has this structure to represent all its 369 * components. 370 */ 371 struct octeon_device { 372 /* Lock for PCI window configuration accesses */ 373 struct mtx pci_win_lock; 374 375 /* Lock for memory accesses */ 376 struct mtx mem_access_lock; 377 378 /* PCI device pointer */ 379 device_t device; 380 381 /* Chip specific information. */ 382 void *chip; 383 384 /* Number of interfaces detected in this octeon device. */ 385 uint32_t ifcount; 386 387 struct lio_if_props props; 388 389 /* Octeon Chip type. */ 390 uint16_t chip_id; 391 392 uint16_t rev_id; 393 394 uint16_t subdevice_id; 395 396 uint16_t pf_num; 397 398 399 /* This device's id - set by the driver. */ 400 uint32_t octeon_id; 401 402 /* This device's PCIe port used for traffic. */ 403 uint16_t pcie_port; 404 405 uint16_t flags; 406 #define LIO_FLAG_MSIX_ENABLED (uint32_t)(1 << 2) 407 408 /* The state of this device */ 409 volatile int status; 410 411 /* memory mapped io range */ 412 struct lio_mem_bus_space mem_bus_space[LIO_MEM_REGIONS]; 413 414 struct lio_reg_list reg_list; 415 416 struct lio_fn_list fn_list; 417 418 struct lio_board_info boardinfo; 419 420 uint32_t num_iqs; 421 422 /* The pool containing pre allocated buffers used for soft commands */ 423 struct lio_sc_buffer_pool sc_buf_pool; 424 425 /* The input instruction queues */ 426 struct lio_instr_queue *instr_queue[LIO_MAX_POSSIBLE_INSTR_QUEUES]; 427 428 /* The doubly-linked list of instruction response */ 429 struct lio_response_list response_list[LIO_MAX_RESPONSE_LISTS]; 430 431 uint32_t num_oqs; 432 433 /* The DROQ output queues */ 434 struct lio_droq *droq[LIO_MAX_POSSIBLE_OUTPUT_QUEUES]; 435 436 struct lio_io_enable io_qmask; 437 438 /* List of dispatch functions */ 439 struct lio_dispatch_list dispatch; 440 441 uint32_t int_status; 442 443 /* Physical location of the cvmx_bootmem_desc_t in octeon memory */ 444 uint64_t bootmem_desc_addr; 445 446 /* 447 * Placeholder memory for named blocks. 448 * Assumes single-threaded access 449 */ 450 struct cvmx_bootmem_named_block_desc bootmem_named_block_desc; 451 452 /* Address of consoles descriptor */ 453 uint64_t console_desc_addr; 454 455 /* Number of consoles available. 0 means they are inaccessible */ 456 uint32_t num_consoles; 457 458 /* Console caches */ 459 struct lio_console console[LIO_MAX_MAPS]; 460 461 /* Console named block info */ 462 struct { 463 uint64_t dram_region_base; 464 int bar1_index; 465 } console_nb_info; 466 467 /* Coprocessor clock rate. */ 468 uint64_t coproc_clock_rate; 469 470 /* 471 * The core application is running in this mode. See lio_common.h 472 * for values. 473 */ 474 uint32_t app_mode; 475 476 struct lio_fw_info fw_info; 477 478 /* The name given to this device. */ 479 char device_name[32]; 480 481 struct lio_tq dma_comp_tq; 482 483 /* Lock for dma response list */ 484 struct mtx cmd_resp_wqlock; 485 uint32_t cmd_resp_state; 486 487 struct lio_tq check_db_tq[LIO_MAX_POSSIBLE_INSTR_QUEUES]; 488 489 struct lio_callout console_timer[LIO_MAX_MAPS]; 490 491 int num_msix_irqs; 492 493 /* For PF, there is one non-ioq interrupt handler */ 494 struct resource *msix_res; 495 int aux_vector; 496 void *tag; 497 498 #define INTRNAMSIZ (32) 499 #define IRQ_NAME_OFF(i) ((i) * INTRNAMSIZ) 500 501 struct lio_sriov_info sriov_info; 502 503 struct lio_pf_vf_hs_word pfvf_hsword; 504 505 int msix_on; 506 507 /* IOq information of it's corresponding MSI-X interrupt. */ 508 struct lio_ioq_vector *ioq_vector; 509 510 int rx_pause; 511 int tx_pause; 512 513 /* TX/RX process pkt budget */ 514 uint32_t rx_budget; 515 uint32_t tx_budget; 516 517 struct octeon_link_stats link_stats; /* stastics from firmware */ 518 519 struct proc *watchdog_task; 520 521 volatile bool cores_crashed; 522 523 uint32_t rx_coalesce_usecs; 524 uint32_t rx_max_coalesced_frames; 525 uint32_t tx_max_coalesced_frames; 526 527 #define OCTEON_UBOOT_BUFFER_SIZE 512 528 char uboot_version[OCTEON_UBOOT_BUFFER_SIZE]; 529 int uboot_len; 530 int uboot_sidx, uboot_eidx; 531 532 struct { 533 int bus; 534 int dev; 535 int func; 536 } loc; 537 538 volatile int *adapter_refcount; /* reference count of adapter */ 539 }; 540 541 #define LIO_DRV_ONLINE 1 542 #define LIO_DRV_OFFLINE 2 543 #define LIO_CN23XX_PF(oct) ((oct)->chip_id == LIO_CN23XX_PF_VID) 544 #define LIO_CHIP_CONF(oct, TYPE) \ 545 (((struct lio_ ## TYPE *)((oct)->chip))->conf) 546 #define MAX_IO_PENDING_PKT_COUNT 100 547 548 /*------------------ Function Prototypes ----------------------*/ 549 550 /* Initialize device list memory */ 551 void lio_init_device_list(int conf_type); 552 553 /* Free memory for Input and Output queue structures for a octeon device */ 554 void lio_free_device_mem(struct octeon_device *oct); 555 556 /* 557 * Look up a free entry in the octeon_device table and allocate resources 558 * for the octeon_device structure for an octeon device. Called at init 559 * time. 560 */ 561 struct octeon_device *lio_allocate_device(device_t device); 562 563 /* 564 * Register a device's bus location at initialization time. 565 * @param oct - pointer to the octeon device structure. 566 * @param bus - PCIe bus # 567 * @param dev - PCIe device # 568 * @param func - PCIe function # 569 * @param is_pf - TRUE for PF, FALSE for VF 570 * @return reference count of device's adapter 571 */ 572 int lio_register_device(struct octeon_device *oct, int bus, int dev, 573 int func, int is_pf); 574 575 /* 576 * Deregister a device at de-initialization time. 577 * @param oct - pointer to the octeon device structure. 578 * @return reference count of device's adapter 579 */ 580 int lio_deregister_device(struct octeon_device *oct); 581 582 /* 583 * Initialize the driver's dispatch list which is a mix of a hash table 584 * and a linked list. This is done at driver load time. 585 * @param octeon_dev - pointer to the octeon device structure. 586 * @return 0 on success, else -ve error value 587 */ 588 int lio_init_dispatch_list(struct octeon_device *octeon_dev); 589 590 /* 591 * Delete the driver's dispatch list and all registered entries. 592 * This is done at driver unload time. 593 * @param octeon_dev - pointer to the octeon device structure. 594 */ 595 void lio_delete_dispatch_list(struct octeon_device *octeon_dev); 596 597 /* 598 * Initialize the core device fields with the info returned by the FW. 599 * @param recv_info - Receive info structure 600 * @param buf - Receive buffer 601 */ 602 int lio_core_drv_init(struct lio_recv_info *recv_info, void *buf); 603 604 /* 605 * Gets the dispatch function registered to receive packets with a 606 * given opcode/subcode. 607 * @param octeon_dev - the octeon device pointer. 608 * @param opcode - the opcode for which the dispatch function 609 * is to checked. 610 * @param subcode - the subcode for which the dispatch function 611 * is to checked. 612 * 613 * @return Success: lio_dispatch_fn_t (dispatch function pointer) 614 * @return Failure: NULL 615 * 616 * Looks up the dispatch list to get the dispatch function for a 617 * given opcode. 618 */ 619 lio_dispatch_fn_t lio_get_dispatch(struct octeon_device *octeon_dev, 620 uint16_t opcode, uint16_t subcode); 621 622 /* 623 * Get the octeon device pointer. 624 * @param octeon_id - The id for which the octeon device pointer is required. 625 * @return Success: Octeon device pointer. 626 * @return Failure: NULL. 627 */ 628 struct octeon_device *lio_get_device(uint32_t octeon_id); 629 630 /* 631 * Get the octeon id assigned to the octeon device passed as argument. 632 * This function is exported to other modules. 633 * @param dev - octeon device pointer passed as a void *. 634 * @return octeon device id 635 */ 636 int lio_get_device_id(void *dev); 637 638 static inline uint16_t 639 OCTEON_MAJOR_REV(struct octeon_device *oct) 640 { 641 642 uint16_t rev = (oct->rev_id & 0xC) >> 2; 643 644 return ((rev == 0) ? 1 : rev); 645 } 646 647 static inline uint16_t 648 OCTEON_MINOR_REV(struct octeon_device *oct) 649 { 650 651 return (oct->rev_id & 0x3); 652 } 653 654 /* 655 * Read windowed register. 656 * @param oct - pointer to the Octeon device. 657 * @param addr - Address of the register to read. 658 * 659 * This routine is called to read from the indirectly accessed 660 * Octeon registers that are visible through a PCI BAR0 mapped window 661 * register. 662 * @return - 64 bit value read from the register. 663 */ 664 665 uint64_t lio_pci_readq(struct octeon_device *oct, uint64_t addr); 666 667 /* 668 * Write windowed register. 669 * @param oct - pointer to the Octeon device. 670 * @param val - Value to write 671 * @param addr - Address of the register to write 672 * 673 * This routine is called to write to the indirectly accessed 674 * Octeon registers that are visible through a PCI BAR0 mapped window 675 * register. 676 * @return Nothing. 677 */ 678 void lio_pci_writeq(struct octeon_device *oct, uint64_t val, uint64_t addr); 679 680 /* 681 * Checks if memory access is okay 682 * 683 * @param oct which octeon to send to 684 * @return Zero on success, negative on failure. 685 */ 686 int lio_mem_access_ok(struct octeon_device *oct); 687 688 /* 689 * Waits for DDR initialization. 690 * 691 * @param oct which octeon to send to 692 * @param timeout_in_ms pointer to how long to wait until DDR is initialized 693 * in ms. 694 * If contents are 0, it waits until contents are non-zero 695 * before starting to check. 696 * @return Zero on success, negative on failure. 697 */ 698 int lio_wait_for_ddr_init(struct octeon_device *oct, 699 unsigned long *timeout_in_ms); 700 701 /* 702 * Wait for u-boot to boot and be waiting for a command. 703 * 704 * @param wait_time_hundredths 705 * Maximum time to wait 706 * 707 * @return Zero on success, negative on failure. 708 */ 709 int lio_wait_for_bootloader(struct octeon_device *oct, 710 uint32_t wait_time_hundredths); 711 712 /* 713 * Initialize console access 714 * 715 * @param oct which octeon initialize 716 * @return Zero on success, negative on failure. 717 */ 718 int lio_init_consoles(struct octeon_device *oct); 719 720 /* 721 * Adds access to a console to the device. 722 * 723 * @param oct: which octeon to add to 724 * @param console_num: which console 725 * @param dbg_enb: ptr to debug enablement string, one of: 726 * * NULL for no debug output (i.e. disabled) 727 * * empty string enables debug output (via default method) 728 * * specific string to enable debug console output 729 * 730 * @return Zero on success, negative on failure. 731 */ 732 int lio_add_console(struct octeon_device *oct, uint32_t console_num, 733 char *dbg_enb); 734 735 /* write or read from a console */ 736 int lio_console_write(struct octeon_device *oct, uint32_t console_num, 737 char *buffer, uint32_t write_request_size, 738 uint32_t flags); 739 740 /* Removes all attached consoles. */ 741 void lio_remove_consoles(struct octeon_device *oct); 742 743 /* 744 * Send a string to u-boot on console 0 as a command. 745 * 746 * @param oct which octeon to send to 747 * @param cmd_str String to send 748 * @param wait_hundredths Time to wait for u-boot to accept the command. 749 * 750 * @return Zero on success, negative on failure. 751 */ 752 int lio_console_send_cmd(struct octeon_device *oct, char *cmd_str, 753 uint32_t wait_hundredths); 754 755 /* 756 * Parses, validates, and downloads firmware, then boots associated cores. 757 * @param oct which octeon to download firmware to 758 * @param data - The complete firmware file image 759 * @param size - The size of the data 760 * 761 * @return 0 if success. 762 * -EINVAL if file is incompatible or badly formatted. 763 * -ENODEV if no handler was found for the application type or an 764 * invalid octeon id was passed. 765 */ 766 int lio_download_firmware(struct octeon_device *oct, const uint8_t *data, 767 size_t size); 768 769 char *lio_get_state_string(volatile int *state_ptr); 770 771 /* 772 * Sets up instruction queues for the device 773 * @param oct which octeon to setup 774 * 775 * @return 0 if success. 1 if fails 776 */ 777 int lio_setup_instr_queue0(struct octeon_device *oct); 778 779 /* 780 * Sets up output queues for the device 781 * @param oct which octeon to setup 782 * 783 * @return 0 if success. 1 if fails 784 */ 785 int lio_setup_output_queue0(struct octeon_device *oct); 786 787 int lio_get_tx_qsize(struct octeon_device *oct, uint32_t q_no); 788 789 int lio_get_rx_qsize(struct octeon_device *oct, uint32_t q_no); 790 791 /* 792 * Retrieve the config for the device 793 * @param oct which octeon 794 * @param card_type type of card 795 * 796 * @returns pointer to configuration 797 */ 798 void *lio_get_config_info(struct octeon_device *oct, uint16_t card_type); 799 800 /* 801 * Gets the octeon device configuration 802 * @return - pointer to the octeon configuration struture 803 */ 804 struct lio_config *lio_get_conf(struct octeon_device *oct); 805 806 void lio_free_ioq_vector(struct octeon_device *oct); 807 int lio_allocate_ioq_vector(struct octeon_device *oct); 808 void lio_enable_irq(struct lio_droq *droq, struct lio_instr_queue *iq); 809 810 static inline uint32_t 811 lio_read_pci_cfg(struct octeon_device *oct, uint32_t reg) 812 { 813 814 return (pci_read_config(oct->device, reg, 4)); 815 } 816 817 static inline void 818 lio_write_pci_cfg(struct octeon_device *oct, uint32_t reg, uint32_t value) 819 { 820 821 pci_write_config(oct->device, reg, value, 4); 822 } 823 824 static inline uint8_t 825 lio_read_csr8(struct octeon_device *oct, uint32_t reg) 826 { 827 828 return (bus_space_read_1(oct->mem_bus_space[0].tag, 829 oct->mem_bus_space[0].handle, reg)); 830 } 831 832 static inline void 833 lio_write_csr8(struct octeon_device *oct, uint32_t reg, uint8_t val) 834 { 835 836 bus_space_write_1(oct->mem_bus_space[0].tag, 837 oct->mem_bus_space[0].handle, reg, val); 838 } 839 840 static inline uint16_t 841 lio_read_csr16(struct octeon_device *oct, uint32_t reg) 842 { 843 844 return (bus_space_read_2(oct->mem_bus_space[0].tag, 845 oct->mem_bus_space[0].handle, reg)); 846 } 847 848 static inline void 849 lio_write_csr16(struct octeon_device *oct, uint32_t reg, uint16_t val) 850 { 851 852 bus_space_write_2(oct->mem_bus_space[0].tag, 853 oct->mem_bus_space[0].handle, reg, val); 854 } 855 856 static inline uint32_t 857 lio_read_csr32(struct octeon_device *oct, uint32_t reg) 858 { 859 860 return (bus_space_read_4(oct->mem_bus_space[0].tag, 861 oct->mem_bus_space[0].handle, reg)); 862 } 863 864 static inline void 865 lio_write_csr32(struct octeon_device *oct, uint32_t reg, uint32_t val) 866 { 867 868 bus_space_write_4(oct->mem_bus_space[0].tag, 869 oct->mem_bus_space[0].handle, reg, val); 870 } 871 872 static inline uint64_t 873 lio_read_csr64(struct octeon_device *oct, uint32_t reg) 874 { 875 876 #ifdef __i386__ 877 return (lio_read_csr32(oct, reg) | 878 ((uint64_t)lio_read_csr32(oct, reg + 4) << 32)); 879 #else 880 return (bus_space_read_8(oct->mem_bus_space[0].tag, 881 oct->mem_bus_space[0].handle, reg)); 882 #endif 883 } 884 885 static inline void 886 lio_write_csr64(struct octeon_device *oct, uint32_t reg, uint64_t val) 887 { 888 889 #ifdef __i386__ 890 lio_write_csr32(oct, reg, (uint32_t)val); 891 lio_write_csr32(oct, reg + 4, val >> 32); 892 #else 893 bus_space_write_8(oct->mem_bus_space[0].tag, 894 oct->mem_bus_space[0].handle, reg, val); 895 #endif 896 } 897 898 #endif /* _LIO_DEVICE_H_ */ 899