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