diff options
| -rw-r--r-- | arch/powerpc/kernel/iommu.c | 38 | ||||
| -rw-r--r-- | arch/powerpc/platforms/powernv/pci-ioda.c | 2 |
2 files changed, 22 insertions, 18 deletions
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c index f84f799babb1..a10642a0d861 100644 --- a/arch/powerpc/kernel/iommu.c +++ b/arch/powerpc/kernel/iommu.c | |||
| @@ -1120,37 +1120,41 @@ EXPORT_SYMBOL_GPL(iommu_release_ownership); | |||
| 1120 | int iommu_add_device(struct device *dev) | 1120 | int iommu_add_device(struct device *dev) |
| 1121 | { | 1121 | { |
| 1122 | struct iommu_table *tbl; | 1122 | struct iommu_table *tbl; |
| 1123 | int ret = 0; | ||
| 1124 | 1123 | ||
| 1125 | if (WARN_ON(dev->iommu_group)) { | 1124 | /* |
| 1126 | pr_warn("iommu_tce: device %s is already in iommu group %d, skipping\n", | 1125 | * The sysfs entries should be populated before |
| 1127 | dev_name(dev), | 1126 | * binding IOMMU group. If sysfs entries isn't |
| 1128 | iommu_group_id(dev->iommu_group)); | 1127 | * ready, we simply bail. |
| 1128 | */ | ||
| 1129 | if (!device_is_registered(dev)) | ||
| 1130 | return -ENOENT; | ||
| 1131 | |||
| 1132 | if (dev->iommu_group) { | ||
| 1133 | pr_debug("%s: Skipping device %s with iommu group %d\n", | ||
| 1134 | __func__, dev_name(dev), | ||
| 1135 | iommu_group_id(dev->iommu_group)); | ||
| 1129 | return -EBUSY; | 1136 | return -EBUSY; |
| 1130 | } | 1137 | } |
| 1131 | 1138 | ||
| 1132 | tbl = get_iommu_table_base(dev); | 1139 | tbl = get_iommu_table_base(dev); |
| 1133 | if (!tbl || !tbl->it_group) { | 1140 | if (!tbl || !tbl->it_group) { |
| 1134 | pr_debug("iommu_tce: skipping device %s with no tbl\n", | 1141 | pr_debug("%s: Skipping device %s with no tbl\n", |
| 1135 | dev_name(dev)); | 1142 | __func__, dev_name(dev)); |
| 1136 | return 0; | 1143 | return 0; |
| 1137 | } | 1144 | } |
| 1138 | 1145 | ||
| 1139 | pr_debug("iommu_tce: adding %s to iommu group %d\n", | 1146 | pr_debug("%s: Adding %s to iommu group %d\n", |
| 1140 | dev_name(dev), iommu_group_id(tbl->it_group)); | 1147 | __func__, dev_name(dev), |
| 1148 | iommu_group_id(tbl->it_group)); | ||
| 1141 | 1149 | ||
| 1142 | if (PAGE_SIZE < IOMMU_PAGE_SIZE(tbl)) { | 1150 | if (PAGE_SIZE < IOMMU_PAGE_SIZE(tbl)) { |
| 1143 | pr_err("iommu_tce: unsupported iommu page size."); | 1151 | pr_err("%s: Invalid IOMMU page size %lx (%lx) on %s\n", |
| 1144 | pr_err("%s has not been added\n", dev_name(dev)); | 1152 | __func__, IOMMU_PAGE_SIZE(tbl), |
| 1153 | PAGE_SIZE, dev_name(dev)); | ||
| 1145 | return -EINVAL; | 1154 | return -EINVAL; |
| 1146 | } | 1155 | } |
| 1147 | 1156 | ||
| 1148 | ret = iommu_group_add_device(tbl->it_group, dev); | 1157 | return iommu_group_add_device(tbl->it_group, dev); |
| 1149 | if (ret < 0) | ||
| 1150 | pr_err("iommu_tce: %s has not been added, ret=%d\n", | ||
| 1151 | dev_name(dev), ret); | ||
| 1152 | |||
| 1153 | return ret; | ||
| 1154 | } | 1158 | } |
| 1155 | EXPORT_SYMBOL_GPL(iommu_add_device); | 1159 | EXPORT_SYMBOL_GPL(iommu_add_device); |
| 1156 | 1160 | ||
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index b136108ddc99..df241b11d4f7 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c | |||
| @@ -857,7 +857,7 @@ static void pnv_pci_ioda_dma_dev_setup(struct pnv_phb *phb, struct pci_dev *pdev | |||
| 857 | 857 | ||
| 858 | pe = &phb->ioda.pe_array[pdn->pe_number]; | 858 | pe = &phb->ioda.pe_array[pdn->pe_number]; |
| 859 | WARN_ON(get_dma_ops(&pdev->dev) != &dma_iommu_ops); | 859 | WARN_ON(get_dma_ops(&pdev->dev) != &dma_iommu_ops); |
| 860 | set_iommu_table_base(&pdev->dev, &pe->tce32_table); | 860 | set_iommu_table_base_and_group(&pdev->dev, &pe->tce32_table); |
| 861 | } | 861 | } |
| 862 | 862 | ||
| 863 | static int pnv_pci_ioda_dma_set_mask(struct pnv_phb *phb, | 863 | static int pnv_pci_ioda_dma_set_mask(struct pnv_phb *phb, |
