GraphicsAdapter.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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/String.h>
  8. #include <AK/Types.h>
  9. #include <Kernel/Bus/PCI/Device.h>
  10. #include <Kernel/Graphics/Console/GenericFramebufferConsole.h>
  11. #include <Kernel/Graphics/FramebufferDevice.h>
  12. #include <Kernel/Graphics/GraphicsDevice.h>
  13. #include <Kernel/Memory/TypedMapping.h>
  14. #include <Kernel/PhysicalAddress.h>
  15. namespace Kernel {
  16. class GraphicsManagement;
  17. struct BochsDisplayMMIORegisters;
  18. class BochsGraphicsAdapter final : public GraphicsDevice
  19. , public PCI::Device {
  20. AK_MAKE_ETERNAL
  21. friend class GraphicsManagement;
  22. public:
  23. static NonnullRefPtr<BochsGraphicsAdapter> initialize(PCI::Address);
  24. virtual ~BochsGraphicsAdapter() = default;
  25. virtual bool framebuffer_devices_initialized() const override { return !m_framebuffer_device.is_null(); }
  26. virtual bool modesetting_capable() const override { return true; }
  27. virtual bool double_framebuffering_capable() const override { return true; }
  28. private:
  29. // ^GraphicsDevice
  30. virtual bool try_to_set_resolution(size_t output_port_index, size_t width, size_t height) override;
  31. virtual bool set_y_offset(size_t output_port_index, size_t y) override;
  32. virtual void initialize_framebuffer_devices() override;
  33. virtual Type type() const override;
  34. virtual void enable_consoles() override;
  35. virtual void disable_consoles() override;
  36. explicit BochsGraphicsAdapter(PCI::Address);
  37. void set_safe_resolution();
  38. void unblank();
  39. bool validate_setup_resolution(size_t width, size_t height);
  40. u32 find_framebuffer_address();
  41. void set_resolution_registers(size_t width, size_t height);
  42. void set_resolution_registers_via_io(size_t width, size_t height);
  43. bool validate_setup_resolution_with_io(size_t width, size_t height);
  44. void set_y_offset(size_t);
  45. PhysicalAddress m_mmio_registers;
  46. Memory::TypedMapping<BochsDisplayMMIORegisters volatile> m_registers;
  47. RefPtr<FramebufferDevice> m_framebuffer_device;
  48. RefPtr<Graphics::GenericFramebufferConsole> m_framebuffer_console;
  49. Spinlock<u8> m_console_mode_switch_lock;
  50. bool m_console_enabled { false };
  51. bool m_io_required { false };
  52. };
  53. }