MMIOAccess.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/HashMap.h>
  8. #include <AK/NonnullOwnPtrVector.h>
  9. #include <AK/OwnPtr.h>
  10. #include <AK/Types.h>
  11. #include <Kernel/ACPI/Definitions.h>
  12. #include <Kernel/Bus/PCI/Access.h>
  13. #include <Kernel/Locking/Spinlock.h>
  14. #include <Kernel/Memory/AnonymousVMObject.h>
  15. #include <Kernel/Memory/PhysicalRegion.h>
  16. #include <Kernel/Memory/Region.h>
  17. #include <Kernel/Memory/VMObject.h>
  18. namespace Kernel {
  19. namespace PCI {
  20. #define PCI_MMIO_CONFIG_SPACE_SIZE 4096
  21. class MMIOAccess : public Access {
  22. public:
  23. class MMIOSegment {
  24. public:
  25. MMIOSegment(PhysicalAddress, u8, u8);
  26. u8 get_start_bus() const;
  27. u8 get_end_bus() const;
  28. size_t get_size() const;
  29. PhysicalAddress get_paddr() const;
  30. private:
  31. PhysicalAddress m_base_addr;
  32. u8 m_start_bus;
  33. u8 m_end_bus;
  34. };
  35. static void initialize(PhysicalAddress mcfg);
  36. private:
  37. PhysicalAddress determine_memory_mapped_bus_region(u32 segment, u8 bus) const;
  38. void map_bus_region(u32, u8);
  39. VirtualAddress get_device_configuration_space(Address address);
  40. Spinlock<u8> m_access_lock;
  41. u8 m_mapped_bus { 0 };
  42. OwnPtr<Memory::Region> m_mapped_region;
  43. protected:
  44. explicit MMIOAccess(PhysicalAddress mcfg);
  45. virtual u32 segment_count() const override;
  46. virtual void enumerate_hardware(Function<void(Address, ID)>) override;
  47. virtual void write8_field(Address address, u32, u8) override;
  48. virtual void write16_field(Address address, u32, u16) override;
  49. virtual void write32_field(Address address, u32, u32) override;
  50. virtual u8 read8_field(Address address, u32) override;
  51. virtual u16 read16_field(Address address, u32) override;
  52. virtual u32 read32_field(Address address, u32) override;
  53. virtual u8 segment_start_bus(u32) const override;
  54. virtual u8 segment_end_bus(u32) const override;
  55. PhysicalAddress m_mcfg;
  56. HashMap<u16, MMIOSegment> m_segments;
  57. };
  58. }
  59. }