From d5e2d67500afc47f0c6b33dd411d7dd7f66daed3 Mon Sep 17 00:00:00 2001 From: Raihan Haider Date: Mon, 6 Mar 2023 13:02:11 +0530 Subject: [PATCH 1/9] msm: Add config option for R8168 IOSS glue driver Add kernel config option for Realtek R8168 IOSS glue driver Change-Id: Icbcd29f154df979d4a4cb508e6c052441964d074 Signed-off-by: Raihan Haider --- drivers/platform/msm/Kconfig | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/platform/msm/Kconfig b/drivers/platform/msm/Kconfig index 98d2ae6d8f16..c6a38ba5686f 100644 --- a/drivers/platform/msm/Kconfig +++ b/drivers/platform/msm/Kconfig @@ -190,6 +190,18 @@ config R8125_IOSS To compile this driver as a module, choose M here. Module will be called r8125_ioss. If unsure, say N. +config R8168_IOSS + tristate "Realtek R8168 IOSS glue driver" + depends on R8168 + depends on IOSS + help + Enables IPA Ethernet Offload path on Realtek R8168 NIC. It is + designed to support generic HW processing of UL/DL IP packets for + various use cases to reduce the CPU load during E2E IP traffic. + + To compile this driver as a module, choose M here. Module will be + called r8168_ioss. If unsure, say N. + config AQFWD_IOSS tristate "AQC glue driver for IOSS v2" depends on AQFWD From 0c5f471d1ca93da7b627ef0c9ea7740e0b242bb6 Mon Sep 17 00:00:00 2001 From: Sai Chaitanya Kaveti Date: Thu, 6 Jul 2023 16:11:30 +0530 Subject: [PATCH 2/9] msm: ep_pcie: Set clock power management bit for EP According to PCIe spec, PCIE_CAP_CLOCK_POWER_MAN bit in LINK_CAPABILITIES_REG register should be set for EP. But it is seen as cleared after core reset. In the current driver this bit is being set but it is not taking effect. Enabling CLK_PM_EN in PCIE_ELBI_SYS_CTRL register, so that PCIE_CAP_CLOCK_POWER_MAN is set. Change-Id: I16654d5a477fa8eeaad61d6ec1dd32757627e2f9 Signed-off-by: Sai Chaitanya Kaveti --- drivers/platform/msm/ep_pcie/ep_pcie_core.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/platform/msm/ep_pcie/ep_pcie_core.c b/drivers/platform/msm/ep_pcie/ep_pcie_core.c index 7e81a80905b9..dcbee0bd18f7 100644 --- a/drivers/platform/msm/ep_pcie/ep_pcie_core.c +++ b/drivers/platform/msm/ep_pcie/ep_pcie_core.c @@ -828,6 +828,9 @@ static void ep_pcie_core_init(struct ep_pcie_dev_t *dev, bool configured) ep_pcie_write_mask(dev->dm_core + PCIE20_L1SUB_CAPABILITY, 0, 0x1f); + /* Set CLK_PM_EN which allows to configure the clock-power-man bit below for EP */ + ep_pcie_write_mask(dev->elbi + PCIE20_ELBI_SYS_CTRL, 1, BIT(7)); + /* Enable Clock Power Management */ ep_pcie_write_reg_field(dev->dm_core, PCIE20_LINK_CAPABILITIES, PCIE20_MASK_CLOCK_POWER_MAN, 0x1); From 1a7c68833dcf8353eb7cfcab647baccde89a324e Mon Sep 17 00:00:00 2001 From: Raihan Haider Date: Mon, 6 Mar 2023 15:48:44 +0530 Subject: [PATCH 3/9] defconfig: sdxlemur: Realtek r8168 IOSS glue driver config Realtek r8168 IOSS glue driver config set to m Change-Id: I0a7ef825155f928212cc2979a73482874471004e Signed-off-by: Raihan Haider --- arch/arm/configs/vendor/sdxlemur.config | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/configs/vendor/sdxlemur.config b/arch/arm/configs/vendor/sdxlemur.config index 6f909a87bf87..bb8a79c004d9 100644 --- a/arch/arm/configs/vendor/sdxlemur.config +++ b/arch/arm/configs/vendor/sdxlemur.config @@ -364,6 +364,7 @@ CONFIG_AQFWD_IOSS=m CONFIG_R8125=y CONFIG_R8125_IOSS=m CONFIG_R8168=y +CONFIG_R8168_IOSS=m CONFIG_QCOM_SHOW_RESUME_IRQ=y CONFIG_HARDENED_USERCOPY=y # CONFIG_HARDENED_USERCOPY_FALLBACK is not set From c99a841d40aa8753224386c8ca61aaaccd852ecb Mon Sep 17 00:00:00 2001 From: Pratham Pratap Date: Wed, 12 Jul 2023 00:17:04 +0530 Subject: [PATCH 4/9] usb: gadget: cdev: Add spinlock to synchronize ports->cbits_updated Consider a scenario in which open, write and close of AT port is being done repeatedly. At some point in time, cbits_updated in f_cdev structure gets overwritten by the previous close instance causing the AT port to go unresponsive. This prevents port bridge service from sending DTR/RTS settings to at_mdm0 from at_usb0. Fix this by adding spinlock to synchronise the updation of ports->cbits_updated field in f_cdev structure. Change-Id: Ibf39aa90f3918cd5f22e32a3b06685db4c4298ae Signed-off-by: Pratham Pratap --- drivers/usb/gadget/function/f_cdev.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/usb/gadget/function/f_cdev.c b/drivers/usb/gadget/function/f_cdev.c index 9357949a1525..481783ea6968 100644 --- a/drivers/usb/gadget/function/f_cdev.c +++ b/drivers/usb/gadget/function/f_cdev.c @@ -1617,6 +1617,7 @@ static long f_cdev_ioctl(struct file *fp, unsigned int cmd, int i = 0; uint32_t val; struct f_cdev *port; + unsigned long flags; port = fp->private_data; if (!port) { @@ -1638,11 +1639,13 @@ static long f_cdev_ioctl(struct file *fp, unsigned int cmd, break; case TIOCMGET: pr_debug("TIOCMGET on port(%s)%pK\n", port->name, port); + spin_lock_irqsave(&port->port_lock, flags); ret = f_cdev_tiocmget(port); if (ret >= 0) { ret = put_user(ret, (uint32_t *)arg); port->cbits_updated = false; } + spin_unlock_irqrestore(&port->port_lock, flags); break; default: pr_err("Received cmd:%d not supported\n", cmd); @@ -1658,6 +1661,7 @@ static void usb_cser_notify_modem(void *fport, int ctrl_bits) int temp; struct f_cdev *port = fport; struct cserial *cser; + unsigned long flags; cser = &port->port_usb; if (!port) { @@ -1672,6 +1676,7 @@ static void usb_cser_notify_modem(void *fport, int ctrl_bits) if (temp == port->cbits_to_modem) return; + spin_lock_irqsave(&port->port_lock, flags); port->cbits_to_modem = temp; port->cbits_updated = true; @@ -1686,6 +1691,7 @@ static void usb_cser_notify_modem(void *fport, int ctrl_bits) cser->send_modem_ctrl_bits(cser, cbits_to_laptop); } + spin_unlock_irqrestore(&port->port_lock, flags); wake_up(&port->read_wq); } From fe41aca1e4a3a755843887a64d80256cd532d288 Mon Sep 17 00:00:00 2001 From: Pratham Pratap Date: Wed, 19 Jul 2023 11:56:18 +0530 Subject: [PATCH 5/9] usb: gadget: cdev: Fix spinlock recursion Commit c99a841d40aa8 ("usb: gadget: cdev: Add spinlock to synchronize ports->cbits_updated")added spinlock to synchronize ports->cbits_updated which is causing a spinlock recursion in usb_cser_notify_modem. Fix this by unlocking the spinlock before it calls send_modem_ctrl_bits which in turn tries to acquire the same spinlock. Change-Id: I744ea93d7da60aaf27044400cf457cc81dab151d Signed-off-by: Pratham Pratap --- drivers/usb/gadget/function/f_cdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/gadget/function/f_cdev.c b/drivers/usb/gadget/function/f_cdev.c index 481783ea6968..f1044c29027a 100644 --- a/drivers/usb/gadget/function/f_cdev.c +++ b/drivers/usb/gadget/function/f_cdev.c @@ -1679,6 +1679,7 @@ static void usb_cser_notify_modem(void *fport, int ctrl_bits) spin_lock_irqsave(&port->port_lock, flags); port->cbits_to_modem = temp; port->cbits_updated = true; + spin_unlock_irqrestore(&port->port_lock, flags); /* if DTR is high, update latest modem info to laptop */ if (port->cbits_to_modem & TIOCM_DTR) { @@ -1691,7 +1692,6 @@ static void usb_cser_notify_modem(void *fport, int ctrl_bits) cser->send_modem_ctrl_bits(cser, cbits_to_laptop); } - spin_unlock_irqrestore(&port->port_lock, flags); wake_up(&port->read_wq); } From 24dbadc7e8301cedb7913f6f804c34353ea5c4b7 Mon Sep 17 00:00:00 2001 From: Khaja Hussain Shaik Khaji Date: Mon, 10 Jul 2023 13:00:34 +0530 Subject: [PATCH 6/9] drivers: qcom: pil: Add KPI boot markers for modem Add modem crash and stop, dump start and complete boot markers. Change-Id: I2e3304aa5d6bb2e578d89444cbd33cd1b8fe6f12 Signed-off-by: Khaja Hussain Shaik Khaji --- drivers/soc/qcom/msm_subsystem_restart.c | 5 +++++ drivers/soc/qcom/peripheral-loader.c | 5 ++++- drivers/soc/qcom/subsys-pil-tz.c | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/soc/qcom/msm_subsystem_restart.c b/drivers/soc/qcom/msm_subsystem_restart.c index 69ab25363295..f115e25fa5cd 100644 --- a/drivers/soc/qcom/msm_subsystem_restart.c +++ b/drivers/soc/qcom/msm_subsystem_restart.c @@ -652,6 +652,11 @@ static int subsystem_shutdown(struct subsys_device *dev, void *data) dev->crash_count++; subsys_set_state(dev, SUBSYS_OFFLINE); +#ifdef CONFIG_QGKI_MSM_BOOT_TIME_MARKER + if (!strcmp(dev->desc->name, "modem")) + place_marker("M - Modem Stop"); +#endif + return 0; } diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index 55b2e0bad42e..95125c88f2c1 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -472,7 +472,10 @@ int pil_do_ramdump(struct pil_desc *desc, if (ret) pil_err(desc, "%s: Ramdump collection failed for subsys %s rc:%d\n", __func__, desc->name, ret); - +#ifdef CONFIG_QGKI_MSM_BOOT_TIME_MARKER + if (!strcmp(desc->name, "modem")) + place_marker("M - Modem Dump completed"); +#endif if (desc->subsys_vmid > 0) ret = pil_assign_mem_to_subsys(desc, priv->region_start, (priv->region_end - priv->region_start)); diff --git a/drivers/soc/qcom/subsys-pil-tz.c b/drivers/soc/qcom/subsys-pil-tz.c index 61762f4f68d7..03e7b8fcccf8 100644 --- a/drivers/soc/qcom/subsys-pil-tz.c +++ b/drivers/soc/qcom/subsys-pil-tz.c @@ -871,6 +871,10 @@ static int subsys_ramdump(int enable, const struct subsys_desc *subsys) if (!enable) return 0; +#ifdef CONFIG_QGKI_MSM_BOOT_TIME_MARKER + if (!strcmp(subsys->name, "modem")) + place_marker("M - Modem Dump start"); +#endif return pil_do_ramdump(&d->desc, d->ramdump_dev, d->minidump_dev); } @@ -915,6 +919,10 @@ static irqreturn_t subsys_err_fatal_intr_handler (int irq, void *drv_data) d->subsys_desc.name); return IRQ_HANDLED; } +#ifdef CONFIG_QGKI_MSM_BOOT_TIME_MARKER + if (!strcmp(d->subsys_desc.name, "modem")) + place_marker("M - Modem crash"); +#endif subsys_set_crash_status(d->subsys, CRASH_STATUS_ERR_FATAL); log_failure_reason(d); subsystem_restart_dev(d->subsys); From 30e8ee90cb692f337777e71b086bd20120115c19 Mon Sep 17 00:00:00 2001 From: Srinivasarao Pathipati Date: Tue, 4 Jul 2023 11:48:50 +0530 Subject: [PATCH 7/9] soc: qcom: minidump: check the size parameter passed to qcom_smem_get() The size parameter passed to qcom_smem_get() can become less than global toc size, add check to avoid out of bound accessing. Change-Id: I068b4d5e27e94ce23c26856dad106a3970fb56d6 Signed-off-by: Srinivasarao Pathipati --- drivers/soc/qcom/msm_minidump.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/soc/qcom/msm_minidump.c b/drivers/soc/qcom/msm_minidump.c index ac4c3b08e5b5..4b4b81647688 100644 --- a/drivers/soc/qcom/msm_minidump.c +++ b/drivers/soc/qcom/msm_minidump.c @@ -561,7 +561,7 @@ static int __init msm_minidump_init(void) } /*Check global minidump support initialization */ - if (!md_global_toc->md_toc_init) { + if (size < sizeof(*md_global_toc) || !md_global_toc->md_toc_init) { pr_err("System Minidump TOC not initialized\n"); return -ENODEV; } From 0401e9d8c26e6da2f6290bbe0bf920d1d409a291 Mon Sep 17 00:00:00 2001 From: Swetha Chikkaboraiah Date: Tue, 4 Jul 2023 16:06:27 +0530 Subject: [PATCH 8/9] soc: qcom: socinfo: Add soc information for Blair APQ Add SOC ID to support socinfo for Blair APQ and Blair APQ-XR soc. Change-Id: Ica80b43f1eab94d95bf38726571b36b7fc8a2e35 Signed-off-by: Swetha Chikkaboraiah --- drivers/soc/qcom/socinfo.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/soc/qcom/socinfo.c b/drivers/soc/qcom/socinfo.c index 89b16a71793f..562f35ce68a4 100644 --- a/drivers/soc/qcom/socinfo.c +++ b/drivers/soc/qcom/socinfo.c @@ -680,6 +680,8 @@ static const struct soc_id soc_id[] = { { 450, "SHIMA" }, { 454, "HOLI" }, { 507, "BLAIR" }, + { 565, "BLAIRP" }, + { 628, "BLAIRP-XR" }, { 486, "MONACO" }, { 458, "SDXLEMUR" }, { 483, "SDXLEMUR-SD"}, From afe20da34be7cd24ef3bff5b1ff042402958a4d5 Mon Sep 17 00:00:00 2001 From: Manoj Prabhu B Date: Tue, 11 Jul 2023 16:47:18 +0530 Subject: [PATCH 9/9] memshare: Avoid accessing uninitialized nodes Prevent iterating over uninitialized memshare child nodes while handling client alloc and free requests. Change-Id: I421cd239bb999176e587ab0c06757d83485fad6e Signed-off-by: Manoj Prabhu B Signed-off-by: Meenu Raja Sundaram --- drivers/soc/qcom/memshare/msm_memshare.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/soc/qcom/memshare/msm_memshare.c b/drivers/soc/qcom/memshare/msm_memshare.c index 6d1badcf1afd..43ca69072932 100644 --- a/drivers/soc/qcom/memshare/msm_memshare.c +++ b/drivers/soc/qcom/memshare/msm_memshare.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2013-2020, The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved. */ #include @@ -104,7 +104,7 @@ static int check_client(int client_id, int proc, int request) int i = 0, rc; int found = DHMS_MEM_CLIENT_INVALID; - for (i = 0; i < MAX_CLIENTS; i++) { + for (i = 0; i < num_clients; i++) { if (memblock[i].client_id == client_id && memblock[i].peripheral == proc) { found = i; @@ -484,7 +484,7 @@ static void handle_alloc_generic_req(struct qmi_handle *handle, return; } - for (i = 0; i < MAX_CLIENTS; i++) { + for (i = 0; i < num_clients; i++) { if (memsh_child[i]->client_id == alloc_req->client_id) { client_node = memsh_child[i]; dev_info(memsh_drv->dev, @@ -577,7 +577,7 @@ static void handle_free_generic_req(struct qmi_handle *handle, flag = 1; } - for (i = 0; i < MAX_CLIENTS; i++) { + for (i = 0; i < num_clients; i++) { if (memsh_child[i]->client_id == free_req->client_id) { client_node = memsh_child[i]; dev_info(memsh_drv->dev,