The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/ntb/ntb.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2016 Alexander Motin <mav@FreeBSD.org>
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24  * SUCH DAMAGE.
   25  *
   26  * $FreeBSD$
   27  */
   28 
   29 #ifndef _NTB_H_
   30 #define _NTB_H_
   31 
   32 #include "ntb_if.h"
   33 
   34 SYSCTL_DECL(_hw_ntb);
   35 
   36 int ntb_register_device(device_t ntb);
   37 int ntb_unregister_device(device_t ntb);
   38 int ntb_child_location(device_t dev, device_t child, struct sbuf *sb);
   39 int ntb_print_child(device_t dev, device_t child);
   40 bus_dma_tag_t ntb_get_dma_tag(device_t bus, device_t child);
   41 
   42 /*
   43  * ntb_link_event() - notify driver context of a change in link status
   44  * @ntb:        NTB device context
   45  *
   46  * Notify the driver context that the link status may have changed.  The driver
   47  * should call intb_link_is_up() to get the current status.
   48  */
   49 void ntb_link_event(device_t ntb);
   50 
   51 /*
   52  * ntb_db_event() - notify driver context of a doorbell event
   53  * @ntb:        NTB device context
   54  * @vector:     Interrupt vector number
   55  *
   56  * Notify the driver context of a doorbell event.  If hardware supports
   57  * multiple interrupt vectors for doorbells, the vector number indicates which
   58  * vector received the interrupt.  The vector number is relative to the first
   59  * vector used for doorbells, starting at zero, and must be less than
   60  * ntb_db_vector_count().  The driver may call ntb_db_read() to check which
   61  * doorbell bits need service, and ntb_db_vector_mask() to determine which of
   62  * those bits are associated with the vector number.
   63  */
   64 void ntb_db_event(device_t ntb, uint32_t vec);
   65 
   66 /**
   67  * ntb_port_number() - get the local port number
   68  * @ntb:        NTB device context.
   69  *
   70  * Hardware driver returns local port number in compliance with topology.
   71  *
   72  * Return: the local port number
   73  */
   74 int ntb_port_number(device_t ntb);
   75 
   76 /**
   77  * ntb_port_count() - get the number of peer device ports
   78  * @ntb:        NTB device context.
   79  *
   80  * By default hardware driver supports just one peer device.
   81  *
   82  * Return: the number of peer ports
   83  */
   84 int ntb_peer_port_count(device_t ntb);
   85 
   86 /**
   87  * ntb_peer_port_number() - get the peer port by given index
   88  * @ntb:        NTB device context.
   89  * @idx:        Peer port index (should be zero for now).
   90  *
   91  * By default hardware driver supports just one peer device, so this method
   92  * shall return the corresponding value.
   93  *
   94  * Return: the peer device port or an error number
   95  */
   96 int ntb_peer_port_number(device_t ntb, int pidx);
   97 
   98 /*
   99  * ntb_peer_port_idx() - get the peer device port index by given port
  100  *                       number
  101  * @ntb:        NTB device context.
  102  * @port:       Peer port number
  103  *
  104  * By default hardware driver supports just one peer device, so given a
  105  * valid peer port number, the return value shall be zero.
  106  *
  107  * Return: the peer port index or an error number
  108  */
  109 int ntb_peer_port_idx(device_t ntb, int port);
  110 
  111 /*
  112  * ntb_link_is_up() - get the current ntb link state
  113  * @ntb:        NTB device context
  114  * @speed:      OUT - The link speed expressed as PCIe generation number
  115  * @width:      OUT - The link width expressed as the number of PCIe lanes
  116  *
  117  * RETURNS: true or false based on the hardware link state
  118  */
  119 bool ntb_link_is_up(device_t ntb, enum ntb_speed *speed, enum ntb_width *width);
  120 
  121 /*
  122  * ntb_link_enable() - enable the link on the secondary side of the ntb
  123  * @ntb:        NTB device context
  124  * @max_speed:  The maximum link speed expressed as PCIe generation number[0]
  125  * @max_width:  The maximum link width expressed as the number of PCIe lanes[0]
  126  *
  127  * Enable the link on the secondary side of the ntb.  This can only be done
  128  * from the primary side of the ntb in primary or b2b topology.  The ntb device
  129  * should train the link to its maximum speed and width, or the requested speed
  130  * and width, whichever is smaller, if supported.
  131  *
  132  * Return: Zero on success, otherwise an error number.
  133  *
  134  * [0]: Only NTB_SPEED_AUTO and NTB_WIDTH_AUTO are valid inputs; other speed
  135  *      and width input will be ignored.
  136  */
  137 int ntb_link_enable(device_t ntb, enum ntb_speed speed, enum ntb_width width);
  138 
  139 /*
  140  * ntb_link_disable() - disable the link on the secondary side of the ntb
  141  * @ntb:        NTB device context
  142  *
  143  * Disable the link on the secondary side of the ntb.  This can only be done
  144  * from the primary side of the ntb in primary or b2b topology.  The ntb device
  145  * should disable the link.  Returning from this call must indicate that a
  146  * barrier has passed, though with no more writes may pass in either direction
  147  * across the link, except if this call returns an error number.
  148  *
  149  * Return: Zero on success, otherwise an error number.
  150  */
  151 int ntb_link_disable(device_t ntb);
  152 
  153 /*
  154  * get enable status of the link on the secondary side of the ntb
  155  */
  156 bool ntb_link_enabled(device_t ntb);
  157 
  158 /*
  159  * ntb_set_ctx() - associate a driver context with an ntb device
  160  * @ntb:        NTB device context
  161  * @ctx:        Driver context
  162  * @ctx_ops:    Driver context operations
  163  *
  164  * Associate a driver context and operations with a ntb device.  The context is
  165  * provided by the client driver, and the driver may associate a different
  166  * context with each ntb device.
  167  *
  168  * Return: Zero if the context is associated, otherwise an error number.
  169  */
  170 int ntb_set_ctx(device_t ntb, void *ctx, const struct ntb_ctx_ops *ctx_ops);
  171 
  172 /*
  173  * ntb_set_ctx() - get a driver context associated with an ntb device
  174  * @ntb:        NTB device context
  175  * @ctx_ops:    Driver context operations
  176  *
  177  * Get a driver context and operations associated with a ntb device.
  178  */
  179 void * ntb_get_ctx(device_t ntb, const struct ntb_ctx_ops **ctx_ops);
  180 
  181 /*
  182  * ntb_clear_ctx() - disassociate any driver context from an ntb device
  183  * @ntb:        NTB device context
  184  *
  185  * Clear any association that may exist between a driver context and the ntb
  186  * device.
  187  */
  188 void ntb_clear_ctx(device_t ntb);
  189 
  190 /*
  191  * ntb_mw_count() - Get the number of memory windows available for KPI
  192  * consumers.
  193  *
  194  * (Excludes any MW wholly reserved for register access.)
  195  */
  196 uint8_t ntb_mw_count(device_t ntb);
  197 
  198 /*
  199  * ntb_mw_get_range() - get the range of a memory window
  200  * @ntb:        NTB device context
  201  * @idx:        Memory window number
  202  * @base:       OUT - the base address for mapping the memory window
  203  * @size:       OUT - the size for mapping the memory window
  204  * @align:      OUT - the base alignment for translating the memory window
  205  * @align_size: OUT - the size alignment for translating the memory window
  206  *
  207  * Get the range of a memory window.  NULL may be given for any output
  208  * parameter if the value is not needed.  The base and size may be used for
  209  * mapping the memory window, to access the peer memory.  The alignment and
  210  * size may be used for translating the memory window, for the peer to access
  211  * memory on the local system.
  212  *
  213  * Return: Zero on success, otherwise an error number.
  214  */
  215 int ntb_mw_get_range(device_t ntb, unsigned mw_idx, vm_paddr_t *base,
  216     caddr_t *vbase, size_t *size, size_t *align, size_t *align_size,
  217     bus_addr_t *plimit);
  218 
  219 /*
  220  * ntb_mw_set_trans() - set the translation of a memory window
  221  * @ntb:        NTB device context
  222  * @idx:        Memory window number
  223  * @addr:       The dma address local memory to expose to the peer
  224  * @size:       The size of the local memory to expose to the peer
  225  *
  226  * Set the translation of a memory window.  The peer may access local memory
  227  * through the window starting at the address, up to the size.  The address
  228  * must be aligned to the alignment specified by ntb_mw_get_range().  The size
  229  * must be aligned to the size alignment specified by ntb_mw_get_range().  The
  230  * address must be below the plimit specified by ntb_mw_get_range() (i.e. for
  231  * 32-bit BARs).
  232  *
  233  * Return: Zero on success, otherwise an error number.
  234  */
  235 int ntb_mw_set_trans(device_t ntb, unsigned mw_idx, bus_addr_t addr,
  236     size_t size);
  237 
  238 /*
  239  * ntb_mw_clear_trans() - clear the translation of a memory window
  240  * @ntb:        NTB device context
  241  * @idx:        Memory window number
  242  *
  243  * Clear the translation of a memory window.  The peer may no longer access
  244  * local memory through the window.
  245  *
  246  * Return: Zero on success, otherwise an error number.
  247  */
  248 int ntb_mw_clear_trans(device_t ntb, unsigned mw_idx);
  249 
  250 /*
  251  * ntb_mw_get_wc - Get the write-combine status of a memory window
  252  *
  253  * Returns:  Zero on success, setting *wc; otherwise an error number (e.g. if
  254  * idx is an invalid memory window).
  255  *
  256  * Mode is a VM_MEMATTR_* type.
  257  */
  258 int ntb_mw_get_wc(device_t ntb, unsigned mw_idx, vm_memattr_t *mode);
  259 
  260 /*
  261  * ntb_mw_set_wc - Set the write-combine status of a memory window
  262  *
  263  * If 'mode' matches the current status, this does nothing and succeeds.  Mode
  264  * is a VM_MEMATTR_* type.
  265  *
  266  * Returns:  Zero on success, setting the caching attribute on the virtual
  267  * mapping of the BAR; otherwise an error number (e.g. if idx is an invalid
  268  * memory window, or if changing the caching attribute fails).
  269  */
  270 int ntb_mw_set_wc(device_t ntb, unsigned mw_idx, vm_memattr_t mode);
  271 
  272 /*
  273  * ntb_spad_count() - get the total scratch regs usable
  274  * @ntb: pointer to ntb_softc instance
  275  *
  276  * This function returns the max 32bit scratchpad registers usable by the
  277  * upper layer.
  278  *
  279  * RETURNS: total number of scratch pad registers available
  280  */
  281 uint8_t ntb_spad_count(device_t ntb);
  282 
  283 /*
  284  * ntb_get_max_spads() - zero local scratch registers
  285  * @ntb: pointer to ntb_softc instance
  286  *
  287  * This functions overwrites all local scratchpad registers with zeroes.
  288  */
  289 void ntb_spad_clear(device_t ntb);
  290 
  291 /*
  292  * ntb_spad_write() - write to the secondary scratchpad register
  293  * @ntb: pointer to ntb_softc instance
  294  * @idx: index to the scratchpad register, 0 based
  295  * @val: the data value to put into the register
  296  *
  297  * This function allows writing of a 32bit value to the indexed scratchpad
  298  * register. The register resides on the secondary (external) side.
  299  *
  300  * RETURNS: An appropriate ERRNO error value on error, or zero for success.
  301  */
  302 int ntb_spad_write(device_t ntb, unsigned int idx, uint32_t val);
  303 
  304 /*
  305  * ntb_spad_read() - read from the primary scratchpad register
  306  * @ntb: pointer to ntb_softc instance
  307  * @idx: index to scratchpad register, 0 based
  308  * @val: pointer to 32bit integer for storing the register value
  309  *
  310  * This function allows reading of the 32bit scratchpad register on
  311  * the primary (internal) side.
  312  *
  313  * RETURNS: An appropriate ERRNO error value on error, or zero for success.
  314  */
  315 int ntb_spad_read(device_t ntb, unsigned int idx, uint32_t *val);
  316 
  317 /*
  318  * ntb_peer_spad_write() - write to the secondary scratchpad register
  319  * @ntb: pointer to ntb_softc instance
  320  * @idx: index to the scratchpad register, 0 based
  321  * @val: the data value to put into the register
  322  *
  323  * This function allows writing of a 32bit value to the indexed scratchpad
  324  * register. The register resides on the secondary (external) side.
  325  *
  326  * RETURNS: An appropriate ERRNO error value on error, or zero for success.
  327  */
  328 int ntb_peer_spad_write(device_t ntb, unsigned int idx, uint32_t val);
  329 
  330 /*
  331  * ntb_peer_spad_read() - read from the primary scratchpad register
  332  * @ntb: pointer to ntb_softc instance
  333  * @idx: index to scratchpad register, 0 based
  334  * @val: pointer to 32bit integer for storing the register value
  335  *
  336  * This function allows reading of the 32bit scratchpad register on
  337  * the primary (internal) side.
  338  *
  339  * RETURNS: An appropriate ERRNO error value on error, or zero for success.
  340  */
  341 int ntb_peer_spad_read(device_t ntb, unsigned int idx, uint32_t *val);
  342 
  343 /*
  344  * ntb_db_valid_mask() - get a mask of doorbell bits supported by the ntb
  345  * @ntb:        NTB device context
  346  *
  347  * Hardware may support different number or arrangement of doorbell bits.
  348  *
  349  * Return: A mask of doorbell bits supported by the ntb.
  350  */
  351 uint64_t ntb_db_valid_mask(device_t ntb);
  352 
  353 /*
  354  * ntb_db_vector_count() - get the number of doorbell interrupt vectors
  355  * @ntb:        NTB device context.
  356  *
  357  * Hardware may support different number of interrupt vectors.
  358  *
  359  * Return: The number of doorbell interrupt vectors.
  360  */
  361 int ntb_db_vector_count(device_t ntb);
  362 
  363 /*
  364  * ntb_db_vector_mask() - get a mask of doorbell bits serviced by a vector
  365  * @ntb:        NTB device context
  366  * @vector:     Doorbell vector number
  367  *
  368  * Each interrupt vector may have a different number or arrangement of bits.
  369  *
  370  * Return: A mask of doorbell bits serviced by a vector.
  371  */
  372 uint64_t ntb_db_vector_mask(device_t ntb, uint32_t vector);
  373 
  374 /*
  375  * ntb_peer_db_addr() - address and size of the peer doorbell register
  376  * @ntb:        NTB device context.
  377  * @db_addr:    OUT - The address of the peer doorbell register.
  378  * @db_size:    OUT - The number of bytes to write the peer doorbell register.
  379  *
  380  * Return the address of the peer doorbell register.  This may be used, for
  381  * example, by drivers that offload memory copy operations to a dma engine.
  382  * The drivers may wish to ring the peer doorbell at the completion of memory
  383  * copy operations.  For efficiency, and to simplify ordering of operations
  384  * between the dma memory copies and the ringing doorbell, the driver may
  385  * append one additional dma memory copy with the doorbell register as the
  386  * destination, after the memory copy operations.
  387  *
  388  * Return: Zero on success, otherwise an error number.
  389  *
  390  * Note that writing the peer doorbell via a memory window will *not* generate
  391  * an interrupt on the remote host; that must be done separately.
  392  */
  393 int ntb_peer_db_addr(device_t ntb, bus_addr_t *db_addr, vm_size_t *db_size);
  394 
  395 /*
  396  * ntb_db_clear() - clear bits in the local doorbell register
  397  * @ntb:        NTB device context.
  398  * @db_bits:    Doorbell bits to clear.
  399  *
  400  * Clear bits in the local doorbell register, arming the bits for the next
  401  * doorbell.
  402  *
  403  * Return: Zero on success, otherwise an error number.
  404  */
  405 void ntb_db_clear(device_t ntb, uint64_t bits);
  406 
  407 /*
  408  * ntb_db_clear_mask() - clear bits in the local doorbell mask
  409  * @ntb:        NTB device context.
  410  * @db_bits:    Doorbell bits to clear.
  411  *
  412  * Clear bits in the local doorbell mask register, allowing doorbell interrupts
  413  * from being generated for those doorbell bits.  If a doorbell bit is already
  414  * set at the time the mask is cleared, and the corresponding mask bit is
  415  * changed from set to clear, then the ntb driver must ensure that
  416  * ntb_db_event() is called.  If the hardware does not generate the interrupt
  417  * on clearing the mask bit, then the driver must call ntb_db_event() anyway.
  418  *
  419  * Return: Zero on success, otherwise an error number.
  420  */
  421 void ntb_db_clear_mask(device_t ntb, uint64_t bits);
  422 
  423 /*
  424  * ntb_db_read() - read the local doorbell register
  425  * @ntb:        NTB device context.
  426  *
  427  * Read the local doorbell register, and return the bits that are set.
  428  *
  429  * Return: The bits currently set in the local doorbell register.
  430  */
  431 uint64_t ntb_db_read(device_t ntb);
  432 
  433 /*
  434  * ntb_db_set_mask() - set bits in the local doorbell mask
  435  * @ntb:        NTB device context.
  436  * @db_bits:    Doorbell mask bits to set.
  437  *
  438  * Set bits in the local doorbell mask register, preventing doorbell interrupts
  439  * from being generated for those doorbell bits.  Bits that were already set
  440  * must remain set.
  441  *
  442  * Return: Zero on success, otherwise an error number.
  443  */
  444 void ntb_db_set_mask(device_t ntb, uint64_t bits);
  445 
  446 /*
  447  * ntb_peer_db_set() - Set the doorbell on the secondary/external side
  448  * @ntb: pointer to ntb_softc instance
  449  * @bit: doorbell bits to ring
  450  *
  451  * This function allows triggering of a doorbell on the secondary/external
  452  * side that will initiate an interrupt on the remote host
  453  */
  454 void ntb_peer_db_set(device_t ntb, uint64_t bits);
  455 
  456 #endif /* _NTB_H_ */

Cache object: 861326e4b078fb79fe5c0871ecd2d7e8


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.