Initializer.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include <Kernel/ACPI/ACPIParser.h>
  2. #include <Kernel/IO.h>
  3. #include <Kernel/KParams.h>
  4. #include <Kernel/PCI/IOAccess.h>
  5. #include <Kernel/PCI/Initializer.h>
  6. #include <Kernel/PCI/MMIOAccess.h>
  7. static PCI::Initializer* s_pci_initializer;
  8. PCI::Initializer& PCI::Initializer::the()
  9. {
  10. if (s_pci_initializer == nullptr) {
  11. s_pci_initializer = new PCI::Initializer();
  12. }
  13. return *s_pci_initializer;
  14. }
  15. void PCI::Initializer::initialize_pci_mmio_access(ACPI_RAW::MCFG& mcfg)
  16. {
  17. PCI::MMIOAccess::initialize(mcfg);
  18. }
  19. void PCI::Initializer::initialize_pci_io_access()
  20. {
  21. PCI::IOAccess::initialize();
  22. }
  23. void PCI::Initializer::test_and_initialize(bool disable_pci_mmio)
  24. {
  25. if (disable_pci_mmio) {
  26. if (test_pci_io()) {
  27. initialize_pci_io_access();
  28. } else {
  29. kprintf("No PCI Bus Access Method Detected, Halt!\n");
  30. ASSERT_NOT_REACHED(); // NO PCI Access ?!
  31. }
  32. return;
  33. }
  34. if (test_acpi()) {
  35. if (test_pci_mmio()) {
  36. initialize_pci_mmio_access_after_test();
  37. } else {
  38. if (test_pci_io()) {
  39. initialize_pci_io_access();
  40. } else {
  41. kprintf("No PCI Bus Access Method Detected, Halt!\n");
  42. ASSERT_NOT_REACHED(); // NO PCI Access ?!
  43. }
  44. }
  45. } else {
  46. if (test_pci_io()) {
  47. initialize_pci_io_access();
  48. } else {
  49. kprintf("No PCI Bus Access Method Detected, Halt!\n");
  50. ASSERT_NOT_REACHED(); // NO PCI Access ?!
  51. }
  52. }
  53. }
  54. PCI::Initializer::Initializer()
  55. {
  56. }
  57. bool PCI::Initializer::test_acpi()
  58. {
  59. if ((KParams::the().has("noacpi")) || !ACPIParser::the().is_operable())
  60. return false;
  61. else
  62. return true;
  63. }
  64. bool PCI::Initializer::test_pci_io()
  65. {
  66. kprintf("Testing PCI via manual probing... ");
  67. u32 tmp = 0x80000000;
  68. IO::out32(PCI_ADDRESS_PORT, tmp);
  69. tmp = IO::in32(PCI_ADDRESS_PORT);
  70. if (tmp == 0x80000000) {
  71. kprintf("PCI IO Supported!\n");
  72. return true;
  73. }
  74. kprintf("PCI IO Not Supported!\n");
  75. return false;
  76. }
  77. bool PCI::Initializer::test_pci_mmio()
  78. {
  79. if (ACPIParser::the().find_table("MCFG") != nullptr)
  80. return true;
  81. else
  82. return false;
  83. }
  84. void PCI::Initializer::initialize_pci_mmio_access_after_test()
  85. {
  86. initialize_pci_mmio_access(*(ACPI_RAW::MCFG*)(ACPIParser::the().find_table("MCFG")));
  87. }
  88. void PCI::Initializer::dismiss()
  89. {
  90. if (s_pci_initializer == nullptr)
  91. return;
  92. kprintf("PCI Subsystem Initializer dismissed.\n");
  93. delete s_pci_initializer;
  94. s_pci_initializer = nullptr;
  95. }
  96. PCI::Initializer::~Initializer()
  97. {
  98. }