linux-gpio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mukesh Ojha <quic_mojha@quicinc.com>
To: <corbet@lwn.net>, <agross@kernel.org>, <andersson@kernel.org>,
	<konrad.dybcio@linaro.org>, <robh+dt@kernel.org>,
	<krzysztof.kozlowski+dt@linaro.org>, <conor+dt@kernel.org>,
	<keescook@chromium.org>, <tony.luck@intel.com>,
	<gpiccoli@igalia.com>, <mathieu.poirier@linaro.org>,
	<catalin.marinas@arm.com>, <will@kernel.org>,
	<linus.walleij@linaro.org>, <andy.shevchenko@gmail.com>
Cc: <linux-doc@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<linux-arm-msm@vger.kernel.org>, <devicetree@vger.kernel.org>,
	<linux-hardening@vger.kernel.org>,
	<linux-remoteproc@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>,
	<linux-gpio@vger.kernel.org>,
	"Mukesh Ojha" <quic_mojha@quicinc.com>
Subject: [PATCH v4 07/21] soc: qcom: minidump: Add update region support
Date: Wed, 28 Jun 2023 18:04:34 +0530	[thread overview]
Message-ID: <1687955688-20809-8-git-send-email-quic_mojha@quicinc.com> (raw)
In-Reply-To: <1687955688-20809-1-git-send-email-quic_mojha@quicinc.com>

Add support to update client's region physical/virtual addresses,
which is useful for dynamic loadable modules, dynamic address
changing clients like if we want to collect current stack
information for each core and the current stack is changing on
each sched_switch event, So here virtual/physical address of
the current stack is changing. So, to cover such use cases
add the update region support in minidump driver and the
corresponding smem backend support.

Signed-off-by: Mukesh Ojha <quic_mojha@quicinc.com>
---
 drivers/soc/qcom/qcom_minidump.c          | 55 +++++++++++++++++++++++++++++++
 drivers/soc/qcom/qcom_minidump_internal.h |  3 ++
 drivers/soc/qcom/qcom_minidump_smem.c     | 21 ++++++++++++
 include/soc/qcom/qcom_minidump.h          |  5 +++
 4 files changed, 84 insertions(+)

diff --git a/drivers/soc/qcom/qcom_minidump.c b/drivers/soc/qcom/qcom_minidump.c
index cfdb63cc29d6..37d6ceb4d85c 100644
--- a/drivers/soc/qcom/qcom_minidump.c
+++ b/drivers/soc/qcom/qcom_minidump.c
@@ -318,6 +318,61 @@ int qcom_minidump_region_unregister(const struct qcom_minidump_region *region)
 }
 EXPORT_SYMBOL_GPL(qcom_minidump_region_unregister);
 
