cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

xlnx-zynqmp-can.c (41791B)


      1/*
      2 * QEMU model of the Xilinx ZynqMP CAN controller.
      3 * This implementation is based on the following datasheet:
      4 * https://www.xilinx.com/support/documentation/user_guides/ug1085-zynq-ultrascale-trm.pdf
      5 *
      6 * Copyright (c) 2020 Xilinx Inc.
      7 *
      8 * Written-by: Vikram Garhwal<fnu.vikram@xilinx.com>
      9 *
     10 * Based on QEMU CAN Device emulation implemented by Jin Yang, Deniz Eren and
     11 * Pavel Pisa
     12 *
     13 * Permission is hereby granted, free of charge, to any person obtaining a copy
     14 * of this software and associated documentation files (the "Software"), to deal
     15 * in the Software without restriction, including without limitation the rights
     16 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     17 * copies of the Software, and to permit persons to whom the Software is
     18 * furnished to do so, subject to the following conditions:
     19 *
     20 * The above copyright notice and this permission notice shall be included in
     21 * all copies or substantial portions of the Software.
     22 *
     23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     24 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     26 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     28 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     29 * THE SOFTWARE.
     30 */
     31
     32#include "qemu/osdep.h"
     33#include "hw/sysbus.h"
     34#include "hw/register.h"
     35#include "hw/irq.h"
     36#include "qapi/error.h"
     37#include "qemu/bitops.h"
     38#include "qemu/log.h"
     39#include "qemu/cutils.h"
     40#include "migration/vmstate.h"
     41#include "hw/qdev-properties.h"
     42#include "net/can_emu.h"
     43#include "net/can_host.h"
     44#include "qemu/event_notifier.h"
     45#include "qom/object_interfaces.h"
     46#include "hw/net/xlnx-zynqmp-can.h"
     47#include "trace.h"
     48
     49#ifndef XLNX_ZYNQMP_CAN_ERR_DEBUG
     50#define XLNX_ZYNQMP_CAN_ERR_DEBUG 0
     51#endif
     52
     53#define MAX_DLC            8
     54#undef ERROR
     55
     56REG32(SOFTWARE_RESET_REGISTER, 0x0)
     57    FIELD(SOFTWARE_RESET_REGISTER, CEN, 1, 1)
     58    FIELD(SOFTWARE_RESET_REGISTER, SRST, 0, 1)
     59REG32(MODE_SELECT_REGISTER, 0x4)
     60    FIELD(MODE_SELECT_REGISTER, SNOOP, 2, 1)
     61    FIELD(MODE_SELECT_REGISTER, LBACK, 1, 1)
     62    FIELD(MODE_SELECT_REGISTER, SLEEP, 0, 1)
     63REG32(ARBITRATION_PHASE_BAUD_RATE_PRESCALER_REGISTER, 0x8)
     64    FIELD(ARBITRATION_PHASE_BAUD_RATE_PRESCALER_REGISTER, BRP, 0, 8)
     65REG32(ARBITRATION_PHASE_BIT_TIMING_REGISTER, 0xc)
     66    FIELD(ARBITRATION_PHASE_BIT_TIMING_REGISTER, SJW, 7, 2)
     67    FIELD(ARBITRATION_PHASE_BIT_TIMING_REGISTER, TS2, 4, 3)
     68    FIELD(ARBITRATION_PHASE_BIT_TIMING_REGISTER, TS1, 0, 4)
     69REG32(ERROR_COUNTER_REGISTER, 0x10)
     70    FIELD(ERROR_COUNTER_REGISTER, REC, 8, 8)
     71    FIELD(ERROR_COUNTER_REGISTER, TEC, 0, 8)
     72REG32(ERROR_STATUS_REGISTER, 0x14)
     73    FIELD(ERROR_STATUS_REGISTER, ACKER, 4, 1)
     74    FIELD(ERROR_STATUS_REGISTER, BERR, 3, 1)
     75    FIELD(ERROR_STATUS_REGISTER, STER, 2, 1)
     76    FIELD(ERROR_STATUS_REGISTER, FMER, 1, 1)
     77    FIELD(ERROR_STATUS_REGISTER, CRCER, 0, 1)
     78REG32(STATUS_REGISTER, 0x18)
     79    FIELD(STATUS_REGISTER, SNOOP, 12, 1)
     80    FIELD(STATUS_REGISTER, ACFBSY, 11, 1)
     81    FIELD(STATUS_REGISTER, TXFLL, 10, 1)
     82    FIELD(STATUS_REGISTER, TXBFLL, 9, 1)
     83    FIELD(STATUS_REGISTER, ESTAT, 7, 2)
     84    FIELD(STATUS_REGISTER, ERRWRN, 6, 1)
     85    FIELD(STATUS_REGISTER, BBSY, 5, 1)
     86    FIELD(STATUS_REGISTER, BIDLE, 4, 1)
     87    FIELD(STATUS_REGISTER, NORMAL, 3, 1)
     88    FIELD(STATUS_REGISTER, SLEEP, 2, 1)
     89    FIELD(STATUS_REGISTER, LBACK, 1, 1)
     90    FIELD(STATUS_REGISTER, CONFIG, 0, 1)
     91REG32(INTERRUPT_STATUS_REGISTER, 0x1c)
     92    FIELD(INTERRUPT_STATUS_REGISTER, TXFEMP, 14, 1)
     93    FIELD(INTERRUPT_STATUS_REGISTER, TXFWMEMP, 13, 1)
     94    FIELD(INTERRUPT_STATUS_REGISTER, RXFWMFLL, 12, 1)
     95    FIELD(INTERRUPT_STATUS_REGISTER, WKUP, 11, 1)
     96    FIELD(INTERRUPT_STATUS_REGISTER, SLP, 10, 1)
     97    FIELD(INTERRUPT_STATUS_REGISTER, BSOFF, 9, 1)
     98    FIELD(INTERRUPT_STATUS_REGISTER, ERROR, 8, 1)
     99    FIELD(INTERRUPT_STATUS_REGISTER, RXNEMP, 7, 1)
    100    FIELD(INTERRUPT_STATUS_REGISTER, RXOFLW, 6, 1)
    101    FIELD(INTERRUPT_STATUS_REGISTER, RXUFLW, 5, 1)
    102    FIELD(INTERRUPT_STATUS_REGISTER, RXOK, 4, 1)
    103    FIELD(INTERRUPT_STATUS_REGISTER, TXBFLL, 3, 1)
    104    FIELD(INTERRUPT_STATUS_REGISTER, TXFLL, 2, 1)
    105    FIELD(INTERRUPT_STATUS_REGISTER, TXOK, 1, 1)
    106    FIELD(INTERRUPT_STATUS_REGISTER, ARBLST, 0, 1)
    107REG32(INTERRUPT_ENABLE_REGISTER, 0x20)
    108    FIELD(INTERRUPT_ENABLE_REGISTER, ETXFEMP, 14, 1)
    109    FIELD(INTERRUPT_ENABLE_REGISTER, ETXFWMEMP, 13, 1)
    110    FIELD(INTERRUPT_ENABLE_REGISTER, ERXFWMFLL, 12, 1)
    111    FIELD(INTERRUPT_ENABLE_REGISTER, EWKUP, 11, 1)
    112    FIELD(INTERRUPT_ENABLE_REGISTER, ESLP, 10, 1)
    113    FIELD(INTERRUPT_ENABLE_REGISTER, EBSOFF, 9, 1)
    114    FIELD(INTERRUPT_ENABLE_REGISTER, EERROR, 8, 1)
    115    FIELD(INTERRUPT_ENABLE_REGISTER, ERXNEMP, 7, 1)
    116    FIELD(INTERRUPT_ENABLE_REGISTER, ERXOFLW, 6, 1)
    117    FIELD(INTERRUPT_ENABLE_REGISTER, ERXUFLW, 5, 1)
    118    FIELD(INTERRUPT_ENABLE_REGISTER, ERXOK, 4, 1)
    119    FIELD(INTERRUPT_ENABLE_REGISTER, ETXBFLL, 3, 1)
    120    FIELD(INTERRUPT_ENABLE_REGISTER, ETXFLL, 2, 1)
    121    FIELD(INTERRUPT_ENABLE_REGISTER, ETXOK, 1, 1)
    122    FIELD(INTERRUPT_ENABLE_REGISTER, EARBLST, 0, 1)
    123REG32(INTERRUPT_CLEAR_REGISTER, 0x24)
    124    FIELD(INTERRUPT_CLEAR_REGISTER, CTXFEMP, 14, 1)
    125    FIELD(INTERRUPT_CLEAR_REGISTER, CTXFWMEMP, 13, 1)
    126    FIELD(INTERRUPT_CLEAR_REGISTER, CRXFWMFLL, 12, 1)
    127    FIELD(INTERRUPT_CLEAR_REGISTER, CWKUP, 11, 1)
    128    FIELD(INTERRUPT_CLEAR_REGISTER, CSLP, 10, 1)
    129    FIELD(INTERRUPT_CLEAR_REGISTER, CBSOFF, 9, 1)
    130    FIELD(INTERRUPT_CLEAR_REGISTER, CERROR, 8, 1)
    131    FIELD(INTERRUPT_CLEAR_REGISTER, CRXNEMP, 7, 1)
    132    FIELD(INTERRUPT_CLEAR_REGISTER, CRXOFLW, 6, 1)
    133    FIELD(INTERRUPT_CLEAR_REGISTER, CRXUFLW, 5, 1)
    134    FIELD(INTERRUPT_CLEAR_REGISTER, CRXOK, 4, 1)
    135    FIELD(INTERRUPT_CLEAR_REGISTER, CTXBFLL, 3, 1)
    136    FIELD(INTERRUPT_CLEAR_REGISTER, CTXFLL, 2, 1)
    137    FIELD(INTERRUPT_CLEAR_REGISTER, CTXOK, 1, 1)
    138    FIELD(INTERRUPT_CLEAR_REGISTER, CARBLST, 0, 1)
    139REG32(TIMESTAMP_REGISTER, 0x28)
    140    FIELD(TIMESTAMP_REGISTER, CTS, 0, 1)
    141REG32(WIR, 0x2c)
    142    FIELD(WIR, EW, 8, 8)
    143    FIELD(WIR, FW, 0, 8)
    144REG32(TXFIFO_ID, 0x30)
    145    FIELD(TXFIFO_ID, IDH, 21, 11)
    146    FIELD(TXFIFO_ID, SRRRTR, 20, 1)
    147    FIELD(TXFIFO_ID, IDE, 19, 1)
    148    FIELD(TXFIFO_ID, IDL, 1, 18)
    149    FIELD(TXFIFO_ID, RTR, 0, 1)
    150REG32(TXFIFO_DLC, 0x34)
    151    FIELD(TXFIFO_DLC, DLC, 28, 4)
    152REG32(TXFIFO_DATA1, 0x38)
    153    FIELD(TXFIFO_DATA1, DB0, 24, 8)
    154    FIELD(TXFIFO_DATA1, DB1, 16, 8)
    155    FIELD(TXFIFO_DATA1, DB2, 8, 8)
    156    FIELD(TXFIFO_DATA1, DB3, 0, 8)
    157REG32(TXFIFO_DATA2, 0x3c)
    158    FIELD(TXFIFO_DATA2, DB4, 24, 8)
    159    FIELD(TXFIFO_DATA2, DB5, 16, 8)
    160    FIELD(TXFIFO_DATA2, DB6, 8, 8)
    161    FIELD(TXFIFO_DATA2, DB7, 0, 8)
    162REG32(TXHPB_ID, 0x40)
    163    FIELD(TXHPB_ID, IDH, 21, 11)
    164    FIELD(TXHPB_ID, SRRRTR, 20, 1)
    165    FIELD(TXHPB_ID, IDE, 19, 1)
    166    FIELD(TXHPB_ID, IDL, 1, 18)
    167    FIELD(TXHPB_ID, RTR, 0, 1)
    168REG32(TXHPB_DLC, 0x44)
    169    FIELD(TXHPB_DLC, DLC, 28, 4)
    170REG32(TXHPB_DATA1, 0x48)
    171    FIELD(TXHPB_DATA1, DB0, 24, 8)
    172    FIELD(TXHPB_DATA1, DB1, 16, 8)
    173    FIELD(TXHPB_DATA1, DB2, 8, 8)
    174    FIELD(TXHPB_DATA1, DB3, 0, 8)
    175REG32(TXHPB_DATA2, 0x4c)
    176    FIELD(TXHPB_DATA2, DB4, 24, 8)
    177    FIELD(TXHPB_DATA2, DB5, 16, 8)
    178    FIELD(TXHPB_DATA2, DB6, 8, 8)
    179    FIELD(TXHPB_DATA2, DB7, 0, 8)
    180REG32(RXFIFO_ID, 0x50)
    181    FIELD(RXFIFO_ID, IDH, 21, 11)
    182    FIELD(RXFIFO_ID, SRRRTR, 20, 1)
    183    FIELD(RXFIFO_ID, IDE, 19, 1)
    184    FIELD(RXFIFO_ID, IDL, 1, 18)
    185    FIELD(RXFIFO_ID, RTR, 0, 1)
    186REG32(RXFIFO_DLC, 0x54)
    187    FIELD(RXFIFO_DLC, DLC, 28, 4)
    188    FIELD(RXFIFO_DLC, RXT, 0, 16)
    189REG32(RXFIFO_DATA1, 0x58)
    190    FIELD(RXFIFO_DATA1, DB0, 24, 8)
    191    FIELD(RXFIFO_DATA1, DB1, 16, 8)
    192    FIELD(RXFIFO_DATA1, DB2, 8, 8)
    193    FIELD(RXFIFO_DATA1, DB3, 0, 8)
    194REG32(RXFIFO_DATA2, 0x5c)
    195    FIELD(RXFIFO_DATA2, DB4, 24, 8)
    196    FIELD(RXFIFO_DATA2, DB5, 16, 8)
    197    FIELD(RXFIFO_DATA2, DB6, 8, 8)
    198    FIELD(RXFIFO_DATA2, DB7, 0, 8)
    199REG32(AFR, 0x60)
    200    FIELD(AFR, UAF4, 3, 1)
    201    FIELD(AFR, UAF3, 2, 1)
    202    FIELD(AFR, UAF2, 1, 1)
    203    FIELD(AFR, UAF1, 0, 1)
    204REG32(AFMR1, 0x64)
    205    FIELD(AFMR1, AMIDH, 21, 11)
    206    FIELD(AFMR1, AMSRR, 20, 1)
    207    FIELD(AFMR1, AMIDE, 19, 1)
    208    FIELD(AFMR1, AMIDL, 1, 18)
    209    FIELD(AFMR1, AMRTR, 0, 1)
    210REG32(AFIR1, 0x68)
    211    FIELD(AFIR1, AIIDH, 21, 11)
    212    FIELD(AFIR1, AISRR, 20, 1)
    213    FIELD(AFIR1, AIIDE, 19, 1)
    214    FIELD(AFIR1, AIIDL, 1, 18)
    215    FIELD(AFIR1, AIRTR, 0, 1)
    216REG32(AFMR2, 0x6c)
    217    FIELD(AFMR2, AMIDH, 21, 11)
    218    FIELD(AFMR2, AMSRR, 20, 1)
    219    FIELD(AFMR2, AMIDE, 19, 1)
    220    FIELD(AFMR2, AMIDL, 1, 18)
    221    FIELD(AFMR2, AMRTR, 0, 1)
    222REG32(AFIR2, 0x70)
    223    FIELD(AFIR2, AIIDH, 21, 11)
    224    FIELD(AFIR2, AISRR, 20, 1)
    225    FIELD(AFIR2, AIIDE, 19, 1)
    226    FIELD(AFIR2, AIIDL, 1, 18)
    227    FIELD(AFIR2, AIRTR, 0, 1)
    228REG32(AFMR3, 0x74)
    229    FIELD(AFMR3, AMIDH, 21, 11)
    230    FIELD(AFMR3, AMSRR, 20, 1)
    231    FIELD(AFMR3, AMIDE, 19, 1)
    232    FIELD(AFMR3, AMIDL, 1, 18)
    233    FIELD(AFMR3, AMRTR, 0, 1)
    234REG32(AFIR3, 0x78)
    235    FIELD(AFIR3, AIIDH, 21, 11)
    236    FIELD(AFIR3, AISRR, 20, 1)
    237    FIELD(AFIR3, AIIDE, 19, 1)
    238    FIELD(AFIR3, AIIDL, 1, 18)
    239    FIELD(AFIR3, AIRTR, 0, 1)
    240REG32(AFMR4, 0x7c)
    241    FIELD(AFMR4, AMIDH, 21, 11)
    242    FIELD(AFMR4, AMSRR, 20, 1)
    243    FIELD(AFMR4, AMIDE, 19, 1)
    244    FIELD(AFMR4, AMIDL, 1, 18)
    245    FIELD(AFMR4, AMRTR, 0, 1)
    246REG32(AFIR4, 0x80)
    247    FIELD(AFIR4, AIIDH, 21, 11)
    248    FIELD(AFIR4, AISRR, 20, 1)
    249    FIELD(AFIR4, AIIDE, 19, 1)
    250    FIELD(AFIR4, AIIDL, 1, 18)
    251    FIELD(AFIR4, AIRTR, 0, 1)
    252
    253static void can_update_irq(XlnxZynqMPCANState *s)
    254{
    255    uint32_t irq;
    256
    257    /* Watermark register interrupts. */
    258    if ((fifo32_num_free(&s->tx_fifo) / CAN_FRAME_SIZE) >
    259            ARRAY_FIELD_EX32(s->regs, WIR, EW)) {
    260        ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, TXFWMEMP, 1);
    261    }
    262
    263    if ((fifo32_num_used(&s->rx_fifo) / CAN_FRAME_SIZE) >
    264            ARRAY_FIELD_EX32(s->regs, WIR, FW)) {
    265        ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXFWMFLL, 1);
    266    }
    267
    268    /* RX Interrupts. */
    269    if (fifo32_num_used(&s->rx_fifo) >= CAN_FRAME_SIZE) {
    270        ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXNEMP, 1);
    271    }
    272
    273    /* TX interrupts. */
    274    if (fifo32_is_empty(&s->tx_fifo)) {
    275        ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, TXFEMP, 1);
    276    }
    277
    278    if (fifo32_is_full(&s->tx_fifo)) {
    279        ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, TXFLL, 1);
    280    }
    281
    282    if (fifo32_is_full(&s->txhpb_fifo)) {
    283        ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, TXBFLL, 1);
    284    }
    285
    286    irq = s->regs[R_INTERRUPT_STATUS_REGISTER];
    287    irq &= s->regs[R_INTERRUPT_ENABLE_REGISTER];
    288
    289    trace_xlnx_can_update_irq(s->regs[R_INTERRUPT_STATUS_REGISTER],
    290                              s->regs[R_INTERRUPT_ENABLE_REGISTER], irq);
    291    qemu_set_irq(s->irq, irq);
    292}
    293
    294static void can_ier_post_write(RegisterInfo *reg, uint64_t val)
    295{
    296    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
    297
    298    can_update_irq(s);
    299}
    300
    301static uint64_t can_icr_pre_write(RegisterInfo *reg, uint64_t val)
    302{
    303    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
    304
    305    s->regs[R_INTERRUPT_STATUS_REGISTER] &= ~val;
    306    can_update_irq(s);
    307
    308    return 0;
    309}
    310
    311static void can_config_reset(XlnxZynqMPCANState *s)
    312{
    313    /* Reset all the configuration registers. */
    314    register_reset(&s->reg_info[R_SOFTWARE_RESET_REGISTER]);
    315    register_reset(&s->reg_info[R_MODE_SELECT_REGISTER]);
    316    register_reset(
    317              &s->reg_info[R_ARBITRATION_PHASE_BAUD_RATE_PRESCALER_REGISTER]);
    318    register_reset(&s->reg_info[R_ARBITRATION_PHASE_BIT_TIMING_REGISTER]);
    319    register_reset(&s->reg_info[R_STATUS_REGISTER]);
    320    register_reset(&s->reg_info[R_INTERRUPT_STATUS_REGISTER]);
    321    register_reset(&s->reg_info[R_INTERRUPT_ENABLE_REGISTER]);
    322    register_reset(&s->reg_info[R_INTERRUPT_CLEAR_REGISTER]);
    323    register_reset(&s->reg_info[R_WIR]);
    324}
    325
    326static void can_config_mode(XlnxZynqMPCANState *s)
    327{
    328    register_reset(&s->reg_info[R_ERROR_COUNTER_REGISTER]);
    329    register_reset(&s->reg_info[R_ERROR_STATUS_REGISTER]);
    330
    331    /* Put XlnxZynqMPCAN in configuration mode. */
    332    ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, CONFIG, 1);
    333    ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, WKUP, 0);
    334    ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, SLP, 0);
    335    ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, BSOFF, 0);
    336    ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, ERROR, 0);
    337    ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXOFLW, 0);
    338    ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXOK, 0);
    339    ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, TXOK, 0);
    340    ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, ARBLST, 0);
    341
    342    can_update_irq(s);
    343}
    344
    345static void update_status_register_mode_bits(XlnxZynqMPCANState *s)
    346{
    347    bool sleep_status = ARRAY_FIELD_EX32(s->regs, STATUS_REGISTER, SLEEP);
    348    bool sleep_mode = ARRAY_FIELD_EX32(s->regs, MODE_SELECT_REGISTER, SLEEP);
    349    /* Wake up interrupt bit. */
    350    bool wakeup_irq_val = sleep_status && (sleep_mode == 0);
    351    /* Sleep interrupt bit. */
    352    bool sleep_irq_val = sleep_mode && (sleep_status == 0);
    353
    354    /* Clear previous core mode status bits. */
    355    ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, LBACK, 0);
    356    ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, SLEEP, 0);
    357    ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, SNOOP, 0);
    358    ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, NORMAL, 0);
    359
    360    /* set current mode bit and generate irqs accordingly. */
    361    if (ARRAY_FIELD_EX32(s->regs, MODE_SELECT_REGISTER, LBACK)) {
    362        ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, LBACK, 1);
    363    } else if (ARRAY_FIELD_EX32(s->regs, MODE_SELECT_REGISTER, SLEEP)) {
    364        ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, SLEEP, 1);
    365        ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, SLP,
    366                         sleep_irq_val);
    367    } else if (ARRAY_FIELD_EX32(s->regs, MODE_SELECT_REGISTER, SNOOP)) {
    368        ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, SNOOP, 1);
    369    } else {
    370        /*
    371         * If all bits are zero then XlnxZynqMPCAN is set in normal mode.
    372         */
    373        ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, NORMAL, 1);
    374        /* Set wakeup interrupt bit. */
    375        ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, WKUP,
    376                         wakeup_irq_val);
    377    }
    378
    379    can_update_irq(s);
    380}
    381
    382static void can_exit_sleep_mode(XlnxZynqMPCANState *s)
    383{
    384    ARRAY_FIELD_DP32(s->regs, MODE_SELECT_REGISTER, SLEEP, 0);
    385    update_status_register_mode_bits(s);
    386}
    387
    388static void generate_frame(qemu_can_frame *frame, uint32_t *data)
    389{
    390    frame->can_id = data[0];
    391    frame->can_dlc = FIELD_EX32(data[1], TXFIFO_DLC, DLC);
    392
    393    frame->data[0] = FIELD_EX32(data[2], TXFIFO_DATA1, DB3);
    394    frame->data[1] = FIELD_EX32(data[2], TXFIFO_DATA1, DB2);
    395    frame->data[2] = FIELD_EX32(data[2], TXFIFO_DATA1, DB1);
    396    frame->data[3] = FIELD_EX32(data[2], TXFIFO_DATA1, DB0);
    397
    398    frame->data[4] = FIELD_EX32(data[3], TXFIFO_DATA2, DB7);
    399    frame->data[5] = FIELD_EX32(data[3], TXFIFO_DATA2, DB6);
    400    frame->data[6] = FIELD_EX32(data[3], TXFIFO_DATA2, DB5);
    401    frame->data[7] = FIELD_EX32(data[3], TXFIFO_DATA2, DB4);
    402}
    403
    404static bool tx_ready_check(XlnxZynqMPCANState *s)
    405{
    406    if (ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, SRST)) {
    407        g_autofree char *path = object_get_canonical_path(OBJECT(s));
    408
    409        qemu_log_mask(LOG_GUEST_ERROR, "%s: Attempting to transfer data while"
    410                      " data while controller is in reset mode.\n",
    411                      path);
    412        return false;
    413    }
    414
    415    if (ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, CEN) == 0) {
    416        g_autofree char *path = object_get_canonical_path(OBJECT(s));
    417
    418        qemu_log_mask(LOG_GUEST_ERROR, "%s: Attempting to transfer"
    419                      " data while controller is in configuration mode. Reset"
    420                      " the core so operations can start fresh.\n",
    421                      path);
    422        return false;
    423    }
    424
    425    if (ARRAY_FIELD_EX32(s->regs, STATUS_REGISTER, SNOOP)) {
    426        g_autofree char *path = object_get_canonical_path(OBJECT(s));
    427
    428        qemu_log_mask(LOG_GUEST_ERROR, "%s: Attempting to transfer"
    429                      " data while controller is in SNOOP MODE.\n",
    430                      path);
    431        return false;
    432    }
    433
    434    return true;
    435}
    436
    437static void transfer_fifo(XlnxZynqMPCANState *s, Fifo32 *fifo)
    438{
    439    qemu_can_frame frame;
    440    uint32_t data[CAN_FRAME_SIZE];
    441    int i;
    442    bool can_tx = tx_ready_check(s);
    443
    444    if (!can_tx) {
    445        g_autofree char *path = object_get_canonical_path(OBJECT(s));
    446
    447        qemu_log_mask(LOG_GUEST_ERROR, "%s: Controller is not enabled for data"
    448                      " transfer.\n", path);
    449        can_update_irq(s);
    450        return;
    451    }
    452
    453    while (!fifo32_is_empty(fifo)) {
    454        for (i = 0; i < CAN_FRAME_SIZE; i++) {
    455            data[i] = fifo32_pop(fifo);
    456        }
    457
    458        if (ARRAY_FIELD_EX32(s->regs, STATUS_REGISTER, LBACK)) {
    459            /*
    460             * Controller is in loopback. In Loopback mode, the CAN core
    461             * transmits a recessive bitstream on to the XlnxZynqMPCAN Bus.
    462             * Any message transmitted is looped back to the RX line and
    463             * acknowledged. The XlnxZynqMPCAN core receives any message
    464             * that it transmits.
    465             */
    466            if (fifo32_is_full(&s->rx_fifo)) {
    467                ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXOFLW, 1);
    468            } else {
    469                for (i = 0; i < CAN_FRAME_SIZE; i++) {
    470                    fifo32_push(&s->rx_fifo, data[i]);
    471                }
    472
    473                ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXOK, 1);
    474            }
    475        } else {
    476            /* Normal mode Tx. */
    477            generate_frame(&frame, data);
    478
    479            trace_xlnx_can_tx_data(frame.can_id, frame.can_dlc,
    480                                   frame.data[0], frame.data[1],
    481                                   frame.data[2], frame.data[3],
    482                                   frame.data[4], frame.data[5],
    483                                   frame.data[6], frame.data[7]);
    484            can_bus_client_send(&s->bus_client, &frame, 1);
    485        }
    486    }
    487
    488    ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, TXOK, 1);
    489    ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, TXBFLL, 0);
    490
    491    if (ARRAY_FIELD_EX32(s->regs, STATUS_REGISTER, SLEEP)) {
    492        can_exit_sleep_mode(s);
    493    }
    494
    495    can_update_irq(s);
    496}
    497
    498static uint64_t can_srr_pre_write(RegisterInfo *reg, uint64_t val)
    499{
    500    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
    501
    502    ARRAY_FIELD_DP32(s->regs, SOFTWARE_RESET_REGISTER, CEN,
    503                     FIELD_EX32(val, SOFTWARE_RESET_REGISTER, CEN));
    504
    505    if (FIELD_EX32(val, SOFTWARE_RESET_REGISTER, SRST)) {
    506        trace_xlnx_can_reset(val);
    507
    508        /* First, core will do software reset then will enter in config mode. */
    509        can_config_reset(s);
    510    }
    511
    512    if (ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, CEN) == 0) {
    513        can_config_mode(s);
    514    } else {
    515        /*
    516         * Leave config mode. Now XlnxZynqMPCAN core will enter normal,
    517         * sleep, snoop or loopback mode depending upon LBACK, SLEEP, SNOOP
    518         * register states.
    519         */
    520        ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, CONFIG, 0);
    521
    522        ptimer_transaction_begin(s->can_timer);
    523        ptimer_set_count(s->can_timer, 0);
    524        ptimer_transaction_commit(s->can_timer);
    525
    526        /* XlnxZynqMPCAN is out of config mode. It will send pending data. */
    527        transfer_fifo(s, &s->txhpb_fifo);
    528        transfer_fifo(s, &s->tx_fifo);
    529    }
    530
    531    update_status_register_mode_bits(s);
    532
    533    return s->regs[R_SOFTWARE_RESET_REGISTER];
    534}
    535
    536static uint64_t can_msr_pre_write(RegisterInfo *reg, uint64_t val)
    537{
    538    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
    539    uint8_t multi_mode;
    540
    541    /*
    542     * Multiple mode set check. This is done to make sure user doesn't set
    543     * multiple modes.
    544     */
    545    multi_mode = FIELD_EX32(val, MODE_SELECT_REGISTER, LBACK) +
    546                 FIELD_EX32(val, MODE_SELECT_REGISTER, SLEEP) +
    547                 FIELD_EX32(val, MODE_SELECT_REGISTER, SNOOP);
    548
    549    if (multi_mode > 1) {
    550        g_autofree char *path = object_get_canonical_path(OBJECT(s));
    551
    552        qemu_log_mask(LOG_GUEST_ERROR, "%s: Attempting to config"
    553                      " several modes simultaneously. One mode will be selected"
    554                      " according to their priority: LBACK > SLEEP > SNOOP.\n",
    555                      path);
    556    }
    557
    558    if (ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, CEN) == 0) {
    559        /* We are in configuration mode, any mode can be selected. */
    560        s->regs[R_MODE_SELECT_REGISTER] = val;
    561    } else {
    562        bool sleep_mode_bit = FIELD_EX32(val, MODE_SELECT_REGISTER, SLEEP);
    563
    564        ARRAY_FIELD_DP32(s->regs, MODE_SELECT_REGISTER, SLEEP, sleep_mode_bit);
    565
    566        if (FIELD_EX32(val, MODE_SELECT_REGISTER, LBACK)) {
    567            g_autofree char *path = object_get_canonical_path(OBJECT(s));
    568
    569            qemu_log_mask(LOG_GUEST_ERROR, "%s: Attempting to set"
    570                          " LBACK mode without setting CEN bit as 0.\n",
    571                          path);
    572        } else if (FIELD_EX32(val, MODE_SELECT_REGISTER, SNOOP)) {
    573            g_autofree char *path = object_get_canonical_path(OBJECT(s));
    574
    575            qemu_log_mask(LOG_GUEST_ERROR, "%s: Attempting to set"
    576                          " SNOOP mode without setting CEN bit as 0.\n",
    577                          path);
    578        }
    579
    580        update_status_register_mode_bits(s);
    581    }
    582
    583    return s->regs[R_MODE_SELECT_REGISTER];
    584}
    585
    586static uint64_t can_brpr_pre_write(RegisterInfo  *reg, uint64_t val)
    587{
    588    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
    589
    590    /* Only allow writes when in config mode. */
    591    if (ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, CEN)) {
    592        return s->regs[R_ARBITRATION_PHASE_BAUD_RATE_PRESCALER_REGISTER];
    593    }
    594
    595    return val;
    596}
    597
    598static uint64_t can_btr_pre_write(RegisterInfo  *reg, uint64_t val)
    599{
    600    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
    601
    602    /* Only allow writes when in config mode. */
    603    if (ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, CEN)) {
    604        return s->regs[R_ARBITRATION_PHASE_BIT_TIMING_REGISTER];
    605    }
    606
    607    return val;
    608}
    609
    610static uint64_t can_tcr_pre_write(RegisterInfo  *reg, uint64_t val)
    611{
    612    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
    613
    614    if (FIELD_EX32(val, TIMESTAMP_REGISTER, CTS)) {
    615        ptimer_transaction_begin(s->can_timer);
    616        ptimer_set_count(s->can_timer, 0);
    617        ptimer_transaction_commit(s->can_timer);
    618    }
    619
    620    return 0;
    621}
    622
    623static void update_rx_fifo(XlnxZynqMPCANState *s, const qemu_can_frame *frame)
    624{
    625    bool filter_pass = false;
    626    uint16_t timestamp = 0;
    627
    628    /* If no filter is enabled. Message will be stored in FIFO. */
    629    if (!((ARRAY_FIELD_EX32(s->regs, AFR, UAF1)) |
    630       (ARRAY_FIELD_EX32(s->regs, AFR, UAF2)) |
    631       (ARRAY_FIELD_EX32(s->regs, AFR, UAF3)) |
    632       (ARRAY_FIELD_EX32(s->regs, AFR, UAF4)))) {
    633        filter_pass = true;
    634    }
    635
    636    /*
    637     * Messages that pass any of the acceptance filters will be stored in
    638     * the RX FIFO.
    639     */
    640    if (ARRAY_FIELD_EX32(s->regs, AFR, UAF1)) {
    641        uint32_t id_masked = s->regs[R_AFMR1] & frame->can_id;
    642        uint32_t filter_id_masked = s->regs[R_AFMR1] & s->regs[R_AFIR1];
    643
    644        if (filter_id_masked == id_masked) {
    645            filter_pass = true;
    646        }
    647    }
    648
    649    if (ARRAY_FIELD_EX32(s->regs, AFR, UAF2)) {
    650        uint32_t id_masked = s->regs[R_AFMR2] & frame->can_id;
    651        uint32_t filter_id_masked = s->regs[R_AFMR2] & s->regs[R_AFIR2];
    652
    653        if (filter_id_masked == id_masked) {
    654            filter_pass = true;
    655        }
    656    }
    657
    658    if (ARRAY_FIELD_EX32(s->regs, AFR, UAF3)) {
    659        uint32_t id_masked = s->regs[R_AFMR3] & frame->can_id;
    660        uint32_t filter_id_masked = s->regs[R_AFMR3] & s->regs[R_AFIR3];
    661
    662        if (filter_id_masked == id_masked) {
    663            filter_pass = true;
    664        }
    665    }
    666
    667    if (ARRAY_FIELD_EX32(s->regs, AFR, UAF4)) {
    668        uint32_t id_masked = s->regs[R_AFMR4] & frame->can_id;
    669        uint32_t filter_id_masked = s->regs[R_AFMR4] & s->regs[R_AFIR4];
    670
    671        if (filter_id_masked == id_masked) {
    672            filter_pass = true;
    673        }
    674    }
    675
    676    if (!filter_pass) {
    677        trace_xlnx_can_rx_fifo_filter_reject(frame->can_id, frame->can_dlc);
    678        return;
    679    }
    680
    681    /* Store the message in fifo if it passed through any of the filters. */
    682    if (filter_pass && frame->can_dlc <= MAX_DLC) {
    683
    684        if (fifo32_is_full(&s->rx_fifo)) {
    685            ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXOFLW, 1);
    686        } else {
    687            timestamp = CAN_TIMER_MAX - ptimer_get_count(s->can_timer);
    688
    689            fifo32_push(&s->rx_fifo, frame->can_id);
    690
    691            fifo32_push(&s->rx_fifo, deposit32(0, R_RXFIFO_DLC_DLC_SHIFT,
    692                                               R_RXFIFO_DLC_DLC_LENGTH,
    693                                               frame->can_dlc) |
    694                                     deposit32(0, R_RXFIFO_DLC_RXT_SHIFT,
    695                                               R_RXFIFO_DLC_RXT_LENGTH,
    696                                               timestamp));
    697
    698            /* First 32 bit of the data. */
    699            fifo32_push(&s->rx_fifo, deposit32(0, R_TXFIFO_DATA1_DB3_SHIFT,
    700                                               R_TXFIFO_DATA1_DB3_LENGTH,
    701                                               frame->data[0]) |
    702                                     deposit32(0, R_TXFIFO_DATA1_DB2_SHIFT,
    703                                               R_TXFIFO_DATA1_DB2_LENGTH,
    704                                               frame->data[1]) |
    705                                     deposit32(0, R_TXFIFO_DATA1_DB1_SHIFT,
    706                                               R_TXFIFO_DATA1_DB1_LENGTH,
    707                                               frame->data[2]) |
    708                                     deposit32(0, R_TXFIFO_DATA1_DB0_SHIFT,
    709                                               R_TXFIFO_DATA1_DB0_LENGTH,
    710                                               frame->data[3]));
    711            /* Last 32 bit of the data. */
    712            fifo32_push(&s->rx_fifo, deposit32(0, R_TXFIFO_DATA2_DB7_SHIFT,
    713                                               R_TXFIFO_DATA2_DB7_LENGTH,
    714                                               frame->data[4]) |
    715                                     deposit32(0, R_TXFIFO_DATA2_DB6_SHIFT,
    716                                               R_TXFIFO_DATA2_DB6_LENGTH,
    717                                               frame->data[5]) |
    718                                     deposit32(0, R_TXFIFO_DATA2_DB5_SHIFT,
    719                                               R_TXFIFO_DATA2_DB5_LENGTH,
    720                                               frame->data[6]) |
    721                                     deposit32(0, R_TXFIFO_DATA2_DB4_SHIFT,
    722                                               R_TXFIFO_DATA2_DB4_LENGTH,
    723                                               frame->data[7]));
    724
    725            ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXOK, 1);
    726            trace_xlnx_can_rx_data(frame->can_id, frame->can_dlc,
    727                                   frame->data[0], frame->data[1],
    728                                   frame->data[2], frame->data[3],
    729                                   frame->data[4], frame->data[5],
    730                                   frame->data[6], frame->data[7]);
    731        }
    732
    733        can_update_irq(s);
    734    }
    735}
    736
    737static uint64_t can_rxfifo_pre_read(RegisterInfo *reg, uint64_t val)
    738{
    739    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
    740
    741    if (!fifo32_is_empty(&s->rx_fifo)) {
    742        val = fifo32_pop(&s->rx_fifo);
    743    } else {
    744        ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXUFLW, 1);
    745    }
    746
    747    can_update_irq(s);
    748    return val;
    749}
    750
    751static void can_filter_enable_post_write(RegisterInfo *reg, uint64_t val)
    752{
    753    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
    754
    755    if (ARRAY_FIELD_EX32(s->regs, AFR, UAF1) &&
    756        ARRAY_FIELD_EX32(s->regs, AFR, UAF2) &&
    757        ARRAY_FIELD_EX32(s->regs, AFR, UAF3) &&
    758        ARRAY_FIELD_EX32(s->regs, AFR, UAF4)) {
    759        ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, ACFBSY, 1);
    760    } else {
    761        ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, ACFBSY, 0);
    762    }
    763}
    764
    765static uint64_t can_filter_mask_pre_write(RegisterInfo *reg, uint64_t val)
    766{
    767    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
    768    uint32_t reg_idx = (reg->access->addr) / 4;
    769    uint32_t filter_number = (reg_idx - R_AFMR1) / 2;
    770
    771    /* modify an acceptance filter, the corresponding UAF bit should be '0'. */
    772    if (!(s->regs[R_AFR] & (1 << filter_number))) {
    773        s->regs[reg_idx] = val;
    774
    775        trace_xlnx_can_filter_mask_pre_write(filter_number, s->regs[reg_idx]);
    776    } else {
    777        g_autofree char *path = object_get_canonical_path(OBJECT(s));
    778
    779        qemu_log_mask(LOG_GUEST_ERROR, "%s: Acceptance filter %d"
    780                      " mask is not set as corresponding UAF bit is not 0.\n",
    781                      path, filter_number + 1);
    782    }
    783
    784    return s->regs[reg_idx];
    785}
    786
    787static uint64_t can_filter_id_pre_write(RegisterInfo *reg, uint64_t val)
    788{
    789    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
    790    uint32_t reg_idx = (reg->access->addr) / 4;
    791    uint32_t filter_number = (reg_idx - R_AFIR1) / 2;
    792
    793    if (!(s->regs[R_AFR] & (1 << filter_number))) {
    794        s->regs[reg_idx] = val;
    795
    796        trace_xlnx_can_filter_id_pre_write(filter_number, s->regs[reg_idx]);
    797    } else {
    798        g_autofree char *path = object_get_canonical_path(OBJECT(s));
    799
    800        qemu_log_mask(LOG_GUEST_ERROR, "%s: Acceptance filter %d"
    801                      " id is not set as corresponding UAF bit is not 0.\n",
    802                      path, filter_number + 1);
    803    }
    804
    805    return s->regs[reg_idx];
    806}
    807
    808static void can_tx_post_write(RegisterInfo *reg, uint64_t val)
    809{
    810    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
    811
    812    bool is_txhpb = reg->access->addr > A_TXFIFO_DATA2;
    813
    814    bool initiate_transfer = (reg->access->addr == A_TXFIFO_DATA2) ||
    815                             (reg->access->addr == A_TXHPB_DATA2);
    816
    817    Fifo32 *f = is_txhpb ? &s->txhpb_fifo : &s->tx_fifo;
    818
    819    if (!fifo32_is_full(f)) {
    820        fifo32_push(f, val);
    821    } else {
    822        g_autofree char *path = object_get_canonical_path(OBJECT(s));
    823
    824        qemu_log_mask(LOG_GUEST_ERROR, "%s: TX FIFO is full.\n", path);
    825    }
    826
    827    /* Initiate the message send if TX register is written. */
    828    if (initiate_transfer &&
    829        ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, CEN)) {
    830        transfer_fifo(s, f);
    831    }
    832
    833    can_update_irq(s);
    834}
    835
    836static const RegisterAccessInfo can_regs_info[] = {
    837    {   .name = "SOFTWARE_RESET_REGISTER",
    838        .addr = A_SOFTWARE_RESET_REGISTER,
    839        .rsvd = 0xfffffffc,
    840        .pre_write = can_srr_pre_write,
    841    },{ .name = "MODE_SELECT_REGISTER",
    842        .addr = A_MODE_SELECT_REGISTER,
    843        .rsvd = 0xfffffff8,
    844        .pre_write = can_msr_pre_write,
    845    },{ .name = "ARBITRATION_PHASE_BAUD_RATE_PRESCALER_REGISTER",
    846        .addr = A_ARBITRATION_PHASE_BAUD_RATE_PRESCALER_REGISTER,
    847        .rsvd = 0xffffff00,
    848        .pre_write = can_brpr_pre_write,
    849    },{ .name = "ARBITRATION_PHASE_BIT_TIMING_REGISTER",
    850        .addr = A_ARBITRATION_PHASE_BIT_TIMING_REGISTER,
    851        .rsvd = 0xfffffe00,
    852        .pre_write = can_btr_pre_write,
    853    },{ .name = "ERROR_COUNTER_REGISTER",
    854        .addr = A_ERROR_COUNTER_REGISTER,
    855        .rsvd = 0xffff0000,
    856        .ro = 0xffffffff,
    857    },{ .name = "ERROR_STATUS_REGISTER",
    858        .addr = A_ERROR_STATUS_REGISTER,
    859        .rsvd = 0xffffffe0,
    860        .w1c = 0x1f,
    861    },{ .name = "STATUS_REGISTER",  .addr = A_STATUS_REGISTER,
    862        .reset = 0x1,
    863        .rsvd = 0xffffe000,
    864        .ro = 0x1fff,
    865    },{ .name = "INTERRUPT_STATUS_REGISTER",
    866        .addr = A_INTERRUPT_STATUS_REGISTER,
    867        .reset = 0x6000,
    868        .rsvd = 0xffff8000,
    869        .ro = 0x7fff,
    870    },{ .name = "INTERRUPT_ENABLE_REGISTER",
    871        .addr = A_INTERRUPT_ENABLE_REGISTER,
    872        .rsvd = 0xffff8000,
    873        .post_write = can_ier_post_write,
    874    },{ .name = "INTERRUPT_CLEAR_REGISTER",
    875        .addr = A_INTERRUPT_CLEAR_REGISTER,
    876        .rsvd = 0xffff8000,
    877        .pre_write = can_icr_pre_write,
    878    },{ .name = "TIMESTAMP_REGISTER",
    879        .addr = A_TIMESTAMP_REGISTER,
    880        .rsvd = 0xfffffffe,
    881        .pre_write = can_tcr_pre_write,
    882    },{ .name = "WIR",  .addr = A_WIR,
    883        .reset = 0x3f3f,
    884        .rsvd = 0xffff0000,
    885    },{ .name = "TXFIFO_ID",  .addr = A_TXFIFO_ID,
    886        .post_write = can_tx_post_write,
    887    },{ .name = "TXFIFO_DLC",  .addr = A_TXFIFO_DLC,
    888        .rsvd = 0xfffffff,
    889        .post_write = can_tx_post_write,
    890    },{ .name = "TXFIFO_DATA1",  .addr = A_TXFIFO_DATA1,
    891        .post_write = can_tx_post_write,
    892    },{ .name = "TXFIFO_DATA2",  .addr = A_TXFIFO_DATA2,
    893        .post_write = can_tx_post_write,
    894    },{ .name = "TXHPB_ID",  .addr = A_TXHPB_ID,
    895        .post_write = can_tx_post_write,
    896    },{ .name = "TXHPB_DLC",  .addr = A_TXHPB_DLC,
    897        .rsvd = 0xfffffff,
    898        .post_write = can_tx_post_write,
    899    },{ .name = "TXHPB_DATA1",  .addr = A_TXHPB_DATA1,
    900        .post_write = can_tx_post_write,
    901    },{ .name = "TXHPB_DATA2",  .addr = A_TXHPB_DATA2,
    902        .post_write = can_tx_post_write,
    903    },{ .name = "RXFIFO_ID",  .addr = A_RXFIFO_ID,
    904        .ro = 0xffffffff,
    905        .post_read = can_rxfifo_pre_read,
    906    },{ .name = "RXFIFO_DLC",  .addr = A_RXFIFO_DLC,
    907        .rsvd = 0xfff0000,
    908        .post_read = can_rxfifo_pre_read,
    909    },{ .name = "RXFIFO_DATA1",  .addr = A_RXFIFO_DATA1,
    910        .post_read = can_rxfifo_pre_read,
    911    },{ .name = "RXFIFO_DATA2",  .addr = A_RXFIFO_DATA2,
    912        .post_read = can_rxfifo_pre_read,
    913    },{ .name = "AFR",  .addr = A_AFR,
    914        .rsvd = 0xfffffff0,
    915        .post_write = can_filter_enable_post_write,
    916    },{ .name = "AFMR1",  .addr = A_AFMR1,
    917        .pre_write = can_filter_mask_pre_write,
    918    },{ .name = "AFIR1",  .addr = A_AFIR1,
    919        .pre_write = can_filter_id_pre_write,
    920    },{ .name = "AFMR2",  .addr = A_AFMR2,
    921        .pre_write = can_filter_mask_pre_write,
    922    },{ .name = "AFIR2",  .addr = A_AFIR2,
    923        .pre_write = can_filter_id_pre_write,
    924    },{ .name = "AFMR3",  .addr = A_AFMR3,
    925        .pre_write = can_filter_mask_pre_write,
    926    },{ .name = "AFIR3",  .addr = A_AFIR3,
    927        .pre_write = can_filter_id_pre_write,
    928    },{ .name = "AFMR4",  .addr = A_AFMR4,
    929        .pre_write = can_filter_mask_pre_write,
    930    },{ .name = "AFIR4",  .addr = A_AFIR4,
    931        .pre_write = can_filter_id_pre_write,
    932    }
    933};
    934
    935static void xlnx_zynqmp_can_ptimer_cb(void *opaque)
    936{
    937    /* No action required on the timer rollover. */
    938}
    939
    940static const MemoryRegionOps can_ops = {
    941    .read = register_read_memory,
    942    .write = register_write_memory,
    943    .endianness = DEVICE_LITTLE_ENDIAN,
    944    .valid = {
    945        .min_access_size = 4,
    946        .max_access_size = 4,
    947    },
    948};
    949
    950static void xlnx_zynqmp_can_reset_init(Object *obj, ResetType type)
    951{
    952    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(obj);
    953    unsigned int i;
    954
    955    for (i = R_RXFIFO_ID; i < ARRAY_SIZE(s->reg_info); ++i) {
    956        register_reset(&s->reg_info[i]);
    957    }
    958
    959    ptimer_transaction_begin(s->can_timer);
    960    ptimer_set_count(s->can_timer, 0);
    961    ptimer_transaction_commit(s->can_timer);
    962}
    963
    964static void xlnx_zynqmp_can_reset_hold(Object *obj)
    965{
    966    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(obj);
    967    unsigned int i;
    968
    969    for (i = 0; i < R_RXFIFO_ID; ++i) {
    970        register_reset(&s->reg_info[i]);
    971    }
    972
    973    /*
    974     * Reset FIFOs when CAN model is reset. This will clear the fifo writes
    975     * done by post_write which gets called from register_reset function,
    976     * post_write handle will not be able to trigger tx because CAN will be
    977     * disabled when software_reset_register is cleared first.
    978     */
    979    fifo32_reset(&s->rx_fifo);
    980    fifo32_reset(&s->tx_fifo);
    981    fifo32_reset(&s->txhpb_fifo);
    982}
    983
    984static bool xlnx_zynqmp_can_can_receive(CanBusClientState *client)
    985{
    986    XlnxZynqMPCANState *s = container_of(client, XlnxZynqMPCANState,
    987                                         bus_client);
    988
    989    if (ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, SRST)) {
    990        g_autofree char *path = object_get_canonical_path(OBJECT(s));
    991
    992        qemu_log_mask(LOG_GUEST_ERROR, "%s: Controller is in reset state.\n",
    993                      path);
    994        return false;
    995    }
    996
    997    if ((ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, CEN)) == 0) {
    998        g_autofree char *path = object_get_canonical_path(OBJECT(s));
    999
   1000        qemu_log_mask(LOG_GUEST_ERROR, "%s: Controller is disabled. Incoming"
   1001                      " messages will be discarded.\n", path);
   1002        return false;
   1003    }
   1004
   1005    return true;
   1006}
   1007
   1008static ssize_t xlnx_zynqmp_can_receive(CanBusClientState *client,
   1009                               const qemu_can_frame *buf, size_t buf_size) {
   1010    XlnxZynqMPCANState *s = container_of(client, XlnxZynqMPCANState,
   1011                                         bus_client);
   1012    const qemu_can_frame *frame = buf;
   1013
   1014    if (buf_size <= 0) {
   1015        g_autofree char *path = object_get_canonical_path(OBJECT(s));
   1016
   1017        qemu_log_mask(LOG_GUEST_ERROR, "%s: Error in the data received.\n",
   1018                      path);
   1019        return 0;
   1020    }
   1021
   1022    if (ARRAY_FIELD_EX32(s->regs, STATUS_REGISTER, SNOOP)) {
   1023        /* Snoop Mode: Just keep the data. no response back. */
   1024        update_rx_fifo(s, frame);
   1025    } else if ((ARRAY_FIELD_EX32(s->regs, STATUS_REGISTER, SLEEP))) {
   1026        /*
   1027         * XlnxZynqMPCAN is in sleep mode. Any data on bus will bring it to wake
   1028         * up state.
   1029         */
   1030        can_exit_sleep_mode(s);
   1031        update_rx_fifo(s, frame);
   1032    } else if ((ARRAY_FIELD_EX32(s->regs, STATUS_REGISTER, SLEEP)) == 0) {
   1033        update_rx_fifo(s, frame);
   1034    } else {
   1035        /*
   1036         * XlnxZynqMPCAN will not participate in normal bus communication
   1037         * and will not receive any messages transmitted by other CAN nodes.
   1038         */
   1039        trace_xlnx_can_rx_discard(s->regs[R_STATUS_REGISTER]);
   1040    }
   1041
   1042    return 1;
   1043}
   1044
   1045static CanBusClientInfo can_xilinx_bus_client_info = {
   1046    .can_receive = xlnx_zynqmp_can_can_receive,
   1047    .receive = xlnx_zynqmp_can_receive,
   1048};
   1049
   1050static int xlnx_zynqmp_can_connect_to_bus(XlnxZynqMPCANState *s,
   1051                                          CanBusState *bus)
   1052{
   1053    s->bus_client.info = &can_xilinx_bus_client_info;
   1054
   1055    if (can_bus_insert_client(bus, &s->bus_client) < 0) {
   1056        return -1;
   1057    }
   1058    return 0;
   1059}
   1060
   1061static void xlnx_zynqmp_can_realize(DeviceState *dev, Error **errp)
   1062{
   1063    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(dev);
   1064
   1065    if (s->canbus) {
   1066        if (xlnx_zynqmp_can_connect_to_bus(s, s->canbus) < 0) {
   1067            g_autofree char *path = object_get_canonical_path(OBJECT(s));
   1068
   1069            error_setg(errp, "%s: xlnx_zynqmp_can_connect_to_bus"
   1070                       " failed.", path);
   1071            return;
   1072        }
   1073    }
   1074
   1075    /* Create RX FIFO, TXFIFO, TXHPB storage. */
   1076    fifo32_create(&s->rx_fifo, RXFIFO_SIZE);
   1077    fifo32_create(&s->tx_fifo, RXFIFO_SIZE);
   1078    fifo32_create(&s->txhpb_fifo, CAN_FRAME_SIZE);
   1079
   1080    /* Allocate a new timer. */
   1081    s->can_timer = ptimer_init(xlnx_zynqmp_can_ptimer_cb, s,
   1082                               PTIMER_POLICY_DEFAULT);
   1083
   1084    ptimer_transaction_begin(s->can_timer);
   1085
   1086    ptimer_set_freq(s->can_timer, s->cfg.ext_clk_freq);
   1087    ptimer_set_limit(s->can_timer, CAN_TIMER_MAX, 1);
   1088    ptimer_run(s->can_timer, 0);
   1089    ptimer_transaction_commit(s->can_timer);
   1090}
   1091
   1092static void xlnx_zynqmp_can_init(Object *obj)
   1093{
   1094    XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(obj);
   1095    SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
   1096
   1097    RegisterInfoArray *reg_array;
   1098
   1099    memory_region_init(&s->iomem, obj, TYPE_XLNX_ZYNQMP_CAN,
   1100                        XLNX_ZYNQMP_CAN_R_MAX * 4);
   1101    reg_array = register_init_block32(DEVICE(obj), can_regs_info,
   1102                               ARRAY_SIZE(can_regs_info),
   1103                               s->reg_info, s->regs,
   1104                               &can_ops,
   1105                               XLNX_ZYNQMP_CAN_ERR_DEBUG,
   1106                               XLNX_ZYNQMP_CAN_R_MAX * 4);
   1107
   1108    memory_region_add_subregion(&s->iomem, 0x00, &reg_array->mem);
   1109    sysbus_init_mmio(sbd, &s->iomem);
   1110    sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq);
   1111}
   1112
   1113static const VMStateDescription vmstate_can = {
   1114    .name = TYPE_XLNX_ZYNQMP_CAN,
   1115    .version_id = 1,
   1116    .minimum_version_id = 1,
   1117    .fields = (VMStateField[]) {
   1118        VMSTATE_FIFO32(rx_fifo, XlnxZynqMPCANState),
   1119        VMSTATE_FIFO32(tx_fifo, XlnxZynqMPCANState),
   1120        VMSTATE_FIFO32(txhpb_fifo, XlnxZynqMPCANState),
   1121        VMSTATE_UINT32_ARRAY(regs, XlnxZynqMPCANState, XLNX_ZYNQMP_CAN_R_MAX),
   1122        VMSTATE_PTIMER(can_timer, XlnxZynqMPCANState),
   1123        VMSTATE_END_OF_LIST(),
   1124    }
   1125};
   1126
   1127static Property xlnx_zynqmp_can_properties[] = {
   1128    DEFINE_PROP_UINT32("ext_clk_freq", XlnxZynqMPCANState, cfg.ext_clk_freq,
   1129                       CAN_DEFAULT_CLOCK),
   1130    DEFINE_PROP_LINK("canbus", XlnxZynqMPCANState, canbus, TYPE_CAN_BUS,
   1131                     CanBusState *),
   1132    DEFINE_PROP_END_OF_LIST(),
   1133};
   1134
   1135static void xlnx_zynqmp_can_class_init(ObjectClass *klass, void *data)
   1136{
   1137    DeviceClass *dc = DEVICE_CLASS(klass);
   1138    ResettableClass *rc = RESETTABLE_CLASS(klass);
   1139
   1140    rc->phases.enter = xlnx_zynqmp_can_reset_init;
   1141    rc->phases.hold = xlnx_zynqmp_can_reset_hold;
   1142    dc->realize = xlnx_zynqmp_can_realize;
   1143    device_class_set_props(dc, xlnx_zynqmp_can_properties);
   1144    dc->vmsd = &vmstate_can;
   1145}
   1146
   1147static const TypeInfo can_info = {
   1148    .name          = TYPE_XLNX_ZYNQMP_CAN,
   1149    .parent        = TYPE_SYS_BUS_DEVICE,
   1150    .instance_size = sizeof(XlnxZynqMPCANState),
   1151    .class_init    = xlnx_zynqmp_can_class_init,
   1152    .instance_init = xlnx_zynqmp_can_init,
   1153};
   1154
   1155static void can_register_types(void)
   1156{
   1157    type_register_static(&can_info);
   1158}
   1159
   1160type_init(can_register_types)