mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 21:42:43 +00:00 
			
		
		
		
	Kernel/Graphics: Force BGR format when modesetting the bochs-display
By default bochs-display uses the BGR format, but for future-proof solution, let's force it explicitly to use that format.
This commit is contained in:
		
							parent
							
								
									d36e3af7be
								
							
						
					
					
						commit
						de1b649783
					
				
					 2 changed files with 35 additions and 0 deletions
				
			
		|  | @ -32,6 +32,8 @@ | ||||||
| #define VBE_DISPI_DISABLED 0x00 | #define VBE_DISPI_DISABLED 0x00 | ||||||
| #define VBE_DISPI_ENABLED 0x01 | #define VBE_DISPI_ENABLED 0x01 | ||||||
| #define VBE_DISPI_LFB_ENABLED 0x40 | #define VBE_DISPI_LFB_ENABLED 0x40 | ||||||
|  | #define BOCHS_DISPLAY_LITTLE_ENDIAN 0x1e1e1e1e | ||||||
|  | #define BOCHS_DISPLAY_BIG_ENDIAN 0xbebebebe | ||||||
| 
 | 
 | ||||||
| namespace Kernel { | namespace Kernel { | ||||||
| 
 | 
 | ||||||
|  | @ -48,11 +50,18 @@ struct [[gnu::packed]] DISPIInterface { | ||||||
|     u16 y_offset; |     u16 y_offset; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | struct [[gnu::packed]] ExtensionRegisters { | ||||||
|  |     u32 region_size; | ||||||
|  |     u32 framebuffer_byteorder; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| struct [[gnu::packed]] BochsDisplayMMIORegisters { | struct [[gnu::packed]] BochsDisplayMMIORegisters { | ||||||
|     u8 edid_data[0x400]; |     u8 edid_data[0x400]; | ||||||
|     u16 vga_ioports[0x10]; |     u16 vga_ioports[0x10]; | ||||||
|     u8 reserved[0xE0]; |     u8 reserved[0xE0]; | ||||||
|     DISPIInterface bochs_regs; |     DISPIInterface bochs_regs; | ||||||
|  |     u8 reserved2[0x100 - sizeof(DISPIInterface)]; | ||||||
|  |     ExtensionRegisters extension_regs; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| UNMAP_AFTER_INIT NonnullRefPtr<BochsGraphicsAdapter> BochsGraphicsAdapter::initialize(PCI::Address address) | UNMAP_AFTER_INIT NonnullRefPtr<BochsGraphicsAdapter> BochsGraphicsAdapter::initialize(PCI::Address address) | ||||||
|  | @ -62,6 +71,28 @@ UNMAP_AFTER_INIT NonnullRefPtr<BochsGraphicsAdapter> BochsGraphicsAdapter::initi | ||||||
|     return adopt_ref(*new BochsGraphicsAdapter(address)); |     return adopt_ref(*new BochsGraphicsAdapter(address)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void BochsGraphicsAdapter::set_framebuffer_to_big_endian_format() | ||||||
|  | { | ||||||
|  |     dbgln_if(BXVGA_DEBUG, "BochsGraphicsAdapter set_framebuffer_to_big_endian_format"); | ||||||
|  |     full_memory_barrier(); | ||||||
|  |     if (m_registers->extension_regs.region_size == 0xFFFFFFFF || m_registers->extension_regs.region_size == 0) | ||||||
|  |         return; | ||||||
|  |     full_memory_barrier(); | ||||||
|  |     m_registers->extension_regs.framebuffer_byteorder = BOCHS_DISPLAY_BIG_ENDIAN; | ||||||
|  |     full_memory_barrier(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void BochsGraphicsAdapter::set_framebuffer_to_little_endian_format() | ||||||
|  | { | ||||||
|  |     dbgln_if(BXVGA_DEBUG, "BochsGraphicsAdapter set_framebuffer_to_little_endian_format"); | ||||||
|  |     full_memory_barrier(); | ||||||
|  |     if (m_registers->extension_regs.region_size == 0xFFFFFFFF || m_registers->extension_regs.region_size == 0) | ||||||
|  |         return; | ||||||
|  |     full_memory_barrier(); | ||||||
|  |     m_registers->extension_regs.framebuffer_byteorder = BOCHS_DISPLAY_LITTLE_ENDIAN; | ||||||
|  |     full_memory_barrier(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| UNMAP_AFTER_INIT BochsGraphicsAdapter::BochsGraphicsAdapter(PCI::Address pci_address) | UNMAP_AFTER_INIT BochsGraphicsAdapter::BochsGraphicsAdapter(PCI::Address pci_address) | ||||||
|     : PCI::Device(pci_address) |     : PCI::Device(pci_address) | ||||||
|     , m_mmio_registers(PCI::get_BAR2(pci_address) & 0xfffffff0) |     , m_mmio_registers(PCI::get_BAR2(pci_address) & 0xfffffff0) | ||||||
|  | @ -153,6 +184,7 @@ void BochsGraphicsAdapter::set_resolution_registers(size_t width, size_t height) | ||||||
|     m_registers->bochs_regs.enable = VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED; |     m_registers->bochs_regs.enable = VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED; | ||||||
|     full_memory_barrier(); |     full_memory_barrier(); | ||||||
|     m_registers->bochs_regs.bank = 0; |     m_registers->bochs_regs.bank = 0; | ||||||
|  |     set_framebuffer_to_little_endian_format(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool BochsGraphicsAdapter::try_to_set_resolution(size_t output_port_index, size_t width, size_t height) | bool BochsGraphicsAdapter::try_to_set_resolution(size_t output_port_index, size_t width, size_t height) | ||||||
|  |  | ||||||
|  | @ -56,6 +56,9 @@ private: | ||||||
|     bool validate_setup_resolution_with_io(size_t width, size_t height); |     bool validate_setup_resolution_with_io(size_t width, size_t height); | ||||||
|     void set_y_offset(size_t); |     void set_y_offset(size_t); | ||||||
| 
 | 
 | ||||||
|  |     void set_framebuffer_to_big_endian_format(); | ||||||
|  |     void set_framebuffer_to_little_endian_format(); | ||||||
|  | 
 | ||||||
|     PhysicalAddress m_mmio_registers; |     PhysicalAddress m_mmio_registers; | ||||||
|     Memory::TypedMapping<BochsDisplayMMIORegisters volatile> m_registers; |     Memory::TypedMapping<BochsDisplayMMIORegisters volatile> m_registers; | ||||||
|     RefPtr<FramebufferDevice> m_framebuffer_device; |     RefPtr<FramebufferDevice> m_framebuffer_device; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Liav A
						Liav A