112689Sandreas.sandberg@arm.com/* 212689Sandreas.sandberg@arm.com * Copyright (c) 2018 ARM Limited 312689Sandreas.sandberg@arm.com * All rights reserved 412689Sandreas.sandberg@arm.com * 512689Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall 612689Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual 712689Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating 812689Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software 912689Sandreas.sandberg@arm.com * licensed hereunder. You may use the software subject to the license 1012689Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated 1112689Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software, 1212689Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form. 1312689Sandreas.sandberg@arm.com * 1412689Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without 1512689Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are 1612689Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright 1712689Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer; 1812689Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright 1912689Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 2012689Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution; 2112689Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its 2212689Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from 2312689Sandreas.sandberg@arm.com * this software without specific prior written permission. 2412689Sandreas.sandberg@arm.com * 2512689Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2612689Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2712689Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2812689Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2912689Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3012689Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3112689Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3212689Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3312689Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3412689Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3512689Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3612689Sandreas.sandberg@arm.com * 3712689Sandreas.sandberg@arm.com * Authors: Andreas Sandberg 3812689Sandreas.sandberg@arm.com */ 3912689Sandreas.sandberg@arm.com 4012689Sandreas.sandberg@arm.com#include "dev/serial/simple.hh" 4112689Sandreas.sandberg@arm.com 4212689Sandreas.sandberg@arm.com#include "mem/packet.hh" 4312689Sandreas.sandberg@arm.com#include "mem/packet_access.hh" 4412689Sandreas.sandberg@arm.com#include "params/SimpleUart.hh" 4512689Sandreas.sandberg@arm.com#include "sim/sim_exit.hh" 4612689Sandreas.sandberg@arm.com 4712689Sandreas.sandberg@arm.comSimpleUart::SimpleUart(const SimpleUartParams *p) 4812689Sandreas.sandberg@arm.com : Uart(p, p->pio_size), 4912689Sandreas.sandberg@arm.com byteOrder(p->big_endian ? BigEndianByteOrder : LittleEndianByteOrder), 5012689Sandreas.sandberg@arm.com endOnEOT(p->end_on_eot) 5112689Sandreas.sandberg@arm.com{ 5212689Sandreas.sandberg@arm.com} 5312689Sandreas.sandberg@arm.com 5412689Sandreas.sandberg@arm.comTick 5512689Sandreas.sandberg@arm.comSimpleUart::read(PacketPtr pkt) 5612689Sandreas.sandberg@arm.com{ 5712689Sandreas.sandberg@arm.com assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize); 5812689Sandreas.sandberg@arm.com 5912689Sandreas.sandberg@arm.com uint64_t data = 0; 6012689Sandreas.sandberg@arm.com 6112689Sandreas.sandberg@arm.com if (device->dataAvailable()) 6212689Sandreas.sandberg@arm.com data = device->readData(); 6312689Sandreas.sandberg@arm.com 6412689Sandreas.sandberg@arm.com pkt->setUintX(data, byteOrder); 6512689Sandreas.sandberg@arm.com 6612689Sandreas.sandberg@arm.com pkt->makeAtomicResponse(); 6712689Sandreas.sandberg@arm.com return pioDelay; 6812689Sandreas.sandberg@arm.com} 6912689Sandreas.sandberg@arm.com 7012689Sandreas.sandberg@arm.comTick 7112689Sandreas.sandberg@arm.comSimpleUart::write(PacketPtr pkt) 7212689Sandreas.sandberg@arm.com{ 7312689Sandreas.sandberg@arm.com 7412689Sandreas.sandberg@arm.com assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize); 7512689Sandreas.sandberg@arm.com 7612689Sandreas.sandberg@arm.com uint8_t data = (uint8_t)pkt->getUintX(byteOrder); 7712689Sandreas.sandberg@arm.com if (data == 0x04 && endOnEOT) 7812689Sandreas.sandberg@arm.com exitSimLoop("UART received EOT", 0); 7912689Sandreas.sandberg@arm.com 8012689Sandreas.sandberg@arm.com device->writeData(data); 8112689Sandreas.sandberg@arm.com 8212689Sandreas.sandberg@arm.com pkt->makeAtomicResponse(); 8312689Sandreas.sandberg@arm.com return pioDelay; 8412689Sandreas.sandberg@arm.com} 8512689Sandreas.sandberg@arm.com 8612689Sandreas.sandberg@arm.comSimpleUart * 8712689Sandreas.sandberg@arm.comSimpleUartParams::create() 8812689Sandreas.sandberg@arm.com{ 8912689Sandreas.sandberg@arm.com return new SimpleUart(this); 9012689Sandreas.sandberg@arm.com} 91