.. _OPAL_PCI_TCE_KILL: OPAL_PCI_TCE_KILL ================= .. code-block:: c 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: .. code-block:: c 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 ------- :ref:`OPAL_PARAMETER` if ``phb_id`` is invalid (or similar) :ref:`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) .. code-block:: 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 .. code-block:: c 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);