70 lines
1.7 KiB
ReStructuredText
70 lines
1.7 KiB
ReStructuredText
.. _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);
|