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