Skip to content

Commit

Permalink
POC framebuffer/de: use vblank interrupt
Browse files Browse the repository at this point in the history
  • Loading branch information
cnuke committed Jun 26, 2023
1 parent 3f5bd93 commit dc52544
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 5 deletions.
2 changes: 1 addition & 1 deletion ports/a64_linux.hash
Original file line number Diff line number Diff line change
@@ -1 +1 @@
c552684c04213913e5a85fb40ed3b9220eb26d36
e0aa081d0d5397b038c4be565bf879f5615d6fd1
4 changes: 3 additions & 1 deletion ports/a64_linux.port
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ DIR(a64_linux) := src/linux
PATCHES := \
src/a64_linux/csi_ov5640_pm.patch \
src/a64_linux/remove_usbphy_role_switch.patch \
src/a64_linux/usb_message.patch
src/a64_linux/usb_message.patch \
src/a64_linux/drm_vblank.patch


#
# Just to make sure that the compiler will use the right header files
Expand Down
30 changes: 30 additions & 0 deletions src/a64_linux/drm_vblank.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
--- src/linux/drivers/gpu/drm/drm_vblank.c
+++ src/linux/drivers/gpu/drm/drm_vblank.c
@@ -159,7 +159,7 @@ drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,

static unsigned int drm_timestamp_precision = 20; /* Default to 20 usecs. */

-static int drm_vblank_offdelay = 5000; /* Default to 5000 msecs. */
+static int drm_vblank_offdelay = 0000; /* Default to 5000 msecs. */

module_param_named(vblankoffdelay, drm_vblank_offdelay, int, 0600);
module_param_named(timestamp_precision_usec, drm_timestamp_precision, int, 0600);
--- src/linux/drivers/gpu/drm/sun4i/sun4i_tcon.c
+++ src/linux/drivers/gpu/drm/sun4i/sun4i_tcon.c
@@ -791,6 +791,8 @@ static void sun4i_tcon_finish_page_flip(struct drm_device *dev,
spin_unlock_irqrestore(&dev->event_lock, flags);
}

+extern void lx_emul_framebuffer_vblank(void);
+
static irqreturn_t sun4i_tcon_handler(int irq, void *private)
{
struct sun4i_tcon *tcon = private;
@@ -807,6 +809,7 @@ static irqreturn_t sun4i_tcon_handler(int irq, void *private)
return IRQ_NONE;

drm_crtc_handle_vblank(&scrtc->crtc);
+ lx_emul_framebuffer_vblank();
sun4i_tcon_finish_page_flip(drm, scrtc);

/* Acknowledge the interrupt */
18 changes: 15 additions & 3 deletions src/drivers/framebuffer/de/main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,13 @@ struct Framebuffer::Driver

void handle_timer()
{
#if 0
static Genode::Milliseconds last_ms = timer.curr_time().trunc_to_plain_ms();
Genode::Milliseconds ms = timer.curr_time().trunc_to_plain_ms();
Genode::error(__func__, ": diff: ", ms.value - last_ms.value);
last_ms = ms;
#endif

if (fb.constructed()) { fb->paint(); }
}

Expand All @@ -88,9 +95,6 @@ struct Framebuffer::Driver

lx_emul_start_kernel(dtb_rom.local_addr<void>());
log("returned from lx_emul_start_kernel");

timer.sigh(timer_handler);
timer.trigger_periodic(20*1000);
}
};

Expand All @@ -102,6 +106,13 @@ static Framebuffer::Driver & driver(Genode::Env & env)
}


extern "C" void lx_emul_framebuffer_vblank(void)
{
Genode::Env & env = Lx_kit::env().env;
driver(env).handle_timer();
}


/**
* Can be called already as side-effect of `lx_emul_start_kernel`,
* that's why the Driver object needs to be constructed already here.
Expand All @@ -111,6 +122,7 @@ extern "C" void lx_emul_framebuffer_ready(void * base, unsigned long,
{
Genode::Env & env = Lx_kit::env().env;
driver(env).fb.construct(env, base, xres, yres);
driver(env).handle_timer();

Genode::log("--- framebuffer driver initialized ---");
}
Expand Down

0 comments on commit dc52544

Please sign in to comment.