/*
 * Copyright 2019 Google, Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer;
 * redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution;
 * neither the name of the copyright holders nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "arch/arm/fastmodel/GIC/gic.hh"

#include "base/trace.hh"
#include "params/FastModelGIC.hh"
#include "params/SCFastModelGIC.hh"

namespace FastModel
{

int
SCGIC::Terminator::countUnbound(const Initiators &inits)
{
    int count = 0;
    for (auto &init: inits)
        if (!init.get_port_base().size())
            count++;
    return count;
}

SCGIC::Terminator::Terminator(
        sc_core::sc_module_name _name, Initiators &inits) :
    sc_core::sc_module(_name),
    targets("targets", countUnbound(inits))
{
    // For every unbound initiator socket, connected it to one
    // terminator target socket.
    int i = 0;
    for (auto &init: inits) {
        if (!init.get_port_base().size()) {
            auto &term = targets.at(i++);
            term.bind(*this);
            term.bind(init);
        }
    }
}

void
SCGIC::Terminator::sendTowardsCPU(uint8_t len, const uint8_t *data)
{
    panic("Call to terminated interface!");
}

SCGIC::SCGIC(const SCFastModelGICParams &params,
             sc_core::sc_module_name _name)
    : scx_evs_GIC(_name), _params(params)
{
    signalInterrupt.bind(signal_interrupt);

    set_parameter("gic.enabled", params.enabled);
    set_parameter("gic.has-gicv3", params.has_gicv3);
    set_parameter("gic.has-gicv4.1", params.has_gicv4_1);
    set_parameter("gic.vPEID-bits", params.vPEID_bits);
    set_parameter("gic.print-memory-map", params.print_mmap);
    set_parameter("gic.monolithic", params.monolithic);
    set_parameter("gic.direct-lpi-support", params.direct_lpi_support);
    set_parameter("gic.CPU-affinities", params.cpu_affinities);
    set_parameter("gic.non-ARE-core-count", params.non_ARE_core_count);
    set_parameter("gic.reg-base", params.reg_base);
    set_parameter("gic.reg-base-per-redistributor",
                  params.reg_base_per_redistributor);
    set_parameter("gic.GICD-alias", params.gicd_alias);
    set_parameter("gic.has-two-security-states",
                  params.has_two_security_states);
    set_parameter("gic.DS-fixed-to-zero", params.DS_fixed_to_zero);
    set_parameter("gic.IIDR", params.IIDR);
    set_parameter("gic.gicv2-only", params.gicv2_only);
    set_parameter("gic.STATUSR-implemented", params.STATUSR_implemented);
    set_parameter("gic.priority-bits",
                  params.priority_bits_implemented);
    set_parameter("gic.GICD_ITARGETSR-RAZWI", params.itargets_razwi);
    set_parameter("gic.ICFGR-SGI-mask", params.icfgr_sgi_mask);
    set_parameter("gic.ICFGR-PPI-mask", params.icfgr_ppi_mask);
    set_parameter("gic.ICFGR-SPI-mask", params.icfgr_spi_mask);
    set_parameter("gic.ICFGR-SGI-reset", params.icfgr_sgi_reset);
    set_parameter("gic.ICFGR-PPI-reset", params.icfgr_ppi_reset);
    set_parameter("gic.ICFGR-SPI-reset", params.icfgr_spi_reset);
    set_parameter("gic.ICFGR-rsvd-bit", params.icfgr_ppi_rsvd_bit);
    set_parameter("gic.IGROUP-SGI-mask", params.igroup_sgi_mask);
    set_parameter("gic.IGROUP-PPI-mask", params.igroup_ppi_mask);
    set_parameter("gic.IGROUP-SGI-reset", params.igroup_sgi_reset);
    set_parameter("gic.IGROUP-PPI-reset", params.igroup_ppi_reset);
    set_parameter("gic.PPI-implemented-mask", params.ppi_implemented_mask);
    set_parameter("gic.SPI-count", params.spi_count);
    set_parameter("gic.lockable-SPI-count", params.lockable_spi_count);
    set_parameter("gic.IRI-ID-bits", params.iri_id_bits);
    set_parameter("gic.delay-redistributor-accesses",
                  params.delay_redistributor_accesses);
    set_parameter("gic.GICD_PIDR", params.gicd_pidr);
    set_parameter("gic.GICR_PIDR", params.gicr_pidr);
    set_parameter("gic.ITS-count", params.its_count);
    set_parameter("gic.ITS0-base", params.its0_base);
    set_parameter("gic.ITS1-base", params.its1_base);
    set_parameter("gic.ITS2-base", params.its2_base);
    set_parameter("gic.ITS3-base", params.its3_base);
    set_parameter("gic.GITS_PIDR", params.gits_pidr);
    set_parameter("gic.GITS_BASER0-type", params.gits_baser0_type);
    set_parameter("gic.GITS_BASER1-type", params.gits_baser1_type);
    set_parameter("gic.GITS_BASER2-type", params.gits_baser2_type);
    set_parameter("gic.GITS_BASER3-type", params.gits_baser3_type);
    set_parameter("gic.GITS_BASER4-type", params.gits_baser4_type);
    set_parameter("gic.GITS_BASER5-type", params.gits_baser5_type);
    set_parameter("gic.GITS_BASER6-type", params.gits_baser6_type);
    set_parameter("gic.GITS_BASER7-type", params.gits_baser7_type);
    set_parameter("gic.GITS_BASER0-entry-bytes",
                  params.gits_baser0_entry_bytes);
    set_parameter("gic.GITS_BASER1-entry-bytes",
                  params.gits_baser1_entry_bytes);
    set_parameter("gic.GITS_BASER2-entry-bytes",
                  params.gits_baser2_entry_bytes);
    set_parameter("gic.GITS_BASER3-entry-bytes",
                  params.gits_baser3_entry_bytes);
    set_parameter("gic.GITS_BASER4-entry-bytes",
                  params.gits_baser4_entry_bytes);
    set_parameter("gic.GITS_BASER5-entry-bytes",
                  params.gits_baser5_entry_bytes);
    set_parameter("gic.GITS_BASER6-entry-bytes",
                  params.gits_baser6_entry_bytes);
    set_parameter("gic.GITS_BASER7-entry-bytes",
                  params.gits_baser7_entry_bytes);
    set_parameter("gic.GITS_BASER0-indirect-RAZ",
                  params.gits_baser0_indirect_raz);
    set_parameter("gic.GITS_BASER1-indirect-RAZ",
                  params.gits_baser1_indirect_raz);
    set_parameter("gic.GITS_BASER2-indirect-RAZ",
                  params.gits_baser2_indirect_raz);
    set_parameter("gic.GITS_BASER3-indirect-RAZ",
                  params.gits_baser3_indirect_raz);
    set_parameter("gic.GITS_BASER4-indirect-RAZ",
                  params.gits_baser4_indirect_raz);
    set_parameter("gic.GITS_BASER5-indirect-RAZ",
                  params.gits_baser5_indirect_raz);
    set_parameter("gic.GITS_BASER6-indirect-RAZ",
                  params.gits_baser6_indirect_raz);
    set_parameter("gic.GITS_BASER7-indirect-RAZ",
                  params.gits_baser7_indirect_raz);
    set_parameter("gic.ITS-BASER-force-page-alignement",
                  params.its_baser_force_page_alignement);
    set_parameter("gic.processor-numbers", params.processor_numbers);
    set_parameter("gic.supports-shareability", params.supports_shareability);
    set_parameter("gic.A3-affinity-supported", params.a3_affinity_supported);
    set_parameter("gic.sgi-range-selector-support", params.SGI_RSS_support);
    set_parameter("gic.GICR_PROPBASER-read-only",
                  params.gicr_propbaser_read_only);
    set_parameter("gic.GICR_PROPBASER-reset-value",
                  params.gicr_propbaser_reset);
    set_parameter("gic.ITS-device-bits", params.its_device_bits);
    set_parameter("gic.ITS-entry-size", params.its_entry_size);
    set_parameter("gic.ITS-ID-bits", params.its_id_bits);
    set_parameter("gic.ITS-collection-ID-bits", params.its_collection_id_bits);
    set_parameter("gic.ITS-cumulative-collection-tables",
                  params.its_cumulative_collection_tables);
    set_parameter("gic.delay-ITS-accesses", params.delay_ITS_accesses);
    set_parameter("gic.local-SEIs", params.local_SEIs);
    set_parameter("gic.local-VSEIs", params.local_VSEIs);
    set_parameter("gic.ITS-use-physical-target-addresses",
                  params.ITS_use_physical_target_addresses);
    set_parameter("gic.ITS-hardware-collection-count",
                  params.ITS_hardware_collection_count);
    set_parameter("gic.ITS-MOVALL-update-collections",
                  params.ITS_MOVALL_update_collections);
    set_parameter("gic.ITS-TRANSLATE64R", params.ITS_TRANSLATE64R);
    set_parameter("gic.enable_protocol_checking",
                  params.enable_protocol_checking);
    set_parameter("gic.fixed-routed-spis", params.fixed_routed_spis);
    set_parameter("gic.irouter-default-mask", params.irouter_default_mask);
    if (params.irouter_default_reset != "") {
        set_parameter("gic.irouter-default-reset",
                      params.irouter_default_reset);
    }
    if (params.irouter_reset_values != "")
        set_parameter("gic.irouter-reset-values", params.irouter_reset_values);
    set_parameter("gic.irouter-mask-values", params.irouter_mask_values);
    set_parameter("gic.ITS-threaded-command-queue",
                  params.ITS_threaded_command_queue);
    set_parameter("gic.ITS-legacy-iidr-typer-offset",
                  params.ITS_legacy_iidr_typer_offset);
    set_parameter("gic.redistributor-threaded-sync",
                  params.redistributor_threaded_command_queue);
    set_parameter("gic.ignore-generate-sgi-when-no-are",
                  params.ignore_generate_sgi_when_no_are);
    set_parameter("gic.trace-speculative-lpi-property-update",
                  params.trace_speculative_lpi_property_updates);
    set_parameter("gic.virtual-lpi-support", params.virtual_lpi_support);
    set_parameter("gic.virtual-priority-bits", params.virtual_priority_bits);
    set_parameter("gic.LPI-cache-type", params.LPI_cache_type);
    set_parameter("gic.LPI-cache-check-data", params.LPI_cache_check_data);
    set_parameter("gic.DPG-bits-implemented", params.DPG_bits_implemented);
    set_parameter("gic.DPG-ARE-only", params.DPG_ARE_only);
    set_parameter("gic.ARE-fixed-to-one", params.ARE_fixed_to_one);
    set_parameter("gic.legacy-sgi-enable-rao", params.legacy_sgi_enable_rao);
    set_parameter("gic.PA_SIZE", params.pa_size);
    set_parameter("gic.MSI_IIDR", params.MSI_IIDR);
    set_parameter("gic.MSI_NS-frame0-base", params.MSI_NS_frame0_base);
    set_parameter("gic.MSI_NS-frame0-max-SPI", params.MSI_NS_frame0_max_SPI);
    set_parameter("gic.MSI_NS-frame0-min-SPI", params.MSI_NS_frame0_min_SPI);
    set_parameter("gic.MSI_NS-frame1-base", params.MSI_NS_frame1_base);
    set_parameter("gic.MSI_NS-frame1-max-SPI", params.MSI_NS_frame1_max_SPI);
    set_parameter("gic.MSI_NS-frame1-min-SPI", params.MSI_NS_frame1_min_SPI);
    set_parameter("gic.MSI_NS-frame2-base", params.MSI_NS_frame2_base);
    set_parameter("gic.MSI_NS-frame2-max-SPI", params.MSI_NS_frame2_max_SPI);
    set_parameter("gic.MSI_NS-frame2-min-SPI", params.MSI_NS_frame2_min_SPI);
    set_parameter("gic.MSI_NS-frame3-base", params.MSI_NS_frame3_base);
    set_parameter("gic.MSI_NS-frame3-max-SPI", params.MSI_NS_frame3_max_SPI);
    set_parameter("gic.MSI_NS-frame3-min-SPI", params.MSI_NS_frame3_min_SPI);
    set_parameter("gic.MSI_NS-frame4-base", params.MSI_NS_frame4_base);
    set_parameter("gic.MSI_NS-frame4-max-SPI", params.MSI_NS_frame4_max_SPI);
    set_parameter("gic.MSI_NS-frame4-min-SPI", params.MSI_NS_frame4_min_SPI);
    set_parameter("gic.MSI_NS-frame5-base", params.MSI_NS_frame5_base);
    set_parameter("gic.MSI_NS-frame5-max-SPI", params.MSI_NS_frame5_max_SPI);
    set_parameter("gic.MSI_NS-frame5-min-SPI", params.MSI_NS_frame5_min_SPI);
    set_parameter("gic.MSI_NS-frame6-base", params.MSI_NS_frame6_base);
    set_parameter("gic.MSI_NS-frame6-max-SPI", params.MSI_NS_frame6_max_SPI);
    set_parameter("gic.MSI_NS-frame6-min-SPI", params.MSI_NS_frame6_min_SPI);
    set_parameter("gic.MSI_NS-frame7-base", params.MSI_NS_frame7_base);
    set_parameter("gic.MSI_NS-frame7-max-SPI", params.MSI_NS_frame7_max_SPI);
    set_parameter("gic.MSI_NS-frame7-min-SPI", params.MSI_NS_frame7_min_SPI);
    set_parameter("gic.MSI_PIDR", params.MSI_PIDR);
    set_parameter("gic.MSI_S-frame0-base", params.MSI_S_frame0_base);
    set_parameter("gic.MSI_S-frame0-max-SPI", params.MSI_S_frame0_max_SPI);
    set_parameter("gic.MSI_S-frame0-min-SPI", params.MSI_S_frame0_min_SPI);
    set_parameter("gic.MSI_S-frame1-base", params.MSI_S_frame1_base);
    set_parameter("gic.MSI_S-frame1-max-SPI", params.MSI_S_frame1_max_SPI);
    set_parameter("gic.MSI_S-frame1-min-SPI", params.MSI_S_frame1_min_SPI);
    set_parameter("gic.MSI_S-frame2-base", params.MSI_S_frame2_base);
    set_parameter("gic.MSI_S-frame2-max-SPI", params.MSI_S_frame2_max_SPI);
    set_parameter("gic.MSI_S-frame2-min-SPI", params.MSI_S_frame2_min_SPI);
    set_parameter("gic.MSI_S-frame3-base", params.MSI_S_frame3_base);
    set_parameter("gic.MSI_S-frame3-max-SPI", params.MSI_S_frame3_max_SPI);
    set_parameter("gic.MSI_S-frame3-min-SPI", params.MSI_S_frame3_min_SPI);
    set_parameter("gic.MSI_S-frame4-base", params.MSI_S_frame4_base);
    set_parameter("gic.MSI_S-frame4-max-SPI", params.MSI_S_frame4_max_SPI);
    set_parameter("gic.MSI_S-frame4-min-SPI", params.MSI_S_frame4_min_SPI);
    set_parameter("gic.MSI_S-frame5-base", params.MSI_S_frame5_base);
    set_parameter("gic.MSI_S-frame5-max-SPI", params.MSI_S_frame5_max_SPI);
    set_parameter("gic.MSI_S-frame5-min-SPI", params.MSI_S_frame5_min_SPI);
    set_parameter("gic.MSI_S-frame6-base", params.MSI_S_frame6_base);
    set_parameter("gic.MSI_S-frame6-max-SPI", params.MSI_S_frame6_max_SPI);
    set_parameter("gic.MSI_S-frame6-min-SPI", params.MSI_S_frame6_min_SPI);
    set_parameter("gic.MSI_S-frame7-base", params.MSI_S_frame7_base);
    set_parameter("gic.MSI_S-frame7-max-SPI", params.MSI_S_frame7_max_SPI);
    set_parameter("gic.MSI_S-frame7-min-SPI", params.MSI_S_frame7_min_SPI);
    set_parameter("gic.outer-cacheability-support",
                  params.outer_cacheability_support);
    set_parameter("gic.wakeup-on-reset", params.wakeup_on_reset);
    set_parameter("gic.SPI-message-based-support", params.SPI_MBIS);
    set_parameter("gic.SPI-unimplemented", params.SPI_unimplemented);
    set_parameter("gic.IROUTER-IRM-RAZ-WI", params.irm_razwi);
    set_parameter("gic.common-lpi-configuration",
                  params.common_LPI_configuration);
    set_parameter("gic.single-set-support", params.single_set_support);
    set_parameter("gic.has_mpam", params.has_mpam);
    set_parameter("gic.mpam_partid_max", params.mpam_max_partid);
    set_parameter("gic.mpam_pmg_max", params.mpam_max_pmg);
    set_parameter("gic.output_attributes", params.output_attributes);
    set_parameter("gic.has_VPENDBASER-dirty-flag-on-load",
                  params.has_DirtyVLPIOnLoad);
    set_parameter("gic.allow-LPIEN-clear", params.allow_LPIEN_clear);
    set_parameter("gic.GICD-legacy-registers-as-reserved",
                  params.GICD_legacy_reg_reserved);
    set_parameter("gic.extended-spi-count", params.extended_spi_count);
    set_parameter("gic.extended-ppi-count", params.extended_ppi_count);
    set_parameter("gic.consolidators", params.consolidators);
}

void
SCGIC::before_end_of_elaboration()
{
    scx_evs_GIC::before_end_of_elaboration();
    terminator.reset(new Terminator("terminator", redistributor));
}

GIC::GIC(const FastModelGICParams &params) :
    BaseGic(&params),
    ambaM(params.sc_gic->amba_m, params.name + ".amba_m", -1),
    ambaS(params.sc_gic->amba_s, params.name + ".amba_s", -1),
    redistributors(params.port_redistributor_connection_count),
    scGIC(params.sc_gic)
{}

Port &
GIC::getPort(const std::string &if_name, PortID idx)
{
    if (if_name == "amba_m") {
        return ambaM;
    } else if (if_name == "amba_s") {
        return ambaS;
    } else if (if_name == "redistributor") {
        auto &ptr = redistributors.at(idx);
        if (!ptr) {
            ptr.reset(new TlmGicInitiator(scGIC->redistributor[idx],
                                          csprintf("%s.redistributor[%d]",
                                                   name(), idx), idx));
        }
        return *ptr;
    } else {
        return BaseGic::getPort(if_name, idx);
    }
}

void
GIC::sendInt(uint32_t num)
{
    scGIC->signalInterrupt->spi(num - 32, true);
}

void
GIC::clearInt(uint32_t num)
{
    scGIC->signalInterrupt->spi(num - 32, false);
}

void
GIC::sendPPInt(uint32_t num, uint32_t cpu)
{
    scGIC->signalInterrupt->ppi(cpu, num, true);
}

void
GIC::clearPPInt(uint32_t num, uint32_t cpu)
{
    scGIC->signalInterrupt->ppi(cpu, num, false);
}

bool
GIC::supportsVersion(GicVersion version)
{
    if (scGIC->params().gicv2_only)
        return version == GicVersion::GIC_V2;
    return (version == GicVersion::GIC_V3) ||
           (version == GicVersion::GIC_V4 && scGIC->params().has_gicv4_1);
}

} // namespace FastModel

FastModel::SCGIC *
SCFastModelGICParams::create()
{
    return new FastModel::SCGIC(*this, name.c_str());
}

FastModel::GIC *
FastModelGICParams::create()
{
    return new FastModel::GIC(*this);
}
