From: Mukesh Ojha <quic_mojha@quicinc.com> To: <corbet@lwn.net>, <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>, <vigneshr@ti.com>, <nm@ti.com>, <matthias.bgg@gmail.com>, <kgene@kernel.org>, <alim.akhtar@samsung.com>, <bmasney@redhat.com> Cc: <linux-doc@vger.kernel.org>, <linux-kernel@vger.kernel.org>, <linux-arm-msm@vger.kernel.org>, <linux-hardening@vger.kernel.org>, <linux-remoteproc@vger.kernel.org>, <linux-arm-kernel@lists.infradead.org>, <linux-mediatek@lists.infradead.org>, <linux-samsung-soc@vger.kernel.org>, <kernel@quicinc.com>, <quic_mojha@quicinc.com> Subject: [PATCH v8 10/10] soc: qcom: register ramoops region with APSS minidump Date: Wed, 31 Jan 2024 16:38:37 +0530 [thread overview] Message-ID: <20240131110837.14218-11-quic_mojha@quicinc.com> (raw) In-Reply-To: <20240131110837.14218-1-quic_mojha@quicinc.com> Register ramoops region with APSS minidump via ramoops info notifier so that these region gets captured on system crash. Signed-off-by: Mukesh Ojha <quic_mojha@quicinc.com> --- drivers/soc/qcom/qcom_minidump.c | 84 ++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/drivers/soc/qcom/qcom_minidump.c b/drivers/soc/qcom/qcom_minidump.c index c0f76a51d0e8..7ca43d938b13 100644 --- a/drivers/soc/qcom/qcom_minidump.c +++ b/drivers/soc/qcom/qcom_minidump.c @@ -18,8 +18,10 @@ #include <linux/mutex.h> #include <linux/platform_device.h> #include <linux/printk.h> +#include <linux/pstore_ram.h> #include <linux/soc/qcom/smem.h> #include <linux/string.h> +#include <linux/workqueue.h> #include <soc/qcom/qcom_minidump.h> #include "qcom_minidump_internal.h" @@ -56,12 +58,22 @@ struct minidump_elfhdr { * @dev: Minidump backend device * @apss_data: APSS driver data * @md_lock: Lock to protect access to APSS minidump table + * @work: Minidump work for any required execution in process context. + * @nb_cookie: Save the cookie, will be used for unregistering the callback. */ struct minidump { struct minidump_elfhdr elf; struct device *dev; struct minidump_ss_data *apss_data; struct mutex md_lock; + struct work_struct work; + void *nb_cookie; +}; + +static LIST_HEAD(apss_md_rlist); +struct md_region_list { + struct qcom_minidump_region md_region; + struct list_head list; }; /* @@ -530,6 +542,58 @@ static int qcom_apss_md_table_init(struct minidump *md, return 0; } +static int register_ramoops_region(const char *name, int id, void *vaddr, + phys_addr_t paddr, size_t size) +{ + struct qcom_minidump_region *md_region; + struct md_region_list *mdr_list; + int ret; + + mdr_list = kzalloc(sizeof(*mdr_list), GFP_KERNEL); + if (!mdr_list) + return -ENOMEM; + + md_region = &mdr_list->md_region; + scnprintf(md_region->name, sizeof(md_region->name), "K%s%d", name, id); + md_region->virt_addr = vaddr; + md_region->phys_addr = paddr; + md_region->size = size; + ret = qcom_minidump_region_register(md_region); + if (ret < 0) { + pr_err("failed to register region in minidump: err: %d\n", ret); + return ret; + } + + list_add(&mdr_list->list, &apss_md_rlist); + + return 0; +} + +static void register_ramoops_minidump_cb(struct work_struct *work) +{ + struct minidump *md = container_of(work, struct minidump, work); + + md->nb_cookie = register_ramoops_info_notifier(register_ramoops_region); + if (IS_ERR_OR_NULL(md->nb_cookie)) { + pr_err("Fail to register ramoops info notifier\n"); + md->nb_cookie = NULL; + } +} + +static void qcom_ramoops_minidump_unregister(void) +{ + struct md_region_list *mdr_list; + struct md_region_list *tmp; + + list_for_each_entry_safe(mdr_list, tmp, &apss_md_rlist, list) { + struct qcom_minidump_region *region; + + region = &mdr_list->md_region; + qcom_minidump_region_unregister(region); + list_del(&mdr_list->list); + } +} + static void qcom_apss_md_table_exit(struct minidump_ss_data *mdss_data) { memset(mdss_data->md_ss_toc, cpu_to_le32(0), sizeof(*mdss_data->md_ss_toc)); @@ -575,6 +639,22 @@ static int qcom_apss_minidump_probe(struct platform_device *pdev) platform_set_drvdata(pdev, md); + /* + * Use separate context for registering ramoops region via workqueue + * as minidump probe can get called in same context of platform device + * register call from smem driver and further call to qcom_smem_minidump_ready() + * can return -EPROBE_DEFER as __smem->minidump is not yet initialized because + * of same context and it can only initialized after return from probe. + * + * qcom_apss_minidump_probe() + * register_ramoops_minidump_cb() + * register_ramoops_region() + * qcom_minidump_region_register() + * qcom_smem_minidump_ready() + */ + INIT_WORK(&md->work, register_ramoops_minidump_cb); + schedule_work(&md->work); + return ret; } @@ -582,6 +662,10 @@ static void qcom_apss_minidump_remove(struct platform_device *pdev) { struct minidump *md = platform_get_drvdata(pdev); + flush_work(&md->work); + qcom_ramoops_minidump_unregister(); + if (md->nb_cookie) + unregister_ramoops_info_notifier(md->nb_cookie); qcom_apss_md_table_exit(md->apss_data); } -- 2.43.0.254.ga26002b62827
WARNING: multiple messages have this Message-ID (diff)
From: Mukesh Ojha <quic_mojha@quicinc.com> To: <corbet@lwn.net>, <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>, <vigneshr@ti.com>, <nm@ti.com>, <matthias.bgg@gmail.com>, <kgene@kernel.org>, <alim.akhtar@samsung.com>, <bmasney@redhat.com> Cc: <linux-doc@vger.kernel.org>, <linux-kernel@vger.kernel.org>, <linux-arm-msm@vger.kernel.org>, <linux-hardening@vger.kernel.org>, <linux-remoteproc@vger.kernel.org>, <linux-arm-kernel@lists.infradead.org>, <linux-mediatek@lists.infradead.org>, <linux-samsung-soc@vger.kernel.org>, <kernel@quicinc.com>, <quic_mojha@quicinc.com> Subject: [PATCH v8 10/10] soc: qcom: register ramoops region with APSS minidump Date: Wed, 31 Jan 2024 16:38:37 +0530 [thread overview] Message-ID: <20240131110837.14218-11-quic_mojha@quicinc.com> (raw) In-Reply-To: <20240131110837.14218-1-quic_mojha@quicinc.com> Register ramoops region with APSS minidump via ramoops info notifier so that these region gets captured on system crash. Signed-off-by: Mukesh Ojha <quic_mojha@quicinc.com> --- drivers/soc/qcom/qcom_minidump.c | 84 ++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/drivers/soc/qcom/qcom_minidump.c b/drivers/soc/qcom/qcom_minidump.c index c0f76a51d0e8..7ca43d938b13 100644 --- a/drivers/soc/qcom/qcom_minidump.c +++ b/drivers/soc/qcom/qcom_minidump.c @@ -18,8 +18,10 @@ #include <linux/mutex.h> #include <linux/platform_device.h> #include <linux/printk.h> +#include <linux/pstore_ram.h> #include <linux/soc/qcom/smem.h> #include <linux/string.h> +#include <linux/workqueue.h> #include <soc/qcom/qcom_minidump.h> #include "qcom_minidump_internal.h" @@ -56,12 +58,22 @@ struct minidump_elfhdr { * @dev: Minidump backend device * @apss_data: APSS driver data * @md_lock: Lock to protect access to APSS minidump table + * @work: Minidump work for any required execution in process context. + * @nb_cookie: Save the cookie, will be used for unregistering the callback. */ struct minidump { struct minidump_elfhdr elf; struct device *dev; struct minidump_ss_data *apss_data; struct mutex md_lock; + struct work_struct work; + void *nb_cookie; +}; + +static LIST_HEAD(apss_md_rlist); +struct md_region_list { + struct qcom_minidump_region md_region; + struct list_head list; }; /* @@ -530,6 +542,58 @@ static int qcom_apss_md_table_init(struct minidump *md, return 0; } +static int register_ramoops_region(const char *name, int id, void *vaddr, + phys_addr_t paddr, size_t size) +{ + struct qcom_minidump_region *md_region; + struct md_region_list *mdr_list; + int ret; + + mdr_list = kzalloc(sizeof(*mdr_list), GFP_KERNEL); + if (!mdr_list) + return -ENOMEM; + + md_region = &mdr_list->md_region; + scnprintf(md_region->name, sizeof(md_region->name), "K%s%d", name, id); + md_region->virt_addr = vaddr; + md_region->phys_addr = paddr; + md_region->size = size; + ret = qcom_minidump_region_register(md_region); + if (ret < 0) { + pr_err("failed to register region in minidump: err: %d\n", ret); + return ret; + } + + list_add(&mdr_list->list, &apss_md_rlist); + + return 0; +} + +static void register_ramoops_minidump_cb(struct work_struct *work) +{ + struct minidump *md = container_of(work, struct minidump, work); + + md->nb_cookie = register_ramoops_info_notifier(register_ramoops_region); + if (IS_ERR_OR_NULL(md->nb_cookie)) { + pr_err("Fail to register ramoops info notifier\n"); + md->nb_cookie = NULL; + } +} + +static void qcom_ramoops_minidump_unregister(void) +{ + struct md_region_list *mdr_list; + struct md_region_list *tmp; + + list_for_each_entry_safe(mdr_list, tmp, &apss_md_rlist, list) { + struct qcom_minidump_region *region; + + region = &mdr_list->md_region; + qcom_minidump_region_unregister(region); + list_del(&mdr_list->list); + } +} + static void qcom_apss_md_table_exit(struct minidump_ss_data *mdss_data) { memset(mdss_data->md_ss_toc, cpu_to_le32(0), sizeof(*mdss_data->md_ss_toc)); @@ -575,6 +639,22 @@ static int qcom_apss_minidump_probe(struct platform_device *pdev) platform_set_drvdata(pdev, md); + /* + * Use separate context for registering ramoops region via workqueue + * as minidump probe can get called in same context of platform device + * register call from smem driver and further call to qcom_smem_minidump_ready() + * can return -EPROBE_DEFER as __smem->minidump is not yet initialized because + * of same context and it can only initialized after return from probe. + * + * qcom_apss_minidump_probe() + * register_ramoops_minidump_cb() + * register_ramoops_region() + * qcom_minidump_region_register() + * qcom_smem_minidump_ready() + */ + INIT_WORK(&md->work, register_ramoops_minidump_cb); + schedule_work(&md->work); + return ret; } @@ -582,6 +662,10 @@ static void qcom_apss_minidump_remove(struct platform_device *pdev) { struct minidump *md = platform_get_drvdata(pdev); + flush_work(&md->work); + qcom_ramoops_minidump_unregister(); + if (md->nb_cookie) + unregister_ramoops_info_notifier(md->nb_cookie); qcom_apss_md_table_exit(md->apss_data); } -- 2.43.0.254.ga26002b62827 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2024-01-31 11:10 UTC|newest] Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top 2024-01-31 11:08 [PATCH v8 00/10] Add Qualcomm APSS Minidump driver related support Mukesh Ojha 2024-01-31 11:08 ` Mukesh Ojha 2024-01-31 11:08 ` [PATCH v8 01/10] docs: qcom: Add qualcomm minidump guide Mukesh Ojha 2024-01-31 11:08 ` Mukesh Ojha 2024-01-31 11:08 ` [PATCH v8 02/10] soc: qcom: Add qcom_rproc_minidump module Mukesh Ojha 2024-01-31 11:08 ` Mukesh Ojha 2024-01-31 11:08 ` [PATCH v8 03/10] remoteproc: qcom_q6v5_pas: Use qcom_rproc_minidump() Mukesh Ojha 2024-01-31 11:08 ` Mukesh Ojha 2024-01-31 11:08 ` [PATCH v8 04/10] remoteproc: qcom: Remove minidump related data from qcom_common.c Mukesh Ojha 2024-01-31 11:08 ` Mukesh Ojha 2024-01-31 11:08 ` [PATCH v8 05/10] init: export linux_banner data variable Mukesh Ojha 2024-01-31 11:08 ` Mukesh Ojha 2024-01-31 11:08 ` [PATCH v8 06/10] soc: qcom: Add Qualcomm APSS minidump kernel driver Mukesh Ojha 2024-01-31 11:08 ` Mukesh Ojha 2024-01-31 11:08 ` [PATCH v8 07/10] MAINTAINERS: Add entry for minidump related files Mukesh Ojha 2024-01-31 11:08 ` Mukesh Ojha 2024-01-31 11:08 ` [PATCH v8 08/10] pstore/ram: Add dynamic ramoops region support through commandline Mukesh Ojha 2024-01-31 11:08 ` Mukesh Ojha 2024-02-12 13:34 ` Mukesh Ojha 2024-02-12 13:34 ` Mukesh Ojha 2024-01-31 11:08 ` [PATCH v8 09/10] pstore/ram: Add ramoops information notifier support Mukesh Ojha 2024-01-31 11:08 ` Mukesh Ojha 2024-01-31 11:08 ` Mukesh Ojha [this message] 2024-01-31 11:08 ` [PATCH v8 10/10] soc: qcom: register ramoops region with APSS minidump Mukesh Ojha 2024-03-04 16:45 ` [PATCH v8 00/10] Add Qualcomm APSS Minidump driver related support Mukesh Ojha 2024-03-04 16:45 ` Mukesh Ojha -- strict thread matches above, loose matches on Subject: below -- 2024-01-31 10:57 Mukesh Ojha 2024-01-31 10:57 ` [PATCH v8 10/10] soc: qcom: register ramoops region with APSS minidump 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=20240131110837.14218-11-quic_mojha@quicinc.com \ --to=quic_mojha@quicinc.com \ --cc=alim.akhtar@samsung.com \ --cc=andersson@kernel.org \ --cc=bmasney@redhat.com \ --cc=conor+dt@kernel.org \ --cc=corbet@lwn.net \ --cc=gpiccoli@igalia.com \ --cc=keescook@chromium.org \ --cc=kernel@quicinc.com \ --cc=kgene@kernel.org \ --cc=konrad.dybcio@linaro.org \ --cc=krzysztof.kozlowski+dt@linaro.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-arm-msm@vger.kernel.org \ --cc=linux-doc@vger.kernel.org \ --cc=linux-hardening@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mediatek@lists.infradead.org \ --cc=linux-remoteproc@vger.kernel.org \ --cc=linux-samsung-soc@vger.kernel.org \ --cc=mathieu.poirier@linaro.org \ --cc=matthias.bgg@gmail.com \ --cc=nm@ti.com \ --cc=robh+dt@kernel.org \ --cc=tony.luck@intel.com \ --cc=vigneshr@ti.com \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.