Commit 1085c258 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'grab-ipa-imem-slice-through-dt'

Konrad Dybcio says:

====================
Grab IPA IMEM slice through DT

This adds the necessary driver change to migrate over from
hardcoded-per-IPA-version-but-varying-per-implementation numbers, while
unfortunately keeping them in there for backwards compatibility.

The DT changes will be submitted in a separate series, this one is OK
to merge independently.
====================

Link: https://patch.msgid.link/20260302-topic-ipa_imem-v6-0-c0ebbf3eae9f@oss.qualcomm.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents acd338ba 6f82cb4e
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -165,6 +165,13 @@ properties:
      initializing IPA hardware.  Optional, and only used when
      Trust Zone performs early initialization.

  sram:
    maxItems: 1
    description:
      A reference to an additional region residing in IMEM (special
      on-chip SRAM), which is accessed by the IPA firmware and needs
      to be IOMMU-mapped from the OS.

required:
  - compatible
  - iommus
+14 −0
Original line number Diff line number Diff line
@@ -67,6 +67,20 @@ properties:
    $ref: /schemas/power/reset/syscon-reboot-mode.yaml#

patternProperties:
  "^modem-tables@[0-9a-f]+$":
    type: object
    description:
      Region containing packet processing configuration for the IP Accelerator.

    properties:
      reg:
        maxItems: 1

    required:
      - reg

    additionalProperties: false

  "^pil-reloc@[0-9a-f]+$":
    $ref: /schemas/remoteproc/qcom,pil-info.yaml#
    description: Peripheral image loader relocation region
+7 −2
Original line number Diff line number Diff line
@@ -185,8 +185,13 @@ struct ipa_resource_data {
struct ipa_mem_data {
	u32 local_count;
	const struct ipa_mem *local;
	u32 imem_addr;
	u32 imem_size;

	/* These values are now passed via DT, but to support
	 * older systems we must allow this to be specified here.
	 */
	u32 imem_addr; /* DEPRECATED */
	u32 imem_size; /* DEPRECATED */

	u32 smem_size;
};

+23 −1
Original line number Diff line number Diff line
@@ -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,7 +659,26 @@ int ipa_mem_init(struct ipa *ipa, struct platform_device *pdev,
	ipa->mem_addr = res->start;
	ipa->mem_size = resource_size(res);

	ret = ipa_imem_init(ipa, mem_data->imem_addr, mem_data->imem_size);
	ipa_slice_np = of_parse_phandle(dev->of_node, "sram", 0);
	if (ipa_slice_np) {
		struct resource sram_res;

		ret = of_address_to_resource(ipa_slice_np, 0, &sram_res);
		of_node_put(ipa_slice_np);
		if (ret)
			goto err_unmap;

		imem_base = sram_res.start;
		imem_size = resource_size(&sram_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, imem_base, imem_size);
	if (ret)
		goto err_unmap;