gic.cc revision 11462
19243SN/A/*
210206Sandreas.hansson@arm.com * Copyright (c) 2015-2016 ARM Limited
39243SN/A * All rights reserved
49243SN/A *
59243SN/A * The license below extends only to copyright in the software and shall
69243SN/A * not be construed as granting a license to any other intellectual
79243SN/A * property including but not limited to intellectual property relating
89243SN/A * to a hardware implementation of the functionality of the software
99243SN/A * licensed hereunder.  You may use the software subject to the license
109243SN/A * terms below provided that you ensure that this notice is replicated
119243SN/A * unmodified and in its entirety in all distributions of the software,
129243SN/A * modified or unmodified, in source code or in binary form.
139243SN/A *
149831SN/A * Redistribution and use in source and binary forms, with or without
159831SN/A * modification, are permitted provided that the following conditions are
169831SN/A * met: redistributions of source code must retain the above copyright
179243SN/A * notice, this list of conditions and the following disclaimer;
189243SN/A * redistributions in binary form must reproduce the above copyright
199243SN/A * notice, this list of conditions and the following disclaimer in the
209243SN/A * documentation and/or other materials provided with the distribution;
219243SN/A * neither the name of the copyright holders nor the names of its
229243SN/A * contributors may be used to endorse or promote products derived from
239243SN/A * this software without specific prior written permission.
249243SN/A *
259243SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
269243SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
279243SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
289243SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
299243SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
309243SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
319243SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
329243SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
339243SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
349243SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
359243SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
369243SN/A *
379243SN/A * Authors: Andreas Sandberg
389243SN/A */
399243SN/A
409243SN/A#include "arch/arm/kvm/gic.hh"
419243SN/A
429967SN/A#include <linux/kvm.h>
439243SN/A
449243SN/A#include "debug/Interrupt.hh"
4510146Sandreas.hansson@arm.com#include "params/KvmGic.hh"
469356SN/A
4710146Sandreas.hansson@arm.comKvmKernelGicV2::KvmKernelGicV2(KvmVM &_vm, Addr cpu_addr, Addr dist_addr,
4810247Sandreas.hansson@arm.com                               unsigned it_lines)
4910208Sandreas.hansson@arm.com    : cpuRange(RangeSize(cpu_addr, KVM_VGIC_V2_CPU_SIZE)),
509352SN/A      distRange(RangeSize(dist_addr, KVM_VGIC_V2_DIST_SIZE)),
5110146Sandreas.hansson@arm.com      vm(_vm),
529814SN/A      kdev(vm.createDevice(KVM_DEV_TYPE_ARM_VGIC_V2))
539243SN/A{
549243SN/A    kdev.setAttr<uint64_t>(
5510432SOmar.Naji@arm.com        KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V2_ADDR_TYPE_DIST, dist_addr);
569243SN/A    kdev.setAttr<uint64_t>(
5710146Sandreas.hansson@arm.com        KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V2_ADDR_TYPE_CPU, cpu_addr);
589243SN/A
599243SN/A    kdev.setAttr<uint32_t>(KVM_DEV_ARM_VGIC_GRP_NR_IRQS, 0, it_lines);
609243SN/A}
6110211Sandreas.hansson@arm.com
6210208Sandreas.hansson@arm.comKvmKernelGicV2::~KvmKernelGicV2()
6310208Sandreas.hansson@arm.com{
6410208Sandreas.hansson@arm.com}
6510489SOmar.Naji@arm.com
669831SN/Avoid
679831SN/AKvmKernelGicV2::setSPI(unsigned spi)
689831SN/A{
699831SN/A    setIntState(KVM_ARM_IRQ_TYPE_SPI, 0, spi, true);
709831SN/A}
7110140SN/A
7210286Sandreas.hansson@arm.comvoid
739243SN/AKvmKernelGicV2::clearSPI(unsigned spi)
7410394Swendy.elsasser@arm.com{
7510394Swendy.elsasser@arm.com    setIntState(KVM_ARM_IRQ_TYPE_SPI, 0, spi, false);
769566SN/A}
779243SN/A
789243SN/Avoid
7910140SN/AKvmKernelGicV2::setPPI(unsigned vcpu, unsigned ppi)
8010140SN/A{
8110147Sandreas.hansson@arm.com    setIntState(KVM_ARM_IRQ_TYPE_PPI, vcpu, ppi, true);
8210147Sandreas.hansson@arm.com}
8310393Swendy.elsasser@arm.com
8410394Swendy.elsasser@arm.comvoid
8510394Swendy.elsasser@arm.comKvmKernelGicV2::clearPPI(unsigned vcpu, unsigned ppi)
8610394Swendy.elsasser@arm.com{
879243SN/A    setIntState(KVM_ARM_IRQ_TYPE_PPI, vcpu, ppi, false);
889243SN/A}
8910141SN/A
909726SN/Avoid
919726SN/AKvmKernelGicV2::setIntState(unsigned type, unsigned vcpu, unsigned irq,
9210208Sandreas.hansson@arm.com                            bool high)
9310208Sandreas.hansson@arm.com{
9410393Swendy.elsasser@arm.com    assert(type <= KVM_ARM_IRQ_TYPE_MASK);
9510432SOmar.Naji@arm.com    assert(vcpu <= KVM_ARM_IRQ_VCPU_MASK);
969243SN/A    assert(irq <= KVM_ARM_IRQ_NUM_MASK);
979243SN/A    const uint32_t line(
989243SN/A        (type << KVM_ARM_IRQ_TYPE_SHIFT) |
999243SN/A        (vcpu << KVM_ARM_IRQ_VCPU_SHIFT) |
10010432SOmar.Naji@arm.com        (irq << KVM_ARM_IRQ_NUM_SHIFT));
10110432SOmar.Naji@arm.com
10210432SOmar.Naji@arm.com    vm.setIRQLine(line, high);
10310432SOmar.Naji@arm.com}
10410432SOmar.Naji@arm.com
10510432SOmar.Naji@arm.com
10610432SOmar.Naji@arm.comKvmGic::KvmGic(const KvmGicParams *p)
1079969SN/A    : BaseGic(p),
1089243SN/A      system(*p->system),
1099243SN/A      kernelGic(*p->kvmVM, p->cpu_addr, p->dist_addr, p->it_lines),
1109969SN/A      addrRanges{kernelGic.distRange, kernelGic.cpuRange}
1119243SN/A{
1129243SN/A}
11310246Sandreas.hansson@arm.com
11410246Sandreas.hansson@arm.comKvmGic::~KvmGic()
11510246Sandreas.hansson@arm.com{
11610246Sandreas.hansson@arm.com}
11710246Sandreas.hansson@arm.com
11810561SOmar.Naji@arm.comvoid
11910561SOmar.Naji@arm.comKvmGic::serialize(CheckpointOut &cp) const
12010561SOmar.Naji@arm.com{
12110394Swendy.elsasser@arm.com    panic("Checkpointing unsupported\n");
12210394Swendy.elsasser@arm.com}
12310394Swendy.elsasser@arm.com
12410394Swendy.elsasser@arm.comvoid
12510394Swendy.elsasser@arm.comKvmGic::unserialize(CheckpointIn &cp)
12610394Swendy.elsasser@arm.com{
12710394Swendy.elsasser@arm.com    panic("Checkpointing unsupported\n");
12810394Swendy.elsasser@arm.com}
12910394Swendy.elsasser@arm.com
13010394Swendy.elsasser@arm.comTick
13110394Swendy.elsasser@arm.comKvmGic::read(PacketPtr pkt)
13210394Swendy.elsasser@arm.com{
13310394Swendy.elsasser@arm.com    panic("KvmGic: PIO from gem5 is currently unsupported\n");
13410246Sandreas.hansson@arm.com}
13510246Sandreas.hansson@arm.com
13610246Sandreas.hansson@arm.comTick
13710140SN/AKvmGic::write(PacketPtr pkt)
13810140SN/A{
13910140SN/A    panic("KvmGic: PIO from gem5 is currently unsupported\n");
14010140SN/A}
14110140SN/A
1429243SN/Avoid
1439243SN/AKvmGic::sendInt(uint32_t num)
1449567SN/A{
1459243SN/A    DPRINTF(Interrupt, "Set SPI %d\n", num);
14610489SOmar.Naji@arm.com    kernelGic.setSPI(num);
14710489SOmar.Naji@arm.com}
14810489SOmar.Naji@arm.com
14910489SOmar.Naji@arm.comvoid
15010489SOmar.Naji@arm.comKvmGic::clearInt(uint32_t num)
15110489SOmar.Naji@arm.com{
15210489SOmar.Naji@arm.com    DPRINTF(Interrupt, "Clear SPI %d\n", num);
15310489SOmar.Naji@arm.com    kernelGic.clearSPI(num);
15410489SOmar.Naji@arm.com}
15510489SOmar.Naji@arm.com
1569243SN/Avoid
1579243SN/AKvmGic::sendPPInt(uint32_t num, uint32_t cpu)
1589831SN/A{
1599831SN/A    DPRINTF(Interrupt, "Set PPI %d:%d\n", cpu, num);
1609831SN/A    kernelGic.setPPI(cpu, num);
1619831SN/A}
1629831SN/A
1639243SN/Avoid
16410286Sandreas.hansson@arm.comKvmGic::clearPPInt(uint32_t num, uint32_t cpu)
1659566SN/A{
1669566SN/A    DPRINTF(Interrupt, "Clear PPI %d:%d\n", cpu, num);
16710143SN/A    kernelGic.clearPPI(cpu, num);
1689566SN/A}
1699566SN/A
17010136SN/Avoid
1719831SN/AKvmGic::verifyMemoryMode() const
17210286Sandreas.hansson@arm.com{
17310136SN/A    if (!(system.isAtomicMode() && system.bypassCaches())) {
1749566SN/A        fatal("The in-kernel KVM GIC can only be used with KVM CPUs, but the "
17510286Sandreas.hansson@arm.com              "current memory mode does not support KVM.\n");
17610286Sandreas.hansson@arm.com    }
17710286Sandreas.hansson@arm.com}
17810286Sandreas.hansson@arm.com
17910286Sandreas.hansson@arm.com
18010286Sandreas.hansson@arm.comKvmGic *
18110286Sandreas.hansson@arm.comKvmGicParams::create()
18210286Sandreas.hansson@arm.com{
18310286Sandreas.hansson@arm.com    return new KvmGic(this);
18410286Sandreas.hansson@arm.com}
18510286Sandreas.hansson@arm.com