提交 9a1f03f4 编写于 作者: P Peter Maydell

hw/display/bcm2835_fb: Abstract out calculation of pitch, size

Abstract out the calculation of the pitch and size of the
framebuffer into functions that operate on the BCM2835FBConfig
struct -- these are about to get a little more complicated
when we add support for virtual and physical sizes differing.
Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
Reviewed-by: NRichard Henderson <richard.henderson@linaro.org>
Message-id: 20180814144436.679-6-peter.maydell@linaro.org
上级 9e2938a0
...@@ -139,7 +139,7 @@ static void fb_update_display(void *opaque) ...@@ -139,7 +139,7 @@ static void fb_update_display(void *opaque)
return; return;
} }
src_width = s->config.xres * (s->config.bpp >> 3); src_width = bcm2835_fb_get_pitch(&s->config);
dest_width = s->config.xres; dest_width = s->config.xres;
switch (surface_bits_per_pixel(surface)) { switch (surface_bits_per_pixel(surface)) {
...@@ -204,8 +204,8 @@ static void bcm2835_fb_mbox_push(BCM2835FBState *s, uint32_t value) ...@@ -204,8 +204,8 @@ static void bcm2835_fb_mbox_push(BCM2835FBState *s, uint32_t value)
/* TODO - Manage properly virtual resolution */ /* TODO - Manage properly virtual resolution */
pitch = s->config.xres * (s->config.bpp >> 3); pitch = bcm2835_fb_get_pitch(&s->config);
size = s->config.yres * pitch; size = bcm2835_fb_get_size(&s->config);
stl_le_phys(&s->dma_as, value + 16, pitch); stl_le_phys(&s->dma_as, value + 16, pitch);
stl_le_phys(&s->dma_as, value + 32, s->config.base); stl_le_phys(&s->dma_as, value + 32, s->config.base);
......
...@@ -146,7 +146,7 @@ static void bcm2835_property_mbox_push(BCM2835PropertyState *s, uint32_t value) ...@@ -146,7 +146,7 @@ static void bcm2835_property_mbox_push(BCM2835PropertyState *s, uint32_t value)
case 0x00040001: /* Allocate buffer */ case 0x00040001: /* Allocate buffer */
stl_le_phys(&s->dma_as, value + 12, fbconfig.base); stl_le_phys(&s->dma_as, value + 12, fbconfig.base);
stl_le_phys(&s->dma_as, value + 16, stl_le_phys(&s->dma_as, value + 16,
fbconfig.xres * fbconfig.yres * fbconfig.bpp / 8); bcm2835_fb_get_size(&fbconfig));
resplen = 8; resplen = 8;
break; break;
case 0x00048001: /* Release buffer */ case 0x00048001: /* Release buffer */
...@@ -210,7 +210,7 @@ static void bcm2835_property_mbox_push(BCM2835PropertyState *s, uint32_t value) ...@@ -210,7 +210,7 @@ static void bcm2835_property_mbox_push(BCM2835PropertyState *s, uint32_t value)
break; break;
case 0x00040008: /* Get pitch */ case 0x00040008: /* Get pitch */
stl_le_phys(&s->dma_as, value + 12, stl_le_phys(&s->dma_as, value + 12,
fbconfig.xres * fbconfig.bpp / 8); bcm2835_fb_get_pitch(&fbconfig));
resplen = 4; resplen = 4;
break; break;
case 0x00040009: /* Get virtual offset */ case 0x00040009: /* Get virtual offset */
......
...@@ -52,4 +52,26 @@ typedef struct { ...@@ -52,4 +52,26 @@ typedef struct {
void bcm2835_fb_reconfigure(BCM2835FBState *s, BCM2835FBConfig *newconfig); void bcm2835_fb_reconfigure(BCM2835FBState *s, BCM2835FBConfig *newconfig);
/**
* bcm2835_fb_get_pitch: return number of bytes per line of the framebuffer
* @config: configuration info for the framebuffer
*
* Return the number of bytes per line of the framebuffer, ie the number
* that must be added to a pixel address to get the address of the pixel
* directly below it on screen.
*/
static inline uint32_t bcm2835_fb_get_pitch(BCM2835FBConfig *config)
{
return config->xres * (config->bpp >> 3);
}
/**
* bcm2835_fb_get_size: return total size of framebuffer in bytes
* @config: configuration info for the framebuffer
*/
static inline uint32_t bcm2835_fb_get_size(BCM2835FBConfig *config)
{
return config->yres * bcm2835_fb_get_pitch(config);
}
#endif #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册