|
@@ -1490,3 +1490,62 @@ int pld_athdiag_write(struct device *dev, uint32_t offset,
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pld_smmu_get_mapping() - Get SMMU mapping context
|
|
|
+ * @dev: device
|
|
|
+ *
|
|
|
+ * Return: Pointer to the mapping context
|
|
|
+ */
|
|
|
+void *pld_smmu_get_mapping(struct device *dev)
|
|
|
+{
|
|
|
+ void *ptr = NULL;
|
|
|
+ enum pld_bus_type type = pld_get_bus_type(dev);
|
|
|
+
|
|
|
+ switch (type) {
|
|
|
+ case PLD_BUS_TYPE_SNOC:
|
|
|
+ ptr = pld_snoc_smmu_get_mapping(dev);
|
|
|
+ break;
|
|
|
+ case PLD_BUS_TYPE_PCIE:
|
|
|
+ pr_err("Not supported on type %d\n", type);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ pr_err("Invalid device type %d\n", type);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ptr;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pld_smmu_map() - Map SMMU
|
|
|
+ * @dev: device
|
|
|
+ * @paddr: physical address that needs to map to
|
|
|
+ * @iova_addr: IOVA address
|
|
|
+ * @size: size to be mapped
|
|
|
+ *
|
|
|
+ * Return: 0 for success
|
|
|
+ * Non zero failure code for errors
|
|
|
+ */
|
|
|
+int pld_smmu_map(struct device *dev, phys_addr_t paddr,
|
|
|
+ uint32_t *iova_addr, size_t size)
|
|
|
+{
|
|
|
+ int ret = 0;
|
|
|
+ enum pld_bus_type type = pld_get_bus_type(dev);
|
|
|
+
|
|
|
+ switch (type) {
|
|
|
+ case PLD_BUS_TYPE_SNOC:
|
|
|
+ ret = pld_snoc_smmu_map(dev, paddr, iova_addr, size);
|
|
|
+ break;
|
|
|
+ case PLD_BUS_TYPE_PCIE:
|
|
|
+ pr_err("Not supported on type %d\n", type);
|
|
|
+ ret = -ENODEV;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ pr_err("Invalid device type %d\n", type);
|
|
|
+ ret = -EINVAL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|