diff options
author | 2023-10-10 14:33:42 +0000 | |
---|---|---|
committer | 2023-10-10 14:33:42 +0000 | |
commit | af1a266670d040d2f4083ff309d732d648afba2a (patch) | |
tree | 2fc46203448ddcc6f81546d379abfaeb323575e9 /roms/skiboot/doc/opal-api/opal-pci-tce-kill-126.rst | |
parent | e02cda008591317b1625707ff8e115a4841aa889 (diff) |
Change-Id: Iaf8d18082d3991dec7c0ebbea540f092188eb4ec
Diffstat (limited to 'roms/skiboot/doc/opal-api/opal-pci-tce-kill-126.rst')
-rw-r--r-- | roms/skiboot/doc/opal-api/opal-pci-tce-kill-126.rst | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/roms/skiboot/doc/opal-api/opal-pci-tce-kill-126.rst b/roms/skiboot/doc/opal-api/opal-pci-tce-kill-126.rst new file mode 100644 index 000000000..edd8706b9 --- /dev/null +++ b/roms/skiboot/doc/opal-api/opal-pci-tce-kill-126.rst @@ -0,0 +1,70 @@ +.. _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); |