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