| 70 | } |
| 71 | |
| 72 | BAN::ErrorOr<void> FramebufferDevice::initialize() |
| 73 | { |
| 74 | size_t video_memory_pages = range_page_count(m_video_memory_paddr, m_height * m_pitch); |
| 75 | m_video_memory_vaddr = PageTable::kernel().reserve_free_contiguous_pages(video_memory_pages, KERNEL_OFFSET); |
| 76 | if (m_video_memory_vaddr == 0) |
| 77 | return BAN::Error::from_errno(ENOMEM); |
| 78 | PageTable::kernel().map_range_at( |
| 79 | m_video_memory_paddr & PAGE_ADDR_MASK, |
| 80 | m_video_memory_vaddr, |
| 81 | video_memory_pages * PAGE_SIZE, |
| 82 | PageTable::Flags::ReadWrite | PageTable::Flags::Present, |
| 83 | PageTable::WriteCombining |
| 84 | ); |
| 85 | |
| 86 | m_video_buffer = TRY(VirtualRange::create_to_vaddr_range( |
| 87 | PageTable::kernel(), |
| 88 | { KERNEL_OFFSET, UINTPTR_MAX }, |
| 89 | BAN::Math::div_round_up<size_t>(m_width * m_height * (BANAN_FB_BPP / 8), PAGE_SIZE) * PAGE_SIZE, |
| 90 | PageTable::Flags::ReadWrite | PageTable::Flags::Present, |
| 91 | false |
| 92 | )); |
| 93 | |
| 94 | return {}; |
| 95 | } |
| 96 | |
| 97 | BAN::ErrorOr<size_t> FramebufferDevice::read_impl(off_t offset, BAN::ByteSpan buffer) |
| 98 | { |
no test coverage detected