3#include "pedigree/kernel/BootstrapInfo.h"
4#include "pedigree/kernel/Service.h"
5#include "pedigree/kernel/ServiceFeatures.h"
6#include "pedigree/kernel/ServiceManager.h"
7#include "pedigree/kernel/graphics/Graphics.h"
8#include "pedigree/kernel/graphics/GraphicsService.h"
9#include "pedigree/kernel/machine/Display.h"
10#include "pedigree/kernel/machine/Framebuffer.h"
11#include "pedigree/kernel/processor/MemoryRegion.h"
12#include "pedigree/kernel/processor/PhysicalMemoryManager.h"
13#include "pedigree/kernel/processor/VirtualAddressSpace.h"
14#include "pedigree/kernel/utilities/List.h"
15#include "pedigree/kernel/utilities/String.h"
17#include "modules/Module.h"
23 UefiFramebuffer() :
Framebuffer(), m_Region(
"UEFI GOP framebuffer"), m_Offset(0) {}
26 if (!info.address || !info.width || !info.height ||
27 info.pitch <
static_cast<uint64_t
>(info.width) * 4 || info.format > 1) {
31 const uint64_t bytes =
static_cast<uint64_t
>(info.pitch) * info.height;
32 if (!bytes || bytes > SIZE_MAX) {
37 m_Offset = info.address & (pageSize - 1);
38 const size_t pages = (
static_cast<size_t>(bytes) + m_Offset + pageSize - 1) / pageSize;
45 info.address - m_Offset)) {
50 setHeight(info.height);
52 setBytesPerLine(info.pitch);
53 setFormat(info.format == 0 ? Graphics::Bits32_Bgr : Graphics::Bits32_Rgb);
57 setFramebuffer(
reinterpret_cast<uintptr_t
>(m_Region.virtualAddress()) + m_Offset);
62 const size_t bytes = getHeight() * getBytesPerLine();
63 if (offset >= bytes) {
64 return ~physical_uintptr_t(0);
68 return m_Region.physicalAddress() + m_Offset + offset;
72 void hwRedraw(
size_t,
size_t,
size_t,
size_t)
override {}
79class UefiDisplay final :
public Display {
82 :
Display(), m_pFramebuffer(framebuffer), m_Mode() {
84 m_Mode.width = info.width;
85 m_Mode.height = info.height;
87 m_Mode.framebuffer = info.address;
89 m_Mode.pf.pRed = info.format == 0 ? 0 : 16;
93 m_Mode.pf.pBlue = info.format == 0 ? 16 : 0;
95 m_Mode.pf.pAlpha = 24;
97 m_Mode.pf.nPitch = info.pitch;
98 m_Mode.pf2 = framebuffer->getFormat();
99 m_Mode.bytesPerLine = info.pitch;
100 m_Mode.bytesPerPixel = 4;
101 m_Mode.textMode =
false;
106 return m_pFramebuffer->getRawBuffer();
120 ScreenMode* mode =
new ScreenMode(m_Mode);
129 return mode.id == m_Mode.id && mode.width == m_Mode.width && mode.height == m_Mode.height &&
130 mode.pf.nBpp == m_Mode.pf.nBpp;
136 return modeId == 0 || modeId == m_Mode.id;
139 bool setScreenMode(
size_t width,
size_t height,
size_t bpp)
override {
140 return width == m_Mode.width && height == m_Mode.height && bpp == m_Mode.pf.nBpp;
144 UefiFramebuffer* m_pFramebuffer;
148UefiDisplay* g_pDisplay =
nullptr;
149UefiFramebuffer* g_pFramebuffer =
nullptr;
157 if (!g_pBootstrapInfo || !g_pBootstrapInfo->isUefi()) {
162 if (!g_pBootstrapInfo->getFramebuffer(info)) {
166 g_pFramebuffer =
new UefiFramebuffer;
167 if (!g_pFramebuffer || !g_pFramebuffer->initialise(info)) {
168 delete g_pFramebuffer;
169 g_pFramebuffer =
nullptr;
173 g_pDisplay =
new UefiDisplay(g_pFramebuffer, info);
175 if (!g_pDisplay || !g_pProvider) {
178 delete g_pFramebuffer;
179 g_pProvider =
nullptr;
180 g_pDisplay =
nullptr;
181 g_pFramebuffer =
nullptr;
185 g_pProvider->pDisplay = g_pDisplay;
186 g_pProvider->pFramebuffer = g_pFramebuffer;
187 g_pProvider->maxWidth = info.width;
188 g_pProvider->maxHeight = info.height;
189 g_pProvider->maxDepth = 32;
190 g_pProvider->maxTextWidth = 0;
191 g_pProvider->maxTextHeight = 0;
192 g_pProvider->bHardwareAccel =
false;
202 delete g_pFramebuffer;
203 g_pProvider =
nullptr;
204 g_pDisplay =
nullptr;
205 g_pFramebuffer =
nullptr;
209 NOTICE(
"UEFI GOP: registered fixed " <<
Dec << info.width <<
"x" << info.height <<
"x32 display");
217MODULE_INFO(
"uefi-gfx", &entry, &exit);
virtual void setSpecificType(String str)
virtual bool getPixelFormat(PixelFormat &pf)
virtual void * getFramebuffer()
virtual bool getCurrentScreenMode(ScreenMode &sm)
virtual bool getScreenModes(List< ScreenMode * > &sms)
virtual bool setScreenMode(ScreenMode sm)
virtual void hwRedraw(size_t x=~0UL, size_t y=~0UL, size_t w=~0UL, size_t h=~0UL)
Inherited by drivers that provide a hardware redraw function.
virtual physical_uintptr_t getPhysicalPage(size_t offset) const
Special memory entity in the kernel's virtual address space.
static const size_t continuous
static PhysicalMemoryManager & instance()
static constexpr size_t getPageSize() PURE
static const size_t force
static const size_t nonRamMemory
virtual bool allocateRegion(MemoryRegion &Region, size_t cPages, size_t pageConstraints, size_t Flags, physical_uintptr_t start=-1)=0
virtual bool provides(Type service)
Service * getService(const String &serviceName)
ServiceFeatures * enumerateOperations(const String &serviceName)
virtual bool serve(ServiceFeatures::Type type, void *pData, size_t dataLen)=0
static const size_t CacheDisable
static const size_t KernelMode
static const size_t Write
void pushBack(const T &value)
bool bFirmwareFallback
Firmware scanout is a fallback once a native driver owns the display.