OPAL_PCI_TCE_KILL

int64_t opal_pci_tce_kill(uint64_t phb_id,
                       uint32_t kill_type,
                       uint64_t pe_number,
                       uint32_t tce_size,
                       uint64_t dma_addr,
                       uint32_t npages);

An abstraction around TCE kill. This allows host OS kernels to use an OPAL call if they don’t know the model specific invalidation method.

Where kill_type is one of:

enum {
   OPAL_PCI_TCE_KILL_PAGES,
   OPAL_PCI_TCE_KILL_PE,
   OPAL_PCI_TCE_KILL_ALL,
};

Not all PHB types currently support this abstraction. It is supported in PHB4, which means from POWER9 onwards it will be present.

Returns

OPAL_PARAMETER
if phb_id is invalid (or similar)
OPAL_UNSUPPORTED
if PHB model doesn’t support this call. This is likely true for systems before POWER9/PHB4. Do NOT rely on this call existing for systems prior to POWER9 (i.e. PHB4).

Example code (from linux/arch/powerpc/platforms/powernv/pci-ioda.c)

static inline void pnv_pci_ioda2_tce_invalidate_pe(struct pnv_ioda_pe *pe)
{
      struct pnv_phb *phb = pe->phb;

      if (phb->model == PNV_PHB_MODEL_PHB3 && phb->regs)
         pnv_pci_phb3_tce_invalidate_pe(pe);
      else
         opal_pci_tce_kill(phb->opal_id, OPAL_PCI_TCE_KILL_PE,
                           pe->pe_number, 0, 0, 0);
}

and

struct pnv_phb *phb = pe->phb;
unsigned int shift = tbl->it_page_shift;

if (phb->model == PNV_PHB_MODEL_PHB3 && phb->regs)
      pnv_pci_phb3_tce_invalidate(pe, rm, shift,
                                  index, npages);
else
      opal_pci_tce_kill(phb->opal_id,
                        OPAL_PCI_TCE_KILL_PAGES,
                        pe->pe_number, 1u << shift,
                        index << shift, npages);