From nobody Mon Feb 9 16:02:48 2026 Received: from mail-dy1-f175.google.com (mail-dy1-f175.google.com [74.125.82.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F0E7836A02E for ; Thu, 8 Jan 2026 08:58:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767862731; cv=none; b=ujDO2c4C3h+2HCgw34onUvhHXEXIbfCWvwZG6vR99hJqMkVgrXlo7gbWpwkQeLFRgMkDaBjQSv7mVyEnxuBf/vu8iJyWDiFO+VO5Dl/xExKDuzdtqNUHPldtJTe1r5Fjm56xm4wX7EH/fEbWDneW3IJsD0g03dd02+B/HHYLtUg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767862731; c=relaxed/simple; bh=sIkymDyCEmbvxV9ZGQHY++Ov+nqP2mtyu2/hVCGij0w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LWjLtu9NF1RFoUkSdmOFLPYNoY1a9EsAiN3L+66ppoJys3NVxSWmgKVgeNvGGDk/7Rj3625vmk849CqZzVU8ab6Y+FlourbfQz10peE+udBZq6SAjhofSmOzxoguoncD6X3k11lOVLTqolZatPFFEhr5AtzgR66t87sv6XQGanI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=sifive.com; spf=pass smtp.mailfrom=sifive.com; dkim=pass (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b=mQGHSmEn; arc=none smtp.client-ip=74.125.82.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=sifive.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sifive.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b="mQGHSmEn" Received: by mail-dy1-f175.google.com with SMTP id 5a478bee46e88-2b04a410f42so2219425eec.0 for ; Thu, 08 Jan 2026 00:58:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1767862721; x=1768467521; 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=+qYO/gxPTzZ1gsudLMySBCma6iHYfPz33KQqAWsXtts=; b=mQGHSmEnic+S0mS7xgLg+o+6wdYRXY+vt1KLwNdWi3ebWIs4RzQU8a7QTxZiGHLuyD ZjG0ZbcHq/2TyuIcxp09X8FymPW8d0sznQogZikC0C1/ugNg4aS1X256mgLR9imOr+Ht NVvx5LFLoDuLgxMCC5RwXsRJjH1ksxbXPIQegQxFL5/z7esv1jZGTOewvIcUMOaj2Dsr x7DNyg6gs1Fm6COvrfCisZWVcCKEFG/x8muLeWOOHOwMfqr7fFbcll98jgjP/36MZn62 EUyIeVhev/vI6uWH1Zz3i13dn3YOCUWf6vCyhUACXp+VqfP24lvi8LaF/RilD5pDYyXr eJpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767862721; x=1768467521; 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=+qYO/gxPTzZ1gsudLMySBCma6iHYfPz33KQqAWsXtts=; b=qpvXrxo2kD13NZHbwsTmt0jSq81EnGZwI5cBgRvYl/ZW+nH1F4YpmqXV7WRR/AU1Qi 4qZLLCkKnuYXpBVN9AYUgXdaNe1PNyvt8oE+W4TKmcTNo8QxiCFNUwL3zxyC6KVVOXns QfAmxPEFVLn4hrbuPMUvw2VJbgKb87BP2CIdFPo2KPD2PQg2m2+oNY2h1ow1gLVJoQrK asg5RTHoIZlTP+MSBoG0iMTh23fQwZC9lEAjgEeeJ8Oh7hqlqklaUUUlxmEdkiwrgBQU MsaUc4zBFSdzGTNHjw16RNH4c8co4WNOWX5HT5kYQ5VscGv28Iw3E+JSFPNsALdOZnSJ pDQQ== X-Gm-Message-State: AOJu0Yy5H4Pgsmhz3p5b1kd2lgAUlbergBrPQHeAaUA6N7DpbrjSA7W2 y7L7aLfNXepg0pTmR83pFBpJ+wbIPCqOWK89L3qRFf/FMiGzjVRix8aCEQFqFYQEZ/Q= X-Gm-Gg: AY/fxX497LHtBFfD6v/NW1L1an9Wk0mwP1YCNai4b14t6rInep1+DAE5tv9W3aGxHok YAlzM1SJx/JGK9o9ozNP7nLTBwfDQlhLoqCAM1VrDDOvS0rkSpIhb/iIuoP5KIVmyXpTAUG02HX FWSwkO2VpLXagTy0IOwDK8qL6Bh+qa9YMu3y7TtB75Gi8Kl24btpBnCIHWGLSI2JhdFI0WfZc6S pFWFe2WWfBuYqcenYb1HUE/sDLSMZWQYYrzT5eB/HCaGLmU7U8OJz9keAQHXe2dLvafx/v3P9o6 BseBG0ai33aVBw7iZWPxG9YRbVtueVSw+WV+jkbr1Cc2KAHDdpxyBCgd3QfAAOLvieNU2aK2h34 ma1hXGvfDpaxDlkDU4UCNBxFwIf9kR4Vy5jBgNbWMJzncKM+Aaw/W011kZCmLTdrCDyBEZSu4ew VqW3F39eA7dkRSx5IjoW35ung= X-Google-Smtp-Source: AGHT+IE1ZYycZa8LfJgM/0T5ClhaC/Ln6YDrHSVxn+Bb2E0ZQUAhY5IK4YTUt16wFaSjFCweu0L/Dw== X-Received: by 2002:a05:693c:40db:b0:2ae:55f1:8201 with SMTP id 5a478bee46e88-2b17d23964bmr4070425eec.1.1767862721007; Thu, 08 Jan 2026 00:58:41 -0800 (PST) Received: from sw07.internal.sifive.com ([4.53.31.132]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2b170675076sm8833634eec.2.2026.01.08.00.58.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Jan 2026 00:58:40 -0800 (PST) From: Nick Hu Date: Thu, 08 Jan 2026 00:58:26 -0800 Subject: [PATCH v4 3/3] cpuidle: Add SiFive power provider driver 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: <20260108-sifive-pd-drivers-v4-3-2a523d7d51a0@sifive.com> References: <20260108-sifive-pd-drivers-v4-0-2a523d7d51a0@sifive.com> In-Reply-To: <20260108-sifive-pd-drivers-v4-0-2a523d7d51a0@sifive.com> To: "Rafael J. Wysocki" , Daniel Lezcano , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Anup Patel , Samuel Holland , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Cyan Yang , Nick Hu Cc: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, linux-riscv@lists.infradead.org, devicetree@vger.kernel.org X-Mailer: b4 0.14.3 The SiFive DMC is the power provider of the devices that inside the SiFive CPU power domains, which include Tile, Cluster and Core Complex power domains. Before the cpu entering the firmware-based idle state, each devices that inside the corresponding domain should be suspended properly. this driver will create the power provider and set the correct domain idle state. Signed-off-by: Nick Hu --- drivers/cpuidle/Kconfig.riscv | 12 +++ drivers/cpuidle/Makefile | 1 + drivers/cpuidle/cpuidle-sifive-dmc-domain.c | 124 ++++++++++++++++++++++++= ++++ 3 files changed, 137 insertions(+) diff --git a/drivers/cpuidle/Kconfig.riscv b/drivers/cpuidle/Kconfig.riscv index b813018ce401..2fe0912f8027 100644 --- a/drivers/cpuidle/Kconfig.riscv +++ b/drivers/cpuidle/Kconfig.riscv @@ -22,3 +22,15 @@ config RISCV_SBI_CPUIDLE_DOMAIN Select this option to enable RISC-V SBI firmware based CPU idle driver to use PM domains, which is needed to support the hierarchical DT based layout of the idle state. + +config SIFIVE_DMC_CPUIDLE_DOMAIN + bool "SiFive DMC CPU idle Domain" + depends on ARCH_SIFIVE + depends on RISCV_SBI_CPUIDLE + depends on PM_GENERIC_DOMAINS_OF + select DT_IDLE_GENPD + default y + help + Select this option to enable RISC-V SBI firmware based CPU idle + driver to use PM domains on SiFive Platforms, which is needed to + support the hierarchical DT based layout of the idle state. diff --git a/drivers/cpuidle/Makefile b/drivers/cpuidle/Makefile index 82595849b75d..eead4c049414 100644 --- a/drivers/cpuidle/Makefile +++ b/drivers/cpuidle/Makefile @@ -43,3 +43,4 @@ obj-$(CONFIG_POWERNV_CPUIDLE) +=3D cpuidle-powernv.o # RISC-V drivers obj-$(CONFIG_RISCV_SBI_CPUIDLE) +=3D cpuidle-riscv-sbi.o obj-$(CONFIG_RISCV_SBI_CPUIDLE_DOMAIN) +=3D cpuidle-riscv-sbi-domain.o +obj-$(CONFIG_SIFIVE_DMC_CPUIDLE_DOMAIN) +=3D cpuidle-sifive-dmc-domain.o diff --git a/drivers/cpuidle/cpuidle-sifive-dmc-domain.c b/drivers/cpuidle/= cpuidle-sifive-dmc-domain.c new file mode 100644 index 000000000000..5174bc525a13 --- /dev/null +++ b/drivers/cpuidle/cpuidle-sifive-dmc-domain.c @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * SiFive CPUIDLE DMC driver + */ + +#define pr_fmt(fmt) "sifive_dmc_cpuidle_domain: " fmt + +#include +#include +#include +#include + +#include "cpuidle-riscv-sbi.h" +#include "dt_idle_genpd.h" + +static bool use_osi =3D true; + +static int sifive_cpuidle_dmc_power_off(struct generic_pm_domain *pd) +{ + struct genpd_power_state *state =3D &pd->states[pd->state_idx]; + u32 *pd_state; + + if (!state->data) + return 0; + + /* OSI mode is enabled, set the corresponding domain state. */ + pd_state =3D state->data; + sbi_set_domain_state(*pd_state); + + return 0; +} + +static int sifive_dmc_probe(struct platform_device *pdev) +{ + struct device_node *np =3D pdev->dev.of_node; + struct of_phandle_args child, parent; + struct device *dev =3D &pdev->dev; + struct generic_pm_domain *pd; + int ret =3D -ENOMEM; + + pd =3D dt_idle_pd_alloc(np, sbi_dt_parse_state_node); + if (!pd) + goto out; + + pd->flags |=3D GENPD_FLAG_IRQ_SAFE | GENPD_FLAG_CPU_DOMAIN; + if (use_osi) + pd->power_off =3D sifive_cpuidle_dmc_power_off; + else + pd->flags |=3D GENPD_FLAG_ALWAYS_ON; + + ret =3D pm_genpd_init(pd, &pm_domain_cpu_gov, false); + if (ret) + goto free_pd; + + ret =3D of_genpd_add_provider_simple(np, pd); + if (ret) + goto remove_pd; + + if (!of_parse_phandle_with_args(np, "power-domains", "#power-domain-cells= ", 0, &parent)) { + child.np =3D np; + child.args_count =3D 0; + + ret =3D of_genpd_add_subdomain(&parent, &child); + of_node_put(parent.np); + if (ret) { + pr_err("%pOF failed to add subdomain: %pOF\n", parent.np, child.np); + goto remove_pd; + } + } + + pm_runtime_enable(dev); + pr_info("init PM domain %s\n", dev_name(dev)); + return 0; + +remove_pd: + pm_genpd_remove(pd); +free_pd: + dt_idle_pd_free(pd); +out: + pr_err("failed to init PM domain ret=3D%d %pOF\n", ret, np); + return ret; +} + +static const struct of_device_id sifive_dmc_of_match[] =3D { + { .compatible =3D "sifive,tmc1", }, + { .compatible =3D "sifive,tmc0", }, + { .compatible =3D "sifive,smc1", }, + { .compatible =3D "sifive,smc0", }, + { .compatible =3D "sifive,cmc2", }, + {} +}; + +static struct platform_driver sifive_dmc_driver =3D { + .probe =3D sifive_dmc_probe, + .driver =3D { + .name =3D "sifive_dmc", + .of_match_table =3D sifive_dmc_of_match, + .suppress_bind_attrs =3D true, + }, +}; + +static int __init sifive_dmc_domain_init(void) +{ + int cpu; + + /* Detect OSI support based on CPU DT nodes */ + for_each_possible_cpu(cpu) { + struct device_node *np __free(device_node) =3D of_cpu_device_node_get(cp= u); + if (np && + of_property_present(np, "power-domains") && + of_property_present(np, "power-domain-names")) { + continue; + } else { + use_osi =3D false; + break; + } + } + + sbi_set_osi_mode(use_osi); + + /* Only probe the DMCs when OSI supported */ + return platform_driver_register(&sifive_dmc_driver); +} +core_initcall(sifive_dmc_domain_init); --=20 2.43.7