]> git.proxmox.com Git - mirror_edk2.git/blame - QuarkSocPkg/QuarkSouthCluster/Usb/Ohci/Pei/OhciReg.c
QuarkSocPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / QuarkSocPkg / QuarkSouthCluster / Usb / Ohci / Pei / OhciReg.c
CommitLineData
9b6bbcdb
MK
1/** @file\r
2The OHCI register operation routines.\r
3\r
4Copyright (c) 2013-2015 Intel Corporation.\r
5\r
c9f231d0 6SPDX-License-Identifier: BSD-2-Clause-Patent\r
9b6bbcdb
MK
7\r
8**/\r
9\r
10\r
11#include "OhcPeim.h"\r
12\r
13/**\r
14\r
15 Get OHCI operational reg value\r
16\r
17 @param Ohc UHC private data\r
18 @param Offset Offset of the operational reg\r
19\r
20 @retval Value of the register\r
21\r
22**/\r
23UINT32\r
24OhciGetOperationalReg (\r
25 IN USB_OHCI_HC_DEV *Ohc,\r
26 IN UINT32 Offset\r
27 )\r
28{\r
29\r
30 return MmioRead32 (Ohc->UsbHostControllerBaseAddress + Offset);\r
31\r
32}\r
33/**\r
34\r
35 Set OHCI operational reg value\r
36\r
37 @param Ohc UHC private data\r
38 @param Offset Offset of the operational reg\r
39 @param Value Value to set\r
40\r
41 @retval EFI_SUCCESS Value set to the reg\r
42\r
43**/\r
44\r
45\r
46EFI_STATUS\r
47OhciSetOperationalReg (\r
48 USB_OHCI_HC_DEV *Ohc,\r
49 IN UINT32 Offset,\r
50 IN UINT32 *Value\r
51 )\r
52{\r
53 MmioWrite32(Ohc->UsbHostControllerBaseAddress + Offset, *Value);\r
54 return EFI_SUCCESS;\r
55}\r
56/**\r
57\r
58 Get HcRevision reg value\r
59\r
60 @param Ohc UHC private data\r
61\r
62 @retval Value of the register\r
63\r
64**/\r
65\r
66\r
67UINT32\r
68OhciGetHcRevision (\r
69 USB_OHCI_HC_DEV *Ohc\r
70 )\r
71{\r
72 return OhciGetOperationalReg (Ohc, HC_REVISION);\r
73}\r
74/**\r
75\r
76 Set HcReset reg value\r
77\r
78\r
79 @param Ohc UHC private data\r
80 @param Field Field to set\r
81 @param Value Value to set\r
82\r
83 @retval EFI_SUCCESS Value set\r
84\r
85**/\r
86\r
87EFI_STATUS\r
88OhciSetHcReset (\r
89 IN USB_OHCI_HC_DEV *Ohc,\r
90 IN UINT32 Field,\r
91 IN UINT32 Value\r
92 )\r
93{\r
9b6bbcdb
MK
94 HcRESET Reset;\r
95\r
9b6bbcdb
MK
96 *(UINT32 *) &Reset = OhciGetOperationalReg (Ohc, USBHOST_OFFSET_UHCHR);\r
97\r
98 if (Field & RESET_SYSTEM_BUS) {\r
99 Reset.FSBIR = Value;\r
100 }\r
101\r
102 if (Field & RESET_HOST_CONTROLLER) {\r
103 Reset.FHR = Value;\r
104 }\r
105\r
106 if (Field & RESET_CLOCK_GENERATION) {\r
107 Reset.CGR = Value;\r
108 }\r
109\r
110 if (Field & RESET_SSE_GLOBAL) {\r
111 Reset.SSE = Value;\r
112 }\r
113\r
114 if (Field & RESET_PSPL) {\r
115 Reset.PSPL = Value;\r
116 }\r
117\r
118 if (Field & RESET_PCPL) {\r
119 Reset.PCPL = Value;\r
120 }\r
121\r
122 if (Field & RESET_SSEP1) {\r
123 Reset.SSEP1 = Value;\r
124 }\r
125\r
126 if (Field & RESET_SSEP2) {\r
127 Reset.SSEP2 = Value;\r
128 }\r
129\r
130 if (Field & RESET_SSEP3) {\r
131 Reset.SSEP3 = Value;\r
132 }\r
133\r
134 OhciSetOperationalReg (Ohc, USBHOST_OFFSET_UHCHR, (UINT32*)&Reset);\r
135\r
136 return EFI_SUCCESS;\r
137}\r
138\r
139/**\r
140\r
141 Get specific field of HcReset reg value\r
142\r
143 @param Ohc UHC private data\r
144 @param Field Field to get\r
145\r
146 @retval Value of the field\r
147\r
148**/\r
149\r
150UINT32\r
151OhciGetHcReset (\r
152 IN USB_OHCI_HC_DEV *Ohc,\r
153 IN UINT32 Field\r
154 )\r
155{\r
156 HcRESET Reset;\r
157 UINT32 Value;\r
158\r
159\r
160 *(UINT32 *) &Reset = OhciGetOperationalReg (Ohc, USBHOST_OFFSET_UHCHR);\r
161 Value = 0;\r
162\r
163 switch (Field) {\r
164 case RESET_SYSTEM_BUS:\r
165 Value = Reset.FSBIR;\r
166 break;\r
167\r
168 case RESET_HOST_CONTROLLER:\r
169 Value = Reset.FHR;\r
170 break;\r
171\r
172 case RESET_CLOCK_GENERATION:\r
173 Value = Reset.CGR;\r
174 break;\r
175\r
176 case RESET_SSE_GLOBAL:\r
177 Value = Reset.SSE;\r
178 break;\r
179\r
180 case RESET_PSPL:\r
181 Value = Reset.PSPL;\r
182 break;\r
183\r
184 case RESET_PCPL:\r
185 Value = Reset.PCPL;\r
186 break;\r
187\r
188 case RESET_SSEP1:\r
189 Value = Reset.SSEP1;\r
190 break;\r
191\r
192 case RESET_SSEP2:\r
193 Value = Reset.SSEP2;\r
194 break;\r
195\r
196 case RESET_SSEP3:\r
197 Value = Reset.SSEP3;\r
198 break;\r
199\r
200 default:\r
201 ASSERT (FALSE);\r
202 }\r
203\r
204\r
205 return Value;\r
206}\r
207\r
208/**\r
209\r
210 Set HcControl reg value\r
211\r
212 @param Ohc UHC private data\r
213 @param Field Field to set\r
214 @param Value Value to set\r
215\r
216 @retval EFI_SUCCESS Value set\r
217\r
218**/\r
219\r
220EFI_STATUS\r
221OhciSetHcControl (\r
222 IN USB_OHCI_HC_DEV *Ohc,\r
223 IN UINTN Field,\r
224 IN UINT32 Value\r
225 )\r
226{\r
227 EFI_STATUS Status;\r
228 HcCONTROL Control;\r
229\r
230\r
231\r
232 *(UINT32 *) &Control = OhciGetOperationalReg (Ohc, HC_CONTROL);\r
233\r
234 if (Field & CONTROL_BULK_RATIO) {\r
235 Control.ControlBulkRatio = Value;\r
236 }\r
237\r
238 if (Field & HC_FUNCTIONAL_STATE) {\r
239 Control.FunctionalState = Value;\r
240 }\r
241\r
242 if (Field & PERIODIC_ENABLE) {\r
243 Control.PeriodicEnable = Value;\r
244 }\r
245\r
246 if (Field & CONTROL_ENABLE) {\r
247 Control.ControlEnable = Value;\r
248 }\r
249\r
250 if (Field & ISOCHRONOUS_ENABLE) {\r
251 Control.IsochronousEnable = Value;\r
252 }\r
253\r
254 if (Field & BULK_ENABLE) {\r
255 Control.BulkEnable = Value;\r
256 }\r
257\r
258 if (Field & INTERRUPT_ROUTING) {\r
259 Control.InterruptRouting = Value;\r
260 }\r
261\r
262 Status = OhciSetOperationalReg (Ohc, HC_CONTROL, (UINT32*)&Control);\r
263\r
264 return Status;\r
265}\r
266\r
267\r
268/**\r
269\r
270 Get specific field of HcControl reg value\r
271\r
272 @param Ohc UHC private data\r
273 @param Field Field to get\r
274\r
275 @retval Value of the field\r
276\r
277**/\r
278\r
279\r
280UINT32\r
281OhciGetHcControl (\r
282 IN USB_OHCI_HC_DEV *Ohc,\r
283 IN UINTN Field\r
284 )\r
285{\r
286 HcCONTROL Control;\r
287\r
288 *(UINT32 *) &Control = OhciGetOperationalReg (Ohc, HC_CONTROL);\r
289\r
290 switch (Field) {\r
291 case CONTROL_BULK_RATIO:\r
292 return Control.ControlBulkRatio;\r
293 break;\r
294 case PERIODIC_ENABLE:\r
295 return Control.PeriodicEnable;\r
296 break;\r
297 case CONTROL_ENABLE:\r
298 return Control.ControlEnable;\r
299 break;\r
300 case BULK_ENABLE:\r
301 return Control.BulkEnable;\r
302 break;\r
303 case ISOCHRONOUS_ENABLE:\r
304 return Control.IsochronousEnable;\r
305 break;\r
306 case HC_FUNCTIONAL_STATE:\r
307 return Control.FunctionalState;\r
308 break;\r
309 case INTERRUPT_ROUTING:\r
310 return Control.InterruptRouting;\r
311 break;\r
312 default:\r
313 ASSERT (FALSE);\r
314 }\r
315\r
316 return 0;\r
317}\r
318\r
319/**\r
320\r
321 Set HcCommand reg value\r
322\r
323 @param Ohc UHC private data\r
324 @param Field Field to set\r
325 @param Value Value to set\r
326\r
327 @retval EFI_SUCCESS Value set\r
328\r
329**/\r
330\r
331EFI_STATUS\r
332OhciSetHcCommandStatus (\r
333 IN USB_OHCI_HC_DEV *Ohc,\r
334 IN UINTN Field,\r
335 IN UINT32 Value\r
336 )\r
337{\r
338 EFI_STATUS Status;\r
339 HcCOMMAND_STATUS CommandStatus;\r
340\r
341 ZeroMem (&CommandStatus, sizeof (HcCOMMAND_STATUS));\r
342\r
343 if(Field & HC_RESET){\r
344 CommandStatus.HcReset = Value;\r
345 }\r
346\r
347 if(Field & CONTROL_LIST_FILLED){\r
348 CommandStatus.ControlListFilled = Value;\r
349 }\r
350\r
351 if(Field & BULK_LIST_FILLED){\r
352 CommandStatus.BulkListFilled = Value;\r
353 }\r
354\r
355 if(Field & CHANGE_OWNER_REQUEST){\r
356 CommandStatus.ChangeOwnerRequest = Value;\r
357 }\r
358\r
359 if(Field & SCHEDULE_OVERRUN_COUNT){\r
360 CommandStatus.ScheduleOverrunCount = Value;\r
361 }\r
362\r
363 Status = OhciSetOperationalReg (Ohc, HC_COMMAND_STATUS, (UINT32*)&CommandStatus);\r
364\r
365 return Status;\r
366}\r
367\r
368/**\r
369\r
370 Get specific field of HcCommand reg value\r
371\r
372 @param Ohc UHC private data\r
373 @param Field Field to get\r
374\r
375 @retval Value of the field\r
376\r
377**/\r
378\r
379UINT32\r
380OhciGetHcCommandStatus (\r
381 IN USB_OHCI_HC_DEV *Ohc,\r
382 IN UINTN Field\r
383 )\r
384{\r
385 HcCOMMAND_STATUS CommandStatus;\r
386\r
387 *(UINT32 *) &CommandStatus = OhciGetOperationalReg (Ohc, HC_COMMAND_STATUS);\r
388\r
389 switch (Field){\r
390 case HC_RESET:\r
391 return CommandStatus.HcReset;\r
392 break;\r
393 case CONTROL_LIST_FILLED:\r
394 return CommandStatus.ControlListFilled;\r
395 break;\r
396 case BULK_LIST_FILLED:\r
397 return CommandStatus.BulkListFilled;\r
398 break;\r
399 case CHANGE_OWNER_REQUEST:\r
400 return CommandStatus.ChangeOwnerRequest;\r
401 break;\r
402 case SCHEDULE_OVERRUN_COUNT:\r
403 return CommandStatus.ScheduleOverrunCount;\r
404 break;\r
405 default:\r
406 ASSERT (FALSE);\r
407 }\r
408\r
409 return 0;\r
410}\r
411\r
412/**\r
413\r
414 Clear specific fields of Interrupt Status\r
415\r
416 @param Ohc UHC private data\r
417 @param Field Field to clear\r
418\r
419 @retval EFI_SUCCESS Fields cleared\r
420\r
421**/\r
422\r
423EFI_STATUS\r
424OhciClearInterruptStatus (\r
425 IN USB_OHCI_HC_DEV *Ohc,\r
426 IN UINTN Field\r
427 )\r
428{\r
429 EFI_STATUS Status;\r
430 HcINTERRUPT_STATUS InterruptStatus;\r
431\r
432 ZeroMem (&InterruptStatus, sizeof (HcINTERRUPT_STATUS));\r
433\r
434 if(Field & SCHEDULE_OVERRUN){\r
435 InterruptStatus.SchedulingOverrun = 1;\r
436 }\r
437\r
438 if(Field & WRITEBACK_DONE_HEAD){\r
439 InterruptStatus.WriteBackDone = 1;\r
440 }\r
441 if(Field & START_OF_FRAME){\r
442 InterruptStatus.Sof = 1;\r
443 }\r
444\r
445 if(Field & RESUME_DETECT){\r
446 InterruptStatus.ResumeDetected = 1;\r
447 }\r
448\r
449 if(Field & UNRECOVERABLE_ERROR){\r
450 InterruptStatus.UnrecoverableError = 1;\r
451 }\r
452\r
453 if(Field & FRAME_NUMBER_OVERFLOW){\r
454 InterruptStatus.FrameNumOverflow = 1;\r
455 }\r
456\r
457 if(Field & ROOTHUB_STATUS_CHANGE){\r
458 InterruptStatus.RHStatusChange = 1;\r
459 }\r
460\r
461 if(Field & OWNERSHIP_CHANGE){\r
462 InterruptStatus.OwnerChange = 1;\r
463 }\r
464\r
465 Status = OhciSetOperationalReg (Ohc, HC_INTERRUPT_STATUS, (UINT32*)&InterruptStatus);\r
466\r
467 return Status;\r
468}\r
469\r
470/**\r
471\r
472 Get fields of HcInterrupt reg value\r
473\r
474 @param Ohc UHC private data\r
475 @param Field Field to get\r
476\r
477 @retval Value of the field\r
478\r
479**/\r
480\r
481UINT32\r
482OhciGetHcInterruptStatus (\r
483 IN USB_OHCI_HC_DEV *Ohc,\r
484 IN UINTN Field\r
485 )\r
486{\r
487 HcINTERRUPT_STATUS InterruptStatus;\r
488\r
489 *(UINT32 *) &InterruptStatus = OhciGetOperationalReg (Ohc, HC_INTERRUPT_STATUS);\r
490\r
491 switch (Field){\r
492 case SCHEDULE_OVERRUN:\r
493 return InterruptStatus.SchedulingOverrun;\r
494 break;\r
495\r
496 case WRITEBACK_DONE_HEAD:\r
497 return InterruptStatus.WriteBackDone;\r
498 break;\r
499\r
500 case START_OF_FRAME:\r
501 return InterruptStatus.Sof;\r
502 break;\r
503\r
504 case RESUME_DETECT:\r
505 return InterruptStatus.ResumeDetected;\r
506 break;\r
507\r
508 case UNRECOVERABLE_ERROR:\r
509 return InterruptStatus.UnrecoverableError;\r
510 break;\r
511\r
512 case FRAME_NUMBER_OVERFLOW:\r
513 return InterruptStatus.FrameNumOverflow;\r
514 break;\r
515\r
516 case ROOTHUB_STATUS_CHANGE:\r
517 return InterruptStatus.RHStatusChange;\r
518 break;\r
519\r
520 case OWNERSHIP_CHANGE:\r
521 return InterruptStatus.OwnerChange;\r
522 break;\r
523\r
524 default:\r
525 ASSERT (FALSE);\r
526 }\r
527\r
528 return 0;\r
529}\r
530\r
531/**\r
532\r
533 Set Interrupt Control reg value\r
534\r
535 @param Ohc UHC private data\r
536 @param StatEnable Enable or Disable\r
537 @param Field Field to set\r
538 @param Value Value to set\r
539\r
540 @retval EFI_SUCCESS Value set\r
541\r
542**/\r
543\r
544EFI_STATUS\r
545OhciSetInterruptControl (\r
546 IN USB_OHCI_HC_DEV *Ohc,\r
547 IN BOOLEAN StatEnable,\r
548 IN UINTN Field,\r
549 IN UINT32 Value\r
550 )\r
551{\r
552 EFI_STATUS Status;\r
553 HcINTERRUPT_CONTROL InterruptState;\r
554\r
555\r
556 ZeroMem (&InterruptState, sizeof (HcINTERRUPT_CONTROL));\r
557\r
558 if(Field & SCHEDULE_OVERRUN) {\r
559 InterruptState.SchedulingOverrunInt = Value;\r
560 }\r
561\r
562 if(Field & WRITEBACK_DONE_HEAD) {\r
563 InterruptState.WriteBackDoneInt = Value;\r
564 }\r
565 if(Field & START_OF_FRAME) {\r
566 InterruptState.SofInt = Value;\r
567 }\r
568\r
569 if(Field & RESUME_DETECT) {\r
570 InterruptState.ResumeDetectedInt = Value;\r
571 }\r
572\r
573 if(Field & UNRECOVERABLE_ERROR) {\r
574 InterruptState.UnrecoverableErrorInt = Value;\r
575 }\r
576\r
577 if(Field & FRAME_NUMBER_OVERFLOW) {\r
578 InterruptState.FrameNumOverflowInt = Value;\r
579 }\r
580\r
581 if(Field & ROOTHUB_STATUS_CHANGE) {\r
582 InterruptState.RHStatusChangeInt = Value;\r
583 }\r
584\r
585 if(Field & OWNERSHIP_CHANGE) {\r
586 InterruptState.OwnerChangedInt = Value;\r
587 }\r
588\r
589 if(Field & MASTER_INTERRUPT) {\r
590 InterruptState.MasterInterruptEnable = Value;\r
591 }\r
592\r
593 if (StatEnable) {\r
594 Status = OhciSetOperationalReg (Ohc, HC_INTERRUPT_ENABLE, (UINT32*)&InterruptState);\r
595 } else {\r
596 Status = OhciSetOperationalReg (Ohc, HC_INTERRUPT_DISABLE, (UINT32*)&InterruptState);\r
597 }\r
598\r
599 return Status;\r
600}\r
601\r
602/**\r
603\r
604 Get field of HcInterruptControl reg value\r
605\r
606 @param Ohc UHC private data\r
607 @param Field Field to get\r
608\r
609 @retval Value of the field\r
610\r
611**/\r
612\r
613UINT32\r
614OhciGetHcInterruptControl (\r
615 IN USB_OHCI_HC_DEV *Ohc,\r
616 IN UINTN Field\r
617 )\r
618{\r
619 HcINTERRUPT_CONTROL InterruptState;\r
620\r
621 *(UINT32 *) &InterruptState = OhciGetOperationalReg (Ohc, HC_INTERRUPT_ENABLE);\r
622\r
623 switch (Field){\r
624 case SCHEDULE_OVERRUN:\r
625 return InterruptState.SchedulingOverrunInt;\r
626 break;\r
627\r
628 case WRITEBACK_DONE_HEAD:\r
629 return InterruptState.WriteBackDoneInt;\r
630 break;\r
631\r
632 case START_OF_FRAME:\r
633 return InterruptState.SofInt;\r
634 break;\r
635\r
636 case RESUME_DETECT:\r
637 return InterruptState.ResumeDetectedInt;\r
638 break;\r
639\r
640 case UNRECOVERABLE_ERROR:\r
641 return InterruptState.UnrecoverableErrorInt;\r
642 break;\r
643\r
644 case FRAME_NUMBER_OVERFLOW:\r
645 return InterruptState.FrameNumOverflowInt;\r
646 break;\r
647\r
648 case ROOTHUB_STATUS_CHANGE:\r
649 return InterruptState.RHStatusChangeInt;\r
650 break;\r
651\r
652 case OWNERSHIP_CHANGE:\r
653 return InterruptState.OwnerChangedInt;\r
654 break;\r
655\r
656 case MASTER_INTERRUPT:\r
657 return InterruptState.MasterInterruptEnable;\r
658 break;\r
659\r
660 default:\r
661 ASSERT (FALSE);\r
662 }\r
663\r
664 return 0;\r
665}\r
666\r
667/**\r
668\r
669 Set memory pointer of specific type\r
670\r
671 @param Ohc UHC private data\r
672 @param PointerType Type of the pointer to set\r
673 @param Value Value to set\r
674\r
675 @retval EFI_SUCCESS Memory pointer set\r
676\r
677**/\r
678\r
679EFI_STATUS\r
680OhciSetMemoryPointer(\r
681 IN USB_OHCI_HC_DEV *Ohc,\r
682 IN UINTN PointerType,\r
683 IN VOID *Value\r
684 )\r
685{\r
686 EFI_STATUS Status;\r
687 UINT32 Verify;\r
688\r
689 Status = OhciSetOperationalReg (Ohc, PointerType, (UINT32*)&Value);\r
690\r
691 if (EFI_ERROR (Status)) {\r
692 return Status;\r
693 }\r
694\r
695 Verify = OhciGetOperationalReg (Ohc, PointerType);\r
696\r
697 while (Verify != (UINT32) Value) {\r
698 MicroSecondDelay (HC_1_MILLISECOND);\r
699 Verify = OhciGetOperationalReg (Ohc, PointerType);\r
700 };\r
701\r
702\r
703 return Status;\r
704}\r
705\r
706/**\r
707\r
708 Get memory pointer of specific type\r
709\r
710 @param Ohc UHC private data\r
711 @param PointerType Type of pointer\r
712\r
713 @retval Memory pointer of the specific type\r
714\r
715**/\r
716\r
717VOID *\r
718OhciGetMemoryPointer (\r
719 IN USB_OHCI_HC_DEV *Ohc,\r
720 IN UINTN PointerType\r
721 )\r
722{\r
723\r
724 return (VOID *) OhciGetOperationalReg (Ohc, PointerType);\r
725}\r
726\r
727\r
728/**\r
729\r
730 Set Frame Interval value\r
731\r
732 @param Ohc UHC private data\r
733 @param Field Field to set\r
734 @param Value Value to set\r
735\r
736 @retval EFI_SUCCESS Value set\r
737\r
738**/\r
739\r
740EFI_STATUS\r
741OhciSetFrameInterval (\r
742 IN USB_OHCI_HC_DEV *Ohc,\r
743 IN UINTN Field,\r
744 IN UINT32 Value\r
745 )\r
746{\r
747 EFI_STATUS Status;\r
748 HcFRM_INTERVAL FrameInterval;\r
749\r
750\r
751 *(UINT32 *) &FrameInterval = OhciGetOperationalReg(Ohc, HC_FRM_INTERVAL);\r
752\r
753 if (Field & FRAME_INTERVAL) {\r
754 FrameInterval.FrmIntervalToggle = !FrameInterval.FrmIntervalToggle;\r
755 FrameInterval.FrameInterval = Value;\r
756 }\r
757\r
758 if (Field & FS_LARGEST_DATA_PACKET) {\r
759 FrameInterval.FSMaxDataPacket = Value;\r
760 }\r
761\r
762 if (Field & FRMINT_TOGGLE) {\r
763 FrameInterval.FrmIntervalToggle = Value;\r
764 }\r
765\r
766 Status = OhciSetOperationalReg (\r
767 Ohc,\r
768 HC_FRM_INTERVAL,\r
769 (UINT32*)&FrameInterval\r
770 );\r
771\r
772 return Status;\r
773}\r
774\r
775\r
776/**\r
777\r
778 Get field of frame interval reg value\r
779\r
780 @param Ohc UHC private data\r
781 @param Field Field to get\r
782\r
783 @retval Value of the field\r
784\r
785**/\r
786\r
787UINT32\r
788OhciGetFrameInterval (\r
789 IN USB_OHCI_HC_DEV *Ohc,\r
790 IN UINTN Field\r
791 )\r
792{\r
793 HcFRM_INTERVAL FrameInterval;\r
794\r
795 *(UINT32 *) &FrameInterval = OhciGetOperationalReg (Ohc, HC_FRM_INTERVAL);\r
796\r
797 switch (Field){\r
798 case FRAME_INTERVAL:\r
799 return FrameInterval.FrameInterval;\r
800 break;\r
801\r
802 case FS_LARGEST_DATA_PACKET:\r
803 return FrameInterval.FSMaxDataPacket;\r
804 break;\r
805\r
806 case FRMINT_TOGGLE:\r
807 return FrameInterval.FrmIntervalToggle;\r
808 break;\r
809\r
810 default:\r
811 ASSERT (FALSE);\r
812 }\r
813\r
814 return 0;\r
815}\r
816\r
817/**\r
818\r
819 Set Frame Remaining reg value\r
820\r
821 @param Ohc UHC private data\r
822 @param Value Value to set\r
823\r
824 @retval EFI_SUCCESS Value set\r
825\r
826**/\r
827\r
828EFI_STATUS\r
829OhciSetFrameRemaining (\r
830 IN USB_OHCI_HC_DEV *Ohc,\r
831 IN UINT32 Value\r
832 )\r
833{\r
834 EFI_STATUS Status;\r
835 HcFRAME_REMAINING FrameRemaining;\r
836\r
837\r
838 *(UINT32 *) &FrameRemaining = OhciGetOperationalReg (Ohc, HC_FRM_REMAINING);\r
839\r
840 FrameRemaining.FrameRemaining = Value;\r
841 FrameRemaining.FrameRemainingToggle = !FrameRemaining.FrameRemainingToggle;\r
842\r
843 Status = OhciSetOperationalReg (Ohc, HC_FRM_REMAINING, (UINT32*)&FrameRemaining);\r
844\r
845 return Status;\r
846}\r
847/**\r
848\r
849 Get value of frame remaining reg\r
850\r
851 @param Ohc UHC private data\r
852 @param Field Field to get\r
853\r
854 @retval Value of frame remaining reg\r
855\r
856**/\r
857UINT32\r
858OhciGetFrameRemaining (\r
859 IN USB_OHCI_HC_DEV *Ohc,\r
860 IN UINTN Field\r
861 )\r
862\r
863{\r
864 HcFRAME_REMAINING FrameRemaining;\r
865\r
866\r
867 *(UINT32 *) &FrameRemaining = OhciGetOperationalReg (Ohc, HC_FRM_REMAINING);\r
868\r
869 switch (Field){\r
870 case FRAME_REMAINING:\r
871 return FrameRemaining.FrameRemaining;\r
872 break;\r
873\r
874 case FRAME_REMAIN_TOGGLE:\r
875 return FrameRemaining.FrameRemainingToggle;\r
876 break;\r
877\r
878 default:\r
879 ASSERT (FALSE);\r
880 }\r
881\r
882 return 0;\r
883}\r
884\r
885/**\r
886\r
887 Set frame number reg value\r
888\r
889 @param Ohc UHC private data\r
890 @param Value Value to set\r
891\r
892 @retval EFI_SUCCESS Value set\r
893\r
894**/\r
895\r
896EFI_STATUS\r
897OhciSetFrameNumber(\r
898 IN USB_OHCI_HC_DEV *Ohc,\r
899 IN UINT32 Value\r
900 )\r
901{\r
902 EFI_STATUS Status;\r
903\r
904 Status = OhciSetOperationalReg (Ohc, HC_FRM_NUMBER, &Value);\r
905\r
906 return Status;\r
907}\r
908\r
909/**\r
910\r
911 Get frame number reg value\r
912\r
913 @param Ohc UHC private data\r
914\r
915 @retval Value of frame number reg\r
916\r
917**/\r
918\r
919UINT32\r
920OhciGetFrameNumber (\r
921 IN USB_OHCI_HC_DEV *Ohc\r
922 )\r
923{\r
924 return OhciGetOperationalReg(Ohc, HC_FRM_NUMBER);\r
925}\r
926\r
927/**\r
928\r
929 Set period start reg value\r
930\r
931 @param Ohc UHC private data\r
932 @param Value Value to set\r
933\r
934 @retval EFI_SUCCESS Value set\r
935\r
936**/\r
937\r
938EFI_STATUS\r
939OhciSetPeriodicStart (\r
940 IN USB_OHCI_HC_DEV *Ohc,\r
941 IN UINT32 Value\r
942 )\r
943{\r
944 EFI_STATUS Status;\r
945\r
946\r
947 Status = OhciSetOperationalReg (Ohc, HC_PERIODIC_START, &Value);\r
948\r
949 return Status;\r
950}\r
951\r
952\r
953/**\r
954\r
955 Get periodic start reg value\r
956\r
957 @param Ohc UHC private data\r
958\r
959 @param Value of periodic start reg\r
960\r
961**/\r
962\r
963UINT32\r
964OhciGetPeriodicStart (\r
965 IN USB_OHCI_HC_DEV *Ohc\r
966 )\r
967{\r
968 return OhciGetOperationalReg(Ohc, HC_PERIODIC_START);\r
969}\r
970\r
971\r
972/**\r
973\r
974 Set Ls Threshold reg value\r
975\r
976 @param Ohc UHC private data\r
977 @param Value Value to set\r
978\r
979 @retval EFI_SUCCESS Value set\r
980\r
981**/\r
982\r
983EFI_STATUS\r
984OhciSetLsThreshold (\r
985 IN USB_OHCI_HC_DEV *Ohc,\r
986 IN UINT32 Value\r
987 )\r
988{\r
989 EFI_STATUS Status;\r
990\r
991\r
992 Status = OhciSetOperationalReg (Ohc, HC_LS_THREASHOLD, &Value);\r
993\r
994 return Status;\r
995}\r
996\r
997\r
998/**\r
999\r
1000 Get Ls Threshold reg value\r
1001\r
1002 @param Ohc UHC private data\r
1003\r
1004 @retval Value of Ls Threshold reg\r
1005\r
1006**/\r
1007\r
1008UINT32\r
1009OhciGetLsThreshold (\r
1010 IN USB_OHCI_HC_DEV *Ohc\r
1011 )\r
1012{\r
1013 return OhciGetOperationalReg(Ohc, HC_LS_THREASHOLD);\r
1014}\r
1015\r
1016/**\r
1017\r
1018 Set Root Hub Descriptor reg value\r
1019\r
1020 @param Ohc UHC private data\r
1021 @param Field Field to set\r
1022 @param Value Value to set\r
1023\r
1024 @retval EFI_SUCCESS Value set\r
1025\r
1026**/\r
1027EFI_STATUS\r
1028OhciSetRootHubDescriptor (\r
1029 IN USB_OHCI_HC_DEV *Ohc,\r
1030 IN UINTN Field,\r
1031 IN UINT32 Value\r
1032 )\r
1033{\r
1034 EFI_STATUS Status;\r
1035 HcRH_DESC_A DescriptorA;\r
1036 HcRH_DESC_B DescriptorB;\r
1037\r
1038\r
1039 if (Field & (RH_DEV_REMOVABLE || RH_PORT_PWR_CTRL_MASK)) {\r
1040 *(UINT32 *) &DescriptorB = OhciGetOperationalReg (Ohc, HC_RH_DESC_B);\r
1041\r
1042 if(Field & RH_DEV_REMOVABLE) {\r
1043 DescriptorB.DeviceRemovable = Value;\r
1044 }\r
1045 if(Field & RH_PORT_PWR_CTRL_MASK) {\r
1046 DescriptorB.PortPowerControlMask = Value;\r
1047 }\r
1048\r
1049 Status = OhciSetOperationalReg (Ohc, HC_RH_DESC_B, (UINT32*)&DescriptorB);\r
1050\r
1051 return Status;\r
1052 }\r
1053\r
1054 *(UINT32 *)&DescriptorA = OhciGetOperationalReg (Ohc, HC_RH_DESC_A);\r
1055\r
1056 if(Field & RH_NUM_DS_PORTS) {\r
1057 DescriptorA.NumDownStrmPorts = Value;\r
1058 }\r
1059 if(Field & RH_NO_PSWITCH) {\r
1060 DescriptorA.NoPowerSwitch = Value;\r
1061 }\r
1062 if(Field & RH_PSWITCH_MODE) {\r
1063 DescriptorA.PowerSwitchMode = Value;\r
1064 }\r
1065 if(Field & RH_DEVICE_TYPE) {\r
1066 DescriptorA.DeviceType = Value;\r
1067 }\r
1068 if(Field & RH_OC_PROT_MODE) {\r
1069 DescriptorA.OverCurrentProtMode = Value;\r
1070 }\r
1071 if(Field & RH_NOC_PROT) {\r
1072 DescriptorA.NoOverCurrentProtMode = Value;\r
1073 }\r
1074 if(Field & RH_NO_POTPGT) {\r
1075 DescriptorA.PowerOnToPowerGoodTime = Value;\r
1076 }\r
1077\r
1078 Status = OhciSetOperationalReg (Ohc, HC_RH_DESC_A, (UINT32*)&DescriptorA);\r
1079\r
1080 return Status;\r
1081}\r
1082\r
1083\r
1084/**\r
1085\r
1086 Get Root Hub Descriptor reg value\r
1087\r
1088 @param Ohc UHC private data\r
1089 @param Field Field to get\r
1090\r
1091 @retval Value of the field\r
1092\r
1093**/\r
1094\r
1095UINT32\r
1096OhciGetRootHubDescriptor (\r
1097 IN USB_OHCI_HC_DEV *Ohc,\r
1098 IN UINTN Field\r
1099 )\r
1100{\r
1101 HcRH_DESC_A DescriptorA;\r
1102 HcRH_DESC_B DescriptorB;\r
1103\r
1104\r
1105 *(UINT32 *) &DescriptorA = OhciGetOperationalReg (Ohc, HC_RH_DESC_A);\r
1106 *(UINT32 *) &DescriptorB = OhciGetOperationalReg (Ohc, HC_RH_DESC_B);\r
1107\r
1108 switch (Field){\r
1109 case RH_DEV_REMOVABLE:\r
1110 return DescriptorB.DeviceRemovable;\r
1111 break;\r
1112\r
1113 case RH_PORT_PWR_CTRL_MASK:\r
1114 return DescriptorB.PortPowerControlMask;\r
1115 break;\r
1116\r
1117 case RH_NUM_DS_PORTS:\r
1118 return DescriptorA.NumDownStrmPorts;\r
1119 break;\r
1120\r
1121 case RH_NO_PSWITCH:\r
1122 return DescriptorA.NoPowerSwitch;\r
1123 break;\r
1124\r
1125 case RH_PSWITCH_MODE:\r
1126 return DescriptorA.PowerSwitchMode;\r
1127 break;\r
1128\r
1129 case RH_DEVICE_TYPE:\r
1130 return DescriptorA.DeviceType;\r
1131 break;\r
1132\r
1133 case RH_OC_PROT_MODE:\r
1134 return DescriptorA.OverCurrentProtMode;\r
1135 break;\r
1136\r
1137 case RH_NOC_PROT:\r
1138 return DescriptorA.NoOverCurrentProtMode;\r
1139 break;\r
1140\r
1141 case RH_NO_POTPGT:\r
1142 return DescriptorA.PowerOnToPowerGoodTime;\r
1143 break;\r
1144\r
1145 default:\r
1146 ASSERT (FALSE);\r
1147 }\r
1148\r
1149 return 0;\r
1150}\r
1151\r
1152\r
1153/**\r
1154\r
1155 Set Root Hub Status reg value\r
1156\r
1157 @param Ohc UHC private data\r
1158 @param Field Field to set\r
1159\r
1160 @retval EFI_SUCCESS Value set\r
1161\r
1162**/\r
1163\r
1164EFI_STATUS\r
1165OhciSetRootHubStatus (\r
1166 IN USB_OHCI_HC_DEV *Ohc,\r
1167 IN UINTN Field\r
1168 )\r
1169{\r
1170 EFI_STATUS Status;\r
1171 HcRH_STATUS RootHubStatus;\r
1172\r
1173\r
1174 ZeroMem (&RootHubStatus, sizeof(HcRH_STATUS));\r
1175\r
1176 if(Field & RH_LOCAL_PSTAT){\r
1177 RootHubStatus.LocalPowerStat = 1;\r
1178 }\r
1179 if(Field & RH_OC_ID){\r
1180 RootHubStatus.OverCurrentIndicator = 1;\r
1181 }\r
1182 if(Field & RH_REMOTE_WK_ENABLE){\r
1183 RootHubStatus.DevRemoteWakeupEnable = 1;\r
1184 }\r
1185 if(Field & RH_LOCAL_PSTAT_CHANGE){\r
1186 RootHubStatus.LocalPowerStatChange = 1;\r
1187 }\r
1188 if(Field & RH_OC_ID_CHANGE){\r
1189 RootHubStatus.OverCurrentIndicatorChange = 1;\r
1190 }\r
1191 if(Field & RH_CLR_RMT_WK_ENABLE){\r
1192 RootHubStatus.ClearRemoteWakeupEnable = 1;\r
1193 }\r
1194\r
1195 Status = OhciSetOperationalReg (Ohc, HC_RH_STATUS, (UINT32*)&RootHubStatus);\r
1196\r
1197 return Status;\r
1198}\r
1199\r
1200\r
1201/**\r
1202\r
1203 Get Root Hub Status reg value\r
1204\r
1205 @param Ohc UHC private data\r
1206 @param Field Field to get\r
1207\r
1208 @retval Value of the field\r
1209\r
1210**/\r
1211\r
1212UINT32\r
1213OhciGetRootHubStatus (\r
1214 IN USB_OHCI_HC_DEV *Ohc,\r
1215 IN UINTN Field\r
1216 )\r
1217{\r
1218 HcRH_STATUS RootHubStatus;\r
1219\r
1220\r
1221 *(UINT32 *) &RootHubStatus = OhciGetOperationalReg (Ohc, HC_RH_STATUS);\r
1222\r
1223 switch (Field) {\r
1224 case RH_LOCAL_PSTAT:\r
1225 return RootHubStatus.LocalPowerStat;\r
1226 break;\r
1227 case RH_OC_ID:\r
1228 return RootHubStatus.OverCurrentIndicator;\r
1229 break;\r
1230 case RH_REMOTE_WK_ENABLE:\r
1231 return RootHubStatus.DevRemoteWakeupEnable;\r
1232 break;\r
1233 case RH_LOCAL_PSTAT_CHANGE:\r
1234 return RootHubStatus.LocalPowerStatChange;\r
1235 break;\r
1236 case RH_OC_ID_CHANGE:\r
1237 return RootHubStatus.OverCurrentIndicatorChange;\r
1238 break;\r
1239 case RH_CLR_RMT_WK_ENABLE:\r
1240 return RootHubStatus.ClearRemoteWakeupEnable;\r
1241 break;\r
1242 default:\r
1243 ASSERT (FALSE);\r
1244 }\r
1245\r
1246 return 0;\r
1247}\r
1248\r
1249\r
1250/**\r
1251\r
1252 Set Root Hub Port Status reg value\r
1253\r
1254 @param Ohc UHC private data\r
1255 @param Index Index of the port\r
1256 @param Field Field to set\r
1257\r
1258 @retval EFI_SUCCESS Value set\r
1259\r
1260**/\r
1261\r
1262EFI_STATUS\r
1263OhciSetRootHubPortStatus (\r
1264 IN USB_OHCI_HC_DEV *Ohc,\r
1265 IN UINT32 Index,\r
1266 IN UINTN Field\r
1267 )\r
1268{\r
1269 EFI_STATUS Status;\r
1270 HcRHPORT_STATUS PortStatus;\r
1271\r
1272\r
1273 ZeroMem (&PortStatus, sizeof(HcRHPORT_STATUS));\r
1274\r
1275 if (Field & RH_CLEAR_PORT_ENABLE) {\r
1276 PortStatus.CurrentConnectStat = 1;\r
1277 }\r
1278 if (Field & RH_SET_PORT_ENABLE) {\r
1279 PortStatus.EnableStat = 1;\r
1280 }\r
1281 if (Field & RH_SET_PORT_SUSPEND) {\r
1282 PortStatus.SuspendStat = 1;\r
1283 }\r
1284 if (Field & RH_CLEAR_SUSPEND_STATUS) {\r
1285 PortStatus.OCIndicator = 1;\r
1286 }\r
1287 if (Field & RH_SET_PORT_RESET) {\r
1288 PortStatus.ResetStat = 1;\r
1289 }\r
1290 if (Field & RH_SET_PORT_POWER) {\r
1291 PortStatus.PowerStat = 1;\r
1292 }\r
1293 if (Field & RH_CLEAR_PORT_POWER) {\r
1294 PortStatus.LsDeviceAttached = 1;\r
1295 }\r
1296 if (Field & RH_CONNECT_STATUS_CHANGE) {\r
1297 PortStatus.ConnectStatChange = 1;\r
1298 }\r
1299 if (Field & RH_PORT_ENABLE_STAT_CHANGE) {\r
1300 PortStatus.EnableStatChange = 1;\r
1301 }\r
1302 if (Field & RH_PORT_SUSPEND_STAT_CHANGE) {\r
1303 PortStatus.SuspendStatChange = 1;\r
1304 }\r
1305 if (Field & RH_OC_INDICATOR_CHANGE) {\r
1306 PortStatus.OCIndicatorChange = 1;\r
1307 }\r
1308 if (Field & RH_PORT_RESET_STAT_CHANGE ) {\r
1309 PortStatus.ResetStatChange = 1;\r
1310 }\r
1311\r
1312 Status = OhciSetOperationalReg (Ohc, HC_RH_PORT_STATUS + (Index * 4), (UINT32*)&PortStatus);\r
1313\r
1314 return Status;\r
1315}\r
1316\r
1317\r
1318/**\r
1319\r
1320 Get Root Hub Port Status reg value\r
1321\r
1322 @param Ohc UHC private data\r
1323 @param Index Index of the port\r
1324 @param Field Field to get\r
1325\r
1326 @retval Value of the field and index\r
1327\r
1328**/\r
1329\r
1330UINT32\r
1331OhciReadRootHubPortStatus (\r
1332 IN USB_OHCI_HC_DEV *Ohc,\r
1333 IN UINT32 Index,\r
1334 IN UINTN Field\r
1335 )\r
1336{\r
1337 HcRHPORT_STATUS PortStatus;\r
1338\r
1339 *(UINT32 *) &PortStatus = OhciGetOperationalReg (\r
1340 Ohc,\r
1341 HC_RH_PORT_STATUS + (Index * 4)\r
1342 );\r
1343\r
1344 switch (Field){\r
1345 case RH_CURR_CONNECT_STAT:\r
1346 return PortStatus.CurrentConnectStat;\r
1347 break;\r
1348 case RH_PORT_ENABLE_STAT:\r
1349 return PortStatus.EnableStat;\r
1350 break;\r
1351 case RH_PORT_SUSPEND_STAT:\r
1352 return PortStatus.SuspendStat;\r
1353 break;\r
1354 case RH_PORT_OC_INDICATOR:\r
1355 return PortStatus.OCIndicator;\r
1356 break;\r
1357 case RH_PORT_RESET_STAT:\r
1358 return PortStatus.ResetStat;\r
1359 break;\r
1360 case RH_PORT_POWER_STAT:\r
1361 return PortStatus.PowerStat;\r
1362 break;\r
1363 case RH_LSDEVICE_ATTACHED:\r
1364 return PortStatus.LsDeviceAttached;\r
1365 break;\r
1366 case RH_CONNECT_STATUS_CHANGE:\r
1367 return PortStatus.ConnectStatChange;\r
1368 break;\r
1369 case RH_PORT_ENABLE_STAT_CHANGE:\r
1370 return PortStatus.EnableStatChange;\r
1371 break;\r
1372 case RH_PORT_SUSPEND_STAT_CHANGE:\r
1373 return PortStatus.SuspendStatChange;\r
1374 break;\r
1375 case RH_OC_INDICATOR_CHANGE:\r
1376 return PortStatus.OCIndicatorChange;\r
1377 break;\r
1378 case RH_PORT_RESET_STAT_CHANGE:\r
1379 return PortStatus.ResetStatChange;\r
1380 break;\r
1381 default:\r
1382 ASSERT (FALSE);\r
1383 }\r
1384\r
1385 return 0;\r
1386}\r