+/**
+ * qcom_minidump_update_region() - Update region information with new physical
+ * address and virtual address for already registered region e.g, current task
+ * stack for a core keeps on changing on each context switch, there it needs to
+ * change registered region with new updated addresses.
+ *
+ * @region: Should be already registered minidump region.
+ *
+ * Return: On success, it returns 0 and negative error value on failure.
+ */
+int qcom_minidump_update_region(const struct qcom_minidump_region *region)
+{
+	struct minidump_pregion *md_pregion;
+	struct qcom_minidump_region *tmp;
+	struct elfhdr *ehdr;
+	struct elf_shdr *shdr;
+	struct elf_phdr *phdr;
+	int idx;
+	int ret = 0;
+
+	if (!qcom_minidump_valid_region(region))
+		return -EINVAL;
+
+	mutex_lock(&md_lock);
+	if (!md) {
+		md_pregion = check_if_pending_region_exist(region);
+		if (!md_pregion) {
+			ret = -ENOENT;
+			goto unlock;
+		}
+		tmp = &md_pregion->region;
+		tmp->phys_addr = region->phys_addr;
+		tmp->virt_addr = region->virt_addr;
+		goto unlock;
+	}
+
+	ret = md->ops->md_update_region(md, &idx, region);
+	if (ret)
+		goto unlock;
+
+	/* Skip predefined shdr/phdr header entry at the start */
+	ehdr = md->elf.ehdr;
+	shdr = elf_shdr_entry_addr(ehdr, idx + 4);
+	phdr = elf_phdr_entry_addr(ehdr, idx + 1);
+
+	shdr->sh_addr = (elf_addr_t)region->virt_addr;
+	phdr->p_vaddr = (elf_addr_t)region->virt_addr;
+	phdr->p_paddr = region->phys_addr;
+
+unlock:
+	mutex_unlock(&md_lock);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(qcom_minidump_update_region);
+
 static int qcom_minidump_add_elf_header(struct minidump *md_data)
 {
 	struct qcom_minidump_region elfregion;
diff --git a/drivers/soc/qcom/qcom_minidump_internal.h b/drivers/soc/qcom/qcom_minidump_internal.h
index 6993e3be10c2..dc1e76c1f063 100644
--- a/drivers/soc/qcom/qcom_minidump_internal.h
+++ b/drivers/soc/qcom/qcom_minidump_internal.h
@@ -21,6 +21,7 @@ struct minidump;
  * @md_table_exit:	  Clean up the stuff populated while md_table_init()
  * @md_region_register:	  Callback to register the region at the backend.
  * @md_region_unregister: Callback to unregister the region at the backend.
+ * @md_update_region:	  Callback to update address of already registered regions.
  */
 struct minidump_ops {
 	int (*md_table_init)(struct minidump *md);
@@ -29,6 +30,8 @@ struct minidump_ops {
 				 const struct qcom_minidump_region *region);
 	int (*md_region_unregister)(struct minidump *md,
 				 const struct qcom_minidump_region *region);
+	int (*md_update_region)(struct minidump *md, int *idx,
+                                 const struct qcom_minidump_region *region);
 };
 
 /**
diff --git a/drivers/soc/qcom/qcom_minidump_smem.c b/drivers/soc/qcom/qcom_minidump_smem.c
index bdc75aa2f518..9d4021a5e4c8 100644
--- a/drivers/soc/qcom/qcom_minidump_smem.c
+++ b/drivers/soc/qcom/qcom_minidump_smem.c
@@ -263,6 +263,26 @@ static int smem_md_region_unregister(struct minidump *md,
 	return 0;
 }
 
+static int smem_md_update_region(struct minidump *md, int *idx,
+				 const struct qcom_minidump_region *region)
+{
+	struct minidump_ss_data *mdss_data = md->apss_data;
+	struct minidump_region *mdr;
+	int ret;
+
+	ret = smem_md_get_region_index(mdss_data, region);
+	if (ret < 0) {
+		dev_err(md->dev, "%s region is not present\n", region->name);
+		return ret;
+	}
+
+	*idx = ret;
+	mdr = &mdss_data->md_regions[*idx];
+	mdr->address = cpu_to_le64(region->phys_addr);
+
+	return 0;
+}
+
 static int smem_md_table_init(struct minidump *md)
 {
 	struct minidump_global_toc *mdgtoc;
@@ -324,6 +344,7 @@ static struct minidump_ops smem_md_ops = {
 	.md_table_exit		= smem_md_table_exit,
 	.md_region_register	= smem_md_region_register,
 	.md_region_unregister	= smem_md_region_unregister,
+	.md_update_region	= smem_md_update_region,
 };
 
 static int qcom_minidump_smem_probe(struct platform_device *pdev)
diff --git a/include/soc/qcom/qcom_minidump.h b/include/soc/qcom/qcom_minidump.h
index d0bebc3daac5..a86b0313698f 100644
--- a/include/soc/qcom/qcom_minidump.h
+++ b/include/soc/qcom/qcom_minidump.h
@@ -29,6 +29,7 @@ struct qcom_minidump_region {
 #if IS_ENABLED(CONFIG_QCOM_MINIDUMP)
 int qcom_minidump_region_register(const struct qcom_minidump_region *region);
 int qcom_minidump_region_unregister(const struct qcom_minidump_region *region);
+int qcom_minidump_update_region(const struct qcom_minidump_region *region);
 #else
 static inline int qcom_minidump_region_register(const struct qcom_minidump_region *region)
 {
@@ -39,6 +40,10 @@ static inline int qcom_minidump_region_unregister(const struct qcom_minidump_reg
 {
 	return 0;
 }
+static inline int qcom_minidump_update_region(const struct qcom_minidump_region *region)
+{
+	return 0;
+}
 #endif /* CONFIG_QCOM_MINIDUMP */
 
 #if IS_ENABLED(CONFIG_QCOM_MINIDUMP_SMEM)
-- 
2.7.4


  parent reply	other threads:[~2023-06-28 12:37 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-28 12:34 [PATCH v4 00/21] Add Qualcomm Minidump kernel driver related support Mukesh Ojha
2023-06-28 12:34 ` [PATCH v4 01/21] docs: qcom: Add qualcomm minidump guide Mukesh Ojha
2023-06-28 23:21   ` Rob Herring
2023-06-28 12:34 ` [PATCH v4 02/21] kallsyms: Export kallsyms_lookup_name Mukesh Ojha
2023-06-28 13:24   ` Andy Shevchenko
2023-06-28 15:04     ` Mukesh Ojha
2023-06-28 13:53   ` Pavan Kondeti
2023-06-28 15:22     ` Mukesh Ojha
2023-06-28 15:32       ` Will Deacon
2023-06-28 15:43         ` Greg KH
2023-06-28 12:34 ` [PATCH v4 03/21] soc: qcom: Add qcom_minidump_smem module Mukesh Ojha
2023-06-28 13:31   ` Andy Shevchenko
2023-06-28 15:47   ` Greg KH
2023-06-28 12:34 ` [PATCH v4 04/21] soc: qcom: Add Qualcomm APSS minidump (frontend) feature support Mukesh Ojha
2023-06-28 13:43   ` Andy Shevchenko
2023-06-29  2:33   ` Pavan Kondeti
2023-06-30  7:15     ` Mukesh Ojha
2023-06-30  8:38       ` Pavan Kondeti
2023-06-28 12:34 ` [PATCH v4 05/21] soc: qcom: Add linux minidump smem backend driver support Mukesh Ojha
2023-06-28 13:51   ` Andy Shevchenko
2023-06-28 12:34 ` [PATCH v4 06/21] soc: qcom: minidump: Add pending region registration support Mukesh Ojha
2023-06-28 12:34 ` Mukesh Ojha [this message]
2023-06-29  2:49   ` [PATCH v4 07/21] soc: qcom: minidump: Add update region support Pavan Kondeti
2023-06-28 12:34 ` [PATCH v4 08/21] dt-bindings: reserved-memory: Add qcom,ramoops binding Mukesh Ojha
2023-06-28 14:10   ` Pavan Kondeti
2023-06-28 23:17     ` Rob Herring
2023-06-29  1:45       ` Pavan Kondeti
2023-06-28 14:47   ` Rob Herring
2023-06-28 15:01     ` Mukesh Ojha
2023-07-02  8:12       ` Krzysztof Kozlowski
2023-07-03  6:21         ` Mukesh Ojha
2023-07-03  7:20           ` Krzysztof Kozlowski
2023-07-03 15:55             ` Mukesh Ojha
2023-07-04  5:57               ` Krzysztof Kozlowski
2023-07-19 10:29                 ` Luca Stefani
2023-06-28 12:34 ` [PATCH v4 09/21] pstore/ram : Export ramoops_parse_dt() symbol Mukesh Ojha
2023-06-28 12:34 ` [PATCH v4 10/21] soc: qcom: Add qcom's pstore minidump driver support Mukesh Ojha
2023-06-28 22:57   ` Rob Herring
2023-06-29  9:16     ` Mukesh Ojha
2023-07-05 23:27       ` Rob Herring
2023-06-28 12:34 ` [PATCH v4 11/21] soc: qcom: Register pstore frontend region with minidump Mukesh Ojha
2023-06-30  4:55   ` Pavan Kondeti
2023-06-30  9:25     ` Andy Shevchenko
2023-06-28 12:34 ` [PATCH v4 12/21] remoteproc: qcom: Expand MD_* as MINIDUMP_* Mukesh Ojha
2023-06-28 12:34 ` [PATCH v4 13/21] remoterproc: qcom: refactor to leverage exported minidump symbol Mukesh Ojha
2023-06-28 15:51   ` Pavan Kondeti
2023-06-29  9:20     ` Mukesh Ojha
2023-06-30  3:41       ` Pavan Kondeti
2023-06-28 12:34 ` [PATCH v4 14/21] MAINTAINERS: Add entry for minidump driver related support Mukesh Ojha
2023-06-28 12:34 ` [PATCH v4 15/21] arm64: defconfig: Enable Qualcomm Minidump related drivers Mukesh Ojha
2023-06-28 12:34 ` [PATCH v4 16/21] arm64: dts: qcom: sm8450: Add Qualcomm ramoops minidump node Mukesh Ojha
2023-06-28 12:34 ` [PATCH v4 17/21] firmware: qcom_scm: provide a read-modify-write function Mukesh Ojha
2023-06-30  5:01   ` Pavan Kondeti
2023-06-28 12:34 ` [PATCH v4 18/21] pinctrl: qcom: Use qcom_scm_io_update_field() Mukesh Ojha
2023-06-28 13:44   ` Andy Shevchenko
2023-06-30 14:58     ` Mukesh Ojha
2023-06-28 12:34 ` [PATCH v4 19/21] firmware: scm: Modify only the download bits in TCSR register Mukesh Ojha
2023-06-28 15:20   ` Konrad Dybcio
2023-06-30 14:57     ` Mukesh Ojha
2023-06-28 12:34 ` [PATCH v4 20/21] firmware: qcom_scm: Refactor code to support multiple download mode Mukesh Ojha
2023-06-30  5:25   ` Pavan Kondeti
2023-06-30  9:28     ` Andy Shevchenko
2023-06-28 12:34 ` [PATCH v4 21/21] firmware: qcom_scm: Add multiple download mode support Mukesh Ojha
2023-06-28 15:45 ` [PATCH v4 00/21] Add Qualcomm Minidump kernel driver related support Greg KH
2023-06-28 16:20   ` Mukesh Ojha
2023-06-28 16:53     ` Greg KH
2023-06-28 23:12   ` Rob Herring
2023-06-30 16:04     ` Mukesh Ojha
2023-07-02  8:29       ` Krzysztof Kozlowski
2023-07-03 21:05         ` Trilok Soni
2023-07-06 17:20           ` Mathieu Poirier
2023-07-18 15:03             ` Mukesh Ojha
2023-08-07 13:46               ` Mukesh Ojha
2023-07-06 17:40           ` Rob Herring
2023-07-06 18:07             ` Trilok Soni
2023-08-10 16:47             ` Mukesh Ojha
2023-07-04  9:27     ` Linus Walleij
2023-07-05 17:29       ` Trilok Soni
2023-07-14 23:45         ` Trilok Soni
2023-07-18  5:47           ` Mukesh Ojha
2023-07-18 13:35             ` Greg KH
2023-07-18 13:55               ` Mukesh Ojha
2023-07-18 14:41                 ` Greg KH
2023-07-18 16:22                   ` Trilok Soni
2023-07-02  8:08 ` Krzysztof Kozlowski
2023-07-13  4:39 ` Kathiravan T
2023-07-14 15:25   ` Mukesh Ojha

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=1687955688-20809-8-git-send-email-quic_mojha@quicinc.com \
    --to=quic_mojha@quicinc.com \
    --cc=agross@kernel.org \
    --cc=andersson@kernel.org \
    --cc=andy.shevchenko@gmail.com \
    --cc=catalin.marinas@arm.com \
    --cc=conor+dt@kernel.org \
    --cc=corbet@lwn.net \
    --cc=devicetree@vger.kernel.org \
    --cc=gpiccoli@igalia.com \
    --cc=keescook@chromium.org \
    --cc=konrad.dybcio@linaro.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-hardening@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=mathieu.poirier@linaro.org \
    --cc=robh+dt@kernel.org \
    --cc=tony.luck@intel.com \
    --cc=will@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).