aboutsummaryrefslogtreecommitdiffstats
path: root/roms/skiboot/doc/opal-api/opal-pci-tce-kill-126.rst
diff options
context:
space:
mode:
authorAngelos Mouzakitis <a.mouzakitis@virtualopensystems.com>2023-10-10 14:33:42 +0000
committerAngelos Mouzakitis <a.mouzakitis@virtualopensystems.com>2023-10-10 14:33:42 +0000
commitaf1a266670d040d2f4083ff309d732d648afba2a (patch)
tree2fc46203448ddcc6f81546d379abfaeb323575e9 /roms/skiboot/doc/opal-api/opal-pci-tce-kill-126.rst
parente02cda008591317b1625707ff8e115a4841aa889 (diff)
Add submodule dependency filesHEADmaster
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.rst70
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);