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