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/isci/scil/scic_sds_unsolicited_frame_control.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  * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
    3  *
    4  * This file is provided under a dual BSD/GPLv2 license.  When using or
    5  * redistributing this file, you may do so under either license.
    6  *
    7  * GPL LICENSE SUMMARY
    8  *
    9  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
   10  *
   11  * This program is free software; you can redistribute it and/or modify
   12  * it under the terms of version 2 of the GNU General Public License as
   13  * published by the Free Software Foundation.
   14  *
   15  * This program is distributed in the hope that it will be useful, but
   16  * WITHOUT ANY WARRANTY; without even the implied warranty of
   17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   18  * General Public License for more details.
   19  *
   20  * You should have received a copy of the GNU General Public License
   21  * along with this program; if not, write to the Free Software
   22  * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
   23  * The full GNU General Public License is included in this distribution
   24  * in the file called LICENSE.GPL.
   25  *
   26  * BSD LICENSE
   27  *
   28  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
   29  * All rights reserved.
   30  *
   31  * Redistribution and use in source and binary forms, with or without
   32  * modification, are permitted provided that the following conditions
   33  * are met:
   34  *
   35  *   * Redistributions of source code must retain the above copyright
   36  *     notice, this list of conditions and the following disclaimer.
   37  *   * Redistributions in binary form must reproduce the above copyright
   38  *     notice, this list of conditions and the following disclaimer in
   39  *     the documentation and/or other materials provided with the
   40  *     distribution.
   41  *
   42  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   43  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   44  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   45  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   46  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   47  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   48  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   49  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   50  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   51  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   52  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   53  *
   54  * $FreeBSD$
   55  */
   56 /**
   57  * @file
   58  *
   59  * @brief This file contains all of the unsolicited frame related
   60  *        management for the address table, the headers, and actual
   61  *        payload buffers.
   62  */
   63 
   64 #ifndef _SCIC_SDS_UNSOLICITED_FRAME_CONTROL_H_
   65 #define _SCIC_SDS_UNSOLICITED_FRAME_CONTROL_H_
   66 
   67 #ifdef __cplusplus
   68 extern "C" {
   69 #endif // __cplusplus
   70 
   71 #include <dev/isci/types.h>
   72 #include <dev/isci/scil/scu_unsolicited_frame.h>
   73 #include <dev/isci/scil/sci_memory_descriptor_list.h>
   74 #include <dev/isci/scil/scu_constants.h>
   75 #include <dev/isci/scil/sci_status.h>
   76 
   77 /**
   78  * @enum UNSOLICITED_FRAME_STATE
   79  *
   80  * This enumeration represents the current unsolicited frame state.  The
   81  * controller object can not updtate the hardware unsolicited frame put
   82  * pointer unless it has already processed the priror unsolicited frames.
   83  */
   84 enum UNSOLICITED_FRAME_STATE
   85 {
   86    /**
   87     * This state is when the frame is empty and not in use.  It is
   88     * different from the released state in that the hardware could DMA
   89     * data to this frame buffer.
   90     */
   91    UNSOLICITED_FRAME_EMPTY,
   92 
   93    /**
   94     * This state is set when the frame buffer is in use by by some
   95     * object in the system.
   96     */
   97    UNSOLICITED_FRAME_IN_USE,
   98 
   99    /**
  100     * This state is set when the frame is returned to the free pool
  101     * but one or more frames prior to this one are still in use.
  102     * Once all of the frame before this one are freed it will go to
  103     * the empty state.
  104     */
  105    UNSOLICITED_FRAME_RELEASED,
  106 
  107    UNSOLICITED_FRAME_MAX_STATES
  108 };
  109 
  110 /**
  111  * @struct SCIC_SDS_UNSOLICITED_FRAME
  112  *
  113  * This is the unsolicited frame data structure it acts as the container for
  114  * the current frame state, frame header and frame buffer.
  115  */
  116 typedef struct SCIC_SDS_UNSOLICITED_FRAME
  117 {
  118    /**
  119     * This field contains the current frame state
  120     */
  121    enum UNSOLICITED_FRAME_STATE state;
  122 
  123    /**
  124     * This field points to the frame header data.
  125     */
  126    SCU_UNSOLICITED_FRAME_HEADER_T *header;
  127 
  128    /**
  129     * This field points to the frame buffer data.
  130     */
  131    void *buffer;
  132 
  133 } SCIC_SDS_UNSOLICITED_FRAME_T;
  134 
  135 /**
  136  * @struct SCIC_SDS_UF_HEADER_ARRAY
  137  *
  138  * This structure contains all of the unsolicited frame header
  139  * information.
  140  */
  141 typedef struct SCIC_SDS_UF_HEADER_ARRAY
  142 {
  143    /**
  144     * This field is represents a virtual pointer to the start
  145     * address of the UF address table.  The table contains
  146     * 64-bit pointers as required by the hardware.
  147     */
  148    SCU_UNSOLICITED_FRAME_HEADER_T *array;
  149 
  150    /**
  151     * This field specifies the physical address location for the UF
  152     * buffer array.
  153     */
  154    SCI_PHYSICAL_ADDRESS physical_address;
  155 
  156 } SCIC_SDS_UF_HEADER_ARRAY_T;
  157 
  158 // Determine the size of the unsolicited frame array including
  159 // unused buffers.
  160 #if SCU_UNSOLICITED_FRAME_COUNT <= SCU_MIN_UF_TABLE_ENTRIES
  161 #define SCU_UNSOLICITED_FRAME_CONTROL_ARRAY_SIZE SCU_MIN_UF_TABLE_ENTRIES
  162 #else
  163 #define SCU_UNSOLICITED_FRAME_CONTROL_ARRAY_SIZE SCU_MAX_UNSOLICITED_FRAMES
  164 #endif // SCU_UNSOLICITED_FRAME_COUNT <= SCU_MIN_UF_TABLE_ENTRIES
  165 
  166 /**
  167  * @struct SCIC_SDS_UF_BUFFER_ARRAY
  168  *
  169  * This structure contains all of the unsolicited frame buffer (actual
  170  * payload) information.
  171  */
  172 typedef struct SCIC_SDS_UF_BUFFER_ARRAY
  173 {
  174    /**
  175     * This field is the minimum number of unsolicited frames supported by the
  176     * hardware and the number of unsolicited frames requested by the software.
  177     */
  178    U32 count;
  179 
  180    /**
  181     * This field is the SCIC_UNSOLICITED_FRAME data its used to manage
  182     * the data for the unsolicited frame requests.  It also represents
  183     * the virtual address location that corresponds to the
  184     * physical_address field.
  185     */
  186    SCIC_SDS_UNSOLICITED_FRAME_T array[SCU_UNSOLICITED_FRAME_CONTROL_ARRAY_SIZE];
  187 
  188    /**
  189     * This field specifies the physical address location for the UF
  190     * buffer array.
  191     */
  192    SCI_PHYSICAL_ADDRESS physical_address;
  193 
  194 } SCIC_SDS_UF_BUFFER_ARRAY_T;
  195 
  196 /**
  197  * @struct SCIC_SDS_UF_ADDRESS_TABLE_ARRAY
  198  *
  199  * This object maintains all of the unsolicited frame address
  200  * table specific data.  The address table is a collection of
  201  * 64-bit pointers that point to 1KB buffers into which
  202  * the silicon will DMA unsolicited frames.
  203  */
  204 typedef struct SCIC_SDS_UF_ADDRESS_TABLE_ARRAY
  205 {
  206    /**
  207     * This field specifies the actual programmed size of the
  208     * unsolicited frame buffer address table.  The size of the table
  209     * can be larger than the actual number of UF buffers, but it must
  210     * be a power of 2 and the last entry in the table is not allowed
  211     * to be NULL.
  212     */
  213    U32 count;
  214 
  215    /**
  216     * This field represents a virtual pointer that refers to the
  217     * starting address of the UF address table.
  218     * 64-bit pointers are required by the hardware.
  219     */
  220    SCI_PHYSICAL_ADDRESS * array;
  221 
  222    /**
  223     * This field specifies the physical address location for the UF
  224     * address table.
  225     */
  226    SCI_PHYSICAL_ADDRESS physical_address;
  227 
  228 } SCIC_SDS_UF_ADDRESS_TABLE_ARRAY_T;
  229 
  230 /**
  231  * @struct SCIC_SDS_UNSOLICITED_FRAME_CONTROL
  232  *
  233  * This object contains all of the data necessary to handle
  234  * unsolicited frames.
  235  */
  236 typedef struct SCIC_SDS_UNSOLICITED_FRAME_CONTROL
  237 {
  238    /**
  239     * This field is the software copy of the unsolicited frame queue
  240     * get pointer.  The controller object writes this value to the
  241     * hardware to let the hardware put more unsolicited frame entries.
  242     */
  243    U32 get;
  244 
  245    /**
  246     * This field contains all of the unsolicited frame header
  247     * specific fields.
  248     */
  249    SCIC_SDS_UF_HEADER_ARRAY_T headers;
  250 
  251    /**
  252     * This field contains all of the unsolicited frame buffer
  253     * specific fields.
  254     */
  255    SCIC_SDS_UF_BUFFER_ARRAY_T buffers;
  256 
  257    /**
  258     * This field contains all of the unsolicited frame address table
  259     * specific fields.
  260     */
  261    SCIC_SDS_UF_ADDRESS_TABLE_ARRAY_T address_table;
  262 
  263 } SCIC_SDS_UNSOLICITED_FRAME_CONTROL_T;
  264 
  265 void scic_sds_unsolicited_frame_control_set_address_table_count(
  266    SCIC_SDS_UNSOLICITED_FRAME_CONTROL_T *uf_control
  267 );
  268 
  269 struct SCIC_SDS_CONTROLLER;
  270 void scic_sds_unsolicited_frame_control_construct(
  271    SCIC_SDS_UNSOLICITED_FRAME_CONTROL_T *uf_control,
  272    SCI_PHYSICAL_MEMORY_DESCRIPTOR_T     *mde,
  273    struct SCIC_SDS_CONTROLLER           *this_controller
  274 );
  275 
  276 SCI_STATUS scic_sds_unsolicited_frame_control_get_header(
  277    SCIC_SDS_UNSOLICITED_FRAME_CONTROL_T *uf_control,
  278    U32                                   frame_index,
  279    void                                **frame_header
  280 );
  281 
  282 SCI_STATUS scic_sds_unsolicited_frame_control_get_buffer(
  283    SCIC_SDS_UNSOLICITED_FRAME_CONTROL_T *uf_control,
  284    U32                                   frame_index,
  285    void                                **frame_buffer
  286 );
  287 
  288 BOOL scic_sds_unsolicited_frame_control_release_frame(
  289    SCIC_SDS_UNSOLICITED_FRAME_CONTROL_T *uf_control,
  290    U32                                   frame_index
  291 );
  292 
  293 /**
  294  * This macro simply calculates the size of the memory descriptor
  295  * entry that relates to unsolicited frames and the surrounding
  296  * silicon memory required to utilize it.
  297  */
  298 #define scic_sds_unsolicited_frame_control_get_mde_size(uf_control) \
  299    ( ((uf_control).buffers.count * SCU_UNSOLICITED_FRAME_BUFFER_SIZE) \
  300    + ((uf_control).address_table.count * sizeof(SCI_PHYSICAL_ADDRESS)) \
  301    + ((uf_control).buffers.count * sizeof(SCU_UNSOLICITED_FRAME_HEADER_T)) )
  302 
  303 #ifdef __cplusplus
  304 }
  305 #endif // __cplusplus
  306 
  307 #endif // _SCIC_SDS_UNSOLICITED_FRAME_CONTROL_H_

Cache object: bb70bb17647f40ec171fdbd56e489ab4


[ 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.