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_phb4.c (43702B)


      1/*
      2 * QEMU PowerPC PowerNV (POWER9) PHB4 model
      3 *
      4 * Copyright (c) 2018-2020, 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#include "qemu/osdep.h"
     10#include "qemu/log.h"
     11#include "qapi/visitor.h"
     12#include "qapi/error.h"
     13#include "qemu-common.h"
     14#include "monitor/monitor.h"
     15#include "target/ppc/cpu.h"
     16#include "hw/pci-host/pnv_phb4_regs.h"
     17#include "hw/pci-host/pnv_phb4.h"
     18#include "hw/pci/pcie_host.h"
     19#include "hw/pci/pcie_port.h"
     20#include "hw/ppc/pnv.h"
     21#include "hw/ppc/pnv_xscom.h"
     22#include "hw/irq.h"
     23#include "hw/qdev-properties.h"
     24#include "qom/object.h"
     25#include "trace.h"
     26
     27#define phb_error(phb, fmt, ...)                                        \
     28    qemu_log_mask(LOG_GUEST_ERROR, "phb4[%d:%d]: " fmt "\n",            \
     29                  (phb)->chip_id, (phb)->phb_id, ## __VA_ARGS__)
     30
     31/*
     32 * QEMU version of the GETFIELD/SETFIELD macros
     33 *
     34 * These are common with the PnvXive model.
     35 */
     36static inline uint64_t GETFIELD(uint64_t mask, uint64_t word)
     37{
     38    return (word & mask) >> ctz64(mask);
     39}
     40
     41static inline uint64_t SETFIELD(uint64_t mask, uint64_t word,
     42                                uint64_t value)
     43{
     44    return (word & ~mask) | ((value << ctz64(mask)) & mask);
     45}
     46
     47static PCIDevice *pnv_phb4_find_cfg_dev(PnvPHB4 *phb)
     48{
     49    PCIHostState *pci = PCI_HOST_BRIDGE(phb);
     50    uint64_t addr = phb->regs[PHB_CONFIG_ADDRESS >> 3];
     51    uint8_t bus, devfn;
     52
     53    if (!(addr >> 63)) {
     54        return NULL;
     55    }
     56    bus = (addr >> 52) & 0xff;
     57    devfn = (addr >> 44) & 0xff;
     58
     59    /* We don't access the root complex this way */
     60    if (bus == 0 && devfn == 0) {
     61        return NULL;
     62    }
     63    return pci_find_device(pci->bus, bus, devfn);
     64}
     65
     66/*
     67 * The CONFIG_DATA register expects little endian accesses, but as the
     68 * region is big endian, we have to swap the value.
     69 */
     70static void pnv_phb4_config_write(PnvPHB4 *phb, unsigned off,
     71                                  unsigned size, uint64_t val)
     72{
     73    uint32_t cfg_addr, limit;
     74    PCIDevice *pdev;
     75
     76    pdev = pnv_phb4_find_cfg_dev(phb);
     77    if (!pdev) {
     78        return;
     79    }
     80    cfg_addr = (phb->regs[PHB_CONFIG_ADDRESS >> 3] >> 32) & 0xffc;
     81    cfg_addr |= off;
     82    limit = pci_config_size(pdev);
     83    if (limit <= cfg_addr) {
     84        /*
     85         * conventional pci device can be behind pcie-to-pci bridge.
     86         * 256 <= addr < 4K has no effects.
     87         */
     88        return;
     89    }
     90    switch (size) {
     91    case 1:
     92        break;
     93    case 2:
     94        val = bswap16(val);
     95        break;
     96    case 4:
     97        val = bswap32(val);
     98        break;
     99    default:
    100        g_assert_not_reached();
    101    }
    102    pci_host_config_write_common(pdev, cfg_addr, limit, val, size);
    103}
    104
    105static uint64_t pnv_phb4_config_read(PnvPHB4 *phb, unsigned off,
    106                                     unsigned size)
    107{
    108    uint32_t cfg_addr, limit;
    109    PCIDevice *pdev;
    110    uint64_t val;
    111
    112    pdev = pnv_phb4_find_cfg_dev(phb);
    113    if (!pdev) {
    114        return ~0ull;
    115    }
    116    cfg_addr = (phb->regs[PHB_CONFIG_ADDRESS >> 3] >> 32) & 0xffc;
    117    cfg_addr |= off;
    118    limit = pci_config_size(pdev);
    119    if (limit <= cfg_addr) {
    120        /*
    121         * conventional pci device can be behind pcie-to-pci bridge.
    122         * 256 <= addr < 4K has no effects.
    123         */
    124        return ~0ull;
    125    }
    126    val = pci_host_config_read_common(pdev, cfg_addr, limit, size);
    127    switch (size) {
    128    case 1:
    129        return val;
    130    case 2:
    131        return bswap16(val);
    132    case 4:
    133        return bswap32(val);
    134    default:
    135        g_assert_not_reached();
    136    }
    137}
    138
    139/*
    140 * Root complex register accesses are memory mapped.
    141 */
    142static void pnv_phb4_rc_config_write(PnvPHB4 *phb, unsigned off,
    143                                     unsigned size, uint64_t val)
    144{
    145    PCIHostState *pci = PCI_HOST_BRIDGE(phb);
    146    PCIDevice *pdev;
    147
    148    if (size != 4) {
    149        phb_error(phb, "rc_config_write invalid size %d\n", size);
    150        return;
    151    }
    152
    153    pdev = pci_find_device(pci->bus, 0, 0);
    154    assert(pdev);
    155
    156    pci_host_config_write_common(pdev, off, PHB_RC_CONFIG_SIZE,
    157                                 bswap32(val), 4);
    158}
    159
    160static uint64_t pnv_phb4_rc_config_read(PnvPHB4 *phb, unsigned off,
    161                                        unsigned size)
    162{
    163    PCIHostState *pci = PCI_HOST_BRIDGE(phb);
    164    PCIDevice *pdev;
    165    uint64_t val;
    166
    167    if (size != 4) {
    168        phb_error(phb, "rc_config_read invalid size %d\n", size);
    169        return ~0ull;
    170    }
    171
    172    pdev = pci_find_device(pci->bus, 0, 0);
    173    assert(pdev);
    174
    175    val = pci_host_config_read_common(pdev, off, PHB_RC_CONFIG_SIZE, 4);
    176    return bswap32(val);
    177}
    178
    179static void pnv_phb4_check_mbt(PnvPHB4 *phb, uint32_t index)
    180{
    181    uint64_t base, start, size, mbe0, mbe1;
    182    MemoryRegion *parent;
    183    char name[64];
    184
    185    /* Unmap first */
    186    if (memory_region_is_mapped(&phb->mr_mmio[index])) {
    187        /* Should we destroy it in RCU friendly way... ? */
    188        memory_region_del_subregion(phb->mr_mmio[index].container,
    189                                    &phb->mr_mmio[index]);
    190    }
    191
    192    /* Get table entry */
    193    mbe0 = phb->ioda_MBT[(index << 1)];
    194    mbe1 = phb->ioda_MBT[(index << 1) + 1];
    195
    196    if (!(mbe0 & IODA3_MBT0_ENABLE)) {
    197        return;
    198    }
    199
    200    /* Grab geometry from registers */
    201    base = GETFIELD(IODA3_MBT0_BASE_ADDR, mbe0) << 12;
    202    size = GETFIELD(IODA3_MBT1_MASK, mbe1) << 12;
    203    size |= 0xff00000000000000ull;
    204    size = ~size + 1;
    205
    206    /* Calculate PCI side start address based on M32/M64 window type */
    207    if (mbe0 & IODA3_MBT0_TYPE_M32) {
    208        start = phb->regs[PHB_M32_START_ADDR >> 3];
    209        if ((start + size) > 0x100000000ull) {
    210            phb_error(phb, "M32 set beyond 4GB boundary !");
    211            size = 0x100000000 - start;
    212        }
    213    } else {
    214        start = base | (phb->regs[PHB_M64_UPPER_BITS >> 3]);
    215    }
    216
    217    /* TODO: Figure out how to implemet/decode AOMASK */
    218
    219    /* Check if it matches an enabled MMIO region in the PEC stack */
    220    if (memory_region_is_mapped(&phb->stack->mmbar0) &&
    221        base >= phb->stack->mmio0_base &&
    222        (base + size) <= (phb->stack->mmio0_base + phb->stack->mmio0_size)) {
    223        parent = &phb->stack->mmbar0;
    224        base -= phb->stack->mmio0_base;
    225    } else if (memory_region_is_mapped(&phb->stack->mmbar1) &&
    226        base >= phb->stack->mmio1_base &&
    227        (base + size) <= (phb->stack->mmio1_base + phb->stack->mmio1_size)) {
    228        parent = &phb->stack->mmbar1;
    229        base -= phb->stack->mmio1_base;
    230    } else {
    231        phb_error(phb, "PHB MBAR %d out of parent bounds", index);
    232        return;
    233    }
    234
    235    /* Create alias (better name ?) */
    236    snprintf(name, sizeof(name), "phb4-mbar%d", index);
    237    memory_region_init_alias(&phb->mr_mmio[index], OBJECT(phb), name,
    238                             &phb->pci_mmio, start, size);
    239    memory_region_add_subregion(parent, base, &phb->mr_mmio[index]);
    240}
    241
    242static void pnv_phb4_check_all_mbt(PnvPHB4 *phb)
    243{
    244    uint64_t i;
    245    uint32_t num_windows = phb->big_phb ? PNV_PHB4_MAX_MMIO_WINDOWS :
    246        PNV_PHB4_MIN_MMIO_WINDOWS;
    247
    248    for (i = 0; i < num_windows; i++) {
    249        pnv_phb4_check_mbt(phb, i);
    250    }
    251}
    252
    253static uint64_t *pnv_phb4_ioda_access(PnvPHB4 *phb,
    254                                      unsigned *out_table, unsigned *out_idx)
    255{
    256    uint64_t adreg = phb->regs[PHB_IODA_ADDR >> 3];
    257    unsigned int index = GETFIELD(PHB_IODA_AD_TADR, adreg);
    258    unsigned int table = GETFIELD(PHB_IODA_AD_TSEL, adreg);
    259    unsigned int mask;
    260    uint64_t *tptr = NULL;
    261
    262    switch (table) {
    263    case IODA3_TBL_LIST:
    264        tptr = phb->ioda_LIST;
    265        mask = 7;
    266        break;
    267    case IODA3_TBL_MIST:
    268        tptr = phb->ioda_MIST;
    269        mask = phb->big_phb ? PNV_PHB4_MAX_MIST : (PNV_PHB4_MAX_MIST >> 1);
    270        mask -= 1;
    271        break;
    272    case IODA3_TBL_RCAM:
    273        mask = phb->big_phb ? 127 : 63;
    274        break;
    275    case IODA3_TBL_MRT:
    276        mask = phb->big_phb ? 15 : 7;
    277        break;
    278    case IODA3_TBL_PESTA:
    279    case IODA3_TBL_PESTB:
    280        mask = phb->big_phb ? PNV_PHB4_MAX_PEs : (PNV_PHB4_MAX_PEs >> 1);
    281        mask -= 1;
    282        break;
    283    case IODA3_TBL_TVT:
    284        tptr = phb->ioda_TVT;
    285        mask = phb->big_phb ? PNV_PHB4_MAX_TVEs : (PNV_PHB4_MAX_TVEs >> 1);
    286        mask -= 1;
    287        break;
    288    case IODA3_TBL_TCR:
    289    case IODA3_TBL_TDR:
    290        mask = phb->big_phb ? 1023 : 511;
    291        break;
    292    case IODA3_TBL_MBT:
    293        tptr = phb->ioda_MBT;
    294        mask = phb->big_phb ? PNV_PHB4_MAX_MBEs : (PNV_PHB4_MAX_MBEs >> 1);
    295        mask -= 1;
    296        break;
    297    case IODA3_TBL_MDT:
    298        tptr = phb->ioda_MDT;
    299        mask = phb->big_phb ? PNV_PHB4_MAX_PEs : (PNV_PHB4_MAX_PEs >> 1);
    300        mask -= 1;
    301        break;
    302    case IODA3_TBL_PEEV:
    303        tptr = phb->ioda_PEEV;
    304        mask = phb->big_phb ? PNV_PHB4_MAX_PEEVs : (PNV_PHB4_MAX_PEEVs >> 1);
    305        mask -= 1;
    306        break;
    307    default:
    308        phb_error(phb, "invalid IODA table %d", table);
    309        return NULL;
    310    }
    311    index &= mask;
    312    if (out_idx) {
    313        *out_idx = index;
    314    }
    315    if (out_table) {
    316        *out_table = table;
    317    }
    318    if (tptr) {
    319        tptr += index;
    320    }
    321    if (adreg & PHB_IODA_AD_AUTOINC) {
    322        index = (index + 1) & mask;
    323        adreg = SETFIELD(PHB_IODA_AD_TADR, adreg, index);
    324    }
    325
    326    phb->regs[PHB_IODA_ADDR >> 3] = adreg;
    327    return tptr;
    328}
    329
    330static uint64_t pnv_phb4_ioda_read(PnvPHB4 *phb)
    331{
    332    unsigned table, idx;
    333    uint64_t *tptr;
    334
    335    tptr = pnv_phb4_ioda_access(phb, &table, &idx);
    336    if (!tptr) {
    337        /* Special PESTA case */
    338        if (table == IODA3_TBL_PESTA) {
    339            return ((uint64_t)(phb->ioda_PEST_AB[idx] & 1)) << 63;
    340        } else if (table == IODA3_TBL_PESTB) {
    341            return ((uint64_t)(phb->ioda_PEST_AB[idx] & 2)) << 62;
    342        }
    343        /* Return 0 on unsupported tables, not ff's */
    344        return 0;
    345    }
    346    return *tptr;
    347}
    348
    349static void pnv_phb4_ioda_write(PnvPHB4 *phb, uint64_t val)
    350{
    351    unsigned table, idx;
    352    uint64_t *tptr;
    353
    354    tptr = pnv_phb4_ioda_access(phb, &table, &idx);
    355    if (!tptr) {
    356        /* Special PESTA case */
    357        if (table == IODA3_TBL_PESTA) {
    358            phb->ioda_PEST_AB[idx] &= ~1;
    359            phb->ioda_PEST_AB[idx] |= (val >> 63) & 1;
    360        } else if (table == IODA3_TBL_PESTB) {
    361            phb->ioda_PEST_AB[idx] &= ~2;
    362            phb->ioda_PEST_AB[idx] |= (val >> 62) & 2;
    363        }
    364        return;
    365    }
    366
    367    /* Handle side effects */
    368    switch (table) {
    369    case IODA3_TBL_LIST:
    370        break;
    371    case IODA3_TBL_MIST: {
    372        /* Special mask for MIST partial write */
    373        uint64_t adreg = phb->regs[PHB_IODA_ADDR >> 3];
    374        uint32_t mmask = GETFIELD(PHB_IODA_AD_MIST_PWV, adreg);
    375        uint64_t v = *tptr;
    376        if (mmask == 0) {
    377            mmask = 0xf;
    378        }
    379        if (mmask & 8) {
    380            v &= 0x0000ffffffffffffull;
    381            v |= 0xcfff000000000000ull & val;
    382        }
    383        if (mmask & 4) {
    384            v &= 0xffff0000ffffffffull;
    385            v |= 0x0000cfff00000000ull & val;
    386        }
    387        if (mmask & 2) {
    388            v &= 0xffffffff0000ffffull;
    389            v |= 0x00000000cfff0000ull & val;
    390        }
    391        if (mmask & 1) {
    392            v &= 0xffffffffffff0000ull;
    393            v |= 0x000000000000cfffull & val;
    394        }
    395        *tptr = v;
    396        break;
    397    }
    398    case IODA3_TBL_MBT:
    399        *tptr = val;
    400
    401        /* Copy accross the valid bit to the other half */
    402        phb->ioda_MBT[idx ^ 1] &= 0x7fffffffffffffffull;
    403        phb->ioda_MBT[idx ^ 1] |= 0x8000000000000000ull & val;
    404
    405        /* Update mappings */
    406        pnv_phb4_check_mbt(phb, idx >> 1);
    407        break;
    408    default:
    409        *tptr = val;
    410    }
    411}
    412
    413static void pnv_phb4_rtc_invalidate(PnvPHB4 *phb, uint64_t val)
    414{
    415    PnvPhb4DMASpace *ds;
    416
    417    /* Always invalidate all for now ... */
    418    QLIST_FOREACH(ds, &phb->dma_spaces, list) {
    419        ds->pe_num = PHB_INVALID_PE;
    420    }
    421}
    422
    423static void pnv_phb4_update_msi_regions(PnvPhb4DMASpace *ds)
    424{
    425    uint64_t cfg = ds->phb->regs[PHB_PHB4_CONFIG >> 3];
    426
    427    if (cfg & PHB_PHB4C_32BIT_MSI_EN) {
    428        if (!memory_region_is_mapped(MEMORY_REGION(&ds->msi32_mr))) {
    429            memory_region_add_subregion(MEMORY_REGION(&ds->dma_mr),
    430                                        0xffff0000, &ds->msi32_mr);
    431        }
    432    } else {
    433        if (memory_region_is_mapped(MEMORY_REGION(&ds->msi32_mr))) {
    434            memory_region_del_subregion(MEMORY_REGION(&ds->dma_mr),
    435                                        &ds->msi32_mr);
    436        }
    437    }
    438
    439    if (cfg & PHB_PHB4C_64BIT_MSI_EN) {
    440        if (!memory_region_is_mapped(MEMORY_REGION(&ds->msi64_mr))) {
    441            memory_region_add_subregion(MEMORY_REGION(&ds->dma_mr),
    442                                        (1ull << 60), &ds->msi64_mr);
    443        }
    444    } else {
    445        if (memory_region_is_mapped(MEMORY_REGION(&ds->msi64_mr))) {
    446            memory_region_del_subregion(MEMORY_REGION(&ds->dma_mr),
    447                                        &ds->msi64_mr);
    448        }
    449    }
    450}
    451
    452static void pnv_phb4_update_all_msi_regions(PnvPHB4 *phb)
    453{
    454    PnvPhb4DMASpace *ds;
    455
    456    QLIST_FOREACH(ds, &phb->dma_spaces, list) {
    457        pnv_phb4_update_msi_regions(ds);
    458    }
    459}
    460
    461static void pnv_phb4_update_xsrc(PnvPHB4 *phb)
    462{
    463    int shift, flags, i, lsi_base;
    464    XiveSource *xsrc = &phb->xsrc;
    465
    466    /* The XIVE source characteristics can be set at run time */
    467    if (phb->regs[PHB_CTRLR >> 3] & PHB_CTRLR_IRQ_PGSZ_64K) {
    468        shift = XIVE_ESB_64K;
    469    } else {
    470        shift = XIVE_ESB_4K;
    471    }
    472    if (phb->regs[PHB_CTRLR >> 3] & PHB_CTRLR_IRQ_STORE_EOI) {
    473        flags = XIVE_SRC_STORE_EOI;
    474    } else {
    475        flags = 0;
    476    }
    477
    478    phb->xsrc.esb_shift = shift;
    479    phb->xsrc.esb_flags = flags;
    480
    481    lsi_base = GETFIELD(PHB_LSI_SRC_ID, phb->regs[PHB_LSI_SOURCE_ID >> 3]);
    482    lsi_base <<= 3;
    483
    484    /* TODO: handle reset values of PHB_LSI_SRC_ID */
    485    if (!lsi_base) {
    486        return;
    487    }
    488
    489    /* TODO: need a xive_source_irq_reset_lsi() */
    490    bitmap_zero(xsrc->lsi_map, xsrc->nr_irqs);
    491
    492    for (i = 0; i < xsrc->nr_irqs; i++) {
    493        bool msi = (i < lsi_base || i >= (lsi_base + 8));
    494        if (!msi) {
    495            xive_source_irq_set_lsi(xsrc, i);
    496        }
    497    }
    498}
    499
    500static void pnv_phb4_reg_write(void *opaque, hwaddr off, uint64_t val,
    501                               unsigned size)
    502{
    503    PnvPHB4 *phb = PNV_PHB4(opaque);
    504    bool changed;
    505
    506    /* Special case outbound configuration data */
    507    if ((off & 0xfffc) == PHB_CONFIG_DATA) {
    508        pnv_phb4_config_write(phb, off & 0x3, size, val);
    509        return;
    510    }
    511
    512    /* Special case RC configuration space */
    513    if ((off & 0xf800) == PHB_RC_CONFIG_BASE) {
    514        pnv_phb4_rc_config_write(phb, off & 0x7ff, size, val);
    515        return;
    516    }
    517
    518    /* Other registers are 64-bit only */
    519    if (size != 8 || off & 0x7) {
    520        phb_error(phb, "Invalid register access, offset: 0x%"PRIx64" size: %d",
    521                   off, size);
    522        return;
    523    }
    524
    525    /* Handle masking */
    526    switch (off) {
    527    case PHB_LSI_SOURCE_ID:
    528        val &= PHB_LSI_SRC_ID;
    529        break;
    530    case PHB_M64_UPPER_BITS:
    531        val &= 0xff00000000000000ull;
    532        break;
    533    /* TCE Kill */
    534    case PHB_TCE_KILL:
    535        /* Clear top 3 bits which HW does to indicate successful queuing */
    536        val &= ~(PHB_TCE_KILL_ALL | PHB_TCE_KILL_PE | PHB_TCE_KILL_ONE);
    537        break;
    538    case PHB_Q_DMA_R:
    539        /*
    540         * This is enough logic to make SW happy but we aren't
    541         * actually quiescing the DMAs
    542         */
    543        if (val & PHB_Q_DMA_R_AUTORESET) {
    544            val = 0;
    545        } else {
    546            val &= PHB_Q_DMA_R_QUIESCE_DMA;
    547        }
    548        break;
    549    /* LEM stuff */
    550    case PHB_LEM_FIR_AND_MASK:
    551        phb->regs[PHB_LEM_FIR_ACCUM >> 3] &= val;
    552        return;
    553    case PHB_LEM_FIR_OR_MASK:
    554        phb->regs[PHB_LEM_FIR_ACCUM >> 3] |= val;
    555        return;
    556    case PHB_LEM_ERROR_AND_MASK:
    557        phb->regs[PHB_LEM_ERROR_MASK >> 3] &= val;
    558        return;
    559    case PHB_LEM_ERROR_OR_MASK:
    560        phb->regs[PHB_LEM_ERROR_MASK >> 3] |= val;
    561        return;
    562    case PHB_LEM_WOF:
    563        val = 0;
    564        break;
    565    /* TODO: More regs ..., maybe create a table with masks... */
    566
    567    /* Read only registers */
    568    case PHB_CPU_LOADSTORE_STATUS:
    569    case PHB_ETU_ERR_SUMMARY:
    570    case PHB_PHB4_GEN_CAP:
    571    case PHB_PHB4_TCE_CAP:
    572    case PHB_PHB4_IRQ_CAP:
    573    case PHB_PHB4_EEH_CAP:
    574        return;
    575    }
    576
    577    /* Record whether it changed */
    578    changed = phb->regs[off >> 3] != val;
    579
    580    /* Store in register cache first */
    581    phb->regs[off >> 3] = val;
    582
    583    /* Handle side effects */
    584    switch (off) {
    585    case PHB_PHB4_CONFIG:
    586        if (changed) {
    587            pnv_phb4_update_all_msi_regions(phb);
    588        }
    589        break;
    590    case PHB_M32_START_ADDR:
    591    case PHB_M64_UPPER_BITS:
    592        if (changed) {
    593            pnv_phb4_check_all_mbt(phb);
    594        }
    595        break;
    596
    597    /* IODA table accesses */
    598    case PHB_IODA_DATA0:
    599        pnv_phb4_ioda_write(phb, val);
    600        break;
    601
    602    /* RTC invalidation */
    603    case PHB_RTC_INVALIDATE:
    604        pnv_phb4_rtc_invalidate(phb, val);
    605        break;
    606
    607    /* PHB Control (Affects XIVE source) */
    608    case PHB_CTRLR:
    609    case PHB_LSI_SOURCE_ID:
    610        pnv_phb4_update_xsrc(phb);
    611        break;
    612
    613    /* Silent simple writes */
    614    case PHB_ASN_CMPM:
    615    case PHB_CONFIG_ADDRESS:
    616    case PHB_IODA_ADDR:
    617    case PHB_TCE_KILL:
    618    case PHB_TCE_SPEC_CTL:
    619    case PHB_PEST_BAR:
    620    case PHB_PELTV_BAR:
    621    case PHB_RTT_BAR:
    622    case PHB_LEM_FIR_ACCUM:
    623    case PHB_LEM_ERROR_MASK:
    624    case PHB_LEM_ACTION0:
    625    case PHB_LEM_ACTION1:
    626    case PHB_TCE_TAG_ENABLE:
    627    case PHB_INT_NOTIFY_ADDR:
    628    case PHB_INT_NOTIFY_INDEX:
    629    case PHB_DMARD_SYNC:
    630       break;
    631
    632    /* Noise on anything else */
    633    default:
    634        qemu_log_mask(LOG_UNIMP, "phb4: reg_write 0x%"PRIx64"=%"PRIx64"\n",
    635                      off, val);
    636    }
    637}
    638
    639static uint64_t pnv_phb4_reg_read(void *opaque, hwaddr off, unsigned size)
    640{
    641    PnvPHB4 *phb = PNV_PHB4(opaque);
    642    uint64_t val;
    643
    644    if ((off & 0xfffc) == PHB_CONFIG_DATA) {
    645        return pnv_phb4_config_read(phb, off & 0x3, size);
    646    }
    647
    648    /* Special case RC configuration space */
    649    if ((off & 0xf800) == PHB_RC_CONFIG_BASE) {
    650        return pnv_phb4_rc_config_read(phb, off & 0x7ff, size);
    651    }
    652
    653    /* Other registers are 64-bit only */
    654    if (size != 8 || off & 0x7) {
    655        phb_error(phb, "Invalid register access, offset: 0x%"PRIx64" size: %d",
    656                   off, size);
    657        return ~0ull;
    658    }
    659
    660    /* Default read from cache */
    661    val = phb->regs[off >> 3];
    662
    663    switch (off) {
    664    case PHB_VERSION:
    665        return phb->version;
    666
    667        /* Read-only */
    668    case PHB_PHB4_GEN_CAP:
    669        return 0xe4b8000000000000ull;
    670    case PHB_PHB4_TCE_CAP:
    671        return phb->big_phb ? 0x4008440000000400ull : 0x2008440000000200ull;
    672    case PHB_PHB4_IRQ_CAP:
    673        return phb->big_phb ? 0x0800000000001000ull : 0x0800000000000800ull;
    674    case PHB_PHB4_EEH_CAP:
    675        return phb->big_phb ? 0x2000000000000000ull : 0x1000000000000000ull;
    676
    677    /* IODA table accesses */
    678    case PHB_IODA_DATA0:
    679        return pnv_phb4_ioda_read(phb);
    680
    681    /* Link training always appears trained */
    682    case PHB_PCIE_DLP_TRAIN_CTL:
    683        /* TODO: Do something sensible with speed ? */
    684        return PHB_PCIE_DLP_INBAND_PRESENCE | PHB_PCIE_DLP_TL_LINKACT;
    685
    686    /* DMA read sync: make it look like it's complete */
    687    case PHB_DMARD_SYNC:
    688        return PHB_DMARD_SYNC_COMPLETE;
    689
    690    /* Silent simple reads */
    691    case PHB_LSI_SOURCE_ID:
    692    case PHB_CPU_LOADSTORE_STATUS:
    693    case PHB_ASN_CMPM:
    694    case PHB_PHB4_CONFIG:
    695    case PHB_M32_START_ADDR:
    696    case PHB_CONFIG_ADDRESS:
    697    case PHB_IODA_ADDR:
    698    case PHB_RTC_INVALIDATE:
    699    case PHB_TCE_KILL:
    700    case PHB_TCE_SPEC_CTL:
    701    case PHB_PEST_BAR:
    702    case PHB_PELTV_BAR:
    703    case PHB_RTT_BAR:
    704    case PHB_M64_UPPER_BITS:
    705    case PHB_CTRLR:
    706    case PHB_LEM_FIR_ACCUM:
    707    case PHB_LEM_ERROR_MASK:
    708    case PHB_LEM_ACTION0:
    709    case PHB_LEM_ACTION1:
    710    case PHB_TCE_TAG_ENABLE:
    711    case PHB_INT_NOTIFY_ADDR:
    712    case PHB_INT_NOTIFY_INDEX:
    713    case PHB_Q_DMA_R:
    714    case PHB_ETU_ERR_SUMMARY:
    715        break;
    716
    717    /* Noise on anything else */
    718    default:
    719        qemu_log_mask(LOG_UNIMP, "phb4: reg_read 0x%"PRIx64"=%"PRIx64"\n",
    720                      off, val);
    721    }
    722    return val;
    723}
    724
    725static const MemoryRegionOps pnv_phb4_reg_ops = {
    726    .read = pnv_phb4_reg_read,
    727    .write = pnv_phb4_reg_write,
    728    .valid.min_access_size = 1,
    729    .valid.max_access_size = 8,
    730    .impl.min_access_size = 1,
    731    .impl.max_access_size = 8,
    732    .endianness = DEVICE_BIG_ENDIAN,
    733};
    734
    735static uint64_t pnv_phb4_xscom_read(void *opaque, hwaddr addr, unsigned size)
    736{
    737    PnvPHB4 *phb = PNV_PHB4(opaque);
    738    uint32_t reg = addr >> 3;
    739    uint64_t val;
    740    hwaddr offset;
    741
    742    switch (reg) {
    743    case PHB_SCOM_HV_IND_ADDR:
    744        return phb->scom_hv_ind_addr_reg;
    745
    746    case PHB_SCOM_HV_IND_DATA:
    747        if (!(phb->scom_hv_ind_addr_reg & PHB_SCOM_HV_IND_ADDR_VALID)) {
    748            phb_error(phb, "Invalid indirect address");
    749            return ~0ull;
    750        }
    751        size = (phb->scom_hv_ind_addr_reg & PHB_SCOM_HV_IND_ADDR_4B) ? 4 : 8;
    752        offset = GETFIELD(PHB_SCOM_HV_IND_ADDR_ADDR, phb->scom_hv_ind_addr_reg);
    753        val = pnv_phb4_reg_read(phb, offset, size);
    754        if (phb->scom_hv_ind_addr_reg & PHB_SCOM_HV_IND_ADDR_AUTOINC) {
    755            offset += size;
    756            offset &= 0x3fff;
    757            phb->scom_hv_ind_addr_reg = SETFIELD(PHB_SCOM_HV_IND_ADDR_ADDR,
    758                                                 phb->scom_hv_ind_addr_reg,
    759                                                 offset);
    760        }
    761        return val;
    762    case PHB_SCOM_ETU_LEM_FIR:
    763    case PHB_SCOM_ETU_LEM_FIR_AND:
    764    case PHB_SCOM_ETU_LEM_FIR_OR:
    765    case PHB_SCOM_ETU_LEM_FIR_MSK:
    766    case PHB_SCOM_ETU_LEM_ERR_MSK_AND:
    767    case PHB_SCOM_ETU_LEM_ERR_MSK_OR:
    768    case PHB_SCOM_ETU_LEM_ACT0:
    769    case PHB_SCOM_ETU_LEM_ACT1:
    770    case PHB_SCOM_ETU_LEM_WOF:
    771        offset = ((reg - PHB_SCOM_ETU_LEM_FIR) << 3) + PHB_LEM_FIR_ACCUM;
    772        return pnv_phb4_reg_read(phb, offset, size);
    773    case PHB_SCOM_ETU_PMON_CONFIG:
    774    case PHB_SCOM_ETU_PMON_CTR0:
    775    case PHB_SCOM_ETU_PMON_CTR1:
    776    case PHB_SCOM_ETU_PMON_CTR2:
    777    case PHB_SCOM_ETU_PMON_CTR3:
    778        offset = ((reg - PHB_SCOM_ETU_PMON_CONFIG) << 3) + PHB_PERFMON_CONFIG;
    779        return pnv_phb4_reg_read(phb, offset, size);
    780
    781    default:
    782        qemu_log_mask(LOG_UNIMP, "phb4: xscom_read 0x%"HWADDR_PRIx"\n", addr);
    783        return ~0ull;
    784    }
    785}
    786
    787static void pnv_phb4_xscom_write(void *opaque, hwaddr addr,
    788                                 uint64_t val, unsigned size)
    789{
    790    PnvPHB4 *phb = PNV_PHB4(opaque);
    791    uint32_t reg = addr >> 3;
    792    hwaddr offset;
    793
    794    switch (reg) {
    795    case PHB_SCOM_HV_IND_ADDR:
    796        phb->scom_hv_ind_addr_reg = val & 0xe000000000001fff;
    797        break;
    798    case PHB_SCOM_HV_IND_DATA:
    799        if (!(phb->scom_hv_ind_addr_reg & PHB_SCOM_HV_IND_ADDR_VALID)) {
    800            phb_error(phb, "Invalid indirect address");
    801            break;
    802        }
    803        size = (phb->scom_hv_ind_addr_reg & PHB_SCOM_HV_IND_ADDR_4B) ? 4 : 8;
    804        offset = GETFIELD(PHB_SCOM_HV_IND_ADDR_ADDR, phb->scom_hv_ind_addr_reg);
    805        pnv_phb4_reg_write(phb, offset, val, size);
    806        if (phb->scom_hv_ind_addr_reg & PHB_SCOM_HV_IND_ADDR_AUTOINC) {
    807            offset += size;
    808            offset &= 0x3fff;
    809            phb->scom_hv_ind_addr_reg = SETFIELD(PHB_SCOM_HV_IND_ADDR_ADDR,
    810                                                 phb->scom_hv_ind_addr_reg,
    811                                                 offset);
    812        }
    813        break;
    814    case PHB_SCOM_ETU_LEM_FIR:
    815    case PHB_SCOM_ETU_LEM_FIR_AND:
    816    case PHB_SCOM_ETU_LEM_FIR_OR:
    817    case PHB_SCOM_ETU_LEM_FIR_MSK:
    818    case PHB_SCOM_ETU_LEM_ERR_MSK_AND:
    819    case PHB_SCOM_ETU_LEM_ERR_MSK_OR:
    820    case PHB_SCOM_ETU_LEM_ACT0:
    821    case PHB_SCOM_ETU_LEM_ACT1:
    822    case PHB_SCOM_ETU_LEM_WOF:
    823        offset = ((reg - PHB_SCOM_ETU_LEM_FIR) << 3) + PHB_LEM_FIR_ACCUM;
    824        pnv_phb4_reg_write(phb, offset, val, size);
    825        break;
    826    case PHB_SCOM_ETU_PMON_CONFIG:
    827    case PHB_SCOM_ETU_PMON_CTR0:
    828    case PHB_SCOM_ETU_PMON_CTR1:
    829    case PHB_SCOM_ETU_PMON_CTR2:
    830    case PHB_SCOM_ETU_PMON_CTR3:
    831        offset = ((reg - PHB_SCOM_ETU_PMON_CONFIG) << 3) + PHB_PERFMON_CONFIG;
    832        pnv_phb4_reg_write(phb, offset, val, size);
    833        break;
    834    default:
    835        qemu_log_mask(LOG_UNIMP, "phb4: xscom_write 0x%"HWADDR_PRIx
    836                      "=%"PRIx64"\n", addr, val);
    837    }
    838}
    839
    840const MemoryRegionOps pnv_phb4_xscom_ops = {
    841    .read = pnv_phb4_xscom_read,
    842    .write = pnv_phb4_xscom_write,
    843    .valid.min_access_size = 8,
    844    .valid.max_access_size = 8,
    845    .impl.min_access_size = 8,
    846    .impl.max_access_size = 8,
    847    .endianness = DEVICE_BIG_ENDIAN,
    848};
    849
    850static int pnv_phb4_map_irq(PCIDevice *pci_dev, int irq_num)
    851{
    852    /* Check that out properly ... */
    853    return irq_num & 3;
    854}
    855
    856static void pnv_phb4_set_irq(void *opaque, int irq_num, int level)
    857{
    858    PnvPHB4 *phb = PNV_PHB4(opaque);
    859    uint32_t lsi_base;
    860
    861    /* LSI only ... */
    862    if (irq_num > 3) {
    863        phb_error(phb, "IRQ %x is not an LSI", irq_num);
    864    }
    865    lsi_base = GETFIELD(PHB_LSI_SRC_ID, phb->regs[PHB_LSI_SOURCE_ID >> 3]);
    866    lsi_base <<= 3;
    867    qemu_set_irq(phb->qirqs[lsi_base + irq_num], level);
    868}
    869
    870static bool pnv_phb4_resolve_pe(PnvPhb4DMASpace *ds)
    871{
    872    uint64_t rtt, addr;
    873    uint16_t rte;
    874    int bus_num;
    875    int num_PEs;
    876
    877    /* Already resolved ? */
    878    if (ds->pe_num != PHB_INVALID_PE) {
    879        return true;
    880    }
    881
    882    /* We need to lookup the RTT */
    883    rtt = ds->phb->regs[PHB_RTT_BAR >> 3];
    884    if (!(rtt & PHB_RTT_BAR_ENABLE)) {
    885        phb_error(ds->phb, "DMA with RTT BAR disabled !");
    886        /* Set error bits ? fence ? ... */
    887        return false;
    888    }
    889
    890    /* Read RTE */
    891    bus_num = pci_bus_num(ds->bus);
    892    addr = rtt & PHB_RTT_BASE_ADDRESS_MASK;
    893    addr += 2 * PCI_BUILD_BDF(bus_num, ds->devfn);
    894    if (dma_memory_read(&address_space_memory, addr, &rte, sizeof(rte))) {
    895        phb_error(ds->phb, "Failed to read RTT entry at 0x%"PRIx64, addr);
    896        /* Set error bits ? fence ? ... */
    897        return false;
    898    }
    899    rte = be16_to_cpu(rte);
    900
    901    /* Fail upon reading of invalid PE# */
    902    num_PEs = ds->phb->big_phb ? PNV_PHB4_MAX_PEs : (PNV_PHB4_MAX_PEs >> 1);
    903    if (rte >= num_PEs) {
    904        phb_error(ds->phb, "RTE for RID 0x%x invalid (%04x", ds->devfn, rte);
    905        rte &= num_PEs - 1;
    906    }
    907    ds->pe_num = rte;
    908    return true;
    909}
    910
    911static void pnv_phb4_translate_tve(PnvPhb4DMASpace *ds, hwaddr addr,
    912                                   bool is_write, uint64_t tve,
    913                                   IOMMUTLBEntry *tlb)
    914{
    915    uint64_t tta = GETFIELD(IODA3_TVT_TABLE_ADDR, tve);
    916    int32_t  lev = GETFIELD(IODA3_TVT_NUM_LEVELS, tve);
    917    uint32_t tts = GETFIELD(IODA3_TVT_TCE_TABLE_SIZE, tve);
    918    uint32_t tps = GETFIELD(IODA3_TVT_IO_PSIZE, tve);
    919
    920    /* Invalid levels */
    921    if (lev > 4) {
    922        phb_error(ds->phb, "Invalid #levels in TVE %d", lev);
    923        return;
    924    }
    925
    926    /* Invalid entry */
    927    if (tts == 0) {
    928        phb_error(ds->phb, "Access to invalid TVE");
    929        return;
    930    }
    931
    932    /* IO Page Size of 0 means untranslated, else use TCEs */
    933    if (tps == 0) {
    934        /* TODO: Handle boundaries */
    935
    936        /* Use 4k pages like q35 ... for now */
    937        tlb->iova = addr & 0xfffffffffffff000ull;
    938        tlb->translated_addr = addr & 0x0003fffffffff000ull;
    939        tlb->addr_mask = 0xfffull;
    940        tlb->perm = IOMMU_RW;
    941    } else {
    942        uint32_t tce_shift, tbl_shift, sh;
    943        uint64_t base, taddr, tce, tce_mask;
    944
    945        /* Address bits per bottom level TCE entry */
    946        tce_shift = tps + 11;
    947
    948        /* Address bits per table level */
    949        tbl_shift = tts + 8;
    950
    951        /* Top level table base address */
    952        base = tta << 12;
    953
    954        /* Total shift to first level */
    955        sh = tbl_shift * lev + tce_shift;
    956
    957        /* TODO: Limit to support IO page sizes */
    958
    959        /* TODO: Multi-level untested */
    960        while ((lev--) >= 0) {
    961            /* Grab the TCE address */
    962            taddr = base | (((addr >> sh) & ((1ul << tbl_shift) - 1)) << 3);
    963            if (dma_memory_read(&address_space_memory, taddr, &tce,
    964                                sizeof(tce))) {
    965                phb_error(ds->phb, "Failed to read TCE at 0x%"PRIx64, taddr);
    966                return;
    967            }
    968            tce = be64_to_cpu(tce);
    969
    970            /* Check permission for indirect TCE */
    971            if ((lev >= 0) && !(tce & 3)) {
    972                phb_error(ds->phb, "Invalid indirect TCE at 0x%"PRIx64, taddr);
    973                phb_error(ds->phb, " xlate %"PRIx64":%c TVE=%"PRIx64, addr,
    974                           is_write ? 'W' : 'R', tve);
    975                phb_error(ds->phb, " tta=%"PRIx64" lev=%d tts=%d tps=%d",
    976                           tta, lev, tts, tps);
    977                return;
    978            }
    979            sh -= tbl_shift;
    980            base = tce & ~0xfffull;
    981        }
    982
    983        /* We exit the loop with TCE being the final TCE */
    984        tce_mask = ~((1ull << tce_shift) - 1);
    985        tlb->iova = addr & tce_mask;
    986        tlb->translated_addr = tce & tce_mask;
    987        tlb->addr_mask = ~tce_mask;
    988        tlb->perm = tce & 3;
    989        if ((is_write & !(tce & 2)) || ((!is_write) && !(tce & 1))) {
    990            phb_error(ds->phb, "TCE access fault at 0x%"PRIx64, taddr);
    991            phb_error(ds->phb, " xlate %"PRIx64":%c TVE=%"PRIx64, addr,
    992                       is_write ? 'W' : 'R', tve);
    993            phb_error(ds->phb, " tta=%"PRIx64" lev=%d tts=%d tps=%d",
    994                       tta, lev, tts, tps);
    995        }
    996    }
    997}
    998
    999static IOMMUTLBEntry pnv_phb4_translate_iommu(IOMMUMemoryRegion *iommu,
   1000                                              hwaddr addr,
   1001                                              IOMMUAccessFlags flag,
   1002                                              int iommu_idx)
   1003{
   1004    PnvPhb4DMASpace *ds = container_of(iommu, PnvPhb4DMASpace, dma_mr);
   1005    int tve_sel;
   1006    uint64_t tve, cfg;
   1007    IOMMUTLBEntry ret = {
   1008        .target_as = &address_space_memory,
   1009        .iova = addr,
   1010        .translated_addr = 0,
   1011        .addr_mask = ~(hwaddr)0,
   1012        .perm = IOMMU_NONE,
   1013    };
   1014
   1015    /* Resolve PE# */
   1016    if (!pnv_phb4_resolve_pe(ds)) {
   1017        phb_error(ds->phb, "Failed to resolve PE# for bus @%p (%d) devfn 0x%x",
   1018                   ds->bus, pci_bus_num(ds->bus), ds->devfn);
   1019        return ret;
   1020    }
   1021
   1022    /* Check top bits */
   1023    switch (addr >> 60) {
   1024    case 00:
   1025        /* DMA or 32-bit MSI ? */
   1026        cfg = ds->phb->regs[PHB_PHB4_CONFIG >> 3];
   1027        if ((cfg & PHB_PHB4C_32BIT_MSI_EN) &&
   1028            ((addr & 0xffffffffffff0000ull) == 0xffff0000ull)) {
   1029            phb_error(ds->phb, "xlate on 32-bit MSI region");
   1030            return ret;
   1031        }
   1032        /* Choose TVE XXX Use PHB4 Control Register */
   1033        tve_sel = (addr >> 59) & 1;
   1034        tve = ds->phb->ioda_TVT[ds->pe_num * 2 + tve_sel];
   1035        pnv_phb4_translate_tve(ds, addr, flag & IOMMU_WO, tve, &ret);
   1036        break;
   1037    case 01:
   1038        phb_error(ds->phb, "xlate on 64-bit MSI region");
   1039        break;
   1040    default:
   1041        phb_error(ds->phb, "xlate on unsupported address 0x%"PRIx64, addr);
   1042    }
   1043    return ret;
   1044}
   1045
   1046#define TYPE_PNV_PHB4_IOMMU_MEMORY_REGION "pnv-phb4-iommu-memory-region"
   1047DECLARE_INSTANCE_CHECKER(IOMMUMemoryRegion, PNV_PHB4_IOMMU_MEMORY_REGION,
   1048                         TYPE_PNV_PHB4_IOMMU_MEMORY_REGION)
   1049
   1050static void pnv_phb4_iommu_memory_region_class_init(ObjectClass *klass,
   1051                                                    void *data)
   1052{
   1053    IOMMUMemoryRegionClass *imrc = IOMMU_MEMORY_REGION_CLASS(klass);
   1054
   1055    imrc->translate = pnv_phb4_translate_iommu;
   1056}
   1057
   1058static const TypeInfo pnv_phb4_iommu_memory_region_info = {
   1059    .parent = TYPE_IOMMU_MEMORY_REGION,
   1060    .name = TYPE_PNV_PHB4_IOMMU_MEMORY_REGION,
   1061    .class_init = pnv_phb4_iommu_memory_region_class_init,
   1062};
   1063
   1064/*
   1065 * MSI/MSIX memory region implementation.
   1066 * The handler handles both MSI and MSIX.
   1067 */
   1068static void pnv_phb4_msi_write(void *opaque, hwaddr addr,
   1069                               uint64_t data, unsigned size)
   1070{
   1071    PnvPhb4DMASpace *ds = opaque;
   1072    PnvPHB4 *phb = ds->phb;
   1073
   1074    uint32_t src = ((addr >> 4) & 0xffff) | (data & 0x1f);
   1075
   1076    /* Resolve PE# */
   1077    if (!pnv_phb4_resolve_pe(ds)) {
   1078        phb_error(phb, "Failed to resolve PE# for bus @%p (%d) devfn 0x%x",
   1079                   ds->bus, pci_bus_num(ds->bus), ds->devfn);
   1080        return;
   1081    }
   1082
   1083    /* TODO: Check it doesn't collide with LSIs */
   1084    if (src >= phb->xsrc.nr_irqs) {
   1085        phb_error(phb, "MSI %d out of bounds", src);
   1086        return;
   1087    }
   1088
   1089    /* TODO: check PE/MSI assignement */
   1090
   1091    qemu_irq_pulse(phb->qirqs[src]);
   1092}
   1093
   1094/* There is no .read as the read result is undefined by PCI spec */
   1095static uint64_t pnv_phb4_msi_read(void *opaque, hwaddr addr, unsigned size)
   1096{
   1097    PnvPhb4DMASpace *ds = opaque;
   1098
   1099    phb_error(ds->phb, "Invalid MSI read @ 0x%" HWADDR_PRIx, addr);
   1100    return -1;
   1101}
   1102
   1103static const MemoryRegionOps pnv_phb4_msi_ops = {
   1104    .read = pnv_phb4_msi_read,
   1105    .write = pnv_phb4_msi_write,
   1106    .endianness = DEVICE_LITTLE_ENDIAN
   1107};
   1108
   1109static PnvPhb4DMASpace *pnv_phb4_dma_find(PnvPHB4 *phb, PCIBus *bus, int devfn)
   1110{
   1111    PnvPhb4DMASpace *ds;
   1112
   1113    QLIST_FOREACH(ds, &phb->dma_spaces, list) {
   1114        if (ds->bus == bus && ds->devfn == devfn) {
   1115            break;
   1116        }
   1117    }
   1118    return ds;
   1119}
   1120
   1121static AddressSpace *pnv_phb4_dma_iommu(PCIBus *bus, void *opaque, int devfn)
   1122{
   1123    PnvPHB4 *phb = opaque;
   1124    PnvPhb4DMASpace *ds;
   1125    char name[32];
   1126
   1127    ds = pnv_phb4_dma_find(phb, bus, devfn);
   1128
   1129    if (ds == NULL) {
   1130        ds = g_malloc0(sizeof(PnvPhb4DMASpace));
   1131        ds->bus = bus;
   1132        ds->devfn = devfn;
   1133        ds->pe_num = PHB_INVALID_PE;
   1134        ds->phb = phb;
   1135        snprintf(name, sizeof(name), "phb4-%d.%d-iommu", phb->chip_id,
   1136                 phb->phb_id);
   1137        memory_region_init_iommu(&ds->dma_mr, sizeof(ds->dma_mr),
   1138                                 TYPE_PNV_PHB4_IOMMU_MEMORY_REGION,
   1139                                 OBJECT(phb), name, UINT64_MAX);
   1140        address_space_init(&ds->dma_as, MEMORY_REGION(&ds->dma_mr),
   1141                           name);
   1142        memory_region_init_io(&ds->msi32_mr, OBJECT(phb), &pnv_phb4_msi_ops,
   1143                              ds, "msi32", 0x10000);
   1144        memory_region_init_io(&ds->msi64_mr, OBJECT(phb), &pnv_phb4_msi_ops,
   1145                              ds, "msi64", 0x100000);
   1146        pnv_phb4_update_msi_regions(ds);
   1147
   1148        QLIST_INSERT_HEAD(&phb->dma_spaces, ds, list);
   1149    }
   1150    return &ds->dma_as;
   1151}
   1152
   1153static void pnv_phb4_instance_init(Object *obj)
   1154{
   1155    PnvPHB4 *phb = PNV_PHB4(obj);
   1156
   1157    QLIST_INIT(&phb->dma_spaces);
   1158
   1159    /* XIVE interrupt source object */
   1160    object_initialize_child(obj, "source", &phb->xsrc, TYPE_XIVE_SOURCE);
   1161
   1162    /* Root Port */
   1163    object_initialize_child(obj, "root", &phb->root, TYPE_PNV_PHB4_ROOT_PORT);
   1164
   1165    qdev_prop_set_int32(DEVICE(&phb->root), "addr", PCI_DEVFN(0, 0));
   1166    qdev_prop_set_bit(DEVICE(&phb->root), "multifunction", false);
   1167}
   1168
   1169static void pnv_phb4_realize(DeviceState *dev, Error **errp)
   1170{
   1171    PnvPHB4 *phb = PNV_PHB4(dev);
   1172    PCIHostState *pci = PCI_HOST_BRIDGE(dev);
   1173    XiveSource *xsrc = &phb->xsrc;
   1174    int nr_irqs;
   1175    char name[32];
   1176
   1177    assert(phb->stack);
   1178
   1179    /* Set the "big_phb" flag */
   1180    phb->big_phb = phb->phb_id == 0 || phb->phb_id == 3;
   1181
   1182    /* Controller Registers */
   1183    snprintf(name, sizeof(name), "phb4-%d.%d-regs", phb->chip_id,
   1184             phb->phb_id);
   1185    memory_region_init_io(&phb->mr_regs, OBJECT(phb), &pnv_phb4_reg_ops, phb,
   1186                          name, 0x2000);
   1187
   1188    /*
   1189     * PHB4 doesn't support IO space. However, qemu gets very upset if
   1190     * we don't have an IO region to anchor IO BARs onto so we just
   1191     * initialize one which we never hook up to anything
   1192     */
   1193
   1194    snprintf(name, sizeof(name), "phb4-%d.%d-pci-io", phb->chip_id,
   1195             phb->phb_id);
   1196    memory_region_init(&phb->pci_io, OBJECT(phb), name, 0x10000);
   1197
   1198    snprintf(name, sizeof(name), "phb4-%d.%d-pci-mmio", phb->chip_id,
   1199             phb->phb_id);
   1200    memory_region_init(&phb->pci_mmio, OBJECT(phb), name,
   1201                       PCI_MMIO_TOTAL_SIZE);
   1202
   1203    pci->bus = pci_register_root_bus(dev, "root-bus",
   1204                                     pnv_phb4_set_irq, pnv_phb4_map_irq, phb,
   1205                                     &phb->pci_mmio, &phb->pci_io,
   1206                                     0, 4, TYPE_PNV_PHB4_ROOT_BUS);
   1207    pci_setup_iommu(pci->bus, pnv_phb4_dma_iommu, phb);
   1208
   1209    /* Add a single Root port */
   1210    qdev_prop_set_uint8(DEVICE(&phb->root), "chassis", phb->chip_id);
   1211    qdev_prop_set_uint16(DEVICE(&phb->root), "slot", phb->phb_id);
   1212    qdev_realize(DEVICE(&phb->root), BUS(pci->bus), &error_fatal);
   1213
   1214    /* Setup XIVE Source */
   1215    if (phb->big_phb) {
   1216        nr_irqs = PNV_PHB4_MAX_INTs;
   1217    } else {
   1218        nr_irqs = PNV_PHB4_MAX_INTs >> 1;
   1219    }
   1220    object_property_set_int(OBJECT(xsrc), "nr-irqs", nr_irqs, &error_fatal);
   1221    object_property_set_link(OBJECT(xsrc), "xive", OBJECT(phb), &error_fatal);
   1222    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
   1223        return;
   1224    }
   1225
   1226    pnv_phb4_update_xsrc(phb);
   1227
   1228    phb->qirqs = qemu_allocate_irqs(xive_source_set_irq, xsrc, xsrc->nr_irqs);
   1229}
   1230
   1231static void pnv_phb4_reset(DeviceState *dev)
   1232{
   1233    PnvPHB4 *phb = PNV_PHB4(dev);
   1234    PCIDevice *root_dev = PCI_DEVICE(&phb->root);
   1235
   1236    /*
   1237     * Configure PCI device id at reset using a property.
   1238     */
   1239    pci_config_set_vendor_id(root_dev->config, PCI_VENDOR_ID_IBM);
   1240    pci_config_set_device_id(root_dev->config, phb->device_id);
   1241}
   1242
   1243static const char *pnv_phb4_root_bus_path(PCIHostState *host_bridge,
   1244                                          PCIBus *rootbus)
   1245{
   1246    PnvPHB4 *phb = PNV_PHB4(host_bridge);
   1247
   1248    snprintf(phb->bus_path, sizeof(phb->bus_path), "00%02x:%02x",
   1249             phb->chip_id, phb->phb_id);
   1250    return phb->bus_path;
   1251}
   1252
   1253static void pnv_phb4_xive_notify(XiveNotifier *xf, uint32_t srcno)
   1254{
   1255    PnvPHB4 *phb = PNV_PHB4(xf);
   1256    uint64_t notif_port = phb->regs[PHB_INT_NOTIFY_ADDR >> 3];
   1257    uint32_t offset = phb->regs[PHB_INT_NOTIFY_INDEX >> 3];
   1258    uint64_t data = XIVE_TRIGGER_PQ | offset | srcno;
   1259    MemTxResult result;
   1260
   1261    trace_pnv_phb4_xive_notify(notif_port, data);
   1262
   1263    address_space_stq_be(&address_space_memory, notif_port, data,
   1264                         MEMTXATTRS_UNSPECIFIED, &result);
   1265    if (result != MEMTX_OK) {
   1266        phb_error(phb, "trigger failed @%"HWADDR_PRIx "\n", notif_port);
   1267        return;
   1268    }
   1269}
   1270
   1271static Property pnv_phb4_properties[] = {
   1272        DEFINE_PROP_UINT32("index", PnvPHB4, phb_id, 0),
   1273        DEFINE_PROP_UINT32("chip-id", PnvPHB4, chip_id, 0),
   1274        DEFINE_PROP_UINT64("version", PnvPHB4, version, 0),
   1275        DEFINE_PROP_UINT16("device-id", PnvPHB4, device_id, 0),
   1276        DEFINE_PROP_LINK("stack", PnvPHB4, stack, TYPE_PNV_PHB4_PEC_STACK,
   1277                         PnvPhb4PecStack *),
   1278        DEFINE_PROP_END_OF_LIST(),
   1279};
   1280
   1281static void pnv_phb4_class_init(ObjectClass *klass, void *data)
   1282{
   1283    PCIHostBridgeClass *hc = PCI_HOST_BRIDGE_CLASS(klass);
   1284    DeviceClass *dc = DEVICE_CLASS(klass);
   1285    XiveNotifierClass *xfc = XIVE_NOTIFIER_CLASS(klass);
   1286
   1287    hc->root_bus_path   = pnv_phb4_root_bus_path;
   1288    dc->realize         = pnv_phb4_realize;
   1289    device_class_set_props(dc, pnv_phb4_properties);
   1290    set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
   1291    dc->user_creatable  = false;
   1292    dc->reset           = pnv_phb4_reset;
   1293
   1294    xfc->notify         = pnv_phb4_xive_notify;
   1295}
   1296
   1297static const TypeInfo pnv_phb4_type_info = {
   1298    .name          = TYPE_PNV_PHB4,
   1299    .parent        = TYPE_PCIE_HOST_BRIDGE,
   1300    .instance_init = pnv_phb4_instance_init,
   1301    .instance_size = sizeof(PnvPHB4),
   1302    .class_init    = pnv_phb4_class_init,
   1303    .interfaces = (InterfaceInfo[]) {
   1304            { TYPE_XIVE_NOTIFIER },
   1305            { },
   1306    }
   1307};
   1308
   1309static void pnv_phb4_root_bus_class_init(ObjectClass *klass, void *data)
   1310{
   1311    BusClass *k = BUS_CLASS(klass);
   1312
   1313    /*
   1314     * PHB4 has only a single root complex. Enforce the limit on the
   1315     * parent bus
   1316     */
   1317    k->max_dev = 1;
   1318}
   1319
   1320static const TypeInfo pnv_phb4_root_bus_info = {
   1321    .name = TYPE_PNV_PHB4_ROOT_BUS,
   1322    .parent = TYPE_PCIE_BUS,
   1323    .class_init = pnv_phb4_root_bus_class_init,
   1324    .interfaces = (InterfaceInfo[]) {
   1325        { INTERFACE_PCIE_DEVICE },
   1326        { }
   1327    },
   1328};
   1329
   1330static void pnv_phb4_root_port_reset(DeviceState *dev)
   1331{
   1332    PCIERootPortClass *rpc = PCIE_ROOT_PORT_GET_CLASS(dev);
   1333    PCIDevice *d = PCI_DEVICE(dev);
   1334    uint8_t *conf = d->config;
   1335
   1336    rpc->parent_reset(dev);
   1337
   1338    pci_byte_test_and_set_mask(conf + PCI_IO_BASE,
   1339                               PCI_IO_RANGE_MASK & 0xff);
   1340    pci_byte_test_and_clear_mask(conf + PCI_IO_LIMIT,
   1341                                 PCI_IO_RANGE_MASK & 0xff);
   1342    pci_set_word(conf + PCI_MEMORY_BASE, 0);
   1343    pci_set_word(conf + PCI_MEMORY_LIMIT, 0xfff0);
   1344    pci_set_word(conf + PCI_PREF_MEMORY_BASE, 0x1);
   1345    pci_set_word(conf + PCI_PREF_MEMORY_LIMIT, 0xfff1);
   1346    pci_set_long(conf + PCI_PREF_BASE_UPPER32, 0x1); /* Hack */
   1347    pci_set_long(conf + PCI_PREF_LIMIT_UPPER32, 0xffffffff);
   1348}
   1349
   1350static void pnv_phb4_root_port_realize(DeviceState *dev, Error **errp)
   1351{
   1352    PCIERootPortClass *rpc = PCIE_ROOT_PORT_GET_CLASS(dev);
   1353    Error *local_err = NULL;
   1354
   1355    rpc->parent_realize(dev, &local_err);
   1356    if (local_err) {
   1357        error_propagate(errp, local_err);
   1358        return;
   1359    }
   1360}
   1361
   1362static void pnv_phb4_root_port_class_init(ObjectClass *klass, void *data)
   1363{
   1364    DeviceClass *dc = DEVICE_CLASS(klass);
   1365    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
   1366    PCIERootPortClass *rpc = PCIE_ROOT_PORT_CLASS(klass);
   1367
   1368    dc->desc     = "IBM PHB4 PCIE Root Port";
   1369    dc->user_creatable = false;
   1370
   1371    device_class_set_parent_realize(dc, pnv_phb4_root_port_realize,
   1372                                    &rpc->parent_realize);
   1373    device_class_set_parent_reset(dc, pnv_phb4_root_port_reset,
   1374                                  &rpc->parent_reset);
   1375
   1376    k->vendor_id = PCI_VENDOR_ID_IBM;
   1377    k->device_id = PNV_PHB4_DEVICE_ID;
   1378    k->revision  = 0;
   1379
   1380    rpc->exp_offset = 0x48;
   1381    rpc->aer_offset = 0x100;
   1382
   1383    dc->reset = &pnv_phb4_root_port_reset;
   1384}
   1385
   1386static const TypeInfo pnv_phb4_root_port_info = {
   1387    .name          = TYPE_PNV_PHB4_ROOT_PORT,
   1388    .parent        = TYPE_PCIE_ROOT_PORT,
   1389    .instance_size = sizeof(PnvPHB4RootPort),
   1390    .class_init    = pnv_phb4_root_port_class_init,
   1391};
   1392
   1393static void pnv_phb4_register_types(void)
   1394{
   1395    type_register_static(&pnv_phb4_root_bus_info);
   1396    type_register_static(&pnv_phb4_root_port_info);
   1397    type_register_static(&pnv_phb4_type_info);
   1398    type_register_static(&pnv_phb4_iommu_memory_region_info);
   1399}
   1400
   1401type_init(pnv_phb4_register_types);
   1402
   1403void pnv_phb4_update_regions(PnvPhb4PecStack *stack)
   1404{
   1405    PnvPHB4 *phb = &stack->phb;
   1406
   1407    /* Unmap first always */
   1408    if (memory_region_is_mapped(&phb->mr_regs)) {
   1409        memory_region_del_subregion(&stack->phbbar, &phb->mr_regs);
   1410    }
   1411    if (memory_region_is_mapped(&phb->xsrc.esb_mmio)) {
   1412        memory_region_del_subregion(&stack->intbar, &phb->xsrc.esb_mmio);
   1413    }
   1414
   1415    /* Map registers if enabled */
   1416    if (memory_region_is_mapped(&stack->phbbar)) {
   1417        memory_region_add_subregion(&stack->phbbar, 0, &phb->mr_regs);
   1418    }
   1419
   1420    /* Map ESB if enabled */
   1421    if (memory_region_is_mapped(&stack->intbar)) {
   1422        memory_region_add_subregion(&stack->intbar, 0, &phb->xsrc.esb_mmio);
   1423    }
   1424
   1425    /* Check/update m32 */
   1426    pnv_phb4_check_all_mbt(phb);
   1427}
   1428
   1429void pnv_phb4_pic_print_info(PnvPHB4 *phb, Monitor *mon)
   1430{
   1431    uint32_t offset = phb->regs[PHB_INT_NOTIFY_INDEX >> 3];
   1432
   1433    monitor_printf(mon, "PHB4[%x:%x] Source %08x .. %08x\n",
   1434                   phb->chip_id, phb->phb_id,
   1435                   offset, offset + phb->xsrc.nr_irqs - 1);
   1436    xive_source_pic_print_info(&phb->xsrc, 0, mon);
   1437}