cs5536_ehci.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. * the EHCI Virtual Support Module of AMD CS5536
  3. *
  4. * Copyright (C) 2007 Lemote, Inc.
  5. * Author : jlliu, liujl@lemote.com
  6. *
  7. * Copyright (C) 2009 Lemote, Inc.
  8. * Author: Wu Zhangjin, wuzhangjin@gmail.com
  9. *
  10. * This program is free software; you can redistribute it and/or modify it
  11. * under the terms of the GNU General Public License as published by the
  12. * Free Software Foundation; either version 2 of the License, or (at your
  13. * option) any later version.
  14. */
  15. #include <cs5536/cs5536.h>
  16. #include <cs5536/cs5536_pci.h>
  17. void pci_ehci_write_reg(int reg, u32 value)
  18. {
  19. u32 hi = 0, lo = value;
  20. switch (reg) {
  21. case PCI_COMMAND:
  22. _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
  23. if (value & PCI_COMMAND_MASTER)
  24. hi |= PCI_COMMAND_MASTER;
  25. else
  26. hi &= ~PCI_COMMAND_MASTER;
  27. if (value & PCI_COMMAND_MEMORY)
  28. hi |= PCI_COMMAND_MEMORY;
  29. else
  30. hi &= ~PCI_COMMAND_MEMORY;
  31. _wrmsr(USB_MSR_REG(USB_EHCI), hi, lo);
  32. break;
  33. case PCI_STATUS:
  34. if (value & PCI_STATUS_PARITY) {
  35. _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
  36. if (lo & SB_PARE_ERR_FLAG) {
  37. lo = (lo & 0x0000ffff) | SB_PARE_ERR_FLAG;
  38. _wrmsr(SB_MSR_REG(SB_ERROR), hi, lo);
  39. }
  40. }
  41. break;
  42. case PCI_BAR0_REG:
  43. if (value == PCI_BAR_RANGE_MASK) {
  44. _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
  45. lo |= SOFT_BAR_EHCI_FLAG;
  46. _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
  47. } else if ((value & 0x01) == 0x00) {
  48. _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
  49. lo = value;
  50. _wrmsr(USB_MSR_REG(USB_EHCI), hi, lo);
  51. value &= 0xfffffff0;
  52. hi = 0x40000000 | ((value & 0xff000000) >> 24);
  53. lo = 0x000fffff | ((value & 0x00fff000) << 8);
  54. _wrmsr(GLIU_MSR_REG(GLIU_P2D_BM4), hi, lo);
  55. }
  56. break;
  57. case PCI_EHCI_LEGSMIEN_REG:
  58. _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
  59. hi &= 0x003f0000;
  60. hi |= (value & 0x3f) << 16;
  61. _wrmsr(USB_MSR_REG(USB_EHCI), hi, lo);
  62. break;
  63. case PCI_EHCI_FLADJ_REG:
  64. _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
  65. hi &= ~0x00003f00;
  66. hi |= value & 0x00003f00;
  67. _wrmsr(USB_MSR_REG(USB_EHCI), hi, lo);
  68. break;
  69. default:
  70. break;
  71. }
  72. }
  73. u32 pci_ehci_read_reg(int reg)
  74. {
  75. u32 conf_data = 0;
  76. u32 hi, lo;
  77. switch (reg) {
  78. case PCI_VENDOR_ID:
  79. conf_data =
  80. CFG_PCI_VENDOR_ID(CS5536_EHCI_DEVICE_ID, CS5536_VENDOR_ID);
  81. break;
  82. case PCI_COMMAND:
  83. _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
  84. if (hi & PCI_COMMAND_MASTER)
  85. conf_data |= PCI_COMMAND_MASTER;
  86. if (hi & PCI_COMMAND_MEMORY)
  87. conf_data |= PCI_COMMAND_MEMORY;
  88. break;
  89. case PCI_STATUS:
  90. conf_data |= PCI_STATUS_66MHZ;
  91. conf_data |= PCI_STATUS_FAST_BACK;
  92. _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
  93. if (lo & SB_PARE_ERR_FLAG)
  94. conf_data |= PCI_STATUS_PARITY;
  95. conf_data |= PCI_STATUS_DEVSEL_MEDIUM;
  96. break;
  97. case PCI_CLASS_REVISION:
  98. _rdmsr(USB_MSR_REG(USB_CAP), &hi, &lo);
  99. conf_data = lo & 0x000000ff;
  100. conf_data |= (CS5536_EHCI_CLASS_CODE << 8);
  101. break;
  102. case PCI_CACHE_LINE_SIZE:
  103. conf_data =
  104. CFG_PCI_CACHE_LINE_SIZE(PCI_NORMAL_HEADER_TYPE,
  105. PCI_NORMAL_LATENCY_TIMER);
  106. break;
  107. case PCI_BAR0_REG:
  108. _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
  109. if (lo & SOFT_BAR_EHCI_FLAG) {
  110. conf_data = CS5536_EHCI_RANGE |
  111. PCI_BASE_ADDRESS_SPACE_MEMORY;
  112. lo &= ~SOFT_BAR_EHCI_FLAG;
  113. _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
  114. } else {
  115. _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
  116. conf_data = lo & 0xfffff000;
  117. }
  118. break;
  119. case PCI_CARDBUS_CIS:
  120. conf_data = PCI_CARDBUS_CIS_POINTER;
  121. break;
  122. case PCI_SUBSYSTEM_VENDOR_ID:
  123. conf_data =
  124. CFG_PCI_VENDOR_ID(CS5536_EHCI_SUB_ID, CS5536_SUB_VENDOR_ID);
  125. break;
  126. case PCI_ROM_ADDRESS:
  127. conf_data = PCI_EXPANSION_ROM_BAR;
  128. break;
  129. case PCI_CAPABILITY_LIST:
  130. conf_data = PCI_CAPLIST_USB_POINTER;
  131. break;
  132. case PCI_INTERRUPT_LINE:
  133. conf_data =
  134. CFG_PCI_INTERRUPT_LINE(PCI_DEFAULT_PIN, CS5536_USB_INTR);
  135. break;
  136. case PCI_EHCI_LEGSMIEN_REG:
  137. _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
  138. conf_data = (hi & 0x003f0000) >> 16;
  139. break;
  140. case PCI_EHCI_LEGSMISTS_REG:
  141. _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
  142. conf_data = (hi & 0x3f000000) >> 24;
  143. break;
  144. case PCI_EHCI_FLADJ_REG:
  145. _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
  146. conf_data = hi & 0x00003f00;
  147. break;
  148. default:
  149. break;
  150. }
  151. return conf_data;
  152. }