/*
 * Nuvoton NPCM7xx MFT Module
 *
 * Copyright 2021 Google LLC
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
 * for more details.
 */

#include "qemu/osdep.h"
#include "hw/irq.h"
#include "hw/qdev-clock.h"
#include "hw/qdev-properties.h"
#include "hw/misc/npcm7xx_mft.h"
#include "hw/misc/npcm7xx_pwm.h"
#include "hw/registerfields.h"
#include "migration/vmstate.h"
#include "qapi/error.h"
#include "qapi/visitor.h"
#include "qemu/bitops.h"
#include "qemu/error-report.h"
#include "qemu/log.h"
#include "qemu/module.h"
#include "qemu/timer.h"
#include "qemu/units.h"
#include "trace.h"

/*
 * Some of the registers can only accessed via 16-bit ops and some can only
 * be accessed via 8-bit ops. However we mark all of them using REG16 to
 * simplify implementation. npcm7xx_mft_check_mem_op checks the access length
 * of memory operations.
 */
REG16(NPCM7XX_MFT_CNT1, 0x00);
REG16(NPCM7XX_MFT_CRA, 0x02);
REG16(NPCM7XX_MFT_CRB, 0x04);
REG16(NPCM7XX_MFT_CNT2, 0x06);
REG16(NPCM7XX_MFT_PRSC, 0x08);
REG16(NPCM7XX_MFT_CKC, 0x0a);
REG16(NPCM7XX_MFT_MCTRL, 0x0c);
REG16(NPCM7XX_MFT_ICTRL, 0x0e);
REG16(NPCM7XX_MFT_ICLR, 0x10);
REG16(NPCM7XX_MFT_IEN, 0x12);
REG16(NPCM7XX_MFT_CPA, 0x14);
REG16(NPCM7XX_MFT_CPB, 0x16);
REG16(NPCM7XX_MFT_CPCFG, 0x18);
REG16(NPCM7XX_MFT_INASEL, 0x1a);
REG16(NPCM7XX_MFT_INBSEL, 0x1c);

/* Register Fields */
#define NPCM7XX_MFT_CKC_C2CSEL          BIT(3)
#define NPCM7XX_MFT_CKC_C1CSEL          BIT(0)

#define NPCM7XX_MFT_MCTRL_TBEN          BIT(6)
#define NPCM7XX_MFT_MCTRL_TAEN          BIT(5)
#define NPCM7XX_MFT_MCTRL_TBEDG         BIT(4)
#define NPCM7XX_MFT_MCTRL_TAEDG         BIT(3)
#define NPCM7XX_MFT_MCTRL_MODE5         BIT(2)

#define NPCM7XX_MFT_ICTRL_TFPND         BIT(5)
#define NPCM7XX_MFT_ICTRL_TEPND         BIT(4)
#define NPCM7XX_MFT_ICTRL_TDPND         BIT(3)
#define NPCM7XX_MFT_ICTRL_TCPND         BIT(2)
#define NPCM7XX_MFT_ICTRL_TBPND         BIT(1)
#define NPCM7XX_MFT_ICTRL_TAPND         BIT(0)

#define NPCM7XX_MFT_ICLR_TFCLR          BIT(5)
#define NPCM7XX_MFT_ICLR_TECLR          BIT(4)
#define NPCM7XX_MFT_ICLR_TDCLR          BIT(3)
#define NPCM7XX_MFT_ICLR_TCCLR          BIT(2)
#define NPCM7XX_MFT_ICLR_TBCLR          BIT(1)
#define NPCM7XX_MFT_ICLR_TACLR          BIT(0)

#define NPCM7XX_MFT_IEN_TFIEN           BIT(5)
#define NPCM7XX_MFT_IEN_TEIEN           BIT(4)
#define NPCM7XX_MFT_IEN_TDIEN           BIT(3)
#define NPCM7XX_MFT_IEN_TCIEN           BIT(2)
#define NPCM7XX_MFT_IEN_TBIEN           BIT(1)
#define NPCM7XX_MFT_IEN_TAIEN           BIT(0)

#define NPCM7XX_MFT_CPCFG_GET_B(rv)     extract8((rv), 4, 4)
#define NPCM7XX_MFT_CPCFG_GET_A(rv)     extract8((rv), 0, 4)
#define NPCM7XX_MFT_CPCFG_HIEN          BIT(3)
#define NPCM7XX_MFT_CPCFG_EQEN          BIT(2)
#define NPCM7XX_MFT_CPCFG_LOEN          BIT(1)
#define NPCM7XX_MFT_CPCFG_CPSEL         BIT(0)

#define NPCM7XX_MFT_INASEL_SELA         BIT(0)
#define NPCM7XX_MFT_INBSEL_SELB         BIT(0)

/* Max CNT values of the module. The CNT value is a countdown from it. */
#define NPCM7XX_MFT_MAX_CNT             0xFFFF

/* Each fan revolution should generated 2 pulses */
#define NPCM7XX_MFT_PULSE_PER_REVOLUTION 2

typedef enum NPCM7xxMFTCaptureState {
    /* capture succeeded with a valid CNT value. */
    NPCM7XX_CAPTURE_SUCCEED,
    /* capture stopped prematurely due to reaching CPCFG condition. */
    NPCM7XX_CAPTURE_COMPARE_HIT,
    /* capture fails since it reaches underflow condition for CNT. */
    NPCM7XX_CAPTURE_UNDERFLOW,
} NPCM7xxMFTCaptureState;

static void npcm7xx_mft_reset(NPCM7xxMFTState *s)
{
    int i;

    /* Only registers PRSC ~ INBSEL need to be reset. */
    for (i = R_NPCM7XX_MFT_PRSC; i <= R_NPCM7XX_MFT_INBSEL; ++i) {
        s->regs[i] = 0;
    }
}

static void npcm7xx_mft_clear_interrupt(NPCM7xxMFTState *s, uint8_t iclr)
{
    /*
     * Clear bits in ICTRL where corresponding bits in iclr is 1.
     * Both iclr and ictrl are 8-bit regs. (See npcm7xx_mft_check_mem_op)
     */
    s->regs[R_NPCM7XX_MFT_ICTRL] &= ~iclr;
}

/*
 * If the CPCFG's condition should be triggered during count down from
 * NPCM7XX_MFT_MAX_CNT to src if compared to tgt, return the count when
 * the condition is triggered.
 * Otherwise return -1.
 * Since tgt is uint16_t it must always <= NPCM7XX_MFT_MAX_CNT.
 */
static int npcm7xx_mft_compare(int32_t src, uint16_t tgt, uint8_t cpcfg)
{
    if (cpcfg & NPCM7XX_MFT_CPCFG_HIEN) {
        return NPCM7XX_MFT_MAX_CNT;
    }
    if ((cpcfg & NPCM7XX_MFT_CPCFG_EQEN) && (src <= tgt)) {
        return tgt;
    }
    if ((cpcfg & NPCM7XX_MFT_CPCFG_LOEN) && (tgt > 0) && (src < tgt)) {
        return tgt - 1;
    }

    return -1;
}

/* Compute CNT according to corresponding fan's RPM. */
static NPCM7xxMFTCaptureState npcm7xx_mft_compute_cnt(
    Clock *clock, uint32_t max_rpm, uint32_t duty, uint16_t tgt,
    uint8_t cpcfg, uint16_t *cnt)
{
    uint32_t rpm = (uint64_t)max_rpm * (uint64_t)duty / NPCM7XX_PWM_MAX_DUTY;
    int32_t count;
    int stopped;
    NPCM7xxMFTCaptureState state;

    if (rpm == 0) {
        /*
         * If RPM = 0, capture won't happen. CNT will continue count down.
         * So it's effective equivalent to have a cnt > NPCM7XX_MFT_MAX_CNT
         */
        count = NPCM7XX_MFT_MAX_CNT + 1;
    } else {
        /*
         * RPM = revolution/min. The time for one revlution (in ns) is
         * MINUTE_TO_NANOSECOND / RPM.
         */
        count = clock_ns_to_ticks(clock, (60 * NANOSECONDS_PER_SECOND) /
            (rpm * NPCM7XX_MFT_PULSE_PER_REVOLUTION));
    }

    if (count > NPCM7XX_MFT_MAX_CNT) {
        count = -1;
    } else {
        /* The CNT is a countdown value from NPCM7XX_MFT_MAX_CNT. */
        count = NPCM7XX_MFT_MAX_CNT - count;
    }
    stopped = npcm7xx_mft_compare(count, tgt, cpcfg);
    if (stopped == -1) {
        if (count == -1) {
            /* Underflow */
            state = NPCM7XX_CAPTURE_UNDERFLOW;
        } else {
            state = NPCM7XX_CAPTURE_SUCCEED;
        }
    } else {
        count = stopped;
        state = NPCM7XX_CAPTURE_COMPARE_HIT;
    }

    if (count != -1) {
        *cnt = count;
    }
    trace_npcm7xx_mft_rpm(clock->canonical_path, clock_get_hz(clock),
                          state, count, rpm, duty);
    return state;
}

/*
 * Capture Fan RPM and update CNT and CR registers accordingly.
 * Raise IRQ if certain contidions are met in IEN.
 */
static void npcm7xx_mft_capture(NPCM7xxMFTState *s)
{
    int irq_level = 0;
    NPCM7xxMFTCaptureState state;
    int sel;
    uint8_t cpcfg;

    /*
     * If not mode 5, the behavior is undefined. We just do nothing in this
     * case.
     */
    if (!(s->regs[R_NPCM7XX_MFT_MCTRL] & NPCM7XX_MFT_MCTRL_MODE5)) {
        return;
    }

    /* Capture input A. */
    if (s->regs[R_NPCM7XX_MFT_MCTRL] & NPCM7XX_MFT_MCTRL_TAEN &&
        s->regs[R_NPCM7XX_MFT_CKC] & NPCM7XX_MFT_CKC_C1CSEL) {
        sel = s->regs[R_NPCM7XX_MFT_INASEL] & NPCM7XX_MFT_INASEL_SELA;
        cpcfg = NPCM7XX_MFT_CPCFG_GET_A(s->regs[R_NPCM7XX_MFT_CPCFG]);
        state = npcm7xx_mft_compute_cnt(s->clock_1,
                                        sel ? s->max_rpm[2] : s->max_rpm[0],
                                        sel ? s->duty[2] : s->duty[0],
                                        s->regs[R_NPCM7XX_MFT_CPA],
                                        cpcfg,
                                        &s->regs[R_NPCM7XX_MFT_CNT1]);
        switch (state) {
        case NPCM7XX_CAPTURE_SUCCEED:
            /* Interrupt on input capture on TAn transition - TAPND */
            s->regs[R_NPCM7XX_MFT_CRA] = s->regs[R_NPCM7XX_MFT_CNT1];
            s->regs[R_NPCM7XX_MFT_ICTRL] |= NPCM7XX_MFT_ICTRL_TAPND;
            if (s->regs[R_NPCM7XX_MFT_IEN] & NPCM7XX_MFT_IEN_TAIEN) {
                irq_level = 1;
            }
            break;

        case NPCM7XX_CAPTURE_COMPARE_HIT:
            /* Compare Hit - TEPND */
            s->regs[R_NPCM7XX_MFT_ICTRL] |= NPCM7XX_MFT_ICTRL_TEPND;
            if (s->regs[R_NPCM7XX_MFT_IEN] & NPCM7XX_MFT_IEN_TEIEN) {
                irq_level = 1;
            }
            break;

        case NPCM7XX_CAPTURE_UNDERFLOW:
            /* Underflow - TCPND */
            s->regs[R_NPCM7XX_MFT_ICTRL] |= NPCM7XX_MFT_ICTRL_TCPND;
            if (s->regs[R_NPCM7XX_MFT_IEN] & NPCM7XX_MFT_IEN_TCIEN) {
                irq_level = 1;
            }
            break;

        default:
            g_assert_not_reached();
        }
    }

    /* Capture input B. */
    if (s->regs[R_NPCM7XX_MFT_MCTRL] & NPCM7XX_MFT_MCTRL_TBEN &&
        s->regs[R_NPCM7XX_MFT_CKC] & NPCM7XX_MFT_CKC_C2CSEL) {
        sel = s->regs[R_NPCM7XX_MFT_INBSEL] & NPCM7XX_MFT_INBSEL_SELB;
        cpcfg = NPCM7XX_MFT_CPCFG_GET_B(s->regs[R_NPCM7XX_MFT_CPCFG]);
        state = npcm7xx_mft_compute_cnt(s->clock_2,
                                        sel ? s->max_rpm[3] : s->max_rpm[1],
                                        sel ? s->duty[3] : s->duty[1],
                                        s->regs[R_NPCM7XX_MFT_CPB],
                                        cpcfg,
                                        &s->regs[R_NPCM7XX_MFT_CNT2]);
        switch (state) {
        case NPCM7XX_CAPTURE_SUCCEED:
            /* Interrupt on input capture on TBn transition - TBPND */
            s->regs[R_NPCM7XX_MFT_CRB] = s->regs[R_NPCM7XX_MFT_CNT2];
            s->regs[R_NPCM7XX_MFT_ICTRL] |= NPCM7XX_MFT_ICTRL_TBPND;
            if (s->regs[R_NPCM7XX_MFT_IEN] & NPCM7XX_MFT_IEN_TBIEN) {
                irq_level = 1;
            }
            break;

        case NPCM7XX_CAPTURE_COMPARE_HIT:
            /* Compare Hit - TFPND */
            s->regs[R_NPCM7XX_MFT_ICTRL] |= NPCM7XX_MFT_ICTRL_TFPND;
            if (s->regs[R_NPCM7XX_MFT_IEN] & NPCM7XX_MFT_IEN_TFIEN) {
                irq_level = 1;
            }
            break;

        case NPCM7XX_CAPTURE_UNDERFLOW:
            /* Underflow - TDPND */
            s->regs[R_NPCM7XX_MFT_ICTRL] |= NPCM7XX_MFT_ICTRL_TDPND;
            if (s->regs[R_NPCM7XX_MFT_IEN] & NPCM7XX_MFT_IEN_TDIEN) {
                irq_level = 1;
            }
            break;

        default:
            g_assert_not_reached();
        }
    }

    trace_npcm7xx_mft_capture(DEVICE(s)->canonical_path, irq_level);
    qemu_set_irq(s->irq, irq_level);
}

/* Update clock for counters. */
static void npcm7xx_mft_update_clock(void *opaque, ClockEvent event)
{
    NPCM7xxMFTState *s = NPCM7XX_MFT(opaque);
    uint64_t prescaled_clock_period;

    prescaled_clock_period = clock_get(s->clock_in) *
        (s->regs[R_NPCM7XX_MFT_PRSC] + 1ULL);
    trace_npcm7xx_mft_update_clock(s->clock_in->canonical_path,
                                   s->regs[R_NPCM7XX_MFT_CKC],
                                   clock_get(s->clock_in),
                                   prescaled_clock_period);
    /* Update clock 1 */
    if (s->regs[R_NPCM7XX_MFT_CKC] & NPCM7XX_MFT_CKC_C1CSEL) {
        /* Clock is prescaled. */
        clock_update(s->clock_1, prescaled_clock_period);
    } else {
        /* Clock stopped. */
        clock_update(s->clock_1, 0);
    }
    /* Update clock 2 */
    if (s->regs[R_NPCM7XX_MFT_CKC] & NPCM7XX_MFT_CKC_C2CSEL) {
        /* Clock is prescaled. */
        clock_update(s->clock_2, prescaled_clock_period);
    } else {
        /* Clock stopped. */
        clock_update(s->clock_2, 0);
    }

    npcm7xx_mft_capture(s);
}

