@@ -185,8 +185,11 @@ struct ipa_resource_data {
struct ipa_mem_data {
u32 local_count;
const struct ipa_mem *local;
+
+ /* DEPRECATED (now passed via DT) fallback data, varies per chip and not per IPA version */
u32 imem_addr;
u32 imem_size;
+
u32 smem_size;
};
@@ -7,6 +7,7 @@
#include <linux/dma-mapping.h>
#include <linux/io.h>
#include <linux/iommu.h>
+#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/types.h>
@@ -617,7 +618,9 @@ static void ipa_smem_exit(struct ipa *ipa)
int ipa_mem_init(struct ipa *ipa, struct platform_device *pdev,
const struct ipa_mem_data *mem_data)
{
+ struct device_node *ipa_slice_np;
struct device *dev = &pdev->dev;
+ u32 imem_base, imem_size;
struct resource *res;
int ret;
@@ -656,6 +659,21 @@ int ipa_mem_init(struct ipa *ipa, struct platform_device *pdev,
ipa->mem_addr = res->start;
ipa->mem_size = resource_size(res);
+ ipa_slice_np = of_parse_phandle(dev->of_node, "sram", 0);
+ if (ipa_slice_np) {
+ ret = of_address_to_resource(ipa_slice_np, 0, res);
+ of_node_put(ipa_slice_np);
+ if (ret)
+ return ret;
+
+ imem_base = res->start;
+ imem_size = resource_size(res);
+ } else {
+ /* Backwards compatibility for DTs lacking an explicit reference */
+ imem_base = mem_data->imem_addr;
+ imem_size = mem_data->imem_size;
+ }
+
ret = ipa_imem_init(ipa, mem_data->imem_addr, mem_data->imem_size);
if (ret)
goto err_unmap;