changeset 7a0c51f14095 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=7a0c51f14095
description:
ARM: Add support for HDLCD controller for TC2 and newer Versatile
Express tiles.
Newer core tiles / daughterboards for the Versatile Express platform
have an
HDLCD controller that supports HD-quality output. This patch adds an
implementation of the controller.
diffstat:
src/dev/arm/RealView.py | 14 +
src/dev/arm/SConscript | 2 +
src/dev/arm/hdlcd.cc | 856 ++++++++++++++++++++++++++++++++++++++++++++++++
src/dev/arm/hdlcd.hh | 502 ++++++++++++++++++++++++++++
4 files changed, 1374 insertions(+), 0 deletions(-)
diffs (truncated from 1433 to 300 lines):
diff -r c483700ae0ce -r 7a0c51f14095 src/dev/arm/RealView.py
--- a/src/dev/arm/RealView.py Mon Apr 22 13:20:31 2013 -0400
+++ b/src/dev/arm/RealView.py Mon Apr 22 13:20:31 2013 -0400
@@ -142,6 +142,16 @@
vnc = Param.VncInput(Parent.any, "Vnc server for remote frame buffer
display")
amba_id = 0x00141111
+class HDLcd(AmbaDmaDevice):
+ type = 'HDLcd'
+ cxx_header = "dev/arm/hdlcd.hh"
+ pixel_clock = Param.Clock('65MHz', "Clock frequency of the pixel clock "
+ "(i.e. PXLREFCLK / OSCCLK 5; 23.75MHz "
+ "default up to 165MHz)")
+ vnc = Param.VncInput(Parent.any, "Vnc server for remote frame buffer "
+ "display")
+ amba_id = 0x00141000
+
class RealView(Platform):
type = 'RealView'
cxx_header = "dev/arm/realview.hh"
@@ -333,6 +343,7 @@
timer0 = Sp804(int_num0=34, int_num1=34, pio_addr=0x1C110000,
clock0='1MHz', clock1='1MHz')
timer1 = Sp804(int_num0=35, int_num1=35, pio_addr=0x1C120000,
clock0='1MHz', clock1='1MHz')
clcd = Pl111(pio_addr=0x1c1f0000, int_num=46)
+ hdlcd = HDLcd(pio_addr=0x2b000000, int_num=117)
kmi0 = Pl050(pio_addr=0x1c060000, int_num=44)
kmi1 = Pl050(pio_addr=0x1c070000, int_num=45, is_mouse=True)
cf_ctrl = IdeController(disks=[], pci_func=0, pci_dev=0, pci_bus=2,
@@ -376,9 +387,11 @@
def attachOnChipIO(self, bus, bridge):
self.gic.pio = bus.master
self.local_cpu_timer.pio = bus.master
+ self.hdlcd.dma = bus.slave
# Bridge ranges based on excluding what is part of on-chip I/O
# (gic, a9scu)
bridge.ranges = [AddrRange(0x2F000000, size='16MB'),
+ AddrRange(0x2B000000, size='4MB'),
AddrRange(0x30000000, size='256MB'),
AddrRange(0x40000000, size='512MB'),
AddrRange(0x18000000, size='64MB'),
@@ -394,6 +407,7 @@
self.timer1.pio = bus.master
self.clcd.pio = bus.master
self.clcd.dma = bus.slave
+ self.hdlcd.pio = bus.master
self.kmi0.pio = bus.master
self.kmi1.pio = bus.master
self.cf_ctrl.pio = bus.master
diff -r c483700ae0ce -r 7a0c51f14095 src/dev/arm/SConscript
--- a/src/dev/arm/SConscript Mon Apr 22 13:20:31 2013 -0400
+++ b/src/dev/arm/SConscript Mon Apr 22 13:20:31 2013 -0400
@@ -50,6 +50,7 @@
Source('gic_pl390.cc')
Source('pl011.cc')
Source('pl111.cc')
+ Source('hdlcd.cc')
Source('kmi.cc')
Source('timer_sp804.cc')
Source('rv_ctrl.cc')
@@ -58,6 +59,7 @@
Source('timer_cpulocal.cc')
DebugFlag('AMBA')
+ DebugFlag('HDLcd')
DebugFlag('PL111')
DebugFlag('Pl050')
DebugFlag('GIC')
diff -r c483700ae0ce -r 7a0c51f14095 src/dev/arm/hdlcd.cc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/dev/arm/hdlcd.cc Mon Apr 22 13:20:31 2013 -0400
@@ -0,0 +1,856 @@
+/*
+ * Copyright (c) 2010-2013 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder. You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Chris Emmons
+ */
+
+#include "base/vnc/vncinput.hh"
+#include "base/bitmap.hh"
+#include "base/output.hh"
+#include "base/trace.hh"
+#include "debug/HDLcd.hh"
+#include "debug/Uart.hh"
+#include "dev/arm/amba_device.hh"
+#include "dev/arm/base_gic.hh"
+#include "dev/arm/hdlcd.hh"
+#include "mem/packet.hh"
+#include "mem/packet_access.hh"
+#include "sim/system.hh"
+
+using std::vector;
+
+
+// initialize hdlcd registers
+HDLcd::HDLcd(const Params *p)
+ : AmbaDmaDevice(p), version(VERSION_RESETV),
+ int_rawstat(0), int_clear(0), int_mask(0), int_status(0),
+ fb_base(0), fb_line_length(0), fb_line_count(0), fb_line_pitch(0),
+ bus_options(BUS_OPTIONS_RESETV),
+ v_sync(0), v_back_porch(0), v_data(0), v_front_porch(0),
+ h_sync(0), h_back_porch(0), h_data(0), h_front_porch(0),
+ polarities(0), command(0), pixel_format(0),
+ red_select(0), green_select(0), blue_select(0),
+ pixelClock(p->pixel_clock), vnc(p->vnc), bmp(NULL), pic(NULL),
+ frameReadStartTime(0),
+ dmaStartAddr(0), dmaCurAddr(0), dmaMaxAddr(0), dmaPendingNum(0),
+ frameUnderrun(false), virtualDisplayBuffer(NULL), pixelBufferSize(0),
+ pixelIndex(0), doUpdateParams(false), frameUnderway(false),
+ dmaBytesInFlight(0),
+ startFrameEvent(this), endFrameEvent(this), renderPixelEvent(this),
+ fillPixelBufferEvent(this), intEvent(this),
+ dmaDoneEventAll(MAX_OUTSTANDING_DMA_REQ_CAPACITY, this),
+ dmaDoneEventFree(MAX_OUTSTANDING_DMA_REQ_CAPACITY)
+{
+ pioSize = 0xFFFF;
+
+ for (int i = 0; i < MAX_OUTSTANDING_DMA_REQ_CAPACITY; ++i)
+ dmaDoneEventFree[i] = &dmaDoneEventAll[i];
+
+ if (vnc)
+ vnc->setFramebufferAddr(NULL);
+}
+
+HDLcd::~HDLcd()
+{
+ if (virtualDisplayBuffer)
+ delete [] virtualDisplayBuffer;
+}
+
+// read registers and frame buffer
+Tick
+HDLcd::read(PacketPtr pkt)
+{
+ uint32_t data = 0;
+ const Addr daddr = pkt->getAddr() - pioAddr;
+
+ DPRINTF(HDLcd, "read register BASE+0x%04x size=%d\n", daddr,
+ pkt->getSize());
+
+ assert(pkt->getAddr() >= pioAddr &&
+ pkt->getAddr() < pioAddr + pioSize &&
+ pkt->getSize() == 4);
+
+ pkt->allocate();
+
+ switch (daddr) {
+ case Version:
+ data = version;
+ break;
+ case Int_RawStat:
+ data = int_rawstat;
+ break;
+ case Int_Clear:
+ panic("HDLCD INT_CLEAR register is Write-Only\n");
+ break;
+ case Int_Mask:
+ data = int_mask;
+ break;
+ case Int_Status:
+ data = int_status;
+ break;
+ case Fb_Base:
+ data = fb_base;
+ break;
+ case Fb_Line_Length:
+ data = fb_line_length;
+ break;
+ case Fb_Line_Count:
+ data = fb_line_count;
+ break;
+ case Fb_Line_Pitch:
+ data = fb_line_pitch;
+ break;
+ case Bus_Options:
+ data = bus_options;
+ break;
+ case V_Sync:
+ data = v_sync;
+ break;
+ case V_Back_Porch:
+ data = v_back_porch;
+ break;
+ case V_Data:
+ data = v_data;
+ break;
+ case V_Front_Porch:
+ data = v_front_porch;
+ break;
+ case H_Sync:
+ data = h_sync;
+ break;
+ case H_Back_Porch:
+ data = h_back_porch;
+ break;
+ case H_Data:
+ data = h_data;
+ break;
+ case H_Front_Porch:
+ data = h_front_porch;
+ break;
+ case Polarities:
+ data = polarities;
+ break;
+ case Command:
+ data = command;
+ break;
+ case Pixel_Format:
+ data = pixel_format;
+ break;
+ case Red_Select:
+ data = red_select;
+ break;
+ case Green_Select:
+ data = green_select;
+ break;
+ case Blue_Select:
+ data = blue_select;
+ break;
+ default:
+ panic("Tried to read HDLCD register that doesn't exist\n", daddr);
+ break;
+ }
+
+ pkt->set<uint32_t>(data);
+ pkt->makeAtomicResponse();
+ return pioDelay;
+}
+
+// write registers and frame buffer
+Tick
+HDLcd::write(PacketPtr pkt)
+{
+ assert(pkt->getAddr() >= pioAddr &&
+ pkt->getAddr() < pioAddr + pioSize &&
+ pkt->getSize() == 4);
+
+ const uint32_t data = pkt->get<uint32_t>();
+ const Addr daddr = pkt->getAddr() - pioAddr;
+
+ DPRINTF(HDLcd, "write register BASE+%0x04x <= 0x%08x\n", daddr,
+ pkt->get<uint32_t>());
+
+ switch (daddr) {
+ case Version:
+ panic("HDLCD VERSION register is read-Only\n");
+ break;
+ case Int_RawStat:
+ int_rawstat = data;
+ break;
+ case Int_Clear:
+ int_clear = data;
+ break;
+ case Int_Mask:
+ int_mask = data;
+ break;
+ case Int_Status:
+ panic("HDLCD INT_STATUS register is read-Only\n");
+ break;
+ case Fb_Base:
+ fb_base = data;
+ DPRINTF(HDLcd, "HDLCD Frame Buffer located at addr 0x%08x\n", fb_base);
+ break;
+ case Fb_Line_Length:
+ fb_line_length = data;
+ DPRINTF(HDLcd, "HDLCD res = %d x %d\n", width(), height());
+ break;
+ case Fb_Line_Count:
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev