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

pnv_xive.c (59560B)


      1/*
      2 * QEMU PowerPC XIVE interrupt controller model
      3 *
      4 * Copyright (c) 2017-2019, IBM Corporation.
      5 *
      6 * This code is licensed under the GPL version 2 or later. See the
      7 * COPYING file in the top-level directory.
      8 */
      9
     10#include "qemu/osdep.h"
     11#include "qemu/log.h"
     12#include "qemu/module.h"
     13#include "qapi/error.h"
     14#include "target/ppc/cpu.h"
     15#include "sysemu/cpus.h"
     16#include "sysemu/dma.h"
     17#include "sysemu/reset.h"
     18#include "monitor/monitor.h"
     19#include "hw/ppc/fdt.h"
     20#include "hw/ppc/pnv.h"
     21#include "hw/ppc/pnv_core.h"
     22#include "hw/ppc/pnv_xscom.h"
     23#include "hw/ppc/pnv_xive.h"
     24#include "hw/ppc/xive_regs.h"
     25#include "hw/qdev-properties.h"
     26#include "hw/ppc/ppc.h"
     27#include "trace.h"
     28
     29#include <libfdt.h>
     30
     31#include "pnv_xive_regs.h"
     32
     33#undef XIVE_DEBUG
     34
     35/*
     36 * Virtual structures table (VST)
     37 */
     38#define SBE_PER_BYTE   4
     39
     40typedef struct XiveVstInfo {
     41    const char *name;
     42    uint32_t    size;
     43    uint32_t    max_blocks;
     44} XiveVstInfo;
     45
     46static const XiveVstInfo vst_infos[] = {
     47    [VST_TSEL_IVT]  = { "EAT",  sizeof(XiveEAS), 16 },
     48    [VST_TSEL_SBE]  = { "SBE",  1,               16 },
     49    [VST_TSEL_EQDT] = { "ENDT", sizeof(XiveEND), 16 },
     50    [VST_TSEL_VPDT] = { "VPDT", sizeof(XiveNVT), 32 },
     51
     52    /*
     53     *  Interrupt fifo backing store table (not modeled) :
     54     *
     55     * 0 - IPI,
     56     * 1 - HWD,
     57     * 2 - First escalate,
     58     * 3 - Second escalate,
     59     * 4 - Redistribution,
     60     * 5 - IPI cascaded queue ?
     61     */
     62    [VST_TSEL_IRQ]  = { "IRQ",  1,               6  },
     63};
     64
     65#define xive_error(xive, fmt, ...)                                      \
     66    qemu_log_mask(LOG_GUEST_ERROR, "XIVE[%x] - " fmt "\n",              \
     67                  (xive)->chip->chip_id, ## __VA_ARGS__);
     68
     69/*
     70 * QEMU version of the GETFIELD/SETFIELD macros
     71 *
     72 * TODO: It might be better to use the existing extract64() and
     73 * deposit64() but this means that all the register definitions will
     74 * change and become incompatible with the ones found in skiboot.
     75 *
     76 * Keep it as it is for now until we find a common ground.
     77 */
     78static inline uint64_t GETFIELD(uint64_t mask, uint64_t word)
     79{
     80    return (word & mask) >> ctz64(mask);
     81}
     82
     83static inline uint64_t SETFIELD(uint64_t mask, uint64_t word,
     84                                uint64_t value)
     85{
     86    return (word & ~mask) | ((value << ctz64(mask)) & mask);
     87}
     88
     89/*
     90 * When PC_TCTXT_CHIPID_OVERRIDE is configured, the PC_TCTXT_CHIPID
     91 * field overrides the hardwired chip ID in the Powerbus operations
     92 * and for CAM compares
     93 */
     94static uint8_t pnv_xive_block_id(PnvXive *xive)
     95{
     96    uint8_t blk = xive->chip->chip_id;
     97    uint64_t cfg_val = xive->regs[PC_TCTXT_CFG >> 3];
     98
     99    if (cfg_val & PC_TCTXT_CHIPID_OVERRIDE) {
    100        blk = GETFIELD(PC_TCTXT_CHIPID, cfg_val);
    101    }
    102
    103    return blk;
    104}
    105
    106/*
    107 * Remote access to controllers. HW uses MMIOs. For now, a simple scan
    108 * of the chips is good enough.
    109 *
    110 * TODO: Block scope support
    111 */
    112static PnvXive *pnv_xive_get_remote(uint8_t blk)
    113{
    114    PnvMachineState *pnv = PNV_MACHINE(qdev_get_machine());
    115    int i;
    116
    117    for (i = 0; i < pnv->num_chips; i++) {
    118        Pnv9Chip *chip9 = PNV9_CHIP(pnv->chips[i]);
    119        PnvXive *xive = &chip9->xive;
    120
    121        if (pnv_xive_block_id(xive) == blk) {
    122            return xive;
    123        }
    124    }
    125    return NULL;
    126}
    127
    128/*
    129 * VST accessors for SBE, EAT, ENDT, NVT
    130 *
    131 * Indirect VST tables are arrays of VSDs pointing to a page (of same
    132 * size). Each page is a direct VST table.
    133 */
    134
    135#define XIVE_VSD_SIZE 8
    136
    137/* Indirect page size can be 4K, 64K, 2M, 16M. */
    138static uint64_t pnv_xive_vst_page_size_allowed(uint32_t page_shift)
    139{
    140     return page_shift == 12 || page_shift == 16 ||
    141         page_shift == 21 || page_shift == 24;
    142}
    143
    144static uint64_t pnv_xive_vst_addr_direct(PnvXive *xive, uint32_t type,
    145                                         uint64_t vsd, uint32_t idx)
    146{
    147    const XiveVstInfo *info = &vst_infos[type];
    148    uint64_t vst_addr = vsd & VSD_ADDRESS_MASK;
    149    uint64_t vst_tsize = 1ull << (GETFIELD(VSD_TSIZE, vsd) + 12);
    150    uint32_t idx_max;
    151
    152    idx_max = vst_tsize / info->size - 1;
    153    if (idx > idx_max) {
    154#ifdef XIVE_DEBUG
    155        xive_error(xive, "VST: %s entry %x out of range [ 0 .. %x ] !?",
    156                   info->name, idx, idx_max);
    157#endif
    158        return 0;
    159    }
    160
    161    return vst_addr + idx * info->size;
    162}
    163
    164static uint64_t pnv_xive_vst_addr_indirect(PnvXive *xive, uint32_t type,
    165                                           uint64_t vsd, uint32_t idx)
    166{
    167    const XiveVstInfo *info = &vst_infos[type];
    168    uint64_t vsd_addr;
    169    uint32_t vsd_idx;
    170    uint32_t page_shift;
    171    uint32_t vst_per_page;
    172
    173    /* Get the page size of the indirect table. */
    174    vsd_addr = vsd & VSD_ADDRESS_MASK;
    175    vsd = ldq_be_dma(&address_space_memory, vsd_addr);
    176
    177    if (!(vsd & VSD_ADDRESS_MASK)) {
    178#ifdef XIVE_DEBUG
    179        xive_error(xive, "VST: invalid %s entry %x !?", info->name, idx);
    180#endif
    181        return 0;
    182    }
    183
    184    page_shift = GETFIELD(VSD_TSIZE, vsd) + 12;
    185
    186    if (!pnv_xive_vst_page_size_allowed(page_shift)) {
    187        xive_error(xive, "VST: invalid %s page shift %d", info->name,
    188                   page_shift);
    189        return 0;
    190    }
    191
    192    vst_per_page = (1ull << page_shift) / info->size;
    193    vsd_idx = idx / vst_per_page;
    194
    195    /* Load the VSD we are looking for, if not already done */
    196    if (vsd_idx) {
    197        vsd_addr = vsd_addr + vsd_idx * XIVE_VSD_SIZE;
    198        vsd = ldq_be_dma(&address_space_memory, vsd_addr);
    199
    200        if (!(vsd & VSD_ADDRESS_MASK)) {
    201#ifdef XIVE_DEBUG
    202            xive_error(xive, "VST: invalid %s entry %x !?", info->name, idx);
    203#endif
    204            return 0;
    205        }
    206
    207        /*
    208         * Check that the pages have a consistent size across the
    209         * indirect table
    210         */
    211        if (page_shift != GETFIELD(VSD_TSIZE, vsd) + 12) {
    212            xive_error(xive, "VST: %s entry %x indirect page size differ !?",
    213                       info->name, idx);
    214            return 0;
    215        }
    216    }
    217
    218    return pnv_xive_vst_addr_direct(xive, type, vsd, (idx % vst_per_page));
    219}
    220
    221static uint64_t pnv_xive_vst_addr(PnvXive *xive, uint32_t type, uint8_t blk,
    222                                  uint32_t idx)
    223{
    224    const XiveVstInfo *info = &vst_infos[type];
    225    uint64_t vsd;
    226
    227    if (blk >= info->max_blocks) {
    228        xive_error(xive, "VST: invalid block id %d for VST %s %d !?",
    229                   blk, info->name, idx);
    230        return 0;
    231    }
    232
    233    vsd = xive->vsds[type][blk];
    234
    235    /* Remote VST access */
    236    if (GETFIELD(VSD_MODE, vsd) == VSD_MODE_FORWARD) {
    237        xive = pnv_xive_get_remote(blk);
    238
    239        return xive ? pnv_xive_vst_addr(xive, type, blk, idx) : 0;
    240    }
    241
    242    if (VSD_INDIRECT & vsd) {
    243        return pnv_xive_vst_addr_indirect(xive, type, vsd, idx);
    244    }
    245
    246    return pnv_xive_vst_addr_direct(xive, type, vsd, idx);
    247}
    248
    249static int pnv_xive_vst_read(PnvXive *xive, uint32_t type, uint8_t blk,
    250                             uint32_t idx, void *data)
    251{
    252    const XiveVstInfo *info = &vst_infos[type];
    253    uint64_t addr = pnv_xive_vst_addr(xive, type, blk, idx);
    254
    255    if (!addr) {
    256        return -1;
    257    }
    258
    259    cpu_physical_memory_read(addr, data, info->size);
    260    return 0;
    261}
    262
    263#define XIVE_VST_WORD_ALL -1
    264
    265static int pnv_xive_vst_write(PnvXive *xive, uint32_t type, uint8_t blk,
    266                              uint32_t idx, void *data, uint32_t word_number)
    267{
    268    const XiveVstInfo *info = &vst_infos[type];
    269    uint64_t addr = pnv_xive_vst_addr(xive, type, blk, idx);
    270
    271    if (!addr) {
    272        return -1;
    273    }
    274
    275    if (word_number == XIVE_VST_WORD_ALL) {
    276        cpu_physical_memory_write(addr, data, info->size);
    277    } else {
    278        cpu_physical_memory_write(addr + word_number * 4,
    279                                  data + word_number * 4, 4);
    280    }
    281    return 0;
    282}
    283
    284static int pnv_xive_get_end(XiveRouter *xrtr, uint8_t blk, uint32_t idx,
    285                            XiveEND *end)
    286{
    287    return pnv_xive_vst_read(PNV_XIVE(xrtr), VST_TSEL_EQDT, blk, idx, end);
    288}
    289
    290static int pnv_xive_write_end(XiveRouter *xrtr, uint8_t blk, uint32_t idx,
    291                              XiveEND *end, uint8_t word_number)
    292{
    293    return pnv_xive_vst_write(PNV_XIVE(xrtr), VST_TSEL_EQDT, blk, idx, end,
    294                              word_number);
    295}
    296
    297static int pnv_xive_end_update(PnvXive *xive)
    298{
    299    uint8_t  blk = GETFIELD(VC_EQC_CWATCH_BLOCKID,
    300                           xive->regs[(VC_EQC_CWATCH_SPEC >> 3)]);
    301    uint32_t idx = GETFIELD(VC_EQC_CWATCH_OFFSET,
    302                           xive->regs[(VC_EQC_CWATCH_SPEC >> 3)]);
    303    int i;
    304    uint64_t eqc_watch[4];
    305
    306    for (i = 0; i < ARRAY_SIZE(eqc_watch); i++) {
    307        eqc_watch[i] = cpu_to_be64(xive->regs[(VC_EQC_CWATCH_DAT0 >> 3) + i]);
    308    }
    309
    310    return pnv_xive_vst_write(xive, VST_TSEL_EQDT, blk, idx, eqc_watch,
    311                              XIVE_VST_WORD_ALL);
    312}
    313
    314static void pnv_xive_end_cache_load(PnvXive *xive)
    315{
    316    uint8_t  blk = GETFIELD(VC_EQC_CWATCH_BLOCKID,
    317                           xive->regs[(VC_EQC_CWATCH_SPEC >> 3)]);
    318    uint32_t idx = GETFIELD(VC_EQC_CWATCH_OFFSET,
    319                           xive->regs[(VC_EQC_CWATCH_SPEC >> 3)]);
    320    uint64_t eqc_watch[4] = { 0 };
    321    int i;
    322
    323    if (pnv_xive_vst_read(xive, VST_TSEL_EQDT, blk, idx, eqc_watch)) {
    324        xive_error(xive, "VST: no END entry %x/%x !?", blk, idx);
    325    }
    326
    327    for (i = 0; i < ARRAY_SIZE(eqc_watch); i++) {
    328        xive->regs[(VC_EQC_CWATCH_DAT0 >> 3) + i] = be64_to_cpu(eqc_watch[i]);
    329    }
    330}
    331
    332static int pnv_xive_get_nvt(XiveRouter *xrtr, uint8_t blk, uint32_t idx,
    333                            XiveNVT *nvt)
    334{
    335    return pnv_xive_vst_read(PNV_XIVE(xrtr), VST_TSEL_VPDT, blk, idx, nvt);
    336}
    337
    338static int pnv_xive_write_nvt(XiveRouter *xrtr, uint8_t blk, uint32_t idx,
    339                              XiveNVT *nvt, uint8_t word_number)
    340{
    341    return pnv_xive_vst_write(PNV_XIVE(xrtr), VST_TSEL_VPDT, blk, idx, nvt,
    342                              word_number);
    343}
    344
    345static int pnv_xive_nvt_update(PnvXive *xive)
    346{
    347    uint8_t  blk = GETFIELD(PC_VPC_CWATCH_BLOCKID,
    348                           xive->regs[(PC_VPC_CWATCH_SPEC >> 3)]);
    349    uint32_t idx = GETFIELD(PC_VPC_CWATCH_OFFSET,
    350                           xive->regs[(PC_VPC_CWATCH_SPEC >> 3)]);
    351    int i;
    352    uint64_t vpc_watch[8];
    353
    354    for (i = 0; i < ARRAY_SIZE(vpc_watch); i++) {
    355        vpc_watch[i] = cpu_to_be64(xive->regs[(PC_VPC_CWATCH_DAT0 >> 3) + i]);
    356    }
    357
    358    return pnv_xive_vst_write(xive, VST_TSEL_VPDT, blk, idx, vpc_watch,
    359                              XIVE_VST_WORD_ALL);
    360}
    361
    362static void pnv_xive_nvt_cache_load(PnvXive *xive)
    363{
    364    uint8_t  blk = GETFIELD(PC_VPC_CWATCH_BLOCKID,
    365                           xive->regs[(PC_VPC_CWATCH_SPEC >> 3)]);
    366    uint32_t idx = GETFIELD(PC_VPC_CWATCH_OFFSET,
    367                           xive->regs[(PC_VPC_CWATCH_SPEC >> 3)]);
    368    uint64_t vpc_watch[8] = { 0 };
    369    int i;
    370
    371    if (pnv_xive_vst_read(xive, VST_TSEL_VPDT, blk, idx, vpc_watch)) {
    372        xive_error(xive, "VST: no NVT entry %x/%x !?", blk, idx);
    373    }
    374
    375    for (i = 0; i < ARRAY_SIZE(vpc_watch); i++) {
    376        xive->regs[(PC_VPC_CWATCH_DAT0 >> 3) + i] = be64_to_cpu(vpc_watch[i]);
    377    }
    378}
    379
    380static int pnv_xive_get_eas(XiveRouter *xrtr, uint8_t blk, uint32_t idx,
    381                            XiveEAS *eas)
    382{
    383    PnvXive *xive = PNV_XIVE(xrtr);
    384
    385    /*
    386     * EAT lookups should be local to the IC
    387     */
    388    if (pnv_xive_block_id(xive) != blk) {
    389        xive_error(xive, "VST: EAS %x is remote !?", XIVE_EAS(blk, idx));
    390        return -1;
    391    }
    392
    393    return pnv_xive_vst_read(xive, VST_TSEL_IVT, blk, idx, eas);
    394}
    395
    396/*
    397 * One bit per thread id. The first register PC_THREAD_EN_REG0 covers
    398 * the first cores 0-15 (normal) of the chip or 0-7 (fused). The
    399 * second register covers cores 16-23 (normal) or 8-11 (fused).
    400 */
    401static bool pnv_xive_is_cpu_enabled(PnvXive *xive, PowerPCCPU *cpu)
    402{
    403    int pir = ppc_cpu_pir(cpu);
    404    uint32_t fc = PNV9_PIR2FUSEDCORE(pir);
    405    uint64_t reg = fc < 8 ? PC_THREAD_EN_REG0 : PC_THREAD_EN_REG1;
    406    uint32_t bit = pir & 0x3f;
    407
    408    return xive->regs[reg >> 3] & PPC_BIT(bit);
    409}
    410
    411static int pnv_xive_match_nvt(XivePresenter *xptr, uint8_t format,
    412                              uint8_t nvt_blk, uint32_t nvt_idx,
    413                              bool cam_ignore, uint8_t priority,
    414                              uint32_t logic_serv, XiveTCTXMatch *match)
    415{
    416    PnvXive *xive = PNV_XIVE(xptr);
    417    PnvChip *chip = xive->chip;
    418    int count = 0;
    419    int i, j;
    420
    421    for (i = 0; i < chip->nr_cores; i++) {
    422        PnvCore *pc = chip->cores[i];
    423        CPUCore *cc = CPU_CORE(pc);
    424
    425        for (j = 0; j < cc->nr_threads; j++) {
    426            PowerPCCPU *cpu = pc->threads[j];
    427            XiveTCTX *tctx;
    428            int ring;
    429
    430            if (!pnv_xive_is_cpu_enabled(xive, cpu)) {
    431                continue;
    432            }
    433
    434            tctx = XIVE_TCTX(pnv_cpu_state(cpu)->intc);
    435
    436            /*
    437             * Check the thread context CAM lines and record matches.
    438             */
    439            ring = xive_presenter_tctx_match(xptr, tctx, format, nvt_blk,
    440                                             nvt_idx, cam_ignore, logic_serv);
    441            /*
    442             * Save the context and follow on to catch duplicates, that we
    443             * don't support yet.
    444             */
    445            if (ring != -1) {
    446                if (match->tctx) {
    447                    qemu_log_mask(LOG_GUEST_ERROR, "XIVE: already found a "
    448                                  "thread context NVT %x/%x\n",
    449                                  nvt_blk, nvt_idx);
    450                    return -1;
    451                }
    452
    453                match->ring = ring;
    454                match->tctx = tctx;
    455                count++;
    456            }
    457        }
    458    }
    459
    460    return count;
    461}
    462
    463static uint8_t pnv_xive_get_block_id(XiveRouter *xrtr)
    464{
    465    return pnv_xive_block_id(PNV_XIVE(xrtr));
    466}
    467
    468/*
    469 * The TIMA MMIO space is shared among the chips and to identify the
    470 * chip from which the access is being done, we extract the chip id
    471 * from the PIR.
    472 */
    473static PnvXive *pnv_xive_tm_get_xive(PowerPCCPU *cpu)
    474{
    475    int pir = ppc_cpu_pir(cpu);
    476    XivePresenter *xptr = XIVE_TCTX(pnv_cpu_state(cpu)->intc)->xptr;
    477    PnvXive *xive = PNV_XIVE(xptr);
    478
    479    if (!pnv_xive_is_cpu_enabled(xive, cpu)) {
    480        xive_error(xive, "IC: CPU %x is not enabled", pir);
    481    }
    482    return xive;
    483}
    484
    485/*
    486 * The internal sources (IPIs) of the interrupt controller have no
    487 * knowledge of the XIVE chip on which they reside. Encode the block
    488 * id in the source interrupt number before forwarding the source
    489 * event notification to the Router. This is required on a multichip
    490 * system.
    491 */
    492static void pnv_xive_notify(XiveNotifier *xn, uint32_t srcno)
    493{
    494    PnvXive *xive = PNV_XIVE(xn);
    495    uint8_t blk = pnv_xive_block_id(xive);
    496
    497    xive_router_notify(xn, XIVE_EAS(blk, srcno));
    498}
    499
    500/*
    501 * XIVE helpers
    502 */
    503
    504static uint64_t pnv_xive_vc_size(PnvXive *xive)
    505{
    506    return (~xive->regs[CQ_VC_BARM >> 3] + 1) & CQ_VC_BARM_MASK;
    507}
    508
    509static uint64_t pnv_xive_edt_shift(PnvXive *xive)
    510{
    511    return ctz64(pnv_xive_vc_size(xive) / XIVE_TABLE_EDT_MAX);
    512}
    513
    514static uint64_t pnv_xive_pc_size(PnvXive *xive)
    515{
    516    return (~xive->regs[CQ_PC_BARM >> 3] + 1) & CQ_PC_BARM_MASK;
    517}
    518
    519static uint32_t pnv_xive_nr_ipis(PnvXive *xive, uint8_t blk)
    520{
    521    uint64_t vsd = xive->vsds[VST_TSEL_SBE][blk];
    522    uint64_t vst_tsize = 1ull << (GETFIELD(VSD_TSIZE, vsd) + 12);
    523
    524    return VSD_INDIRECT & vsd ? 0 : vst_tsize * SBE_PER_BYTE;
    525}
    526
    527/*
    528 * Compute the number of entries per indirect subpage.
    529 */
    530static uint64_t pnv_xive_vst_per_subpage(PnvXive *xive, uint32_t type)
    531{
    532    uint8_t blk = pnv_xive_block_id(xive);
    533    uint64_t vsd = xive->vsds[type][blk];
    534    const XiveVstInfo *info = &vst_infos[type];
    535    uint64_t vsd_addr;
    536    uint32_t page_shift;
    537
    538    /* For direct tables, fake a valid value */
    539    if (!(VSD_INDIRECT & vsd)) {
    540        return 1;
    541    }
    542
    543    /* Get the page size of the indirect table. */
    544    vsd_addr = vsd & VSD_ADDRESS_MASK;
    545    vsd = ldq_be_dma(&address_space_memory, vsd_addr);
    546
    547    if (!(vsd & VSD_ADDRESS_MASK)) {
    548#ifdef XIVE_DEBUG
    549        xive_error(xive, "VST: invalid %s entry %x !?", info->name, idx);
    550#endif
    551        return 0;
    552    }
    553
    554    page_shift = GETFIELD(VSD_TSIZE, vsd) + 12;
    555
    556    if (!pnv_xive_vst_page_size_allowed(page_shift)) {
    557        xive_error(xive, "VST: invalid %s page shift %d", info->name,
    558                   page_shift);
    559        return 0;
    560    }
    561
    562    return (1ull << page_shift) / info->size;
    563}
    564
    565/*
    566 * EDT Table
    567 *
    568 * The Virtualization Controller MMIO region containing the IPI ESB
    569 * pages and END ESB pages is sub-divided into "sets" which map
    570 * portions of the VC region to the different ESB pages. It is
    571 * configured at runtime through the EDT "Domain Table" to let the
    572 * firmware decide how to split the VC address space between IPI ESB
    573 * pages and END ESB pages.
    574 */
    575
    576/*
    577 * Computes the overall size of the IPI or the END ESB pages
    578 */
    579static uint64_t pnv_xive_edt_size(PnvXive *xive, uint64_t type)
    580{
    581    uint64_t edt_size = 1ull << pnv_xive_edt_shift(xive);
    582    uint64_t size = 0;
    583    int i;
    584
    585    for (i = 0; i < XIVE_TABLE_EDT_MAX; i++) {
    586        uint64_t edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[i]);
    587
    588        if (edt_type == type) {
    589            size += edt_size;
    590        }
    591    }
    592
    593    return size;
    594}
    595
    596/*
    597 * Maps an offset of the VC region in the IPI or END region using the
    598 * layout defined by the EDT "Domaine Table"
    599 */
    600static uint64_t pnv_xive_edt_offset(PnvXive *xive, uint64_t vc_offset,
    601                                              uint64_t type)
    602{
    603    int i;
    604    uint64_t edt_size = 1ull << pnv_xive_edt_shift(xive);
    605    uint64_t edt_offset = vc_offset;
    606
    607    for (i = 0; i < XIVE_TABLE_EDT_MAX && (i * edt_size) < vc_offset; i++) {
    608        uint64_t edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[i]);
    609
    610        if (edt_type != type) {
    611            edt_offset -= edt_size;
    612        }
    613    }
    614
    615    return edt_offset;
    616}
    617
    618static void pnv_xive_edt_resize(PnvXive *xive)
    619{
    620    uint64_t ipi_edt_size = pnv_xive_edt_size(xive, CQ_TDR_EDT_IPI);
    621    uint64_t end_edt_size = pnv_xive_edt_size(xive, CQ_TDR_EDT_EQ);
    622
    623    memory_region_set_size(&xive->ipi_edt_mmio, ipi_edt_size);
    624    memory_region_add_subregion(&xive->ipi_mmio, 0, &xive->ipi_edt_mmio);
    625
    626    memory_region_set_size(&xive->end_edt_mmio, end_edt_size);
    627    memory_region_add_subregion(&xive->end_mmio, 0, &xive->end_edt_mmio);
    628}
    629
    630/*
    631 * XIVE Table configuration. Only EDT is supported.
    632 */
    633static int pnv_xive_table_set_data(PnvXive *xive, uint64_t val)
    634{
    635    uint64_t tsel = xive->regs[CQ_TAR >> 3] & CQ_TAR_TSEL;
    636    uint8_t tsel_index = GETFIELD(CQ_TAR_TSEL_INDEX, xive->regs[CQ_TAR >> 3]);
    637    uint64_t *xive_table;
    638    uint8_t max_index;
    639
    640    switch (tsel) {
    641    case CQ_TAR_TSEL_BLK:
    642        max_index = ARRAY_SIZE(xive->blk);
    643        xive_table = xive->blk;
    644        break;
    645    case CQ_TAR_TSEL_MIG:
    646        max_index = ARRAY_SIZE(xive->mig);
    647        xive_table = xive->mig;
    648        break;
    649    case CQ_TAR_TSEL_EDT:
    650        max_index = ARRAY_SIZE(xive->edt);
    651        xive_table = xive->edt;
    652        break;
    653    case CQ_TAR_TSEL_VDT:
    654        max_index = ARRAY_SIZE(xive->vdt);
    655        xive_table = xive->vdt;
    656        break;
    657    default:
    658        xive_error(xive, "IC: invalid table %d", (int) tsel);
    659        return -1;
    660    }
    661
    662    if (tsel_index >= max_index) {
    663        xive_error(xive, "IC: invalid index %d", (int) tsel_index);
    664        return -1;
    665    }
    666
    667    xive_table[tsel_index] = val;
    668
    669    if (xive->regs[CQ_TAR >> 3] & CQ_TAR_TBL_AUTOINC) {
    670        xive->regs[CQ_TAR >> 3] =
    671            SETFIELD(CQ_TAR_TSEL_INDEX, xive->regs[CQ_TAR >> 3], ++tsel_index);
    672    }
    673
    674    /*
    675     * EDT configuration is complete. Resize the MMIO windows exposing
    676     * the IPI and the END ESBs in the VC region.
    677     */
    678    if (tsel == CQ_TAR_TSEL_EDT && tsel_index == ARRAY_SIZE(xive->edt)) {
    679        pnv_xive_edt_resize(xive);
    680    }
    681
    682    return 0;
    683}
    684
    685/*
    686 * Virtual Structure Tables (VST) configuration
    687 */
    688static void pnv_xive_vst_set_exclusive(PnvXive *xive, uint8_t type,
    689                                       uint8_t blk, uint64_t vsd)
    690{
    691    XiveENDSource *end_xsrc = &xive->end_source;
    692    XiveSource *xsrc = &xive->ipi_source;
    693    const XiveVstInfo *info = &vst_infos[type];
    694    uint32_t page_shift = GETFIELD(VSD_TSIZE, vsd) + 12;
    695    uint64_t vst_tsize = 1ull << page_shift;
    696    uint64_t vst_addr = vsd & VSD_ADDRESS_MASK;
    697
    698    /* Basic checks */
    699
    700    if (VSD_INDIRECT & vsd) {
    701        if (!(xive->regs[VC_GLOBAL_CONFIG >> 3] & VC_GCONF_INDIRECT)) {
    702            xive_error(xive, "VST: %s indirect tables are not enabled",
    703                       info->name);
    704            return;
    705        }
    706
    707        if (!pnv_xive_vst_page_size_allowed(page_shift)) {
    708            xive_error(xive, "VST: invalid %s page shift %d", info->name,
    709                       page_shift);
    710            return;
    711        }
    712    }
    713
    714    if (!QEMU_IS_ALIGNED(vst_addr, 1ull << page_shift)) {
    715        xive_error(xive, "VST: %s table address 0x%"PRIx64" is not aligned with"
    716                   " page shift %d", info->name, vst_addr, page_shift);
    717        return;
    718    }
    719
    720    /* Record the table configuration (in SRAM on HW) */
    721    xive->vsds[type][blk] = vsd;
    722
    723    /* Now tune the models with the configuration provided by the FW */
    724
    725    switch (type) {
    726    case VST_TSEL_IVT:  /* Nothing to be done */
    727        break;
    728
    729    case VST_TSEL_EQDT:
    730        /*
    731         * Backing store pages for the END.
    732         *
    733         * If the table is direct, we can compute the number of PQ
    734         * entries provisioned by FW (such as skiboot) and resize the
    735         * END ESB window accordingly.
    736         */
    737        if (!(VSD_INDIRECT & vsd)) {
    738            memory_region_set_size(&end_xsrc->esb_mmio, (vst_tsize / info->size)
    739                                   * (1ull << xsrc->esb_shift));
    740        }
    741        memory_region_add_subregion(&xive->end_edt_mmio, 0,
    742                                    &end_xsrc->esb_mmio);
    743        break;
    744
    745    case VST_TSEL_SBE:
    746        /*
    747         * Backing store pages for the source PQ bits. The model does
    748         * not use these PQ bits backed in RAM because the XiveSource
    749         * model has its own.
    750         *
    751         * If the table is direct, we can compute the number of PQ
    752         * entries provisioned by FW (such as skiboot) and resize the
    753         * ESB window accordingly.
    754         */
    755        if (!(VSD_INDIRECT & vsd)) {
    756            memory_region_set_size(&xsrc->esb_mmio, vst_tsize * SBE_PER_BYTE
    757                                   * (1ull << xsrc->esb_shift));
    758        }
    759        memory_region_add_subregion(&xive->ipi_edt_mmio, 0, &xsrc->esb_mmio);
    760        break;
    761
    762    case VST_TSEL_VPDT: /* Not modeled */
    763    case VST_TSEL_IRQ:  /* Not modeled */
    764        /*
    765         * These tables contains the backing store pages for the
    766         * interrupt fifos of the VC sub-engine in case of overflow.
    767         */
    768        break;
    769
    770    default:
    771        g_assert_not_reached();
    772    }
    773}
    774
    775/*
    776 * Both PC and VC sub-engines are configured as each use the Virtual
    777 * Structure Tables : SBE, EAS, END and NVT.
    778 */
    779static void pnv_xive_vst_set_data(PnvXive *xive, uint64_t vsd, bool pc_engine)
    780{
    781    uint8_t mode = GETFIELD(VSD_MODE, vsd);
    782    uint8_t type = GETFIELD(VST_TABLE_SELECT,
    783                            xive->regs[VC_VSD_TABLE_ADDR >> 3]);
    784    uint8_t blk = GETFIELD(VST_TABLE_BLOCK,
    785                           xive->regs[VC_VSD_TABLE_ADDR >> 3]);
    786    uint64_t vst_addr = vsd & VSD_ADDRESS_MASK;
    787
    788    if (type > VST_TSEL_IRQ) {
    789        xive_error(xive, "VST: invalid table type %d", type);
    790        return;
    791    }
    792
    793    if (blk >= vst_infos[type].max_blocks) {
    794        xive_error(xive, "VST: invalid block id %d for"
    795                      " %s table", blk, vst_infos[type].name);
    796        return;
    797    }
    798
    799    /*
    800     * Only take the VC sub-engine configuration into account because
    801     * the XiveRouter model combines both VC and PC sub-engines
    802     */
    803    if (pc_engine) {
    804        return;
    805    }
    806
    807    if (!vst_addr) {
    808        xive_error(xive, "VST: invalid %s table address", vst_infos[type].name);
    809        return;
    810    }
    811
    812    switch (mode) {
    813    case VSD_MODE_FORWARD:
    814        xive->vsds[type][blk] = vsd;
    815        break;
    816
    817    case VSD_MODE_EXCLUSIVE:
    818        pnv_xive_vst_set_exclusive(xive, type, blk, vsd);
    819        break;
    820
    821    default:
    822        xive_error(xive, "VST: unsupported table mode %d", mode);
    823        return;
    824    }
    825}
    826
    827/*
    828 * Interrupt controller MMIO region. The layout is compatible between
    829 * 4K and 64K pages :
    830 *
    831 * Page 0           sub-engine BARs
    832 *  0x000 - 0x3FF   IC registers
    833 *  0x400 - 0x7FF   PC registers
    834 *  0x800 - 0xFFF   VC registers
    835 *
    836 * Page 1           Notify page (writes only)
    837 *  0x000 - 0x7FF   HW interrupt triggers (PSI, PHB)
    838 *  0x800 - 0xFFF   forwards and syncs
    839 *
    840 * Page 2           LSI Trigger page (writes only) (not modeled)
    841 * Page 3           LSI SB EOI page (reads only) (not modeled)
    842 *
    843 * Page 4-7         indirect TIMA
    844 */
    845
    846/*
    847 * IC - registers MMIO
    848 */
    849static void pnv_xive_ic_reg_write(void *opaque, hwaddr offset,
    850                                  uint64_t val, unsigned size)
    851{
    852    PnvXive *xive = PNV_XIVE(opaque);
    853    MemoryRegion *sysmem = get_system_memory();
    854    uint32_t reg = offset >> 3;
    855    bool is_chip0 = xive->chip->chip_id == 0;
    856
    857    switch (offset) {
    858
    859    /*
    860     * XIVE CQ (PowerBus bridge) settings
    861     */
    862    case CQ_MSGSND:     /* msgsnd for doorbells */
    863    case CQ_FIRMASK_OR: /* FIR error reporting */
    864        break;
    865    case CQ_PBI_CTL:
    866        if (val & CQ_PBI_PC_64K) {
    867            xive->pc_shift = 16;
    868        }
    869        if (val & CQ_PBI_VC_64K) {
    870            xive->vc_shift = 16;
    871        }
    872        break;
    873    case CQ_CFG_PB_GEN: /* PowerBus General Configuration */
    874        /*
    875         * TODO: CQ_INT_ADDR_OPT for 1-block-per-chip mode
    876         */
    877        break;
    878
    879    /*
    880     * XIVE Virtualization Controller settings
    881     */
    882    case VC_GLOBAL_CONFIG:
    883        break;
    884
    885    /*
    886     * XIVE Presenter Controller settings
    887     */
    888    case PC_GLOBAL_CONFIG:
    889        /*
    890         * PC_GCONF_CHIPID_OVR
    891         *   Overrides Int command Chip ID with the Chip ID field (DEBUG)
    892         */
    893        break;
    894    case PC_TCTXT_CFG:
    895        /*
    896         * TODO: block group support
    897         */
    898        break;
    899    case PC_TCTXT_TRACK:
    900        /*
    901         * PC_TCTXT_TRACK_EN:
    902         *   enable block tracking and exchange of block ownership
    903         *   information between Interrupt controllers
    904         */
    905        break;
    906
    907    /*
    908     * Misc settings
    909     */
    910    case VC_SBC_CONFIG: /* Store EOI configuration */
    911        /*
    912         * Configure store EOI if required by firwmare (skiboot has removed
    913         * support recently though)
    914         */
    915        if (val & (VC_SBC_CONF_CPLX_CIST | VC_SBC_CONF_CIST_BOTH)) {
    916            xive->ipi_source.esb_flags |= XIVE_SRC_STORE_EOI;
    917        }
    918        break;
    919
    920    case VC_EQC_CONFIG: /* TODO: silent escalation */
    921    case VC_AIB_TX_ORDER_TAG2: /* relax ordering */
    922        break;
    923
    924    /*
    925     * XIVE BAR settings (XSCOM only)
    926     */
    927    case CQ_RST_CTL:
    928        /* bit4: resets all BAR registers */
    929        break;
    930
    931    case CQ_IC_BAR: /* IC BAR. 8 pages */
    932        xive->ic_shift = val & CQ_IC_BAR_64K ? 16 : 12;
    933        if (!(val & CQ_IC_BAR_VALID)) {
    934            xive->ic_base = 0;
    935            if (xive->regs[reg] & CQ_IC_BAR_VALID) {
    936                memory_region_del_subregion(&xive->ic_mmio,
    937                                            &xive->ic_reg_mmio);
    938                memory_region_del_subregion(&xive->ic_mmio,
    939                                            &xive->ic_notify_mmio);
    940                memory_region_del_subregion(&xive->ic_mmio,
    941                                            &xive->ic_lsi_mmio);
    942                memory_region_del_subregion(&xive->ic_mmio,
    943                                            &xive->tm_indirect_mmio);
    944
    945                memory_region_del_subregion(sysmem, &xive->ic_mmio);
    946            }
    947        } else {
    948            xive->ic_base = val & ~(CQ_IC_BAR_VALID | CQ_IC_BAR_64K);
    949            if (!(xive->regs[reg] & CQ_IC_BAR_VALID)) {
    950                memory_region_add_subregion(sysmem, xive->ic_base,
    951                                            &xive->ic_mmio);
    952
    953                memory_region_add_subregion(&xive->ic_mmio,  0,
    954                                            &xive->ic_reg_mmio);
    955                memory_region_add_subregion(&xive->ic_mmio,
    956                                            1ul << xive->ic_shift,
    957                                            &xive->ic_notify_mmio);
    958                memory_region_add_subregion(&xive->ic_mmio,
    959                                            2ul << xive->ic_shift,
    960                                            &xive->ic_lsi_mmio);
    961                memory_region_add_subregion(&xive->ic_mmio,
    962                                            4ull << xive->ic_shift,
    963                                            &xive->tm_indirect_mmio);
    964            }
    965        }
    966        break;
    967
    968    case CQ_TM1_BAR: /* TM BAR. 4 pages. Map only once */
    969    case CQ_TM2_BAR: /* second TM BAR. for hotplug. Not modeled */
    970        xive->tm_shift = val & CQ_TM_BAR_64K ? 16 : 12;
    971        if (!(val & CQ_TM_BAR_VALID)) {
    972            xive->tm_base = 0;
    973            if (xive->regs[reg] & CQ_TM_BAR_VALID && is_chip0) {
    974                memory_region_del_subregion(sysmem, &xive->tm_mmio);
    975            }
    976        } else {
    977            xive->tm_base = val & ~(CQ_TM_BAR_VALID | CQ_TM_BAR_64K);
    978            if (!(xive->regs[reg] & CQ_TM_BAR_VALID) && is_chip0) {
    979                memory_region_add_subregion(sysmem, xive->tm_base,
    980                                            &xive->tm_mmio);
    981            }
    982        }
    983        break;
    984
    985    case CQ_PC_BARM:
    986        xive->regs[reg] = val;
    987        memory_region_set_size(&xive->pc_mmio, pnv_xive_pc_size(xive));
    988        break;
    989    case CQ_PC_BAR: /* From 32M to 512G */
    990        if (!(val & CQ_PC_BAR_VALID)) {
    991            xive->pc_base = 0;
    992            if (xive->regs[reg] & CQ_PC_BAR_VALID) {
    993                memory_region_del_subregion(sysmem, &xive->pc_mmio);
    994            }
    995        } else {
    996            xive->pc_base = val & ~(CQ_PC_BAR_VALID);
    997            if (!(xive->regs[reg] & CQ_PC_BAR_VALID)) {
    998                memory_region_add_subregion(sysmem, xive->pc_base,
    999                                            &xive->pc_mmio);
   1000            }
   1001        }
   1002        break;
   1003
   1004    case CQ_VC_BARM:
   1005        xive->regs[reg] = val;
   1006        memory_region_set_size(&xive->vc_mmio, pnv_xive_vc_size(xive));
   1007        break;
   1008    case CQ_VC_BAR: /* From 64M to 4TB */
   1009        if (!(val & CQ_VC_BAR_VALID)) {
   1010            xive->vc_base = 0;
   1011            if (xive->regs[reg] & CQ_VC_BAR_VALID) {
   1012                memory_region_del_subregion(sysmem, &xive->vc_mmio);
   1013            }
   1014        } else {
   1015            xive->vc_base = val & ~(CQ_VC_BAR_VALID);
   1016            if (!(xive->regs[reg] & CQ_VC_BAR_VALID)) {
   1017                memory_region_add_subregion(sysmem, xive->vc_base,
   1018                                            &xive->vc_mmio);
   1019            }
   1020        }
   1021        break;
   1022
   1023    /*
   1024     * XIVE Table settings.
   1025     */
   1026    case CQ_TAR: /* Table Address */
   1027        break;
   1028    case CQ_TDR: /* Table Data */
   1029        pnv_xive_table_set_data(xive, val);
   1030        break;
   1031
   1032    /*
   1033     * XIVE VC & PC Virtual Structure Table settings
   1034     */
   1035    case VC_VSD_TABLE_ADDR:
   1036    case PC_VSD_TABLE_ADDR: /* Virtual table selector */
   1037        break;
   1038    case VC_VSD_TABLE_DATA: /* Virtual table setting */
   1039    case PC_VSD_TABLE_DATA:
   1040        pnv_xive_vst_set_data(xive, val, offset == PC_VSD_TABLE_DATA);
   1041        break;
   1042
   1043    /*
   1044     * Interrupt fifo overflow in memory backing store (Not modeled)
   1045     */
   1046    case VC_IRQ_CONFIG_IPI:
   1047    case VC_IRQ_CONFIG_HW:
   1048    case VC_IRQ_CONFIG_CASCADE1:
   1049    case VC_IRQ_CONFIG_CASCADE2:
   1050    case VC_IRQ_CONFIG_REDIST:
   1051    case VC_IRQ_CONFIG_IPI_CASC:
   1052        break;
   1053
   1054    /*
   1055     * XIVE hardware thread enablement
   1056     */
   1057    case PC_THREAD_EN_REG0: /* Physical Thread Enable */
   1058    case PC_THREAD_EN_REG1: /* Physical Thread Enable (fused core) */
   1059        break;
   1060
   1061    case PC_THREAD_EN_REG0_SET:
   1062        xive->regs[PC_THREAD_EN_REG0 >> 3] |= val;
   1063        break;
   1064    case PC_THREAD_EN_REG1_SET:
   1065        xive->regs[PC_THREAD_EN_REG1 >> 3] |= val;
   1066        break;
   1067    case PC_THREAD_EN_REG0_CLR:
   1068        xive->regs[PC_THREAD_EN_REG0 >> 3] &= ~val;
   1069        break;
   1070    case PC_THREAD_EN_REG1_CLR:
   1071        xive->regs[PC_THREAD_EN_REG1 >> 3] &= ~val;
   1072        break;
   1073
   1074    /*
   1075     * Indirect TIMA access set up. Defines the PIR of the HW thread
   1076     * to use.
   1077     */
   1078    case PC_TCTXT_INDIR0 ... PC_TCTXT_INDIR3:
   1079        break;
   1080
   1081    /*
   1082     * XIVE PC & VC cache updates for EAS, NVT and END
   1083     */
   1084    case VC_IVC_SCRUB_MASK:
   1085    case VC_IVC_SCRUB_TRIG:
   1086        break;
   1087
   1088    case VC_EQC_CWATCH_SPEC:
   1089        val &= ~VC_EQC_CWATCH_CONFLICT; /* HW resets this bit */
   1090        break;
   1091    case VC_EQC_CWATCH_DAT1 ... VC_EQC_CWATCH_DAT3:
   1092        break;
   1093    case VC_EQC_CWATCH_DAT0:
   1094        /* writing to DATA0 triggers the cache write */
   1095        xive->regs[reg] = val;
   1096        pnv_xive_end_update(xive);
   1097        break;
   1098    case VC_EQC_SCRUB_MASK:
   1099    case VC_EQC_SCRUB_TRIG:
   1100        /*
   1101         * The scrubbing registers flush the cache in RAM and can also
   1102         * invalidate.
   1103         */
   1104        break;
   1105
   1106    case PC_VPC_CWATCH_SPEC:
   1107        val &= ~PC_VPC_CWATCH_CONFLICT; /* HW resets this bit */
   1108        break;
   1109    case PC_VPC_CWATCH_DAT1 ... PC_VPC_CWATCH_DAT7:
   1110        break;
   1111    case PC_VPC_CWATCH_DAT0:
   1112        /* writing to DATA0 triggers the cache write */
   1113        xive->regs[reg] = val;
   1114        pnv_xive_nvt_update(xive);
   1115        break;
   1116    case PC_VPC_SCRUB_MASK:
   1117    case PC_VPC_SCRUB_TRIG:
   1118        /*
   1119         * The scrubbing registers flush the cache in RAM and can also
   1120         * invalidate.
   1121         */
   1122        break;
   1123
   1124
   1125    /*
   1126     * XIVE PC & VC cache invalidation
   1127     */
   1128    case PC_AT_KILL:
   1129        break;
   1130    case VC_AT_MACRO_KILL:
   1131        break;
   1132    case PC_AT_KILL_MASK:
   1133    case VC_AT_MACRO_KILL_MASK:
   1134        break;
   1135
   1136    default:
   1137        xive_error(xive, "IC: invalid write to reg=0x%"HWADDR_PRIx, offset);
   1138        return;
   1139    }
   1140
   1141    xive->regs[reg] = val;
   1142}
   1143
   1144static uint64_t pnv_xive_ic_reg_read(void *opaque, hwaddr offset, unsigned size)
   1145{
   1146    PnvXive *xive = PNV_XIVE(opaque);
   1147    uint64_t val = 0;
   1148    uint32_t reg = offset >> 3;
   1149
   1150    switch (offset) {
   1151    case CQ_CFG_PB_GEN:
   1152    case CQ_IC_BAR:
   1153    case CQ_TM1_BAR:
   1154    case CQ_TM2_BAR:
   1155    case CQ_PC_BAR:
   1156    case CQ_PC_BARM:
   1157    case CQ_VC_BAR:
   1158    case CQ_VC_BARM:
   1159    case CQ_TAR:
   1160    case CQ_TDR:
   1161    case CQ_PBI_CTL:
   1162
   1163    case PC_TCTXT_CFG:
   1164    case PC_TCTXT_TRACK:
   1165    case PC_TCTXT_INDIR0:
   1166    case PC_TCTXT_INDIR1:
   1167    case PC_TCTXT_INDIR2:
   1168    case PC_TCTXT_INDIR3:
   1169    case PC_GLOBAL_CONFIG:
   1170
   1171    case PC_VPC_SCRUB_MASK:
   1172
   1173    case VC_GLOBAL_CONFIG:
   1174    case VC_AIB_TX_ORDER_TAG2:
   1175
   1176    case VC_IRQ_CONFIG_IPI:
   1177    case VC_IRQ_CONFIG_HW:
   1178    case VC_IRQ_CONFIG_CASCADE1:
   1179    case VC_IRQ_CONFIG_CASCADE2:
   1180    case VC_IRQ_CONFIG_REDIST:
   1181    case VC_IRQ_CONFIG_IPI_CASC:
   1182
   1183    case VC_EQC_SCRUB_MASK:
   1184    case VC_IVC_SCRUB_MASK:
   1185    case VC_SBC_CONFIG:
   1186    case VC_AT_MACRO_KILL_MASK:
   1187    case VC_VSD_TABLE_ADDR:
   1188    case PC_VSD_TABLE_ADDR:
   1189    case VC_VSD_TABLE_DATA:
   1190    case PC_VSD_TABLE_DATA:
   1191    case PC_THREAD_EN_REG0:
   1192    case PC_THREAD_EN_REG1:
   1193        val = xive->regs[reg];
   1194        break;
   1195
   1196    /*
   1197     * XIVE hardware thread enablement
   1198     */
   1199    case PC_THREAD_EN_REG0_SET:
   1200    case PC_THREAD_EN_REG0_CLR:
   1201        val = xive->regs[PC_THREAD_EN_REG0 >> 3];
   1202        break;
   1203    case PC_THREAD_EN_REG1_SET:
   1204    case PC_THREAD_EN_REG1_CLR:
   1205        val = xive->regs[PC_THREAD_EN_REG1 >> 3];
   1206        break;
   1207
   1208    case CQ_MSGSND: /* Identifies which cores have msgsnd enabled. */
   1209        val = 0xffffff0000000000;
   1210        break;
   1211
   1212    /*
   1213     * XIVE PC & VC cache updates for EAS, NVT and END
   1214     */
   1215    case VC_EQC_CWATCH_SPEC:
   1216        xive->regs[reg] = ~(VC_EQC_CWATCH_FULL | VC_EQC_CWATCH_CONFLICT);
   1217        val = xive->regs[reg];
   1218        break;
   1219    case VC_EQC_CWATCH_DAT0:
   1220        /*
   1221         * Load DATA registers from cache with data requested by the
   1222         * SPEC register
   1223         */
   1224        pnv_xive_end_cache_load(xive);
   1225        val = xive->regs[reg];
   1226        break;
   1227    case VC_EQC_CWATCH_DAT1 ... VC_EQC_CWATCH_DAT3:
   1228        val = xive->regs[reg];
   1229        break;
   1230
   1231    case PC_VPC_CWATCH_SPEC:
   1232        xive->regs[reg] = ~(PC_VPC_CWATCH_FULL | PC_VPC_CWATCH_CONFLICT);
   1233        val = xive->regs[reg];
   1234        break;
   1235    case PC_VPC_CWATCH_DAT0:
   1236        /*
   1237         * Load DATA registers from cache with data requested by the
   1238         * SPEC register
   1239         */
   1240        pnv_xive_nvt_cache_load(xive);
   1241        val = xive->regs[reg];
   1242        break;
   1243    case PC_VPC_CWATCH_DAT1 ... PC_VPC_CWATCH_DAT7:
   1244        val = xive->regs[reg];
   1245        break;
   1246
   1247    case PC_VPC_SCRUB_TRIG:
   1248    case VC_IVC_SCRUB_TRIG:
   1249    case VC_EQC_SCRUB_TRIG:
   1250        xive->regs[reg] &= ~VC_SCRUB_VALID;
   1251        val = xive->regs[reg];
   1252        break;
   1253
   1254    /*
   1255     * XIVE PC & VC cache invalidation
   1256     */
   1257    case PC_AT_KILL:
   1258        xive->regs[reg] &= ~PC_AT_KILL_VALID;
   1259        val = xive->regs[reg];
   1260        break;
   1261    case VC_AT_MACRO_KILL:
   1262        xive->regs[reg] &= ~VC_KILL_VALID;
   1263        val = xive->regs[reg];
   1264        break;
   1265
   1266    /*
   1267     * XIVE synchronisation
   1268     */
   1269    case VC_EQC_CONFIG:
   1270        val = VC_EQC_SYNC_MASK;
   1271        break;
   1272
   1273    default:
   1274        xive_error(xive, "IC: invalid read reg=0x%"HWADDR_PRIx, offset);
   1275    }
   1276
   1277    return val;
   1278}
   1279
   1280static const MemoryRegionOps pnv_xive_ic_reg_ops = {
   1281    .read = pnv_xive_ic_reg_read,
   1282    .write = pnv_xive_ic_reg_write,
   1283    .endianness = DEVICE_BIG_ENDIAN,
   1284    .valid = {
   1285        .min_access_size = 8,
   1286        .max_access_size = 8,
   1287    },
   1288    .impl = {
   1289        .min_access_size = 8,
   1290        .max_access_size = 8,
   1291    },
   1292};
   1293
   1294/*
   1295 * IC - Notify MMIO port page (write only)
   1296 */
   1297#define PNV_XIVE_FORWARD_IPI        0x800 /* Forward IPI */
   1298#define PNV_XIVE_FORWARD_HW         0x880 /* Forward HW */
   1299#define PNV_XIVE_FORWARD_OS_ESC     0x900 /* Forward OS escalation */
   1300#define PNV_XIVE_FORWARD_HW_ESC     0x980 /* Forward Hyp escalation */
   1301#define PNV_XIVE_FORWARD_REDIS      0xa00 /* Forward Redistribution */
   1302#define PNV_XIVE_RESERVED5          0xa80 /* Cache line 5 PowerBUS operation */
   1303#define PNV_XIVE_RESERVED6          0xb00 /* Cache line 6 PowerBUS operation */
   1304#define PNV_XIVE_RESERVED7          0xb80 /* Cache line 7 PowerBUS operation */
   1305
   1306/* VC synchronisation */
   1307#define PNV_XIVE_SYNC_IPI           0xc00 /* Sync IPI */
   1308#define PNV_XIVE_SYNC_HW            0xc80 /* Sync HW */
   1309#define PNV_XIVE_SYNC_OS_ESC        0xd00 /* Sync OS escalation */
   1310#define PNV_XIVE_SYNC_HW_ESC        0xd80 /* Sync Hyp escalation */
   1311#define PNV_XIVE_SYNC_REDIS         0xe00 /* Sync Redistribution */
   1312
   1313/* PC synchronisation */
   1314#define PNV_XIVE_SYNC_PULL          0xe80 /* Sync pull context */
   1315#define PNV_XIVE_SYNC_PUSH          0xf00 /* Sync push context */
   1316#define PNV_XIVE_SYNC_VPC           0xf80 /* Sync remove VPC store */
   1317
   1318static void pnv_xive_ic_hw_trigger(PnvXive *xive, hwaddr addr, uint64_t val)
   1319{
   1320    uint8_t blk;
   1321    uint32_t idx;
   1322
   1323    trace_pnv_xive_ic_hw_trigger(addr, val);
   1324
   1325    if (val & XIVE_TRIGGER_END) {
   1326        xive_error(xive, "IC: END trigger at @0x%"HWADDR_PRIx" data 0x%"PRIx64,
   1327                   addr, val);
   1328        return;
   1329    }
   1330
   1331    /*
   1332     * Forward the source event notification directly to the Router.
   1333     * The source interrupt number should already be correctly encoded
   1334     * with the chip block id by the sending device (PHB, PSI).
   1335     */
   1336    blk = XIVE_EAS_BLOCK(val);
   1337    idx = XIVE_EAS_INDEX(val);
   1338
   1339    xive_router_notify(XIVE_NOTIFIER(xive), XIVE_EAS(blk, idx));
   1340}
   1341
   1342static void pnv_xive_ic_notify_write(void *opaque, hwaddr addr, uint64_t val,
   1343                                     unsigned size)
   1344{
   1345    PnvXive *xive = PNV_XIVE(opaque);
   1346
   1347    /* VC: HW triggers */
   1348    switch (addr) {
   1349    case 0x000 ... 0x7FF:
   1350        pnv_xive_ic_hw_trigger(opaque, addr, val);
   1351        break;
   1352
   1353    /* VC: Forwarded IRQs */
   1354    case PNV_XIVE_FORWARD_IPI:
   1355    case PNV_XIVE_FORWARD_HW:
   1356    case PNV_XIVE_FORWARD_OS_ESC:
   1357    case PNV_XIVE_FORWARD_HW_ESC:
   1358    case PNV_XIVE_FORWARD_REDIS:
   1359        /* TODO: forwarded IRQs. Should be like HW triggers */
   1360        xive_error(xive, "IC: forwarded at @0x%"HWADDR_PRIx" IRQ 0x%"PRIx64,
   1361                   addr, val);
   1362        break;
   1363
   1364    /* VC syncs */
   1365    case PNV_XIVE_SYNC_IPI:
   1366    case PNV_XIVE_SYNC_HW:
   1367    case PNV_XIVE_SYNC_OS_ESC:
   1368    case PNV_XIVE_SYNC_HW_ESC:
   1369    case PNV_XIVE_SYNC_REDIS:
   1370        break;
   1371
   1372    /* PC syncs */
   1373    case PNV_XIVE_SYNC_PULL:
   1374    case PNV_XIVE_SYNC_PUSH:
   1375    case PNV_XIVE_SYNC_VPC:
   1376        break;
   1377
   1378    default:
   1379        xive_error(xive, "IC: invalid notify write @%"HWADDR_PRIx, addr);
   1380    }
   1381}
   1382
   1383static uint64_t pnv_xive_ic_notify_read(void *opaque, hwaddr addr,
   1384                                        unsigned size)
   1385{
   1386    PnvXive *xive = PNV_XIVE(opaque);
   1387
   1388    /* loads are invalid */
   1389    xive_error(xive, "IC: invalid notify read @%"HWADDR_PRIx, addr);
   1390    return -1;
   1391}
   1392
   1393static const MemoryRegionOps pnv_xive_ic_notify_ops = {
   1394    .read = pnv_xive_ic_notify_read,
   1395    .write = pnv_xive_ic_notify_write,
   1396    .endianness = DEVICE_BIG_ENDIAN,
   1397    .valid = {
   1398        .min_access_size = 8,
   1399        .max_access_size = 8,
   1400    },
   1401    .impl = {
   1402        .min_access_size = 8,
   1403        .max_access_size = 8,
   1404    },
   1405};
   1406
   1407/*
   1408 * IC - LSI MMIO handlers (not modeled)
   1409 */
   1410
   1411static void pnv_xive_ic_lsi_write(void *opaque, hwaddr addr,
   1412                              uint64_t val, unsigned size)
   1413{
   1414    PnvXive *xive = PNV_XIVE(opaque);
   1415
   1416    xive_error(xive, "IC: LSI invalid write @%"HWADDR_PRIx, addr);
   1417}
   1418
   1419static uint64_t pnv_xive_ic_lsi_read(void *opaque, hwaddr addr, unsigned size)
   1420{
   1421    PnvXive *xive = PNV_XIVE(opaque);
   1422
   1423    xive_error(xive, "IC: LSI invalid read @%"HWADDR_PRIx, addr);
   1424    return -1;
   1425}
   1426
   1427static const MemoryRegionOps pnv_xive_ic_lsi_ops = {
   1428    .read = pnv_xive_ic_lsi_read,
   1429    .write = pnv_xive_ic_lsi_write,
   1430    .endianness = DEVICE_BIG_ENDIAN,
   1431    .valid = {
   1432        .min_access_size = 8,
   1433        .max_access_size = 8,
   1434    },
   1435    .impl = {
   1436        .min_access_size = 8,
   1437        .max_access_size = 8,
   1438    },
   1439};
   1440
   1441/*
   1442 * IC - Indirect TIMA MMIO handlers
   1443 */
   1444
   1445/*
   1446 * When the TIMA is accessed from the indirect page, the thread id of
   1447 * the target CPU is configured in the PC_TCTXT_INDIR0 register before
   1448 * use. This is used for resets and for debug purpose also.
   1449 */
   1450static XiveTCTX *pnv_xive_get_indirect_tctx(PnvXive *xive)
   1451{
   1452    PnvChip *chip = xive->chip;
   1453    uint64_t tctxt_indir = xive->regs[PC_TCTXT_INDIR0 >> 3];
   1454    PowerPCCPU *cpu = NULL;
   1455    int pir;
   1456
   1457    if (!(tctxt_indir & PC_TCTXT_INDIR_VALID)) {
   1458        xive_error(xive, "IC: no indirect TIMA access in progress");
   1459        return NULL;
   1460    }
   1461
   1462    pir = (chip->chip_id << 8) | GETFIELD(PC_TCTXT_INDIR_THRDID, tctxt_indir);
   1463    cpu = pnv_chip_find_cpu(chip, pir);
   1464    if (!cpu) {
   1465        xive_error(xive, "IC: invalid PIR %x for indirect access", pir);
   1466        return NULL;
   1467    }
   1468
   1469    /* Check that HW thread is XIVE enabled */
   1470    if (!pnv_xive_is_cpu_enabled(xive, cpu)) {
   1471        xive_error(xive, "IC: CPU %x is not enabled", pir);
   1472    }
   1473
   1474    return XIVE_TCTX(pnv_cpu_state(cpu)->intc);
   1475}
   1476
   1477static void xive_tm_indirect_write(void *opaque, hwaddr offset,
   1478                                   uint64_t value, unsigned size)
   1479{
   1480    XiveTCTX *tctx = pnv_xive_get_indirect_tctx(PNV_XIVE(opaque));
   1481
   1482    xive_tctx_tm_write(XIVE_PRESENTER(opaque), tctx, offset, value, size);
   1483}
   1484
   1485static uint64_t xive_tm_indirect_read(void *opaque, hwaddr offset,
   1486                                      unsigned size)
   1487{
   1488    XiveTCTX *tctx = pnv_xive_get_indirect_tctx(PNV_XIVE(opaque));
   1489
   1490    return xive_tctx_tm_read(XIVE_PRESENTER(opaque), tctx, offset, size);
   1491}
   1492
   1493static const MemoryRegionOps xive_tm_indirect_ops = {
   1494    .read = xive_tm_indirect_read,
   1495    .write = xive_tm_indirect_write,
   1496    .endianness = DEVICE_BIG_ENDIAN,
   1497    .valid = {
   1498        .min_access_size = 1,
   1499        .max_access_size = 8,
   1500    },
   1501    .impl = {
   1502        .min_access_size = 1,
   1503        .max_access_size = 8,
   1504    },
   1505};
   1506
   1507static void pnv_xive_tm_write(void *opaque, hwaddr offset,
   1508                              uint64_t value, unsigned size)
   1509{
   1510    PowerPCCPU *cpu = POWERPC_CPU(current_cpu);
   1511    PnvXive *xive = pnv_xive_tm_get_xive(cpu);
   1512    XiveTCTX *tctx = XIVE_TCTX(pnv_cpu_state(cpu)->intc);
   1513
   1514    xive_tctx_tm_write(XIVE_PRESENTER(xive), tctx, offset, value, size);
   1515}
   1516
   1517static uint64_t pnv_xive_tm_read(void *opaque, hwaddr offset, unsigned size)
   1518{
   1519    PowerPCCPU *cpu = POWERPC_CPU(current_cpu);
   1520    PnvXive *xive = pnv_xive_tm_get_xive(cpu);
   1521    XiveTCTX *tctx = XIVE_TCTX(pnv_cpu_state(cpu)->intc);
   1522
   1523    return xive_tctx_tm_read(XIVE_PRESENTER(xive), tctx, offset, size);
   1524}
   1525
   1526const MemoryRegionOps pnv_xive_tm_ops = {
   1527    .read = pnv_xive_tm_read,
   1528    .write = pnv_xive_tm_write,
   1529    .endianness = DEVICE_BIG_ENDIAN,
   1530    .valid = {
   1531        .min_access_size = 1,
   1532        .max_access_size = 8,
   1533    },
   1534    .impl = {
   1535        .min_access_size = 1,
   1536        .max_access_size = 8,
   1537    },
   1538};
   1539
   1540/*
   1541 * Interrupt controller XSCOM region.
   1542 */
   1543static uint64_t pnv_xive_xscom_read(void *opaque, hwaddr addr, unsigned size)
   1544{
   1545    switch (addr >> 3) {
   1546    case X_VC_EQC_CONFIG:
   1547        /* FIXME (skiboot): This is the only XSCOM load. Bizarre. */
   1548        return VC_EQC_SYNC_MASK;
   1549    default:
   1550        return pnv_xive_ic_reg_read(opaque, addr, size);
   1551    }
   1552}
   1553
   1554static void pnv_xive_xscom_write(void *opaque, hwaddr addr,
   1555                                uint64_t val, unsigned size)
   1556{
   1557    pnv_xive_ic_reg_write(opaque, addr, val, size);
   1558}
   1559
   1560static const MemoryRegionOps pnv_xive_xscom_ops = {
   1561    .read = pnv_xive_xscom_read,
   1562    .write = pnv_xive_xscom_write,
   1563    .endianness = DEVICE_BIG_ENDIAN,
   1564    .valid = {
   1565        .min_access_size = 8,
   1566        .max_access_size = 8,
   1567    },
   1568    .impl = {
   1569        .min_access_size = 8,
   1570        .max_access_size = 8,
   1571    }
   1572};
   1573
   1574/*
   1575 * Virtualization Controller MMIO region containing the IPI and END ESB pages
   1576 */
   1577static uint64_t pnv_xive_vc_read(void *opaque, hwaddr offset,
   1578                                 unsigned size)
   1579{
   1580    PnvXive *xive = PNV_XIVE(opaque);
   1581    uint64_t edt_index = offset >> pnv_xive_edt_shift(xive);
   1582    uint64_t edt_type = 0;
   1583    uint64_t edt_offset;
   1584    MemTxResult result;
   1585    AddressSpace *edt_as = NULL;
   1586    uint64_t ret = -1;
   1587
   1588    if (edt_index < XIVE_TABLE_EDT_MAX) {
   1589        edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[edt_index]);
   1590    }
   1591
   1592    switch (edt_type) {
   1593    case CQ_TDR_EDT_IPI:
   1594        edt_as = &xive->ipi_as;
   1595        break;
   1596    case CQ_TDR_EDT_EQ:
   1597        edt_as = &xive->end_as;
   1598        break;
   1599    default:
   1600        xive_error(xive, "VC: invalid EDT type for read @%"HWADDR_PRIx, offset);
   1601        return -1;
   1602    }
   1603
   1604    /* Remap the offset for the targeted address space */
   1605    edt_offset = pnv_xive_edt_offset(xive, offset, edt_type);
   1606
   1607    ret = address_space_ldq(edt_as, edt_offset, MEMTXATTRS_UNSPECIFIED,
   1608                            &result);
   1609
   1610    if (result != MEMTX_OK) {
   1611        xive_error(xive, "VC: %s read failed at @0x%"HWADDR_PRIx " -> @0x%"
   1612                   HWADDR_PRIx, edt_type == CQ_TDR_EDT_IPI ? "IPI" : "END",
   1613                   offset, edt_offset);
   1614        return -1;
   1615    }
   1616
   1617    return ret;
   1618}
   1619
   1620static void pnv_xive_vc_write(void *opaque, hwaddr offset,
   1621                              uint64_t val, unsigned size)
   1622{
   1623    PnvXive *xive = PNV_XIVE(opaque);
   1624    uint64_t edt_index = offset >> pnv_xive_edt_shift(xive);
   1625    uint64_t edt_type = 0;
   1626    uint64_t edt_offset;
   1627    MemTxResult result;
   1628    AddressSpace *edt_as = NULL;
   1629
   1630    if (edt_index < XIVE_TABLE_EDT_MAX) {
   1631        edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[edt_index]);
   1632    }
   1633
   1634    switch (edt_type) {
   1635    case CQ_TDR_EDT_IPI:
   1636        edt_as = &xive->ipi_as;
   1637        break;
   1638    case CQ_TDR_EDT_EQ:
   1639        edt_as = &xive->end_as;
   1640        break;
   1641    default:
   1642        xive_error(xive, "VC: invalid EDT type for write @%"HWADDR_PRIx,
   1643                   offset);
   1644        return;
   1645    }
   1646
   1647    /* Remap the offset for the targeted address space */
   1648    edt_offset = pnv_xive_edt_offset(xive, offset, edt_type);
   1649
   1650    address_space_stq(edt_as, edt_offset, val, MEMTXATTRS_UNSPECIFIED, &result);
   1651    if (result != MEMTX_OK) {
   1652        xive_error(xive, "VC: write failed at @0x%"HWADDR_PRIx, edt_offset);
   1653    }
   1654}
   1655
   1656static const MemoryRegionOps pnv_xive_vc_ops = {
   1657    .read = pnv_xive_vc_read,
   1658    .write = pnv_xive_vc_write,
   1659    .endianness = DEVICE_BIG_ENDIAN,
   1660    .valid = {
   1661        .min_access_size = 8,
   1662        .max_access_size = 8,
   1663    },
   1664    .impl = {
   1665        .min_access_size = 8,
   1666        .max_access_size = 8,
   1667    },
   1668};
   1669
   1670/*
   1671 * Presenter Controller MMIO region. The Virtualization Controller
   1672 * updates the IPB in the NVT table when required. Not modeled.
   1673 */
   1674static uint64_t pnv_xive_pc_read(void *opaque, hwaddr addr,
   1675                                 unsigned size)
   1676{
   1677    PnvXive *xive = PNV_XIVE(opaque);
   1678
   1679    xive_error(xive, "PC: invalid read @%"HWADDR_PRIx, addr);
   1680    return -1;
   1681}
   1682
   1683static void pnv_xive_pc_write(void *opaque, hwaddr addr,
   1684                              uint64_t value, unsigned size)
   1685{
   1686    PnvXive *xive = PNV_XIVE(opaque);
   1687
   1688    xive_error(xive, "PC: invalid write to VC @%"HWADDR_PRIx, addr);
   1689}
   1690
   1691static const MemoryRegionOps pnv_xive_pc_ops = {
   1692    .read = pnv_xive_pc_read,
   1693    .write = pnv_xive_pc_write,
   1694    .endianness = DEVICE_BIG_ENDIAN,
   1695    .valid = {
   1696        .min_access_size = 8,
   1697        .max_access_size = 8,
   1698    },
   1699    .impl = {
   1700        .min_access_size = 8,
   1701        .max_access_size = 8,
   1702    },
   1703};
   1704
   1705static void xive_nvt_pic_print_info(XiveNVT *nvt, uint32_t nvt_idx,
   1706                                    Monitor *mon)
   1707{
   1708    uint8_t  eq_blk = xive_get_field32(NVT_W1_EQ_BLOCK, nvt->w1);
   1709    uint32_t eq_idx = xive_get_field32(NVT_W1_EQ_INDEX, nvt->w1);
   1710
   1711    if (!xive_nvt_is_valid(nvt)) {
   1712        return;
   1713    }
   1714
   1715    monitor_printf(mon, "  %08x end:%02x/%04x IPB:%02x\n", nvt_idx,
   1716                   eq_blk, eq_idx,
   1717                   xive_get_field32(NVT_W4_IPB, nvt->w4));
   1718}
   1719
   1720void pnv_xive_pic_print_info(PnvXive *xive, Monitor *mon)
   1721{
   1722    XiveRouter *xrtr = XIVE_ROUTER(xive);
   1723    uint8_t blk = pnv_xive_block_id(xive);
   1724    uint8_t chip_id = xive->chip->chip_id;
   1725    uint32_t srcno0 = XIVE_EAS(blk, 0);
   1726    uint32_t nr_ipis = pnv_xive_nr_ipis(xive, blk);
   1727    XiveEAS eas;
   1728    XiveEND end;
   1729    XiveNVT nvt;
   1730    int i;
   1731    uint64_t xive_nvt_per_subpage;
   1732
   1733    monitor_printf(mon, "XIVE[%x] #%d Source %08x .. %08x\n", chip_id, blk,
   1734                   srcno0, srcno0 + nr_ipis - 1);
   1735    xive_source_pic_print_info(&xive->ipi_source, srcno0, mon);
   1736
   1737    monitor_printf(mon, "XIVE[%x] #%d EAT %08x .. %08x\n", chip_id, blk,
   1738                   srcno0, srcno0 + nr_ipis - 1);
   1739    for (i = 0; i < nr_ipis; i++) {
   1740        if (xive_router_get_eas(xrtr, blk, i, &eas)) {
   1741            break;
   1742        }
   1743        if (!xive_eas_is_masked(&eas)) {
   1744            xive_eas_pic_print_info(&eas, i, mon);
   1745        }
   1746    }
   1747
   1748    monitor_printf(mon, "XIVE[%x] #%d ENDT\n", chip_id, blk);
   1749    i = 0;
   1750    while (!xive_router_get_end(xrtr, blk, i, &end)) {
   1751        xive_end_pic_print_info(&end, i++, mon);
   1752    }
   1753
   1754    monitor_printf(mon, "XIVE[%x] #%d END Escalation EAT\n", chip_id, blk);
   1755    i = 0;
   1756    while (!xive_router_get_end(xrtr, blk, i, &end)) {
   1757        xive_end_eas_pic_print_info(&end, i++, mon);
   1758    }
   1759
   1760    monitor_printf(mon, "XIVE[%x] #%d NVTT %08x .. %08x\n", chip_id, blk,
   1761                   0, XIVE_NVT_COUNT - 1);
   1762    xive_nvt_per_subpage = pnv_xive_vst_per_subpage(xive, VST_TSEL_VPDT);
   1763    for (i = 0; i < XIVE_NVT_COUNT; i += xive_nvt_per_subpage) {
   1764        while (!xive_router_get_nvt(xrtr, blk, i, &nvt)) {
   1765            xive_nvt_pic_print_info(&nvt, i++, mon);
   1766        }
   1767    }
   1768}
   1769
   1770static void pnv_xive_reset(void *dev)
   1771{
   1772    PnvXive *xive = PNV_XIVE(dev);
   1773    XiveSource *xsrc = &xive->ipi_source;
   1774    XiveENDSource *end_xsrc = &xive->end_source;
   1775
   1776    /* Default page size (Should be changed at runtime to 64k) */
   1777    xive->ic_shift = xive->vc_shift = xive->pc_shift = 12;
   1778
   1779    /* Clear subregions */
   1780    if (memory_region_is_mapped(&xsrc->esb_mmio)) {
   1781        memory_region_del_subregion(&xive->ipi_edt_mmio, &xsrc->esb_mmio);
   1782    }
   1783
   1784    if (memory_region_is_mapped(&xive->ipi_edt_mmio)) {
   1785        memory_region_del_subregion(&xive->ipi_mmio, &xive->ipi_edt_mmio);
   1786    }
   1787
   1788    if (memory_region_is_mapped(&end_xsrc->esb_mmio)) {
   1789        memory_region_del_subregion(&xive->end_edt_mmio, &end_xsrc->esb_mmio);
   1790    }
   1791
   1792    if (memory_region_is_mapped(&xive->end_edt_mmio)) {
   1793        memory_region_del_subregion(&xive->end_mmio, &xive->end_edt_mmio);
   1794    }
   1795}
   1796
   1797static void pnv_xive_init(Object *obj)
   1798{
   1799    PnvXive *xive = PNV_XIVE(obj);
   1800
   1801    object_initialize_child(obj, "ipi_source", &xive->ipi_source,
   1802                            TYPE_XIVE_SOURCE);
   1803    object_initialize_child(obj, "end_source", &xive->end_source,
   1804                            TYPE_XIVE_END_SOURCE);
   1805}
   1806
   1807/*
   1808 *  Maximum number of IRQs and ENDs supported by HW
   1809 */
   1810#define PNV_XIVE_NR_IRQS (PNV9_XIVE_VC_SIZE / (1ull << XIVE_ESB_64K_2PAGE))
   1811#define PNV_XIVE_NR_ENDS (PNV9_XIVE_VC_SIZE / (1ull << XIVE_ESB_64K_2PAGE))
   1812
   1813static void pnv_xive_realize(DeviceState *dev, Error **errp)
   1814{
   1815    PnvXive *xive = PNV_XIVE(dev);
   1816    PnvXiveClass *pxc = PNV_XIVE_GET_CLASS(dev);
   1817    XiveSource *xsrc = &xive->ipi_source;
   1818    XiveENDSource *end_xsrc = &xive->end_source;
   1819    Error *local_err = NULL;
   1820
   1821    pxc->parent_realize(dev, &local_err);
   1822    if (local_err) {
   1823        error_propagate(errp, local_err);
   1824        return;
   1825    }
   1826
   1827    assert(xive->chip);
   1828
   1829    /*
   1830     * The XiveSource and XiveENDSource objects are realized with the
   1831     * maximum allowed HW configuration. The ESB MMIO regions will be
   1832     * resized dynamically when the controller is configured by the FW
   1833     * to limit accesses to resources not provisioned.
   1834     */
   1835    object_property_set_int(OBJECT(xsrc), "nr-irqs", PNV_XIVE_NR_IRQS,
   1836                            &error_fatal);
   1837    object_property_set_link(OBJECT(xsrc), "xive", OBJECT(xive), &error_abort);
   1838    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
   1839        return;
   1840    }
   1841
   1842    object_property_set_int(OBJECT(end_xsrc), "nr-ends", PNV_XIVE_NR_ENDS,
   1843                            &error_fatal);
   1844    object_property_set_link(OBJECT(end_xsrc), "xive", OBJECT(xive),
   1845                             &error_abort);
   1846    if (!qdev_realize(DEVICE(end_xsrc), NULL, errp)) {
   1847        return;
   1848    }
   1849
   1850    /* Default page size. Generally changed at runtime to 64k */
   1851    xive->ic_shift = xive->vc_shift = xive->pc_shift = 12;
   1852
   1853    /* XSCOM region, used for initial configuration of the BARs */
   1854    memory_region_init_io(&xive->xscom_regs, OBJECT(dev), &pnv_xive_xscom_ops,
   1855                          xive, "xscom-xive", PNV9_XSCOM_XIVE_SIZE << 3);
   1856
   1857    /* Interrupt controller MMIO regions */
   1858    memory_region_init(&xive->ic_mmio, OBJECT(dev), "xive-ic",
   1859                       PNV9_XIVE_IC_SIZE);
   1860
   1861    memory_region_init_io(&xive->ic_reg_mmio, OBJECT(dev), &pnv_xive_ic_reg_ops,
   1862                          xive, "xive-ic-reg", 1 << xive->ic_shift);
   1863    memory_region_init_io(&xive->ic_notify_mmio, OBJECT(dev),
   1864                          &pnv_xive_ic_notify_ops,
   1865                          xive, "xive-ic-notify", 1 << xive->ic_shift);
   1866
   1867    /* The Pervasive LSI trigger and EOI pages (not modeled) */
   1868    memory_region_init_io(&xive->ic_lsi_mmio, OBJECT(dev), &pnv_xive_ic_lsi_ops,
   1869                          xive, "xive-ic-lsi", 2 << xive->ic_shift);
   1870
   1871    /* Thread Interrupt Management Area (Indirect) */
   1872    memory_region_init_io(&xive->tm_indirect_mmio, OBJECT(dev),
   1873                          &xive_tm_indirect_ops,
   1874                          xive, "xive-tima-indirect", PNV9_XIVE_TM_SIZE);
   1875    /*
   1876     * Overall Virtualization Controller MMIO region containing the
   1877     * IPI ESB pages and END ESB pages. The layout is defined by the
   1878     * EDT "Domain table" and the accesses are dispatched using
   1879     * address spaces for each.
   1880     */
   1881    memory_region_init_io(&xive->vc_mmio, OBJECT(xive), &pnv_xive_vc_ops, xive,
   1882                          "xive-vc", PNV9_XIVE_VC_SIZE);
   1883
   1884    memory_region_init(&xive->ipi_mmio, OBJECT(xive), "xive-vc-ipi",
   1885                       PNV9_XIVE_VC_SIZE);
   1886    address_space_init(&xive->ipi_as, &xive->ipi_mmio, "xive-vc-ipi");
   1887    memory_region_init(&xive->end_mmio, OBJECT(xive), "xive-vc-end",
   1888                       PNV9_XIVE_VC_SIZE);
   1889    address_space_init(&xive->end_as, &xive->end_mmio, "xive-vc-end");
   1890
   1891    /*
   1892     * The MMIO windows exposing the IPI ESBs and the END ESBs in the
   1893     * VC region. Their size is configured by the FW in the EDT table.
   1894     */
   1895    memory_region_init(&xive->ipi_edt_mmio, OBJECT(xive), "xive-vc-ipi-edt", 0);
   1896    memory_region_init(&xive->end_edt_mmio, OBJECT(xive), "xive-vc-end-edt", 0);
   1897
   1898    /* Presenter Controller MMIO region (not modeled) */
   1899    memory_region_init_io(&xive->pc_mmio, OBJECT(xive), &pnv_xive_pc_ops, xive,
   1900                          "xive-pc", PNV9_XIVE_PC_SIZE);
   1901
   1902    /* Thread Interrupt Management Area (Direct) */
   1903    memory_region_init_io(&xive->tm_mmio, OBJECT(xive), &pnv_xive_tm_ops,
   1904                          xive, "xive-tima", PNV9_XIVE_TM_SIZE);
   1905
   1906    qemu_register_reset(pnv_xive_reset, dev);
   1907}
   1908
   1909static int pnv_xive_dt_xscom(PnvXScomInterface *dev, void *fdt,
   1910                             int xscom_offset)
   1911{
   1912    const char compat[] = "ibm,power9-xive-x";
   1913    char *name;
   1914    int offset;
   1915    uint32_t lpc_pcba = PNV9_XSCOM_XIVE_BASE;
   1916    uint32_t reg[] = {
   1917        cpu_to_be32(lpc_pcba),
   1918        cpu_to_be32(PNV9_XSCOM_XIVE_SIZE)
   1919    };
   1920
   1921    name = g_strdup_printf("xive@%x", lpc_pcba);
   1922    offset = fdt_add_subnode(fdt, xscom_offset, name);
   1923    _FDT(offset);
   1924    g_free(name);
   1925
   1926    _FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg))));
   1927    _FDT((fdt_setprop(fdt, offset, "compatible", compat,
   1928                      sizeof(compat))));
   1929    return 0;
   1930}
   1931
   1932static Property pnv_xive_properties[] = {
   1933    DEFINE_PROP_UINT64("ic-bar", PnvXive, ic_base, 0),
   1934    DEFINE_PROP_UINT64("vc-bar", PnvXive, vc_base, 0),
   1935    DEFINE_PROP_UINT64("pc-bar", PnvXive, pc_base, 0),
   1936    DEFINE_PROP_UINT64("tm-bar", PnvXive, tm_base, 0),
   1937    /* The PnvChip id identifies the XIVE interrupt controller. */
   1938    DEFINE_PROP_LINK("chip", PnvXive, chip, TYPE_PNV_CHIP, PnvChip *),
   1939    DEFINE_PROP_END_OF_LIST(),
   1940};
   1941
   1942static void pnv_xive_class_init(ObjectClass *klass, void *data)
   1943{
   1944    DeviceClass *dc = DEVICE_CLASS(klass);
   1945    PnvXScomInterfaceClass *xdc = PNV_XSCOM_INTERFACE_CLASS(klass);
   1946    XiveRouterClass *xrc = XIVE_ROUTER_CLASS(klass);
   1947    XiveNotifierClass *xnc = XIVE_NOTIFIER_CLASS(klass);
   1948    XivePresenterClass *xpc = XIVE_PRESENTER_CLASS(klass);
   1949    PnvXiveClass *pxc = PNV_XIVE_CLASS(klass);
   1950
   1951    xdc->dt_xscom = pnv_xive_dt_xscom;
   1952
   1953    dc->desc = "PowerNV XIVE Interrupt Controller";
   1954    device_class_set_parent_realize(dc, pnv_xive_realize, &pxc->parent_realize);
   1955    dc->realize = pnv_xive_realize;
   1956    device_class_set_props(dc, pnv_xive_properties);
   1957
   1958    xrc->get_eas = pnv_xive_get_eas;
   1959    xrc->get_end = pnv_xive_get_end;
   1960    xrc->write_end = pnv_xive_write_end;
   1961    xrc->get_nvt = pnv_xive_get_nvt;
   1962    xrc->write_nvt = pnv_xive_write_nvt;
   1963    xrc->get_block_id = pnv_xive_get_block_id;
   1964
   1965    xnc->notify = pnv_xive_notify;
   1966    xpc->match_nvt  = pnv_xive_match_nvt;
   1967};
   1968
   1969static const TypeInfo pnv_xive_info = {
   1970    .name          = TYPE_PNV_XIVE,
   1971    .parent        = TYPE_XIVE_ROUTER,
   1972    .instance_init = pnv_xive_init,
   1973    .instance_size = sizeof(PnvXive),
   1974    .class_init    = pnv_xive_class_init,
   1975    .class_size    = sizeof(PnvXiveClass),
   1976    .interfaces    = (InterfaceInfo[]) {
   1977        { TYPE_PNV_XSCOM_INTERFACE },
   1978        { }
   1979    }
   1980};
   1981
   1982static void pnv_xive_register_types(void)
   1983{
   1984    type_register_static(&pnv_xive_info);
   1985}
   1986
   1987type_init(pnv_xive_register_types)