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