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 559a1f03f4SPeter Maydell /** 569a1f03f4SPeter Maydell * bcm2835_fb_get_pitch: return number of bytes per line of the framebuffer 579a1f03f4SPeter Maydell * @config: configuration info for the framebuffer 589a1f03f4SPeter Maydell * 599a1f03f4SPeter Maydell * Return the number of bytes per line of the framebuffer, ie the number 609a1f03f4SPeter Maydell * that must be added to a pixel address to get the address of the pixel 619a1f03f4SPeter Maydell * directly below it on screen. 629a1f03f4SPeter Maydell */ 639a1f03f4SPeter Maydell static inline uint32_t bcm2835_fb_get_pitch(BCM2835FBConfig *config) 649a1f03f4SPeter Maydell { 65*01f18af9SPeter Maydell uint32_t xres = MAX(config->xres, config->xres_virtual); 66*01f18af9SPeter Maydell return xres * (config->bpp >> 3); 679a1f03f4SPeter Maydell } 689a1f03f4SPeter Maydell 699a1f03f4SPeter Maydell /** 709a1f03f4SPeter Maydell * bcm2835_fb_get_size: return total size of framebuffer in bytes 719a1f03f4SPeter Maydell * @config: configuration info for the framebuffer 729a1f03f4SPeter Maydell */ 739a1f03f4SPeter Maydell static inline uint32_t bcm2835_fb_get_size(BCM2835FBConfig *config) 749a1f03f4SPeter Maydell { 75*01f18af9SPeter Maydell uint32_t yres = MAX(config->yres, config->yres_virtual); 76*01f18af9SPeter Maydell return yres * bcm2835_fb_get_pitch(config); 779a1f03f4SPeter Maydell } 789a1f03f4SPeter Maydell 795e9c2a8dSGrégory ESTRADE #endif 80