rename target/linux/generic-2.6 to generic
[openwrt/staging/wigyori.git] / target / linux / generic / files / crypto / ocf / kirkwood / mvHal / kw_family / ctrlEnv / mvCtrlEnvLib.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
66 /* includes */
67 #include "mvCommon.h"
68 #include "mvCtrlEnvLib.h"
69 #include "ctrlEnv/sys/mvCpuIf.h"
70
71 #if defined(MV_INCLUDE_PEX)
72 #include "pex/mvPex.h"
73 #include "ctrlEnv/sys/mvSysPex.h"
74 #endif
75
76 #if defined(MV_INCLUDE_GIG_ETH)
77 #include "ctrlEnv/sys/mvSysGbe.h"
78 #endif
79
80 #if defined(MV_INCLUDE_XOR)
81 #include "ctrlEnv/sys/mvSysXor.h"
82 #endif
83
84 #if defined(MV_INCLUDE_SATA)
85 #include "ctrlEnv/sys/mvSysSata.h"
86 #endif
87
88 #if defined(MV_INCLUDE_USB)
89 #include "ctrlEnv/sys/mvSysUsb.h"
90 #endif
91
92 #if defined(MV_INCLUDE_AUDIO)
93 #include "ctrlEnv/sys/mvSysAudio.h"
94 #endif
95
96 #if defined(MV_INCLUDE_CESA)
97 #include "ctrlEnv/sys/mvSysCesa.h"
98 #endif
99
100 #if defined(MV_INCLUDE_TS)
101 #include "ctrlEnv/sys/mvSysTs.h"
102 #endif
103
104 /* defines */
105 #ifdef MV_DEBUG
106 #define DB(x) x
107 #else
108 #define DB(x)
109 #endif
110
111 /*******************************************************************************
112 * mvCtrlEnvInit - Initialize Marvell controller environment.
113 *
114 * DESCRIPTION:
115 * This function get environment information and initialize controller
116 * internal/external environment. For example
117 * 1) MPP settings according to board MPP macros.
118 * NOTE: It is the user responsibility to shut down all DMA channels
119 * in device and disable controller sub units interrupts during
120 * boot process.
121 *
122 * INPUT:
123 * None.
124 *
125 * OUTPUT:
126 * None.
127 *
128 * RETURN:
129 * None.
130 *
131 *******************************************************************************/
132 MV_STATUS mvCtrlEnvInit(MV_VOID)
133 {
134 MV_U32 mppGroup;
135 MV_U32 devId;
136 MV_U32 boardId;
137 MV_U32 i;
138 MV_U32 maxMppGrp = 1;
139 MV_U32 mppVal = 0;
140 MV_U32 bootVal = 0;
141 MV_U32 mppGroupType = 0;
142 MV_U32 mppGroup1[][3] = MPP_GROUP_1_TYPE;
143 MV_U32 mppGroup2[][3] = MPP_GROUP_2_TYPE;
144
145 devId = mvCtrlModelGet();
146 boardId= mvBoardIdGet();
147
148 switch(devId){
149 case MV_6281_DEV_ID:
150 maxMppGrp = MV_6281_MPP_MAX_GROUP;
151 break;
152 case MV_6192_DEV_ID:
153 maxMppGrp = MV_6192_MPP_MAX_GROUP;
154 break;
155 case MV_6190_DEV_ID:
156 maxMppGrp = MV_6190_MPP_MAX_GROUP;
157 break;
158 case MV_6180_DEV_ID:
159 maxMppGrp = MV_6180_MPP_MAX_GROUP;
160 break;
161 }
162
163 /* MPP Init */
164 /* We split mpp init to 3 phases:
165 * 1. We init mpp[19:0] from the board info. mpp[23:20] will be over write
166 * in phase 2.
167 * 2. We detect the mpp group type and according the mpp values [35:20].
168 * 3. We detect the mpp group type and according the mpp values [49:36].
169 */
170 /* Mpp phase 1 mpp[19:0] */
171 /* Read MPP group from board level and assign to MPP register */
172 for (mppGroup = 0; mppGroup < 3; mppGroup++)
173 {
174 mppVal = mvBoardMppGet(mppGroup);
175 if (mppGroup == 0)
176 {
177 bootVal = MV_REG_READ(mvCtrlMppRegGet(mppGroup));
178 if (mvCtrlIsBootFromSPI())
179 {
180 mppVal &= ~0xffff;
181 bootVal &= 0xffff;
182 mppVal |= bootVal;
183 }
184 else if (mvCtrlIsBootFromSPIUseNAND())
185 {
186 mppVal &= ~0xf0000000;
187 bootVal &= 0xf0000000;
188 mppVal |= bootVal;
189 }
190 else if (mvCtrlIsBootFromNAND())
191 {
192 mppVal &= ~0xffffff;
193 bootVal &= 0xffffff;
194 mppVal |= bootVal;
195 }
196 }
197
198 if (mppGroup == 2)
199 {
200 bootVal = MV_REG_READ(mvCtrlMppRegGet(mppGroup));
201 if (mvCtrlIsBootFromNAND())
202 {
203 mppVal &= ~0xff00;
204 bootVal &= 0xff00;
205 mppVal |= bootVal;
206 }
207 }
208
209 MV_REG_WRITE(mvCtrlMppRegGet(mppGroup), mppVal);
210 }
211
212 /* Identify MPPs group */
213 mvBoardMppGroupIdUpdate();
214
215 /* Update MPPs mux relevent only on Marvell DB */
216 if ((boardId == DB_88F6281A_BP_ID) ||
217 (boardId == DB_88F6180A_BP_ID))
218 mvBoardMppMuxSet();
219
220 mppGroupType = mvBoardMppGroupTypeGet(MV_BOARD_MPP_GROUP_1);
221
222 /* Mpp phase 2 */
223 /* Read MPP group from board level and assign to MPP register */
224 if (devId != MV_6180_DEV_ID)
225 {
226 i = 0;
227 for (mppGroup = 2; mppGroup < 5; mppGroup++)
228 {
229 if ((mppGroupType == MV_BOARD_OTHER) ||
230 (boardId == RD_88F6281A_ID) ||
231 (boardId == RD_88F6192A_ID) ||
232 (boardId == RD_88F6190A_ID) ||
233 (boardId == RD_88F6281A_PCAC_ID) ||
234 (boardId == SHEEVA_PLUG_ID))
235 mppVal = mvBoardMppGet(mppGroup);
236 else
237 {
238 mppVal = mppGroup1[mppGroupType][i];
239 i++;
240 }
241
242 /* Group 2 is shared mpp[23:16] */
243 if (mppGroup == 2)
244 {
245 bootVal = MV_REG_READ(mvCtrlMppRegGet(mppGroup));
246 mppVal &= ~0xffff;
247 bootVal &= 0xffff;
248 mppVal |= bootVal;
249 }
250
251 MV_REG_WRITE(mvCtrlMppRegGet(mppGroup), mppVal);
252 }
253 }
254
255 if ((devId == MV_6192_DEV_ID) || (devId == MV_6190_DEV_ID))
256 return MV_OK;
257
258 /* Mpp phase 3 */
259 mppGroupType = mvBoardMppGroupTypeGet(MV_BOARD_MPP_GROUP_2);
260 /* Read MPP group from board level and assign to MPP register */
261 i = 0;
262 for (mppGroup = 4; mppGroup < 7; mppGroup++)
263 {
264 if ((mppGroupType == MV_BOARD_OTHER) ||
265 (boardId == RD_88F6281A_ID) ||
266 (boardId == RD_88F6281A_PCAC_ID) ||
267 (boardId == SHEEVA_PLUG_ID))
268 mppVal = mvBoardMppGet(mppGroup);
269 else
270 {
271 mppVal = mppGroup2[mppGroupType][i];
272 i++;
273 }
274
275 /* Group 4 is shared mpp[35:32] */
276 if (mppGroup == 4)
277 {
278 bootVal = MV_REG_READ(mvCtrlMppRegGet(mppGroup));
279 mppVal &= ~0xffff;
280 bootVal &= 0xffff;
281 mppVal |= bootVal;
282 }
283
284 MV_REG_WRITE(mvCtrlMppRegGet(mppGroup), mppVal);
285 }
286 /* Update SSCG configuration register*/
287 if(mvBoardIdGet() == DB_88F6281A_BP_ID || mvBoardIdGet() == DB_88F6192A_BP_ID ||
288 mvBoardIdGet() == DB_88F6190A_BP_ID || mvBoardIdGet() == DB_88F6180A_BP_ID)
289 MV_REG_WRITE(0x100d8, 0x53);
290
291 return MV_OK;
292 }
293
294 /*******************************************************************************
295 * mvCtrlMppRegGet - return reg address of mpp group
296 *
297 * DESCRIPTION:
298 *
299 * INPUT:
300 * mppGroup - MPP group.
301 *
302 * OUTPUT:
303 * None.
304 *
305 * RETURN:
306 * MV_U32 - Register address.
307 *
308 *******************************************************************************/
309 MV_U32 mvCtrlMppRegGet(MV_U32 mppGroup)
310 {
311 MV_U32 ret;
312
313 switch(mppGroup){
314 case (0): ret = MPP_CONTROL_REG0;
315 break;
316 case (1): ret = MPP_CONTROL_REG1;
317 break;
318 case (2): ret = MPP_CONTROL_REG2;
319 break;
320 case (3): ret = MPP_CONTROL_REG3;
321 break;
322 case (4): ret = MPP_CONTROL_REG4;
323 break;
324 case (5): ret = MPP_CONTROL_REG5;
325 break;
326 case (6): ret = MPP_CONTROL_REG6;
327 break;
328 default: ret = MPP_CONTROL_REG0;
329 break;
330 }
331 return ret;
332 }
333 #if defined(MV_INCLUDE_PEX)
334 /*******************************************************************************
335 * mvCtrlPexMaxIfGet - Get Marvell controller number of PEX interfaces.
336 *
337 * DESCRIPTION:
338 * This function returns Marvell controller number of PEX interfaces.
339 *
340 * INPUT:
341 * None.
342 *
343 * OUTPUT:
344 * None.
345 *
346 * RETURN:
347 * Marvell controller number of PEX interfaces. If controller
348 * ID is undefined the function returns '0'.
349 *
350 *******************************************************************************/
351 MV_U32 mvCtrlPexMaxIfGet(MV_VOID)
352 {
353
354 return MV_PEX_MAX_IF;
355 }
356 #endif
357
358 #if defined(MV_INCLUDE_GIG_ETH)
359 /*******************************************************************************
360 * mvCtrlEthMaxPortGet - Get Marvell controller number of etherent ports.
361 *
362 * DESCRIPTION:
363 * This function returns Marvell controller number of etherent port.
364 *
365 * INPUT:
366 * None.
367 *
368 * OUTPUT:
369 * None.
370 *
371 * RETURN:
372 * Marvell controller number of etherent port.
373 *
374 *******************************************************************************/
375 MV_U32 mvCtrlEthMaxPortGet(MV_VOID)
376 {
377 MV_U32 devId;
378
379 devId = mvCtrlModelGet();
380
381 switch(devId){
382 case MV_6281_DEV_ID:
383 return MV_6281_ETH_MAX_PORTS;
384 break;
385 case MV_6192_DEV_ID:
386 return MV_6192_ETH_MAX_PORTS;
387 break;
388 case MV_6190_DEV_ID:
389 return MV_6190_ETH_MAX_PORTS;
390 break;
391 case MV_6180_DEV_ID:
392 return MV_6180_ETH_MAX_PORTS;
393 break;
394 }
395 return 0;
396
397 }
398 #endif
399
400 #if defined(MV_INCLUDE_XOR)
401 /*******************************************************************************
402 * mvCtrlXorMaxChanGet - Get Marvell controller number of XOR channels.
403 *
404 * DESCRIPTION:
405 * This function returns Marvell controller number of XOR channels.
406 *
407 * INPUT:
408 * None.
409 *
410 * OUTPUT:
411 * None.
412 *
413 * RETURN:
414 * Marvell controller number of XOR channels.
415 *
416 *******************************************************************************/
417 MV_U32 mvCtrlXorMaxChanGet(MV_VOID)
418 {
419 return MV_XOR_MAX_CHAN;
420 }
421 #endif
422
423 #if defined(MV_INCLUDE_USB)
424 /*******************************************************************************
425 * mvCtrlUsbHostMaxGet - Get number of Marvell Usb controllers
426 *
427 * DESCRIPTION:
428 *
429 * INPUT:
430 * None.
431 *
432 * OUTPUT:
433 * None.
434 *
435 * RETURN:
436 * returns number of Marvell USB controllers.
437 *
438 *******************************************************************************/
439 MV_U32 mvCtrlUsbMaxGet(void)
440 {
441 return MV_USB_MAX_PORTS;
442 }
443 #endif
444
445
446 #if defined(MV_INCLUDE_NAND)
447 /*******************************************************************************
448 * mvCtrlNandSupport - Return if this controller has integrated NAND flash support
449 *
450 * DESCRIPTION:
451 *
452 * INPUT:
453 * None.
454 *
455 * OUTPUT:
456 * None.
457 *
458 * RETURN:
459 * MV_TRUE if NAND is supported and MV_FALSE otherwise
460 *
461 *******************************************************************************/
462 MV_U32 mvCtrlNandSupport(MV_VOID)
463 {
464 MV_U32 devId;
465
466 devId = mvCtrlModelGet();
467
468 switch(devId){
469 case MV_6281_DEV_ID:
470 return MV_6281_NAND;
471 break;
472 case MV_6192_DEV_ID:
473 return MV_6192_NAND;
474 break;
475 case MV_6190_DEV_ID:
476 return MV_6190_NAND;
477 break;
478 case MV_6180_DEV_ID:
479 return MV_6180_NAND;
480 break;
481 }
482 return 0;
483
484 }
485 #endif
486
487 #if defined(MV_INCLUDE_SDIO)
488 /*******************************************************************************
489 * mvCtrlSdioSupport - Return if this controller has integrated SDIO flash support
490 *
491 * DESCRIPTION:
492 *
493 * INPUT:
494 * None.
495 *
496 * OUTPUT:
497 * None.
498 *
499 * RETURN:
500 * MV_TRUE if SDIO is supported and MV_FALSE otherwise
501 *
502 *******************************************************************************/
503 MV_U32 mvCtrlSdioSupport(MV_VOID)
504 {
505 MV_U32 devId;
506
507 devId = mvCtrlModelGet();
508
509 switch(devId){
510 case MV_6281_DEV_ID:
511 return MV_6281_SDIO;
512 break;
513 case MV_6192_DEV_ID:
514 return MV_6192_SDIO;
515 break;
516 case MV_6190_DEV_ID:
517 return MV_6190_SDIO;
518 break;
519 case MV_6180_DEV_ID:
520 return MV_6180_SDIO;
521 break;
522 }
523 return 0;
524
525 }
526 #endif
527
528 #if defined(MV_INCLUDE_TS)
529 /*******************************************************************************
530 * mvCtrlTsSupport - Return if this controller has integrated TS flash support
531 *
532 * DESCRIPTION:
533 *
534 * INPUT:
535 * None.
536 *
537 * OUTPUT:
538 * None.
539 *
540 * RETURN:
541 * MV_TRUE if TS is supported and MV_FALSE otherwise
542 *
543 *******************************************************************************/
544 MV_U32 mvCtrlTsSupport(MV_VOID)
545 {
546 MV_U32 devId;
547
548 devId = mvCtrlModelGet();
549
550 switch(devId){
551 case MV_6281_DEV_ID:
552 return MV_6281_TS;
553 break;
554 case MV_6192_DEV_ID:
555 return MV_6192_TS;
556 break;
557 case MV_6190_DEV_ID:
558 return MV_6190_TS;
559 break;
560 case MV_6180_DEV_ID:
561 return MV_6180_TS;
562 break;
563 }
564 return 0;
565 }
566 #endif
567
568 #if defined(MV_INCLUDE_AUDIO)
569 /*******************************************************************************
570 * mvCtrlAudioSupport - Return if this controller has integrated AUDIO flash support
571 *
572 * DESCRIPTION:
573 *
574 * INPUT:
575 * None.
576 *
577 * OUTPUT:
578 * None.
579 *
580 * RETURN:
581 * MV_TRUE if AUDIO is supported and MV_FALSE otherwise
582 *
583 *******************************************************************************/
584 MV_U32 mvCtrlAudioSupport(MV_VOID)
585 {
586 MV_U32 devId;
587
588 devId = mvCtrlModelGet();
589
590 switch(devId){
591 case MV_6281_DEV_ID:
592 return MV_6281_AUDIO;
593 break;
594 case MV_6192_DEV_ID:
595 return MV_6192_AUDIO;
596 break;
597 case MV_6190_DEV_ID:
598 return MV_6190_AUDIO;
599 break;
600 case MV_6180_DEV_ID:
601 return MV_6180_AUDIO;
602 break;
603 }
604 return 0;
605
606 }
607 #endif
608
609 #if defined(MV_INCLUDE_TDM)
610 /*******************************************************************************
611 * mvCtrlTdmSupport - Return if this controller has integrated TDM flash support
612 *
613 * DESCRIPTION:
614 *
615 * INPUT:
616 * None.
617 *
618 * OUTPUT:
619 * None.
620 *
621 * RETURN:
622 * MV_TRUE if TDM is supported and MV_FALSE otherwise
623 *
624 *******************************************************************************/
625 MV_U32 mvCtrlTdmSupport(MV_VOID)
626 {
627 MV_U32 devId;
628
629 devId = mvCtrlModelGet();
630
631 switch(devId){
632 case MV_6281_DEV_ID:
633 return MV_6281_TDM;
634 break;
635 case MV_6192_DEV_ID:
636 return MV_6192_TDM;
637 break;
638 case MV_6190_DEV_ID:
639 return MV_6190_TDM;
640 break;
641 case MV_6180_DEV_ID:
642 return MV_6180_TDM;
643 break;
644 }
645 return 0;
646
647 }
648 #endif
649
650 /*******************************************************************************
651 * mvCtrlModelGet - Get Marvell controller device model (Id)
652 *
653 * DESCRIPTION:
654 * This function returns 16bit describing the device model (ID) as defined
655 * in PCI Device and Vendor ID configuration register offset 0x0.
656 *
657 * INPUT:
658 * None.
659 *
660 * OUTPUT:
661 * None.
662 *
663 * RETURN:
664 * 16bit desscribing Marvell controller ID
665 *
666 *******************************************************************************/
667 MV_U16 mvCtrlModelGet(MV_VOID)
668 {
669 MV_U32 devId;
670
671 devId = MV_REG_READ(CHIP_BOND_REG);
672 devId &= PCKG_OPT_MASK;
673
674 switch(devId){
675 case 2:
676 return MV_6281_DEV_ID;
677 break;
678 case 1:
679 if (((MV_REG_READ(PEX_CFG_DIRECT_ACCESS(0,PEX_DEVICE_AND_VENDOR_ID))& 0xffff0000) >> 16)
680 == MV_6190_DEV_ID)
681 return MV_6190_DEV_ID;
682 else
683 return MV_6192_DEV_ID;
684 break;
685 case 0:
686 return MV_6180_DEV_ID;
687 break;
688 }
689
690 return 0;
691 }
692 /*******************************************************************************
693 * mvCtrlRevGet - Get Marvell controller device revision number
694 *
695 * DESCRIPTION:
696 * This function returns 8bit describing the device revision as defined
697 * in PCI Express Class Code and Revision ID Register.
698 *
699 * INPUT:
700 * None.
701 *
702 * OUTPUT:
703 * None.
704 *
705 * RETURN:
706 * 8bit desscribing Marvell controller revision number
707 *
708 *******************************************************************************/
709 MV_U8 mvCtrlRevGet(MV_VOID)
710 {
711 MV_U8 revNum;
712 #if defined(MV_INCLUDE_CLK_PWR_CNTRL)
713 /* Check pex power state */
714 MV_U32 pexPower;
715 pexPower = mvCtrlPwrClckGet(PEX_UNIT_ID,0);
716 if (pexPower == MV_FALSE)
717 mvCtrlPwrClckSet(PEX_UNIT_ID, 0, MV_TRUE);
718 #endif
719 revNum = (MV_U8)MV_REG_READ(PEX_CFG_DIRECT_ACCESS(0,PCI_CLASS_CODE_AND_REVISION_ID));
720 #if defined(MV_INCLUDE_CLK_PWR_CNTRL)
721 /* Return to power off state */
722 if (pexPower == MV_FALSE)
723 mvCtrlPwrClckSet(PEX_UNIT_ID, 0, MV_FALSE);
724 #endif
725 return ((revNum & PCCRIR_REVID_MASK) >> PCCRIR_REVID_OFFS);
726 }
727
728 /*******************************************************************************
729 * mvCtrlNameGet - Get Marvell controller name
730 *
731 * DESCRIPTION:
732 * This function returns a string describing the device model and revision.
733 *
734 * INPUT:
735 * None.
736 *
737 * OUTPUT:
738 * pNameBuff - Buffer to contain device name string. Minimum size 30 chars.
739 *
740 * RETURN:
741 *
742 * MV_ERROR if informantion can not be read.
743 *******************************************************************************/
744 MV_STATUS mvCtrlNameGet(char *pNameBuff)
745 {
746 mvOsSPrintf (pNameBuff, "%s%x Rev %d", SOC_NAME_PREFIX,
747 mvCtrlModelGet(), mvCtrlRevGet());
748
749 return MV_OK;
750 }
751
752 /*******************************************************************************
753 * mvCtrlModelRevGet - Get Controller Model (Device ID) and Revision
754 *
755 * DESCRIPTION:
756 * This function returns 32bit value describing both Device ID and Revision
757 * as defined in PCI Express Device and Vendor ID Register and device revision
758 * as defined in PCI Express Class Code and Revision ID Register.
759
760 *
761 * INPUT:
762 * None.
763 *
764 * OUTPUT:
765 * None.
766 *
767 * RETURN:
768 * 32bit describing both controller device ID and revision number
769 *
770 *******************************************************************************/
771 MV_U32 mvCtrlModelRevGet(MV_VOID)
772 {
773 return ((mvCtrlModelGet() << 16) | mvCtrlRevGet());
774 }
775
776 /*******************************************************************************
777 * mvCtrlModelRevNameGet - Get Marvell controller name
778 *
779 * DESCRIPTION:
780 * This function returns a string describing the device model and revision.
781 *
782 * INPUT:
783 * None.
784 *
785 * OUTPUT:
786 * pNameBuff - Buffer to contain device name string. Minimum size 30 chars.
787 *
788 * RETURN:
789 *
790 * MV_ERROR if informantion can not be read.
791 *******************************************************************************/
792
793 MV_STATUS mvCtrlModelRevNameGet(char *pNameBuff)
794 {
795
796 switch (mvCtrlModelRevGet())
797 {
798 case MV_6281_A0_ID:
799 mvOsSPrintf (pNameBuff, "%s",MV_6281_A0_NAME);
800 break;
801 case MV_6192_A0_ID:
802 mvOsSPrintf (pNameBuff, "%s",MV_6192_A0_NAME);
803 break;
804 case MV_6180_A0_ID:
805 mvOsSPrintf (pNameBuff, "%s",MV_6180_A0_NAME);
806 break;
807 case MV_6190_A0_ID:
808 mvOsSPrintf (pNameBuff, "%s",MV_6190_A0_NAME);
809 break;
810 case MV_6281_A1_ID:
811 mvOsSPrintf (pNameBuff, "%s",MV_6281_A1_NAME);
812 break;
813 case MV_6192_A1_ID:
814 mvOsSPrintf (pNameBuff, "%s",MV_6192_A1_NAME);
815 break;
816 case MV_6180_A1_ID:
817 mvOsSPrintf (pNameBuff, "%s",MV_6180_A1_NAME);
818 break;
819 case MV_6190_A1_ID:
820 mvOsSPrintf (pNameBuff, "%s",MV_6190_A1_NAME);
821 break;
822 default:
823 mvCtrlNameGet(pNameBuff);
824 break;
825 }
826
827 return MV_OK;
828 }
829
830
831 /*******************************************************************************
832 * ctrlWinOverlapTest - Test address windows for overlaping.
833 *
834 * DESCRIPTION:
835 * This function checks the given two address windows for overlaping.
836 *
837 * INPUT:
838 * pAddrWin1 - Address window 1.
839 * pAddrWin2 - Address window 2.
840 *
841 * OUTPUT:
842 * None.
843 *
844 * RETURN:
845 *
846 * MV_TRUE if address window overlaps, MV_FALSE otherwise.
847 *******************************************************************************/
848 MV_STATUS ctrlWinOverlapTest(MV_ADDR_WIN *pAddrWin1, MV_ADDR_WIN *pAddrWin2)
849 {
850 MV_U32 winBase1, winBase2;
851 MV_U32 winTop1, winTop2;
852
853 /* check if we have overflow than 4G*/
854 if (((0xffffffff - pAddrWin1->baseLow) < pAddrWin1->size-1)||
855 ((0xffffffff - pAddrWin2->baseLow) < pAddrWin2->size-1))
856 {
857 return MV_TRUE;
858 }
859
860 winBase1 = pAddrWin1->baseLow;
861 winBase2 = pAddrWin2->baseLow;
862 winTop1 = winBase1 + pAddrWin1->size-1;
863 winTop2 = winBase2 + pAddrWin2->size-1;
864
865
866 if (((winBase1 <= winTop2 ) && ( winTop2 <= winTop1)) ||
867 ((winBase1 <= winBase2) && (winBase2 <= winTop1)))
868 {
869 return MV_TRUE;
870 }
871 else
872 {
873 return MV_FALSE;
874 }
875 }
876
877 /*******************************************************************************
878 * ctrlWinWithinWinTest - Test address windows for overlaping.
879 *
880 * DESCRIPTION:
881 * This function checks the given win1 boundries is within
882 * win2 boundries.
883 *
884 * INPUT:
885 * pAddrWin1 - Address window 1.
886 * pAddrWin2 - Address window 2.
887 *
888 * OUTPUT:
889 * None.
890 *
891 * RETURN:
892 *
893 * MV_TRUE if found win1 inside win2, MV_FALSE otherwise.
894 *******************************************************************************/
895 MV_STATUS ctrlWinWithinWinTest(MV_ADDR_WIN *pAddrWin1, MV_ADDR_WIN *pAddrWin2)
896 {
897 MV_U32 winBase1, winBase2;
898 MV_U32 winTop1, winTop2;
899
900 winBase1 = pAddrWin1->baseLow;
901 winBase2 = pAddrWin2->baseLow;
902 winTop1 = winBase1 + pAddrWin1->size -1;
903 winTop2 = winBase2 + pAddrWin2->size -1;
904
905 if (((winBase1 >= winBase2 ) && ( winBase1 <= winTop2)) ||
906 ((winTop1 >= winBase2) && (winTop1 <= winTop2)))
907 {
908 return MV_TRUE;
909 }
910 else
911 {
912 return MV_FALSE;
913 }
914 }
915
916 static const char* cntrlName[] = TARGETS_NAME_ARRAY;
917
918 /*******************************************************************************
919 * mvCtrlTargetNameGet - Get Marvell controller target name
920 *
921 * DESCRIPTION:
922 * This function convert the trget enumeration to string.
923 *
924 * INPUT:
925 * None.
926 *
927 * OUTPUT:
928 * None.
929 *
930 * RETURN:
931 * Target name (const MV_8 *)
932 *******************************************************************************/
933 const MV_8* mvCtrlTargetNameGet( MV_TARGET target )
934 {
935
936 if (target >= MAX_TARGETS)
937 {
938 return "target unknown";
939 }
940
941 return cntrlName[target];
942 }
943
944 /*******************************************************************************
945 * mvCtrlAddrDecShow - Print the Controller units address decode map.
946 *
947 * DESCRIPTION:
948 * This function the Controller units address decode map.
949 *
950 * INPUT:
951 * None.
952 *
953 * OUTPUT:
954 * None.
955 *
956 * RETURN:
957 * None.
958 *
959 *******************************************************************************/
960 MV_VOID mvCtrlAddrDecShow(MV_VOID)
961 {
962 mvCpuIfAddDecShow();
963 mvAhbToMbusAddDecShow();
964 #if defined(MV_INCLUDE_PEX)
965 mvPexAddrDecShow();
966 #endif
967 #if defined(MV_INCLUDE_USB)
968 mvUsbAddrDecShow();
969 #endif
970 #if defined(MV_INCLUDE_GIG_ETH)
971 mvEthAddrDecShow();
972 #endif
973 #if defined(MV_INCLUDE_XOR)
974 mvXorAddrDecShow();
975 #endif
976 #if defined(MV_INCLUDE_SATA)
977 mvSataAddrDecShow();
978 #endif
979 #if defined(MV_INCLUDE_AUDIO)
980 mvAudioAddrDecShow();
981 #endif
982 #if defined(MV_INCLUDE_TS)
983 mvTsuAddrDecShow();
984 #endif
985 }
986
987 /*******************************************************************************
988 * ctrlSizeToReg - Extract size value for register assignment.
989 *
990 * DESCRIPTION:
991 * Address decode size parameter must be programed from LSB to MSB as
992 * sequence of 1's followed by sequence of 0's. The number of 1's
993 * specifies the size of the window in 64 KB granularity (e.g. a
994 * value of 0x00ff specifies 256x64k = 16 MB).
995 * This function extract the size value from the size parameter according
996 * to given aligment paramter. For example for size 0x1000000 (16MB) and
997 * aligment 0x10000 (64KB) the function will return 0x00FF.
998 *
999 * INPUT:
1000 * size - Size.
1001 * alignment - Size alignment. Note that alignment must be power of 2!
1002 *
1003 * OUTPUT:
1004 * None.
1005 *
1006 * RETURN:
1007 * 32bit describing size register value correspond to size parameter.
1008 * If value is '-1' size parameter or aligment are invalid.
1009 *******************************************************************************/
1010 MV_U32 ctrlSizeToReg(MV_U32 size, MV_U32 alignment)
1011 {
1012 MV_U32 retVal;
1013
1014 /* Check size parameter alignment */
1015 if ((0 == size) || (MV_IS_NOT_ALIGN(size, alignment)))
1016 {
1017 DB(mvOsPrintf("ctrlSizeToReg: ERR. Size is zero or not aligned.\n"));
1018 return -1;
1019 }
1020
1021 /* Take out the "alignment" portion out of the size parameter */
1022 alignment--; /* Now the alignmet is a sequance of '1' (e.g. 0xffff) */
1023 /* and size is 0x1000000 (16MB) for example */
1024 while(alignment & 1) /* Check that alignmet LSB is set */
1025 {
1026 size = (size >> 1); /* If LSB is set, move 'size' one bit to right */
1027 alignment = (alignment >> 1);
1028 }
1029
1030 /* If after the alignment first '0' was met we still have '1' in */
1031 /* it then aligment is invalid (not power of 2) */
1032 if (alignment)
1033 {
1034 DB(mvOsPrintf("ctrlSizeToReg: ERR. Alignment parameter 0x%x invalid.\n",
1035 (MV_U32)alignment));
1036 return -1;
1037 }
1038
1039 /* Now the size is shifted right according to aligment: 0x0100 */
1040 size--; /* Now the size is a sequance of '1': 0x00ff */
1041
1042 retVal = size ;
1043
1044 /* Check that LSB to MSB is sequence of 1's followed by sequence of 0's */
1045 while(size & 1) /* Check that LSB is set */
1046 {
1047 size = (size >> 1); /* If LSB is set, move one bit to the right */
1048 }
1049
1050 if (size) /* Sequance of 1's is over. Check that we have no other 1's */
1051 {
1052 DB(mvOsPrintf("ctrlSizeToReg: ERR. Size parameter 0x%x invalid.\n",
1053 size));
1054 return -1;
1055 }
1056
1057 return retVal;
1058
1059 }
1060
1061 /*******************************************************************************
1062 * ctrlRegToSize - Extract size value from register value.
1063 *
1064 * DESCRIPTION:
1065 * This function extract a size value from the register size parameter
1066 * according to given aligment paramter. For example for register size
1067 * value 0xff and aligment 0x10000 the function will return 0x01000000.
1068 *
1069 * INPUT:
1070 * regSize - Size as in register format. See ctrlSizeToReg.
1071 * alignment - Size alignment. Note that alignment must be power of 2!
1072 *
1073 * OUTPUT:
1074 * None.
1075 *
1076 * RETURN:
1077 * 32bit describing size.
1078 * If value is '-1' size parameter or aligment are invalid.
1079 *******************************************************************************/
1080 MV_U32 ctrlRegToSize(MV_U32 regSize, MV_U32 alignment)
1081 {
1082 MV_U32 temp;
1083
1084 /* Check that LSB to MSB is sequence of 1's followed by sequence of 0's */
1085 temp = regSize; /* Now the size is a sequance of '1': 0x00ff */
1086
1087 while(temp & 1) /* Check that LSB is set */
1088 {
1089 temp = (temp >> 1); /* If LSB is set, move one bit to the right */
1090 }
1091
1092 if (temp) /* Sequance of 1's is over. Check that we have no other 1's */
1093 {
1094 DB(mvOsPrintf("ctrlRegToSize: ERR. Size parameter 0x%x invalid.\n",
1095 regSize));
1096 return -1;
1097 }
1098
1099
1100 /* Check that aligment is a power of two */
1101 temp = alignment - 1;/* Now the alignmet is a sequance of '1' (0xffff) */
1102
1103 while(temp & 1) /* Check that alignmet LSB is set */
1104 {
1105 temp = (temp >> 1); /* If LSB is set, move 'size' one bit to right */
1106 }
1107
1108 /* If after the 'temp' first '0' was met we still have '1' in 'temp' */
1109 /* then 'temp' is invalid (not power of 2) */
1110 if (temp)
1111 {
1112 DB(mvOsPrintf("ctrlSizeToReg: ERR. Alignment parameter 0x%x invalid.\n",
1113 alignment));
1114 return -1;
1115 }
1116
1117 regSize++; /* Now the size is 0x0100 */
1118
1119 /* Add in the "alignment" portion to the register size parameter */
1120 alignment--; /* Now the alignmet is a sequance of '1' (e.g. 0xffff) */
1121
1122 while(alignment & 1) /* Check that alignmet LSB is set */
1123 {
1124 regSize = (regSize << 1); /* LSB is set, move 'size' one bit left */
1125 alignment = (alignment >> 1);
1126 }
1127
1128 return regSize;
1129 }
1130
1131
1132 /*******************************************************************************
1133 * ctrlSizeRegRoundUp - Round up given size
1134 *
1135 * DESCRIPTION:
1136 * This function round up a given size to a size that fits the
1137 * restrictions of size format given an aligment parameter.
1138 * to given aligment paramter. For example for size parameter 0xa1000 and
1139 * aligment 0x1000 the function will return 0xFF000.
1140 *
1141 * INPUT:
1142 * size - Size.
1143 * alignment - Size alignment. Note that alignment must be power of 2!
1144 *
1145 * OUTPUT:
1146 * None.
1147 *
1148 * RETURN:
1149 * 32bit describing size value correspond to size in register.
1150 *******************************************************************************/
1151 MV_U32 ctrlSizeRegRoundUp(MV_U32 size, MV_U32 alignment)
1152 {
1153 MV_U32 msbBit = 0;
1154 MV_U32 retSize;
1155
1156 /* Check if size parameter is already comply with restriction */
1157 if (!(-1 == ctrlSizeToReg(size, alignment)))
1158 {
1159 return size;
1160 }
1161
1162 while(size)
1163 {
1164 size = (size >> 1);
1165 msbBit++;
1166 }
1167
1168 retSize = (1 << msbBit);
1169
1170 if (retSize < alignment)
1171 {
1172 return alignment;
1173 }
1174 else
1175 {
1176 return retSize;
1177 }
1178 }
1179 /*******************************************************************************
1180 * mvCtrlSysRstLengthCounterGet - Return number of milliseconds the reset button
1181 * was pressed and clear counter
1182 *
1183 * DESCRIPTION:
1184 *
1185 * INPUT:
1186 *
1187 * OUTPUT:
1188 *
1189 * RETURN: number of milliseconds the reset button was pressed
1190 *******************************************************************************/
1191 MV_U32 mvCtrlSysRstLengthCounterGet(MV_VOID)
1192 {
1193 static volatile MV_U32 Count = 0;
1194
1195 if(!Count) {
1196 Count = (MV_REG_READ(SYSRST_LENGTH_COUNTER_REG) & SLCR_COUNT_MASK);
1197 Count = (Count / (MV_BOARD_REFCLK_25MHZ / 1000));
1198 /* clear counter for next boot */
1199 MV_REG_BIT_SET(SYSRST_LENGTH_COUNTER_REG, SLCR_CLR_MASK);
1200 }
1201
1202 DB(mvOsPrintf("mvCtrlSysRstLengthCounterGet: Reset button was pressed for %u milliseconds\n", Count));
1203
1204 return Count;
1205 }
1206
1207 MV_BOOL mvCtrlIsBootFromSPI(MV_VOID)
1208 {
1209 MV_U32 satr = 0;
1210 satr = MV_REG_READ(MPP_SAMPLE_AT_RESET);
1211 if(mvCtrlModelGet() == MV_6180_DEV_ID)
1212 {
1213 if (MSAR_BOOT_MODE_6180(satr) == MSAR_BOOT_SPI_WITH_BOOTROM_6180)
1214 return MV_TRUE;
1215 else
1216 return MV_FALSE;
1217 }
1218 satr = satr & MSAR_BOOT_MODE_MASK;
1219 if (satr == MSAR_BOOT_SPI_WITH_BOOTROM)
1220 return MV_TRUE;
1221 else
1222 return MV_FALSE;
1223 }
1224
1225 MV_BOOL mvCtrlIsBootFromSPIUseNAND(MV_VOID)
1226 {
1227 MV_U32 satr = 0;
1228 if(mvCtrlModelGet() == MV_6180_DEV_ID)
1229 return MV_FALSE;
1230 satr = MV_REG_READ(MPP_SAMPLE_AT_RESET);
1231 satr = satr & MSAR_BOOT_MODE_MASK;
1232
1233 if (satr == MSAR_BOOT_SPI_USE_NAND_WITH_BOOTROM)
1234 return MV_TRUE;
1235 else
1236 return MV_FALSE;
1237 }
1238
1239 MV_BOOL mvCtrlIsBootFromNAND(MV_VOID)
1240 {
1241 MV_U32 satr = 0;
1242 satr = MV_REG_READ(MPP_SAMPLE_AT_RESET);
1243 if(mvCtrlModelGet() == MV_6180_DEV_ID)
1244 {
1245 if (MSAR_BOOT_MODE_6180(satr) == MSAR_BOOT_NAND_WITH_BOOTROM_6180)
1246 return MV_TRUE;
1247 else
1248 return MV_FALSE;
1249 }
1250 satr = satr & MSAR_BOOT_MODE_MASK;
1251 if ((satr == MSAR_BOOT_NAND_WITH_BOOTROM))
1252 return MV_TRUE;
1253 else
1254 return MV_FALSE;
1255 }
1256
1257 #if defined(MV_INCLUDE_CLK_PWR_CNTRL)
1258 /*******************************************************************************
1259 * mvCtrlPwrSaveOn - Set Power save mode
1260 *
1261 * DESCRIPTION:
1262 *
1263 * INPUT:
1264 *
1265 * OUTPUT:
1266 *
1267 * RETURN:
1268 *******************************************************************************/
1269 MV_VOID mvCtrlPwrSaveOn(MV_VOID)
1270 {
1271 unsigned long old,temp;
1272 /* Disable int */
1273 __asm__ __volatile__("mrs %0, cpsr\n"
1274 "orr %1, %0, #0xc0\n"
1275 "msr cpsr_c, %1"
1276 : "=r" (old), "=r" (temp)
1277 :
1278 : "memory");
1279
1280 /* Set SoC in power save */
1281 MV_REG_BIT_SET(POWER_MNG_CTRL_REG, BIT11);
1282 /* Wait for int */
1283 __asm__ __volatile__("mcr p15, 0, r0, c7, c0, 4");
1284
1285 /* Enabled int */
1286 __asm__ __volatile__("msr cpsr_c, %0"
1287 :
1288 : "r" (old)
1289 : "memory");
1290 }
1291
1292
1293
1294 /*******************************************************************************
1295 * mvCtrlPwrSaveOff - Go out of power save mode
1296 *
1297 * DESCRIPTION:
1298 *
1299 * INPUT:
1300 *
1301 * OUTPUT:
1302 *
1303 * RETURN:
1304 *******************************************************************************/
1305 MV_VOID mvCtrlPwrSaveOff(MV_VOID)
1306 {
1307 unsigned long old,temp;
1308 /* Disable int */
1309 __asm__ __volatile__("mrs %0, cpsr\n"
1310 "orr %1, %0, #0xc0\n"
1311 "msr cpsr_c, %1"
1312 : "=r" (old), "=r" (temp)
1313 :
1314 : "memory");
1315
1316 /* Set SoC in power save */
1317 MV_REG_BIT_RESET(POWER_MNG_CTRL_REG, BIT11);
1318 /* Wait for int */
1319 __asm__ __volatile__("mcr p15, 0, r0, c7, c0, 4");
1320
1321 /* Enabled int */
1322 __asm__ __volatile__("msr cpsr_c, %0"
1323 :
1324 : "r" (old)
1325 : "memory");
1326 }
1327
1328 /*******************************************************************************
1329 * mvCtrlPwrClckSet - Set Power State for specific Unit
1330 *
1331 * DESCRIPTION:
1332 *
1333 * INPUT:
1334 *
1335 * OUTPUT:
1336 *
1337 * RETURN:
1338 *******************************************************************************/
1339 MV_VOID mvCtrlPwrClckSet(MV_UNIT_ID unitId, MV_U32 index, MV_BOOL enable)
1340 {
1341 switch (unitId)
1342 {
1343 #if defined(MV_INCLUDE_PEX)
1344 case PEX_UNIT_ID:
1345 if (enable == MV_FALSE)
1346 {
1347 MV_REG_BIT_RESET(POWER_MNG_CTRL_REG, PMC_PEXSTOPCLOCK_MASK);
1348 }
1349 else
1350 {
1351 MV_REG_BIT_SET(POWER_MNG_CTRL_REG, PMC_PEXSTOPCLOCK_MASK);
1352 }
1353 break;
1354 #endif
1355 #if defined(MV_INCLUDE_GIG_ETH)
1356 case ETH_GIG_UNIT_ID:
1357 if (enable == MV_FALSE)
1358 {
1359 MV_REG_BIT_RESET(POWER_MNG_CTRL_REG, PMC_GESTOPCLOCK_MASK(index));
1360 }
1361 else
1362 {
1363 MV_REG_BIT_SET(POWER_MNG_CTRL_REG, PMC_GESTOPCLOCK_MASK(index));
1364 }
1365 break;
1366 #endif
1367 #if defined(MV_INCLUDE_INTEG_SATA)
1368 case SATA_UNIT_ID:
1369 if (enable == MV_FALSE)
1370 {
1371 MV_REG_BIT_RESET(POWER_MNG_CTRL_REG, PMC_SATASTOPCLOCK_MASK(index));
1372 }
1373 else
1374 {
1375 MV_REG_BIT_SET(POWER_MNG_CTRL_REG, PMC_SATASTOPCLOCK_MASK(index));
1376 }
1377 break;
1378 #endif
1379 #if defined(MV_INCLUDE_CESA)
1380 case CESA_UNIT_ID:
1381 if (enable == MV_FALSE)
1382 {
1383 MV_REG_BIT_RESET(POWER_MNG_CTRL_REG, PMC_SESTOPCLOCK_MASK);
1384 }
1385 else
1386 {
1387 MV_REG_BIT_SET(POWER_MNG_CTRL_REG, PMC_SESTOPCLOCK_MASK);
1388 }
1389 break;
1390 #endif
1391 #if defined(MV_INCLUDE_USB)
1392 case USB_UNIT_ID:
1393 if (enable == MV_FALSE)
1394 {
1395 MV_REG_BIT_RESET(POWER_MNG_CTRL_REG, PMC_USBSTOPCLOCK_MASK);
1396 }
1397 else
1398 {
1399 MV_REG_BIT_SET(POWER_MNG_CTRL_REG, PMC_USBSTOPCLOCK_MASK);
1400 }
1401 break;
1402 #endif
1403 #if defined(MV_INCLUDE_AUDIO)
1404 case AUDIO_UNIT_ID:
1405 if (enable == MV_FALSE)
1406 {
1407 MV_REG_BIT_RESET(POWER_MNG_CTRL_REG, PMC_AUDIOSTOPCLOCK_MASK);
1408 }
1409 else
1410 {
1411 MV_REG_BIT_SET(POWER_MNG_CTRL_REG, PMC_AUDIOSTOPCLOCK_MASK);
1412 }
1413 break;
1414 #endif
1415 #if defined(MV_INCLUDE_TS)
1416 case TS_UNIT_ID:
1417 if (enable == MV_FALSE)
1418 {
1419 MV_REG_BIT_RESET(POWER_MNG_CTRL_REG, PMC_TSSTOPCLOCK_MASK);
1420 }
1421 else
1422 {
1423 MV_REG_BIT_SET(POWER_MNG_CTRL_REG, PMC_TSSTOPCLOCK_MASK);
1424 }
1425 break;
1426 #endif
1427 #if defined(MV_INCLUDE_SDIO)
1428 case SDIO_UNIT_ID:
1429 if (enable == MV_FALSE)
1430 {
1431 MV_REG_BIT_RESET(POWER_MNG_CTRL_REG, PMC_SDIOSTOPCLOCK_MASK);
1432 }
1433 else
1434 {
1435 MV_REG_BIT_SET(POWER_MNG_CTRL_REG, PMC_SDIOSTOPCLOCK_MASK);
1436 }
1437 break;
1438 #endif
1439 #if defined(MV_INCLUDE_TDM)
1440 case TDM_UNIT_ID:
1441 if (enable == MV_FALSE)
1442 {
1443 MV_REG_BIT_RESET(POWER_MNG_CTRL_REG, PMC_TDMSTOPCLOCK_MASK);
1444 }
1445 else
1446 {
1447 MV_REG_BIT_SET(POWER_MNG_CTRL_REG, PMC_TDMSTOPCLOCK_MASK);
1448 }
1449 break;
1450 #endif
1451
1452 default:
1453
1454 break;
1455
1456 }
1457 }
1458
1459 /*******************************************************************************
1460 * mvCtrlPwrClckGet - Get Power State of specific Unit
1461 *
1462 * DESCRIPTION:
1463 *
1464 * INPUT:
1465 *
1466 * OUTPUT:
1467 *
1468 * RETURN:
1469 ******************************************************************************/
1470 MV_BOOL mvCtrlPwrClckGet(MV_UNIT_ID unitId, MV_U32 index)
1471 {
1472 MV_U32 reg = MV_REG_READ(POWER_MNG_CTRL_REG);
1473 MV_BOOL state = MV_TRUE;
1474
1475 switch (unitId)
1476 {
1477 #if defined(MV_INCLUDE_PEX)
1478 case PEX_UNIT_ID:
1479 if ((reg & PMC_PEXSTOPCLOCK_MASK) == PMC_PEXSTOPCLOCK_STOP)
1480 {
1481 state = MV_FALSE;
1482 }
1483 else state = MV_TRUE;
1484
1485 break;
1486 #endif
1487 #if defined(MV_INCLUDE_GIG_ETH)
1488 case ETH_GIG_UNIT_ID:
1489 if ((reg & PMC_GESTOPCLOCK_MASK(index)) == PMC_GESTOPCLOCK_STOP(index))
1490 {
1491 state = MV_FALSE;
1492 }
1493 else state = MV_TRUE;
1494 break;
1495 #endif
1496 #if defined(MV_INCLUDE_SATA)
1497 case SATA_UNIT_ID:
1498 if ((reg & PMC_SATASTOPCLOCK_MASK(index)) == PMC_SATASTOPCLOCK_STOP(index))
1499 {
1500 state = MV_FALSE;
1501 }
1502 else state = MV_TRUE;
1503 break;
1504 #endif
1505 #if defined(MV_INCLUDE_CESA)
1506 case CESA_UNIT_ID:
1507 if ((reg & PMC_SESTOPCLOCK_MASK) == PMC_SESTOPCLOCK_STOP)
1508 {
1509 state = MV_FALSE;
1510 }
1511 else state = MV_TRUE;
1512 break;
1513 #endif
1514 #if defined(MV_INCLUDE_USB)
1515 case USB_UNIT_ID:
1516 if ((reg & PMC_USBSTOPCLOCK_MASK) == PMC_USBSTOPCLOCK_STOP)
1517 {
1518 state = MV_FALSE;
1519 }
1520 else state = MV_TRUE;
1521 break;
1522 #endif
1523 #if defined(MV_INCLUDE_AUDIO)
1524 case AUDIO_UNIT_ID:
1525 if ((reg & PMC_AUDIOSTOPCLOCK_MASK) == PMC_AUDIOSTOPCLOCK_STOP)
1526 {
1527 state = MV_FALSE;
1528 }
1529 else state = MV_TRUE;
1530 break;
1531 #endif
1532 #if defined(MV_INCLUDE_TS)
1533 case TS_UNIT_ID:
1534 if ((reg & PMC_TSSTOPCLOCK_MASK) == PMC_TSSTOPCLOCK_STOP)
1535 {
1536 state = MV_FALSE;
1537 }
1538 else state = MV_TRUE;
1539 break;
1540 #endif
1541 #if defined(MV_INCLUDE_SDIO)
1542 case SDIO_UNIT_ID:
1543 if ((reg & PMC_SDIOSTOPCLOCK_MASK)== PMC_SDIOSTOPCLOCK_STOP)
1544 {
1545 state = MV_FALSE;
1546 }
1547 else state = MV_TRUE;
1548 break;
1549 #endif
1550 #if defined(MV_INCLUDE_TDM)
1551 case TDM_UNIT_ID:
1552 if ((reg & PMC_TDMSTOPCLOCK_MASK) == PMC_TDMSTOPCLOCK_STOP)
1553 {
1554 state = MV_FALSE;
1555 }
1556 else state = MV_TRUE;
1557 break;
1558 #endif
1559
1560 default:
1561 state = MV_TRUE;
1562 break;
1563 }
1564
1565
1566 return state;
1567 }
1568 /*******************************************************************************
1569 * mvCtrlPwrMemSet - Set Power State for memory on specific Unit
1570 *
1571 * DESCRIPTION:
1572 *
1573 * INPUT:
1574 *
1575 * OUTPUT:
1576 *
1577 * RETURN:
1578 *******************************************************************************/
1579 MV_VOID mvCtrlPwrMemSet(MV_UNIT_ID unitId, MV_U32 index, MV_BOOL enable)
1580 {
1581 switch (unitId)
1582 {
1583 #if defined(MV_INCLUDE_PEX)
1584 case PEX_UNIT_ID:
1585 if (enable == MV_FALSE)
1586 {
1587 MV_REG_BIT_SET(POWER_MNG_MEM_CTRL_REG, PMC_PEXSTOPMEM_MASK);
1588 }
1589 else
1590 {
1591 MV_REG_BIT_RESET(POWER_MNG_MEM_CTRL_REG, PMC_PEXSTOPMEM_MASK);
1592 }
1593 break;
1594 #endif
1595 #if defined(MV_INCLUDE_GIG_ETH)
1596 case ETH_GIG_UNIT_ID:
1597 if (enable == MV_FALSE)
1598 {
1599 MV_REG_BIT_SET(POWER_MNG_MEM_CTRL_REG, PMC_GESTOPMEM_MASK(index));
1600 }
1601 else
1602 {
1603 MV_REG_BIT_RESET(POWER_MNG_MEM_CTRL_REG, PMC_GESTOPMEM_MASK(index));
1604 }
1605 break;
1606 #endif
1607 #if defined(MV_INCLUDE_INTEG_SATA)
1608 case SATA_UNIT_ID:
1609 if (enable == MV_FALSE)
1610 {
1611 MV_REG_BIT_SET(POWER_MNG_MEM_CTRL_REG, PMC_SATASTOPMEM_MASK(index));
1612 }
1613 else
1614 {
1615 MV_REG_BIT_RESET(POWER_MNG_MEM_CTRL_REG, PMC_SATASTOPMEM_MASK(index));
1616 }
1617 break;
1618 #endif
1619 #if defined(MV_INCLUDE_CESA)
1620 case CESA_UNIT_ID:
1621 if (enable == MV_FALSE)
1622 {
1623 MV_REG_BIT_SET(POWER_MNG_MEM_CTRL_REG, PMC_SESTOPMEM_MASK);
1624 }
1625 else
1626 {
1627 MV_REG_BIT_RESET(POWER_MNG_MEM_CTRL_REG, PMC_SESTOPMEM_MASK);
1628 }
1629 break;
1630 #endif
1631 #if defined(MV_INCLUDE_USB)
1632 case USB_UNIT_ID:
1633 if (enable == MV_FALSE)
1634 {
1635 MV_REG_BIT_SET(POWER_MNG_MEM_CTRL_REG, PMC_USBSTOPMEM_MASK);
1636 }
1637 else
1638 {
1639 MV_REG_BIT_RESET(POWER_MNG_MEM_CTRL_REG, PMC_USBSTOPMEM_MASK);
1640 }
1641 break;
1642 #endif
1643 #if defined(MV_INCLUDE_AUDIO)
1644 case AUDIO_UNIT_ID:
1645 if (enable == MV_FALSE)
1646 {
1647 MV_REG_BIT_SET(POWER_MNG_MEM_CTRL_REG, PMC_AUDIOSTOPMEM_MASK);
1648 }
1649 else
1650 {
1651 MV_REG_BIT_RESET(POWER_MNG_MEM_CTRL_REG, PMC_AUDIOSTOPMEM_MASK);
1652 }
1653 break;
1654 #endif
1655 #if defined(MV_INCLUDE_XOR)
1656 case XOR_UNIT_ID:
1657 if (enable == MV_FALSE)
1658 {
1659 MV_REG_BIT_SET(POWER_MNG_MEM_CTRL_REG, PMC_XORSTOPMEM_MASK(index));
1660 }
1661 else
1662 {
1663 MV_REG_BIT_RESET(POWER_MNG_MEM_CTRL_REG, PMC_XORSTOPMEM_MASK(index));
1664 }
1665 break;
1666 #endif
1667 default:
1668
1669 break;
1670
1671 }
1672 }
1673
1674 /*******************************************************************************
1675 * mvCtrlPwrMemGet - Get Power State of memory on specific Unit
1676 *
1677 * DESCRIPTION:
1678 *
1679 * INPUT:
1680 *
1681 * OUTPUT:
1682 *
1683 * RETURN:
1684 ******************************************************************************/
1685 MV_BOOL mvCtrlPwrMemGet(MV_UNIT_ID unitId, MV_U32 index)
1686 {
1687 MV_U32 reg = MV_REG_READ(POWER_MNG_MEM_CTRL_REG);
1688 MV_BOOL state = MV_TRUE;
1689
1690 switch (unitId)
1691 {
1692 #if defined(MV_INCLUDE_PEX)
1693 case PEX_UNIT_ID:
1694 if ((reg & PMC_PEXSTOPMEM_MASK) == PMC_PEXSTOPMEM_STOP)
1695 {
1696 state = MV_FALSE;
1697 }
1698 else state = MV_TRUE;
1699
1700 break;
1701 #endif
1702 #if defined(MV_INCLUDE_GIG_ETH)
1703 case ETH_GIG_UNIT_ID:
1704 if ((reg & PMC_GESTOPMEM_MASK(index)) == PMC_GESTOPMEM_STOP(index))
1705 {
1706 state = MV_FALSE;
1707 }
1708 else state = MV_TRUE;
1709 break;
1710 #endif
1711 #if defined(MV_INCLUDE_SATA)
1712 case SATA_UNIT_ID:
1713 if ((reg & PMC_SATASTOPMEM_MASK(index)) == PMC_SATASTOPMEM_STOP(index))
1714 {
1715 state = MV_FALSE;
1716 }
1717 else state = MV_TRUE;
1718 break;
1719 #endif
1720 #if defined(MV_INCLUDE_CESA)
1721 case CESA_UNIT_ID:
1722 if ((reg & PMC_SESTOPMEM_MASK) == PMC_SESTOPMEM_STOP)
1723 {
1724 state = MV_FALSE;
1725 }
1726 else state = MV_TRUE;
1727 break;
1728 #endif
1729 #if defined(MV_INCLUDE_USB)
1730 case USB_UNIT_ID:
1731 if ((reg & PMC_USBSTOPMEM_MASK) == PMC_USBSTOPMEM_STOP)
1732 {
1733 state = MV_FALSE;
1734 }
1735 else state = MV_TRUE;
1736 break;
1737 #endif
1738 #if defined(MV_INCLUDE_AUDIO)
1739 case AUDIO_UNIT_ID:
1740 if ((reg & PMC_AUDIOSTOPMEM_MASK) == PMC_AUDIOSTOPMEM_STOP)
1741 {
1742 state = MV_FALSE;
1743 }
1744 else state = MV_TRUE;
1745 break;
1746 #endif
1747 #if defined(MV_INCLUDE_XOR)
1748 case XOR_UNIT_ID:
1749 if ((reg & PMC_XORSTOPMEM_MASK(index)) == PMC_XORSTOPMEM_STOP(index))
1750 {
1751 state = MV_FALSE;
1752 }
1753 else state = MV_TRUE;
1754 break;
1755 #endif
1756
1757 default:
1758 state = MV_TRUE;
1759 break;
1760 }
1761
1762
1763 return state;
1764 }
1765 #else
1766 MV_VOID mvCtrlPwrClckSet(MV_UNIT_ID unitId, MV_U32 index, MV_BOOL enable) {return;}
1767 MV_BOOL mvCtrlPwrClckGet(MV_UNIT_ID unitId, MV_U32 index) {return MV_TRUE;}
1768 #endif /* #if defined(MV_INCLUDE_CLK_PWR_CNTRL) */
1769
1770
1771 /*******************************************************************************
1772 * mvMPPConfigToSPI - Change MPP[3:0] configuration to SPI mode
1773 *
1774 * DESCRIPTION:
1775 *
1776 * INPUT:
1777 *
1778 * OUTPUT:
1779 *
1780 * RETURN:
1781 ******************************************************************************/
1782 MV_VOID mvMPPConfigToSPI(MV_VOID)
1783 {
1784 MV_U32 mppVal = 0;
1785 MV_U32 bootVal = 0;
1786
1787 if(!mvCtrlIsBootFromSPIUseNAND())
1788 return;
1789 mppVal = 0x00002220; /* Set MPP [3:1] to SPI mode */
1790 bootVal = MV_REG_READ(mvCtrlMppRegGet(0));
1791 bootVal &= 0xffff000f;
1792 mppVal |= bootVal;
1793
1794 MV_REG_WRITE(mvCtrlMppRegGet(0), mppVal);
1795 }
1796
1797
1798 /*******************************************************************************
1799 * mvMPPConfigToDefault - Change MPP[7:0] configuration to default configuration
1800 *
1801 * DESCRIPTION:
1802 *
1803 * INPUT:
1804 *
1805 * OUTPUT:
1806 *
1807 * RETURN:
1808 ******************************************************************************/
1809 MV_VOID mvMPPConfigToDefault(MV_VOID)
1810 {
1811 MV_U32 mppVal = 0;
1812 MV_U32 bootVal = 0;
1813
1814 if(!mvCtrlIsBootFromSPIUseNAND())
1815 return;
1816 mppVal = mvBoardMppGet(0);
1817 bootVal = MV_REG_READ(mvCtrlMppRegGet(0));
1818 mppVal &= ~0xffff000f;
1819 bootVal &= 0xffff000f;
1820 mppVal |= bootVal;
1821
1822 MV_REG_WRITE(mvCtrlMppRegGet(0), mppVal);
1823 }
1824
1825