static uint64_t npcm7xx_mft_read(void *opaque, hwaddr offset, unsigned size)
{
    NPCM7xxMFTState *s = NPCM7XX_MFT(opaque);
    uint16_t value = 0;

    switch (offset) {
    case A_NPCM7XX_MFT_ICLR:
        qemu_log_mask(LOG_GUEST_ERROR,
                      "%s: register @ 0x%04" HWADDR_PRIx " is write-only\n",
                      __func__, offset);
        break;

    default:
        value = s->regs[offset / 2];
    }

    trace_npcm7xx_mft_read(DEVICE(s)->canonical_path, offset, value);
    return value;
}

static void npcm7xx_mft_write(void *opaque, hwaddr offset,
                              uint64_t v, unsigned size)
{
    NPCM7xxMFTState *s = NPCM7XX_MFT(opaque);

    trace_npcm7xx_mft_write(DEVICE(s)->canonical_path, offset, v);
    switch (offset) {
    case A_NPCM7XX_MFT_ICLR:
        npcm7xx_mft_clear_interrupt(s, v);
        break;

    case A_NPCM7XX_MFT_CKC:
    case A_NPCM7XX_MFT_PRSC:
        s->regs[offset / 2] = v;
        npcm7xx_mft_update_clock(s, ClockUpdate);
        break;

    default:
        s->regs[offset / 2] = v;
        npcm7xx_mft_capture(s);
        break;
    }
}

static bool npcm7xx_mft_check_mem_op(void *opaque, hwaddr offset,
                                     unsigned size, bool is_write,
                                     MemTxAttrs attrs)
{
    switch (offset) {
    /* 16-bit registers. Must be accessed with 16-bit read/write.*/
    case A_NPCM7XX_MFT_CNT1:
    case A_NPCM7XX_MFT_CRA:
    case A_NPCM7XX_MFT_CRB:
    case A_NPCM7XX_MFT_CNT2:
    case A_NPCM7XX_MFT_CPA:
    case A_NPCM7XX_MFT_CPB:
        return size == 2;

    /* 8-bit registers. Must be accessed with 8-bit read/write.*/
    case A_NPCM7XX_MFT_PRSC:
    case A_NPCM7XX_MFT_CKC:
    case A_NPCM7XX_MFT_MCTRL:
    case A_NPCM7XX_MFT_ICTRL:
    case A_NPCM7XX_MFT_ICLR:
    case A_NPCM7XX_MFT_IEN:
    case A_NPCM7XX_MFT_CPCFG:
    case A_NPCM7XX_MFT_INASEL:
    case A_NPCM7XX_MFT_INBSEL:
        return size == 1;

    default:
        /* Invalid registers. */
        return false;
    }
}

static void npcm7xx_mft_get_max_rpm(Object *obj, Visitor *v, const char *name,
                                    void *opaque, Error **errp)
{
    visit_type_uint32(v, name, (uint32_t *)opaque, errp);
}

static void npcm7xx_mft_set_max_rpm(Object *obj, Visitor *v, const char *name,
                                    void *opaque, Error **errp)
{
    NPCM7xxMFTState *s = NPCM7XX_MFT(obj);
    uint32_t *max_rpm = opaque;
    uint32_t value;

    if (!visit_type_uint32(v, name, &value, errp)) {
        return;
    }

    *max_rpm = value;
    npcm7xx_mft_capture(s);
}

static void npcm7xx_mft_duty_handler(void *opaque, int n, int value)
{
    NPCM7xxMFTState *s = NPCM7XX_MFT(opaque);

    trace_npcm7xx_mft_set_duty(DEVICE(s)->canonical_path, n, value);
    s->duty[n] = value;
    npcm7xx_mft_capture(s);
}

