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