19646SChris.Emmons@arm.com/*
211898Ssudhanshu.jha@arm.com * Copyright (c) 2010-2013, 2015, 2017 ARM Limited
39646SChris.Emmons@arm.com * All rights reserved
49646SChris.Emmons@arm.com *
59646SChris.Emmons@arm.com * The license below extends only to copyright in the software and shall
69646SChris.Emmons@arm.com * not be construed as granting a license to any other intellectual
79646SChris.Emmons@arm.com * property including but not limited to intellectual property relating
89646SChris.Emmons@arm.com * to a hardware implementation of the functionality of the software
99646SChris.Emmons@arm.com * licensed hereunder.  You may use the software subject to the license
109646SChris.Emmons@arm.com * terms below provided that you ensure that this notice is replicated
119646SChris.Emmons@arm.com * unmodified and in its entirety in all distributions of the software,
129646SChris.Emmons@arm.com * modified or unmodified, in source code or in binary form.
139646SChris.Emmons@arm.com *
149646SChris.Emmons@arm.com * Redistribution and use in source and binary forms, with or without
159646SChris.Emmons@arm.com * modification, are permitted provided that the following conditions are
169646SChris.Emmons@arm.com * met: redistributions of source code must retain the above copyright
179646SChris.Emmons@arm.com * notice, this list of conditions and the following disclaimer;
189646SChris.Emmons@arm.com * redistributions in binary form must reproduce the above copyright
199646SChris.Emmons@arm.com * notice, this list of conditions and the following disclaimer in the
209646SChris.Emmons@arm.com * documentation and/or other materials provided with the distribution;
219646SChris.Emmons@arm.com * neither the name of the copyright holders nor the names of its
229646SChris.Emmons@arm.com * contributors may be used to endorse or promote products derived from
239646SChris.Emmons@arm.com * this software without specific prior written permission.
249646SChris.Emmons@arm.com *
259646SChris.Emmons@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
269646SChris.Emmons@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
279646SChris.Emmons@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
289646SChris.Emmons@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
299646SChris.Emmons@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
309646SChris.Emmons@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
319646SChris.Emmons@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
329646SChris.Emmons@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
339646SChris.Emmons@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
349646SChris.Emmons@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
359646SChris.Emmons@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
369646SChris.Emmons@arm.com *
379646SChris.Emmons@arm.com * Authors: Chris Emmons
3811090Sandreas.sandberg@arm.com *          Andreas Sandberg
399646SChris.Emmons@arm.com */
409646SChris.Emmons@arm.com
419646SChris.Emmons@arm.com
429646SChris.Emmons@arm.com/** @file
439646SChris.Emmons@arm.com * Implementiation of the ARM HDLcd controller.
449646SChris.Emmons@arm.com *
459646SChris.Emmons@arm.com * This implementation aims to have sufficient detail such that underrun
469646SChris.Emmons@arm.com * conditions are reasonable / behave similar to reality.  There are two
479646SChris.Emmons@arm.com * 'engines' going at once.  First, the DMA engine running at LCD clock
489646SChris.Emmons@arm.com * frequency is responsible for filling the controller's internal buffer.
499646SChris.Emmons@arm.com * The second engine runs at the pixel clock frequency and reads the pixels
509646SChris.Emmons@arm.com * out of the internal buffer.  The pixel rendering engine uses front / back
519646SChris.Emmons@arm.com * porch and sync delays between lines and frames.
529646SChris.Emmons@arm.com *
539646SChris.Emmons@arm.com * If the pixel rendering engine does not have a pixel to display, it will
549646SChris.Emmons@arm.com * cause an underrun event.  The HDLcd controller, per spec, will stop
559646SChris.Emmons@arm.com * issuing DMA requests for the rest of the frame and resume normal behavior
569646SChris.Emmons@arm.com * on the subsequent frame.  What pixels are rendered upon an underrun
579646SChris.Emmons@arm.com * condition is different than the real hardware; while the user will see
589646SChris.Emmons@arm.com * artifacts (previous frame mixed with current frame), it is not the same
599646SChris.Emmons@arm.com * behavior as real hardware which repeats the last pixel value for the rest
609646SChris.Emmons@arm.com * of the current frame.  This compromise was made to save on memory and
619646SChris.Emmons@arm.com * complexity and assumes that it is not important to accurately model the
629646SChris.Emmons@arm.com * content of an underrun frame.
639646SChris.Emmons@arm.com *
649646SChris.Emmons@arm.com * KNOWN ISSUES
6511090Sandreas.sandberg@arm.com * <ul>
6611090Sandreas.sandberg@arm.com *   <li>The HDLcd is implemented here as an AmbaDmaDevice, but it
6711090Sandreas.sandberg@arm.com *       doesn't have an AMBA ID as far as I know.  That is the only
6811090Sandreas.sandberg@arm.com *       bit of the AmbaDmaDevice interface that is irrelevant to it,
6911090Sandreas.sandberg@arm.com *       so a fake AMBA ID is used for now.  I didn't think inserting
7011090Sandreas.sandberg@arm.com *       an extra layer of hierachy between AmbaDmaDevice and
7111090Sandreas.sandberg@arm.com *       DmaDevice would be helpful to anyone else, but that may be
7211090Sandreas.sandberg@arm.com *       the right answer.
7311090Sandreas.sandberg@arm.com * </ul>
749646SChris.Emmons@arm.com */
759646SChris.Emmons@arm.com
769646SChris.Emmons@arm.com#ifndef __DEV_ARM_HDLCD_HH__
779646SChris.Emmons@arm.com#define __DEV_ARM_HDLCD_HH__
789646SChris.Emmons@arm.com
799646SChris.Emmons@arm.com#include <fstream>
8010839Sandreas.sandberg@arm.com#include <memory>
819646SChris.Emmons@arm.com
8210839Sandreas.sandberg@arm.com#include "base/framebuffer.hh"
8312232Sgiacomo.travaglini@arm.com#include "base/imgwriter.hh"
8411359Sandreas@sandberg.pp.se#include "base/output.hh"
859646SChris.Emmons@arm.com#include "dev/arm/amba_device.hh"
8611090Sandreas.sandberg@arm.com#include "dev/pixelpump.hh"
879646SChris.Emmons@arm.com#include "sim/serialize.hh"
889646SChris.Emmons@arm.com
899646SChris.Emmons@arm.comclass VncInput;
9011090Sandreas.sandberg@arm.comstruct HDLcdParams;
9111090Sandreas.sandberg@arm.comclass HDLcdPixelPump;
929646SChris.Emmons@arm.com
939646SChris.Emmons@arm.comclass HDLcd: public AmbaDmaDevice
949646SChris.Emmons@arm.com{
9511090Sandreas.sandberg@arm.com  public:
9611090Sandreas.sandberg@arm.com    HDLcd(const HDLcdParams *p);
9711090Sandreas.sandberg@arm.com    ~HDLcd();
989646SChris.Emmons@arm.com
9911168Sandreas.hansson@arm.com    void regStats() override;
10011091Sandreas.sandberg@arm.com
10111168Sandreas.hansson@arm.com    void serialize(CheckpointOut &cp) const override;
10211168Sandreas.hansson@arm.com    void unserialize(CheckpointIn &cp) override;
10311090Sandreas.sandberg@arm.com
10411168Sandreas.hansson@arm.com    void drainResume() override;
10511090Sandreas.sandberg@arm.com
10611090Sandreas.sandberg@arm.com  public: // IO device interface
10711168Sandreas.hansson@arm.com    Tick read(PacketPtr pkt) override;
10811168Sandreas.hansson@arm.com    Tick write(PacketPtr pkt) override;
10911090Sandreas.sandberg@arm.com
11011168Sandreas.hansson@arm.com    AddrRangeList getAddrRanges() const override { return addrRanges; }
11111090Sandreas.sandberg@arm.com
11211090Sandreas.sandberg@arm.com  protected: // Parameters
11311090Sandreas.sandberg@arm.com    VncInput *vnc;
11411090Sandreas.sandberg@arm.com    const bool workaroundSwapRB;
11511090Sandreas.sandberg@arm.com    const bool workaroundDmaLineCount;
11611090Sandreas.sandberg@arm.com    const AddrRangeList addrRanges;
11711090Sandreas.sandberg@arm.com    const bool enableCapture;
11811090Sandreas.sandberg@arm.com    const Addr pixelBufferSize;
11911898Ssudhanshu.jha@arm.com    const Tick virtRefreshRate;
12011090Sandreas.sandberg@arm.com
12111090Sandreas.sandberg@arm.com  protected: // Register handling
1229646SChris.Emmons@arm.com    /** ARM HDLcd register offsets */
1239646SChris.Emmons@arm.com    enum RegisterOffset {
1249646SChris.Emmons@arm.com        Version          = 0x0000,
1259646SChris.Emmons@arm.com        Int_RawStat      = 0x0010,
1269646SChris.Emmons@arm.com        Int_Clear        = 0x0014,
1279646SChris.Emmons@arm.com        Int_Mask         = 0x0018,
1289646SChris.Emmons@arm.com        Int_Status       = 0x001C,
1299646SChris.Emmons@arm.com        Fb_Base          = 0x0100,
1309646SChris.Emmons@arm.com        Fb_Line_Length   = 0x0104,
1319646SChris.Emmons@arm.com        Fb_Line_Count    = 0x0108,
1329646SChris.Emmons@arm.com        Fb_Line_Pitch    = 0x010C,
1339646SChris.Emmons@arm.com        Bus_Options      = 0x0110,
1349646SChris.Emmons@arm.com        V_Sync           = 0x0200,
1359646SChris.Emmons@arm.com        V_Back_Porch     = 0x0204,
1369646SChris.Emmons@arm.com        V_Data           = 0x0208,
1379646SChris.Emmons@arm.com        V_Front_Porch    = 0x020C,
1389646SChris.Emmons@arm.com        H_Sync           = 0x0210,
1399646SChris.Emmons@arm.com        H_Back_Porch     = 0x0214,
1409646SChris.Emmons@arm.com        H_Data           = 0x0218,
1419646SChris.Emmons@arm.com        H_Front_Porch    = 0x021C,
1429646SChris.Emmons@arm.com        Polarities       = 0x0220,
1439646SChris.Emmons@arm.com        Command          = 0x0230,
1449646SChris.Emmons@arm.com        Pixel_Format     = 0x0240,
1459646SChris.Emmons@arm.com        Red_Select       = 0x0244,
1469646SChris.Emmons@arm.com        Green_Select     = 0x0248,
14711090Sandreas.sandberg@arm.com        Blue_Select      = 0x024C,
14811090Sandreas.sandberg@arm.com    };
1499646SChris.Emmons@arm.com
1509646SChris.Emmons@arm.com    /** Reset value for Bus_Options register */
15111090Sandreas.sandberg@arm.com    static constexpr size_t BUS_OPTIONS_RESETV = 0x408;
1529646SChris.Emmons@arm.com
1539646SChris.Emmons@arm.com    /** Reset value for Version register */
15411090Sandreas.sandberg@arm.com    static constexpr size_t VERSION_RESETV = 0x1CDC0000;
1559646SChris.Emmons@arm.com
15611090Sandreas.sandberg@arm.com    /** AXI port width in bytes */
15711090Sandreas.sandberg@arm.com    static constexpr size_t AXI_PORT_WIDTH = 8;
1589646SChris.Emmons@arm.com
1599646SChris.Emmons@arm.com    /** max number of beats delivered in one dma burst */
16011090Sandreas.sandberg@arm.com    static constexpr size_t MAX_BURST_LEN = 16;
1619646SChris.Emmons@arm.com
16211090Sandreas.sandberg@arm.com    /** Maximum number of bytes per pixel */
16311090Sandreas.sandberg@arm.com    static constexpr size_t MAX_PIXEL_SIZE = 4;
16410839Sandreas.sandberg@arm.com
1659646SChris.Emmons@arm.com    /**
1669646SChris.Emmons@arm.com     * @name RegisterFieldLayouts
1679646SChris.Emmons@arm.com     * Bit layout declarations for multi-field registers.
1689646SChris.Emmons@arm.com     */
1699646SChris.Emmons@arm.com    /**@{*/
1709646SChris.Emmons@arm.com    BitUnion32(VersionReg)
1719646SChris.Emmons@arm.com        Bitfield<7,0>   version_minor;
1729646SChris.Emmons@arm.com        Bitfield<15,8>  version_major;
1739646SChris.Emmons@arm.com        Bitfield<31,16> product_id;
1749646SChris.Emmons@arm.com    EndBitUnion(VersionReg)
1759646SChris.Emmons@arm.com
17611090Sandreas.sandberg@arm.com    static constexpr uint32_t INT_DMA_END = (1UL << 0);
17711090Sandreas.sandberg@arm.com    static constexpr uint32_t INT_BUS_ERROR = (1UL << 1);
17811090Sandreas.sandberg@arm.com    static constexpr uint32_t INT_VSYNC = (1UL << 2);
17911090Sandreas.sandberg@arm.com    static constexpr uint32_t INT_UNDERRUN = (1UL << 3);
1809646SChris.Emmons@arm.com
1819646SChris.Emmons@arm.com    BitUnion32(FbLineCountReg)
1829646SChris.Emmons@arm.com        Bitfield<11,0>  fb_line_count;
1839646SChris.Emmons@arm.com        Bitfield<31,12> reserved_31_12;
1849646SChris.Emmons@arm.com    EndBitUnion(FbLineCountReg)
1859646SChris.Emmons@arm.com
1869646SChris.Emmons@arm.com    BitUnion32(BusOptsReg)
1879646SChris.Emmons@arm.com        Bitfield<4,0>   burst_len;
1889646SChris.Emmons@arm.com        Bitfield<7,5>   reserved_7_5;
1899646SChris.Emmons@arm.com        Bitfield<11,8>  max_outstanding;
1909646SChris.Emmons@arm.com        Bitfield<31,12> reserved_31_12;
1919646SChris.Emmons@arm.com    EndBitUnion(BusOptsReg)
1929646SChris.Emmons@arm.com
1939646SChris.Emmons@arm.com    BitUnion32(TimingReg)
1949646SChris.Emmons@arm.com        Bitfield<11,0>  val;
1959646SChris.Emmons@arm.com        Bitfield<31,12> reserved_31_12;
1969646SChris.Emmons@arm.com    EndBitUnion(TimingReg)
1979646SChris.Emmons@arm.com
1989646SChris.Emmons@arm.com    BitUnion32(PolaritiesReg)
1999646SChris.Emmons@arm.com        Bitfield<0>    vsync_polarity;
2009646SChris.Emmons@arm.com        Bitfield<1>    hsync_polarity;
2019646SChris.Emmons@arm.com        Bitfield<2>    dataen_polarity;
2029646SChris.Emmons@arm.com        Bitfield<3>    data_polarity;
2039646SChris.Emmons@arm.com        Bitfield<4>    pxlclk_polarity;
2049646SChris.Emmons@arm.com        Bitfield<31,5> reserved_31_5;
2059646SChris.Emmons@arm.com    EndBitUnion(PolaritiesReg)
2069646SChris.Emmons@arm.com
2079646SChris.Emmons@arm.com    BitUnion32(CommandReg)
2089646SChris.Emmons@arm.com        Bitfield<0>    enable;
2099646SChris.Emmons@arm.com        Bitfield<31,1> reserved_31_1;
2109646SChris.Emmons@arm.com    EndBitUnion(CommandReg)
2119646SChris.Emmons@arm.com
2129646SChris.Emmons@arm.com    BitUnion32(PixelFormatReg)
2139646SChris.Emmons@arm.com        Bitfield<2,0>  reserved_2_0;
2149646SChris.Emmons@arm.com        Bitfield<4,3>  bytes_per_pixel;
2159646SChris.Emmons@arm.com        Bitfield<30,5> reserved_30_5;
2169646SChris.Emmons@arm.com        Bitfield<31>   big_endian;
2179646SChris.Emmons@arm.com    EndBitUnion(PixelFormatReg)
2189646SChris.Emmons@arm.com
2199646SChris.Emmons@arm.com    BitUnion32(ColorSelectReg)
2209646SChris.Emmons@arm.com        Bitfield<4,0>   offset;
2219646SChris.Emmons@arm.com        Bitfield<7,5>   reserved_7_5;
2229646SChris.Emmons@arm.com        Bitfield<11,8>  size;
2239646SChris.Emmons@arm.com        Bitfield<15,12> reserved_15_12;
2249646SChris.Emmons@arm.com        Bitfield<23,16> default_color;
2259646SChris.Emmons@arm.com        Bitfield<31,24> reserved_31_24;
2269646SChris.Emmons@arm.com    EndBitUnion(ColorSelectReg)
2279646SChris.Emmons@arm.com    /**@}*/
2289646SChris.Emmons@arm.com
2299646SChris.Emmons@arm.com    /**
2309646SChris.Emmons@arm.com     * @name HDLCDRegisters
2319646SChris.Emmons@arm.com     * HDLCD register contents.
2329646SChris.Emmons@arm.com     */
2339646SChris.Emmons@arm.com    /**@{*/
23411090Sandreas.sandberg@arm.com    const VersionReg version;       /**< Version register */
23511090Sandreas.sandberg@arm.com    uint32_t int_rawstat;           /**< Interrupt raw status register */
23611090Sandreas.sandberg@arm.com    uint32_t int_mask;              /**< Interrupt mask register */
2379646SChris.Emmons@arm.com    uint32_t fb_base;               /**< Frame buffer base address register */
2389646SChris.Emmons@arm.com    uint32_t fb_line_length;        /**< Frame buffer Line length register */
2399646SChris.Emmons@arm.com    FbLineCountReg fb_line_count;   /**< Frame buffer Line count register */
24011090Sandreas.sandberg@arm.com    int32_t fb_line_pitch;          /**< Frame buffer Line pitch register */
2419646SChris.Emmons@arm.com    BusOptsReg bus_options;         /**< Bus options register */
2429646SChris.Emmons@arm.com    TimingReg v_sync;               /**< Vertical sync width register */
2439646SChris.Emmons@arm.com    TimingReg v_back_porch;         /**< Vertical back porch width register */
2449646SChris.Emmons@arm.com    TimingReg v_data;               /**< Vertical data width register */
2459646SChris.Emmons@arm.com    TimingReg v_front_porch;        /**< Vertical front porch width register */
2469646SChris.Emmons@arm.com    TimingReg h_sync;               /**< Horizontal sync width register */
2479646SChris.Emmons@arm.com    TimingReg h_back_porch;         /**< Horizontal back porch width register */
2489646SChris.Emmons@arm.com    TimingReg h_data;               /**< Horizontal data width register */
2499646SChris.Emmons@arm.com    TimingReg h_front_porch;        /**< Horizontal front porch width reg */
2509646SChris.Emmons@arm.com    PolaritiesReg polarities;       /**< Polarities register */
2519646SChris.Emmons@arm.com    CommandReg command;             /**< Command register */
2529646SChris.Emmons@arm.com    PixelFormatReg pixel_format;    /**< Pixel format register */
2539646SChris.Emmons@arm.com    ColorSelectReg red_select;      /**< Red color select register */
2549646SChris.Emmons@arm.com    ColorSelectReg green_select;    /**< Green color select register */
2559646SChris.Emmons@arm.com    ColorSelectReg blue_select;     /**< Blue color select register */
2569646SChris.Emmons@arm.com    /** @} */
2579646SChris.Emmons@arm.com
25811090Sandreas.sandberg@arm.com    uint32_t readReg(Addr offset);
25911090Sandreas.sandberg@arm.com    void writeReg(Addr offset, uint32_t value);
2609646SChris.Emmons@arm.com
26111090Sandreas.sandberg@arm.com    PixelConverter pixelConverter() const;
26211090Sandreas.sandberg@arm.com    DisplayTimings displayTimings() const;
26310839Sandreas.sandberg@arm.com
26411090Sandreas.sandberg@arm.com    void createDmaEngine();
26511090Sandreas.sandberg@arm.com
26611090Sandreas.sandberg@arm.com    void cmdEnable();
26711090Sandreas.sandberg@arm.com    void cmdDisable();
26811090Sandreas.sandberg@arm.com
26911090Sandreas.sandberg@arm.com    bool enabled() const { return command.enable; }
27011090Sandreas.sandberg@arm.com
27111090Sandreas.sandberg@arm.com  public: // Pixel pump callbacks
27211090Sandreas.sandberg@arm.com    bool pxlNext(Pixel &p);
27311090Sandreas.sandberg@arm.com    void pxlVSyncBegin();
27411090Sandreas.sandberg@arm.com    void pxlVSyncEnd();
27511090Sandreas.sandberg@arm.com    void pxlUnderrun();
27611090Sandreas.sandberg@arm.com    void pxlFrameDone();
27711090Sandreas.sandberg@arm.com
27811090Sandreas.sandberg@arm.com  protected: // Interrupt handling
27911090Sandreas.sandberg@arm.com    /**
28011090Sandreas.sandberg@arm.com     * Assign new interrupt values and update interrupt signals
28111090Sandreas.sandberg@arm.com     *
28211090Sandreas.sandberg@arm.com     * A new interrupt is scheduled signalled if the set of unmasked
28311090Sandreas.sandberg@arm.com     * interrupts goes empty to non-empty. Conversely, if the set of
28411090Sandreas.sandberg@arm.com     * unmasked interrupts goes from non-empty to empty, the interrupt
28511090Sandreas.sandberg@arm.com     * signal is cleared.
28611090Sandreas.sandberg@arm.com     *
28711090Sandreas.sandberg@arm.com     * @param ints New <i>raw</i> interrupt status
28811090Sandreas.sandberg@arm.com     * @param mask New interrupt mask
28911090Sandreas.sandberg@arm.com     */
29011090Sandreas.sandberg@arm.com    void setInterrupts(uint32_t ints, uint32_t mask);
29111090Sandreas.sandberg@arm.com
29211090Sandreas.sandberg@arm.com    /**
29311090Sandreas.sandberg@arm.com     * Convenience function to update the interrupt mask
29411090Sandreas.sandberg@arm.com     *
29511090Sandreas.sandberg@arm.com     * @see setInterrupts
29611090Sandreas.sandberg@arm.com     * @param mask New interrupt mask
29711090Sandreas.sandberg@arm.com     */
29811090Sandreas.sandberg@arm.com    void intMask(uint32_t mask) { setInterrupts(int_rawstat, mask); }
29911090Sandreas.sandberg@arm.com
30011090Sandreas.sandberg@arm.com    /**
30111090Sandreas.sandberg@arm.com     * Convenience function to raise a new interrupt
30211090Sandreas.sandberg@arm.com     *
30311090Sandreas.sandberg@arm.com     * @see setInterrupts
30411090Sandreas.sandberg@arm.com     * @param ints Set of interrupts to raise
30511090Sandreas.sandberg@arm.com     */
30611090Sandreas.sandberg@arm.com    void intRaise(uint32_t ints) {
30711090Sandreas.sandberg@arm.com        setInterrupts(int_rawstat | ints, int_mask);
30811090Sandreas.sandberg@arm.com    }
30911090Sandreas.sandberg@arm.com
31011090Sandreas.sandberg@arm.com    /**
31111090Sandreas.sandberg@arm.com     * Convenience function to clear interrupts
31211090Sandreas.sandberg@arm.com     *
31311090Sandreas.sandberg@arm.com     * @see setInterrupts
31411090Sandreas.sandberg@arm.com     * @param ints Set of interrupts to clear
31511090Sandreas.sandberg@arm.com     */
31611090Sandreas.sandberg@arm.com    void intClear(uint32_t ints) {
31711090Sandreas.sandberg@arm.com        setInterrupts(int_rawstat & ~ints, int_mask);
31811090Sandreas.sandberg@arm.com    }
31911090Sandreas.sandberg@arm.com
32011090Sandreas.sandberg@arm.com    /** Masked interrupt status register */
32111294Sandreas.hansson@arm.com    uint32_t intStatus() const { return int_rawstat & int_mask; }
32211090Sandreas.sandberg@arm.com
32311090Sandreas.sandberg@arm.com  protected: // Pixel output
32411090Sandreas.sandberg@arm.com    class PixelPump : public BasePixelPump
32511090Sandreas.sandberg@arm.com    {
32611090Sandreas.sandberg@arm.com      public:
32711090Sandreas.sandberg@arm.com        PixelPump(HDLcd &p, ClockDomain &pxl_clk, unsigned pixel_chunk)
32811090Sandreas.sandberg@arm.com            : BasePixelPump(p, pxl_clk, pixel_chunk), parent(p) {}
32911090Sandreas.sandberg@arm.com
33011090Sandreas.sandberg@arm.com        void dumpSettings();
33111090Sandreas.sandberg@arm.com
33211090Sandreas.sandberg@arm.com      protected:
33311168Sandreas.hansson@arm.com        bool nextPixel(Pixel &p) override { return parent.pxlNext(p); }
33411090Sandreas.sandberg@arm.com
33511168Sandreas.hansson@arm.com        void onVSyncBegin() override { return parent.pxlVSyncBegin(); }
33611168Sandreas.hansson@arm.com        void onVSyncEnd() override { return parent.pxlVSyncEnd(); }
33711090Sandreas.sandberg@arm.com
33811168Sandreas.hansson@arm.com        void onUnderrun(unsigned x, unsigned y) override {
33911090Sandreas.sandberg@arm.com            parent.pxlUnderrun();
34011090Sandreas.sandberg@arm.com        }
34111090Sandreas.sandberg@arm.com
34211168Sandreas.hansson@arm.com        void onFrameDone() override { parent.pxlFrameDone(); }
34311090Sandreas.sandberg@arm.com
34411090Sandreas.sandberg@arm.com      protected:
34511090Sandreas.sandberg@arm.com        HDLcd &parent;
34611090Sandreas.sandberg@arm.com    };
3479646SChris.Emmons@arm.com
34811898Ssudhanshu.jha@arm.com    /** Handler for fast frame refresh in KVM-mode */
34911898Ssudhanshu.jha@arm.com    void virtRefresh();
35012086Sspwilson2@wisc.edu    EventFunctionWrapper virtRefreshEvent;
35111898Ssudhanshu.jha@arm.com
3529646SChris.Emmons@arm.com    /** Helper to write out bitmaps */
35312232Sgiacomo.travaglini@arm.com    std::unique_ptr<ImgWriter> imgWriter;
35412232Sgiacomo.travaglini@arm.com
35512232Sgiacomo.travaglini@arm.com    /** Image Format */
35612232Sgiacomo.travaglini@arm.com    Enums::ImageFormat imgFormat;
3579646SChris.Emmons@arm.com
3589646SChris.Emmons@arm.com    /** Picture of what the current frame buffer looks like */
35911359Sandreas@sandberg.pp.se    OutputStream *pic;
3609646SChris.Emmons@arm.com
36111090Sandreas.sandberg@arm.com    /** Cached pixel converter, set when the converter is enabled. */
36211090Sandreas.sandberg@arm.com    PixelConverter conv;
36311090Sandreas.sandberg@arm.com
36411090Sandreas.sandberg@arm.com    PixelPump pixelPump;
36511090Sandreas.sandberg@arm.com
36611090Sandreas.sandberg@arm.com  protected: // DMA handling
36711090Sandreas.sandberg@arm.com    class DmaEngine : public DmaReadFifo
3689646SChris.Emmons@arm.com    {
36911090Sandreas.sandberg@arm.com      public:
37011090Sandreas.sandberg@arm.com        DmaEngine(HDLcd &_parent, size_t size,
37111090Sandreas.sandberg@arm.com                  unsigned request_size, unsigned max_pending,
37211090Sandreas.sandberg@arm.com                  size_t line_size, ssize_t line_pitch, unsigned num_lines);
3739646SChris.Emmons@arm.com
37411090Sandreas.sandberg@arm.com        void startFrame(Addr fb_base);
37511090Sandreas.sandberg@arm.com        void abortFrame();
37611090Sandreas.sandberg@arm.com        void dumpSettings();
3779646SChris.Emmons@arm.com
37811168Sandreas.hansson@arm.com        void serialize(CheckpointOut &cp) const override;
37911168Sandreas.hansson@arm.com        void unserialize(CheckpointIn &cp) override;
3809646SChris.Emmons@arm.com
38111090Sandreas.sandberg@arm.com      protected:
38211168Sandreas.hansson@arm.com        void onEndOfBlock() override;
38311168Sandreas.hansson@arm.com        void onIdle() override;
3849646SChris.Emmons@arm.com
38511090Sandreas.sandberg@arm.com        HDLcd &parent;
38611090Sandreas.sandberg@arm.com        const size_t lineSize;
38711090Sandreas.sandberg@arm.com        const ssize_t linePitch;
38811090Sandreas.sandberg@arm.com        const unsigned numLines;
3899646SChris.Emmons@arm.com
39011090Sandreas.sandberg@arm.com        Addr nextLineAddr;
39111090Sandreas.sandberg@arm.com        Addr frameEnd;
3929646SChris.Emmons@arm.com    };
3939646SChris.Emmons@arm.com
39411090Sandreas.sandberg@arm.com    std::unique_ptr<DmaEngine> dmaEngine;
39511091Sandreas.sandberg@arm.com
39611091Sandreas.sandberg@arm.com  protected: // Statistics
39711091Sandreas.sandberg@arm.com    struct {
39811091Sandreas.sandberg@arm.com        Stats::Scalar underruns;
39911091Sandreas.sandberg@arm.com    } stats;
4009646SChris.Emmons@arm.com};
4019646SChris.Emmons@arm.com
4029646SChris.Emmons@arm.com#endif
403