From nobody Tue Apr 7 16:20:26 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 99EBA3F7A9C for ; Thu, 12 Mar 2026 15:56:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773331021; cv=none; b=R493hTR308KW3k2m0Px9gQe9WbmbAnl3dteu89T9aB/TTc4zMqzG6BXPeIG1Q/fjXUf47bK6BA9Iw0sVWWOa6OIPZvuoLC94FpbOTPhOPmc2K1RD2nPlLN90UMYS92iBYo0Uf6OuemgFM72mfuIWU2nB4RuHmHepwuNid+5r4kE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773331021; c=relaxed/simple; bh=bCu7aW8/QTWapF5ij+NKUvcd7TvrQElcFNdenTYTv3U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sa/Wxg8CtX8LZ2amimya93vXKvnkX5GpGhFoO9I5zyYi5sBiYAHZP5SSMX1X4vXieN0f6JeGEJGA5SbAYiJWagzUTGzp94pBeLOsAC9f2rINLeQq2nDNnjBPnwMc7GjjuWYSsocZ2jDuY9vw/92Tc9j8fjkF0/hjcwptdGiSeT8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=hsHfjB/7; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=U9IGElHv; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="hsHfjB/7"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="U9IGElHv" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62C99n8T263416 for ; Thu, 12 Mar 2026 15:56:58 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= RpOQxkqEm7pn/TWMDSYAKoFZhY03aCVnaB1ijpNgrGE=; b=hsHfjB/7SzZ7Q8eY PiQzBDPCLS01Ad/pwH6zlASAyqeU58y4q98El57R9AicTzMBmBgit6/6KXpfW2Fn +bNf+A3UdFd4E1mF8W7b7d7Q3YGyeLkNkeClCOoT/Pqj52FpEmk6ZRQ3vvvRTKM3 Xm/hLWujsQjRvSnsBogLVNDlzvooukm7PiHg13XGzdwqEcxcVv4hZy21M2vqDV52 nptejBx/2fOKOftRinh1hE9DFVpdJObCDSL0BB6ipjmJMYQBg2UARqnLE1MMi/NQ EGUl+5t4atqCLAd0I6lyUWkXAFnbnN+e7o/kz9tillZX/VnaP+xLiqHONLticw7W a9Ji7g== Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4cuh4yjmw9-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 12 Mar 2026 15:56:58 +0000 (GMT) Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-c73939e0314so602425a12.1 for ; Thu, 12 Mar 2026 08:56:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1773331018; x=1773935818; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=RpOQxkqEm7pn/TWMDSYAKoFZhY03aCVnaB1ijpNgrGE=; b=U9IGElHv3OJyXSeVmmDwwbb4t5gr8P5KpyY2b0nJzOauFWSFnj0sEg6+1HadolGqJr ILyJYEwr0CRZAD2MCIBzRU81s529TySRux0gUhBdl4qh+sFeFUe1DsZ+NMULisbURi/I mmFpaoP75Okxjbx7PV0mpGuxL/D9l9Jn8G147jW45ooP6Xg0bb6wfoi1WbtGf09n4X0x N9J9Q5g7HwzonkoqcfsQ4GfKXWh7JdQmSb8nFmXs1+ZrpIA2YEzebFk+SN8dS6F038Rb PqtDPSd/ThwtoQQs1ZClN4T1FcK3QYm61fPY/nyfBHSJ++Hl+47Kc7sEM2mkG7e7GCpq pBRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773331018; x=1773935818; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=RpOQxkqEm7pn/TWMDSYAKoFZhY03aCVnaB1ijpNgrGE=; b=St/UD/BQTYEiVMxLMEPcVzTgMQYMhhedCtcs4dbeSqgC1X2hpZAVU/Q8si8p6gfccF NZ9fauX0a7H8torI3SK4yrv+m0GEcdJcoHtZVBMuUHBv7xVLhAm03jtbB7FzNF8X9DUq JMDvCmZjuPN3HADOnKb1sxY+3+27HIAOpW16yeiBC3J5kvwSJ++bMpT0u3rv2fGTr/Fy o7zpxNXOU4UpNjs/5QREPeQfXeqYy3P5qRqBJhrLl/BxmdPQn+Zy352PaQjkEBj6eEtC djouw3cWkFRyxGb+BsxSNIPgNGFNQ9D4pix4eOrFEy+8wU6MuRdcUmffQA8mQnJEVDCD TY6Q== X-Forwarded-Encrypted: i=1; AJvYcCWV89lO0EHP2+ufQ+MULv0Af+WrtTbYgah1tpLmFZ6NmC4W8d7bGIh3MnLqicvEny+us2JLubk0hKFlne8=@vger.kernel.org X-Gm-Message-State: AOJu0YzZMk6yxmhy50lurQsF+oRE65tCNHbBtSpEfu2HBHhPvKxfBL31 /Khv+9Eayos9TVJXlRGHuZMCUL8++6GnZS+B21LI8RE79z/zyoGJsSvCcbKUcfe5VdYYbxbBvjb Ed6Pdcj/lJZWDq3AjNs0rU+QL0U0SwSeks/yr0IHRJyBtV/mPdAtIJW58QqOfWqrCc2w= X-Gm-Gg: ATEYQzwPUH4KaKSNrQNBaUBUJAvBXlOY+bG9HAhiMgs/lgfskgCOwqVAcSAB+fYNgQq rnXgoqr7vkRdIAqZiI22AQNaE+Qpq13UZRk2pGnWzAW5EzD1NJ4gsFc+laX5EhP5Q4/q3yeizdl ZODZ4p3N4835d/Jonnc0tLvxqM7EcOt205ORmXKz86ysaXgHOCTTi2YSgS3lOy+h2huL4k393Oh WkXbU3Calpdwy7peQ6Im3VMrOxJYfaPa4AaWX5B+6D3C5V1xfKlBLhF+tcjPq5M/hF1ivgcy6op oLGSpeUg9Pj0t+eO3FwiNdIisytNve9Is0yeuK8ApJLd8HMg3EnQB3e6vuZYB1K/WDcTN35Pflk sVWfIrgvrZ0LPuMhAW2C0ttvEvGc2LCUMuLZpVBbQxliDVaiMZA== X-Received: by 2002:a05:6300:4049:b0:398:9579:dff7 with SMTP id adf61e73a8af0-398c60dca0fmr6852798637.41.1773331017444; Thu, 12 Mar 2026 08:56:57 -0700 (PDT) X-Received: by 2002:a05:6300:4049:b0:398:9579:dff7 with SMTP id adf61e73a8af0-398c60dca0fmr6852768637.41.1773331016857; Thu, 12 Mar 2026 08:56:56 -0700 (PDT) Received: from hu-mkshah-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c73cdf254acsm6067852a12.11.2026.03.12.08.56.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 08:56:56 -0700 (PDT) From: Maulik Shah Date: Thu, 12 Mar 2026 21:26:37 +0530 Subject: [PATCH 3/5] irqchip/qcom-pdc: Configure PDC to pass through mode Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260312-hamoa_pdc-v1-3-760c8593ce50@oss.qualcomm.com> References: <20260312-hamoa_pdc-v1-0-760c8593ce50@oss.qualcomm.com> In-Reply-To: <20260312-hamoa_pdc-v1-0-760c8593ce50@oss.qualcomm.com> To: Bjorn Andersson , Konrad Dybcio , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thomas Gleixner , Linus Walleij Cc: linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, Sneh Mankad , Maulik Shah X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773331000; l=8507; i=maulik.shah@oss.qualcomm.com; s=20240109; h=from:subject:message-id; bh=bCu7aW8/QTWapF5ij+NKUvcd7TvrQElcFNdenTYTv3U=; b=d+poMCmM7RMoa49Lxh9InyAofRhN+0qUsDLXbN7fU5x1rNBMAqqfFMT6NdsoTy+Qjn9ufm41u G3sNrdL45YqAzyKqCC8LzfSlg55RlPk28WfKHa+qh2/emobWP+/6Ihs X-Developer-Key: i=maulik.shah@oss.qualcomm.com; a=ed25519; pk=bd9h5FIIliUddIk8p3BlQWBlzKEQ/YW5V+fe759hTWQ= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzEyMDEyOCBTYWx0ZWRfX9p4IzMqfo0Ic bceXTHU5/+gSGOwkkAW+IzvSp8E8uXQkrMJgnEYlECgHuNViavVJGfDqYdZJNwNLp5II1UQgj11 soSn3sIf7VniWazUrkbBeof4EaQnx8hyTH5hv6QWpYFJ7IVdKYH62+OmL28/nlo0cCCX1QCCfZP Wn9YlniZbSMg0xb0eYb1Y025QOgdDkeqaEmEOyI+atP89e4uSKN7759rK0CrbiP6R+9qouirYNC Sl2ZljThgehmEfcD8/GtdfwL+DQCCDD9EqTlnzMBlGf2ifZdlcLXy/+T7yw8kPZ3ft3x+7qzCdr QPYencCz3v7odMZFdj6Q6LRuhLq5Ukx9vwFJiwREmGpbMI2gfvQMyVoiJex4PrmcAc/lWFx26oV 5HenRlhheLtDN6+CjE8hMkL5e5VejAGiMxYGIrM9ix+Tnbmdjub9RYGXEMwPhC2I7RcaTmvSbcY NTnc8PLYiwtoTO9Nbag== X-Proofpoint-ORIG-GUID: EWSPYmbTO0z-baJOWKlHpFZ4y-f9JOhc X-Authority-Analysis: v=2.4 cv=C+7kCAP+ c=1 sm=1 tr=0 ts=69b2e24a cx=c_pps a=Qgeoaf8Lrialg5Z894R3/Q==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=EUspDBNiAAAA:8 a=aIvA2l6cyS3-6N-EsbsA:9 a=QEXdDO2ut3YA:10 a=x9snwWr2DeNwDh03kgHS:22 X-Proofpoint-GUID: EWSPYmbTO0z-baJOWKlHpFZ4y-f9JOhc X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-03-12_02,2026-03-12_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 priorityscore=1501 phishscore=0 adultscore=0 suspectscore=0 bulkscore=0 lowpriorityscore=0 clxscore=1011 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603120128 There are two modes PDC irqchip supports pass through mode and secondary controller mode. All PDC irqchip supports pass through mode in which both Direct SPIs and GPIO IRQs (as SPIs) are sent to GIC without latching at PDC. Newer PDCs (v3.0 onwards) also support additional secondary controller mode where PDC latches GPIO IRQs and sends to GIC as level type IRQ. Direct SPIs still works same as pass through mode without latching at PDC even in secondary controller mode. All the SoCs so far default uses pass through mode with the exception of x1e. x1e PDC may be set to secondary controller mode for builds on CRD boards whereas it may be set to pass through mode for IoT-EVK. There is no way to read which current mode it is set to and make PDC work in respective mode as the read access is not opened up for non secure world. There is though write access opened up via SCM write API to set the mode. Configure PDC mode to pass through mode for all x1e based boards via SCM write. Co-developed-by: Sneh Mankad Signed-off-by: Sneh Mankad Signed-off-by: Maulik Shah --- drivers/irqchip/Kconfig | 1 + drivers/irqchip/qcom-pdc.c | 119 +++++++++++++++++++++++++++++++++++++++++= ---- 2 files changed, 111 insertions(+), 9 deletions(-) diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig index 83d333f8bf63d78827800e0de724f81e6aa2f1df..89caddf6e5c569a0e867cda1838= c870b967fb13d 100644 --- a/drivers/irqchip/Kconfig +++ b/drivers/irqchip/Kconfig @@ -505,6 +505,7 @@ config GOLDFISH_PIC config QCOM_PDC tristate "QCOM PDC" depends on ARCH_QCOM + depends on QCOM_AOSS_QMP select IRQ_DOMAIN_HIERARCHY help Power Domain Controller driver to manage and configure wakeup diff --git a/drivers/irqchip/qcom-pdc.c b/drivers/irqchip/qcom-pdc.c index 32b77fa93f730416edf120710bcdcdce33fa39a7..051700d672471c092e8cda4d7f5= aa6d2032157f7 100644 --- a/drivers/irqchip/qcom-pdc.c +++ b/drivers/irqchip/qcom-pdc.c @@ -19,6 +19,8 @@ #include #include #include +#include +#include =20 #define PDC_MAX_GPIO_IRQS 256 #define PDC_DRV_OFFSET 0x10000 @@ -26,9 +28,11 @@ /* Valid only on HW version < 3.2 */ #define IRQ_ENABLE_BANK 0x10 #define IRQ_ENABLE_BANK_MAX (IRQ_ENABLE_BANK + BITS_TO_BYTES(PDC_MAX_GPIO_= IRQS)) +#define IRQ_i_CFG_IRQ_MASK_3_0 3 #define IRQ_i_CFG 0x110 =20 /* Valid only on HW version >=3D 3.2 */ +#define IRQ_i_CFG_IRQ_MASK_3_2 4 #define IRQ_i_CFG_IRQ_ENABLE 3 =20 #define IRQ_i_CFG_TYPE_MASK GENMASK(2, 0) @@ -36,8 +40,11 @@ #define PDC_VERSION_REG 0x1000 =20 /* Notable PDC versions */ +#define PDC_VERSION_3_0 0x30000 #define PDC_VERSION_3_2 0x30200 =20 +#define PDC_PASS_THROUGH_MODE 0 + struct pdc_pin_region { u32 pin_base; u32 parent_base; @@ -97,6 +104,33 @@ static void pdc_x1e_irq_enable_write(u32 bank, u32 enab= le) pdc_base_reg_write(base, IRQ_ENABLE_BANK, bank, enable); } =20 +/* + * The new mask bit controls whether the interrupt is to be forwarded to t= he + * parent GIC in secondary controller mode. Writing the mask is do not care + * when the PDC is set to pass through mode. + * + * As linux only makes so far make use of pass through mode set all IRQs + * masked during probe. + */ +static void __pdc_mask_intr(int pin_out, bool mask) +{ + unsigned long irq_cfg; + int mask_bit; + + /* Mask bit available from v3.0 */ + if (pdc_version < PDC_VERSION_3_0) + return; + + if (pdc_version < PDC_VERSION_3_2) + mask_bit =3D IRQ_i_CFG_IRQ_MASK_3_0; + else + mask_bit =3D IRQ_i_CFG_IRQ_MASK_3_2; + + irq_cfg =3D pdc_reg_read(IRQ_i_CFG, pin_out); + __assign_bit(mask_bit, &irq_cfg, mask); + pdc_reg_write(IRQ_i_CFG, pin_out, irq_cfg); +} + static void __pdc_enable_intr(int pin_out, bool on) { unsigned long enable; @@ -312,7 +346,6 @@ static const struct irq_domain_ops qcom_pdc_ops =3D { static int pdc_setup_pin_mapping(struct device_node *np) { int ret, n, i; - n =3D of_property_count_elems_of_size(np, "qcom,pdc-ranges", sizeof(u32)); if (n <=3D 0 || n % 3) return -EINVAL; @@ -341,8 +374,10 @@ static int pdc_setup_pin_mapping(struct device_node *n= p) if (ret) return ret; =20 - for (i =3D 0; i < pdc_region[n].cnt; i++) + for (i =3D 0; i < pdc_region[n].cnt; i++) { __pdc_enable_intr(i + pdc_region[n].pin_base, 0); + __pdc_mask_intr(i + pdc_region[n].pin_base, true); + } } =20 return 0; @@ -352,10 +387,13 @@ static int pdc_setup_pin_mapping(struct device_node *= np) =20 static int qcom_pdc_probe(struct platform_device *pdev, struct device_node= *parent) { + static const char buf[64] =3D "{class: cx_mol, res: cx, val: mol}"; + unsigned int domain_flag =3D IRQ_DOMAIN_FLAG_QCOM_PDC_WAKEUP; struct irq_domain *parent_domain, *pdc_domain; struct device_node *node =3D pdev->dev.of_node; resource_size_t res_size; struct resource res; + struct qmp *pdc_qmp; int ret; =20 /* compat with old sm8150 DT which had very small region for PDC */ @@ -366,6 +404,13 @@ static int qcom_pdc_probe(struct platform_device *pdev= , struct device_node *pare if (res_size > resource_size(&res)) pr_warn("%pOF: invalid reg size, please fix DT\n", node); =20 + pdc_base =3D ioremap(res.start, res_size); + if (!pdc_base) { + pr_err("%pOF: unable to map PDC registers\n", node); + ret =3D -ENXIO; + goto fail; + } + /* * PDC has multiple DRV regions, each one provides the same set of * registers for a particular client in the system. Due to a hardware @@ -382,15 +427,71 @@ static int qcom_pdc_probe(struct platform_device *pde= v, struct device_node *pare } =20 pdc_x1e_quirk =3D true; - } =20 - pdc_base =3D ioremap(res.start, res_size); - if (!pdc_base) { - pr_err("%pOF: unable to map PDC registers\n", node); - ret =3D -ENXIO; - goto fail; + /* + * There are two modes PDC irqchip can work in + * - pass through mode + * - secondary controller mode + * + * All PDC irqchip supports pass through mode in which both + * Direct SPIs and GPIO IRQs (as SPIs) are sent to GIC + * without latching at PDC. + * + * Newer PDCs (v3.0 onwards) also support additional + * secondary controller mode where PDC latches GPIO IRQs + * and sends to GIC as level type IRQ. Direct SPIs still + * works same as pass through mode without latching at PDC + * even in secondary controller mode. + * + * All the SoCs so far default uses pass through mode with + * the exception of x1e. + * + * x1e modes: + * + * x1e PDC may be set to secondary controller mode for + * builds on CRD boards whereas it may be set to pass + * through mode for IoT-EVK boards. + * + * There is no way to read which current mode it is set to + * and make PDC work in respective mode as the read access + * is not opened up for non secure world. There is though + * write access opened up via SCM write API to set the mode. + * + * Configure PDC mode to pass through mode for all x1e based + * boards. + * + * For successful write: + * - Nothing more to be done + * + * For unsuccessful write: + * - Inform TLMM to monitor GPIO IRQs (same as MPM) + * - Prevent SoC low power mode (CxPC) as PDC is not + * monitoring GPIO IRQs which may be needed to wake + * the SoC from low power mode. + */ + ret =3D of_address_to_resource(node, 2, &res); + if (ret) { + domain_flag =3D IRQ_DOMAIN_FLAG_QCOM_MPM_WAKEUP; + goto skip_scm_write; + } + + ret =3D qcom_scm_io_writel(res.start, PDC_PASS_THROUGH_MODE); + if (ret) { + pdc_qmp =3D qmp_get(&pdev->dev); + if (IS_ERR(pdc_qmp)) { + ret =3D PTR_ERR(pdc_qmp); + goto fail; + } else { + ret =3D qmp_send(pdc_qmp, buf, sizeof(buf)); + qmp_put(pdc_qmp); + if (ret) + goto fail; + } + domain_flag =3D IRQ_DOMAIN_FLAG_QCOM_MPM_WAKEUP; + } } =20 +skip_scm_write: pdc_version =3D pdc_reg_read(PDC_VERSION_REG, 0); =20 parent_domain =3D irq_find_host(parent); @@ -407,7 +508,7 @@ static int qcom_pdc_probe(struct platform_device *pdev,= struct device_node *pare } =20 pdc_domain =3D irq_domain_create_hierarchy(parent_domain, - IRQ_DOMAIN_FLAG_QCOM_PDC_WAKEUP, + domain_flag, PDC_MAX_GPIO_IRQS, of_fwnode_handle(node), &qcom_pdc_ops, NULL); --=20 2.34.1