cs5536_acc.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /*
  2. * the ACC 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_acc_write_reg(int reg, u32 value)
  18. {
  19. u32 hi = 0, lo = value;
  20. switch (reg) {
  21. case PCI_COMMAND:
  22. _rdmsr(GLIU_MSR_REG(GLIU_PAE), &hi, &lo);
  23. if (value & PCI_COMMAND_MASTER)
  24. lo |= (0x03 << 8);
  25. else
  26. lo &= ~(0x03 << 8);
  27. _wrmsr(GLIU_MSR_REG(GLIU_PAE), hi, lo);
  28. break;
  29. case PCI_STATUS:
  30. if (value & PCI_STATUS_PARITY) {
  31. _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
  32. if (lo & SB_PARE_ERR_FLAG) {
  33. lo = (lo & 0x0000ffff) | SB_PARE_ERR_FLAG;
  34. _wrmsr(SB_MSR_REG(SB_ERROR), hi, lo);
  35. }
  36. }
  37. break;
  38. case PCI_BAR0_REG:
  39. if (value == PCI_BAR_RANGE_MASK) {
  40. _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
  41. lo |= SOFT_BAR_ACC_FLAG;
  42. _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
  43. } else if (value & 0x01) {
  44. value &= 0xfffffffc;
  45. hi = 0xA0000000 | ((value & 0x000ff000) >> 12);
  46. lo = 0x000fff80 | ((value & 0x00000fff) << 20);
  47. _wrmsr(GLIU_MSR_REG(GLIU_IOD_BM1), hi, lo);
  48. }
  49. break;
  50. case PCI_ACC_INT_REG:
  51. _rdmsr(DIVIL_MSR_REG(PIC_YSEL_LOW), &hi, &lo);
  52. /* disable all the usb interrupt in PIC */
  53. lo &= ~(0xf << PIC_YSEL_LOW_ACC_SHIFT);
  54. if (value) /* enable all the acc interrupt in PIC */
  55. lo |= (CS5536_ACC_INTR << PIC_YSEL_LOW_ACC_SHIFT);
  56. _wrmsr(DIVIL_MSR_REG(PIC_YSEL_LOW), hi, lo);
  57. break;
  58. default:
  59. break;
  60. }
  61. }
  62. u32 pci_acc_read_reg(int reg)
  63. {
  64. u32 hi, lo;
  65. u32 conf_data = 0;
  66. switch (reg) {
  67. case PCI_VENDOR_ID:
  68. conf_data =
  69. CFG_PCI_VENDOR_ID(CS5536_ACC_DEVICE_ID, CS5536_VENDOR_ID);
  70. break;
  71. case PCI_COMMAND:
  72. _rdmsr(GLIU_MSR_REG(GLIU_IOD_BM1), &hi, &lo);
  73. if (((lo & 0xfff00000) || (hi & 0x000000ff))
  74. && ((hi & 0xf0000000) == 0xa0000000))
  75. conf_data |= PCI_COMMAND_IO;
  76. _rdmsr(GLIU_MSR_REG(GLIU_PAE), &hi, &lo);
  77. if ((lo & 0x300) == 0x300)
  78. conf_data |= PCI_COMMAND_MASTER;
  79. break;
  80. case PCI_STATUS:
  81. conf_data |= PCI_STATUS_66MHZ;
  82. conf_data |= PCI_STATUS_FAST_BACK;
  83. _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
  84. if (lo & SB_PARE_ERR_FLAG)
  85. conf_data |= PCI_STATUS_PARITY;
  86. conf_data |= PCI_STATUS_DEVSEL_MEDIUM;
  87. break;
  88. case PCI_CLASS_REVISION:
  89. _rdmsr(ACC_MSR_REG(ACC_CAP), &hi, &lo);
  90. conf_data = lo & 0x000000ff;
  91. conf_data |= (CS5536_ACC_CLASS_CODE << 8);
  92. break;
  93. case PCI_CACHE_LINE_SIZE:
  94. conf_data =
  95. CFG_PCI_CACHE_LINE_SIZE(PCI_NORMAL_HEADER_TYPE,
  96. PCI_NORMAL_LATENCY_TIMER);
  97. break;
  98. case PCI_BAR0_REG:
  99. _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
  100. if (lo & SOFT_BAR_ACC_FLAG) {
  101. conf_data = CS5536_ACC_RANGE |
  102. PCI_BASE_ADDRESS_SPACE_IO;
  103. lo &= ~SOFT_BAR_ACC_FLAG;
  104. _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
  105. } else {
  106. _rdmsr(GLIU_MSR_REG(GLIU_IOD_BM1), &hi, &lo);
  107. conf_data = (hi & 0x000000ff) << 12;
  108. conf_data |= (lo & 0xfff00000) >> 20;
  109. conf_data |= 0x01;
  110. conf_data &= ~0x02;
  111. }
  112. break;
  113. case PCI_CARDBUS_CIS:
  114. conf_data = PCI_CARDBUS_CIS_POINTER;
  115. break;
  116. case PCI_SUBSYSTEM_VENDOR_ID:
  117. conf_data =
  118. CFG_PCI_VENDOR_ID(CS5536_ACC_SUB_ID, CS5536_SUB_VENDOR_ID);
  119. break;
  120. case PCI_ROM_ADDRESS:
  121. conf_data = PCI_EXPANSION_ROM_BAR;
  122. break;
  123. case PCI_CAPABILITY_LIST:
  124. conf_data = PCI_CAPLIST_USB_POINTER;
  125. break;
  126. case PCI_INTERRUPT_LINE:
  127. conf_data =
  128. CFG_PCI_INTERRUPT_LINE(PCI_DEFAULT_PIN, CS5536_ACC_INTR);
  129. break;
  130. default:
  131. break;
  132. }
  133. return conf_data;
  134. }