xref: /freebsd/sys/dev/pms/RefTisa/sallsdk/spc/saport.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 saport.c
24*4e1bc9a0SAchim Leubner  *  \brief The file implements the functions to handle port
25*4e1bc9a0SAchim Leubner  *
26*4e1bc9a0SAchim Leubner  */
27*4e1bc9a0SAchim Leubner /******************************************************************************/
28*4e1bc9a0SAchim Leubner #include <sys/cdefs.h>
29*4e1bc9a0SAchim Leubner #include <dev/pms/config.h>
30*4e1bc9a0SAchim Leubner 
31*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/spc/saglobal.h>
32*4e1bc9a0SAchim Leubner #ifdef SA_ENABLE_TRACE_FUNCTIONS
33*4e1bc9a0SAchim Leubner #ifdef siTraceFileID
34*4e1bc9a0SAchim Leubner #undef siTraceFileID
35*4e1bc9a0SAchim Leubner #endif
36*4e1bc9a0SAchim Leubner #define siTraceFileID 'L'
37*4e1bc9a0SAchim Leubner #endif
38*4e1bc9a0SAchim Leubner 
39*4e1bc9a0SAchim Leubner 
40*4e1bc9a0SAchim Leubner extern bit32 gFPGA_TEST;
41*4e1bc9a0SAchim Leubner /******************************************************************************/
42*4e1bc9a0SAchim Leubner /*! \brief Add a SAS device to the discovery list of the port
43*4e1bc9a0SAchim Leubner  *
44*4e1bc9a0SAchim Leubner  *  Add a SAS device from the discovery list of the port
45*4e1bc9a0SAchim Leubner  *
46*4e1bc9a0SAchim Leubner  *  \param agRoot handles for this instance of SAS/SATA LLL
47*4e1bc9a0SAchim Leubner  *  \param pPort
48*4e1bc9a0SAchim Leubner  *  \param sasIdentify
49*4e1bc9a0SAchim Leubner  *  \param sasInitiator
50*4e1bc9a0SAchim Leubner  *  \param smpTimeout
51*4e1bc9a0SAchim Leubner  *  \param itNexusTimeout
52*4e1bc9a0SAchim Leubner  *  \param firstBurstSize
53*4e1bc9a0SAchim Leubner  *  \param dTypeSRate -- device type and link rate
54*4e1bc9a0SAchim Leubner  *  \param flag
55*4e1bc9a0SAchim Leubner  *
56*4e1bc9a0SAchim Leubner  *  \return -the device descriptor-
57*4e1bc9a0SAchim Leubner  */
58*4e1bc9a0SAchim Leubner /*******************************************************************************/
siPortSASDeviceAdd(agsaRoot_t * agRoot,agsaPort_t * pPort,agsaSASIdentify_t sasIdentify,bit32 sasInitiator,bit32 smpTimeout,bit32 itNexusTimeout,bit32 firstBurstSize,bit8 dTypeSRate,bit32 flag)59*4e1bc9a0SAchim Leubner GLOBAL agsaDeviceDesc_t *siPortSASDeviceAdd(
60*4e1bc9a0SAchim Leubner   agsaRoot_t        *agRoot,
61*4e1bc9a0SAchim Leubner   agsaPort_t        *pPort,
62*4e1bc9a0SAchim Leubner   agsaSASIdentify_t sasIdentify,
63*4e1bc9a0SAchim Leubner   bit32             sasInitiator,
64*4e1bc9a0SAchim Leubner   bit32             smpTimeout,
65*4e1bc9a0SAchim Leubner   bit32             itNexusTimeout,
66*4e1bc9a0SAchim Leubner   bit32             firstBurstSize,
67*4e1bc9a0SAchim Leubner   bit8              dTypeSRate,
68*4e1bc9a0SAchim Leubner   bit32             flag
69*4e1bc9a0SAchim Leubner   )
70*4e1bc9a0SAchim Leubner {
71*4e1bc9a0SAchim Leubner   agsaLLRoot_t          *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
72*4e1bc9a0SAchim Leubner   agsaDeviceDesc_t      *pDevice;
73*4e1bc9a0SAchim Leubner 
74*4e1bc9a0SAchim Leubner   SA_DBG3(("siPortSASDeviceAdd: start\n"));
75*4e1bc9a0SAchim Leubner 
76*4e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD, "23");
77*4e1bc9a0SAchim Leubner 
78*4e1bc9a0SAchim Leubner   /* sanity check */
79*4e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != agRoot), "");
80*4e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != pPort), "");
81*4e1bc9a0SAchim Leubner 
82*4e1bc9a0SAchim Leubner   /* Acquire Device Lock */
83*4e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_DEVICE_LOCK);
84*4e1bc9a0SAchim Leubner 
85*4e1bc9a0SAchim Leubner   /* Try to Allocate from device list */
86*4e1bc9a0SAchim Leubner   pDevice = (agsaDeviceDesc_t *) saLlistGetHead(&(saRoot->freeDevicesList));
87*4e1bc9a0SAchim Leubner 
88*4e1bc9a0SAchim Leubner   /* If device handle available */
89*4e1bc9a0SAchim Leubner   if ( agNULL != pDevice)
90*4e1bc9a0SAchim Leubner   {
91*4e1bc9a0SAchim Leubner     int i;
92*4e1bc9a0SAchim Leubner 
93*4e1bc9a0SAchim Leubner     /* Remove from free device list */
94*4e1bc9a0SAchim Leubner     saLlistRemove(&(saRoot->freeDevicesList), &(pDevice->linkNode));
95*4e1bc9a0SAchim Leubner 
96*4e1bc9a0SAchim Leubner     /* Initialize device descriptor */
97*4e1bc9a0SAchim Leubner     if ( agTRUE == sasInitiator )
98*4e1bc9a0SAchim Leubner     {
99*4e1bc9a0SAchim Leubner       pDevice->initiatorDevHandle.sdkData = pDevice;
100*4e1bc9a0SAchim Leubner       pDevice->targetDevHandle.sdkData = agNULL;
101*4e1bc9a0SAchim Leubner     }
102*4e1bc9a0SAchim Leubner     else
103*4e1bc9a0SAchim Leubner     {
104*4e1bc9a0SAchim Leubner       pDevice->initiatorDevHandle.sdkData = agNULL;
105*4e1bc9a0SAchim Leubner       pDevice->targetDevHandle.sdkData = pDevice;
106*4e1bc9a0SAchim Leubner     }
107*4e1bc9a0SAchim Leubner 
108*4e1bc9a0SAchim Leubner     pDevice->initiatorDevHandle.osData = agNULL;
109*4e1bc9a0SAchim Leubner     pDevice->targetDevHandle.osData = agNULL;
110*4e1bc9a0SAchim Leubner 
111*4e1bc9a0SAchim Leubner     /* setup device type */
112*4e1bc9a0SAchim Leubner     pDevice->deviceType = (bit8)((dTypeSRate & 0x30) >> SHIFT4);
113*4e1bc9a0SAchim Leubner     SA_DBG3(("siPortSASDeviceAdd: Device Type 0x%x, Port Context %p\n", pDevice->deviceType, pPort));
114*4e1bc9a0SAchim Leubner     pDevice->pPort = pPort;
115*4e1bc9a0SAchim Leubner     saLlistInitialize(&(pDevice->pendingIORequests));
116*4e1bc9a0SAchim Leubner 
117*4e1bc9a0SAchim Leubner     /* setup sasDeviceInfo */
118*4e1bc9a0SAchim Leubner     pDevice->devInfo.sasDeviceInfo.commonDevInfo.smpTimeout = (bit16)smpTimeout;
119*4e1bc9a0SAchim Leubner     pDevice->devInfo.sasDeviceInfo.commonDevInfo.it_NexusTimeout = (bit16)itNexusTimeout;
120*4e1bc9a0SAchim Leubner     pDevice->devInfo.sasDeviceInfo.commonDevInfo.firstBurstSize = (bit16)firstBurstSize;
121*4e1bc9a0SAchim Leubner     pDevice->devInfo.sasDeviceInfo.commonDevInfo.devType_S_Rate = dTypeSRate;
122*4e1bc9a0SAchim Leubner     pDevice->devInfo.sasDeviceInfo.commonDevInfo.flag = flag;
123*4e1bc9a0SAchim Leubner     for (i = 0; i < 4; i++)
124*4e1bc9a0SAchim Leubner     {
125*4e1bc9a0SAchim Leubner       pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressHi[i] = sasIdentify.sasAddressHi[i];
126*4e1bc9a0SAchim Leubner       pDevice->devInfo.sasDeviceInfo.commonDevInfo.sasAddressLo[i] = sasIdentify.sasAddressLo[i];
127*4e1bc9a0SAchim Leubner     }
128*4e1bc9a0SAchim Leubner     pDevice->devInfo.sasDeviceInfo.initiator_ssp_stp_smp = sasIdentify.initiator_ssp_stp_smp;
129*4e1bc9a0SAchim Leubner     pDevice->devInfo.sasDeviceInfo.target_ssp_stp_smp = sasIdentify.target_ssp_stp_smp;
130*4e1bc9a0SAchim Leubner     pDevice->devInfo.sasDeviceInfo.phyIdentifier = sasIdentify.phyIdentifier;
131*4e1bc9a0SAchim Leubner 
132*4e1bc9a0SAchim Leubner     /* Add to discoverd device for the port */
133*4e1bc9a0SAchim Leubner     saLlistAdd(&(pPort->listSASATADevices), &(pDevice->linkNode));
134*4e1bc9a0SAchim Leubner 
135*4e1bc9a0SAchim Leubner     /* Release Device Lock */
136*4e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_DEVICE_LOCK);
137*4e1bc9a0SAchim Leubner 
138*4e1bc9a0SAchim Leubner     /* Log Messages */
139*4e1bc9a0SAchim Leubner     SA_DBG3(("siPortSASDeviceAdd: sasIdentify addrHI 0x%x\n", SA_IDFRM_GET_SAS_ADDRESSHI(&sasIdentify)));
140*4e1bc9a0SAchim Leubner     SA_DBG3(("siPortSASDeviceAdd: sasIdentify addrLO 0x%x\n", SA_IDFRM_GET_SAS_ADDRESSLO(&sasIdentify)));
141*4e1bc9a0SAchim Leubner 
142*4e1bc9a0SAchim Leubner   }
143*4e1bc9a0SAchim Leubner   else
144*4e1bc9a0SAchim Leubner   {
145*4e1bc9a0SAchim Leubner     /* Release Device Lock */
146*4e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_DEVICE_LOCK);
147*4e1bc9a0SAchim Leubner     SA_ASSERT((agNULL != pDevice), "");
148*4e1bc9a0SAchim Leubner     SA_DBG1(("siPortSASDeviceAdd: device allocation failed\n"));
149*4e1bc9a0SAchim Leubner   }
150*4e1bc9a0SAchim Leubner   SA_DBG3(("siPortSASDeviceAdd: end\n"));
151*4e1bc9a0SAchim Leubner 
152*4e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "23");
153*4e1bc9a0SAchim Leubner   return pDevice;
154*4e1bc9a0SAchim Leubner }
155*4e1bc9a0SAchim Leubner 
156*4e1bc9a0SAchim Leubner /******************************************************************************/
157*4e1bc9a0SAchim Leubner /*! \brief The function to remove a device descriptor
158*4e1bc9a0SAchim Leubner  *
159*4e1bc9a0SAchim Leubner  *  The function to remove a device descriptor
160*4e1bc9a0SAchim Leubner  *
161*4e1bc9a0SAchim Leubner  *  \param agRoot handles for this instance of SAS/SATA hardware
162*4e1bc9a0SAchim Leubner  *  \param pPort  The pointer to the port
163*4e1bc9a0SAchim Leubner  *  \param pDevice The pointer to the device
164*4e1bc9a0SAchim Leubner  *
165*4e1bc9a0SAchim Leubner  *  \return -void-
166*4e1bc9a0SAchim Leubner  */
167*4e1bc9a0SAchim Leubner /*******************************************************************************/
siPortDeviceRemove(agsaRoot_t * agRoot,agsaPort_t * pPort,agsaDeviceDesc_t * pDevice,bit32 unmap)168*4e1bc9a0SAchim Leubner GLOBAL void siPortDeviceRemove(
169*4e1bc9a0SAchim Leubner   agsaRoot_t        *agRoot,
170*4e1bc9a0SAchim Leubner   agsaPort_t        *pPort,
171*4e1bc9a0SAchim Leubner   agsaDeviceDesc_t  *pDevice,
172*4e1bc9a0SAchim Leubner   bit32             unmap
173*4e1bc9a0SAchim Leubner   )
174*4e1bc9a0SAchim Leubner {
175*4e1bc9a0SAchim Leubner   agsaLLRoot_t *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
176*4e1bc9a0SAchim Leubner   bit32        deviceIdx;
177*4e1bc9a0SAchim Leubner 
178*4e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD, "24");
179*4e1bc9a0SAchim Leubner 
180*4e1bc9a0SAchim Leubner   /* sanity check */
181*4e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != agRoot), "");
182*4e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != pPort), "");
183*4e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != pDevice), "");
184*4e1bc9a0SAchim Leubner   SA_ASSERT((SAS_SATA_UNKNOWN_DEVICE != pDevice->deviceType), "");
185*4e1bc9a0SAchim Leubner 
186*4e1bc9a0SAchim Leubner   /* remove the device from discovered list */
187*4e1bc9a0SAchim Leubner   SA_DBG3(("siPortDeviceRemove(SAS/SATA): DeviceIndex %d Device Context %p\n", pDevice->DeviceMapIndex, pDevice));
188*4e1bc9a0SAchim Leubner 
189*4e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_DEVICE_LOCK);
190*4e1bc9a0SAchim Leubner   saLlistRemove(&(pPort->listSASATADevices), &(pDevice->linkNode));
191*4e1bc9a0SAchim Leubner 
192*4e1bc9a0SAchim Leubner   /* Reset the device data structure */
193*4e1bc9a0SAchim Leubner   pDevice->pPort = agNULL;
194*4e1bc9a0SAchim Leubner   pDevice->initiatorDevHandle.osData = agNULL;
195*4e1bc9a0SAchim Leubner   pDevice->initiatorDevHandle.sdkData = agNULL;
196*4e1bc9a0SAchim Leubner   pDevice->targetDevHandle.osData = agNULL;
197*4e1bc9a0SAchim Leubner   pDevice->targetDevHandle.sdkData = agNULL;
198*4e1bc9a0SAchim Leubner 
199*4e1bc9a0SAchim Leubner   saLlistAdd(&(saRoot->freeDevicesList), &(pDevice->linkNode));
200*4e1bc9a0SAchim Leubner 
201*4e1bc9a0SAchim Leubner   if(unmap)
202*4e1bc9a0SAchim Leubner   {
203*4e1bc9a0SAchim Leubner     /* remove the DeviceMap and MapIndex */
204*4e1bc9a0SAchim Leubner     deviceIdx = pDevice->DeviceMapIndex & DEVICE_ID_BITS;
205*4e1bc9a0SAchim Leubner     OS_ASSERT(deviceIdx < MAX_IO_DEVICE_ENTRIES, "deviceIdx MAX_IO_DEVICE_ENTRIES");
206*4e1bc9a0SAchim Leubner 
207*4e1bc9a0SAchim Leubner     saRoot->DeviceMap[deviceIdx].DeviceIdFromFW = 0;
208*4e1bc9a0SAchim Leubner     saRoot->DeviceMap[deviceIdx].DeviceHandle = agNULL;
209*4e1bc9a0SAchim Leubner     pDevice->DeviceMapIndex = 0;
210*4e1bc9a0SAchim Leubner   }
211*4e1bc9a0SAchim Leubner   ossaSingleThreadedLeave(agRoot, LL_DEVICE_LOCK);
212*4e1bc9a0SAchim Leubner 
213*4e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "24");
214*4e1bc9a0SAchim Leubner 
215*4e1bc9a0SAchim Leubner   return;
216*4e1bc9a0SAchim Leubner }
217*4e1bc9a0SAchim Leubner 
218*4e1bc9a0SAchim Leubner /******************************************************************************/
219*4e1bc9a0SAchim Leubner /*! \brief Add a SATA device to the discovery list of the port
220*4e1bc9a0SAchim Leubner  *
221*4e1bc9a0SAchim Leubner  *  Add a SATA device from the discovery list of the port
222*4e1bc9a0SAchim Leubner  *
223*4e1bc9a0SAchim Leubner  *  \param agRoot handles for this instance of SAS/SATA hardware
224*4e1bc9a0SAchim Leubner  *  \param pPort
225*4e1bc9a0SAchim Leubner  *  \param pSTPBridge
226*4e1bc9a0SAchim Leubner  *  \param pSignature
227*4e1bc9a0SAchim Leubner  *  \param pm
228*4e1bc9a0SAchim Leubner  *  \param pmField
229*4e1bc9a0SAchim Leubner  *  \param smpReqTimeout
230*4e1bc9a0SAchim Leubner  *  \param itNexusTimeout
231*4e1bc9a0SAchim Leubner  *  \param firstBurstSize
232*4e1bc9a0SAchim Leubner  *  \param dTypeSRate
233*4e1bc9a0SAchim Leubner  *
234*4e1bc9a0SAchim Leubner  *  \return -the device descriptor-
235*4e1bc9a0SAchim Leubner  */
236*4e1bc9a0SAchim Leubner /*******************************************************************************/
siPortSATADeviceAdd(agsaRoot_t * agRoot,agsaPort_t * pPort,agsaDeviceDesc_t * pSTPBridge,bit8 * pSignature,bit8 pm,bit8 pmField,bit32 smpReqTimeout,bit32 itNexusTimeout,bit32 firstBurstSize,bit8 dTypeSRate,bit32 flag)237*4e1bc9a0SAchim Leubner GLOBAL agsaDeviceDesc_t *siPortSATADeviceAdd(
238*4e1bc9a0SAchim Leubner   agsaRoot_t              *agRoot,
239*4e1bc9a0SAchim Leubner   agsaPort_t              *pPort,
240*4e1bc9a0SAchim Leubner   agsaDeviceDesc_t        *pSTPBridge,
241*4e1bc9a0SAchim Leubner   bit8                    *pSignature,
242*4e1bc9a0SAchim Leubner   bit8                    pm,
243*4e1bc9a0SAchim Leubner   bit8                    pmField,
244*4e1bc9a0SAchim Leubner   bit32                   smpReqTimeout,
245*4e1bc9a0SAchim Leubner   bit32                   itNexusTimeout,
246*4e1bc9a0SAchim Leubner   bit32                   firstBurstSize,
247*4e1bc9a0SAchim Leubner   bit8                    dTypeSRate,
248*4e1bc9a0SAchim Leubner   bit32                   flag
249*4e1bc9a0SAchim Leubner   )
250*4e1bc9a0SAchim Leubner {
251*4e1bc9a0SAchim Leubner   agsaLLRoot_t          *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
252*4e1bc9a0SAchim Leubner   agsaDeviceDesc_t      *pDevice;
253*4e1bc9a0SAchim Leubner 
254*4e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD, "25");
255*4e1bc9a0SAchim Leubner 
256*4e1bc9a0SAchim Leubner   /* sanity check */
257*4e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != agRoot), "");
258*4e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != pPort), "");
259*4e1bc9a0SAchim Leubner 
260*4e1bc9a0SAchim Leubner   /* Acquire Device Lock */
261*4e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_DEVICE_LOCK);
262*4e1bc9a0SAchim Leubner 
263*4e1bc9a0SAchim Leubner   /* Try to Allocate from device list */
264*4e1bc9a0SAchim Leubner   pDevice = (agsaDeviceDesc_t *) saLlistGetHead(&(saRoot->freeDevicesList));
265*4e1bc9a0SAchim Leubner 
266*4e1bc9a0SAchim Leubner   /* If device handle available */
267*4e1bc9a0SAchim Leubner   if ( agNULL != pDevice)
268*4e1bc9a0SAchim Leubner   {
269*4e1bc9a0SAchim Leubner     int i;
270*4e1bc9a0SAchim Leubner 
271*4e1bc9a0SAchim Leubner     /* Remove from free device list */
272*4e1bc9a0SAchim Leubner     saLlistRemove(&(saRoot->freeDevicesList), &(pDevice->linkNode));
273*4e1bc9a0SAchim Leubner 
274*4e1bc9a0SAchim Leubner     /* Initialize the device descriptor */
275*4e1bc9a0SAchim Leubner     pDevice->initiatorDevHandle.sdkData = agNULL;
276*4e1bc9a0SAchim Leubner     pDevice->targetDevHandle.sdkData = pDevice;
277*4e1bc9a0SAchim Leubner     pDevice->initiatorDevHandle.osData = agNULL;
278*4e1bc9a0SAchim Leubner     pDevice->targetDevHandle.osData = agNULL;
279*4e1bc9a0SAchim Leubner 
280*4e1bc9a0SAchim Leubner     pDevice->deviceType = (bit8)((dTypeSRate & 0x30) >> SHIFT4);
281*4e1bc9a0SAchim Leubner     SA_DBG3(("siPortSATADeviceAdd: DeviceType 0x%x Port Context %p\n", pDevice->deviceType, pPort));
282*4e1bc9a0SAchim Leubner 
283*4e1bc9a0SAchim Leubner     /* setup device common infomation */
284*4e1bc9a0SAchim Leubner     pDevice->devInfo.sataDeviceInfo.commonDevInfo.smpTimeout = (bit16)smpReqTimeout;
285*4e1bc9a0SAchim Leubner     pDevice->devInfo.sataDeviceInfo.commonDevInfo.it_NexusTimeout = (bit16)itNexusTimeout;
286*4e1bc9a0SAchim Leubner     pDevice->devInfo.sataDeviceInfo.commonDevInfo.firstBurstSize = (bit16)firstBurstSize;
287*4e1bc9a0SAchim Leubner     pDevice->devInfo.sataDeviceInfo.commonDevInfo.devType_S_Rate = dTypeSRate;
288*4e1bc9a0SAchim Leubner     pDevice->devInfo.sataDeviceInfo.commonDevInfo.flag = flag;
289*4e1bc9a0SAchim Leubner     for (i = 0; i < 4; i++)
290*4e1bc9a0SAchim Leubner     {
291*4e1bc9a0SAchim Leubner       pDevice->devInfo.sataDeviceInfo.commonDevInfo.sasAddressHi[i] = 0;
292*4e1bc9a0SAchim Leubner       pDevice->devInfo.sataDeviceInfo.commonDevInfo.sasAddressLo[i] = 0;
293*4e1bc9a0SAchim Leubner     }
294*4e1bc9a0SAchim Leubner     /* setup SATA device information */
295*4e1bc9a0SAchim Leubner     pDevice->devInfo.sataDeviceInfo.connection = pm;
296*4e1bc9a0SAchim Leubner     pDevice->devInfo.sataDeviceInfo.portMultiplierField = pmField;
297*4e1bc9a0SAchim Leubner     pDevice->devInfo.sataDeviceInfo.stpPhyIdentifier = 0;
298*4e1bc9a0SAchim Leubner     pDevice->pPort = pPort;
299*4e1bc9a0SAchim Leubner 
300*4e1bc9a0SAchim Leubner     /* Add to discoverd device for the port */
301*4e1bc9a0SAchim Leubner     saLlistAdd(&(pPort->listSASATADevices), &(pDevice->linkNode));
302*4e1bc9a0SAchim Leubner 
303*4e1bc9a0SAchim Leubner     /* Release Device Lock */
304*4e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_DEVICE_LOCK);
305*4e1bc9a0SAchim Leubner   }
306*4e1bc9a0SAchim Leubner   else
307*4e1bc9a0SAchim Leubner   {
308*4e1bc9a0SAchim Leubner     /* Release Device Lock */
309*4e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_DEVICE_LOCK);
310*4e1bc9a0SAchim Leubner     SA_ASSERT((agNULL != pDevice), "");
311*4e1bc9a0SAchim Leubner     SA_DBG1(("siPortSATADeviceAdd: device allocation failed\n"));
312*4e1bc9a0SAchim Leubner   }
313*4e1bc9a0SAchim Leubner   SA_DBG3(("siPortSATADeviceAdd: end\n"));
314*4e1bc9a0SAchim Leubner 
315*4e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "25");
316*4e1bc9a0SAchim Leubner   return pDevice;
317*4e1bc9a0SAchim Leubner }
318*4e1bc9a0SAchim Leubner 
319*4e1bc9a0SAchim Leubner /******************************************************************************/
320*4e1bc9a0SAchim Leubner /*! \brief Invalid a port
321*4e1bc9a0SAchim Leubner  *
322*4e1bc9a0SAchim Leubner  *  Invalid a port
323*4e1bc9a0SAchim Leubner  *
324*4e1bc9a0SAchim Leubner  *  \param agRoot handles for this instance of SAS/SATA hardware
325*4e1bc9a0SAchim Leubner  *  \param pPort
326*4e1bc9a0SAchim Leubner  *
327*4e1bc9a0SAchim Leubner  *  \return -void-
328*4e1bc9a0SAchim Leubner  */
329*4e1bc9a0SAchim Leubner /*******************************************************************************/
siPortInvalid(agsaRoot_t * agRoot,agsaPort_t * pPort)330*4e1bc9a0SAchim Leubner GLOBAL void siPortInvalid(
331*4e1bc9a0SAchim Leubner   agsaRoot_t  *agRoot,
332*4e1bc9a0SAchim Leubner   agsaPort_t  *pPort
333*4e1bc9a0SAchim Leubner   )
334*4e1bc9a0SAchim Leubner {
335*4e1bc9a0SAchim Leubner   agsaLLRoot_t    *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
336*4e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD, "26");
337*4e1bc9a0SAchim Leubner 
338*4e1bc9a0SAchim Leubner   /* sanity check */
339*4e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != agRoot), "");
340*4e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != pPort), "");
341*4e1bc9a0SAchim Leubner 
342*4e1bc9a0SAchim Leubner   /* set port's status to invalidating */
343*4e1bc9a0SAchim Leubner   pPort->status |= PORT_INVALIDATING;
344*4e1bc9a0SAchim Leubner 
345*4e1bc9a0SAchim Leubner   /* Remove from validPort and add the port back to the free port link list */
346*4e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_PORT_LOCK);
347*4e1bc9a0SAchim Leubner   saLlistRemove(&(saRoot->validPorts), &(pPort->linkNode));
348*4e1bc9a0SAchim Leubner   saLlistAdd(&(saRoot->freePorts), &(pPort->linkNode));
349*4e1bc9a0SAchim Leubner   pPort->tobedeleted = agFALSE;
350*4e1bc9a0SAchim Leubner   ossaSingleThreadedLeave(agRoot, LL_PORT_LOCK);
351*4e1bc9a0SAchim Leubner 
352*4e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "26");
353*4e1bc9a0SAchim Leubner 
354*4e1bc9a0SAchim Leubner   /* return */
355*4e1bc9a0SAchim Leubner }
356*4e1bc9a0SAchim Leubner 
357*4e1bc9a0SAchim Leubner /******************************************************************************/
358*4e1bc9a0SAchim Leubner /*! \brief The function to remove a device descriptor
359*4e1bc9a0SAchim Leubner  *
360*4e1bc9a0SAchim Leubner  *  The function to remove a device descriptor
361*4e1bc9a0SAchim Leubner  *
362*4e1bc9a0SAchim Leubner  *  \param agRoot handles for this instance of SAS/SATA hardware
363*4e1bc9a0SAchim Leubner  *  \param pPort  The pointer to the port
364*4e1bc9a0SAchim Leubner  *  \param pDevice The pointer to the device
365*4e1bc9a0SAchim Leubner  *
366*4e1bc9a0SAchim Leubner  *  \return -void-
367*4e1bc9a0SAchim Leubner  */
368*4e1bc9a0SAchim Leubner /*******************************************************************************/
siPortDeviceListRemove(agsaRoot_t * agRoot,agsaPort_t * pPort,agsaDeviceDesc_t * pDevice)369*4e1bc9a0SAchim Leubner GLOBAL void siPortDeviceListRemove(
370*4e1bc9a0SAchim Leubner   agsaRoot_t        *agRoot,
371*4e1bc9a0SAchim Leubner   agsaPort_t        *pPort,
372*4e1bc9a0SAchim Leubner   agsaDeviceDesc_t  *pDevice
373*4e1bc9a0SAchim Leubner   )
374*4e1bc9a0SAchim Leubner {
375*4e1bc9a0SAchim Leubner   agsaLLRoot_t *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
376*4e1bc9a0SAchim Leubner 
377*4e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD, "27");
378*4e1bc9a0SAchim Leubner 
379*4e1bc9a0SAchim Leubner   /* sanity check */
380*4e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != agRoot), "");
381*4e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != pPort), "");
382*4e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != pDevice), "");
383*4e1bc9a0SAchim Leubner   SA_ASSERT((SAS_SATA_UNKNOWN_DEVICE != pDevice->deviceType), "");
384*4e1bc9a0SAchim Leubner 
385*4e1bc9a0SAchim Leubner   /* remove the device from discovered list */
386*4e1bc9a0SAchim Leubner   SA_DBG3(("siPortDeviceListRemove(SAS/SATA): PortID %d Device Context %p\n", pPort->portId, pDevice));
387*4e1bc9a0SAchim Leubner 
388*4e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_DEVICE_LOCK);
389*4e1bc9a0SAchim Leubner   saLlistRemove(&(pPort->listSASATADevices), &(pDevice->linkNode));
390*4e1bc9a0SAchim Leubner 
391*4e1bc9a0SAchim Leubner   /* Reset the device data structure */
392*4e1bc9a0SAchim Leubner   pDevice->pPort = agNULL;
393*4e1bc9a0SAchim Leubner   pDevice->initiatorDevHandle.osData = agNULL;
394*4e1bc9a0SAchim Leubner   pDevice->initiatorDevHandle.sdkData = agNULL;
395*4e1bc9a0SAchim Leubner   pDevice->targetDevHandle.osData = agNULL;
396*4e1bc9a0SAchim Leubner   pDevice->targetDevHandle.sdkData = agNULL;
397*4e1bc9a0SAchim Leubner 
398*4e1bc9a0SAchim Leubner   saLlistAdd(&(saRoot->freeDevicesList), &(pDevice->linkNode));
399*4e1bc9a0SAchim Leubner   ossaSingleThreadedLeave(agRoot, LL_DEVICE_LOCK);
400*4e1bc9a0SAchim Leubner 
401*4e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "27");
402*4e1bc9a0SAchim Leubner   return;
403*4e1bc9a0SAchim Leubner }
404*4e1bc9a0SAchim Leubner 
405*4e1bc9a0SAchim Leubner /******************************************************************************/
406*4e1bc9a0SAchim Leubner /*! \brief Initiate a Port COntrol IOMB command
407*4e1bc9a0SAchim Leubner  *
408*4e1bc9a0SAchim Leubner  *  This function is called to initiate a Port COntrol command to the SPC.
409*4e1bc9a0SAchim Leubner  *  The completion of this function is reported in ossaPortControlCB().
410*4e1bc9a0SAchim Leubner  *
411*4e1bc9a0SAchim Leubner  *  \param agRoot        handles for this instance of SAS/SATA hardware
412*4e1bc9a0SAchim Leubner  *  \param agContext     the context of this API
413*4e1bc9a0SAchim Leubner  *  \param queueNum      queue number
414*4e1bc9a0SAchim Leubner  *  \param agPortContext point to the event source structure
415*4e1bc9a0SAchim Leubner  *  \param param0        parameter 0
416*4e1bc9a0SAchim Leubner  *  \param param1        parameter 1
417*4e1bc9a0SAchim Leubner  *
418*4e1bc9a0SAchim Leubner  *  \return - successful or failure
419*4e1bc9a0SAchim Leubner  */
420*4e1bc9a0SAchim Leubner /*******************************************************************************/
saPortControl(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,agsaPortContext_t * agPortContext,bit32 portOperation,bit32 param0,bit32 param1)421*4e1bc9a0SAchim Leubner GLOBAL bit32 saPortControl(
422*4e1bc9a0SAchim Leubner   agsaRoot_t            *agRoot,
423*4e1bc9a0SAchim Leubner   agsaContext_t         *agContext,
424*4e1bc9a0SAchim Leubner   bit32                 queueNum,
425*4e1bc9a0SAchim Leubner   agsaPortContext_t     *agPortContext,
426*4e1bc9a0SAchim Leubner   bit32                 portOperation,
427*4e1bc9a0SAchim Leubner   bit32                 param0,
428*4e1bc9a0SAchim Leubner   bit32                 param1
429*4e1bc9a0SAchim Leubner   )
430*4e1bc9a0SAchim Leubner {
431*4e1bc9a0SAchim Leubner   agsaLLRoot_t *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
432*4e1bc9a0SAchim Leubner   agsaIORequestDesc_t  *pRequest;
433*4e1bc9a0SAchim Leubner   agsaPort_t           *pPort;
434*4e1bc9a0SAchim Leubner   bit32                ret = AGSA_RC_SUCCESS;
435*4e1bc9a0SAchim Leubner   bit32                opportId;
436*4e1bc9a0SAchim Leubner   agsaPortControlCmd_t payload;
437*4e1bc9a0SAchim Leubner   bit32               using_reserved = agFALSE;
438*4e1bc9a0SAchim Leubner 
439*4e1bc9a0SAchim Leubner 
440*4e1bc9a0SAchim Leubner   /* sanity check */
441*4e1bc9a0SAchim Leubner   SA_ASSERT((agNULL !=saRoot ), "");
442*4e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != agPortContext), "");
443*4e1bc9a0SAchim Leubner   if(saRoot == agNULL)
444*4e1bc9a0SAchim Leubner   {
445*4e1bc9a0SAchim Leubner     SA_DBG1(("saPortControl: saRoot == agNULL\n"));
446*4e1bc9a0SAchim Leubner     return(AGSA_RC_FAILURE);
447*4e1bc9a0SAchim Leubner   }
448*4e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD, "28");
449*4e1bc9a0SAchim Leubner 
450*4e1bc9a0SAchim Leubner   SA_DBG1(("saPortControl: portContext %p portOperation 0x%x param0 0x%x param1 0x%x\n", agPortContext, portOperation, param0, param1));
451*4e1bc9a0SAchim Leubner 
452*4e1bc9a0SAchim Leubner   /* Get request from free IORequests */
453*4e1bc9a0SAchim Leubner   ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
454*4e1bc9a0SAchim Leubner   pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeIORequests)); /**/
455*4e1bc9a0SAchim Leubner   /* If no LL Control request entry available */
456*4e1bc9a0SAchim Leubner   if ( agNULL == pRequest )
457*4e1bc9a0SAchim Leubner   {
458*4e1bc9a0SAchim Leubner     pRequest = (agsaIORequestDesc_t *)saLlistIOGetHead(&(saRoot->freeReservedRequests));
459*4e1bc9a0SAchim Leubner     /* If no LL Control request entry available */
460*4e1bc9a0SAchim Leubner     if(agNULL != pRequest)
461*4e1bc9a0SAchim Leubner     {
462*4e1bc9a0SAchim Leubner       using_reserved = agTRUE;
463*4e1bc9a0SAchim Leubner       SA_DBG2(("saPortControl, using saRoot->freeReservedRequests\n"));
464*4e1bc9a0SAchim Leubner     }
465*4e1bc9a0SAchim Leubner     else
466*4e1bc9a0SAchim Leubner     {
467*4e1bc9a0SAchim Leubner       ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
468*4e1bc9a0SAchim Leubner       SA_DBG1(("saPortControl, No request from free list Not using saRoot->freeReservedRequests\n"));
469*4e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "28");
470*4e1bc9a0SAchim Leubner       return AGSA_RC_BUSY;
471*4e1bc9a0SAchim Leubner     }
472*4e1bc9a0SAchim Leubner   }
473*4e1bc9a0SAchim Leubner 
474*4e1bc9a0SAchim Leubner   /* If LL Control request entry avaliable */
475*4e1bc9a0SAchim Leubner   if( using_reserved )
476*4e1bc9a0SAchim Leubner   {
477*4e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
478*4e1bc9a0SAchim Leubner   }
479*4e1bc9a0SAchim Leubner   else
480*4e1bc9a0SAchim Leubner   {
481*4e1bc9a0SAchim Leubner     /* Remove the request from free list */
482*4e1bc9a0SAchim Leubner     saLlistIORemove(&(saRoot->freeIORequests), &(pRequest->linkNode));
483*4e1bc9a0SAchim Leubner   }
484*4e1bc9a0SAchim Leubner   SA_ASSERT((!pRequest->valid), "The pRequest is in use");
485*4e1bc9a0SAchim Leubner   saRoot->IOMap[pRequest->HTag].Tag = pRequest->HTag;
486*4e1bc9a0SAchim Leubner   saRoot->IOMap[pRequest->HTag].IORequest = (void *)pRequest;
487*4e1bc9a0SAchim Leubner   saRoot->IOMap[pRequest->HTag].agContext = agContext;
488*4e1bc9a0SAchim Leubner   pRequest->valid = agTRUE;
489*4e1bc9a0SAchim Leubner   ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
490*4e1bc9a0SAchim Leubner 
491*4e1bc9a0SAchim Leubner   /* build IOMB command and send to SPC */
492*4e1bc9a0SAchim Leubner   /* set payload to zeros */
493*4e1bc9a0SAchim Leubner   si_memset(&payload, 0, sizeof(agsaPortControlCmd_t));
494*4e1bc9a0SAchim Leubner 
495*4e1bc9a0SAchim Leubner   /* find port id */
496*4e1bc9a0SAchim Leubner   pPort = (agsaPort_t *) (agPortContext->sdkData);
497*4e1bc9a0SAchim Leubner   opportId = (pPort->portId & PORTID_MASK) | (portOperation << SHIFT8);
498*4e1bc9a0SAchim Leubner   /* set tag */
499*4e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaPortControlCmd_t, tag), pRequest->HTag);
500*4e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaPortControlCmd_t, portOPPortId), opportId);
501*4e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaPortControlCmd_t, Param0), param0);
502*4e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot, &payload, OSSA_OFFSET_OF(agsaPortControlCmd_t, Param1), param1);
503*4e1bc9a0SAchim Leubner 
504*4e1bc9a0SAchim Leubner   SA_DBG1(("saPortControl: portId 0x%x portOperation 0x%x\n", (pPort->portId & PORTID_MASK),portOperation));
505*4e1bc9a0SAchim Leubner 
506*4e1bc9a0SAchim Leubner   /* build IOMB command and send to SPC */
507*4e1bc9a0SAchim Leubner   ret = mpiBuildCmd(agRoot, (bit32 *)&payload, MPI_CATEGORY_SAS_SATA, OPC_INB_PORT_CONTROL, IOMB_SIZE64, queueNum);
508*4e1bc9a0SAchim Leubner   if (AGSA_RC_SUCCESS != ret)
509*4e1bc9a0SAchim Leubner   {
510*4e1bc9a0SAchim Leubner     /* remove the request from IOMap */
511*4e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].Tag = MARK_OFF;
512*4e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].IORequest = agNULL;
513*4e1bc9a0SAchim Leubner     saRoot->IOMap[pRequest->HTag].agContext = agNULL;
514*4e1bc9a0SAchim Leubner     pRequest->valid = agFALSE;
515*4e1bc9a0SAchim Leubner     /* return the request to free pool */
516*4e1bc9a0SAchim Leubner     ossaSingleThreadedEnter(agRoot, LL_IOREQ_LOCKEQ_LOCK);
517*4e1bc9a0SAchim Leubner     if (saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
518*4e1bc9a0SAchim Leubner     {
519*4e1bc9a0SAchim Leubner       SA_DBG1(("saPortControl: saving pRequest (%p) for later use\n", pRequest));
520*4e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequest->linkNode));
521*4e1bc9a0SAchim Leubner     }
522*4e1bc9a0SAchim Leubner     else
523*4e1bc9a0SAchim Leubner     {
524*4e1bc9a0SAchim Leubner       /* return the request to free pool */
525*4e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequest->linkNode));
526*4e1bc9a0SAchim Leubner     }
527*4e1bc9a0SAchim Leubner     ossaSingleThreadedLeave(agRoot, LL_IOREQ_LOCKEQ_LOCK);
528*4e1bc9a0SAchim Leubner     SA_DBG1(("saPortControl, sending IOMB failed\n" ));
529*4e1bc9a0SAchim Leubner   }
530*4e1bc9a0SAchim Leubner   else
531*4e1bc9a0SAchim Leubner   {
532*4e1bc9a0SAchim Leubner     if (portOperation == AGSA_PORT_HARD_RESET)
533*4e1bc9a0SAchim Leubner     {
534*4e1bc9a0SAchim Leubner       SA_DBG1(("saPortControl,0x%x AGSA_PORT_HARD_RESET 0x%x param0 0x%x\n",
535*4e1bc9a0SAchim Leubner                 pPort->portId, param0, param0 & AUTO_HARD_RESET_DEREG_FLAG));
536*4e1bc9a0SAchim Leubner       saRoot->autoDeregDeviceflag[pPort->portId & PORTID_MASK] = param0 & AUTO_HARD_RESET_DEREG_FLAG;
537*4e1bc9a0SAchim Leubner     }
538*4e1bc9a0SAchim Leubner     else if (portOperation == AGSA_PORT_CLEAN_UP)
539*4e1bc9a0SAchim Leubner     {
540*4e1bc9a0SAchim Leubner       SA_DBG1(("saPortControl, 0x%x AGSA_PORT_CLEAN_UP param0 0x%x %d\n", pPort->portId, param0,((param0 & AUTO_FW_CLEANUP_DEREG_FLAG) ? 0:1)));
541*4e1bc9a0SAchim Leubner       saRoot->autoDeregDeviceflag[pPort->portId & PORTID_MASK] = ((param0 & AUTO_FW_CLEANUP_DEREG_FLAG) ? 0:1);
542*4e1bc9a0SAchim Leubner     }
543*4e1bc9a0SAchim Leubner     SA_DBG1(("saPortControl, sending IOMB SUCCESS, portId 0x%x autoDeregDeviceflag=0x%x\n", pPort->portId,saRoot->autoDeregDeviceflag[pPort->portId & PORTID_MASK]));
544*4e1bc9a0SAchim Leubner   }
545*4e1bc9a0SAchim Leubner 
546*4e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "28");
547*4e1bc9a0SAchim Leubner 
548*4e1bc9a0SAchim Leubner   return ret;
549*4e1bc9a0SAchim Leubner }
550*4e1bc9a0SAchim Leubner 
551*4e1bc9a0SAchim Leubner /**
552*4e1bc9a0SAchim Leubner  * saEncryptGetMode()
553*4e1bc9a0SAchim Leubner  *
554*4e1bc9a0SAchim Leubner  *     Returns the status, working state and sector size
555*4e1bc9a0SAchim Leubner  *     registers of the encryption engine
556*4e1bc9a0SAchim Leubner  *
557*4e1bc9a0SAchim Leubner  * @param saRoot
558*4e1bc9a0SAchim Leubner  * @param encryptInfo
559*4e1bc9a0SAchim Leubner  *
560*4e1bc9a0SAchim Leubner  * @return
561*4e1bc9a0SAchim Leubner  */
saEncryptGetMode(agsaRoot_t * agRoot,agsaContext_t * agContext,agsaEncryptInfo_t * encryptInfo)562*4e1bc9a0SAchim Leubner GLOBAL bit32 saEncryptGetMode(agsaRoot_t        *agRoot,
563*4e1bc9a0SAchim Leubner                               agsaContext_t     *agContext,
564*4e1bc9a0SAchim Leubner                               agsaEncryptInfo_t *encryptInfo)
565*4e1bc9a0SAchim Leubner {
566*4e1bc9a0SAchim Leubner     bit32 ret = AGSA_RC_NOT_SUPPORTED;
567*4e1bc9a0SAchim Leubner 
568*4e1bc9a0SAchim Leubner     smTraceFuncEnter(hpDBG_VERY_LOUD,"29");
569*4e1bc9a0SAchim Leubner     agContext = agContext; /* Lint*/
570*4e1bc9a0SAchim Leubner     SA_DBG4(("saEncryptGetMode, encryptInfo %p\n",encryptInfo ));
571*4e1bc9a0SAchim Leubner     if(smIS_SPCV(agRoot))
572*4e1bc9a0SAchim Leubner     {
573*4e1bc9a0SAchim Leubner       bit32 ScratchPad1 =0;
574*4e1bc9a0SAchim Leubner       bit32 ScratchPad3 =0;
575*4e1bc9a0SAchim Leubner 
576*4e1bc9a0SAchim Leubner       encryptInfo->status = 0;
577*4e1bc9a0SAchim Leubner       encryptInfo->encryptionCipherMode = 0;
578*4e1bc9a0SAchim Leubner       encryptInfo->encryptionSecurityMode = 0;
579*4e1bc9a0SAchim Leubner       encryptInfo->flag = 0;
580*4e1bc9a0SAchim Leubner 
581*4e1bc9a0SAchim Leubner       ScratchPad1 = ossaHwRegRead(agRoot,V_Scratchpad_1_Register);
582*4e1bc9a0SAchim Leubner       ScratchPad3 = ossaHwRegRead(agRoot,V_Scratchpad_3_Register);
583*4e1bc9a0SAchim Leubner       if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) ==  SCRATCH_PAD1_V_RAAE_MASK)
584*4e1bc9a0SAchim Leubner       {
585*4e1bc9a0SAchim Leubner         if((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK) == SCRATCH_PAD3_V_ENC_READY ) /* 3 */
586*4e1bc9a0SAchim Leubner         {
587*4e1bc9a0SAchim Leubner           if( ScratchPad3 & SCRATCH_PAD3_V_XTS_ENABLED)
588*4e1bc9a0SAchim Leubner           {
589*4e1bc9a0SAchim Leubner             encryptInfo->encryptionCipherMode = agsaEncryptCipherModeXTS;
590*4e1bc9a0SAchim Leubner           }
591*4e1bc9a0SAchim Leubner           if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMF_ENABLED )
592*4e1bc9a0SAchim Leubner           {
593*4e1bc9a0SAchim Leubner             encryptInfo->encryptionSecurityMode = agsaEncryptSMF;
594*4e1bc9a0SAchim Leubner           }
595*4e1bc9a0SAchim Leubner           if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMA_ENABLED)
596*4e1bc9a0SAchim Leubner           {
597*4e1bc9a0SAchim Leubner             encryptInfo->encryptionSecurityMode = agsaEncryptSMA;
598*4e1bc9a0SAchim Leubner           }
599*4e1bc9a0SAchim Leubner           if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMB_ENABLED )
600*4e1bc9a0SAchim Leubner           {
601*4e1bc9a0SAchim Leubner             encryptInfo->encryptionSecurityMode = agsaEncryptSMB;
602*4e1bc9a0SAchim Leubner           }
603*4e1bc9a0SAchim Leubner           encryptInfo->status = AGSA_RC_SUCCESS;
604*4e1bc9a0SAchim Leubner           ret = AGSA_RC_SUCCESS;
605*4e1bc9a0SAchim Leubner         }
606*4e1bc9a0SAchim Leubner         else if((ScratchPad3 & SCRATCH_PAD3_V_ENC_READY) == SCRATCH_PAD3_V_ENC_DISABLED) /* 0 */
607*4e1bc9a0SAchim Leubner         {
608*4e1bc9a0SAchim Leubner           SA_DBG1(("saEncryptGetMode, SCRATCH_PAD3_V_ENC_DISABLED 1 0x%08X 3 0x%08X\n",ScratchPad1,ScratchPad3 ));
609*4e1bc9a0SAchim Leubner           encryptInfo->status = 0xFFFF;
610*4e1bc9a0SAchim Leubner           encryptInfo->encryptionCipherMode = 0;
611*4e1bc9a0SAchim Leubner           encryptInfo->encryptionSecurityMode = 0;
612*4e1bc9a0SAchim Leubner           ret = AGSA_RC_NOT_SUPPORTED;
613*4e1bc9a0SAchim Leubner         }
614*4e1bc9a0SAchim Leubner         else if((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_DIS_ERR) /* 1 */
615*4e1bc9a0SAchim Leubner         {
616*4e1bc9a0SAchim Leubner           SA_DBG1(("saEncryptGetMode, SCRATCH_PAD3_V_ENC_DIS_ERR 1 0x%08X 3 0x%08X\n",ScratchPad1,ScratchPad3 ));
617*4e1bc9a0SAchim Leubner           encryptInfo->status = (ScratchPad3 & SCRATCH_PAD3_V_ERR_CODE ) >> SHIFT16;
618*4e1bc9a0SAchim Leubner           if( ScratchPad3 & SCRATCH_PAD3_V_XTS_ENABLED)
619*4e1bc9a0SAchim Leubner           {
620*4e1bc9a0SAchim Leubner             encryptInfo->encryptionCipherMode = agsaEncryptCipherModeXTS;
621*4e1bc9a0SAchim Leubner           }
622*4e1bc9a0SAchim Leubner           if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMF_ENABLED )
623*4e1bc9a0SAchim Leubner           {
624*4e1bc9a0SAchim Leubner             encryptInfo->encryptionSecurityMode = agsaEncryptSMF;
625*4e1bc9a0SAchim Leubner           }
626*4e1bc9a0SAchim Leubner           if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMA_ENABLED)
627*4e1bc9a0SAchim Leubner           {
628*4e1bc9a0SAchim Leubner             encryptInfo->encryptionSecurityMode = agsaEncryptSMA;
629*4e1bc9a0SAchim Leubner           }
630*4e1bc9a0SAchim Leubner           if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMB_ENABLED )
631*4e1bc9a0SAchim Leubner           {
632*4e1bc9a0SAchim Leubner             encryptInfo->encryptionSecurityMode = agsaEncryptSMB;
633*4e1bc9a0SAchim Leubner           }
634*4e1bc9a0SAchim Leubner           ret = AGSA_RC_FAILURE;
635*4e1bc9a0SAchim Leubner         }
636*4e1bc9a0SAchim Leubner         else if((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_ENA_ERR) /* 2 */
637*4e1bc9a0SAchim Leubner         {
638*4e1bc9a0SAchim Leubner 
639*4e1bc9a0SAchim Leubner           SA_DBG1(("saEncryptGetMode, SCRATCH_PAD3_V_ENC_ENA_ERR 1 0x%08X 3 0x%08X\n",ScratchPad1,ScratchPad3 ));
640*4e1bc9a0SAchim Leubner           encryptInfo->status = (ScratchPad3 & SCRATCH_PAD3_V_ERR_CODE ) >> SHIFT16;
641*4e1bc9a0SAchim Leubner           if( ScratchPad3 & SCRATCH_PAD3_V_XTS_ENABLED)
642*4e1bc9a0SAchim Leubner           {
643*4e1bc9a0SAchim Leubner             encryptInfo->encryptionCipherMode = agsaEncryptCipherModeXTS;
644*4e1bc9a0SAchim Leubner             SA_DBG1(("saEncryptGetMode, SCRATCH_PAD3_V_ENC_ENA_ERR 2 0x%08X 3 0x%08X\n",ScratchPad1,ScratchPad3 ));
645*4e1bc9a0SAchim Leubner           }
646*4e1bc9a0SAchim Leubner           if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMF_ENABLED )
647*4e1bc9a0SAchim Leubner           {
648*4e1bc9a0SAchim Leubner             SA_DBG1(("saEncryptGetMode, SCRATCH_PAD3_V_ENC_ENA_ERR 3 0x%08X 3 0x%08X\n",ScratchPad1,ScratchPad3 ));
649*4e1bc9a0SAchim Leubner             encryptInfo->encryptionSecurityMode = agsaEncryptSMF;
650*4e1bc9a0SAchim Leubner           }
651*4e1bc9a0SAchim Leubner           if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMA_ENABLED)
652*4e1bc9a0SAchim Leubner           {
653*4e1bc9a0SAchim Leubner             encryptInfo->encryptionSecurityMode = agsaEncryptSMA;
654*4e1bc9a0SAchim Leubner           }
655*4e1bc9a0SAchim Leubner           if( (ScratchPad3 & SCRATCH_PAD3_V_SM_MASK ) == SCRATCH_PAD3_V_SMB_ENABLED )
656*4e1bc9a0SAchim Leubner           {
657*4e1bc9a0SAchim Leubner             encryptInfo->encryptionSecurityMode = agsaEncryptSMB;
658*4e1bc9a0SAchim Leubner           }
659*4e1bc9a0SAchim Leubner 
660*4e1bc9a0SAchim Leubner           SA_DBG1(("saEncryptGetMode,encryptInfo status 0x%08X CipherMode 0x%X SecurityMode 0x%X\n" ,
661*4e1bc9a0SAchim Leubner               encryptInfo->status,
662*4e1bc9a0SAchim Leubner               encryptInfo->encryptionCipherMode,
663*4e1bc9a0SAchim Leubner               encryptInfo->encryptionSecurityMode));
664*4e1bc9a0SAchim Leubner 
665*4e1bc9a0SAchim Leubner #ifdef CCFLAGS_SPCV_FPGA_REVB /*The FPGA platform hasn't EEPROM*/
666*4e1bc9a0SAchim Leubner           ret = AGSA_RC_SUCCESS;
667*4e1bc9a0SAchim Leubner #else
668*4e1bc9a0SAchim Leubner           ret = AGSA_RC_FAILURE;
669*4e1bc9a0SAchim Leubner #endif
670*4e1bc9a0SAchim Leubner         }
671*4e1bc9a0SAchim Leubner       }
672*4e1bc9a0SAchim Leubner       else  if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) ==  SCRATCH_PAD1_V_RAAE_ERR)
673*4e1bc9a0SAchim Leubner       {
674*4e1bc9a0SAchim Leubner         SA_DBG1(("saEncryptGetMode, SCRATCH_PAD1_V_RAAE_ERR 1 0x%08X 3 0x%08X\n",ScratchPad1,ScratchPad3 ));
675*4e1bc9a0SAchim Leubner         ret = AGSA_RC_FAILURE;
676*4e1bc9a0SAchim Leubner       }
677*4e1bc9a0SAchim Leubner       else  if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) == 0x0 )
678*4e1bc9a0SAchim Leubner       {
679*4e1bc9a0SAchim Leubner         SA_DBG1(("saEncryptGetMode, RAAE not ready AGSA_RC_BUSY 1 0x%08X 3 0x%08X\n",ScratchPad1,ScratchPad3 ));
680*4e1bc9a0SAchim Leubner         ret = AGSA_RC_BUSY;
681*4e1bc9a0SAchim Leubner       }
682*4e1bc9a0SAchim Leubner       if(ScratchPad3 & SCRATCH_PAD3_V_AUT)
683*4e1bc9a0SAchim Leubner       {
684*4e1bc9a0SAchim Leubner         encryptInfo->flag |= OperatorAuthenticationEnable_AUT;
685*4e1bc9a0SAchim Leubner       }
686*4e1bc9a0SAchim Leubner       if(ScratchPad3 & SCRATCH_PAD3_V_ARF)
687*4e1bc9a0SAchim Leubner       {
688*4e1bc9a0SAchim Leubner         encryptInfo->flag |= ReturnToFactoryMode_ARF;
689*4e1bc9a0SAchim Leubner       }
690*4e1bc9a0SAchim Leubner 
691*4e1bc9a0SAchim Leubner       SA_DBG2(("saEncryptGetMode, encryptionCipherMode 0x%x encryptionSecurityMode 0x%x flag 0x%x status 0x%x\n",
692*4e1bc9a0SAchim Leubner                 encryptInfo->encryptionCipherMode,
693*4e1bc9a0SAchim Leubner                 encryptInfo->encryptionSecurityMode,
694*4e1bc9a0SAchim Leubner                 encryptInfo->flag,
695*4e1bc9a0SAchim Leubner                 encryptInfo->status));
696*4e1bc9a0SAchim Leubner       SA_DBG2(("saEncryptGetMode, ScratchPad3 0x%x returns 0x%x\n",ScratchPad3, ret));
697*4e1bc9a0SAchim Leubner 
698*4e1bc9a0SAchim Leubner     }
699*4e1bc9a0SAchim Leubner     else
700*4e1bc9a0SAchim Leubner     {
701*4e1bc9a0SAchim Leubner       SA_DBG1(("saEncryptGetMode, SPC AGSA_RC_NOT_SUPPORTED\n"));
702*4e1bc9a0SAchim Leubner     }
703*4e1bc9a0SAchim Leubner 
704*4e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "29");
705*4e1bc9a0SAchim Leubner     return ret;
706*4e1bc9a0SAchim Leubner }
707*4e1bc9a0SAchim Leubner 
708*4e1bc9a0SAchim Leubner /**/
saEncryptSetMode(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,agsaEncryptInfo_t * mode)709*4e1bc9a0SAchim Leubner GLOBAL bit32 saEncryptSetMode (
710*4e1bc9a0SAchim Leubner                       agsaRoot_t        *agRoot,
711*4e1bc9a0SAchim Leubner                       agsaContext_t     *agContext,
712*4e1bc9a0SAchim Leubner                       bit32             queueNum,
713*4e1bc9a0SAchim Leubner                       agsaEncryptInfo_t *mode
714*4e1bc9a0SAchim Leubner                       )
715*4e1bc9a0SAchim Leubner 
716*4e1bc9a0SAchim Leubner {
717*4e1bc9a0SAchim Leubner   bit32 ret = AGSA_RC_NOT_SUPPORTED;
718*4e1bc9a0SAchim Leubner   agsaSetControllerConfigCmd_t agControllerConfig;
719*4e1bc9a0SAchim Leubner   agsaSetControllerConfigCmd_t *pagControllerConfig = &agControllerConfig;
720*4e1bc9a0SAchim Leubner   bit32 smode = 0;
721*4e1bc9a0SAchim Leubner 
722*4e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
723*4e1bc9a0SAchim Leubner   {
724*4e1bc9a0SAchim Leubner     bit32 ScratchPad1 =0;
725*4e1bc9a0SAchim Leubner 
726*4e1bc9a0SAchim Leubner     ScratchPad1 = ossaHwRegRead(agRoot,V_Scratchpad_1_Register);
727*4e1bc9a0SAchim Leubner     if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) ==  SCRATCH_PAD1_V_RAAE_MASK)
728*4e1bc9a0SAchim Leubner     {
729*4e1bc9a0SAchim Leubner       si_memset(pagControllerConfig,0,sizeof(agsaSetControllerConfigCmd_t));
730*4e1bc9a0SAchim Leubner 
731*4e1bc9a0SAchim Leubner       SA_DBG2(("saEncryptSetMode, encryptionCipherMode 0x%x encryptionSecurityMode 0x%x status 0x%x\n",
732*4e1bc9a0SAchim Leubner                                           mode->encryptionCipherMode,
733*4e1bc9a0SAchim Leubner                                           mode->encryptionSecurityMode,
734*4e1bc9a0SAchim Leubner                                           mode->status
735*4e1bc9a0SAchim Leubner                                           ));
736*4e1bc9a0SAchim Leubner 
737*4e1bc9a0SAchim Leubner       smode = mode->encryptionSecurityMode;
738*4e1bc9a0SAchim Leubner 
739*4e1bc9a0SAchim Leubner       if( mode->encryptionCipherMode & agsaEncryptCipherModeXTS)
740*4e1bc9a0SAchim Leubner       {
741*4e1bc9a0SAchim Leubner         smode |= 1 << SHIFT22;
742*4e1bc9a0SAchim Leubner       }
743*4e1bc9a0SAchim Leubner 
744*4e1bc9a0SAchim Leubner 
745*4e1bc9a0SAchim Leubner       pagControllerConfig->pageCode = AGSA_ENCRYPTION_CONTROL_PARM_PAGE | smode;
746*4e1bc9a0SAchim Leubner       pagControllerConfig->tag =0;
747*4e1bc9a0SAchim Leubner 
748*4e1bc9a0SAchim Leubner       SA_DBG2(("saEncryptSetMode,tag 0x%x pageCode 0x%x\n",
749*4e1bc9a0SAchim Leubner                                           pagControllerConfig->tag,
750*4e1bc9a0SAchim Leubner                                           pagControllerConfig->pageCode
751*4e1bc9a0SAchim Leubner                                           ));
752*4e1bc9a0SAchim Leubner 
753*4e1bc9a0SAchim Leubner       SA_DBG2(("saEncryptSetMode, 0x%x 0x%x 0x%x 0x%x\n",
754*4e1bc9a0SAchim Leubner                                           pagControllerConfig->configPage[0],
755*4e1bc9a0SAchim Leubner                                           pagControllerConfig->configPage[1],
756*4e1bc9a0SAchim Leubner                                           pagControllerConfig->configPage[2],
757*4e1bc9a0SAchim Leubner                                           pagControllerConfig->configPage[3]
758*4e1bc9a0SAchim Leubner                                           ));
759*4e1bc9a0SAchim Leubner 
760*4e1bc9a0SAchim Leubner       SA_DBG2(("saEncryptSetMode, 0x%x 0x%x 0x%x 0x%x\n",
761*4e1bc9a0SAchim Leubner                                           pagControllerConfig->configPage[4],
762*4e1bc9a0SAchim Leubner                                           pagControllerConfig->configPage[5],
763*4e1bc9a0SAchim Leubner                                           pagControllerConfig->configPage[6],
764*4e1bc9a0SAchim Leubner                                           pagControllerConfig->configPage[7]
765*4e1bc9a0SAchim Leubner                                           ));
766*4e1bc9a0SAchim Leubner 
767*4e1bc9a0SAchim Leubner       SA_DBG2(("saEncryptSetMode, 0x%x 0x%x 0x%x 0x%x\n",
768*4e1bc9a0SAchim Leubner                                           pagControllerConfig->configPage[8],
769*4e1bc9a0SAchim Leubner                                           pagControllerConfig->configPage[9],
770*4e1bc9a0SAchim Leubner                                           pagControllerConfig->configPage[10],
771*4e1bc9a0SAchim Leubner                                           pagControllerConfig->configPage[11]
772*4e1bc9a0SAchim Leubner                                           ));
773*4e1bc9a0SAchim Leubner 
774*4e1bc9a0SAchim Leubner       ret = mpiSetControllerConfigCmd(agRoot,agContext,pagControllerConfig,queueNum,agTRUE);
775*4e1bc9a0SAchim Leubner 
776*4e1bc9a0SAchim Leubner       SA_DBG2(("saEncryptSetMode,  pageCode 0x%x tag 0x%x status 0x%x\n",
777*4e1bc9a0SAchim Leubner                                         pagControllerConfig->pageCode,
778*4e1bc9a0SAchim Leubner                                         pagControllerConfig->tag,
779*4e1bc9a0SAchim Leubner                                         ret
780*4e1bc9a0SAchim Leubner                                         ));
781*4e1bc9a0SAchim Leubner     }
782*4e1bc9a0SAchim Leubner     else
783*4e1bc9a0SAchim Leubner     {
784*4e1bc9a0SAchim Leubner       SA_DBG2(("saEncryptSetMode,ScratchPad1 not ready %08X\n",ScratchPad1 ));
785*4e1bc9a0SAchim Leubner       ret = AGSA_RC_BUSY;
786*4e1bc9a0SAchim Leubner     }
787*4e1bc9a0SAchim Leubner 
788*4e1bc9a0SAchim Leubner   }
789*4e1bc9a0SAchim Leubner   return ret;
790*4e1bc9a0SAchim Leubner }
791*4e1bc9a0SAchim Leubner 
792*4e1bc9a0SAchim Leubner 
793*4e1bc9a0SAchim Leubner 
794*4e1bc9a0SAchim Leubner /**
795*4e1bc9a0SAchim Leubner  * saEncryptKekUpdate()
796*4e1bc9a0SAchim Leubner  *
797*4e1bc9a0SAchim Leubner  *     Replace a KEK within the controller
798*4e1bc9a0SAchim Leubner  *
799*4e1bc9a0SAchim Leubner  * @param saRoot
800*4e1bc9a0SAchim Leubner  * @param flags
801*4e1bc9a0SAchim Leubner  * @param newKekIndex
802*4e1bc9a0SAchim Leubner  * @param wrapperKekIndex
803*4e1bc9a0SAchim Leubner  * @param encryptKekBlob
804*4e1bc9a0SAchim Leubner  *
805*4e1bc9a0SAchim Leubner  * @return
806*4e1bc9a0SAchim Leubner  */
saEncryptKekUpdate(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,bit32 flags,bit32 newKekIndex,bit32 wrapperKekIndex,bit32 blobFormat,agsaEncryptKekBlob_t * encryptKekBlob)807*4e1bc9a0SAchim Leubner GLOBAL bit32 saEncryptKekUpdate(
808*4e1bc9a0SAchim Leubner                     agsaRoot_t         *agRoot,
809*4e1bc9a0SAchim Leubner                     agsaContext_t      *agContext,
810*4e1bc9a0SAchim Leubner                     bit32              queueNum,
811*4e1bc9a0SAchim Leubner                     bit32              flags,
812*4e1bc9a0SAchim Leubner                     bit32              newKekIndex,
813*4e1bc9a0SAchim Leubner                     bit32              wrapperKekIndex,
814*4e1bc9a0SAchim Leubner                     bit32              blobFormat,
815*4e1bc9a0SAchim Leubner                     agsaEncryptKekBlob_t *encryptKekBlob
816*4e1bc9a0SAchim Leubner                     )
817*4e1bc9a0SAchim Leubner {
818*4e1bc9a0SAchim Leubner   agsaKekManagementCmd_t     payload;
819*4e1bc9a0SAchim Leubner   bit32 ret, i;
820*4e1bc9a0SAchim Leubner 
821*4e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"30");
822*4e1bc9a0SAchim Leubner 
823*4e1bc9a0SAchim Leubner   SA_DBG2(("saEncryptKekUpdate, flags 0x%x newKekIndex 0x%x wrapperKekIndex 0x%x encryptKekBlob %p\n",flags,newKekIndex,wrapperKekIndex,encryptKekBlob));
824*4e1bc9a0SAchim Leubner   SA_DBG2(("saEncryptKekUpdate, 0x%02X%02X%02X%02X 0x%02X%02X%02X%02X\n",
825*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[0],encryptKekBlob->kekBlob[1],
826*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[2],encryptKekBlob->kekBlob[3],
827*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[4],encryptKekBlob->kekBlob[5],
828*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[6],encryptKekBlob->kekBlob[7]));
829*4e1bc9a0SAchim Leubner   SA_DBG2(("saEncryptKekUpdate, 0x%02X%02X%02X%02X 0x%02X%02X%02X%02X\n",
830*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[ 8],encryptKekBlob->kekBlob[ 9],
831*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[10],encryptKekBlob->kekBlob[11],
832*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[12],encryptKekBlob->kekBlob[13],
833*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[14],encryptKekBlob->kekBlob[15]));
834*4e1bc9a0SAchim Leubner   SA_DBG2(("saEncryptKekUpdate, 0x%02X%02X%02X%02X 0x%02X%02X%02X%02X\n",
835*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[16],encryptKekBlob->kekBlob[17],
836*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[18],encryptKekBlob->kekBlob[19],
837*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[20],encryptKekBlob->kekBlob[21],
838*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[22],encryptKekBlob->kekBlob[23]));
839*4e1bc9a0SAchim Leubner   SA_DBG2(("saEncryptKekUpdate, 0x%02X%02X%02X%02X 0x%02X%02X%02X%02X\n",
840*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[24],encryptKekBlob->kekBlob[25],
841*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[26],encryptKekBlob->kekBlob[27],
842*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[28],encryptKekBlob->kekBlob[29],
843*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[30],encryptKekBlob->kekBlob[31]));
844*4e1bc9a0SAchim Leubner   SA_DBG2(("saEncryptKekUpdate, 0x%02X%02X%02X%02X 0x%02X%02X%02X%02X\n",
845*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[32],encryptKekBlob->kekBlob[33],
846*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[34],encryptKekBlob->kekBlob[35],
847*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[36],encryptKekBlob->kekBlob[37],
848*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[38],encryptKekBlob->kekBlob[39]));
849*4e1bc9a0SAchim Leubner   SA_DBG2(("saEncryptKekUpdate, 0x%02X%02X%02X%02X 0x%02X%02X%02X%02X\n",
850*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[40],encryptKekBlob->kekBlob[41],
851*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[42],encryptKekBlob->kekBlob[43],
852*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[44],encryptKekBlob->kekBlob[45],
853*4e1bc9a0SAchim Leubner                                 encryptKekBlob->kekBlob[46],encryptKekBlob->kekBlob[47]));
854*4e1bc9a0SAchim Leubner   /* create payload for IOMB */
855*4e1bc9a0SAchim Leubner   si_memset(&payload, 0, sizeof(agsaKekManagementCmd_t));
856*4e1bc9a0SAchim Leubner 
857*4e1bc9a0SAchim Leubner   OSSA_WRITE_LE_32(agRoot,
858*4e1bc9a0SAchim Leubner                    &payload,
859*4e1bc9a0SAchim Leubner                    OSSA_OFFSET_OF(agsaKekManagementCmd_t, NEWKIDX_CURKIDX_KBF_Reserved_SKNV_KSOP),
860*4e1bc9a0SAchim Leubner                    (newKekIndex << SHIFT24) | (wrapperKekIndex << SHIFT16) | blobFormat << SHIFT14 | (flags << SHIFT8) | KEK_MGMT_SUBOP_UPDATE);
861*4e1bc9a0SAchim Leubner   for (i = 0; i < 12; i++)
862*4e1bc9a0SAchim Leubner   {
863*4e1bc9a0SAchim Leubner 
864*4e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot,
865*4e1bc9a0SAchim Leubner                     &payload,
866*4e1bc9a0SAchim Leubner                     OSSA_OFFSET_OF(agsaKekManagementCmd_t, kekBlob[i ]),
867*4e1bc9a0SAchim Leubner                     (bit32)*(bit32*)&encryptKekBlob->kekBlob[i * sizeof(bit32)] );
868*4e1bc9a0SAchim Leubner /**/
869*4e1bc9a0SAchim Leubner     }
870*4e1bc9a0SAchim Leubner 
871*4e1bc9a0SAchim Leubner   ret = mpiKekManagementCmd(agRoot, agContext, &payload, queueNum );
872*4e1bc9a0SAchim Leubner 
873*4e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "30");
874*4e1bc9a0SAchim Leubner   return ret;
875*4e1bc9a0SAchim Leubner }
876*4e1bc9a0SAchim Leubner 
877*4e1bc9a0SAchim Leubner 
878*4e1bc9a0SAchim Leubner #ifdef HIALEAH_ENCRYPTION
879*4e1bc9a0SAchim Leubner 
saEncryptHilUpdate(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum)880*4e1bc9a0SAchim Leubner GLOBAL bit32 saEncryptHilUpdate(
881*4e1bc9a0SAchim Leubner                     agsaRoot_t         *agRoot,
882*4e1bc9a0SAchim Leubner                     agsaContext_t      *agContext,
883*4e1bc9a0SAchim Leubner                     bit32              queueNum
884*4e1bc9a0SAchim Leubner                     )
885*4e1bc9a0SAchim Leubner {
886*4e1bc9a0SAchim Leubner     agsaKekManagementCmd_t     payload;
887*4e1bc9a0SAchim Leubner 
888*4e1bc9a0SAchim Leubner     bit32 ScratchPad1 =0;
889*4e1bc9a0SAchim Leubner     bit32 ScratchPad3 =0;
890*4e1bc9a0SAchim Leubner     bit32 ret =0;
891*4e1bc9a0SAchim Leubner 
892*4e1bc9a0SAchim Leubner     ScratchPad1 = ossaHwRegRead(agRoot,V_Scratchpad_1_Register);
893*4e1bc9a0SAchim Leubner     ScratchPad3 = ossaHwRegRead(agRoot,V_Scratchpad_3_Register);
894*4e1bc9a0SAchim Leubner 
895*4e1bc9a0SAchim Leubner 
896*4e1bc9a0SAchim Leubner     smTraceFuncEnter(hpDBG_VERY_LOUD,"xxx");
897*4e1bc9a0SAchim Leubner 
898*4e1bc9a0SAchim Leubner     SA_DBG2(("saEncryptHilUpdate ScratchPad1 0x08%x ScratchPad3 0x08%x\n",ScratchPad1,ScratchPad3));
899*4e1bc9a0SAchim Leubner     /* create payload for IOMB */
900*4e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaKekManagementCmd_t));
901*4e1bc9a0SAchim Leubner 
902*4e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot,
903*4e1bc9a0SAchim Leubner                      &payload,
904*4e1bc9a0SAchim Leubner                      OSSA_OFFSET_OF(agsaKekManagementCmd_t, NEWKIDX_CURKIDX_KBF_Reserved_SKNV_KSOP),
905*4e1bc9a0SAchim Leubner                      (1 << SHIFT24) | (1 << SHIFT16) | (1 << SHIFT8) | KEK_MGMT_SUBOP_KEYCARDUPDATE);
906*4e1bc9a0SAchim Leubner /**/
907*4e1bc9a0SAchim Leubner 
908*4e1bc9a0SAchim Leubner     ret = mpiKekManagementCmd(agRoot, agContext, &payload, queueNum );
909*4e1bc9a0SAchim Leubner 
910*4e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "xxx");
911*4e1bc9a0SAchim Leubner     return ret;
912*4e1bc9a0SAchim Leubner }
913*4e1bc9a0SAchim Leubner #endif /* HIALEAH_ENCRYPTION */
914*4e1bc9a0SAchim Leubner 
915*4e1bc9a0SAchim Leubner /**
916*4e1bc9a0SAchim Leubner  * saEncryptKekInvalidate()
917*4e1bc9a0SAchim Leubner  *
918*4e1bc9a0SAchim Leubner  *     Remove a KEK from the controller
919*4e1bc9a0SAchim Leubner  *
920*4e1bc9a0SAchim Leubner  * @param saRoot
921*4e1bc9a0SAchim Leubner  * @param flags
922*4e1bc9a0SAchim Leubner  * @param newKekIndex
923*4e1bc9a0SAchim Leubner  * @param wrapperKekIndex
924*4e1bc9a0SAchim Leubner  * @param encryptKekBlob
925*4e1bc9a0SAchim Leubner  *
926*4e1bc9a0SAchim Leubner  * @return
927*4e1bc9a0SAchim Leubner  */
saEncryptKekInvalidate(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,bit32 kekIndex)928*4e1bc9a0SAchim Leubner GLOBAL bit32 saEncryptKekInvalidate(
929*4e1bc9a0SAchim Leubner                      agsaRoot_t        *agRoot,
930*4e1bc9a0SAchim Leubner                      agsaContext_t     *agContext,
931*4e1bc9a0SAchim Leubner                      bit32             queueNum,
932*4e1bc9a0SAchim Leubner                      bit32             kekIndex
933*4e1bc9a0SAchim Leubner                      )
934*4e1bc9a0SAchim Leubner {
935*4e1bc9a0SAchim Leubner     agsaKekManagementCmd_t     payload;
936*4e1bc9a0SAchim Leubner     bit32 ret;
937*4e1bc9a0SAchim Leubner 
938*4e1bc9a0SAchim Leubner     smTraceFuncEnter(hpDBG_VERY_LOUD,"31");
939*4e1bc9a0SAchim Leubner 
940*4e1bc9a0SAchim Leubner     SA_DBG2(("saEncryptKekInvalidate, kekIndex 0x%x \n",kekIndex));
941*4e1bc9a0SAchim Leubner 
942*4e1bc9a0SAchim Leubner 
943*4e1bc9a0SAchim Leubner     /* create payload for IOMB */
944*4e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaDekManagementCmd_t));
945*4e1bc9a0SAchim Leubner 
946*4e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot,
947*4e1bc9a0SAchim Leubner                      &payload,
948*4e1bc9a0SAchim Leubner                      OSSA_OFFSET_OF(agsaKekManagementCmd_t, NEWKIDX_CURKIDX_KBF_Reserved_SKNV_KSOP),
949*4e1bc9a0SAchim Leubner                      kekIndex << SHIFT16 | KEK_MGMT_SUBOP_INVALIDATE);
950*4e1bc9a0SAchim Leubner 
951*4e1bc9a0SAchim Leubner     ret = mpiKekManagementCmd(agRoot, agContext, &payload,  queueNum );
952*4e1bc9a0SAchim Leubner 
953*4e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "31");
954*4e1bc9a0SAchim Leubner     return ret;
955*4e1bc9a0SAchim Leubner }
956*4e1bc9a0SAchim Leubner 
957*4e1bc9a0SAchim Leubner /**
958*4e1bc9a0SAchim Leubner  * saEncryptDekCacheUpdate()
959*4e1bc9a0SAchim Leubner  *
960*4e1bc9a0SAchim Leubner  *     Replace a DEK within the controller cache
961*4e1bc9a0SAchim Leubner  *
962*4e1bc9a0SAchim Leubner  * @param saRoot
963*4e1bc9a0SAchim Leubner  * @param kekIndex
964*4e1bc9a0SAchim Leubner  * @param dekTableSelect
965*4e1bc9a0SAchim Leubner  * @param dekAddrHi
966*4e1bc9a0SAchim Leubner  * @param dekAddrLo
967*4e1bc9a0SAchim Leubner  * @param dekIndex
968*4e1bc9a0SAchim Leubner  * @param dekNumberOfEntries
969*4e1bc9a0SAchim Leubner  *
970*4e1bc9a0SAchim Leubner  * @return
971*4e1bc9a0SAchim Leubner  */
saEncryptDekCacheUpdate(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,bit32 kekIndex,bit32 dekTableSelect,bit32 dekAddrHi,bit32 dekAddrLo,bit32 dekIndex,bit32 dekNumberOfEntries,bit32 dekBlobFormat,bit32 dekTableKeyEntrySize)972*4e1bc9a0SAchim Leubner GLOBAL bit32 saEncryptDekCacheUpdate(
973*4e1bc9a0SAchim Leubner                      agsaRoot_t        *agRoot,
974*4e1bc9a0SAchim Leubner                      agsaContext_t     *agContext,
975*4e1bc9a0SAchim Leubner                      bit32             queueNum,
976*4e1bc9a0SAchim Leubner                      bit32             kekIndex,
977*4e1bc9a0SAchim Leubner                      bit32             dekTableSelect,
978*4e1bc9a0SAchim Leubner                      bit32             dekAddrHi,
979*4e1bc9a0SAchim Leubner                      bit32             dekAddrLo,
980*4e1bc9a0SAchim Leubner                      bit32             dekIndex,
981*4e1bc9a0SAchim Leubner                      bit32             dekNumberOfEntries,
982*4e1bc9a0SAchim Leubner                      bit32             dekBlobFormat,
983*4e1bc9a0SAchim Leubner                      bit32             dekTableKeyEntrySize
984*4e1bc9a0SAchim Leubner                      )
985*4e1bc9a0SAchim Leubner {
986*4e1bc9a0SAchim Leubner     agsaDekManagementCmd_t    payload;
987*4e1bc9a0SAchim Leubner     bit32 ret;
988*4e1bc9a0SAchim Leubner 
989*4e1bc9a0SAchim Leubner     smTraceFuncEnter(hpDBG_VERY_LOUD,"32");
990*4e1bc9a0SAchim Leubner 
991*4e1bc9a0SAchim Leubner     SA_DBG2(("saEncryptDekCacheUpdate, kekIndex 0x%x dekTableSelect 0x%x dekAddrHi 0x%x dekAddrLo 0x%x\n",
992*4e1bc9a0SAchim Leubner                      kekIndex,
993*4e1bc9a0SAchim Leubner                      dekTableSelect,
994*4e1bc9a0SAchim Leubner                      dekAddrHi,
995*4e1bc9a0SAchim Leubner                      dekAddrLo ));
996*4e1bc9a0SAchim Leubner     SA_DBG2(("saEncryptDekCacheUpdate, dekIndex 0x%x dekNumberOfEntries 0x%x dekBlobFormat 0x%x dekTableKeyEntrySize 0x%x\n",
997*4e1bc9a0SAchim Leubner                      dekIndex,
998*4e1bc9a0SAchim Leubner                      dekNumberOfEntries,
999*4e1bc9a0SAchim Leubner                      dekBlobFormat,
1000*4e1bc9a0SAchim Leubner                      dekTableKeyEntrySize));
1001*4e1bc9a0SAchim Leubner 
1002*4e1bc9a0SAchim Leubner     /* create payload for IOMB */
1003*4e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaDekManagementCmd_t));
1004*4e1bc9a0SAchim Leubner 
1005*4e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot,
1006*4e1bc9a0SAchim Leubner                      &payload,
1007*4e1bc9a0SAchim Leubner                      OSSA_OFFSET_OF(agsaDekManagementCmd_t, KEKIDX_Reserved_TBLS_DSOP),
1008*4e1bc9a0SAchim Leubner                      (kekIndex << SHIFT24) | (dekTableSelect << SHIFT8) | DEK_MGMT_SUBOP_UPDATE);
1009*4e1bc9a0SAchim Leubner 
1010*4e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot,
1011*4e1bc9a0SAchim Leubner                      &payload,
1012*4e1bc9a0SAchim Leubner                      OSSA_OFFSET_OF(agsaDekManagementCmd_t, dekIndex),
1013*4e1bc9a0SAchim Leubner                      dekIndex);
1014*4e1bc9a0SAchim Leubner 
1015*4e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot,
1016*4e1bc9a0SAchim Leubner                      &payload,
1017*4e1bc9a0SAchim Leubner                      OSSA_OFFSET_OF(agsaDekManagementCmd_t, tableAddrLo),
1018*4e1bc9a0SAchim Leubner                      dekAddrLo);
1019*4e1bc9a0SAchim Leubner 
1020*4e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot,
1021*4e1bc9a0SAchim Leubner                      &payload,
1022*4e1bc9a0SAchim Leubner                      OSSA_OFFSET_OF(agsaDekManagementCmd_t, tableAddrHi),
1023*4e1bc9a0SAchim Leubner                      dekAddrHi);
1024*4e1bc9a0SAchim Leubner 
1025*4e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot,
1026*4e1bc9a0SAchim Leubner                      &payload,
1027*4e1bc9a0SAchim Leubner                      OSSA_OFFSET_OF(agsaDekManagementCmd_t, tableEntries),
1028*4e1bc9a0SAchim Leubner                      dekNumberOfEntries);
1029*4e1bc9a0SAchim Leubner 
1030*4e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot,
1031*4e1bc9a0SAchim Leubner                      &payload,
1032*4e1bc9a0SAchim Leubner                      OSSA_OFFSET_OF(agsaDekManagementCmd_t, Reserved_DBF_TBL_SIZE),
1033*4e1bc9a0SAchim Leubner                      dekBlobFormat << SHIFT8 | dekTableKeyEntrySize );
1034*4e1bc9a0SAchim Leubner 
1035*4e1bc9a0SAchim Leubner     ret = mpiDekManagementCmd(agRoot, agContext, &payload, queueNum);
1036*4e1bc9a0SAchim Leubner 
1037*4e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "32");
1038*4e1bc9a0SAchim Leubner     return ret;
1039*4e1bc9a0SAchim Leubner }
1040*4e1bc9a0SAchim Leubner 
1041*4e1bc9a0SAchim Leubner /**
1042*4e1bc9a0SAchim Leubner  * saEncryptDekCacheInvalidate()
1043*4e1bc9a0SAchim Leubner  *
1044*4e1bc9a0SAchim Leubner  *     Remove a DEK from the controller cache
1045*4e1bc9a0SAchim Leubner  *
1046*4e1bc9a0SAchim Leubner  * @param saRoot
1047*4e1bc9a0SAchim Leubner  * @param kekIndex
1048*4e1bc9a0SAchim Leubner  * @param dekTable
1049*4e1bc9a0SAchim Leubner  * @param dekAddrHi
1050*4e1bc9a0SAchim Leubner  * @param dekAddrLo
1051*4e1bc9a0SAchim Leubner  * @param dekIndex
1052*4e1bc9a0SAchim Leubner  * @param dekNumberOfEntries
1053*4e1bc9a0SAchim Leubner  *
1054*4e1bc9a0SAchim Leubner  * @return
1055*4e1bc9a0SAchim Leubner  */
saEncryptDekCacheInvalidate(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,bit32 dekTable,bit32 dekIndex)1056*4e1bc9a0SAchim Leubner GLOBAL bit32 saEncryptDekCacheInvalidate(
1057*4e1bc9a0SAchim Leubner                     agsaRoot_t         *agRoot,
1058*4e1bc9a0SAchim Leubner                     agsaContext_t      *agContext,
1059*4e1bc9a0SAchim Leubner                     bit32              queueNum,
1060*4e1bc9a0SAchim Leubner                     bit32              dekTable,
1061*4e1bc9a0SAchim Leubner                     bit32              dekIndex
1062*4e1bc9a0SAchim Leubner                     )
1063*4e1bc9a0SAchim Leubner {
1064*4e1bc9a0SAchim Leubner     agsaDekManagementCmd_t     payload;
1065*4e1bc9a0SAchim Leubner     bit32 ret;
1066*4e1bc9a0SAchim Leubner 
1067*4e1bc9a0SAchim Leubner     smTraceFuncEnter(hpDBG_VERY_LOUD,"33");
1068*4e1bc9a0SAchim Leubner 
1069*4e1bc9a0SAchim Leubner     SA_DBG2(("saEncryptDekCacheInvalidate,dekTable  0x%x dekIndex 0x%x\n",dekTable,dekIndex));
1070*4e1bc9a0SAchim Leubner 
1071*4e1bc9a0SAchim Leubner     /* create payload for IOMB */
1072*4e1bc9a0SAchim Leubner     si_memset(&payload, 0, sizeof(agsaDekManagementCmd_t));
1073*4e1bc9a0SAchim Leubner 
1074*4e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot,
1075*4e1bc9a0SAchim Leubner                      &payload,
1076*4e1bc9a0SAchim Leubner                      OSSA_OFFSET_OF(agsaDekManagementCmd_t, KEKIDX_Reserved_TBLS_DSOP),
1077*4e1bc9a0SAchim Leubner                      (dekTable << SHIFT8) | DEK_MGMT_SUBOP_INVALIDATE);
1078*4e1bc9a0SAchim Leubner 
1079*4e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot,
1080*4e1bc9a0SAchim Leubner                      &payload,
1081*4e1bc9a0SAchim Leubner                      OSSA_OFFSET_OF(agsaDekManagementCmd_t, dekIndex),
1082*4e1bc9a0SAchim Leubner                      dekIndex);
1083*4e1bc9a0SAchim Leubner 
1084*4e1bc9a0SAchim Leubner     /* Assume all DEKs are 80 bytes*/
1085*4e1bc9a0SAchim Leubner     OSSA_WRITE_LE_32(agRoot,
1086*4e1bc9a0SAchim Leubner                      &payload,
1087*4e1bc9a0SAchim Leubner                      OSSA_OFFSET_OF(agsaDekManagementCmd_t, Reserved_DBF_TBL_SIZE),
1088*4e1bc9a0SAchim Leubner                      4);
1089*4e1bc9a0SAchim Leubner 
1090*4e1bc9a0SAchim Leubner     ret = mpiDekManagementCmd(agRoot, agContext, &payload, queueNum);
1091*4e1bc9a0SAchim Leubner 
1092*4e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "33");
1093*4e1bc9a0SAchim Leubner     return ret;
1094*4e1bc9a0SAchim Leubner }
1095*4e1bc9a0SAchim Leubner 
1096*4e1bc9a0SAchim Leubner /**
1097*4e1bc9a0SAchim Leubner  * saDIFEncryptionOffloadStart()
1098*4e1bc9a0SAchim Leubner  *
1099*4e1bc9a0SAchim Leubner  *     initiate the SPCv controller offload function
1100*4e1bc9a0SAchim Leubner  *
1101*4e1bc9a0SAchim Leubner  * @param saRoot
1102*4e1bc9a0SAchim Leubner  * @param agContext
1103*4e1bc9a0SAchim Leubner  * @param queueNum
1104*4e1bc9a0SAchim Leubner  * @param op
1105*4e1bc9a0SAchim Leubner  * @param agsaDifEncPayload
1106*4e1bc9a0SAchim Leubner  * @param agCB
1107*4e1bc9a0SAchim Leubner  *
1108*4e1bc9a0SAchim Leubner  * @return
1109*4e1bc9a0SAchim Leubner  */
saDIFEncryptionOffloadStart(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,bit32 op,agsaDifEncPayload_t * agsaDifEncPayload,ossaDIFEncryptionOffloadStartCB_t agCB)1110*4e1bc9a0SAchim Leubner GLOBAL bit32 saDIFEncryptionOffloadStart(
1111*4e1bc9a0SAchim Leubner                           agsaRoot_t         *agRoot,
1112*4e1bc9a0SAchim Leubner                           agsaContext_t      *agContext,
1113*4e1bc9a0SAchim Leubner                           bit32               queueNum,
1114*4e1bc9a0SAchim Leubner                           bit32               op,
1115*4e1bc9a0SAchim Leubner                           agsaDifEncPayload_t *agsaDifEncPayload,
1116*4e1bc9a0SAchim Leubner                           ossaDIFEncryptionOffloadStartCB_t agCB)
1117*4e1bc9a0SAchim Leubner {
1118*4e1bc9a0SAchim Leubner   bit32 ret = AGSA_RC_FAILURE;
1119*4e1bc9a0SAchim Leubner 
1120*4e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"3I");
1121*4e1bc9a0SAchim Leubner   SA_DBG1(("saDIFEncryptionOffloadStart: start op=%d, agsaDifEncPayload=%p\n", op, agsaDifEncPayload));
1122*4e1bc9a0SAchim Leubner 
1123*4e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
1124*4e1bc9a0SAchim Leubner   {
1125*4e1bc9a0SAchim Leubner     ret = mpiDIFEncryptionOffloadCmd(agRoot, agContext, queueNum, op, agsaDifEncPayload, agCB);
1126*4e1bc9a0SAchim Leubner   }
1127*4e1bc9a0SAchim Leubner   else
1128*4e1bc9a0SAchim Leubner   {
1129*4e1bc9a0SAchim Leubner     SA_DBG1(("saDIFEncryptionOffloadStart: spcv only AGSA_RC_FAILURE \n"));
1130*4e1bc9a0SAchim Leubner   }
1131*4e1bc9a0SAchim Leubner 
1132*4e1bc9a0SAchim Leubner   SA_DBG1(("saDIFEncryptionOffloadStart: end status 0x%x\n",ret));
1133*4e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3I");
1134*4e1bc9a0SAchim Leubner   return ret;
1135*4e1bc9a0SAchim Leubner }
1136*4e1bc9a0SAchim Leubner 
1137*4e1bc9a0SAchim Leubner /**
1138*4e1bc9a0SAchim Leubner  * saSetControllerConfig()
1139*4e1bc9a0SAchim Leubner  *
1140*4e1bc9a0SAchim Leubner  *     Update a controller mode page
1141*4e1bc9a0SAchim Leubner  *
1142*4e1bc9a0SAchim Leubner  * @param saRoot
1143*4e1bc9a0SAchim Leubner  * @param modePage
1144*4e1bc9a0SAchim Leubner  * @param length
1145*4e1bc9a0SAchim Leubner  * @param buffer
1146*4e1bc9a0SAchim Leubner  * @param agContext
1147*4e1bc9a0SAchim Leubner  *
1148*4e1bc9a0SAchim Leubner  * @return
1149*4e1bc9a0SAchim Leubner  */
saSetControllerConfig(agsaRoot_t * agRoot,bit32 queueNum,bit32 modePage,bit32 length,void * buffer,agsaContext_t * agContext)1150*4e1bc9a0SAchim Leubner GLOBAL bit32 saSetControllerConfig(
1151*4e1bc9a0SAchim Leubner                       agsaRoot_t        *agRoot,
1152*4e1bc9a0SAchim Leubner                       bit32             queueNum,
1153*4e1bc9a0SAchim Leubner                       bit32             modePage,
1154*4e1bc9a0SAchim Leubner                       bit32             length,
1155*4e1bc9a0SAchim Leubner                       void              *buffer,
1156*4e1bc9a0SAchim Leubner                       agsaContext_t     *agContext
1157*4e1bc9a0SAchim Leubner                       )
1158*4e1bc9a0SAchim Leubner {
1159*4e1bc9a0SAchim Leubner     agsaSetControllerConfigCmd_t agControllerConfig;
1160*4e1bc9a0SAchim Leubner     bit32 *src;
1161*4e1bc9a0SAchim Leubner     bit32 i, ret;
1162*4e1bc9a0SAchim Leubner 
1163*4e1bc9a0SAchim Leubner     smTraceFuncEnter(hpDBG_VERY_LOUD,"34");
1164*4e1bc9a0SAchim Leubner 
1165*4e1bc9a0SAchim Leubner 
1166*4e1bc9a0SAchim Leubner     if(smIS_SPCV(agRoot))
1167*4e1bc9a0SAchim Leubner     {
1168*4e1bc9a0SAchim Leubner 
1169*4e1bc9a0SAchim Leubner       SA_DBG2(("saSetControllerConfig: queueNum %d modePage 0x%x length %d\n",queueNum,modePage,length ));
1170*4e1bc9a0SAchim Leubner 
1171*4e1bc9a0SAchim Leubner       /* If the page is well known, validate the size of the buffer */
1172*4e1bc9a0SAchim Leubner       if (((modePage == AGSA_INTERRUPT_CONFIGURATION_PAGE)   && (length != sizeof(agsaInterruptConfigPage_t )))    ||
1173*4e1bc9a0SAchim Leubner            ((modePage == AGSA_ENCRYPTION_DEK_CONFIG_PAGE)    && (length != sizeof(agsaEncryptDekConfigPage_t)))     ||
1174*4e1bc9a0SAchim Leubner            ((modePage == AGSA_ENCRYPTION_CONTROL_PARM_PAGE)  && (length != sizeof(agsaEncryptControlParamPage_t ))) ||
1175*4e1bc9a0SAchim Leubner            ((modePage == AGSA_ENCRYPTION_HMAC_CONFIG_PAGE)   && (length != sizeof(agsaEncryptHMACConfigPage_t )))   ||
1176*4e1bc9a0SAchim Leubner            ((modePage == AGSA_SAS_PROTOCOL_TIMER_CONFIG_PAGE) && (length != sizeof(agsaSASProtocolTimerConfigurationPage_t )))  )
1177*4e1bc9a0SAchim Leubner       {
1178*4e1bc9a0SAchim Leubner         SA_DBG1(("saSetControllerConfig: AGSA_RC_FAILURE queueNum %d modePage 0x%x length %d\n",queueNum,modePage,length ));
1179*4e1bc9a0SAchim Leubner         ret = AGSA_RC_FAILURE;
1180*4e1bc9a0SAchim Leubner       }
1181*4e1bc9a0SAchim Leubner       else if(modePage == AGSA_ENCRYPTION_GENERAL_CONFIG_PAGE)
1182*4e1bc9a0SAchim Leubner       {
1183*4e1bc9a0SAchim Leubner         SA_DBG1(("saSetControllerConfig: Warning!!!!GENERAL_CONFIG_PAGE cannot be set\n"));
1184*4e1bc9a0SAchim Leubner         ret = AGSA_RC_FAILURE;
1185*4e1bc9a0SAchim Leubner       }
1186*4e1bc9a0SAchim Leubner       else
1187*4e1bc9a0SAchim Leubner       {
1188*4e1bc9a0SAchim Leubner         /* Copy the raw mode page data into something that can be wrapped in an IOMB. */
1189*4e1bc9a0SAchim Leubner         si_memset(&agControllerConfig, 0, sizeof(agsaSetControllerConfigCmd_t));
1190*4e1bc9a0SAchim Leubner 
1191*4e1bc9a0SAchim Leubner         agControllerConfig.tag = 0;  /*HTAG */
1192*4e1bc9a0SAchim Leubner 
1193*4e1bc9a0SAchim Leubner         src = (bit32 *) buffer;
1194*4e1bc9a0SAchim Leubner 
1195*4e1bc9a0SAchim Leubner         for (i = 0; i < (length / 4); i++)
1196*4e1bc9a0SAchim Leubner         {
1197*4e1bc9a0SAchim Leubner           OSSA_WRITE_LE_32(agRoot,
1198*4e1bc9a0SAchim Leubner                            &agControllerConfig,
1199*4e1bc9a0SAchim Leubner                            OSSA_OFFSET_OF(agsaSetControllerConfigCmd_t, pageCode) + (i * 4),
1200*4e1bc9a0SAchim Leubner                            *src);
1201*4e1bc9a0SAchim Leubner 
1202*4e1bc9a0SAchim Leubner           src++;
1203*4e1bc9a0SAchim Leubner         }
1204*4e1bc9a0SAchim Leubner         ret = mpiSetControllerConfigCmd(agRoot, agContext, &agControllerConfig, queueNum,agFALSE);
1205*4e1bc9a0SAchim Leubner         if(ret)
1206*4e1bc9a0SAchim Leubner         {
1207*4e1bc9a0SAchim Leubner           SA_DBG1(("saSetControllerConfig: AGSA_RC_FAILURE (sending) queueNum %d modePage 0x%x length %d\n",queueNum,modePage,length ));
1208*4e1bc9a0SAchim Leubner         }
1209*4e1bc9a0SAchim Leubner 
1210*4e1bc9a0SAchim Leubner       }
1211*4e1bc9a0SAchim Leubner     }
1212*4e1bc9a0SAchim Leubner     else
1213*4e1bc9a0SAchim Leubner     {
1214*4e1bc9a0SAchim Leubner       SA_DBG1(("saSetControllerConfig: spcv only AGSA_RC_FAILURE queueNum %d modePage 0x%x length %d\n",queueNum,modePage,length ));
1215*4e1bc9a0SAchim Leubner       ret = AGSA_RC_FAILURE;
1216*4e1bc9a0SAchim Leubner     }
1217*4e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "34");
1218*4e1bc9a0SAchim Leubner     return ret;
1219*4e1bc9a0SAchim Leubner }
1220*4e1bc9a0SAchim Leubner 
1221*4e1bc9a0SAchim Leubner 
1222*4e1bc9a0SAchim Leubner /**
1223*4e1bc9a0SAchim Leubner  * saGetControllerConfig()
1224*4e1bc9a0SAchim Leubner  *
1225*4e1bc9a0SAchim Leubner  *     Retrieve the contents of a controller mode page
1226*4e1bc9a0SAchim Leubner  *
1227*4e1bc9a0SAchim Leubner  * @param saRoot
1228*4e1bc9a0SAchim Leubner  * @param modePage
1229*4e1bc9a0SAchim Leubner  * @param agContext
1230*4e1bc9a0SAchim Leubner  *
1231*4e1bc9a0SAchim Leubner  * @return
1232*4e1bc9a0SAchim Leubner  */
saGetControllerConfig(agsaRoot_t * agRoot,bit32 queueNum,bit32 modePage,bit32 flag0,bit32 flag1,agsaContext_t * agContext)1233*4e1bc9a0SAchim Leubner GLOBAL bit32 saGetControllerConfig(
1234*4e1bc9a0SAchim Leubner                       agsaRoot_t        *agRoot,
1235*4e1bc9a0SAchim Leubner                       bit32             queueNum,
1236*4e1bc9a0SAchim Leubner                       bit32             modePage,
1237*4e1bc9a0SAchim Leubner                       bit32             flag0,
1238*4e1bc9a0SAchim Leubner                       bit32             flag1,
1239*4e1bc9a0SAchim Leubner                       agsaContext_t     *agContext
1240*4e1bc9a0SAchim Leubner                       )
1241*4e1bc9a0SAchim Leubner {
1242*4e1bc9a0SAchim Leubner     bit32 ret;
1243*4e1bc9a0SAchim Leubner     agsaGetControllerConfigCmd_t agControllerConfig;
1244*4e1bc9a0SAchim Leubner 
1245*4e1bc9a0SAchim Leubner     smTraceFuncEnter(hpDBG_VERY_LOUD,"35");
1246*4e1bc9a0SAchim Leubner 
1247*4e1bc9a0SAchim Leubner     SA_DBG2(("saGetControllerConfig, modePage 0x%x  agContext %p flag0 0x%08x flag1 0x%08x\n",modePage,agContext, flag0, flag1 ));
1248*4e1bc9a0SAchim Leubner     if(smIS_SPCV(agRoot))
1249*4e1bc9a0SAchim Leubner     {
1250*4e1bc9a0SAchim Leubner       si_memset(&agControllerConfig, 0, sizeof(agsaGetControllerConfigCmd_t));
1251*4e1bc9a0SAchim Leubner 
1252*4e1bc9a0SAchim Leubner       agControllerConfig.pageCode = modePage;
1253*4e1bc9a0SAchim Leubner       if(modePage == AGSA_INTERRUPT_CONFIGURATION_PAGE)
1254*4e1bc9a0SAchim Leubner       {
1255*4e1bc9a0SAchim Leubner         agControllerConfig.INT_VEC_MSK0 = flag0;
1256*4e1bc9a0SAchim Leubner         agControllerConfig.INT_VEC_MSK1 = flag1;
1257*4e1bc9a0SAchim Leubner       }
1258*4e1bc9a0SAchim Leubner       ret = mpiGetControllerConfigCmd(agRoot, agContext, &agControllerConfig, queueNum);
1259*4e1bc9a0SAchim Leubner     }
1260*4e1bc9a0SAchim Leubner     else
1261*4e1bc9a0SAchim Leubner     {
1262*4e1bc9a0SAchim Leubner       SA_DBG1(("saGetControllerConfig: spcv only AGSA_RC_FAILURE queueNum %d modePage 0x%x flag0 0x%08x flag1 0x%08x\n",queueNum,modePage, flag0, flag1 ));
1263*4e1bc9a0SAchim Leubner       ret = AGSA_RC_FAILURE;
1264*4e1bc9a0SAchim Leubner     }
1265*4e1bc9a0SAchim Leubner 
1266*4e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "35");
1267*4e1bc9a0SAchim Leubner     return ret;
1268*4e1bc9a0SAchim Leubner }
1269*4e1bc9a0SAchim Leubner 
saEncryptSelftestExecute(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,bit32 type,bit32 length,void * TestDescriptor)1270*4e1bc9a0SAchim Leubner GLOBAL bit32 saEncryptSelftestExecute (
1271*4e1bc9a0SAchim Leubner                         agsaRoot_t    *agRoot,
1272*4e1bc9a0SAchim Leubner                         agsaContext_t *agContext,
1273*4e1bc9a0SAchim Leubner                         bit32          queueNum,
1274*4e1bc9a0SAchim Leubner                         bit32          type,
1275*4e1bc9a0SAchim Leubner                         bit32          length,
1276*4e1bc9a0SAchim Leubner                         void          *TestDescriptor)
1277*4e1bc9a0SAchim Leubner {
1278*4e1bc9a0SAchim Leubner   bit32 ret = AGSA_RC_SUCCESS;
1279*4e1bc9a0SAchim Leubner 
1280*4e1bc9a0SAchim Leubner   agsaEncryptBist_t bist;
1281*4e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"2e");
1282*4e1bc9a0SAchim Leubner   si_memset(&bist, 0, (sizeof(agsaEncryptBist_t)));
1283*4e1bc9a0SAchim Leubner 
1284*4e1bc9a0SAchim Leubner   SA_DBG1(("saEncryptSelftestExecute, enter\n" ));
1285*4e1bc9a0SAchim Leubner   bist.r_subop = (type & 0xFF);
1286*4e1bc9a0SAchim Leubner 
1287*4e1bc9a0SAchim Leubner   si_memcpy(&bist.testDiscption,TestDescriptor,length );
1288*4e1bc9a0SAchim Leubner 
1289*4e1bc9a0SAchim Leubner   /* setup IOMB payload */
1290*4e1bc9a0SAchim Leubner   ret = mpiEncryptBistCmd( agRoot, queueNum, agContext, &bist );
1291*4e1bc9a0SAchim Leubner 
1292*4e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2e");
1293*4e1bc9a0SAchim Leubner 
1294*4e1bc9a0SAchim Leubner   return (ret);
1295*4e1bc9a0SAchim Leubner }
saOperatorManagement(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,bit32 flag,bit8 role,agsaID_t * id,agsaEncryptKekBlob_t * kblob)1296*4e1bc9a0SAchim Leubner GLOBAL bit32 saOperatorManagement(
1297*4e1bc9a0SAchim Leubner                         agsaRoot_t           *agRoot,
1298*4e1bc9a0SAchim Leubner                         agsaContext_t        *agContext,
1299*4e1bc9a0SAchim Leubner                         bit32                 queueNum,
1300*4e1bc9a0SAchim Leubner                         bit32                 flag,
1301*4e1bc9a0SAchim Leubner                         bit8                  role,
1302*4e1bc9a0SAchim Leubner                         agsaID_t             *id,
1303*4e1bc9a0SAchim Leubner                         agsaEncryptKekBlob_t *kblob)
1304*4e1bc9a0SAchim Leubner {
1305*4e1bc9a0SAchim Leubner   bit32 ret = AGSA_RC_SUCCESS;
1306*4e1bc9a0SAchim Leubner   agsaOperatorMangmentCmd_t opmcmd;
1307*4e1bc9a0SAchim Leubner 
1308*4e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"2i");
1309*4e1bc9a0SAchim Leubner 
1310*4e1bc9a0SAchim Leubner   SA_DBG1(("saOperatorManagement, enter\n" ));
1311*4e1bc9a0SAchim Leubner 
1312*4e1bc9a0SAchim Leubner   si_memset(&opmcmd, 0, sizeof(agsaOperatorMangmentCmd_t));
1313*4e1bc9a0SAchim Leubner   /*role = ((flag & SA_OPR_MGMNT_FLAG_MASK) >> SA_OPR_MGMNT_FLAG_SHIFT);*/
1314*4e1bc9a0SAchim Leubner 
1315*4e1bc9a0SAchim Leubner   flag = (flag & ~SA_OPR_MGMNT_FLAG_MASK);
1316*4e1bc9a0SAchim Leubner 
1317*4e1bc9a0SAchim Leubner   opmcmd.OPRIDX_AUTIDX_R_KBF_PKT_OMO = flag;
1318*4e1bc9a0SAchim Leubner 
1319*4e1bc9a0SAchim Leubner   opmcmd.IDString_Role[0] = (bit8)role;
1320*4e1bc9a0SAchim Leubner   SA_DBG1(("saOperatorManagement, role 0x%X flags 0x%08X\n", role, opmcmd.OPRIDX_AUTIDX_R_KBF_PKT_OMO ));
1321*4e1bc9a0SAchim Leubner 
1322*4e1bc9a0SAchim Leubner   si_memcpy(&opmcmd.IDString_Role[1], id->ID, AGSA_ID_SIZE);
1323*4e1bc9a0SAchim Leubner   si_memcpy(&opmcmd.Kblob, kblob, sizeof(agsaEncryptKekBlob_t));
1324*4e1bc9a0SAchim Leubner 
1325*4e1bc9a0SAchim Leubner   /* setup IOMB payload */
1326*4e1bc9a0SAchim Leubner   ret = mpiOperatorManagementCmd(agRoot, queueNum, agContext, &opmcmd);
1327*4e1bc9a0SAchim Leubner 
1328*4e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2i");
1329*4e1bc9a0SAchim Leubner 
1330*4e1bc9a0SAchim Leubner   return (ret);
1331*4e1bc9a0SAchim Leubner }
1332*4e1bc9a0SAchim Leubner 
1333*4e1bc9a0SAchim Leubner /*
1334*4e1bc9a0SAchim Leubner     The command is for an operator to login to/logout from SPCve.
1335*4e1bc9a0SAchim Leubner     Only when all IOs are quiesced, can an operator logout.
1336*4e1bc9a0SAchim Leubner 
1337*4e1bc9a0SAchim Leubner     flag:
1338*4e1bc9a0SAchim Leubner       Access type (ACS) [4 bits]
1339*4e1bc9a0SAchim Leubner         0x1: login
1340*4e1bc9a0SAchim Leubner         0x2: logout
1341*4e1bc9a0SAchim Leubner         Others: reserved
1342*4e1bc9a0SAchim Leubner       KEYopr pinned in the KEK RAM (PIN) [1 bit]
1343*4e1bc9a0SAchim Leubner         0: not pinned, operator ID table will be searched during authentication.
1344*4e1bc9a0SAchim Leubner         1: pinned, OPRIDX is referenced to unwrap the certificate.
1345*4e1bc9a0SAchim Leubner       KEYopr Index in the KEK RAM (OPRIDX) [8 bits]
1346*4e1bc9a0SAchim Leubner         If KEYopr is pinned in the KEK RAM, OPRIDX is to reference to the KEK for authentication
1347*4e1bc9a0SAchim Leubner 
1348*4e1bc9a0SAchim Leubner     cert
1349*4e1bc9a0SAchim Leubner       Operator Certificate (CERT) [40 bytes]
1350*4e1bc9a0SAchim Leubner 
1351*4e1bc9a0SAchim Leubner     response calls ossaSetOperatorCB
1352*4e1bc9a0SAchim Leubner */
1353*4e1bc9a0SAchim Leubner 
1354*4e1bc9a0SAchim Leubner GLOBAL bit32
saSetOperator(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,bit32 flag,void * cert)1355*4e1bc9a0SAchim Leubner saSetOperator(
1356*4e1bc9a0SAchim Leubner   agsaRoot_t     *agRoot,
1357*4e1bc9a0SAchim Leubner   agsaContext_t  *agContext,
1358*4e1bc9a0SAchim Leubner   bit32           queueNum,
1359*4e1bc9a0SAchim Leubner   bit32           flag,
1360*4e1bc9a0SAchim Leubner   void           *cert
1361*4e1bc9a0SAchim Leubner   )
1362*4e1bc9a0SAchim Leubner {
1363*4e1bc9a0SAchim Leubner   bit32 ret = AGSA_RC_SUCCESS;
1364*4e1bc9a0SAchim Leubner   agsaSetOperatorCmd_t  SetOperatorCmd;
1365*4e1bc9a0SAchim Leubner 
1366*4e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"3c");
1367*4e1bc9a0SAchim Leubner   SA_DBG1(("saSetOperator, flag 0x%x cert %p\n",flag, cert));
1368*4e1bc9a0SAchim Leubner 
1369*4e1bc9a0SAchim Leubner   /* initialize set operator IOMB */
1370*4e1bc9a0SAchim Leubner   si_memset(&SetOperatorCmd, 0, sizeof(agsaSetOperatorCmd_t));
1371*4e1bc9a0SAchim Leubner   SetOperatorCmd.OPRIDX_PIN_ACS = flag;
1372*4e1bc9a0SAchim Leubner   si_memcpy((bit8*)SetOperatorCmd.cert, (bit8*)cert, 40);
1373*4e1bc9a0SAchim Leubner 
1374*4e1bc9a0SAchim Leubner   /* setup IOMB payload */
1375*4e1bc9a0SAchim Leubner   ret = mpiSetOperatorCmd(agRoot, queueNum, agContext, &SetOperatorCmd);
1376*4e1bc9a0SAchim Leubner 
1377*4e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3c");
1378*4e1bc9a0SAchim Leubner   return (ret);
1379*4e1bc9a0SAchim Leubner }
1380*4e1bc9a0SAchim Leubner 
1381*4e1bc9a0SAchim Leubner /*
1382*4e1bc9a0SAchim Leubner     The command is to get role and ID of either current or all operators from SPCve.
1383*4e1bc9a0SAchim Leubner     Option
1384*4e1bc9a0SAchim Leubner         0x1: current operator
1385*4e1bc9a0SAchim Leubner         0x2: all operators
1386*4e1bc9a0SAchim Leubner         Others: reserved
1387*4e1bc9a0SAchim Leubner 
1388*4e1bc9a0SAchim Leubner     OprBufAddr
1389*4e1bc9a0SAchim Leubner         the host buffer address to store the role and ID of all operators. Valid only when option == 0x2.
1390*4e1bc9a0SAchim Leubner         Buffer size must be 1KB to store max 32 operators's role and ID.
1391*4e1bc9a0SAchim Leubner     response calls ossaGetOperatorCB
1392*4e1bc9a0SAchim Leubner */
1393*4e1bc9a0SAchim Leubner GLOBAL bit32
saGetOperator(agsaRoot_t * agRoot,agsaContext_t * agContext,bit32 queueNum,bit32 option,bit32 AddrHi,bit32 AddrLo)1394*4e1bc9a0SAchim Leubner saGetOperator(
1395*4e1bc9a0SAchim Leubner   agsaRoot_t     *agRoot,
1396*4e1bc9a0SAchim Leubner   agsaContext_t  *agContext,
1397*4e1bc9a0SAchim Leubner   bit32           queueNum,
1398*4e1bc9a0SAchim Leubner   bit32           option,
1399*4e1bc9a0SAchim Leubner   bit32           AddrHi,
1400*4e1bc9a0SAchim Leubner   bit32           AddrLo
1401*4e1bc9a0SAchim Leubner   )
1402*4e1bc9a0SAchim Leubner {
1403*4e1bc9a0SAchim Leubner   bit32 ret = AGSA_RC_SUCCESS;
1404*4e1bc9a0SAchim Leubner   agsaGetOperatorCmd_t  GetOperatorCmd;
1405*4e1bc9a0SAchim Leubner 
1406*4e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"3d");
1407*4e1bc9a0SAchim Leubner   SA_DBG1(("saGetOperator, option 0x%x 0x%08x_%08x\n",option,AddrHi,AddrLo ));
1408*4e1bc9a0SAchim Leubner 
1409*4e1bc9a0SAchim Leubner   /* initialize get operator IOMB */
1410*4e1bc9a0SAchim Leubner   si_memset(&GetOperatorCmd, 0, sizeof(agsaGetOperatorCmd_t));
1411*4e1bc9a0SAchim Leubner   GetOperatorCmd.option = option;
1412*4e1bc9a0SAchim Leubner   GetOperatorCmd.OprBufAddrLo = AddrLo;
1413*4e1bc9a0SAchim Leubner   GetOperatorCmd.OprBufAddrHi = AddrHi;
1414*4e1bc9a0SAchim Leubner 
1415*4e1bc9a0SAchim Leubner   /* setup IOMB payload */
1416*4e1bc9a0SAchim Leubner   ret = mpiGetOperatorCmd(agRoot, queueNum, agContext, &GetOperatorCmd);
1417*4e1bc9a0SAchim Leubner 
1418*4e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3d");
1419*4e1bc9a0SAchim Leubner 
1420*4e1bc9a0SAchim Leubner   return (ret);
1421*4e1bc9a0SAchim Leubner }
1422*4e1bc9a0SAchim Leubner 
1423