linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: <pillair@codeaurora.org>
To: <ath10k@lists.infradead.org>
Cc: <linux-wireless@vger.kernel.org>, <devicetree@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>
Subject: RE: [PATCH v2 3/3] ath10k: Add support for targets without trustzone
Date: Wed, 15 Apr 2020 23:03:35 +0530	[thread overview]
Message-ID: <001401d6134c$01b5c420$05214c60$@codeaurora.org> (raw)
In-Reply-To: <1585134100-5944-4-git-send-email-pillair@codeaurora.org>

Hi Kalle,

I have sent out v3 for this patchset after correcting the firmware structure
name which was added in ath10k snoc structure

Thanks,
Rakesh Pillai.

> -----Original Message-----
> From: Rakesh Pillai <pillair@codeaurora.org>
> Sent: Wednesday, March 25, 2020 4:32 PM
> To: ath10k@lists.infradead.org
> Cc: linux-wireless@vger.kernel.org; devicetree@vger.kernel.org; linux-
> kernel@vger.kernel.org; Rakesh Pillai <pillair@codeaurora.org>
> Subject: [PATCH v2 3/3] ath10k: Add support for targets without trustzone
> 
> Add the support to attach and map iommu
> domain for targets which do not have the
> support of TrustZone.
> 
> Tested HW: WCN3990
> Tested FW: WLAN.HL.3.1-01040-QCAHLSWMTPLZ-1
> 
> Signed-off-by: Rakesh Pillai <pillair@codeaurora.org>
> ---
>  drivers/net/wireless/ath/ath10k/snoc.c | 118
> ++++++++++++++++++++++++++++++++-
>  drivers/net/wireless/ath/ath10k/snoc.h |   7 ++
>  2 files changed, 124 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/wireless/ath/ath10k/snoc.c
> b/drivers/net/wireless/ath/ath10k/snoc.c
> index 3633ea5..7a7e79b 100644
> --- a/drivers/net/wireless/ath/ath10k/snoc.c
> +++ b/drivers/net/wireless/ath/ath10k/snoc.c
> @@ -12,6 +12,7 @@
>  #include <linux/property.h>
>  #include <linux/regulator/consumer.h>
>  #include <linux/of_address.h>
> +#include <linux/iommu.h>
> 
>  #include "ce.h"
>  #include "coredump.h"
> @@ -1499,6 +1500,111 @@ static int ath10k_setup_msa_resources(struct
> ath10k *ar, u32 msa_size)
>  	return 0;
>  }
> 
> +static int ath10k_fw_init(struct ath10k *ar)
> +{
> +	struct ath10k_snoc *ar_snoc = ath10k_snoc_priv(ar);
> +	struct device *host_dev = &ar_snoc->dev->dev;
> +	struct platform_device_info info;
> +	struct iommu_domain *iommu_dom;
> +	struct platform_device *pdev;
> +	struct device_node *node;
> +	int ret;
> +
> +	node = of_get_child_by_name(host_dev->of_node, "wifi-
> firmware");
> +	if (!node) {
> +		ar_snoc->use_tz = true;
> +		return 0;
> +	}
> +
> +	memset(&info, 0, sizeof(info));
> +	info.fwnode = &node->fwnode;
> +	info.parent = host_dev;
> +	info.name = node->name;
> +	info.dma_mask = DMA_BIT_MASK(32);
> +
> +	pdev = platform_device_register_full(&info);
> +	if (IS_ERR(pdev)) {
> +		of_node_put(node);
> +		return PTR_ERR(pdev);
> +	}
> +
> +	pdev->dev.of_node = node;
> +
> +	ret = of_dma_configure(&pdev->dev, node, true);
> +	if (ret) {
> +		ath10k_err(ar, "dma configure fail: %d\n", ret);
> +		goto err_unregister;
> +	}
> +
> +	ar_snoc->fw.dev = &pdev->dev;
> +
> +	iommu_dom = iommu_domain_alloc(&platform_bus_type);
> +	if (!iommu_dom) {
> +		ath10k_err(ar, "failed to allocate iommu domain\n");
> +		ret = -ENOMEM;
> +		goto err_unregister;
> +	}
> +
> +	ret = iommu_attach_device(iommu_dom, ar_snoc->fw.dev);
> +	if (ret) {
> +		ath10k_err(ar, "could not attach device: %d\n", ret);
> +		goto err_iommu_free;
> +	}
> +
> +	ar_snoc->fw.iommu_domain = iommu_dom;
> +	ar_snoc->fw.fw_start_addr = ar->msa.paddr;
> +
> +	ret = iommu_map(iommu_dom, ar_snoc->fw.fw_start_addr,
> +			ar->msa.paddr, ar->msa.mem_size,
> +			IOMMU_READ | IOMMU_WRITE);
> +	if (ret) {
> +		ath10k_err(ar, "failed to map firmware region: %d\n", ret);
> +		goto err_iommu_detach;
> +	}
> +
> +	of_node_put(node);
> +
> +	return 0;
> +
> +err_iommu_detach:
> +	iommu_detach_device(iommu_dom, ar_snoc->fw.dev);
> +
> +err_iommu_free:
> +	iommu_domain_free(iommu_dom);
> +
> +err_unregister:
> +	platform_device_unregister(pdev);
> +	of_node_put(node);
> +
> +	return ret;
> +}
> +
> +static int ath10k_fw_deinit(struct ath10k *ar)
> +{
> +	struct ath10k_snoc *ar_snoc = ath10k_snoc_priv(ar);
> +	const size_t mapped_size = ar_snoc->fw.mapped_mem_size;
> +	struct iommu_domain *iommu;
> +	size_t unmapped_size;
> +
> +	if (ar_snoc->use_tz)
> +		return 0;
> +
> +	iommu = ar_snoc->fw.iommu_domain;
> +
> +	unmapped_size = iommu_unmap(iommu, ar_snoc-
> >fw.fw_start_addr,
> +				    mapped_size);
> +	if (unmapped_size != mapped_size)
> +		ath10k_err(ar, "failed to unmap firmware: %zu\n",
> +			   unmapped_size);
> +
> +	iommu_detach_device(iommu, ar_snoc->fw.dev);
> +	iommu_domain_free(iommu);
> +
> +	platform_device_unregister(to_platform_device(ar_snoc->fw.dev));
> +
> +	return 0;
> +}
> +
>  static const struct of_device_id ath10k_snoc_dt_match[] = {
>  	{ .compatible = "qcom,wcn3990-wifi",
>  	 .data = &drv_priv,
> @@ -1607,16 +1713,25 @@ static int ath10k_snoc_probe(struct
> platform_device *pdev)
>  		goto err_power_off;
>  	}
> 
> +	ret = ath10k_fw_init(ar);
> +	if (ret) {
> +		ath10k_err(ar, "failed to initialize firmware: %d\n", ret);
> +		goto err_power_off;
> +	}
> +
>  	ret = ath10k_qmi_init(ar, msa_size);
>  	if (ret) {
>  		ath10k_warn(ar, "failed to register wlfw qmi client: %d\n",
> ret);
> -		goto err_power_off;
> +		goto err_fw_deinit;
>  	}
> 
>  	ath10k_dbg(ar, ATH10K_DBG_SNOC, "snoc probe\n");
> 
>  	return 0;
> 
> +err_fw_deinit:
> +	ath10k_fw_deinit(ar);
> +
>  err_power_off:
>  	ath10k_hw_power_off(ar);
> 
> @@ -1648,6 +1763,7 @@ static int ath10k_snoc_remove(struct
> platform_device *pdev)
> 
>  	ath10k_core_unregister(ar);
>  	ath10k_hw_power_off(ar);
> +	ath10k_fw_deinit(ar);
>  	ath10k_snoc_free_irq(ar);
>  	ath10k_snoc_release_resource(ar);
>  	ath10k_qmi_deinit(ar);
> diff --git a/drivers/net/wireless/ath/ath10k/snoc.h
> b/drivers/net/wireless/ath/ath10k/snoc.h
> index c05df45..18e19fb 100644
> --- a/drivers/net/wireless/ath/ath10k/snoc.h
> +++ b/drivers/net/wireless/ath/ath10k/snoc.h
> @@ -55,6 +55,13 @@ struct regulator_bulk_data;
>  struct ath10k_snoc {
>  	struct platform_device *dev;
>  	struct ath10k *ar;
> +	unsigned int use_tz;
> +	struct video_firmware {
> +		struct device *dev;
> +		dma_addr_t fw_start_addr;
> +		struct iommu_domain *iommu_domain;
> +		size_t mapped_mem_size;
> +	} fw;
>  	void __iomem *mem;
>  	dma_addr_t mem_pa;
>  	struct ath10k_snoc_target_info target_info;
> --
> 2.7.4


      reply	other threads:[~2020-04-15 17:35 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-25 11:01 [PATCH v2 0/3] Add support to handle targets without TrustZone Rakesh Pillai
2020-03-25 11:01 ` [PATCH v2 1/3] dt-bindings: ath10k: Add wifi-firmware subnode for wifi node Rakesh Pillai
2020-03-31 21:40   ` Rob Herring
2020-04-01  7:30     ` pillair
2020-03-25 11:01 ` [PATCH v2 2/3] ath10k: Setup the msa resources before qmi init Rakesh Pillai
2020-03-25 11:01 ` [PATCH v2 3/3] ath10k: Add support for targets without trustzone Rakesh Pillai
2020-04-15 17:33   ` pillair [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='001401d6134c$01b5c420$05214c60$@codeaurora.org' \
    --to=pillair@codeaurora.org \
    --cc=ath10k@lists.infradead.org \
    --cc=devicetree@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-wireless@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).