110389SAndreas.Sandberg@ARM.com/* 210389SAndreas.Sandberg@ARM.com * Copyright (c) 2014 ARM Limited 310389SAndreas.Sandberg@ARM.com * All rights reserved 410389SAndreas.Sandberg@ARM.com * 510389SAndreas.Sandberg@ARM.com * The license below extends only to copyright in the software and shall 610389SAndreas.Sandberg@ARM.com * not be construed as granting a license to any other intellectual 710389SAndreas.Sandberg@ARM.com * property including but not limited to intellectual property relating 810389SAndreas.Sandberg@ARM.com * to a hardware implementation of the functionality of the software 910389SAndreas.Sandberg@ARM.com * licensed hereunder. You may use the software subject to the license 1010389SAndreas.Sandberg@ARM.com * terms below provided that you ensure that this notice is replicated 1110389SAndreas.Sandberg@ARM.com * unmodified and in its entirety in all distributions of the software, 1210389SAndreas.Sandberg@ARM.com * modified or unmodified, in source code or in binary form. 1310389SAndreas.Sandberg@ARM.com * 1410389SAndreas.Sandberg@ARM.com * Redistribution and use in source and binary forms, with or without 1510389SAndreas.Sandberg@ARM.com * modification, are permitted provided that the following conditions are 1610389SAndreas.Sandberg@ARM.com * met: redistributions of source code must retain the above copyright 1710389SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer; 1810389SAndreas.Sandberg@ARM.com * redistributions in binary form must reproduce the above copyright 1910389SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer in the 2010389SAndreas.Sandberg@ARM.com * documentation and/or other materials provided with the distribution; 2110389SAndreas.Sandberg@ARM.com * neither the name of the copyright holders nor the names of its 2210389SAndreas.Sandberg@ARM.com * contributors may be used to endorse or promote products derived from 2310389SAndreas.Sandberg@ARM.com * this software without specific prior written permission. 2410389SAndreas.Sandberg@ARM.com * 2510389SAndreas.Sandberg@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2610389SAndreas.Sandberg@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2710389SAndreas.Sandberg@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2810389SAndreas.Sandberg@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2910389SAndreas.Sandberg@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3010389SAndreas.Sandberg@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3110389SAndreas.Sandberg@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3210389SAndreas.Sandberg@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3310389SAndreas.Sandberg@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3410389SAndreas.Sandberg@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3510389SAndreas.Sandberg@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3610389SAndreas.Sandberg@ARM.com * 3710389SAndreas.Sandberg@ARM.com * Authors: Andreas Sandberg 3810389SAndreas.Sandberg@ARM.com */ 3910389SAndreas.Sandberg@ARM.com 4010389SAndreas.Sandberg@ARM.com#ifndef __DEV_VIRTIO_CONSOLE_HH__ 4110389SAndreas.Sandberg@ARM.com#define __DEV_VIRTIO_CONSOLE_HH__ 4210389SAndreas.Sandberg@ARM.com 4312239Sandreas.sandberg@arm.com#include "dev/serial/serial.hh" 4410389SAndreas.Sandberg@ARM.com#include "dev/virtio/base.hh" 4510389SAndreas.Sandberg@ARM.com 4610389SAndreas.Sandberg@ARM.comstruct VirtIOConsoleParams; 4710389SAndreas.Sandberg@ARM.com 4810389SAndreas.Sandberg@ARM.com/** 4910389SAndreas.Sandberg@ARM.com * VirtIO console 5010389SAndreas.Sandberg@ARM.com * 5110389SAndreas.Sandberg@ARM.com * The VirtIO console uses the following queues: 5210389SAndreas.Sandberg@ARM.com * -# Port0 receive (from host to guest) 5310389SAndreas.Sandberg@ARM.com * -# Port0 transmit (from guest to host) 5410389SAndreas.Sandberg@ARM.com * -# Control receive (optional) 5510389SAndreas.Sandberg@ARM.com * -# Control transmit (optional) 5610389SAndreas.Sandberg@ARM.com * -# Port1 receive (optional) 5710389SAndreas.Sandberg@ARM.com * -# Port1 transmit (optional) 5810389SAndreas.Sandberg@ARM.com * 5910389SAndreas.Sandberg@ARM.com * This implementation implements the minimum of features for one 6010389SAndreas.Sandberg@ARM.com * port, which means that the multiport feature is not announced and 6110389SAndreas.Sandberg@ARM.com * only queue 0 and 1 are available. 6210389SAndreas.Sandberg@ARM.com * 6310389SAndreas.Sandberg@ARM.com * @see https://github.com/rustyrussell/virtio-spec 6410389SAndreas.Sandberg@ARM.com * @see http://docs.oasis-open.org/virtio/virtio/v1.0/virtio-v1.0.html 6510389SAndreas.Sandberg@ARM.com */ 6610389SAndreas.Sandberg@ARM.comclass VirtIOConsole : public VirtIODeviceBase 6710389SAndreas.Sandberg@ARM.com{ 6810389SAndreas.Sandberg@ARM.com public: 6910389SAndreas.Sandberg@ARM.com typedef VirtIOConsoleParams Params; 7010389SAndreas.Sandberg@ARM.com VirtIOConsole(Params *params); 7110389SAndreas.Sandberg@ARM.com virtual ~VirtIOConsole(); 7210389SAndreas.Sandberg@ARM.com 7310389SAndreas.Sandberg@ARM.com void readConfig(PacketPtr pkt, Addr cfgOffset); 7410389SAndreas.Sandberg@ARM.com 7510389SAndreas.Sandberg@ARM.com protected: 7610389SAndreas.Sandberg@ARM.com /** 7710389SAndreas.Sandberg@ARM.com * Console configuration structure 7810389SAndreas.Sandberg@ARM.com * 7910389SAndreas.Sandberg@ARM.com * @note This needs to be changed if the multiport feature is 8010389SAndreas.Sandberg@ARM.com * announced! 8110389SAndreas.Sandberg@ARM.com */ 8210389SAndreas.Sandberg@ARM.com struct Config { 8310389SAndreas.Sandberg@ARM.com uint16_t cols; 8410389SAndreas.Sandberg@ARM.com uint16_t rows; 8510389SAndreas.Sandberg@ARM.com } M5_ATTR_PACKED; 8610389SAndreas.Sandberg@ARM.com 8710389SAndreas.Sandberg@ARM.com /** Currently active configuration (host byte order) */ 8810389SAndreas.Sandberg@ARM.com Config config; 8910389SAndreas.Sandberg@ARM.com 9010389SAndreas.Sandberg@ARM.com /** VirtIO device ID */ 9110389SAndreas.Sandberg@ARM.com static const DeviceId ID_CONSOLE = 0x03; 9210389SAndreas.Sandberg@ARM.com 9310389SAndreas.Sandberg@ARM.com /** @{ 9410389SAndreas.Sandberg@ARM.com * @name Feature bits 9510389SAndreas.Sandberg@ARM.com */ 9610389SAndreas.Sandberg@ARM.com /** Provides the size information */ 9710389SAndreas.Sandberg@ARM.com static const FeatureBits F_SIZE = 0x01; 9810389SAndreas.Sandberg@ARM.com /** Supports the multi-port interface */ 9910389SAndreas.Sandberg@ARM.com static const FeatureBits F_MULTIPORT = 0x02; 10010389SAndreas.Sandberg@ARM.com /** @} */ 10110389SAndreas.Sandberg@ARM.com 10210389SAndreas.Sandberg@ARM.com 10310389SAndreas.Sandberg@ARM.com protected: 10410389SAndreas.Sandberg@ARM.com /** 10510389SAndreas.Sandberg@ARM.com * Virtqueue for data going from the host to the guest. 10610389SAndreas.Sandberg@ARM.com */ 10710389SAndreas.Sandberg@ARM.com class TermRecvQueue 10810389SAndreas.Sandberg@ARM.com : public VirtQueue 10910389SAndreas.Sandberg@ARM.com { 11010389SAndreas.Sandberg@ARM.com public: 11110389SAndreas.Sandberg@ARM.com TermRecvQueue(PortProxy &proxy, uint16_t size, VirtIOConsole &_parent) 11210389SAndreas.Sandberg@ARM.com : VirtQueue(proxy, size), parent(_parent) {} 11310389SAndreas.Sandberg@ARM.com virtual ~TermRecvQueue() {} 11410389SAndreas.Sandberg@ARM.com 11510389SAndreas.Sandberg@ARM.com void onNotify() { trySend(); } 11610389SAndreas.Sandberg@ARM.com 11710389SAndreas.Sandberg@ARM.com /** Try to send data pending data from the terminal. */ 11810389SAndreas.Sandberg@ARM.com void trySend(); 11910389SAndreas.Sandberg@ARM.com 12010389SAndreas.Sandberg@ARM.com std::string name() const { return parent.name() + ".qRecv"; } 12110389SAndreas.Sandberg@ARM.com 12210389SAndreas.Sandberg@ARM.com protected: 12310389SAndreas.Sandberg@ARM.com VirtIOConsole &parent; 12410389SAndreas.Sandberg@ARM.com }; 12510389SAndreas.Sandberg@ARM.com /** Receive queue for port 0 */ 12610389SAndreas.Sandberg@ARM.com TermRecvQueue qRecv; 12710389SAndreas.Sandberg@ARM.com 12810389SAndreas.Sandberg@ARM.com /** 12910389SAndreas.Sandberg@ARM.com * Virtqueue for data going from the guest to the host. 13010389SAndreas.Sandberg@ARM.com */ 13110389SAndreas.Sandberg@ARM.com class TermTransQueue 13210389SAndreas.Sandberg@ARM.com : public VirtQueue 13310389SAndreas.Sandberg@ARM.com { 13410389SAndreas.Sandberg@ARM.com public: 13510389SAndreas.Sandberg@ARM.com TermTransQueue(PortProxy &proxy, uint16_t size, VirtIOConsole &_parent) 13610389SAndreas.Sandberg@ARM.com : VirtQueue(proxy, size), parent(_parent) {} 13710389SAndreas.Sandberg@ARM.com virtual ~TermTransQueue() {} 13810389SAndreas.Sandberg@ARM.com 13910389SAndreas.Sandberg@ARM.com void onNotifyDescriptor(VirtDescriptor *desc); 14010389SAndreas.Sandberg@ARM.com 14110389SAndreas.Sandberg@ARM.com std::string name() const { return parent.name() + ".qTrans"; } 14210389SAndreas.Sandberg@ARM.com 14310389SAndreas.Sandberg@ARM.com protected: 14410389SAndreas.Sandberg@ARM.com VirtIOConsole &parent; 14510389SAndreas.Sandberg@ARM.com }; 14610389SAndreas.Sandberg@ARM.com /** Transmit queue for port 0 */ 14710389SAndreas.Sandberg@ARM.com TermTransQueue qTrans; 14810389SAndreas.Sandberg@ARM.com 14910389SAndreas.Sandberg@ARM.com protected: 15012237Sandreas.sandberg@arm.com SerialDevice &device; 15110389SAndreas.Sandberg@ARM.com MakeCallback<VirtIOConsole::TermRecvQueue, 15210389SAndreas.Sandberg@ARM.com &VirtIOConsole::TermRecvQueue::trySend> callbackDataAvail; 15310389SAndreas.Sandberg@ARM.com}; 15410389SAndreas.Sandberg@ARM.com 15510389SAndreas.Sandberg@ARM.com#endif // __DEV_VIRTIO_CONSOLE_HH__ 156