xref: /qemu/include/hw/display/bcm2835_fb.h (revision 9a1f03f4ee207d58674fc76aecff546551c9da76)
15e9c2a8dSGrégory ESTRADE /*
25e9c2a8dSGrégory ESTRADE  * Raspberry Pi emulation (c) 2012 Gregory Estrade
35e9c2a8dSGrégory ESTRADE  * Upstreaming code cleanup [including bcm2835_*] (c) 2013 Jan Petrous
45e9c2a8dSGrégory ESTRADE  *
55e9c2a8dSGrégory ESTRADE  * Rasperry Pi 2 emulation and refactoring Copyright (c) 2015, Microsoft
65e9c2a8dSGrégory ESTRADE  * Written by Andrew Baumann
75e9c2a8dSGrégory ESTRADE  *
85e9c2a8dSGrégory ESTRADE  * This code is licensed under the GNU GPLv2 and later.
95e9c2a8dSGrégory ESTRADE  */
105e9c2a8dSGrégory ESTRADE 
115e9c2a8dSGrégory ESTRADE #ifndef BCM2835_FB_H
125e9c2a8dSGrégory ESTRADE #define BCM2835_FB_H
135e9c2a8dSGrégory ESTRADE 
145e9c2a8dSGrégory ESTRADE #include "hw/sysbus.h"
155e9c2a8dSGrégory ESTRADE #include "ui/console.h"
165e9c2a8dSGrégory ESTRADE 
175e9c2a8dSGrégory ESTRADE #define TYPE_BCM2835_FB "bcm2835-fb"
185e9c2a8dSGrégory ESTRADE #define BCM2835_FB(obj) OBJECT_CHECK(BCM2835FBState, (obj), TYPE_BCM2835_FB)
195e9c2a8dSGrégory ESTRADE 
20a02755ecSPeter Maydell /*
21a02755ecSPeter Maydell  * Configuration information about the fb which the guest can program
22a02755ecSPeter Maydell  * via the mailbox property interface.
23a02755ecSPeter Maydell  */
24a02755ecSPeter Maydell typedef struct {
25a02755ecSPeter Maydell     uint32_t xres, yres;
26a02755ecSPeter Maydell     uint32_t xres_virtual, yres_virtual;
27a02755ecSPeter Maydell     uint32_t xoffset, yoffset;
28a02755ecSPeter Maydell     uint32_t bpp;
29a02755ecSPeter Maydell     uint32_t base;
30a02755ecSPeter Maydell     uint32_t pixo;
31a02755ecSPeter Maydell     uint32_t alpha;
32a02755ecSPeter Maydell } BCM2835FBConfig;
33a02755ecSPeter Maydell 
345e9c2a8dSGrégory ESTRADE typedef struct {
355e9c2a8dSGrégory ESTRADE     /*< private >*/
365e9c2a8dSGrégory ESTRADE     SysBusDevice busdev;
375e9c2a8dSGrégory ESTRADE     /*< public >*/
385e9c2a8dSGrégory ESTRADE 
395e9c2a8dSGrégory ESTRADE     uint32_t vcram_base, vcram_size;
405e9c2a8dSGrégory ESTRADE     MemoryRegion *dma_mr;
415e9c2a8dSGrégory ESTRADE     AddressSpace dma_as;
425e9c2a8dSGrégory ESTRADE     MemoryRegion iomem;
435e9c2a8dSGrégory ESTRADE     MemoryRegionSection fbsection;
445e9c2a8dSGrégory ESTRADE     QemuConsole *con;
455e9c2a8dSGrégory ESTRADE     qemu_irq mbox_irq;
465e9c2a8dSGrégory ESTRADE 
475e9c2a8dSGrégory ESTRADE     bool lock, invalidate, pending;
48a02755ecSPeter Maydell 
49a02755ecSPeter Maydell     BCM2835FBConfig config;
509e2938a0SPeter Maydell     BCM2835FBConfig initial_config;
515e9c2a8dSGrégory ESTRADE } BCM2835FBState;
525e9c2a8dSGrégory ESTRADE 
53193100b5SPeter Maydell void bcm2835_fb_reconfigure(BCM2835FBState *s, BCM2835FBConfig *newconfig);
545e9c2a8dSGrégory ESTRADE 
55*9a1f03f4SPeter Maydell /**
56*9a1f03f4SPeter Maydell  * bcm2835_fb_get_pitch: return number of bytes per line of the framebuffer
57*9a1f03f4SPeter Maydell  * @config: configuration info for the framebuffer
58*9a1f03f4SPeter Maydell  *
59*9a1f03f4SPeter Maydell  * Return the number of bytes per line of the framebuffer, ie the number
60*9a1f03f4SPeter Maydell  * that must be added to a pixel address to get the address of the pixel
61*9a1f03f4SPeter Maydell  * directly below it on screen.
62*9a1f03f4SPeter Maydell  */
63*9a1f03f4SPeter Maydell static inline uint32_t bcm2835_fb_get_pitch(BCM2835FBConfig *config)
64*9a1f03f4SPeter Maydell {
65*9a1f03f4SPeter Maydell     return config->xres * (config->bpp >> 3);
66*9a1f03f4SPeter Maydell }
67*9a1f03f4SPeter Maydell 
68*9a1f03f4SPeter Maydell /**
69*9a1f03f4SPeter Maydell  * bcm2835_fb_get_size: return total size of framebuffer in bytes
70*9a1f03f4SPeter Maydell  * @config: configuration info for the framebuffer
71*9a1f03f4SPeter Maydell  */
72*9a1f03f4SPeter Maydell static inline uint32_t bcm2835_fb_get_size(BCM2835FBConfig *config)
73*9a1f03f4SPeter Maydell {
74*9a1f03f4SPeter Maydell     return config->yres * bcm2835_fb_get_pitch(config);
75*9a1f03f4SPeter Maydell }
76*9a1f03f4SPeter Maydell 
775e9c2a8dSGrégory ESTRADE #endif
78