static const struct MemoryRegionOps npcm7xx_mft_ops = {
    .read       = npcm7xx_mft_read,
    .write      = npcm7xx_mft_write,
    .endianness = DEVICE_LITTLE_ENDIAN,
    .valid      = {
        .min_access_size        = 1,
        .max_access_size        = 2,
        .unaligned              = false,
        .accepts                = npcm7xx_mft_check_mem_op,
    },
};

static void npcm7xx_mft_enter_reset(Object *obj, ResetType type)
{
    NPCM7xxMFTState *s = NPCM7XX_MFT(obj);

    npcm7xx_mft_reset(s);
}

static void npcm7xx_mft_hold_reset(Object *obj)
{
    NPCM7xxMFTState *s = NPCM7XX_MFT(obj);

    qemu_irq_lower(s->irq);
}

static void npcm7xx_mft_init(Object *obj)
{
    NPCM7xxMFTState *s = NPCM7XX_MFT(obj);
    SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
    DeviceState *dev = DEVICE(obj);

    memory_region_init_io(&s->iomem, obj, &npcm7xx_mft_ops, s,
                          TYPE_NPCM7XX_MFT, 4 * KiB);
    sysbus_init_mmio(sbd, &s->iomem);
    sysbus_init_irq(sbd, &s->irq);
    s->clock_in = qdev_init_clock_in(dev, "clock-in", npcm7xx_mft_update_clock,
                                     s, ClockUpdate);
    s->clock_1 = qdev_init_clock_out(dev, "clock1");
    s->clock_2 = qdev_init_clock_out(dev, "clock2");

    for (int i = 0; i < NPCM7XX_PWM_PER_MODULE; ++i) {
        object_property_add(obj, "max_rpm[*]", "uint32",
                            npcm7xx_mft_get_max_rpm,
                            npcm7xx_mft_set_max_rpm,
                            NULL, &s->max_rpm[i]);
    }
    qdev_init_gpio_in_named(dev, npcm7xx_mft_duty_handler, "duty",
                            NPCM7XX_MFT_FANIN_COUNT);
}

static const VMStateDescription vmstate_npcm7xx_mft = {
    .name = "npcm7xx-mft-module",
    .version_id = 0,
    .minimum_version_id = 0,
    .fields = (VMStateField[]) {
        VMSTATE_CLOCK(clock_in, NPCM7xxMFTState),
        VMSTATE_CLOCK(clock_1, NPCM7xxMFTState),
        VMSTATE_CLOCK(clock_2, NPCM7xxMFTState),
        VMSTATE_UINT16_ARRAY(regs, NPCM7xxMFTState, NPCM7XX_MFT_NR_REGS),
        VMSTATE_UINT32_ARRAY(max_rpm, NPCM7xxMFTState, NPCM7XX_MFT_FANIN_COUNT),
        VMSTATE_UINT32_ARRAY(duty, NPCM7xxMFTState, NPCM7XX_MFT_FANIN_COUNT),
        VMSTATE_END_OF_LIST(),
    },
};

static void npcm7xx_mft_class_init(ObjectClass *klass, void *data)
{
    ResettableClass *rc = RESETTABLE_CLASS(klass);
    DeviceClass *dc = DEVICE_CLASS(klass);

    dc->desc = "NPCM7xx MFT Controller";
    dc->vmsd = &vmstate_npcm7xx_mft;
    rc->phases.enter = npcm7xx_mft_enter_reset;
    rc->phases.hold = npcm7xx_mft_hold_reset;
}

static const TypeInfo npcm7xx_mft_info = {
    .name               = TYPE_NPCM7XX_MFT,
    .parent             = TYPE_SYS_BUS_DEVICE,
    .instance_size      = sizeof(NPCM7xxMFTState),
    .class_init         = npcm7xx_mft_class_init,
    .instance_init      = npcm7xx_mft_init,
};

static void npcm7xx_mft_register_type(void)
{
    type_register_static(&npcm7xx_mft_info);
}
type_init(npcm7xx_mft_register_type);
