hdlcd.hh revision 11168
19646SChris.Emmons@arm.com/*
210839Sandreas.sandberg@arm.com * Copyright (c) 2010-2013, 2015 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/bitmap.hh"
8310839Sandreas.sandberg@arm.com#include "base/framebuffer.hh"
849646SChris.Emmons@arm.com#include "dev/arm/amba_device.hh"
8511090Sandreas.sandberg@arm.com#include "dev/pixelpump.hh"
869646SChris.Emmons@arm.com#include "sim/serialize.hh"
879646SChris.Emmons@arm.com
889646SChris.Emmons@arm.comclass VncInput;
8911090Sandreas.sandberg@arm.comstruct HDLcdParams;
9011090Sandreas.sandberg@arm.comclass HDLcdPixelPump;
919646SChris.Emmons@arm.com
929646SChris.Emmons@arm.comclass HDLcd: public AmbaDmaDevice
939646SChris.Emmons@arm.com{
9411090Sandreas.sandberg@arm.com  public:
9511090Sandreas.sandberg@arm.com    HDLcd(const HDLcdParams *p);
9611090Sandreas.sandberg@arm.com    ~HDLcd();
979646SChris.Emmons@arm.com
9811168Sandreas.hansson@arm.com    void regStats() override;
9911091Sandreas.sandberg@arm.com
10011168Sandreas.hansson@arm.com    void serialize(CheckpointOut &cp) const override;
10111168Sandreas.hansson@arm.com    void unserialize(CheckpointIn &cp) override;
10211090Sandreas.sandberg@arm.com
10311168Sandreas.hansson@arm.com    void drainResume() override;
10411090Sandreas.sandberg@arm.com
10511090Sandreas.sandberg@arm.com  public: // IO device interface
10611168Sandreas.hansson@arm.com    Tick read(PacketPtr pkt) override;
10711168Sandreas.hansson@arm.com    Tick write(PacketPtr pkt) override;
10811090Sandreas.sandberg@arm.com
10911168Sandreas.hansson@arm.com    AddrRangeList getAddrRanges() const override { return addrRanges; }
11011090Sandreas.sandberg@arm.com
11111090Sandreas.sandberg@arm.com  protected: // Parameters
11211090Sandreas.sandberg@arm.com    VncInput *vnc;
11311090Sandreas.sandberg@arm.com    const bool workaroundSwapRB;
11411090Sandreas.sandberg@arm.com    const bool workaroundDmaLineCount;
11511090Sandreas.sandberg@arm.com    const AddrRangeList addrRanges;
11611090Sandreas.sandberg@arm.com    const bool enableCapture;
11711090Sandreas.sandberg@arm.com    const Addr pixelBufferSize;
11811090Sandreas.sandberg@arm.com
11911090Sandreas.sandberg@arm.com  protected: // Register handling
1209646SChris.Emmons@arm.com    /** ARM HDLcd register offsets */
1219646SChris.Emmons@arm.com    enum RegisterOffset {
1229646SChris.Emmons@arm.com        Version          = 0x0000,
1239646SChris.Emmons@arm.com        Int_RawStat      = 0x0010,
1249646SChris.Emmons@arm.com        Int_Clear        = 0x0014,
1259646SChris.Emmons@arm.com        Int_Mask         = 0x0018,
1269646SChris.Emmons@arm.com        Int_Status       = 0x001C,
1279646SChris.Emmons@arm.com        Fb_Base          = 0x0100,
1289646SChris.Emmons@arm.com        Fb_Line_Length   = 0x0104,
1299646SChris.Emmons@arm.com        Fb_Line_Count    = 0x0108,
1309646SChris.Emmons@arm.com        Fb_Line_Pitch    = 0x010C,
1319646SChris.Emmons@arm.com        Bus_Options      = 0x0110,
1329646SChris.Emmons@arm.com        V_Sync           = 0x0200,
1339646SChris.Emmons@arm.com        V_Back_Porch     = 0x0204,
1349646SChris.Emmons@arm.com        V_Data           = 0x0208,
1359646SChris.Emmons@arm.com        V_Front_Porch    = 0x020C,
1369646SChris.Emmons@arm.com        H_Sync           = 0x0210,
1379646SChris.Emmons@arm.com        H_Back_Porch     = 0x0214,
1389646SChris.Emmons@arm.com        H_Data           = 0x0218,
1399646SChris.Emmons@arm.com        H_Front_Porch    = 0x021C,
1409646SChris.Emmons@arm.com        Polarities       = 0x0220,
1419646SChris.Emmons@arm.com        Command          = 0x0230,
1429646SChris.Emmons@arm.com        Pixel_Format     = 0x0240,
1439646SChris.Emmons@arm.com        Red_Select       = 0x0244,
1449646SChris.Emmons@arm.com        Green_Select     = 0x0248,
14511090Sandreas.sandberg@arm.com        Blue_Select      = 0x024C,
14611090Sandreas.sandberg@arm.com    };
1479646SChris.Emmons@arm.com
1489646SChris.Emmons@arm.com    /** Reset value for Bus_Options register */
14911090Sandreas.sandberg@arm.com    static constexpr size_t BUS_OPTIONS_RESETV = 0x408;
1509646SChris.Emmons@arm.com
1519646SChris.Emmons@arm.com    /** Reset value for Version register */
15211090Sandreas.sandberg@arm.com    static constexpr size_t VERSION_RESETV = 0x1CDC0000;
1539646SChris.Emmons@arm.com
15411090Sandreas.sandberg@arm.com    /** AXI port width in bytes */
15511090Sandreas.sandberg@arm.com    static constexpr size_t AXI_PORT_WIDTH = 8;
1569646SChris.Emmons@arm.com
1579646SChris.Emmons@arm.com    /** max number of beats delivered in one dma burst */
15811090Sandreas.sandberg@arm.com    static constexpr size_t MAX_BURST_LEN = 16;
1599646SChris.Emmons@arm.com
16011090Sandreas.sandberg@arm.com    /** Maximum number of bytes per pixel */
16111090Sandreas.sandberg@arm.com    static constexpr size_t MAX_PIXEL_SIZE = 4;
16210839Sandreas.sandberg@arm.com
1639646SChris.Emmons@arm.com    /**
1649646SChris.Emmons@arm.com     * @name RegisterFieldLayouts
1659646SChris.Emmons@arm.com     * Bit layout declarations for multi-field registers.
1669646SChris.Emmons@arm.com     */
1679646SChris.Emmons@arm.com    /**@{*/
1689646SChris.Emmons@arm.com    BitUnion32(VersionReg)
1699646SChris.Emmons@arm.com        Bitfield<7,0>   version_minor;
1709646SChris.Emmons@arm.com        Bitfield<15,8>  version_major;
1719646SChris.Emmons@arm.com        Bitfield<31,16> product_id;
1729646SChris.Emmons@arm.com    EndBitUnion(VersionReg)
1739646SChris.Emmons@arm.com
17411090Sandreas.sandberg@arm.com    static constexpr uint32_t INT_DMA_END = (1UL << 0);
17511090Sandreas.sandberg@arm.com    static constexpr uint32_t INT_BUS_ERROR = (1UL << 1);
17611090Sandreas.sandberg@arm.com    static constexpr uint32_t INT_VSYNC = (1UL << 2);
17711090Sandreas.sandberg@arm.com    static constexpr uint32_t INT_UNDERRUN = (1UL << 3);
1789646SChris.Emmons@arm.com
1799646SChris.Emmons@arm.com    BitUnion32(FbLineCountReg)
1809646SChris.Emmons@arm.com        Bitfield<11,0>  fb_line_count;
1819646SChris.Emmons@arm.com        Bitfield<31,12> reserved_31_12;
1829646SChris.Emmons@arm.com    EndBitUnion(FbLineCountReg)
1839646SChris.Emmons@arm.com
1849646SChris.Emmons@arm.com    BitUnion32(BusOptsReg)
1859646SChris.Emmons@arm.com        Bitfield<4,0>   burst_len;
1869646SChris.Emmons@arm.com        Bitfield<7,5>   reserved_7_5;
1879646SChris.Emmons@arm.com        Bitfield<11,8>  max_outstanding;
1889646SChris.Emmons@arm.com        Bitfield<31,12> reserved_31_12;
1899646SChris.Emmons@arm.com    EndBitUnion(BusOptsReg)
1909646SChris.Emmons@arm.com
1919646SChris.Emmons@arm.com    BitUnion32(TimingReg)
1929646SChris.Emmons@arm.com        Bitfield<11,0>  val;
1939646SChris.Emmons@arm.com        Bitfield<31,12> reserved_31_12;
1949646SChris.Emmons@arm.com    EndBitUnion(TimingReg)
1959646SChris.Emmons@arm.com
1969646SChris.Emmons@arm.com    BitUnion32(PolaritiesReg)
1979646SChris.Emmons@arm.com        Bitfield<0>    vsync_polarity;
1989646SChris.Emmons@arm.com        Bitfield<1>    hsync_polarity;
1999646SChris.Emmons@arm.com        Bitfield<2>    dataen_polarity;
2009646SChris.Emmons@arm.com        Bitfield<3>    data_polarity;
2019646SChris.Emmons@arm.com        Bitfield<4>    pxlclk_polarity;
2029646SChris.Emmons@arm.com        Bitfield<31,5> reserved_31_5;
2039646SChris.Emmons@arm.com    EndBitUnion(PolaritiesReg)
2049646SChris.Emmons@arm.com
2059646SChris.Emmons@arm.com    BitUnion32(CommandReg)
2069646SChris.Emmons@arm.com        Bitfield<0>    enable;
2079646SChris.Emmons@arm.com        Bitfield<31,1> reserved_31_1;
2089646SChris.Emmons@arm.com    EndBitUnion(CommandReg)
2099646SChris.Emmons@arm.com
2109646SChris.Emmons@arm.com    BitUnion32(PixelFormatReg)
2119646SChris.Emmons@arm.com        Bitfield<2,0>  reserved_2_0;
2129646SChris.Emmons@arm.com        Bitfield<4,3>  bytes_per_pixel;
2139646SChris.Emmons@arm.com        Bitfield<30,5> reserved_30_5;
2149646SChris.Emmons@arm.com        Bitfield<31>   big_endian;
2159646SChris.Emmons@arm.com    EndBitUnion(PixelFormatReg)
2169646SChris.Emmons@arm.com
2179646SChris.Emmons@arm.com    BitUnion32(ColorSelectReg)
2189646SChris.Emmons@arm.com        Bitfield<4,0>   offset;
2199646SChris.Emmons@arm.com        Bitfield<7,5>   reserved_7_5;
2209646SChris.Emmons@arm.com        Bitfield<11,8>  size;
2219646SChris.Emmons@arm.com        Bitfield<15,12> reserved_15_12;
2229646SChris.Emmons@arm.com        Bitfield<23,16> default_color;
2239646SChris.Emmons@arm.com        Bitfield<31,24> reserved_31_24;
2249646SChris.Emmons@arm.com    EndBitUnion(ColorSelectReg)
2259646SChris.Emmons@arm.com    /**@}*/
2269646SChris.Emmons@arm.com
2279646SChris.Emmons@arm.com    /**
2289646SChris.Emmons@arm.com     * @name HDLCDRegisters
2299646SChris.Emmons@arm.com     * HDLCD register contents.
2309646SChris.Emmons@arm.com     */
2319646SChris.Emmons@arm.com    /**@{*/
23211090Sandreas.sandberg@arm.com    const VersionReg version;       /**< Version register */
23311090Sandreas.sandberg@arm.com    uint32_t int_rawstat;           /**< Interrupt raw status register */
23411090Sandreas.sandberg@arm.com    uint32_t int_mask;              /**< Interrupt mask register */
2359646SChris.Emmons@arm.com    uint32_t fb_base;               /**< Frame buffer base address register */
2369646SChris.Emmons@arm.com    uint32_t fb_line_length;        /**< Frame buffer Line length register */
2379646SChris.Emmons@arm.com    FbLineCountReg fb_line_count;   /**< Frame buffer Line count register */
23811090Sandreas.sandberg@arm.com    int32_t fb_line_pitch;          /**< Frame buffer Line pitch register */
2399646SChris.Emmons@arm.com    BusOptsReg bus_options;         /**< Bus options register */
2409646SChris.Emmons@arm.com    TimingReg v_sync;               /**< Vertical sync width register */
2419646SChris.Emmons@arm.com    TimingReg v_back_porch;         /**< Vertical back porch width register */
2429646SChris.Emmons@arm.com    TimingReg v_data;               /**< Vertical data width register */
2439646SChris.Emmons@arm.com    TimingReg v_front_porch;        /**< Vertical front porch width register */
2449646SChris.Emmons@arm.com    TimingReg h_sync;               /**< Horizontal sync width register */
2459646SChris.Emmons@arm.com    TimingReg h_back_porch;         /**< Horizontal back porch width register */
2469646SChris.Emmons@arm.com    TimingReg h_data;               /**< Horizontal data width register */
2479646SChris.Emmons@arm.com    TimingReg h_front_porch;        /**< Horizontal front porch width reg */
2489646SChris.Emmons@arm.com    PolaritiesReg polarities;       /**< Polarities register */
2499646SChris.Emmons@arm.com    CommandReg command;             /**< Command register */
2509646SChris.Emmons@arm.com    PixelFormatReg pixel_format;    /**< Pixel format register */
2519646SChris.Emmons@arm.com    ColorSelectReg red_select;      /**< Red color select register */
2529646SChris.Emmons@arm.com    ColorSelectReg green_select;    /**< Green color select register */
2539646SChris.Emmons@arm.com    ColorSelectReg blue_select;     /**< Blue color select register */
2549646SChris.Emmons@arm.com    /** @} */
2559646SChris.Emmons@arm.com
25611090Sandreas.sandberg@arm.com    uint32_t readReg(Addr offset);
25711090Sandreas.sandberg@arm.com    void writeReg(Addr offset, uint32_t value);
2589646SChris.Emmons@arm.com
25911090Sandreas.sandberg@arm.com    PixelConverter pixelConverter() const;
26011090Sandreas.sandberg@arm.com    DisplayTimings displayTimings() const;
26110839Sandreas.sandberg@arm.com
26211090Sandreas.sandberg@arm.com    void createDmaEngine();
26311090Sandreas.sandberg@arm.com
26411090Sandreas.sandberg@arm.com    void cmdEnable();
26511090Sandreas.sandberg@arm.com    void cmdDisable();
26611090Sandreas.sandberg@arm.com
26711090Sandreas.sandberg@arm.com    bool enabled() const { return command.enable; }
26811090Sandreas.sandberg@arm.com
26911090Sandreas.sandberg@arm.com  public: // Pixel pump callbacks
27011090Sandreas.sandberg@arm.com    bool pxlNext(Pixel &p);
27111090Sandreas.sandberg@arm.com    void pxlVSyncBegin();
27211090Sandreas.sandberg@arm.com    void pxlVSyncEnd();
27311090Sandreas.sandberg@arm.com    void pxlUnderrun();
27411090Sandreas.sandberg@arm.com    void pxlFrameDone();
27511090Sandreas.sandberg@arm.com
27611090Sandreas.sandberg@arm.com  protected: // Interrupt handling
27711090Sandreas.sandberg@arm.com    /**
27811090Sandreas.sandberg@arm.com     * Assign new interrupt values and update interrupt signals
27911090Sandreas.sandberg@arm.com     *
28011090Sandreas.sandberg@arm.com     * A new interrupt is scheduled signalled if the set of unmasked
28111090Sandreas.sandberg@arm.com     * interrupts goes empty to non-empty. Conversely, if the set of
28211090Sandreas.sandberg@arm.com     * unmasked interrupts goes from non-empty to empty, the interrupt
28311090Sandreas.sandberg@arm.com     * signal is cleared.
28411090Sandreas.sandberg@arm.com     *
28511090Sandreas.sandberg@arm.com     * @param ints New <i>raw</i> interrupt status
28611090Sandreas.sandberg@arm.com     * @param mask New interrupt mask
28711090Sandreas.sandberg@arm.com     */
28811090Sandreas.sandberg@arm.com    void setInterrupts(uint32_t ints, uint32_t mask);
28911090Sandreas.sandberg@arm.com
29011090Sandreas.sandberg@arm.com    /**
29111090Sandreas.sandberg@arm.com     * Convenience function to update the interrupt mask
29211090Sandreas.sandberg@arm.com     *
29311090Sandreas.sandberg@arm.com     * @see setInterrupts
29411090Sandreas.sandberg@arm.com     * @param mask New interrupt mask
29511090Sandreas.sandberg@arm.com     */
29611090Sandreas.sandberg@arm.com    void intMask(uint32_t mask) { setInterrupts(int_rawstat, mask); }
29711090Sandreas.sandberg@arm.com
29811090Sandreas.sandberg@arm.com    /**
29911090Sandreas.sandberg@arm.com     * Convenience function to raise a new interrupt
30011090Sandreas.sandberg@arm.com     *
30111090Sandreas.sandberg@arm.com     * @see setInterrupts
30211090Sandreas.sandberg@arm.com     * @param ints Set of interrupts to raise
30311090Sandreas.sandberg@arm.com     */
30411090Sandreas.sandberg@arm.com    void intRaise(uint32_t ints) {
30511090Sandreas.sandberg@arm.com        setInterrupts(int_rawstat | ints, int_mask);
30611090Sandreas.sandberg@arm.com    }
30711090Sandreas.sandberg@arm.com
30811090Sandreas.sandberg@arm.com    /**
30911090Sandreas.sandberg@arm.com     * Convenience function to clear interrupts
31011090Sandreas.sandberg@arm.com     *
31111090Sandreas.sandberg@arm.com     * @see setInterrupts
31211090Sandreas.sandberg@arm.com     * @param ints Set of interrupts to clear
31311090Sandreas.sandberg@arm.com     */
31411090Sandreas.sandberg@arm.com    void intClear(uint32_t ints) {
31511090Sandreas.sandberg@arm.com        setInterrupts(int_rawstat & ~ints, int_mask);
31611090Sandreas.sandberg@arm.com    }
31711090Sandreas.sandberg@arm.com
31811090Sandreas.sandberg@arm.com    /** Masked interrupt status register */
31911090Sandreas.sandberg@arm.com    const uint32_t intStatus() const { return int_rawstat & int_mask; }
32011090Sandreas.sandberg@arm.com
32111090Sandreas.sandberg@arm.com  protected: // Pixel output
32211090Sandreas.sandberg@arm.com    class PixelPump : public BasePixelPump
32311090Sandreas.sandberg@arm.com    {
32411090Sandreas.sandberg@arm.com      public:
32511090Sandreas.sandberg@arm.com        PixelPump(HDLcd &p, ClockDomain &pxl_clk, unsigned pixel_chunk)
32611090Sandreas.sandberg@arm.com            : BasePixelPump(p, pxl_clk, pixel_chunk), parent(p) {}
32711090Sandreas.sandberg@arm.com
32811090Sandreas.sandberg@arm.com        void dumpSettings();
32911090Sandreas.sandberg@arm.com
33011090Sandreas.sandberg@arm.com      protected:
33111168Sandreas.hansson@arm.com        bool nextPixel(Pixel &p) override { return parent.pxlNext(p); }
33211090Sandreas.sandberg@arm.com
33311168Sandreas.hansson@arm.com        void onVSyncBegin() override { return parent.pxlVSyncBegin(); }
33411168Sandreas.hansson@arm.com        void onVSyncEnd() override { return parent.pxlVSyncEnd(); }
33511090Sandreas.sandberg@arm.com
33611168Sandreas.hansson@arm.com        void onUnderrun(unsigned x, unsigned y) override {
33711090Sandreas.sandberg@arm.com            parent.pxlUnderrun();
33811090Sandreas.sandberg@arm.com        }
33911090Sandreas.sandberg@arm.com
34011168Sandreas.hansson@arm.com        void onFrameDone() override { parent.pxlFrameDone(); }
34111090Sandreas.sandberg@arm.com
34211090Sandreas.sandberg@arm.com      protected:
34311090Sandreas.sandberg@arm.com        HDLcd &parent;
34411090Sandreas.sandberg@arm.com    };
3459646SChris.Emmons@arm.com
3469646SChris.Emmons@arm.com    /** Helper to write out bitmaps */
34710839Sandreas.sandberg@arm.com    Bitmap bmp;
3489646SChris.Emmons@arm.com
3499646SChris.Emmons@arm.com    /** Picture of what the current frame buffer looks like */
3509646SChris.Emmons@arm.com    std::ostream *pic;
3519646SChris.Emmons@arm.com
35211090Sandreas.sandberg@arm.com    /** Cached pixel converter, set when the converter is enabled. */
35311090Sandreas.sandberg@arm.com    PixelConverter conv;
35411090Sandreas.sandberg@arm.com
35511090Sandreas.sandberg@arm.com    PixelPump pixelPump;
35611090Sandreas.sandberg@arm.com
35711090Sandreas.sandberg@arm.com  protected: // DMA handling
35811090Sandreas.sandberg@arm.com    class DmaEngine : public DmaReadFifo
3599646SChris.Emmons@arm.com    {
36011090Sandreas.sandberg@arm.com      public:
36111090Sandreas.sandberg@arm.com        DmaEngine(HDLcd &_parent, size_t size,
36211090Sandreas.sandberg@arm.com                  unsigned request_size, unsigned max_pending,
36311090Sandreas.sandberg@arm.com                  size_t line_size, ssize_t line_pitch, unsigned num_lines);
3649646SChris.Emmons@arm.com
36511090Sandreas.sandberg@arm.com        void startFrame(Addr fb_base);
36611090Sandreas.sandberg@arm.com        void abortFrame();
36711090Sandreas.sandberg@arm.com        void dumpSettings();
3689646SChris.Emmons@arm.com
36911168Sandreas.hansson@arm.com        void serialize(CheckpointOut &cp) const override;
37011168Sandreas.hansson@arm.com        void unserialize(CheckpointIn &cp) override;
3719646SChris.Emmons@arm.com
37211090Sandreas.sandberg@arm.com      protected:
37311168Sandreas.hansson@arm.com        void onEndOfBlock() override;
37411168Sandreas.hansson@arm.com        void onIdle() override;
3759646SChris.Emmons@arm.com
37611090Sandreas.sandberg@arm.com        HDLcd &parent;
37711090Sandreas.sandberg@arm.com        const size_t lineSize;
37811090Sandreas.sandberg@arm.com        const ssize_t linePitch;
37911090Sandreas.sandberg@arm.com        const unsigned numLines;
3809646SChris.Emmons@arm.com
38111090Sandreas.sandberg@arm.com        Addr nextLineAddr;
38211090Sandreas.sandberg@arm.com        Addr frameEnd;
3839646SChris.Emmons@arm.com    };
3849646SChris.Emmons@arm.com
38511090Sandreas.sandberg@arm.com    std::unique_ptr<DmaEngine> dmaEngine;
38611091Sandreas.sandberg@arm.com
38711091Sandreas.sandberg@arm.com  protected: // Statistics
38811091Sandreas.sandberg@arm.com    struct {
38911091Sandreas.sandberg@arm.com        Stats::Scalar underruns;
39011091Sandreas.sandberg@arm.com    } stats;
3919646SChris.Emmons@arm.com};
3929646SChris.Emmons@arm.com
3939646SChris.Emmons@arm.com#endif
394