Commit 616badd2 authored by Alistair Popple's avatar Alistair Popple Committed by Michael Ellerman

powerpc/powernv: Use OPAL call for TCE kill on NVLink2

Add detection of NPU2 PHBs. NPU2/NVLink2 has a different register
layout for the TCE kill register therefore TCE invalidation should be
done via the OPAL call rather than using the register directly as it
is for PHB3 and NVLink1. This changes TCE invalidation to use the OPAL
call in the case of a NPU2 PHB model.
Signed-off-by: default avatarAlistair Popple <alistair@popple.id.au>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 1d0761d2
...@@ -1953,7 +1953,12 @@ static void pnv_pci_ioda2_tce_invalidate(struct iommu_table *tbl, ...@@ -1953,7 +1953,12 @@ static void pnv_pci_ioda2_tce_invalidate(struct iommu_table *tbl,
struct pnv_phb *phb = pe->phb; struct pnv_phb *phb = pe->phb;
unsigned int shift = tbl->it_page_shift; unsigned int shift = tbl->it_page_shift;
if (phb->type == PNV_PHB_NPU) { /*
* NVLink1 can use the TCE kill register directly as
* it's the same as PHB3. NVLink2 is different and
* should go via the OPAL call.
*/
if (phb->model == PNV_PHB_MODEL_NPU) {
/* /*
* The NVLink hardware does not support TCE kill * The NVLink hardware does not support TCE kill
* per TCE entry so we have to invalidate * per TCE entry so we have to invalidate
...@@ -3674,6 +3679,8 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np, ...@@ -3674,6 +3679,8 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
phb->model = PNV_PHB_MODEL_PHB3; phb->model = PNV_PHB_MODEL_PHB3;
else if (of_device_is_compatible(np, "ibm,power8-npu-pciex")) else if (of_device_is_compatible(np, "ibm,power8-npu-pciex"))
phb->model = PNV_PHB_MODEL_NPU; phb->model = PNV_PHB_MODEL_NPU;
else if (of_device_is_compatible(np, "ibm,power9-npu-pciex"))
phb->model = PNV_PHB_MODEL_NPU2;
else else
phb->model = PNV_PHB_MODEL_UNKNOWN; phb->model = PNV_PHB_MODEL_UNKNOWN;
......
...@@ -940,6 +940,13 @@ void __init pnv_pci_init(void) ...@@ -940,6 +940,13 @@ void __init pnv_pci_init(void)
for_each_compatible_node(np, NULL, "ibm,ioda2-npu-phb") for_each_compatible_node(np, NULL, "ibm,ioda2-npu-phb")
pnv_pci_init_npu_phb(np); pnv_pci_init_npu_phb(np);
/*
* Look for NPU2 PHBs which we treat mostly as NPU PHBs with
* the exception of TCE kill which requires an OPAL call.
*/
for_each_compatible_node(np, NULL, "ibm,ioda2-npu2-phb")
pnv_pci_init_npu_phb(np);
/* Configure IOMMU DMA hooks */ /* Configure IOMMU DMA hooks */
set_pci_dma_ops(&dma_iommu_ops); set_pci_dma_ops(&dma_iommu_ops);
} }
......
...@@ -19,6 +19,7 @@ enum pnv_phb_model { ...@@ -19,6 +19,7 @@ enum pnv_phb_model {
PNV_PHB_MODEL_P7IOC, PNV_PHB_MODEL_P7IOC,
PNV_PHB_MODEL_PHB3, PNV_PHB_MODEL_PHB3,
PNV_PHB_MODEL_NPU, PNV_PHB_MODEL_NPU,
PNV_PHB_MODEL_NPU2,
}; };
#define PNV_PCI_DIAG_BUF_SIZE 8192 #define PNV_PCI_DIAG_BUF_SIZE 8192
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment