112740Sandreas.sandberg@arm.com/* 212740Sandreas.sandberg@arm.com * Copyright (c) 2016-2018 ARM Limited 312740Sandreas.sandberg@arm.com * All rights reserved 412740Sandreas.sandberg@arm.com * 512740Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall 612740Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual 712740Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating 812740Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software 912740Sandreas.sandberg@arm.com * licensed hereunder. You may use the software subject to the license 1012740Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated 1112740Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software, 1212740Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form. 1312740Sandreas.sandberg@arm.com * 1412740Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without 1512740Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are 1612740Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright 1712740Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer; 1812740Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright 1912740Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 2012740Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution; 2112740Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its 2212740Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from 2312740Sandreas.sandberg@arm.com * this software without specific prior written permission. 2412740Sandreas.sandberg@arm.com * 2512740Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2612740Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2712740Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2812740Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2912740Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3012740Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3112740Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3212740Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3312740Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3412740Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3512740Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3612740Sandreas.sandberg@arm.com * 3712740Sandreas.sandberg@arm.com * Authors: Andreas Sandberg 3812740Sandreas.sandberg@arm.com */ 3912740Sandreas.sandberg@arm.com 4012740Sandreas.sandberg@arm.com#ifndef __DEV_ARM_VIO_MMIO_HH__ 4112740Sandreas.sandberg@arm.com#define __DEV_ARM_VIO_MMIO_HH__ 4212740Sandreas.sandberg@arm.com 4312740Sandreas.sandberg@arm.com#include "dev/io_device.hh" 4412740Sandreas.sandberg@arm.com#include "dev/virtio/base.hh" 4512740Sandreas.sandberg@arm.com 4612740Sandreas.sandberg@arm.comclass ArmInterruptPin; 4712740Sandreas.sandberg@arm.comstruct MmioVirtIOParams; 4812740Sandreas.sandberg@arm.com 4912740Sandreas.sandberg@arm.comclass MmioVirtIO : public BasicPioDevice 5012740Sandreas.sandberg@arm.com{ 5112740Sandreas.sandberg@arm.com public: 5212740Sandreas.sandberg@arm.com MmioVirtIO(const MmioVirtIOParams *params); 5312740Sandreas.sandberg@arm.com virtual ~MmioVirtIO(); 5412740Sandreas.sandberg@arm.com 5512740Sandreas.sandberg@arm.com protected: // BasicPioDevice 5612740Sandreas.sandberg@arm.com Tick read(PacketPtr pkt) override; 5712740Sandreas.sandberg@arm.com Tick write(PacketPtr pkt) override; 5812740Sandreas.sandberg@arm.com 5912740Sandreas.sandberg@arm.com protected: 6012740Sandreas.sandberg@arm.com /** @{ */ 6112740Sandreas.sandberg@arm.com /** Offsets into VirtIO MMIO space. */ 6212740Sandreas.sandberg@arm.com 6312740Sandreas.sandberg@arm.com enum : Addr { 6412740Sandreas.sandberg@arm.com OFF_MAGIC = 0x00, 6512740Sandreas.sandberg@arm.com OFF_VERSION = 0x04, 6612740Sandreas.sandberg@arm.com OFF_DEVICE_ID = 0x08, 6712740Sandreas.sandberg@arm.com OFF_VENDOR_ID = 0x0C, 6812740Sandreas.sandberg@arm.com OFF_HOST_FEATURES = 0x10, 6912740Sandreas.sandberg@arm.com OFF_HOST_FEATURES_SELECT = 0x14, 7012740Sandreas.sandberg@arm.com OFF_GUEST_FEATURES = 0x20, 7112740Sandreas.sandberg@arm.com OFF_GUEST_FEATURES_SELECT = 0x24, 7212740Sandreas.sandberg@arm.com OFF_GUEST_PAGE_SIZE = 0x28, 7312740Sandreas.sandberg@arm.com OFF_QUEUE_SELECT = 0x30, 7412740Sandreas.sandberg@arm.com OFF_QUEUE_NUM_MAX = 0x34, 7512740Sandreas.sandberg@arm.com OFF_QUEUE_NUM = 0x38, 7612740Sandreas.sandberg@arm.com OFF_QUEUE_ALIGN = 0x3C, 7712740Sandreas.sandberg@arm.com OFF_QUEUE_PFN = 0x40, 7812740Sandreas.sandberg@arm.com OFF_QUEUE_NOTIFY = 0x50, 7912740Sandreas.sandberg@arm.com OFF_INTERRUPT_STATUS = 0x60, 8012740Sandreas.sandberg@arm.com OFF_INTERRUPT_ACK = 0x64, 8112740Sandreas.sandberg@arm.com OFF_STATUS = 0x70, 8212740Sandreas.sandberg@arm.com OFF_CONFIG = 0x100, 8312740Sandreas.sandberg@arm.com }; 8412740Sandreas.sandberg@arm.com 8512740Sandreas.sandberg@arm.com /** @} */ 8612740Sandreas.sandberg@arm.com 8712740Sandreas.sandberg@arm.com enum { 8812740Sandreas.sandberg@arm.com INT_USED_RING = 1 << 0, 8912740Sandreas.sandberg@arm.com INT_CONFIG = 1 << 1, 9012740Sandreas.sandberg@arm.com }; 9112740Sandreas.sandberg@arm.com 9212740Sandreas.sandberg@arm.com static const uint32_t MAGIC = 0x74726976; 9312740Sandreas.sandberg@arm.com static const uint32_t VERSION = 1; 9412740Sandreas.sandberg@arm.com static const uint32_t VENDOR_ID = 0x1AF4; 9512740Sandreas.sandberg@arm.com 9612740Sandreas.sandberg@arm.com 9712740Sandreas.sandberg@arm.com uint32_t read(Addr offset); 9812740Sandreas.sandberg@arm.com void write(Addr offset, uint32_t value); 9912740Sandreas.sandberg@arm.com 10012740Sandreas.sandberg@arm.com void kick(); 10112740Sandreas.sandberg@arm.com void setInterrupts(uint32_t value); 10212740Sandreas.sandberg@arm.com 10312740Sandreas.sandberg@arm.com uint32_t hostFeaturesSelect; 10412740Sandreas.sandberg@arm.com uint32_t guestFeaturesSelect; 10512740Sandreas.sandberg@arm.com uint32_t pageSize; 10612740Sandreas.sandberg@arm.com uint32_t interruptStatus; 10712740Sandreas.sandberg@arm.com 10812740Sandreas.sandberg@arm.com MakeCallback<MmioVirtIO, &MmioVirtIO::kick> callbackKick; 10912740Sandreas.sandberg@arm.com 11012740Sandreas.sandberg@arm.com protected: // Params 11112740Sandreas.sandberg@arm.com VirtIODeviceBase &vio; 11212740Sandreas.sandberg@arm.com ArmInterruptPin *const interrupt; 11312740Sandreas.sandberg@arm.com}; 11412740Sandreas.sandberg@arm.com 11512740Sandreas.sandberg@arm.com#endif // __DEV_ARM_VIO_MMIO_HH__ 116