/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2023 Arm Ltd4*5* Redistribution and use in source and binary forms, with or without6* modification, are permitted provided that the following conditions7* are met:8* 1. Redistributions of source code must retain the above copyright9* notice, this list of conditions and the following disclaimer.10* 2. Redistributions in binary form must reproduce the above copyright11* notice, this list of conditions and the following disclaimer in the12* documentation and/or other materials provided with the distribution.13*14* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND15* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE16* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE17* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE18* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL19* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS20* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)21* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT22* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY23* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF24* SUCH DAMAGE.25*/2627#include <sys/cdefs.h>28#include <sys/types.h>29#include <sys/systm.h>30#include <sys/bus.h>3132#include "vgic.h"33#include "vgic_if.h"3435device_t vgic_dev;3637bool38vgic_present(void)39{40return (vgic_dev != NULL);41}4243void44vgic_init(void)45{46VGIC_INIT(vgic_dev);47}4849int50vgic_attach_to_vm(struct hyp *hyp, struct vm_vgic_descr *descr)51{52return (VGIC_ATTACH_TO_VM(vgic_dev, hyp, descr));53}5455void56vgic_detach_from_vm(struct hyp *hyp)57{58VGIC_DETACH_FROM_VM(vgic_dev, hyp);59}6061void62vgic_vminit(struct hyp *hyp)63{64VGIC_VMINIT(vgic_dev, hyp);65}6667void68vgic_cpuinit(struct hypctx *hypctx)69{70VGIC_CPUINIT(vgic_dev, hypctx);71}7273void74vgic_cpucleanup(struct hypctx *hypctx)75{76VGIC_CPUCLEANUP(vgic_dev, hypctx);77}7879void80vgic_vmcleanup(struct hyp *hyp)81{82VGIC_VMCLEANUP(vgic_dev, hyp);83}8485int86vgic_max_cpu_count(struct hyp *hyp)87{88return (VGIC_MAX_CPU_COUNT(vgic_dev, hyp));89}9091bool92vgic_has_pending_irq(struct hypctx *hypctx)93{94return (VGIC_HAS_PENDING_IRQ(vgic_dev, hypctx));95}9697/* TODO: vcpuid -> hypctx ? */98/* TODO: Add a vgic interface */99int100vgic_inject_irq(struct hyp *hyp, int vcpuid, uint32_t irqid, bool level)101{102return (VGIC_INJECT_IRQ(vgic_dev, hyp, vcpuid, irqid, level));103}104105int106vgic_inject_msi(struct hyp *hyp, uint64_t msg, uint64_t addr)107{108return (VGIC_INJECT_MSI(vgic_dev, hyp, msg, addr));109}110111void112vgic_flush_hwstate(struct hypctx *hypctx)113{114VGIC_FLUSH_HWSTATE(vgic_dev, hypctx);115}116117void118vgic_sync_hwstate(struct hypctx *hypctx)119{120VGIC_SYNC_HWSTATE(vgic_dev, hypctx);121}122123124