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 06/21] soc: qcom: minidump: Add pending region registration support
Date: Wed, 28 Jun 2023 18:04:33 +0530 [thread overview]
Message-ID: <1687955688-20809-7-git-send-email-quic_mojha@quicinc.com> (raw)
In-Reply-To: <1687955688-20809-1-git-send-email-quic_mojha@quicinc.com>
Pending regions are those apss minidump regions which came for
registration before minidump was initialized or ready to do
register the region.
We can add regions to pending region list and register them from
apss minidump driver probe in one go.
Signed-off-by: Mukesh Ojha <quic_mojha@quicinc.com>
---
drivers/soc/qcom/qcom_minidump.c | 87 ++++++++++++++++++++++++++++---
drivers/soc/qcom/qcom_minidump_internal.h | 20 +++++++
2 files changed, 99 insertions(+), 8 deletions(-)
diff --git a/drivers/soc/qcom/qcom_minidump.c b/drivers/soc/qcom/qcom_minidump.c
index 7744e57843ab..cfdb63cc29d6 100644
--- a/drivers/soc/qcom/qcom_minidump.c
+++ b/drivers/soc/qcom/qcom_minidump.c
@@ -9,6 +9,7 @@
#include <linux/export.h>
#include <linux/kallsyms.h>
#include <linux/kernel.h>
+#include <linux/list.h>
#include <linux/module.h>
#include <linux/printk.h>
#include <linux/string.h>
@@ -35,6 +36,10 @@ static DEFINE_MUTEX(md_lock);
/* Only one front end will be attached to one back-end */
static struct minidump *md;
static char *md_backend;
+static struct minidump_plist md_plist = {
+ .plist = LIST_HEAD_INIT(md_plist.plist),
+ .pregion_cnt = 0,
+};
static struct elf_shdr *elf_shdr_entry_addr(struct elfhdr *ehdr, int idx)
{
@@ -201,6 +206,26 @@ static bool qcom_minidump_valid_region(const struct qcom_minidump_region *region
IS_ALIGNED(region->size, 4);
}
+static struct minidump_pregion *
+check_if_pending_region_exist(const struct qcom_minidump_region *region)
+{
+ struct minidump_pregion *md_pregion;
+ struct minidump_pregion *tmp;
+ bool found = false;
+
+ list_for_each_entry_safe(md_pregion, tmp, &md_plist.plist, list) {
+ struct qcom_minidump_region *md_region;
+
+ md_region = &md_pregion->region;
+ if (!strcmp(md_region->name, region->name)) {
+ found = true;
+ break;
+ }
+ }
+
+ return found ? md_pregion : NULL;
+}
+
/**
* qcom_minidump_region_register() - Register region in APSS Minidump table.
* @region: minidump region.
@@ -209,16 +234,40 @@ static bool qcom_minidump_valid_region(const struct qcom_minidump_region *region
*/
int qcom_minidump_region_register(const struct qcom_minidump_region *region)
{
- int ret;
+ struct minidump_pregion *md_pregion;
+ int ret = 0;
if (!qcom_minidump_valid_region(region))
return -EINVAL;
mutex_lock(&md_lock);
if (!md) {
- mutex_unlock(&md_lock);
- pr_err("No backend registered yet, try again..");
- return -EPROBE_DEFER;
+ if (md_plist.pregion_cnt >= MAX_NUM_ENTRIES - 1) {
+ pr_err("maximum region limit %u reached\n", md_plist.pregion_cnt);
+ ret = -ENOSPC;
+ goto unlock;
+ }
+
+ md_pregion = check_if_pending_region_exist(region);
+ if (md_pregion) {
+ pr_info("%s region is already exist\n", region->name);
+ ret = -EEXIST;
+ goto unlock;
+ }
+ /*
+ * Maintain a list of client regions which came before
+ * minidump driver was ready and once it is ready,
+ * register them in one go from minidump probe function.
+ */
+ md_pregion = kzalloc(sizeof(*md_pregion), GFP_KERNEL);
+ if (!md_pregion) {
+ ret = -ENOMEM;
+ goto unlock;
+ }
+ md_pregion->region = *region;
+ list_add_tail(&md_pregion->list, &md_plist.plist);
+ md_plist.pregion_cnt++;
+ goto unlock;
}
ret = md->ops->md_region_register(md, region);
@@ -240,16 +289,22 @@ EXPORT_SYMBOL_GPL(qcom_minidump_region_register);
*/
int qcom_minidump_region_unregister(const struct qcom_minidump_region *region)
{
- int ret;
+ struct minidump_pregion *md_pregion;
+ int ret = 0;
if (!qcom_minidump_valid_region(region))
return -EINVAL;
mutex_lock(&md_lock);
if (!md) {
- mutex_unlock(&md_lock);
- pr_err("No backend registered yet, try again..");
- return -EPROBE_DEFER;
+ md_pregion = check_if_pending_region_exist(region);
+ if (!md_pregion)
+ goto unlock;
+
+ list_del(&md_pregion->list);
+ kfree(md_pregion);
+ md_plist.pregion_cnt--;
+ goto unlock;
}
ret = md->ops->md_region_unregister(md, region);
@@ -378,6 +433,8 @@ static int qcom_minidump_add_elf_header(struct minidump *md_data)
*/
int qcom_minidump_backend_register(struct minidump *md_data)
{
+ struct minidump_pregion *md_pregion;
+ struct minidump_pregion *tmp;
int ret;
if (!md_data->name || !md_data->dev ||
@@ -425,6 +482,20 @@ int qcom_minidump_backend_register(struct minidump *md_data)
md_backend = kstrdup(md->name, GFP_KERNEL);
dev_info(md->dev, "Registered minidump backend : %s\n", md->name);
+ list_for_each_entry_safe(md_pregion, tmp, &md_plist.plist, list) {
+ struct qcom_minidump_region *region;
+
+ region = &md_pregion->region;
+ ret = md->ops->md_region_register(md, region);
+ if (ret)
+ goto unlock;
+
+ qcom_md_update_elf_header(region);
+ list_del(&md_pregion->list);
+ kfree(md_pregion);
+ md_plist.pregion_cnt--;
+ }
+
unlock:
mutex_unlock(&md_lock);
return ret;
diff --git a/drivers/soc/qcom/qcom_minidump_internal.h b/drivers/soc/qcom/qcom_minidump_internal.h
index 9031b1b0a046..6993e3be10c2 100644
--- a/drivers/soc/qcom/qcom_minidump_internal.h
+++ b/drivers/soc/qcom/qcom_minidump_internal.h
@@ -65,6 +65,26 @@ struct minidump {
void *apss_data;
};
+/**
+ * struct minidump_pregion - Minidump pending region
+ * @list : Pending region list pointer
+ * @region : APSS minidump client region
+ */
+struct minidump_pregion {
+ struct list_head list;
+ struct qcom_minidump_region region;
+};
+
+/**
+ * struct minidump_plist - Minidump pending region list
+ * @plist : List of pending region to be registered
+ * @pregion_cnt : Count of the pending region to be registered
+ */
+struct minidump_plist {
+ struct list_head plist;
+ int pregion_cnt;
+};
+
#if IS_ENABLED(CONFIG_QCOM_MINIDUMP)
int qcom_minidump_backend_register(struct minidump *md);
void qcom_minidump_backend_unregister(struct minidump *md);
--
2.7.4
next prev parent reply other threads:[~2023-06-28 12:36 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 ` Mukesh Ojha [this message]
2023-06-28 12:34 ` [PATCH v4 07/21] soc: qcom: minidump: Add update region support Mukesh Ojha
2023-06-29 2:49 ` 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-7-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).