xref: /freebsd/sys/dev/pms/RefTisa/sallsdk/spc/saframe.c (revision 685dc743dc3b5645e34836464128e1c0558b404b)
1*4e1bc9a0SAchim Leubner /*******************************************************************************
2*4e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3*4e1bc9a0SAchim Leubner *
4*4e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*4e1bc9a0SAchim Leubner *that the following conditions are met:
6*4e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*4e1bc9a0SAchim Leubner *following disclaimer.
8*4e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
9*4e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*4e1bc9a0SAchim Leubner *with the distribution.
11*4e1bc9a0SAchim Leubner *
12*4e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*4e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*4e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*4e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*4e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*4e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*4e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*4e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20*4e1bc9a0SAchim Leubner 
21*4e1bc9a0SAchim Leubner ********************************************************************************/
22*4e1bc9a0SAchim Leubner /*******************************************************************************/
23*4e1bc9a0SAchim Leubner /*! \file saframe.c
24*4e1bc9a0SAchim Leubner  *  \brief The file implements the functions to read frame content
25*4e1bc9a0SAchim Leubner  */
26*4e1bc9a0SAchim Leubner 
27*4e1bc9a0SAchim Leubner 
28*4e1bc9a0SAchim Leubner /******************************************************************************/
29*4e1bc9a0SAchim Leubner #include <sys/cdefs.h>
30*4e1bc9a0SAchim Leubner #include <dev/pms/config.h>
31*4e1bc9a0SAchim Leubner 
32*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/spc/saglobal.h>
33*4e1bc9a0SAchim Leubner #ifdef SA_ENABLE_TRACE_FUNCTIONS
34*4e1bc9a0SAchim Leubner #ifdef siTraceFileID
35*4e1bc9a0SAchim Leubner #undef siTraceFileID
36*4e1bc9a0SAchim Leubner #endif
37*4e1bc9a0SAchim Leubner #define siTraceFileID 'D'
38*4e1bc9a0SAchim Leubner #endif
39*4e1bc9a0SAchim Leubner 
40*4e1bc9a0SAchim Leubner /******************************************************************************/
41*4e1bc9a0SAchim Leubner /*! \brief Read 32 bits from a frame
42*4e1bc9a0SAchim Leubner  *
43*4e1bc9a0SAchim Leubner  *  Read 32 bits from a frame
44*4e1bc9a0SAchim Leubner  *
45*4e1bc9a0SAchim Leubner  *  \param agRoot       Handles for this instance of SAS/SATA LLL
46*4e1bc9a0SAchim Leubner  *  \param agFrame      The frame handler
47*4e1bc9a0SAchim Leubner  *  \param frameOffset  Offset in bytes from the beginning of valid frame bytes or IU
48*4e1bc9a0SAchim Leubner                         to the 32-bit value to read
49*4e1bc9a0SAchim Leubner  *
50*4e1bc9a0SAchim Leubner  *  \return The read value
51*4e1bc9a0SAchim Leubner  *
52*4e1bc9a0SAchim Leubner  */
53*4e1bc9a0SAchim Leubner /*******************************************************************************/
saFrameReadBit32(agsaRoot_t * agRoot,agsaFrameHandle_t agFrame,bit32 frameOffset)54*4e1bc9a0SAchim Leubner GLOBAL bit32 saFrameReadBit32(
55*4e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
56*4e1bc9a0SAchim Leubner   agsaFrameHandle_t   agFrame,
57*4e1bc9a0SAchim Leubner   bit32               frameOffset
58*4e1bc9a0SAchim Leubner   )
59*4e1bc9a0SAchim Leubner {
60*4e1bc9a0SAchim Leubner   bit8                    *payloadAddr;
61*4e1bc9a0SAchim Leubner   bit32                   value = 0;
62*4e1bc9a0SAchim Leubner 
63*4e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD, "zr");
64*4e1bc9a0SAchim Leubner 
65*4e1bc9a0SAchim Leubner   if ( agNULL != agFrame )
66*4e1bc9a0SAchim Leubner   {
67*4e1bc9a0SAchim Leubner     /* Find the address of the payload */
68*4e1bc9a0SAchim Leubner     payloadAddr = (bit8 *)(agFrame) + frameOffset;
69*4e1bc9a0SAchim Leubner 
70*4e1bc9a0SAchim Leubner     /* read one DW Data */
71*4e1bc9a0SAchim Leubner     value = *(bit32 *)payloadAddr;
72*4e1bc9a0SAchim Leubner   }
73*4e1bc9a0SAchim Leubner 
74*4e1bc9a0SAchim Leubner 
75*4e1bc9a0SAchim Leubner   /* (5) return value */
76*4e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "zr");
77*4e1bc9a0SAchim Leubner   return value;
78*4e1bc9a0SAchim Leubner }
79*4e1bc9a0SAchim Leubner 
80*4e1bc9a0SAchim Leubner /******************************************************************************/
81*4e1bc9a0SAchim Leubner /*! \brief Read a block from a frame
82*4e1bc9a0SAchim Leubner  *
83*4e1bc9a0SAchim Leubner  *  Read a block from a frame
84*4e1bc9a0SAchim Leubner  *
85*4e1bc9a0SAchim Leubner  *  \param agRoot         Handles for this instance of SAS/SATA LLL
86*4e1bc9a0SAchim Leubner  *  \param agFrame        The frame handler
87*4e1bc9a0SAchim Leubner  *  \param frameOffset    The offset of the frame to start read
88*4e1bc9a0SAchim Leubner  *  \param frameBuffer    The pointer to the destination of data read from the frame
89*4e1bc9a0SAchim Leubner  *  \param frameBufLen    Number of bytes to read from the frame
90*4e1bc9a0SAchim Leubner  *
91*4e1bc9a0SAchim Leubner  *  \return -void-
92*4e1bc9a0SAchim Leubner  *
93*4e1bc9a0SAchim Leubner  */
94*4e1bc9a0SAchim Leubner /*******************************************************************************/
saFrameReadBlock(agsaRoot_t * agRoot,agsaFrameHandle_t agFrame,bit32 frameOffset,void * frameBuffer,bit32 frameBufLen)95*4e1bc9a0SAchim Leubner GLOBAL void saFrameReadBlock (
96*4e1bc9a0SAchim Leubner   agsaRoot_t          *agRoot,
97*4e1bc9a0SAchim Leubner   agsaFrameHandle_t   agFrame,
98*4e1bc9a0SAchim Leubner   bit32               frameOffset,
99*4e1bc9a0SAchim Leubner   void                *frameBuffer,
100*4e1bc9a0SAchim Leubner   bit32               frameBufLen
101*4e1bc9a0SAchim Leubner   )
102*4e1bc9a0SAchim Leubner {
103*4e1bc9a0SAchim Leubner   bit8                    *payloadAddr;
104*4e1bc9a0SAchim Leubner   bit32                   i;
105*4e1bc9a0SAchim Leubner 
106*4e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD, "zi");
107*4e1bc9a0SAchim Leubner 
108*4e1bc9a0SAchim Leubner   /* Sanity check */
109*4e1bc9a0SAchim Leubner   SA_ASSERT(frameBufLen < 4096, "saFrameReadBlock read more than 4k");
110*4e1bc9a0SAchim Leubner 
111*4e1bc9a0SAchim Leubner   if ( agNULL != agFrame )
112*4e1bc9a0SAchim Leubner   {
113*4e1bc9a0SAchim Leubner     /* Find the address of the payload */
114*4e1bc9a0SAchim Leubner     payloadAddr = (bit8 *)(agFrame) + frameOffset;
115*4e1bc9a0SAchim Leubner     /* Copy the frame data to the destination frame buffer */
116*4e1bc9a0SAchim Leubner     for ( i = 0; i < frameBufLen; i ++ )
117*4e1bc9a0SAchim Leubner     {
118*4e1bc9a0SAchim Leubner       *(bit8 *)((bit8 *)frameBuffer + i) = *(bit8 *)(payloadAddr + i);
119*4e1bc9a0SAchim Leubner     }
120*4e1bc9a0SAchim Leubner   }
121*4e1bc9a0SAchim Leubner 
122*4e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "zi");
123*4e1bc9a0SAchim Leubner }
124*4e1bc9a0SAchim Leubner 
125