remove linux 2.4 specific build system code
[15.05/openwrt.git] / target / linux / generic-2.6 / files / crypto / ocf / kirkwood / mvHal / mv_hal / pci-if / mvPciIf.c
1 /*******************************************************************************
2 Copyright (C) Marvell International Ltd. and its affiliates
3
4 This software file (the "File") is owned and distributed by Marvell 
5 International Ltd. and/or its affiliates ("Marvell") under the following
6 alternative licensing terms.  Once you have made an election to distribute the
7 File under one of the following license alternatives, please (i) delete this
8 introductory statement regarding license alternatives, (ii) delete the two
9 license alternatives that you have not elected to use and (iii) preserve the
10 Marvell copyright notice above.
11
12 ********************************************************************************
13 Marvell Commercial License Option
14
15 If you received this File from Marvell and you have entered into a commercial
16 license agreement (a "Commercial License") with Marvell, the File is licensed
17 to you under the terms of the applicable Commercial License.
18
19 ********************************************************************************
20 Marvell GPL License Option
21
22 If you received this File from Marvell, you may opt to use, redistribute and/or 
23 modify this File in accordance with the terms and conditions of the General 
24 Public License Version 2, June 1991 (the "GPL License"), a copy of which is 
25 available along with the File in the license.txt file or by writing to the Free 
26 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or 
27 on the worldwide web at http://www.gnu.org/licenses/gpl.txt. 
28
29 THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED 
30 WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY 
31 DISCLAIMED.  The GPL License provides additional details about this warranty 
32 disclaimer.
33 ********************************************************************************
34 Marvell BSD License Option
35
36 If you received this File from Marvell, you may opt to use, redistribute and/or 
37 modify this File under the following licensing terms. 
38 Redistribution and use in source and binary forms, with or without modification, 
39 are permitted provided that the following conditions are met:
40
41     *   Redistributions of source code must retain the above copyright notice,
42             this list of conditions and the following disclaimer. 
43
44     *   Redistributions in binary form must reproduce the above copyright
45         notice, this list of conditions and the following disclaimer in the
46         documentation and/or other materials provided with the distribution. 
47
48     *   Neither the name of Marvell nor the names of its contributors may be 
49         used to endorse or promote products derived from this software without 
50         specific prior written permission. 
51     
52 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
53 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
54 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
55 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
56 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
57 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
58 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
59 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
60 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
61 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62
63 *******************************************************************************/
64
65 #include "mvPciIf.h"
66 #include "ctrlEnv/sys/mvSysPex.h"
67
68 #if defined(MV_INCLUDE_PCI)
69 #include "ctrlEnv/sys/mvSysPci.h"
70 #endif
71
72
73 /* defines  */       
74 #ifdef MV_DEBUG         
75         #define DB(x)   x
76 #else                
77         #define DB(x)    
78 #endif               
79                                          
80
81 /*******************************************************************************
82 * mvPciInit - Initialize PCI interfaces
83 *
84 * DESCRIPTION:
85 *
86 * INPUT:
87 *
88 *
89 * OUTPUT:
90 *       None.
91 *
92 * RETURN:
93 *       MV_OK if function success otherwise MV_ERROR or MV_BAD_PARAM
94 *
95 *******************************************************************************/
96
97
98 MV_STATUS mvPciIfInit(MV_U32 pciIf, PCI_IF_MODE pciIfmode)
99 {
100         PCI_IF_TYPE pciIfType = mvPciIfTypeGet(pciIf);
101
102         if (PCI_IF_TYPE_CONVEN_PCIX == pciIfType)
103         {
104                 #if defined(MV_INCLUDE_PCI)
105                 
106         MV_PCI_MOD pciMod;
107                 
108         if (PCI_IF_MODE_HOST == pciIfmode)
109         {
110             pciMod = MV_PCI_MOD_HOST;
111         }
112         else if (PCI_IF_MODE_DEVICE == pciIfmode)
113         {
114             pciMod = MV_PCI_MOD_DEVICE;
115         }
116         else
117         {
118             mvOsPrintf("%s: ERROR!!! Bus %d mode %d neither host nor device!\n", 
119                         __FUNCTION__, pciIf, pciIfmode);
120             return MV_FAIL;
121         }
122         
123         return mvPciInit(pciIf - MV_PCI_START_IF, pciMod);
124                 #else
125                 return MV_OK;
126                 #endif
127         }
128         else if (PCI_IF_TYPE_PEX == pciIfType)
129         {
130                 #if defined(MV_INCLUDE_PEX)
131                 
132         MV_PEX_TYPE pexType;
133                 
134         if (PCI_IF_MODE_HOST == pciIfmode)
135         {
136             pexType = MV_PEX_ROOT_COMPLEX;
137         }
138         else if (PCI_IF_MODE_DEVICE == pciIfmode)
139         {
140             pexType = MV_PEX_END_POINT;
141         }
142         else
143         {
144             mvOsPrintf("%s: ERROR!!! Bus %d type %d neither root complex nor" \
145                        " end point\n", __FUNCTION__, pciIf, pciIfmode);
146             return MV_FAIL;
147         }
148                 return mvPexInit(pciIf - MV_PEX_START_IF, pexType);
149
150                 #else
151                 return MV_OK;
152                 #endif
153
154         }
155         else
156         {
157                 mvOsPrintf("%s: ERROR!!! Invalid pciIf %d\n", __FUNCTION__, pciIf);
158         }
159
160         return MV_FAIL;
161
162 }
163
164 /* PCI configuration space read write */
165
166 /*******************************************************************************
167 * mvPciConfigRead - Read from configuration space
168 *
169 * DESCRIPTION:
170 *       This function performs a 32 bit read from PCI configuration space.
171 *       It supports both type 0 and type 1 of Configuration Transactions 
172 *       (local and over bridge). In order to read from local bus segment, use 
173 *       bus number retrieved from mvPciLocalBusNumGet(). Other bus numbers 
174 *       will result configuration transaction of type 1 (over bridge).
175 *
176 * INPUT:
177 *       pciIf   - PCI interface number.
178 *       bus     - PCI segment bus number.
179 *       dev     - PCI device number.
180 *       func    - Function number.
181 *       regOffs - Register offset.       
182 *
183 * OUTPUT:
184 *       None.
185 *
186 * RETURN:
187 *       32bit register data, 0xffffffff on error
188 *
189 *******************************************************************************/
190 MV_U32 mvPciIfConfigRead (MV_U32 pciIf, MV_U32 bus, MV_U32 dev, MV_U32 func, 
191                         MV_U32 regOff)
192 {
193         PCI_IF_TYPE pciIfType = mvPciIfTypeGet(pciIf);
194
195         if (PCI_IF_TYPE_CONVEN_PCIX == pciIfType)
196         {
197                 #if defined(MV_INCLUDE_PCI)
198                 return mvPciConfigRead(pciIf - MV_PCI_START_IF,
199                                                                 bus,
200                                                                 dev, 
201                                 func,
202                                                                 regOff);
203                 #else
204                 return 0xffffffff;
205                 #endif
206         }
207         else if (PCI_IF_TYPE_PEX == pciIfType)
208         {
209                 #if defined(MV_INCLUDE_PEX)
210                 return mvPexConfigRead(pciIf - MV_PEX_START_IF,
211                                                                 bus,
212                                                                 dev, 
213                                 func,
214                                                                 regOff);
215                 #else
216                 return 0xffffffff;
217                 #endif
218
219         }
220         else
221         {
222                 mvOsPrintf("%s: ERROR!!! Invalid pciIf %d\n", __FUNCTION__, pciIf);
223         }
224
225         return 0;
226
227 }
228
229 /*******************************************************************************
230 * mvPciConfigWrite - Write to configuration space
231 *
232 * DESCRIPTION:
233 *       This function performs a 32 bit write to PCI configuration space.
234 *       It supports both type 0 and type 1 of Configuration Transactions 
235 *       (local and over bridge). In order to write to local bus segment, use 
236 *       bus number retrieved from mvPciLocalBusNumGet(). Other bus numbers 
237 *       will result configuration transaction of type 1 (over bridge).
238 *
239 * INPUT:
240 *       pciIf   - PCI interface number.
241 *       bus     - PCI segment bus number.
242 *       dev     - PCI device number.
243 *       func    - Function number.
244 *       regOffs - Register offset.       
245 *       data    - 32bit data.
246 *
247 * OUTPUT:
248 *       None.
249 *
250 * RETURN:
251 *       MV_BAD_PARAM for bad parameters ,MV_ERROR on error ! otherwise MV_OK
252 *
253 *******************************************************************************/
254 MV_STATUS mvPciIfConfigWrite(MV_U32 pciIf, MV_U32 bus, MV_U32 dev, 
255                            MV_U32 func, MV_U32 regOff, MV_U32 data)
256 {
257         PCI_IF_TYPE pciIfType = mvPciIfTypeGet(pciIf);
258
259         if (PCI_IF_TYPE_CONVEN_PCIX == pciIfType)
260         {
261                 #if defined(MV_INCLUDE_PCI)
262                 return mvPciConfigWrite(pciIf - MV_PCI_START_IF,
263                                                                 bus,
264                                                                 dev, 
265                                 func,
266                                                                 regOff,
267                                                                 data);
268                 #else
269                 return MV_OK;
270                 #endif
271         }
272         else if (PCI_IF_TYPE_PEX == pciIfType)
273         {
274                 #if defined(MV_INCLUDE_PEX)
275                 return mvPexConfigWrite(pciIf - MV_PEX_START_IF,
276                                                                 bus,
277                                                                 dev, 
278                                 func,
279                                                                 regOff,
280                                                                 data);
281                 #else
282                 return MV_OK;
283                 #endif
284
285         }
286         else
287         {
288                 mvOsPrintf("%s: ERROR!!! Invalid pciIf %d\n", __FUNCTION__, pciIf);
289         }
290
291         return MV_FAIL;
292
293 }
294
295 /*******************************************************************************
296 * mvPciMasterEnable - Enable/disale PCI interface master transactions.
297 *
298 * DESCRIPTION:
299 *       This function performs read modified write to PCI command status 
300 *       (offset 0x4) to set/reset bit 2. After this bit is set, the PCI 
301 *       master is allowed to gain ownership on the bus, otherwise it is 
302 *       incapable to do so.
303 *
304 * INPUT:
305 *       pciIf  - PCI interface number.
306 *       enable - Enable/disable parameter.
307 *
308 * OUTPUT:
309 *       None.
310 *
311 * RETURN:
312 *       MV_BAD_PARAM for bad parameters ,MV_ERROR on error ! otherwise MV_OK
313 *
314 *******************************************************************************/
315 MV_STATUS mvPciIfMasterEnable(MV_U32 pciIf, MV_BOOL enable)
316 {
317
318         PCI_IF_TYPE pciIfType = mvPciIfTypeGet(pciIf);
319
320         if (PCI_IF_TYPE_CONVEN_PCIX == pciIfType)
321         {
322                 #if defined(MV_INCLUDE_PCI)
323                 return mvPciMasterEnable(pciIf - MV_PCI_START_IF,
324                                                                 enable);
325                 #else
326                 return MV_OK;
327                 #endif
328         }
329         else if (PCI_IF_TYPE_PEX == pciIfType)
330         {
331                 #if defined(MV_INCLUDE_PEX)
332                 return mvPexMasterEnable(pciIf - MV_PEX_START_IF,
333                                                                 enable);
334                 #else
335                 return MV_OK;
336                 #endif
337         }
338         else
339         {
340                 mvOsPrintf("%s: ERROR!!! Invalid pciIf %d\n", __FUNCTION__, pciIf);
341         }
342
343         return MV_FAIL;
344
345 }
346
347
348 /*******************************************************************************
349 * mvPciSlaveEnable - Enable/disale PCI interface slave transactions.
350 *
351 * DESCRIPTION:
352 *       This function performs read modified write to PCI command status 
353 *       (offset 0x4) to set/reset bit 0 and 1. After those bits are set, 
354 *       the PCI slave is allowed to respond to PCI IO space access (bit 0) 
355 *       and PCI memory space access (bit 1). 
356 *
357 * INPUT:
358 *       pciIf  - PCI interface number.
359 *       dev     - PCI device number.
360 *       enable - Enable/disable parameter.
361 *
362 * OUTPUT:
363 *       None.
364 *
365 * RETURN:
366 *       MV_BAD_PARAM for bad parameters ,MV_ERROR on error ! otherwise MV_OK
367 *
368 *******************************************************************************/
369 MV_STATUS mvPciIfSlaveEnable(MV_U32 pciIf,MV_U32 bus, MV_U32 dev, MV_BOOL enable)
370 {
371
372         PCI_IF_TYPE pciIfType = mvPciIfTypeGet(pciIf);
373
374         if (PCI_IF_TYPE_CONVEN_PCIX == pciIfType)
375         {
376                 #if defined(MV_INCLUDE_PCI)
377                 return mvPciSlaveEnable(pciIf - MV_PCI_START_IF,bus,dev,
378                                                                 enable);
379                 #else
380                 return MV_OK;
381                 #endif
382         }
383         else if (PCI_IF_TYPE_PEX == pciIfType)
384         {
385                 #if defined(MV_INCLUDE_PEX)
386                 return mvPexSlaveEnable(pciIf - MV_PEX_START_IF,bus,dev,
387                                                                 enable);
388                 #else
389                 return MV_OK;
390                 #endif
391         }
392         else
393         {
394                 mvOsPrintf("%s: ERROR!!! Invalid pciIf %d\n", __FUNCTION__, pciIf);
395         }
396
397         return MV_FAIL;
398
399 }
400
401 /*******************************************************************************
402 * mvPciLocalBusNumSet - Set PCI interface local bus number.
403 *
404 * DESCRIPTION:
405 *       This function sets given PCI interface its local bus number.
406 *       Note: In case the PCI interface is PCI-X, the information is read-only.
407 *
408 * INPUT:
409 *       pciIf  - PCI interface number.
410 *       busNum - Bus number.
411 *
412 * OUTPUT:
413 *       None.
414 *
415 * RETURN:
416 *       MV_NOT_ALLOWED in case PCI interface is PCI-X. 
417 *               MV_BAD_PARAM on bad parameters ,
418 *       otherwise MV_OK
419 *
420 *******************************************************************************/
421 MV_STATUS mvPciIfLocalBusNumSet(MV_U32 pciIf, MV_U32 busNum)
422 {
423         PCI_IF_TYPE pciIfType = mvPciIfTypeGet(pciIf);
424
425         if (PCI_IF_TYPE_CONVEN_PCIX == pciIfType)
426         {
427                 #if defined(MV_INCLUDE_PCI)
428                 return mvPciLocalBusNumSet(pciIf - MV_PCI_START_IF,
429                                                                 busNum);        
430                 #else
431                 return MV_OK;
432                 #endif
433     }
434     else if (PCI_IF_TYPE_PEX == pciIfType)
435         {
436                 #if defined(MV_INCLUDE_PEX)
437                 return mvPexLocalBusNumSet(pciIf - MV_PEX_START_IF,
438                                                                 busNum);
439                 #else
440                 return MV_OK;
441                 #endif
442         }
443         else
444         {
445                 mvOsPrintf("%s: ERROR!!! Invalid pciIf %d\n", __FUNCTION__, pciIf);
446         }
447
448         return MV_FAIL;
449
450 }
451
452 /*******************************************************************************
453 * mvPciLocalBusNumGet - Get PCI interface local bus number.
454 *
455 * DESCRIPTION:
456 *       This function gets the local bus number of a given PCI interface.
457 *
458 * INPUT:
459 *       pciIf  - PCI interface number.
460 *
461 * OUTPUT:
462 *       None.
463 *
464 * RETURN:
465 *       Local bus number.0xffffffff on Error
466 *
467 *******************************************************************************/
468 MV_U32 mvPciIfLocalBusNumGet(MV_U32 pciIf)
469 {
470         PCI_IF_TYPE pciIfType = mvPciIfTypeGet(pciIf);
471
472         if (PCI_IF_TYPE_CONVEN_PCIX == pciIfType)
473         {
474                 #if defined(MV_INCLUDE_PCI)
475                 return mvPciLocalBusNumGet(pciIf - MV_PCI_START_IF);
476                 #else
477                 return 0xFFFFFFFF;
478                 #endif
479         }
480         else if (PCI_IF_TYPE_PEX == pciIfType)
481         {
482                 #if defined(MV_INCLUDE_PEX)
483                 return mvPexLocalBusNumGet(pciIf - MV_PEX_START_IF);
484                 #else
485                 return 0xFFFFFFFF;
486                 #endif
487
488         }
489         else
490         {
491                 mvOsPrintf("%s: ERROR!!! Invalid pciIf %d\n",__FUNCTION__, pciIf);
492         }
493
494         return 0;
495
496 }
497
498
499 /*******************************************************************************
500 * mvPciLocalDevNumSet - Set PCI interface local device number.
501 *
502 * DESCRIPTION:
503 *       This function sets given PCI interface its local device number.
504 *       Note: In case the PCI interface is PCI-X, the information is read-only.
505 *
506 * INPUT:
507 *       pciIf  - PCI interface number.
508 *       devNum - Device number.
509 *
510 * OUTPUT:
511 *       None.
512 *
513 * RETURN:
514 *       MV_NOT_ALLOWED in case PCI interface is PCI-X. MV_BAD_PARAM on bad parameters ,
515 *       otherwise MV_OK
516 *
517 *******************************************************************************/
518 MV_STATUS mvPciIfLocalDevNumSet(MV_U32 pciIf, MV_U32 devNum)
519 {
520         PCI_IF_TYPE pciIfType = mvPciIfTypeGet(pciIf);
521
522         if (PCI_IF_TYPE_CONVEN_PCIX == pciIfType)
523         {
524                 #if defined(MV_INCLUDE_PCI)
525                 return mvPciLocalDevNumSet(pciIf - MV_PCI_START_IF,
526                                                                 devNum);        
527                 #else
528                 return MV_OK;
529                 #endif
530         }
531         else if (PCI_IF_TYPE_PEX == pciIfType)
532         {
533                 #if defined(MV_INCLUDE_PEX)
534                 return mvPexLocalDevNumSet(pciIf - MV_PEX_START_IF,
535                                                                 devNum);
536                 #else
537                 return MV_OK;
538                 #endif
539         }
540         else
541         {
542                 mvOsPrintf("%s: ERROR!!! Invalid pciIf %d\n", __FUNCTION__, pciIf);
543         }
544
545         return MV_FAIL;
546
547 }
548
549 /*******************************************************************************
550 * mvPciLocalDevNumGet - Get PCI interface local device number.
551 *
552 * DESCRIPTION:
553 *       This function gets the local device number of a given PCI interface.
554 *
555 * INPUT:
556 *       pciIf  - PCI interface number.
557 *
558 * OUTPUT:
559 *       None.
560 *
561 * RETURN:
562 *       Local device number. 0xffffffff on Error
563 *
564 *******************************************************************************/
565 MV_U32 mvPciIfLocalDevNumGet(MV_U32 pciIf)
566 {
567         PCI_IF_TYPE pciIfType = mvPciIfTypeGet(pciIf);
568
569         if (PCI_IF_TYPE_CONVEN_PCIX == pciIfType)
570         {
571                 #if defined(MV_INCLUDE_PCI)
572                 return mvPciLocalDevNumGet(pciIf - MV_PCI_START_IF);
573                 #else
574                 return 0xFFFFFFFF;
575                 #endif
576         }
577         else if (PCI_IF_TYPE_PEX == pciIfType)
578         {
579                 #if defined(MV_INCLUDE_PEX)
580                 return mvPexLocalDevNumGet(pciIf - MV_PEX_START_IF);
581                 #else
582                 return 0xFFFFFFFF;
583                 #endif
584
585         }
586         else
587         {
588                 mvOsPrintf("%s: ERROR!!! Invalid pciIf %d\n", __FUNCTION__, pciIf);
589         }
590
591         return 0;
592
593 }
594
595 /*******************************************************************************
596 * mvPciIfTypeGet - 
597 *
598 * DESCRIPTION:
599 *
600 * INPUT:
601 *
602 * OUTPUT:
603 *       None.
604 *
605 * RETURN:
606 *
607 *******************************************************************************/
608
609 PCI_IF_TYPE mvPciIfTypeGet(MV_U32 pciIf)
610 {
611
612         if ((pciIf >= MV_PCI_START_IF)&&(pciIf < MV_PCI_MAX_IF + MV_PCI_START_IF))
613         {
614                 return PCI_IF_TYPE_CONVEN_PCIX;
615         }
616         else if ((pciIf >= MV_PEX_START_IF) &&
617                          (pciIf < MV_PEX_MAX_IF + MV_PEX_START_IF))
618         {
619                 return PCI_IF_TYPE_PEX;
620
621         }
622         else
623         {
624                 mvOsPrintf("%s: ERROR!!! Invalid pciIf %d\n", __FUNCTION__, pciIf);
625         }
626
627         return 0xffffffff;
628
629 }
630
631 /*******************************************************************************
632 * mvPciIfTypeGet - 
633 *
634 * DESCRIPTION:
635 *
636 * INPUT:
637 *
638 * OUTPUT:
639 *       None.
640 *
641 * RETURN:
642 *
643 *******************************************************************************/
644
645 MV_U32  mvPciRealIfNumGet(MV_U32 pciIf)
646 {
647
648         PCI_IF_TYPE pciIfType = mvPciIfTypeGet(pciIf);
649
650         if (PCI_IF_TYPE_CONVEN_PCIX == pciIfType)
651         {
652                 return (pciIf - MV_PCI_START_IF);
653         }
654         else if (PCI_IF_TYPE_PEX == pciIfType)
655         {
656                 return (pciIf - MV_PEX_START_IF);
657
658         }
659         else
660         {
661                 mvOsPrintf("%s: ERROR!!! Invalid pciIf %d\n", __FUNCTION__, pciIf);
662         }
663
664         return 0xffffffff;
665
666 }
667
668
669