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 * 86111a0c0SPhilippe Mathieu-Daudé * This work is licensed under the terms of the GNU GPL, version 2 or later. 96111a0c0SPhilippe Mathieu-Daudé * See the COPYING file in the top-level directory. 105e9c2a8dSGrégory ESTRADE */ 115e9c2a8dSGrégory ESTRADE 125e9c2a8dSGrégory ESTRADE #ifndef BCM2835_FB_H 135e9c2a8dSGrégory ESTRADE #define BCM2835_FB_H 145e9c2a8dSGrégory ESTRADE 155e9c2a8dSGrégory ESTRADE #include "hw/sysbus.h" 165e9c2a8dSGrégory ESTRADE #include "ui/console.h" 17db1015e9SEduardo Habkost #include "qom/object.h" 185e9c2a8dSGrégory ESTRADE 195e9c2a8dSGrégory ESTRADE #define TYPE_BCM2835_FB "bcm2835-fb" 20*8063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(BCM2835FBState, BCM2835_FB) 215e9c2a8dSGrégory ESTRADE 22a02755ecSPeter Maydell /* 23a02755ecSPeter Maydell * Configuration information about the fb which the guest can program 24a02755ecSPeter Maydell * via the mailbox property interface. 25a02755ecSPeter Maydell */ 26a02755ecSPeter Maydell typedef struct { 27a02755ecSPeter Maydell uint32_t xres, yres; 28a02755ecSPeter Maydell uint32_t xres_virtual, yres_virtual; 29a02755ecSPeter Maydell uint32_t xoffset, yoffset; 30a02755ecSPeter Maydell uint32_t bpp; 31a02755ecSPeter Maydell uint32_t base; 32a02755ecSPeter Maydell uint32_t pixo; 33a02755ecSPeter Maydell uint32_t alpha; 34a02755ecSPeter Maydell } BCM2835FBConfig; 35a02755ecSPeter Maydell 36db1015e9SEduardo Habkost struct BCM2835FBState { 375e9c2a8dSGrégory ESTRADE /*< private >*/ 385e9c2a8dSGrégory ESTRADE SysBusDevice busdev; 395e9c2a8dSGrégory ESTRADE /*< public >*/ 405e9c2a8dSGrégory ESTRADE 415e9c2a8dSGrégory ESTRADE uint32_t vcram_base, vcram_size; 425e9c2a8dSGrégory ESTRADE MemoryRegion *dma_mr; 435e9c2a8dSGrégory ESTRADE AddressSpace dma_as; 445e9c2a8dSGrégory ESTRADE MemoryRegion iomem; 455e9c2a8dSGrégory ESTRADE MemoryRegionSection fbsection; 465e9c2a8dSGrégory ESTRADE QemuConsole *con; 475e9c2a8dSGrégory ESTRADE qemu_irq mbox_irq; 485e9c2a8dSGrégory ESTRADE 495e9c2a8dSGrégory ESTRADE bool lock, invalidate, pending; 50a02755ecSPeter Maydell 51a02755ecSPeter Maydell BCM2835FBConfig config; 529e2938a0SPeter Maydell BCM2835FBConfig initial_config; 53db1015e9SEduardo Habkost }; 545e9c2a8dSGrégory ESTRADE 55193100b5SPeter Maydell void bcm2835_fb_reconfigure(BCM2835FBState *s, BCM2835FBConfig *newconfig); 565e9c2a8dSGrégory ESTRADE 579a1f03f4SPeter Maydell /** 589a1f03f4SPeter Maydell * bcm2835_fb_get_pitch: return number of bytes per line of the framebuffer 599a1f03f4SPeter Maydell * @config: configuration info for the framebuffer 609a1f03f4SPeter Maydell * 619a1f03f4SPeter Maydell * Return the number of bytes per line of the framebuffer, ie the number 629a1f03f4SPeter Maydell * that must be added to a pixel address to get the address of the pixel 639a1f03f4SPeter Maydell * directly below it on screen. 649a1f03f4SPeter Maydell */ 659a1f03f4SPeter Maydell static inline uint32_t bcm2835_fb_get_pitch(BCM2835FBConfig *config) 669a1f03f4SPeter Maydell { 6701f18af9SPeter Maydell uint32_t xres = MAX(config->xres, config->xres_virtual); 6801f18af9SPeter Maydell return xres * (config->bpp >> 3); 699a1f03f4SPeter Maydell } 709a1f03f4SPeter Maydell 719a1f03f4SPeter Maydell /** 729a1f03f4SPeter Maydell * bcm2835_fb_get_size: return total size of framebuffer in bytes 739a1f03f4SPeter Maydell * @config: configuration info for the framebuffer 749a1f03f4SPeter Maydell */ 759a1f03f4SPeter Maydell static inline uint32_t bcm2835_fb_get_size(BCM2835FBConfig *config) 769a1f03f4SPeter Maydell { 7701f18af9SPeter Maydell uint32_t yres = MAX(config->yres, config->yres_virtual); 7801f18af9SPeter Maydell return yres * bcm2835_fb_get_pitch(config); 799a1f03f4SPeter Maydell } 809a1f03f4SPeter Maydell 81f8add62cSPeter Maydell /** 82f8add62cSPeter Maydell * bcm2835_fb_validate_config: check provided config 83f8add62cSPeter Maydell * 84f8add62cSPeter Maydell * Validates the configuration information provided by the guest and 85f8add62cSPeter Maydell * adjusts it if necessary. 86f8add62cSPeter Maydell */ 87f8add62cSPeter Maydell void bcm2835_fb_validate_config(BCM2835FBConfig *config); 88f8add62cSPeter Maydell 895e9c2a8dSGrégory ESTRADE #endif 90