rv_ctrl.cc revision 8870
17584SAli.Saidi@arm.com/* 27584SAli.Saidi@arm.com * Copyright (c) 2010 ARM Limited 37584SAli.Saidi@arm.com * All rights reserved 47584SAli.Saidi@arm.com * 57584SAli.Saidi@arm.com * The license below extends only to copyright in the software and shall 67584SAli.Saidi@arm.com * not be construed as granting a license to any other intellectual 77584SAli.Saidi@arm.com * property including but not limited to intellectual property relating 87584SAli.Saidi@arm.com * to a hardware implementation of the functionality of the software 97584SAli.Saidi@arm.com * licensed hereunder. You may use the software subject to the license 107584SAli.Saidi@arm.com * terms below provided that you ensure that this notice is replicated 117584SAli.Saidi@arm.com * unmodified and in its entirety in all distributions of the software, 127584SAli.Saidi@arm.com * modified or unmodified, in source code or in binary form. 137584SAli.Saidi@arm.com * 147584SAli.Saidi@arm.com * Redistribution and use in source and binary forms, with or without 157584SAli.Saidi@arm.com * modification, are permitted provided that the following conditions are 167584SAli.Saidi@arm.com * met: redistributions of source code must retain the above copyright 177584SAli.Saidi@arm.com * notice, this list of conditions and the following disclaimer; 187584SAli.Saidi@arm.com * redistributions in binary form must reproduce the above copyright 197584SAli.Saidi@arm.com * notice, this list of conditions and the following disclaimer in the 207584SAli.Saidi@arm.com * documentation and/or other materials provided with the distribution; 217584SAli.Saidi@arm.com * neither the name of the copyright holders nor the names of its 227584SAli.Saidi@arm.com * contributors may be used to endorse or promote products derived from 237584SAli.Saidi@arm.com * this software without specific prior written permission. 247584SAli.Saidi@arm.com * 257584SAli.Saidi@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 267584SAli.Saidi@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 277584SAli.Saidi@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 287584SAli.Saidi@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 297584SAli.Saidi@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 307584SAli.Saidi@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 317584SAli.Saidi@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 327584SAli.Saidi@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 337584SAli.Saidi@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 347584SAli.Saidi@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 357584SAli.Saidi@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 367584SAli.Saidi@arm.com * 377584SAli.Saidi@arm.com * Authors: Ali Saidi 387584SAli.Saidi@arm.com */ 397584SAli.Saidi@arm.com 407584SAli.Saidi@arm.com#include "base/trace.hh" 417584SAli.Saidi@arm.com#include "dev/arm/rv_ctrl.hh" 427584SAli.Saidi@arm.com#include "mem/packet.hh" 437584SAli.Saidi@arm.com#include "mem/packet_access.hh" 447584SAli.Saidi@arm.com 457584SAli.Saidi@arm.comRealViewCtrl::RealViewCtrl(Params *p) 468281SAli.Saidi@ARM.com : BasicPioDevice(p), flags(0) 477584SAli.Saidi@arm.com{ 487584SAli.Saidi@arm.com pioSize = 0xD4; 497584SAli.Saidi@arm.com} 507584SAli.Saidi@arm.com 517584SAli.Saidi@arm.comTick 527584SAli.Saidi@arm.comRealViewCtrl::read(PacketPtr pkt) 537584SAli.Saidi@arm.com{ 547584SAli.Saidi@arm.com assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize); 557584SAli.Saidi@arm.com assert(pkt->getSize() == 4); 567584SAli.Saidi@arm.com Addr daddr = pkt->getAddr() - pioAddr; 577584SAli.Saidi@arm.com pkt->allocate(); 587584SAli.Saidi@arm.com 597584SAli.Saidi@arm.com switch(daddr) { 608524SAli.Saidi@ARM.com case ProcId0: 618524SAli.Saidi@ARM.com pkt->set(params()->proc_id0); 628524SAli.Saidi@ARM.com break; 638524SAli.Saidi@ARM.com case ProcId1: 648524SAli.Saidi@ARM.com pkt->set(params()->proc_id1); 657584SAli.Saidi@arm.com break; 667584SAli.Saidi@arm.com case Clock24: 677584SAli.Saidi@arm.com Tick clk; 688273Schris.emmons@arm.com clk = (Tick)(curTick() / (24 * SimClock::Int::us)); 697584SAli.Saidi@arm.com pkt->set((uint32_t)(clk)); 707584SAli.Saidi@arm.com break; 718060SAli.Saidi@ARM.com case Clock100: 728060SAli.Saidi@ARM.com Tick clk100; 738273Schris.emmons@arm.com clk100 = (Tick)(curTick() / (100 * SimClock::Int::us)); 748060SAli.Saidi@ARM.com pkt->set((uint32_t)(clk100)); 758060SAli.Saidi@ARM.com break; 767584SAli.Saidi@arm.com case Flash: 777584SAli.Saidi@arm.com pkt->set<uint32_t>(0); 787584SAli.Saidi@arm.com break; 797950SAli.Saidi@ARM.com case Clcd: 807950SAli.Saidi@ARM.com pkt->set<uint32_t>(0x00001F00); 817950SAli.Saidi@ARM.com break; 827950SAli.Saidi@ARM.com case Osc0: 837950SAli.Saidi@ARM.com pkt->set<uint32_t>(0x00012C5C); 847950SAli.Saidi@ARM.com break; 857950SAli.Saidi@ARM.com case Osc1: 867950SAli.Saidi@ARM.com pkt->set<uint32_t>(0x00002CC0); 877950SAli.Saidi@ARM.com break; 887950SAli.Saidi@ARM.com case Osc2: 897950SAli.Saidi@ARM.com pkt->set<uint32_t>(0x00002C75); 907950SAli.Saidi@ARM.com break; 917950SAli.Saidi@ARM.com case Osc3: 927950SAli.Saidi@ARM.com pkt->set<uint32_t>(0x00020211); 937950SAli.Saidi@ARM.com break; 947950SAli.Saidi@ARM.com case Osc4: 957950SAli.Saidi@ARM.com pkt->set<uint32_t>(0x00002C75); 967950SAli.Saidi@ARM.com break; 977950SAli.Saidi@ARM.com case Lock: 987950SAli.Saidi@ARM.com pkt->set<uint32_t>(sysLock); 997950SAli.Saidi@ARM.com break; 1008281SAli.Saidi@ARM.com case Flags: 1018281SAli.Saidi@ARM.com pkt->set<uint32_t>(flags); 1028281SAli.Saidi@ARM.com break; 1038299Schander.sudanthi@arm.com case IdReg: 1048299Schander.sudanthi@arm.com pkt->set<uint32_t>(params()->idreg); 1058299Schander.sudanthi@arm.com break; 1068870SAli.Saidi@ARM.com case CfgStat: 1078870SAli.Saidi@ARM.com pkt->set<uint32_t>(1); 1087584SAli.Saidi@arm.com default: 1098299Schander.sudanthi@arm.com warn("Tried to read RealView I/O at offset %#x that doesn't exist\n", 1108299Schander.sudanthi@arm.com daddr); 1117584SAli.Saidi@arm.com break; 1127584SAli.Saidi@arm.com } 1137584SAli.Saidi@arm.com pkt->makeAtomicResponse(); 1147584SAli.Saidi@arm.com return pioDelay; 1157584SAli.Saidi@arm.com 1167584SAli.Saidi@arm.com} 1177584SAli.Saidi@arm.com 1187584SAli.Saidi@arm.comTick 1197584SAli.Saidi@arm.comRealViewCtrl::write(PacketPtr pkt) 1207584SAli.Saidi@arm.com{ 1217584SAli.Saidi@arm.com assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize); 1227584SAli.Saidi@arm.com 1237584SAli.Saidi@arm.com Addr daddr = pkt->getAddr() - pioAddr; 1247584SAli.Saidi@arm.com switch (daddr) { 1257584SAli.Saidi@arm.com case Flash: 1267950SAli.Saidi@ARM.com case Clcd: 1277950SAli.Saidi@ARM.com case Osc0: 1287950SAli.Saidi@ARM.com case Osc1: 1297950SAli.Saidi@ARM.com case Osc2: 1307950SAli.Saidi@ARM.com case Osc3: 1317950SAli.Saidi@ARM.com case Osc4: 1327950SAli.Saidi@ARM.com break; 1337950SAli.Saidi@ARM.com case Lock: 1347950SAli.Saidi@ARM.com sysLock.lockVal = pkt->get<uint16_t>(); 1357584SAli.Saidi@arm.com break; 1368281SAli.Saidi@ARM.com case Flags: 1378281SAli.Saidi@ARM.com flags = pkt->get<uint32_t>(); 1388281SAli.Saidi@ARM.com break; 1398524SAli.Saidi@ARM.com case FlagsClr: 1408524SAli.Saidi@ARM.com flags = 0; 1418524SAli.Saidi@ARM.com break; 1427584SAli.Saidi@arm.com default: 1438299Schander.sudanthi@arm.com warn("Tried to write RVIO at offset %#x that doesn't exist\n", 1448299Schander.sudanthi@arm.com daddr); 1457584SAli.Saidi@arm.com break; 1467584SAli.Saidi@arm.com } 1477584SAli.Saidi@arm.com pkt->makeAtomicResponse(); 1487584SAli.Saidi@arm.com return pioDelay; 1497584SAli.Saidi@arm.com} 1507584SAli.Saidi@arm.com 1517584SAli.Saidi@arm.comvoid 1527584SAli.Saidi@arm.comRealViewCtrl::serialize(std::ostream &os) 1537584SAli.Saidi@arm.com{ 1548281SAli.Saidi@ARM.com SERIALIZE_SCALAR(flags); 1557584SAli.Saidi@arm.com} 1567584SAli.Saidi@arm.com 1577584SAli.Saidi@arm.comvoid 1587584SAli.Saidi@arm.comRealViewCtrl::unserialize(Checkpoint *cp, const std::string §ion) 1597584SAli.Saidi@arm.com{ 1608281SAli.Saidi@ARM.com UNSERIALIZE_SCALAR(flags); 1617584SAli.Saidi@arm.com} 1627584SAli.Saidi@arm.com 1637584SAli.Saidi@arm.comRealViewCtrl * 1647584SAli.Saidi@arm.comRealViewCtrlParams::create() 1657584SAli.Saidi@arm.com{ 1667584SAli.Saidi@arm.com return new RealViewCtrl(this); 1677584SAli.Saidi@arm.com} 168