|  | /* | 
|  | * Raspberry Pi emulation (c) 2012 Gregory Estrade | 
|  | * Upstreaming code cleanup [including bcm2835_*] (c) 2013 Jan Petrous | 
|  | * | 
|  | * Rasperry Pi 2 emulation and refactoring Copyright (c) 2015, Microsoft | 
|  | * Written by Andrew Baumann | 
|  | * | 
|  | * This work is licensed under the terms of the GNU GPL, version 2 or later. | 
|  | * See the COPYING file in the top-level directory. | 
|  | */ | 
|  |  | 
|  | #ifndef BCM2835_FB_H | 
|  | #define BCM2835_FB_H | 
|  |  | 
|  | #include "hw/sysbus.h" | 
|  | #include "ui/console.h" | 
|  | #include "qom/object.h" | 
|  |  | 
|  | #define UPPER_RAM_BASE 0x40000000 | 
|  |  | 
|  | #define TYPE_BCM2835_FB "bcm2835-fb" | 
|  | OBJECT_DECLARE_SIMPLE_TYPE(BCM2835FBState, BCM2835_FB) | 
|  |  | 
|  | /* | 
|  | * Configuration information about the fb which the guest can program | 
|  | * via the mailbox property interface. | 
|  | */ | 
|  | typedef struct { | 
|  | uint32_t xres, yres; | 
|  | uint32_t xres_virtual, yres_virtual; | 
|  | uint32_t xoffset, yoffset; | 
|  | uint32_t bpp; | 
|  | uint32_t base; | 
|  | uint32_t pixo; | 
|  | uint32_t alpha; | 
|  | } BCM2835FBConfig; | 
|  |  | 
|  | struct BCM2835FBState { | 
|  | /*< private >*/ | 
|  | SysBusDevice busdev; | 
|  | /*< public >*/ | 
|  |  | 
|  | uint32_t vcram_base, vcram_size; | 
|  | MemoryRegion *dma_mr; | 
|  | AddressSpace dma_as; | 
|  | MemoryRegion iomem; | 
|  | MemoryRegionSection fbsection; | 
|  | QemuConsole *con; | 
|  | qemu_irq mbox_irq; | 
|  |  | 
|  | bool lock, invalidate, pending; | 
|  |  | 
|  | BCM2835FBConfig config; | 
|  | BCM2835FBConfig initial_config; | 
|  | }; | 
|  |  | 
|  | 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) | 
|  | { | 
|  | uint32_t xres = MAX(config->xres, config->xres_virtual); | 
|  | return 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) | 
|  | { | 
|  | uint32_t yres = MAX(config->yres, config->yres_virtual); | 
|  | return yres * bcm2835_fb_get_pitch(config); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * bcm2835_fb_validate_config: check provided config | 
|  | * | 
|  | * Validates the configuration information provided by the guest and | 
|  | * adjusts it if necessary. | 
|  | */ | 
|  | void bcm2835_fb_validate_config(BCM2835FBConfig *config); | 
|  |  | 
|  | #endif |