From nobody Tue Oct 7 22:39:42 2025 Received: from mail-ej1-f53.google.com (mail-ej1-f53.google.com [209.85.218.53]) (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 ED48A326A71 for ; Fri, 4 Jul 2025 16:14:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645683; cv=none; b=Uwq71EYzt4+Szw+cqghRhueQ5Xgo2SWluwzvoYSS7D+CgIEr0f9NLXwiQHoRP/Afa7w1mmPmLlL5ZUbLCi5CjQ6viprRQUnhKcXBDUa3KSDAM1Q0b1OVsRUO8xEd8/eA7pDAIPrQpMheBFLkY3yCJpMnSa6rxkZVKXOIzsRu300= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645683; c=relaxed/simple; bh=6bBYsqJZBDaFXUei7hQaZLvc2wej6cU0ty/mMwIxhps=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ACJWSXIJvkDcL9vPyP/VzaMT0pO/rrIzKbEqz+lqy6N9Zcr6cCFeK6kv1Fb23wt03Mpea/hYsUjsMRRHTAZK0gMYaw7BURiu88L1D8NcyFTd51u7fMbxIFxPFAwnTygEtGa2bUHudE2Vekf8vO8uwhVSX+Jiq/Yd08/ULXBYXcw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=d5Pw5HKw; arc=none smtp.client-ip=209.85.218.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="d5Pw5HKw" Received: by mail-ej1-f53.google.com with SMTP id a640c23a62f3a-ae0dffaa8b2so220636866b.0 for ; Fri, 04 Jul 2025 09:14:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1751645677; x=1752250477; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=OgCtpqqgn38oeYCLmnm2mb3AWR3Tqp2NnheWLsUnJas=; b=d5Pw5HKwBQ2ORmR5wASUp33TzLXEp4lqvgYQXdxRn9gU+88dC4m1L9T8rAjBE68RWC FogEdsGz4Ty2m5yZjVTxEee4hR1+DQSLfX3z5dZ0/wyRfpQ81wnFCcaLPjaqpG7zEIJt bfjxIwWaZS5YTrdL38QNG0wzHz4qAaeb75u/q5YHFIzx0jxZ+ifk5du5o142FiIkIEe8 A+Hy6x4Zm4CtQJInxGO2IqOPJ4sZ52ZBG5B9A+nOyOE+Iqg6Dl29xX4YDzZJTTOzeILe 7PSb1JHCfBTUPNbzIXj5fYa9tAF4dmDjA9lP5reA/3lQ6rDpP9ee7oB7ATUJmx5cThlB cUKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751645677; x=1752250477; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OgCtpqqgn38oeYCLmnm2mb3AWR3Tqp2NnheWLsUnJas=; b=n0y+0CAilQtg6XQoiIVg3Di54hZkbcoAjU3rOSvwW5LocLnSIC7VG/iIb4hRU2cA0n OKluGu6ZSQo2m70UJn5LSVXYLaVi+EDl3SaKAA2ABH9bss/vD3iBYievYK3vp+OBYkzV ghkiosTLae8fumxf49EHVtMrKCgTGwNdve4Rl47GS2+GvD5woShlh6Je7R251fr71o56 8aEAS3IbY5bN/f2ymUgj9E+sJ6QouEu7WS1fHcZ7b0qSsVJyilFhed3b5Oo8C0Dppu8T KJ7cYFa+aRFPnf2w/v9AEjAbvtibOQwt8p2hjRt3F8jkt+sPuTdAB7oXFVHzSANDQS2Z X1Gw== X-Forwarded-Encrypted: i=1; AJvYcCXrGF29Mml8UZbrKIKcjLPN2yP3JhJhTMlguArgnadU9Jr7QUHCWTVDJ9uUhsCKCrHr5VB/xtzV6VUxQyM=@vger.kernel.org X-Gm-Message-State: AOJu0YyNKKi4cvhqxCQc+zj3jJqLdsBAiMbnpmUzPTNMX2iQQ740k7lh QONquBwWm8BY1LsWB+grwu8SuOUu1S9sXGtmvlWecQ+aVtoY9rn5iTNi96KElFV4kkQ= X-Gm-Gg: ASbGncsJO35xg6lJ+CAYG6tRFYVcUEnkKoNf/W/0mbVt9llLACbahQUHv+mnG5jMhxw IxhxR4yBNqONIpH3uWq6W0sUQCFPSW6h6z3KFg/pdIZMTMH9Gl2hwFGZICdeSpgHDCnMIkZ4IEX E5bP/fhaYsH7ayDoh+vmzoYda0uY8Na/QH9tivoQQ6qBY7d9Lx0aK51eMMLRe5PooTKHRep4t5G TnBHxsB3N9EnMA76xyGdTu9Qb+yIiW5ZX/er3YqO9yCvuXp1DFRTX9YeAC3V49tDzOVv37Q7ciY vxuJ4HAZCenYrQ6YyjbWNX0mhtS6SE3Gh4YQCW1H22jI1rzGXRShAD443C8vzowXRWZhXJ6SCXc I67hD6Ut+nxAcJfY= X-Google-Smtp-Source: AGHT+IEwTpH1PdXGNkun2+FZQKwc/iZhEarO6PtA/vdMrWXwR9cFeo/knhPNouC+KTYZgUm2rnSe8A== X-Received: by 2002:a17:907:971a:b0:ae0:9363:4d5d with SMTP id a640c23a62f3a-ae3fbc405c7mr307577466b.2.1751645677173; Fri, 04 Jul 2025 09:14:37 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.83]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae3f66d9215sm194703766b.2.2025.07.04.09.14.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Jul 2025 09:14:36 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, catalin.marinas@arm.com, will@kernel.org, mturquette@baylibre.com, sboyd@kernel.org, p.zabel@pengutronix.de, lizhi.hou@amd.com Cc: claudiu.beznea@tuxon.dev, linux-pci@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org, John Madieu , Wolfram Sang , Claudiu Beznea Subject: [PATCH v3 1/9] soc: renesas: rz-sysc: Add syscon/regmap support Date: Fri, 4 Jul 2025 19:14:01 +0300 Message-ID: <20250704161410.3931884-2-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> References: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: John Madieu The RZ/G3E system controller has various registers that control or report some properties specific to individual IPs. The regmap is registered as a syscon device to allow these IP drivers to access the registers through the regmap API. As other RZ SoCs might have custom read/write callbacks or max-offsets, add register a custom regmap configuration. Signed-off-by: John Madieu Tested-by: Wolfram Sang [claudiu.beznea: - s/rzg3e_sysc_regmap/rzv2h_sysc_regmap in RZ/V2H sysc file - do not check the match->data validity in rz_sysc_probe() as it is always valid - register the regmap if data->regmap_cfg is valid] Signed-off-by: Claudiu Beznea --- Changes in v3: - collected tags Changes in v2: - picked the latest version from John after he addressed the review comments received at [1]; - I adjusted as specified in the SoB area [1] https://lore.kernel.org/all/20250330214945.185725-2-john.madieu.xa@bp.r= enesas.com/ drivers/soc/renesas/Kconfig | 1 + drivers/soc/renesas/r9a08g045-sysc.c | 10 ++++++++++ drivers/soc/renesas/r9a09g047-sys.c | 10 ++++++++++ drivers/soc/renesas/r9a09g057-sys.c | 10 ++++++++++ drivers/soc/renesas/rz-sysc.c | 17 ++++++++++++++++- drivers/soc/renesas/rz-sysc.h | 3 +++ 6 files changed, 50 insertions(+), 1 deletion(-) diff --git a/drivers/soc/renesas/Kconfig b/drivers/soc/renesas/Kconfig index 1930a12b8fa7..58a4ab2643d6 100644 --- a/drivers/soc/renesas/Kconfig +++ b/drivers/soc/renesas/Kconfig @@ -452,6 +452,7 @@ config RST_RCAR =20 config SYSC_RZ bool "System controller for RZ SoCs" if COMPILE_TEST + select MFD_SYSCON =20 config SYSC_R9A08G045 bool "Renesas System controller support for R9A08G045 (RZ/G3S)" if COMPIL= E_TEST diff --git a/drivers/soc/renesas/r9a08g045-sysc.c b/drivers/soc/renesas/r9a= 08g045-sysc.c index f4db1431e036..0ef6df77e25f 100644 --- a/drivers/soc/renesas/r9a08g045-sysc.c +++ b/drivers/soc/renesas/r9a08g045-sysc.c @@ -18,6 +18,16 @@ static const struct rz_sysc_soc_id_init_data rzg3s_sysc_= soc_id_init_data __initc .specific_id_mask =3D GENMASK(27, 0), }; =20 +static const struct regmap_config rzg3s_sysc_regmap __initconst =3D { + .name =3D "rzg3s_sysc_regs", + .reg_bits =3D 32, + .reg_stride =3D 4, + .val_bits =3D 32, + .fast_io =3D true, + .max_register =3D 0xe20, +}; + const struct rz_sysc_init_data rzg3s_sysc_init_data __initconst =3D { .soc_id_init_data =3D &rzg3s_sysc_soc_id_init_data, + .regmap_cfg =3D &rzg3s_sysc_regmap, }; diff --git a/drivers/soc/renesas/r9a09g047-sys.c b/drivers/soc/renesas/r9a0= 9g047-sys.c index cd2eb7782cfe..a3acf6dd2867 100644 --- a/drivers/soc/renesas/r9a09g047-sys.c +++ b/drivers/soc/renesas/r9a09g047-sys.c @@ -62,6 +62,16 @@ static const struct rz_sysc_soc_id_init_data rzg3e_sys_s= oc_id_init_data __initco .print_id =3D rzg3e_sys_print_id, }; =20 +static const struct regmap_config rzg3e_sysc_regmap __initconst =3D { + .name =3D "rzg3e_sysc_regs", + .reg_bits =3D 32, + .reg_stride =3D 4, + .val_bits =3D 32, + .fast_io =3D true, + .max_register =3D 0x170c, +}; + const struct rz_sysc_init_data rzg3e_sys_init_data =3D { .soc_id_init_data =3D &rzg3e_sys_soc_id_init_data, + .regmap_cfg =3D &rzg3e_sysc_regmap, }; diff --git a/drivers/soc/renesas/r9a09g057-sys.c b/drivers/soc/renesas/r9a0= 9g057-sys.c index 4c21cc29edbc..c26821636dce 100644 --- a/drivers/soc/renesas/r9a09g057-sys.c +++ b/drivers/soc/renesas/r9a09g057-sys.c @@ -62,6 +62,16 @@ static const struct rz_sysc_soc_id_init_data rzv2h_sys_s= oc_id_init_data __initco .print_id =3D rzv2h_sys_print_id, }; =20 +static const struct regmap_config rzv2h_sysc_regmap __initconst =3D { + .name =3D "rzv2h_sysc_regs", + .reg_bits =3D 32, + .reg_stride =3D 4, + .val_bits =3D 32, + .fast_io =3D true, + .max_register =3D 0x170c, +}; + const struct rz_sysc_init_data rzv2h_sys_init_data =3D { .soc_id_init_data =3D &rzv2h_sys_soc_id_init_data, + .regmap_cfg =3D &rzv2h_sysc_regmap, }; diff --git a/drivers/soc/renesas/rz-sysc.c b/drivers/soc/renesas/rz-sysc.c index ffa65fb4dade..70556a2f55e6 100644 --- a/drivers/soc/renesas/rz-sysc.c +++ b/drivers/soc/renesas/rz-sysc.c @@ -6,8 +6,10 @@ */ =20 #include +#include #include #include +#include #include =20 #include "rz-sysc.h" @@ -100,14 +102,19 @@ MODULE_DEVICE_TABLE(of, rz_sysc_match); =20 static int rz_sysc_probe(struct platform_device *pdev) { + const struct rz_sysc_init_data *data; const struct of_device_id *match; struct device *dev =3D &pdev->dev; + struct regmap *regmap; struct rz_sysc *sysc; + int ret; =20 match =3D of_match_node(rz_sysc_match, dev->of_node); if (!match) return -ENODEV; =20 + data =3D match->data; + sysc =3D devm_kzalloc(dev, sizeof(*sysc), GFP_KERNEL); if (!sysc) return -ENOMEM; @@ -117,7 +124,15 @@ static int rz_sysc_probe(struct platform_device *pdev) return PTR_ERR(sysc->base); =20 sysc->dev =3D dev; - return rz_sysc_soc_init(sysc, match); + ret =3D rz_sysc_soc_init(sysc, match); + if (ret || !data->regmap_cfg) + return ret; + + regmap =3D devm_regmap_init_mmio(dev, sysc->base, data->regmap_cfg); + if (IS_ERR(regmap)) + return PTR_ERR(regmap); + + return of_syscon_register_regmap(dev->of_node, regmap); } =20 static struct platform_driver rz_sysc_driver =3D { diff --git a/drivers/soc/renesas/rz-sysc.h b/drivers/soc/renesas/rz-sysc.h index 56bc047a1bff..447008140634 100644 --- a/drivers/soc/renesas/rz-sysc.h +++ b/drivers/soc/renesas/rz-sysc.h @@ -9,6 +9,7 @@ #define __SOC_RENESAS_RZ_SYSC_H__ =20 #include +#include #include #include =20 @@ -34,9 +35,11 @@ struct rz_sysc_soc_id_init_data { /** * struct rz_sysc_init_data - RZ SYSC initialization data * @soc_id_init_data: RZ SYSC SoC ID initialization data + * @regmap_cfg: SoC-specific regmap config */ struct rz_sysc_init_data { const struct rz_sysc_soc_id_init_data *soc_id_init_data; + const struct regmap_config *regmap_cfg; }; =20 extern const struct rz_sysc_init_data rzg3e_sys_init_data; --=20 2.43.0 From nobody Tue Oct 7 22:39:42 2025 Received: from mail-ed1-f51.google.com (mail-ed1-f51.google.com [209.85.208.51]) (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 0081D327183 for ; Fri, 4 Jul 2025 16:14:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645683; cv=none; b=M2JW4uq8N1dxIFciGSZMbNF7Uq1PVrLYMORhkUtbNniiKhYZfLVoUycNnMSaDZjKfizbpnR+EZEaAin0yFGALCRUS4fQmN9AaiH4WV+BVpHyE8NW+20zXUwoJ6m5LoZF9NK+/gwlh1BYqIz8mDQr5BPTbSANl77WWPk+0WGU/Rw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645683; c=relaxed/simple; bh=iGKOR9K+IYXovU50dMFSM5PU98+O5pWxvmMYxBBblOo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rRYupOwZBRRP1AMMhS/B7eH8EX3dpSdX2KcjcTmEH3xJ4OkH4rIMQvihfRAU2t2gsok9f9mxCCKSWPq0rEPV4qXW/sOIJXJnAymtepwKhCq3/a+m4cjjKOKU24sReTwLDWq3SnSEbY9HH39gBaaLJracXObjnlkVEN9lZCmsXss= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=TydEADM4; arc=none smtp.client-ip=209.85.208.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="TydEADM4" Received: by mail-ed1-f51.google.com with SMTP id 4fb4d7f45d1cf-604bff84741so1882305a12.2 for ; Fri, 04 Jul 2025 09:14:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1751645679; x=1752250479; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JmGBN4vguwr7JXCGrQEzsAEtM0h76i9zDt+HmVvYfZc=; b=TydEADM4MVm+OZh9eQDE4/03G/rYKHzrXHz9OitNZciJtECYCIZDG4CemTCdT2tVvv TW2dGEcdtrvfEYcd6OfbchqTuJ61OKNXq/ItqULkK7BCzdLNyjECIybzRKwIbNgEaZHw 25Upg49W7kMTpSjSTIQ2bSrtqgXTMa4f3zG+TsoaBk73g5+SkNo9utgeKDzpqMhClOQk 5ZVsGwnhLlojkzZYEybKouPRO4dL2Qm9qIMP+z7094YDYUnYbZsXs+FHXYiJBLnHFMOK 8aE4tobVWGmeF9Lr+copjy56jpNFz3j121dNM5bi94zZdFodDiC6mxfYjth3uz8/wgBo rneg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751645679; x=1752250479; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JmGBN4vguwr7JXCGrQEzsAEtM0h76i9zDt+HmVvYfZc=; b=r/EnVonjPii5lUjSNAArnFOK57HZzLv3Jk1RPzRkjEPqHx4Ro9NBvMo77rvtyS6jUD uk7an0lSjEwVQ1woswMK5FWmoVhFdQHBO4pmVD3DXOMi0QyDMr+FPtpa4TDPWYPkT4yl ICHV1tyboe5hEjaDyCnPW0yK6Q51fXBtBvsBnJZpjwD4hJ7vUhbYfWgZ0UM64/FA8xO9 kOiSp3gk+JaEDcw7DVFCRcdi92n3bYygHVlYWCe5WZ5AcMmT2pa3ACyHaflGZQa5c0AM E8+5RetJ42QX3DqQpSpqpss8z1j9tauc77Q4s/Ta7ZlyFv6sGgKkJKcU3RVS0BrrFoGO D1vg== X-Forwarded-Encrypted: i=1; AJvYcCWvfqElTps73fnpRpDOXUniBQdnSlVdE01LUC1o2oJAhM8HlGW687fkPrFn9e2c5t+xdHTHDN+cnK+01f0=@vger.kernel.org X-Gm-Message-State: AOJu0YwUEiVUfibQm2eAg7NIQQBtDMyBl0YDmLk2F+4in7Agy+DBoxGR 3oHLf3HHf/XvB5S5C1uU2v9/flQ3Lcl0HDLE7Q+rL8rjKJInaSHeZP2GWvogFOT8FnM= X-Gm-Gg: ASbGncuaZkxrHMV80XKUiBOZqMaAchyAiqvqeCLoQkrezaVeC84LQcL8TrnE34LnYpq STD5r3Bokmem1DBtgDBg391TZ3JGw2glIhzQTqHHjTPYGG18b+nVMEaZywWXA8jpyk1yjUZmak4 GuWw8ZcoU0pWR207AKXIfb3PFTaZsiw+S9rSQHB424rLFrsSIEyZRcTlCrr+YO1NvoWDMP9Z3vt iz1yvETZiwrFDeznAGeLdOmNPJ20VetJp5da4niPcdErXUpZoVizCf4mpQRVxG87sH8lezJyUYi BV3hzFlaSZkb746HiutkDscdWLuczkqfIeo0E6nstOB+sDvrnkwI3YLLR0SyPRzm8PXTtyhmnU1 CwvkRHqyZbV2bDqo= X-Google-Smtp-Source: AGHT+IGi14ev4epMFpAVcULI0O8fOQuvZidrlt+4KBmokmlyAj9zyscXUfCOlIWYAChv9XzOSvBlZQ== X-Received: by 2002:a17:907:7ba3:b0:add:f189:1214 with SMTP id a640c23a62f3a-ae3fbc5b749mr340373166b.24.1751645679233; Fri, 04 Jul 2025 09:14:39 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.83]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae3f66d9215sm194703766b.2.2025.07.04.09.14.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Jul 2025 09:14:38 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, catalin.marinas@arm.com, will@kernel.org, mturquette@baylibre.com, sboyd@kernel.org, p.zabel@pengutronix.de, lizhi.hou@amd.com Cc: claudiu.beznea@tuxon.dev, linux-pci@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org, Claudiu Beznea , Wolfram Sang Subject: [PATCH v3 2/9] clk: renesas: r9a08g045: Add clocks and resets support for PCIe Date: Fri, 4 Jul 2025 19:14:02 +0300 Message-ID: <20250704161410.3931884-3-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> References: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea Add clocks and resets for the PCIe IP available on the Renesas RZ/G3S SoC. The clkl1pm clock is required for PCIe link power management (PM) control and should be enabled based on the state of the CLKREQ# pin. Therefore, mark it as a no_pm clock to allow the PCIe driver to manage it during link PM transitions. Tested-by: Wolfram Sang Signed-off-by: Claudiu Beznea Reviewed-by: Geert Uytterhoeven --- Changes in v3: - collected tags - dropped the power domain support and added MSTOP as power domain code is not available anymore in the current linux-next - adjusted the patch title and description Changes in v2: - none drivers/clk/renesas/r9a08g045-cpg.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/drivers/clk/renesas/r9a08g045-cpg.c b/drivers/clk/renesas/r9a0= 8g045-cpg.c index 405907925bb7..4a6632ea22cb 100644 --- a/drivers/clk/renesas/r9a08g045-cpg.c +++ b/drivers/clk/renesas/r9a08g045-cpg.c @@ -289,6 +289,10 @@ static const struct rzg2l_mod_clk r9a08g045_mod_clks[]= =3D { MSTOP(BUS_MCPU2, BIT(14))), DEF_MOD("tsu_pclk", R9A08G045_TSU_PCLK, R9A08G045_CLK_TSU, 0x5ac, 0, MSTOP(BUS_MCPU2, BIT(15))), + DEF_MOD("pci_aclk", R9A08G045_PCI_ACLK, R9A08G045_CLK_M0, 0x608, 0, + MSTOP(BUS_PERI_COM, BIT(10))), + DEF_MOD("pci_clk1pm", R9A08G045_PCI_CLKL1PM, R9A08G045_CLK_ZT, 0x608, 1, + MSTOP(BUS_PERI_COM, BIT(10))), DEF_MOD("vbat_bclk", R9A08G045_VBAT_BCLK, R9A08G045_OSCCLK, 0x614, 0, MSTOP(BUS_MCPU3, GENMASK(8, 7))), }; @@ -329,6 +333,13 @@ static const struct rzg2l_reset r9a08g045_resets[] =3D= { DEF_RST(R9A08G045_ADC_PRESETN, 0x8a8, 0), DEF_RST(R9A08G045_ADC_ADRST_N, 0x8a8, 1), DEF_RST(R9A08G045_TSU_PRESETN, 0x8ac, 0), + DEF_RST(R9A08G045_PCI_ARESETN, 0x908, 0), + DEF_RST(R9A08G045_PCI_RST_B, 0x908, 1), + DEF_RST(R9A08G045_PCI_RST_GP_B, 0x908, 2), + DEF_RST(R9A08G045_PCI_RST_PS_B, 0x908, 3), + DEF_RST(R9A08G045_PCI_RST_RSM_B, 0x908, 4), + DEF_RST(R9A08G045_PCI_RST_CFG_B, 0x908, 5), + DEF_RST(R9A08G045_PCI_RST_LOAD_B, 0x908, 6), DEF_RST(R9A08G045_VBAT_BRESETN, 0x914, 0), }; =20 @@ -340,6 +351,10 @@ static const unsigned int r9a08g045_crit_mod_clks[] __= initconst =3D { MOD_CLK_BASE + R9A08G045_VBAT_BCLK, }; =20 +static const unsigned int r9a08g045_no_pm_mod_clks[] =3D { + MOD_CLK_BASE + R9A08G045_PCI_CLKL1PM, +}; + const struct rzg2l_cpg_info r9a08g045_cpg_info =3D { /* Core Clocks */ .core_clks =3D r9a08g045_core_clks, @@ -356,6 +371,10 @@ const struct rzg2l_cpg_info r9a08g045_cpg_info =3D { .num_mod_clks =3D ARRAY_SIZE(r9a08g045_mod_clks), .num_hw_mod_clks =3D R9A08G045_VBAT_BCLK + 1, =20 + /* No PM modules Clocks */ + .no_pm_mod_clks =3D r9a08g045_no_pm_mod_clks, + .num_no_pm_mod_clks =3D ARRAY_SIZE(r9a08g045_no_pm_mod_clks), + /* Resets */ .resets =3D r9a08g045_resets, .num_resets =3D R9A08G045_VBAT_BRESETN + 1, /* Last reset ID + 1 */ --=20 2.43.0 From nobody Tue Oct 7 22:39:42 2025 Received: from mail-ed1-f45.google.com (mail-ed1-f45.google.com [209.85.208.45]) (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 925F93271A2 for ; Fri, 4 Jul 2025 16:14:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645684; cv=none; b=efhu0f/9QletVDvEafRY3mBBMPIBbnUd8Aj+lMXBGZGZbBpcXYsI4mbah1mdIT82MacWnY4WcukpQhFY7XUFSY6WmCb/fT+y2v8Cg9euGhF+w1/Kx4CSBKCbMkunw3iEaLuLzgsgnHviqCWyvg5o4hYccced6x431zMjNQltnAs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645684; c=relaxed/simple; bh=8qyZx+ACiY0+WBNIGME8B9wVL18PEIEvpUnFL2L5JlY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oTIaXcIQCY3MyjBrTXmqDWRndSgHihxHo85v3nxufB7rx6GtD31WxA79LquC6tAzCiJEWShfpBWnw7eqj8hM4zNpbT/O/cmsA0HIamXJIu3EGvLCaeE+rIdHGDja5sIfPj5BmcOIUaHqvadJDlpeyc4vU1AQj04Mn4pTow53bog= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=nJ7qrkuQ; arc=none smtp.client-ip=209.85.208.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="nJ7qrkuQ" Received: by mail-ed1-f45.google.com with SMTP id 4fb4d7f45d1cf-607ec30df2bso2123463a12.1 for ; Fri, 04 Jul 2025 09:14:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1751645681; x=1752250481; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=EDcC8N9ecRYf9VHdU9K0Q9wS+bIYi9ixK/h1xf/HBCM=; b=nJ7qrkuQ8JGmwc8qNezgio1TfFxtRIvONYqndX+NCODLX4GTTS8CaZMDPWpKIYYdtA krjNtqYKeIQV0ePeCpxEdZeT3VWsdzT5QGy7yukNOBi4ueOiaFaEoRHPBmFN0nHk2cvb 00MDsyniuVi6HcWZZjWddUudt9qSHfDRBZ6Qc8FiBWvLUhJ4VKjHNc77imjyyiah5RHZ 8wGzo2+y9s3WRxTL3dAD5Re4a5IjndKeev/vQZ+NDfy6ES5cvOPlpfecFgbGfnhFoNV5 TmVUe2+5tKarak4W/VQR/+8gFPA3mnsBf3VNSWQ6KtT9NOANRN5bJE7+xvJSvF4T2uyc 1yBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751645681; x=1752250481; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=EDcC8N9ecRYf9VHdU9K0Q9wS+bIYi9ixK/h1xf/HBCM=; b=wEMTEG35ru84f2SCm6ZW+5zoTIvrLC1DKdBEE9wtT+KTW6NGAMW+FJxTw89m07DhH5 K/hWPEpjJiLk/kx69E2TzYWO/j1AfXleF3CMapbWyxaTxIphkkPC+ml+2r7HUFRTW7Bh nlM66mVjA9BqG1NsJ2DET25a/UvbMJWxKNYuGCDNdjjJVyLBzQvJubw3IAv0cbmrVZ5p qylM1Qoc2Xd3gxSGYQp2lHJv7BZV8Jrb/1vt8K6VTLdWY6voFm1RSd27K+9OQHOuJJtY MPdQrlFOIxYUacpocDRVH9/zgdSOa2B13Tg5DPX17K4IJ9HmgOSvQyVB1y2f6ypV/NTI ygCA== X-Forwarded-Encrypted: i=1; AJvYcCU/gJ9DStZuDCUMVD1ZR/727b7i7TF50vKhk+aaIipoIVsuA2Jzyb5QjuN3s+UngAJR5SfkTPDqviF+IzU=@vger.kernel.org X-Gm-Message-State: AOJu0YwOYNkxBX2DbfqKL4ZNvdJ8nShysbpboNtuPht3Jrtkx6UoHhS4 ktHzhmnk+kG8Bedf7eSA2d5XguNyfEPA2jypH0Ui25nhBV/byVp3evdSnCqO5Dkp4J4= X-Gm-Gg: ASbGnctR0qrLGxTjOqQgBERtgQmPFZ4xRpEH85OALiBuSFkwJID+UQgHgW5qSBA+6h0 HIHEcjv3H581SnA4r7ZFSNuYLs3pxVGiGuaqZaVN7gTUUWXVc73nVWDye3pkfbK3vpDZ6Vyl6wa uPJ25lRG3sLqtCVQ4VQ8dJAkS3JhBFHxHImnfBJBENXHGN640es81mGWwFsAMALMfhv6L6ZunDV 3mrEjrBS5udWW5oYVunAEbQpvXgS89TSBAgTFUoXVm5I60o4e/CYmGSnQ7UpsgWsWHZg15je7El DqxqbP7QXandgsMtRMpETgcAr8Fhv7DeyEK/IHFI6DnZDlpOHA5FeluE7UY84J2FFPiPjjVO6IY 3YDiU3toihZG9lW4= X-Google-Smtp-Source: AGHT+IGL1FhLD4OaydMHDQRErBXQVTMo3OYnTq5XD1D0AoTOZG1fs0lJwUIPUfaPAE25gc/Ra0hNDQ== X-Received: by 2002:a17:907:dab:b0:ae0:c0b3:5656 with SMTP id a640c23a62f3a-ae3fbc6509bmr348476466b.22.1751645680835; Fri, 04 Jul 2025 09:14:40 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.83]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae3f66d9215sm194703766b.2.2025.07.04.09.14.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Jul 2025 09:14:40 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, catalin.marinas@arm.com, will@kernel.org, mturquette@baylibre.com, sboyd@kernel.org, p.zabel@pengutronix.de, lizhi.hou@amd.com Cc: claudiu.beznea@tuxon.dev, linux-pci@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 3/9] PCI: of_property: Restore the arguments of the next level parent Date: Fri, 4 Jul 2025 19:14:03 +0300 Message-ID: <20250704161410.3931884-4-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> References: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea of_pci_make_dev_node() creates a device tree node for the PCIe bridge it detects. The node name follows the format: pci_type@pci_slot,pci_func. If such a node already exists in the current device tree, a new one is not created. When the node is created, its contents are populated with information from the parent node. In the case of root complex nodes described in the device tree, the created node duplicates the interrupt-map property. However, the duplicated interrupt-map property does not correctly point to the next interrupt controller. For example, in the case of the Renesas RZ/G3S SoC, the resulting device tree node is as follows (only relevant DT properties are shown): pcie@11e40000 { // ... interrupt-map =3D <0x00 0x00 0x00 0x01 0x1f 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x1f 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x03 0x1f 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x04 0x1f 0x00 0x00 0x00 0x03>; interrupt-map-mask =3D <0x00 0x00 0x00 0x07>; interrupt-controller; #interrupt-cells =3D <0x01>; #address-cells =3D <0x03>; #size-cells =3D <0x02>; phandle =3D <0x1f>; // ... pci@0,0 { reg =3D <0x00 0x00 0x00 0x00 0x00>; interrupt-map =3D <0x10000 0x00 0x00 0x01 0x1f 0x00 0x11e40000 0x00= 0x00 0x10000 0x00 0x00 0x02 0x1f 0x00 0x11e40000 0x00 0= x01 0x10000 0x00 0x00 0x03 0x1f 0x00 0x11e40000 0x00 0= x02 0x10000 0x00 0x00 0x04 0x1f 0x00 0x11e40000 0x00 0= x03>; interrupt-map-mask =3D <0xffff00 0x00 0x00 0x07>; #interrupt-cells =3D <0x01>; #address-cells =3D <0x03>; #size-cells =3D <0x02>; // ... }; }; With this pci@0,0 node, the interrupt-map parsing code behaves as follows: When a PCIe endpoint is enumerated and it requests to map a legacy interrupt, of_irq_parse_raw() is called requesting the interrupt from pci@0,0. If INTA is requested, of_irq_parse_raw() first matches: interrupt-map =3D <0x10000 0x00 0x00 0x01 0x1f 0x00 0x11e40000 0x00 0x00> from the pci@0,0 node. It then follows the phandle 0x1f to the interrupt parent, looking for a mapping for interrupt ID 0x00 (0x00 0x11e40000 0x00 0x00). However, the root complex node does not provide this mapping in its interrupt-map property, causing the interrupt request to fail. To avoid this, in the interrupt-map property of the nodes generated by of_pci_make_dev_node() map legacy interrupts to entries that are valid in the next level interrupt controller in the interrupt mapping tree. With this, the generated pci@0,0 node and its parent look as follows: pcie@11e40000 { // ... interrupt-map =3D <0x00 0x00 0x00 0x01 0x1f 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x1f 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x03 0x1f 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x04 0x1f 0x00 0x00 0x00 0x03>; interrupt-map-mask =3D <0x00 0x00 0x00 0x07>; interrupt-controller; #interrupt-cells =3D <0x01>; #address-cells =3D <0x03>; #size-cells =3D <0x02>; phandle =3D <0x1f>; // ... pci@0,0 { reg =3D <0x00 0x00 0x00 0x00 0x00>; interrupt-map =3D <0x10000 0x00 0x00 0x01 0x1f 0x00 0x11e40000 0x00= 0x01 0x10000 0x00 0x00 0x02 0x1f 0x00 0x11e40000 0x00 0= x02 0x10000 0x00 0x00 0x03 0x1f 0x00 0x11e40000 0x00 0= x03 0x10000 0x00 0x00 0x04 0x1f 0x00 0x11e40000 0x00 0= x04>; interrupt-map-mask =3D <0xffff00 0x00 0x00 0x07>; #interrupt-cells =3D <0x01>; #address-cells =3D <0x03>; #size-cells =3D <0x02>; }; }; Fixes: 407d1a51921e ("PCI: Create device tree node for bridge") Signed-off-by: Claudiu Beznea --- Changes in v3: - none; this patch is new drivers/pci/of_property.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/pci/of_property.c b/drivers/pci/of_property.c index 506fcd507113..8dfed096326f 100644 --- a/drivers/pci/of_property.c +++ b/drivers/pci/of_property.c @@ -243,6 +243,14 @@ static int of_pci_prop_intr_map(struct pci_dev *pdev, = struct of_changeset *ocs, } of_property_read_u32(out_irq[i].np, "#address-cells", &addr_sz[i]); + + /* + * Restore the arguments of the next level parent if a map + * was found. + */ + out_irq[i].np =3D pnode; + out_irq[i].args_count =3D 1; + out_irq[i].args[0] =3D pin; } =20 list_for_each_entry(child, &pdev->subordinate->devices, bus_list) { --=20 2.43.0 From nobody Tue Oct 7 22:39:42 2025 Received: from mail-ej1-f42.google.com (mail-ej1-f42.google.com [209.85.218.42]) (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 5A9F4327A2F for ; Fri, 4 Jul 2025 16:14:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645686; cv=none; b=VuY5SV/r7b1/qQiWNjlStwnCWlqXOlrToRKR3s3QLrx2XYDTxqi25dZpC5SRfpDgZUGlur8CKCjbz+NYYx0VWyIAE2KzlWXX3u9wyrHnZZpnqDvLJE/XEzFiDGEmrgvA+WKNrQkrvZ1FrUiU9VVhzprqdSEr+9QWYVTZeo4gu68= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645686; c=relaxed/simple; bh=ubkY+ASsC77/NLfS+/kNeOhi3pom6Deb7Y0KTpv9Ly0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RPEZxp7klQaAYtQludT9YEED/cUsCc62v/Ft967AkFsb5dAfGKBronaTcnGSi5Pj62wIHfYOtUDFNjdm7JmuOkuHTXMoFWfG1n9150MKRnsLjwuSC8PZmhR8ygxzthRXqvziEbHd/RnplCqXb8zLlAkA+qtTAZFDWfPvEth6pew= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=CrrgPdyW; arc=none smtp.client-ip=209.85.218.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="CrrgPdyW" Received: by mail-ej1-f42.google.com with SMTP id a640c23a62f3a-ae3a604b43bso180468366b.0 for ; Fri, 04 Jul 2025 09:14:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1751645683; x=1752250483; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=KkOwcwg0QMfkyPLB7333OfTZ1BiRXOsUSblm0YS+eKE=; b=CrrgPdyWd6EukVqlfzR6jrzky2cC1Np6Fksx5m7mOJjTjlx/djPhSYu/asFFMBPDv4 9DDlvraZuLio8cS3LsGXvvTYn4ndqwPdVoK3ANwVt5o28jCvI+PJolLEdwJWoRsZGdWP YgFv1pVmFaJIcB1v2HrZuF3+8xvrixJuYDsrnyflsktZv9Xg+vOD4mE0yecRtr3Ddb4s zJlzAJVnZBN1/d2NNxrtbhfL8rsrxOiOLxu1fdPS677104lakckkHkzcHCURDqQZCTnF x/jmjpQFWKYF6IG5K4hZNWJGk20NLfXvIEwhIDvQuCiClxFDD6KvaTJGzsKjXtNojJfv inNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751645683; x=1752250483; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KkOwcwg0QMfkyPLB7333OfTZ1BiRXOsUSblm0YS+eKE=; b=UVrXJTQqpcuAnBYYWjoX946Pr4Ghm2xt3fHXoHe8fw7SNJsl720bcl6aTkCi6YhXsi /hBla9G9VQ4PB0iNGHdqZDhE94yB5y34wSeF0+6tolKr03yosTRngFMimn8L8nDh/7vp ITk6jXmtX0hcSS/m4wW7Ps+vkds3bIABu67n6P+uJjVTxbsABF0W0EUv9b0cueNswfni d371gLDxT9x9VIybn7LeM07bGD90b9402qtvm1MpwM3w147xoPTMVRbqkCLfU9ZsMxcZ uu4vhrCpXakjC4DV3UZGljbVsFXTcXfCnrj4my5wl3Hx8EU678l+5b5SVrOkRRni0fUK 182Q== X-Forwarded-Encrypted: i=1; AJvYcCUcT5ZGb6qoUo/V4ua2HL00b8WDYx2oFnynWkrlGix63A7fBKVbYabxaJLCMh14NASrQBoHXcW35RGsNyE=@vger.kernel.org X-Gm-Message-State: AOJu0YwLqNsT7U+sznNA9b1dDgrIM/Z2GOBoVLQP7m5KULzB/xQXnBqK Fy7fanZZ+Nnvf+iCUCpAI1+7xaX56Wd6eBJqmddQuQvluXr2JWfAgyjz2Aqj3IXMB/w= X-Gm-Gg: ASbGncvZfOSZvtS4hexnUwt72og2gU813WpDs0nvuPZWXUfnpgSEY7JXWAr0hvZAedf tl+d/wSKo/kJssPMV240BP0adl/fSejMli/N7j8IsOIhl2rRv4D3KbjHALzoQB9aOUShIBdcrYS 9wjklSHpU9J/tYovSCaYW1tBJvjGWccoF4VjW3G+1fqgXd+t34yPSW9Pr5YlbU/0i5d3Jz9bayk tLGEmciIosaoDQFEoNWZUYopnDyaPpLyLS/3lNj72sn0n7qA+0VOoT3ma4Pu9q/ZJgWFfAtBTuT DXQtOsPNoRda+bva9JoTRChhh+yTRdbYClJ3snV0QVeSBqqE1zd92Win1CJF786z69KAXSU/VTL LI5+u3nIpwNKo8GE= X-Google-Smtp-Source: AGHT+IGZ4JE/8eQjPvugbMtudMafjOOm0CxMF4rvO8QtgqMHcfbetqVSRRSNB4T9WuYI97B08ZtIRg== X-Received: by 2002:a17:906:d7c5:b0:ae3:dad1:70c8 with SMTP id a640c23a62f3a-ae3fbd50a6fmr314770766b.42.1751645682493; Fri, 04 Jul 2025 09:14:42 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.83]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae3f66d9215sm194703766b.2.2025.07.04.09.14.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Jul 2025 09:14:42 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, catalin.marinas@arm.com, will@kernel.org, mturquette@baylibre.com, sboyd@kernel.org, p.zabel@pengutronix.de, lizhi.hou@amd.com Cc: claudiu.beznea@tuxon.dev, linux-pci@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org, Claudiu Beznea , Wolfram Sang Subject: [PATCH v3 4/9] dt-bindings: PCI: renesas,r9a08g045s33-pcie: Add documentation for the PCIe IP on Renesas RZ/G3S Date: Fri, 4 Jul 2025 19:14:04 +0300 Message-ID: <20250704161410.3931884-5-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> References: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea The PCIe IP available on the Renesas RZ/G3S complies with the PCI Express Base Specification 4.0. It is designed for root complex applications and features a single-lane (x1) implementation. Add documentation for it. Reviewed-by: Rob Herring (Arm) Tested-by: Wolfram Sang Signed-off-by: Claudiu Beznea --- Changes in v3: - collected tags - updated the flags of ranges property from example Changes in v2: - update the interrupt names by dropping "int" and "rc" string; due to this the patch description was adjusted - added "interrupt-controller" and made it mandatory - s/clkl1pm/pm/g - dropped the legacy-interrupt-controller node; with this the gic interrupt controller node was dropped as well as it is not needed anymore - updated interrupt-map in example and added interrupt-controller - added clock-names as required property as the pm clock is not handled though PM domains; this will allow the driver to have the option to request the pm clock by its name when implementation will be adjusted to used the pm clock - adjusted the size of dma-ranges to reflect the usage on SMARC module board - moved "renesas,sysc" at the end of the node in example to align with dts coding style .../pci/renesas,r9a08g045s33-pcie.yaml | 202 ++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 Documentation/devicetree/bindings/pci/renesas,r9a08g045= s33-pcie.yaml diff --git a/Documentation/devicetree/bindings/pci/renesas,r9a08g045s33-pci= e.yaml b/Documentation/devicetree/bindings/pci/renesas,r9a08g045s33-pcie.ya= ml new file mode 100644 index 000000000000..42a9494c96c0 --- /dev/null +++ b/Documentation/devicetree/bindings/pci/renesas,r9a08g045s33-pcie.yaml @@ -0,0 +1,202 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/pci/renesas,r9a08g045s33-pcie.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Renesas RZ/G3S PCIe host controller + +maintainers: + - Claudiu Beznea + +description: + Renesas RZ/G3S PCIe host controller complies with PCIe Base Specification + 4.0 and supports up to 5 GT/s (Gen2). + +properties: + compatible: + const: renesas,r9a08g045s33-pcie # RZ/G3S + + reg: + maxItems: 1 + + interrupts: + items: + - description: System error interrupt + - description: System error on correctable error interrupt + - description: System error on non-fatal error interrupt + - description: System error on fatal error interrupt + - description: AXI error interrupt + - description: INTA interrupt + - description: INTB interrupt + - description: INTC interrupt + - description: INTD interrupt + - description: MSI interrupt + - description: Link bandwidth interrupt + - description: PME interrupt + - description: DMA interrupt + - description: PCIe event interrupt + - description: Message interrupt + - description: All interrupts + + interrupt-names: + items: + - description: serr + - description: ser_cor + - description: serr_nonfatal + - description: serr_fatal + - description: axi_err + - description: inta + - description: intb + - description: intc + - description: intd + - description: msi + - description: link_bandwidth + - description: pm_pme + - description: dma + - description: pcie_evt + - description: msg + - description: all + + interrupt-controller: true + + clocks: + items: + - description: System clock + - description: PM control clock + + clock-names: + items: + - description: aclk + - description: pm + + resets: + items: + - description: AXI2PCIe Bridge reset + - description: Data link layer/transaction layer reset + - description: Transaction layer (ACLK domain) reset + - description: Transaction layer (PCLK domain) reset + - description: Physical layer reset + - description: Configuration register reset + - description: Configuration register reset + + reset-names: + items: + - description: aresetn + - description: rst_b + - description: rst_gp_b + - description: rst_ps_b + - description: rst_rsm_b + - description: rst_cfg_b + - description: rst_load_b + + power-domains: + maxItems: 1 + + dma-ranges: + description: + A single range for the inbound memory region. + maxItems: 1 + + renesas,sysc: + description: System controller phandle + $ref: /schemas/types.yaml#/definitions/phandle + + vendor-id: + const: 0x1912 + + device-id: + const: 0x0033 + +required: + - compatible + - reg + - clocks + - clock-names + - resets + - reset-names + - interrupts + - interrupt-names + - interrupt-map + - interrupt-map-mask + - interrupt-controller + - power-domains + - "#address-cells" + - "#size-cells" + - "#interrupt-cells" + - renesas,sysc + - vendor-id + - device-id + +allOf: + - $ref: /schemas/pci/pci-host-bridge.yaml# + +unevaluatedProperties: false + +examples: + - | + #include + #include + + bus { + #address-cells =3D <2>; + #size-cells =3D <2>; + + pcie@11e40000 { + compatible =3D "renesas,r9a08g045s33-pcie"; + reg =3D <0 0x11e40000 0 0x10000>; + ranges =3D <0x02000000 0 0x30000000 0 0x30000000 0 0x8000000>; + dma-ranges =3D <0x42000000 0 0x48000000 0 0x48000000 0 0x38000= 000>; + bus-range =3D <0x0 0xff>; + clocks =3D <&cpg CPG_MOD R9A08G045_PCI_ACLK>, + <&cpg CPG_MOD R9A08G045_PCI_CLKL1PM>; + clock-names =3D "aclk", "pm"; + resets =3D <&cpg R9A08G045_PCI_ARESETN>, + <&cpg R9A08G045_PCI_RST_B>, + <&cpg R9A08G045_PCI_RST_GP_B>, + <&cpg R9A08G045_PCI_RST_PS_B>, + <&cpg R9A08G045_PCI_RST_RSM_B>, + <&cpg R9A08G045_PCI_RST_CFG_B>, + <&cpg R9A08G045_PCI_RST_LOAD_B>; + reset-names =3D "aresetn", "rst_b", "rst_gp_b", "rst_ps_b", + "rst_rsm_b", "rst_cfg_b", "rst_load_b"; + interrupts =3D , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + interrupt-names =3D "serr", "serr_cor", "serr_nonfatal", + "serr_fatal", "axi_err", "inta", + "intb", "intc", "intd", "msi", + "link_bandwidth", "pm_pme", "dma", + "pcie_evt", "msg", "all"; + #interrupt-cells =3D <1>; + interrupt-controller; + interrupt-map-mask =3D <0 0 0 7>; + interrupt-map =3D <0 0 0 1 &pcie 0 0 0 0>, /* INT A */ + <0 0 0 2 &pcie 0 0 0 1>, /* INT B */ + <0 0 0 3 &pcie 0 0 0 2>, /* INT C */ + <0 0 0 4 &pcie 0 0 0 3>; /* INT D */ + device_type =3D "pci"; + num-lanes =3D <1>; + #address-cells =3D <3>; + #size-cells =3D <2>; + power-domains =3D <&cpg>; + vendor-id =3D <0x1912>; + device-id =3D <0x0033>; + renesas,sysc =3D <&sysc>; + }; + }; + +... --=20 2.43.0 From nobody Tue Oct 7 22:39:42 2025 Received: from mail-ej1-f44.google.com (mail-ej1-f44.google.com [209.85.218.44]) (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 D20972D59E2 for ; Fri, 4 Jul 2025 16:14:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645693; cv=none; b=Z/EvJCYPFJYx9NkTVjscWSaYWQokug29w8167J4Ezi45NX/mPuCKCWjMPKXD3W2BA1tocy5z+yCGwnM9mUSarL/17DVS3eU1Qf2etjSXSfBmLssl6qfCBg7GfxDLu8E/eBmR7MpK+Gn61pfyEB4UPc0tm7HDDxqBIxl0zV/VBKo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645693; c=relaxed/simple; bh=WlTQQi8xrBn95WlePKC5rBxeT4MGcbSyYFog8WIuuvI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Z3KBK2o7kvLPUjWo9Lqtmd6XQX8gQH5cMKqG5TJBd088UYBWQmMAgECRUbqjjKmKbXMPnjEz1WbketU+JVIU614u4FEOuOL2ikUWyUymGcDx3mzreJZ/JVRmwJZDvCsVfhdBz/M2LXSe5B7OH/a0NOHbY5U9NPJTU+cgik5/cIw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=hguTg7uq; arc=none smtp.client-ip=209.85.218.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="hguTg7uq" Received: by mail-ej1-f44.google.com with SMTP id a640c23a62f3a-ae0c571f137so222909266b.0 for ; Fri, 04 Jul 2025 09:14:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1751645686; x=1752250486; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dBJY7FO31JPia/tgp3mNdFsWvjzlZmp3cMuEWC88cmA=; b=hguTg7uq0tIqhXixSVZ5bofrq5OoCoTLGL2nKeRn8ZqwS7gqEb2jnorap5Nzvs04gT P5IGkmuxQd+CFeyfxfRcfLchhjvsx5k+6pQMaH1Rby0pctdhJaVMekX7j+8r8KumJeO3 px3Yn2WsgFqC7sxNDw5ct+HL37UlrlqK7xfzuNMP0z0sK0kttHzjCYzJTPdVJBd729uR joy92QevOs7pelL0Lxf67JEMT9ctKxF8mxmBRDDK9MlkXGmryL5TpW8PYmDt4odDY3jf vAstvEwQtSsNvippXhMm4KrIXCs9NSqWIDbitXGobAkZScpAdu8QlzQB02a/G/Z9AVHX x2Lw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751645686; x=1752250486; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dBJY7FO31JPia/tgp3mNdFsWvjzlZmp3cMuEWC88cmA=; b=rWHgwLtYERCh5v6vYtesCPdIOh4v8Y1zFTNcVyk86LvJwfZk8Lpv8tDnnVLfoia9nf MGomEEA4uxAHFqPxuNlGRmvoG0ty+ju6+g+mUx0hgeDl2QSnhdYc6XQpbPxbgd+P4fdz 1/NN3vYizvaoPs4FyKmNzPkd52x2rw1XQiLifLv3cKT3hETp4gdZo4nTHMWLA6sr9eFm GTrx1RNPYfqLtqyalMNfuZvcjKn3onNxc8rKqnW5vW2y+DubRyThWc5OhWJALM7ue6dK T2R3BHwS+1uWPyot6+kWO1l9dAMU3fyaEjHfhnuGrYTP8cs8zO7XVvKG3R0knotJhiTp T3WQ== X-Forwarded-Encrypted: i=1; AJvYcCWtDbRVkvnHg57/QYU5FDbY6jyS7cahIu3beveOjZO4jchnHAIh5thvMB5s5SWdAO6/gFYhTVHhAOSJ56Y=@vger.kernel.org X-Gm-Message-State: AOJu0YxU8iqEAikHqkzsUO1+8dW6kErw0UDPthKjUu7guY6bMG+PJHIc ZVoC0QQRepuhXycTEf5TGJ+daDmqAM3rhOzOtb3hE4jtuyV8L2MLfkMrvAUwIlw6RnE= X-Gm-Gg: ASbGnctnk0jdg/cigogSF8GpSKwsBYkTwJGPJUrD20EgpkPr8C6ZZ4pjbe47eC4QVOB kzrbkBpg6zkQNRayQqtJp0yQwOmZx1pCxlPt92Jz/RGT+muEybwu65R02kNEeMC65dvHm/9+0Yk is3as5mZOgBv2qExZUc4/lbbPqEMcMTee7lMHBQxwfbc7JNkgQPVywVAFvdOcAskmXX7VE73GTk dDFPgIO6sVIGu5jNZtWIGbZDvT8E35Egr3WiD0tOHuhsRCW7CIFsBStuk8zqY0rfKbxWbH8/2oY RfIdK//a8adoMRo6zCjee8z1KLAYcqcTevTW+pL31/QcqSPNu+iJIBm5vTEdM5IOOMGZoiI7ln3 jy0qUgCyIIXcSCe190eUP00BcpA== X-Google-Smtp-Source: AGHT+IEW5YMqY6eDrmYVz4DoOgUf90xhh0ANPc6fpTUQjOrVT2YZB20eX3qivOKLWaoeexHpjfAS+A== X-Received: by 2002:a17:907:9815:b0:ae3:9ec1:9c03 with SMTP id a640c23a62f3a-ae3fbd4a32bmr326749166b.37.1751645685679; Fri, 04 Jul 2025 09:14:45 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.83]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae3f66d9215sm194703766b.2.2025.07.04.09.14.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Jul 2025 09:14:43 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, catalin.marinas@arm.com, will@kernel.org, mturquette@baylibre.com, sboyd@kernel.org, p.zabel@pengutronix.de, lizhi.hou@amd.com Cc: claudiu.beznea@tuxon.dev, linux-pci@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org, Claudiu Beznea , Wolfram Sang Subject: [PATCH v3 5/9] PCI: rzg3s-host: Add Initial PCIe Host Driver for Renesas RZ/G3S SoC Date: Fri, 4 Jul 2025 19:14:05 +0300 Message-ID: <20250704161410.3931884-6-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> References: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea The Renesas RZ/G3S features a PCIe IP that complies with the PCI Express Base Specification 4.0 and supports speeds of up to 5 GT/s. It functions only as a root complex, with a single-lane (x1) configuration. The controller includes Type 1 configuration registers, as well as IP specific registers (called AXI registers) required for various adjustments. Hardware manual can be downloaded from the address in the "Link" section. The following steps should be followed to access the manual: 1/ Click the "User Manual" button 2/ Click "Confirm"; this will start downloading an archive 3/ Open the downloaded archive 4/ Navigate to r01uh1014ej*-rzg3s-users-manual-hardware -> Deliverables 5/ Open the file r01uh1014ej*-rzg3s.pdf Link: https://www.renesas.com/en/products/rz-g3s?queryID=3D695cc067c2d89e3f= 271d43656ede4d12 Tested-by: Wolfram Sang Signed-off-by: Claudiu Beznea --- Changes in v3: - updated patch description with link to the hardware manual and steps to access it - included to solve compilation errors - used devm_mutex_init() - used SZ_4K instead of 4096 - dropped PCIe register defines and used the ones from include/uapi/linux/pci_regs.h; added RZG3S_PCI_CFG_PCIEC as the starting offset of the capabilities to be used before the host bridge is registered - added blank lines around registers and bitfields defines - kept the defines for bitfies in order (from MSB to LSB) - dropped timeout defines (except RZG3S_REQ_ISSUE_TIMEOUT_US) and used the ones from ../pci.h - dropped rzg3s_pcie_link_speed and used defines from=20 include/uapi/linux/pci_regs.h - in rzg3s_pcie_child_write() call directly rzg3s_pcie_child_write_conf() if size is 4 and print the warning message on in the other cases - return NULL in rzg3s_pcie_child_map_bus() and added a comment about it - in rzg3s_pcie_root_write() and rzg3s_soc_pcie_init_phy() added a comment about the setting done on RZG3S_PCI_PERM register - register rzg3s_pcie_msi_free_domains(), rzg3s_pcie_msi_teardown(), rzg3s_pcie_intx_teardown() as devm action or reset functions - used irq_domain_create_linear() for intx domain - added the rzg3s_pcie_power_resets_deassert() helper to de-assert the power domain and wait before doing it - wait PCIE_RESET_CONFIG_WAIT_MS before registering the host - made rzg3s_soc_power_resets[] and rzg3s_soc_cfg_resets[] static - added suppress_bind_attrs =3D true - collected tags Changes in v2: - dropped the references to other RZ SoCs from patch description - dropped the dot at the end of single line comments that are not a sentence - as a result of v2 rework removed unused macros and definitions (e.g. RZG3S_PCI_REQISS_TR_TP1_RD, RZG3S_PCI_REQISS_TR_TP1_WR, enum rzg3s_pcie_cfg_access_type) - dropped driver specific defines that are for generic PCI register offsets and used the generic ones - updated the value of RZG3S_PCI_MSI_INT_NR as on RZ/G3S there are no more than 32 MSIs (v1 value was due to mistake in the HW manual) - added timeout macros to be used by read_poll_timeout() specific functions - re-worked the reset handling part by using reset subsystem specific functions only; with this the struct rzg3s_pcie_soc_data was added; reference to PHY initialization function was added to this structure as well - dropped devres_group_id as the issue it tried to address will now be fixed in platform bus code (v2 posted [2]) - use 80 columns alignment - updated function name in the idea of using names similar to what is used in other drivers - added rzg3s_pcie_root_ops and rzg3s_pcie_child_ops and populate bridge->ops, bridge->child_ops with it; from probe: + bridge->ops =3D &rzg3s_pcie_root_ops; + bridge->child_ops =3D &rzg3s_pcie_child_ops; - print a warning for 32 bit accesses (based on the value of bus->unsafe_warn as done in the common code) - dropped dev_dbg() in read/write functions - added HW manual revision identifier in comments that points to the statements from manual - reworked the rzg3s_pcie_intx_setup() as the legacy interrupt DT node is not used anymore - in rzg3s_pcie_config_init() do not hardcode anymore the primary bus, secondary bus, subordinate bus but get this information from device tree and update HW registers accordingly - dropped rzg3s_pcie_remove() and added rzg3s_pcie_host_remove_action() to be used as a devm action or reset function - s/rzg3s_pcie_suspend/rzg3s_pcie_suspend_noirq, s/rzg3s_pcie_resume/rzg3s_pcie_resume_noirq - dropped DEFINE_NOIRQ_DEV_PM_OPS() - updated driver name (rzg3s-pcie-host) to reflect it is for RZ/G3S=20 [2] https://lore.kernel.org/all/20250526122054.65532-2-claudiu.beznea.uj@bp= .renesas.com MAINTAINERS | 8 + drivers/pci/controller/Kconfig | 7 + drivers/pci/controller/Makefile | 1 + drivers/pci/controller/pcie-rzg3s-host.c | 1715 ++++++++++++++++++++++ 4 files changed, 1731 insertions(+) create mode 100644 drivers/pci/controller/pcie-rzg3s-host.c diff --git a/MAINTAINERS b/MAINTAINERS index fcc77c93f8db..31ef76503e17 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -19435,6 +19435,14 @@ S: Maintained F: drivers/pci/controller/dwc/pcie-qcom-common.c F: drivers/pci/controller/dwc/pcie-qcom.c =20 +PCIE DRIVER FOR RENESAS RZ/G3S SERIES +M: Claudiu Beznea +L: linux-pci@vger.kernel.org +L: linux-renesas-soc@vger.kernel.org +S: Supported +F: Documentation/devicetree/bindings/pci/renesas,r9a08g045s33-pcie.yaml +F: drivers/pci/controller/pcie-rzg3s-host.c + PCIE DRIVER FOR ROCKCHIP M: Shawn Lin L: linux-pci@vger.kernel.org diff --git a/drivers/pci/controller/Kconfig b/drivers/pci/controller/Kconfig index 886f6f43a895..76fa5f330105 100644 --- a/drivers/pci/controller/Kconfig +++ b/drivers/pci/controller/Kconfig @@ -258,6 +258,13 @@ config PCI_RCAR_GEN2 There are 3 internal PCI controllers available with a single built-in EHCI/OHCI host controller present on each one. =20 +config PCIE_RENESAS_RZG3S_HOST + tristate "Renesas RZ/G3S PCIe host controller" + depends on ARCH_RENESAS || COMPILE_TEST + select MFD_SYSCON + help + Say Y here if you want PCIe host controller support on Renesas RZ/G3S S= oC. + config PCIE_ROCKCHIP bool depends on PCI diff --git a/drivers/pci/controller/Makefile b/drivers/pci/controller/Makef= ile index 038ccbd9e3ba..229929a945c2 100644 --- a/drivers/pci/controller/Makefile +++ b/drivers/pci/controller/Makefile @@ -10,6 +10,7 @@ obj-$(CONFIG_PCI_TEGRA) +=3D pci-tegra.o obj-$(CONFIG_PCI_RCAR_GEN2) +=3D pci-rcar-gen2.o obj-$(CONFIG_PCIE_RCAR_HOST) +=3D pcie-rcar.o pcie-rcar-host.o obj-$(CONFIG_PCIE_RCAR_EP) +=3D pcie-rcar.o pcie-rcar-ep.o +obj-$(CONFIG_PCIE_RENESAS_RZG3S_HOST) +=3D pcie-rzg3s-host.o obj-$(CONFIG_PCI_HOST_COMMON) +=3D pci-host-common.o obj-$(CONFIG_PCI_HOST_GENERIC) +=3D pci-host-generic.o obj-$(CONFIG_PCI_HOST_THUNDER_ECAM) +=3D pci-thunder-ecam.o diff --git a/drivers/pci/controller/pcie-rzg3s-host.c b/drivers/pci/control= ler/pcie-rzg3s-host.c new file mode 100644 index 000000000000..9b5a516de55d --- /dev/null +++ b/drivers/pci/controller/pcie-rzg3s-host.c @@ -0,0 +1,1715 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * PCIe driver for Renesas RZ/G3S SoCs + * + * Copyright (C) 2025 Renesas Electronics Corp. + * + * Based on: + * drivers/pci/controller/pcie-rcar-host.c + * Copyright (C) 2009 - 2011 Paul Mundt + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../pci.h" + +/* AXI registers */ +#define RZG3S_PCI_REQDATA(id) (0x80 + (id) * 0x4) +#define RZG3S_PCI_REQRCVDAT 0x8c + +#define RZG3S_PCI_REQADR1 0x90 +#define RZG3S_PCI_REQADR1_BUS GENMASK(31, 24) +#define RZG3S_PCI_REQADR1_DEV GENMASK(23, 19) +#define RZG3S_PCI_REQADR1_FUNC GENMASK(18, 16) +#define RZG3S_PCI_REQADR1_REG GENMASK(11, 0) + +#define RZG3S_PCI_REQBE 0x98 +#define RZG3S_PCI_REQBE_BYTE_EN GENMASK(3, 0) + +#define RZG3S_PCI_REQISS 0x9c +#define RZG3S_PCI_REQISS_MOR_STATUS GENMASK(18, 16) +#define RZG3S_PCI_REQISS_TR_TYPE GENMASK(11, 8) +#define RZG3S_PCI_REQISS_TR_TP0_RD FIELD_PREP(RZG3S_PCI_REQISS_TR_TYPE, 0= x4) +#define RZG3S_PCI_REQISS_TR_TP0_WR FIELD_PREP(RZG3S_PCI_REQISS_TR_TYPE, 0= x5) +#define RZG3S_PCI_REQISS_REQ_ISSUE BIT(0) + +#define RZG3S_PCI_MSIRCVWADRL 0x100 +#define RZG3S_PCI_MSIRCVWADRL_MSG_DATA_ENA BIT(1) +#define RZG3S_PCI_MSIRCVWADRL_ENA BIT(0) + +#define RZG3S_PCI_MSIRCVWADRU 0x104 +#define RZG3S_PCI_MSIRCVWMSKL 0x108 +#define RZG3S_PCI_MSIRCVWMSKU 0x10c + +#define RZG3S_PCI_PINTRCVIE 0x110 +#define RZG3S_PCI_PINTRCVIE_INTX(i) BIT(i) +#define RZG3S_PCI_PINTRCVIE_MSI BIT(4) + +#define RZG3S_PCI_PINTRCVIS 0x114 +#define RZG3S_PCI_PINTRCVIS_INTX(i) BIT(i) +#define RZG3S_PCI_PINTRCVIS_MSI BIT(4) + +#define RZG3S_PCI_MSGRCVIE 0x120 +#define RZG3S_PCI_MSGRCVIE_MSG_RCV BIT(24) + +#define RZG3S_PCI_MSGRCVIS 0x124 +#define RZG3S_PCI_MSGRCVIS_MRI BIT(24) + +#define RZG3S_PCI_PEIE0 0x200 + +#define RZG3S_PCI_PEIS0 0x204 +#define RZG3S_PCI_PEIS0_RX_DLLP_PM_ENTER BIT(12) +#define RZG3S_PCI_PEIS0_DL_UPDOWN BIT(9) + +#define RZG3S_PCI_PEIE1 0x208 +#define RZG3S_PCI_PEIS1 0x20c +#define RZG3S_PCI_AMEIE 0x210 +#define RZG3S_PCI_AMEIS 0x214 +#define RZG3S_PCI_ASEIE1 0x220 +#define RZG3S_PCI_ASEIS1 0x224 + +#define RZG3S_PCI_PCSTAT1 0x408 +#define RZG3S_PCI_PCSTAT1_LTSSM_STATE GENMASK(14, 10) +#define RZG3S_PCI_PCSTAT1_DL_DOWN_STS BIT(0) + +#define RZG3S_PCI_PCCTRL2 0x410 +#define RZG3S_PCI_PCCTRL2_LS_CHG GENMASK(9, 8) +#define RZG3S_PCI_PCCTRL2_LS_CHG_REQ BIT(0) + +#define RZG3S_PCI_PCSTAT2 0x414 +#define RZG3S_PCI_PCSTAT2_LS_CHG_DONE BIT(28) +#define RZG3S_PCI_PCSTAT2_STATE_RX_DETECT GENMASK(15, 8) +#define RZG3S_PCI_PCSTAT2_SDRIRE GENMASK(7, 0) + +#define RZG3S_PCI_PERM 0x300 +#define RZG3S_PCI_PERM_CFG_HWINIT_EN BIT(2) +#define RZG3S_PCI_PERM_PIPE_PHY_REG_EN BIT(1) + +#define RZG3S_PCI_MSIRE(id) (0x600 + (id) * 0x10) +#define RZG3S_PCI_MSIRE_ENA BIT(0) + +#define RZG3S_PCI_MSIRM(id) (0x608 + (id) * 0x10) +#define RZG3S_PCI_MSIRS(id) (0x60c + (id) * 0x10) + +#define RZG3S_PCI_AWBASEL(id) (0x1000 + (id) * 0x20) +#define RZG3S_PCI_AWBASEL_WIN_ENA BIT(0) + +#define RZG3S_PCI_AWBASEU(id) (0x1004 + (id) * 0x20) +#define RZG3S_PCI_AWMASKL(id) (0x1008 + (id) * 0x20) +#define RZG3S_PCI_AWMASKU(id) (0x100c + (id) * 0x20) +#define RZG3S_PCI_ADESTL(id) (0x1010 + (id) * 0x20) +#define RZG3S_PCI_ADESTU(id) (0x1014 + (id) * 0x20) + +#define RZG3S_PCI_PWBASEL(id) (0x1100 + (id) * 0x20) +#define RZG3S_PCI_PWBASEL_ENA BIT(0) + +#define RZG3S_PCI_PWBASEU(id) (0x1104 + (id) * 0x20) +#define RZG3S_PCI_PDESTL(id) (0x1110 + (id) * 0x20) +#define RZG3S_PCI_PDESTU(id) (0x1114 + (id) * 0x20) +#define RZG3S_PCI_PWMASKL(id) (0x1108 + (id) * 0x20) +#define RZG3S_PCI_PWMASKU(id) (0x110c + (id) * 0x20) + +/* PHY control registers */ +#define RZG3S_PCI_PHY_XCFGD(id) (0x2000 + (id) * 0x10) +#define RZG3S_PCI_PHY_XCFGD_NUM 39 + +#define RZG3S_PCI_PHY_XCFGA_CMN(id) (0x2400 + (id) * 0x10) +#define RZG3S_PCI_PHY_XCFGA_CMN_NUM 16 + +#define RZG3S_PCI_PHY_XCFGA_RX(id) (0x2500 + (id) * 0x10) +#define RZG3S_PCI_PHY_XCFGA_RX_NUM 13 + +#define RZG3S_PCI_PHY_XCFGA_TX 0x25d0 + +#define RZG3S_PCI_PHY_XCFG_CTRL 0x2a20 +#define RZG3S_PCI_PHY_XCFG_CTRL_PHYREG_SEL BIT(0) + +/* PCIe registers */ +#define RZG3S_PCI_CFG_BASE 0x6000 +#define RZG3S_PCI_CFG_BARMSK00L 0xa0 +#define RZG3S_PCI_CFG_BARMSK00U 0xa4 + +#define RZG3S_PCI_CFG_PCIEC 0x60 + +/* System controller registers */ +#define RZG3S_SYS_PCIE_RST_RSM_B 0xd74 +#define RZG3S_SYS_PCIE_RST_RSM_B_MASK BIT(0) + +/* Maximum number of windows */ +#define RZG3S_MAX_WINDOWS 8 + +/* Number of MSI interrupts per register */ +#define RZG3S_PCI_MSI_INT_PER_REG 32 +/* The number of MSI interrupts */ +#define RZG3S_PCI_MSI_INT_NR RZG3S_PCI_MSI_INT_PER_REG + +/* Timeouts experimentally determined. */ +#define RZG3S_REQ_ISSUE_TIMEOUT_US 2500 + +/** + * struct rzg3s_pcie_msi - RZ/G3S PCIe MSI data structure + * @domain: IRQ domain + * @map: bitmap with the allocated MSIs + * @dma_addr: address of the allocated MSI window + * @window_base: base address of the MSI window + * @pages: allocated pages for MSI window mapping + * @map_lock: lock for bitmap with the allocated MSIs + */ +struct rzg3s_pcie_msi { + struct irq_domain *domain; + DECLARE_BITMAP(map, RZG3S_PCI_MSI_INT_NR); + dma_addr_t dma_addr; + dma_addr_t window_base; + unsigned long pages; + struct mutex map_lock; +}; + +struct rzg3s_pcie_host; + +/** + * struct rzg3s_pcie_soc_data - SoC specific data + * @init_phy: PHY initialization function + * @power_resets: array with the resets that need to be de-asserted after + * power-on + * @cfg_resets: array with the resets that need to be de-asserted after + * configuration + * @num_power_resets: number of power resets + * @num_cfg_resets: number of configuration resets + */ +struct rzg3s_pcie_soc_data { + int (*init_phy)(struct rzg3s_pcie_host *host); + const char * const *power_resets; + const char * const *cfg_resets; + u8 num_power_resets; + u8 num_cfg_resets; +}; + +/** + * struct rzg3s_pcie_host - RZ/G3S PCIe data structure + * @axi: base address for AXI registers + * @pcie: base address for PCIe registers + * @dev: struct device + * @power_resets: reset control signals that should be set after power up + * @cfg_resets: reset control signals that should be set after configurati= on + * @sysc: SYSC regmap + * @intx_domain: INTx IRQ domain + * @data: SoC specific data + * @msi: MSI data structure + * @hw_lock: lock for access to the HW resources + * @intx_irqs: INTx interrupts + * @vendor_id: Vendor ID + * @device_id: Device ID + */ +struct rzg3s_pcie_host { + void __iomem *axi; + void __iomem *pcie; + struct device *dev; + struct reset_control_bulk_data *power_resets; + struct reset_control_bulk_data *cfg_resets; + struct regmap *sysc; + struct irq_domain *intx_domain; + const struct rzg3s_pcie_soc_data *data; + struct rzg3s_pcie_msi msi; + raw_spinlock_t hw_lock; + int intx_irqs[PCI_NUM_INTX]; + u32 vendor_id; + u32 device_id; +}; + +#define rzg3s_msi_to_host(_msi) container_of(_msi, struct rzg3s_pcie_host,= msi) + +static void rzg3s_pcie_update_bits(void __iomem *base, u32 offset, u32 mas= k, + u32 val) +{ + u32 tmp; + + tmp =3D readl(base + offset); + tmp &=3D ~mask; + tmp |=3D val & mask; + writel(tmp, base + offset); +} + +static bool rzg3s_pcie_child_issue_request(struct rzg3s_pcie_host *host) +{ + u32 val; + int ret; + + rzg3s_pcie_update_bits(host->axi, RZG3S_PCI_REQISS, + RZG3S_PCI_REQISS_REQ_ISSUE, + RZG3S_PCI_REQISS_REQ_ISSUE); + ret =3D readl_poll_timeout_atomic(host->axi + RZG3S_PCI_REQISS, val, + !(val & RZG3S_PCI_REQISS_REQ_ISSUE), + 5, RZG3S_REQ_ISSUE_TIMEOUT_US); + + return !!ret || (val & RZG3S_PCI_REQISS_MOR_STATUS); +} + +static int rzg3s_pcie_child_read_conf(struct rzg3s_pcie_host *host, + struct pci_bus *bus, + unsigned int devfn, int where, + u32 *data) +{ + int ret; + + bus->ops->map_bus(bus, devfn, where); + + /* Set the type of request */ + writel(RZG3S_PCI_REQISS_TR_TP0_RD, host->axi + RZG3S_PCI_REQISS); + + /* Issue the request and wait to finish */ + ret =3D rzg3s_pcie_child_issue_request(host); + if (ret) + return PCIBIOS_SET_FAILED; + + /* Read the data */ + *data =3D readl(host->axi + RZG3S_PCI_REQRCVDAT); + + return PCIBIOS_SUCCESSFUL; +} + +/* Serialization is provided by 'pci_lock' in drivers/pci/access.c */ +static int rzg3s_pcie_child_read(struct pci_bus *bus, unsigned int devfn, + int where, int size, u32 *val) +{ + struct rzg3s_pcie_host *host =3D bus->sysdata; + int ret; + + ret =3D rzg3s_pcie_child_read_conf(host, bus, devfn, where, val); + if (ret !=3D PCIBIOS_SUCCESSFUL) + return ret; + + if (size <=3D 2) + *val =3D (*val >> (8 * (where & 3))) & ((1 << (size * 8)) - 1); + + return PCIBIOS_SUCCESSFUL; +} + +static int rzg3s_pcie_child_write_conf(struct rzg3s_pcie_host *host, + struct pci_bus *bus, + unsigned int devfn, int where, + u32 data) +{ + int ret; + + bus->ops->map_bus(bus, devfn, where); + + /* Set the write data */ + writel(0, host->axi + RZG3S_PCI_REQDATA(0)); + writel(0, host->axi + RZG3S_PCI_REQDATA(1)); + writel(data, host->axi + RZG3S_PCI_REQDATA(2)); + + /* Set the type of request */ + writel(RZG3S_PCI_REQISS_TR_TP0_WR, host->axi + RZG3S_PCI_REQISS); + + /* Issue the request and wait to finish */ + ret =3D rzg3s_pcie_child_issue_request(host); + if (ret) + return PCIBIOS_SET_FAILED; + + return PCIBIOS_SUCCESSFUL; +} + +/* Serialization is provided by 'pci_lock' in drivers/pci/access.c */ +static int rzg3s_pcie_child_write(struct pci_bus *bus, unsigned int devfn, + int where, int size, u32 val) +{ + struct rzg3s_pcie_host *host =3D bus->sysdata; + u32 data, shift; + int ret; + + if (size =3D=3D 4) + return rzg3s_pcie_child_write_conf(host, bus, devfn, where, val); + + /* + * Controller does 32 bit accesses. To do byte accesses software need + * to do read/modify/write. This may have potential side effects. For + * example, software may perform a 16-bit write. If the hardware only + * supports 32-bit accesses, we must do a 32-bit read, merge in the 16 + * bits we intend to write, followed by a 32-bit write. If the 16 bits + * we *don't* intend to write happen to have any RW1C + * (write-one-to-clear) bits set, we just inadvertently cleared + * something we shouldn't have. + */ + if (!bus->unsafe_warn) { + dev_warn(&bus->dev, "%d-byte config write to %04x:%02x:%02x.%d offset %#= x may corrupt adjacent RW1C bits\n", + size, pci_domain_nr(bus), bus->number, + PCI_SLOT(devfn), PCI_FUNC(devfn), where); + bus->unsafe_warn =3D 1; + } + + ret =3D rzg3s_pcie_child_read_conf(host, bus, devfn, where, &data); + if (ret !=3D PCIBIOS_SUCCESSFUL) + return ret; + + if (size =3D=3D 1) { + shift =3D BITS_PER_BYTE * (where & 3); + data &=3D ~(0xff << shift); + data |=3D ((val & 0xff) << shift); + } else if (size =3D=3D 2) { + shift =3D BITS_PER_BYTE * (where & 2); + data &=3D ~(0xffff << shift); + data |=3D ((val & 0xffff) << shift); + } else { + data =3D val; + } + + return rzg3s_pcie_child_write_conf(host, bus, devfn, where, data); +} + +static void __iomem *rzg3s_pcie_child_map_bus(struct pci_bus *bus, + unsigned int devfn, + int where) +{ + struct rzg3s_pcie_host *host =3D bus->sysdata; + unsigned int dev, func, reg; + + dev =3D PCI_SLOT(devfn); + func =3D PCI_FUNC(devfn); + reg =3D where & ~0x3; + + /* Set the destination */ + writel(FIELD_PREP(RZG3S_PCI_REQADR1_BUS, bus->number) | + FIELD_PREP(RZG3S_PCI_REQADR1_DEV, dev) | + FIELD_PREP(RZG3S_PCI_REQADR1_FUNC, func) | + FIELD_PREP(RZG3S_PCI_REQADR1_REG, reg), + host->axi + RZG3S_PCI_REQADR1); + + /* Set byte enable */ + writel(RZG3S_PCI_REQBE_BYTE_EN, host->axi + RZG3S_PCI_REQBE); + + /* + * rzg3s_pcie_child_map_bus() is used to configure the controller before + * executing requests. It is called only within this driver and not + * through subsystem calls. Since it does not return an address that + * needs to be used later, return NULL. + */ + return NULL; +} + +static struct pci_ops rzg3s_pcie_child_ops =3D { + .read =3D rzg3s_pcie_child_read, + .write =3D rzg3s_pcie_child_write, + .map_bus =3D rzg3s_pcie_child_map_bus, +}; + +static void __iomem *rzg3s_pcie_root_map_bus(struct pci_bus *bus, + unsigned int devfn, + int where) +{ + struct rzg3s_pcie_host *host =3D bus->sysdata; + + if (devfn) + return NULL; + + return host->pcie + where; +} + +static int rzg3s_pcie_root_write(struct pci_bus *bus, unsigned int devfn, + int where, int size, u32 val) +{ + struct rzg3s_pcie_host *host =3D bus->sysdata; + + /* Enable access control to the CFGU */ + writel(RZG3S_PCI_PERM_CFG_HWINIT_EN, host->axi + RZG3S_PCI_PERM); + + pci_generic_config_write(bus, devfn, where, size, val); + + /* Disable access control to the CFGU */ + writel(0, host->axi + RZG3S_PCI_PERM); + + return PCIBIOS_SUCCESSFUL; +} + +static struct pci_ops rzg3s_pcie_root_ops =3D { + .read =3D pci_generic_config_read, + .write =3D rzg3s_pcie_root_write, + .map_bus =3D rzg3s_pcie_root_map_bus, +}; + +static void rzg3s_pcie_intx_irq_handler(struct irq_desc *desc) +{ + struct rzg3s_pcie_host *host =3D irq_desc_get_handler_data(desc); + struct irq_chip *chip =3D irq_desc_get_chip(desc); + unsigned int irq =3D irq_desc_get_irq(desc); + u32 intx =3D irq - host->intx_irqs[0]; + + chained_irq_enter(chip, desc); + generic_handle_domain_irq(host->intx_domain, intx); + chained_irq_exit(chip, desc); +} + +static irqreturn_t rzg3s_pcie_msi_irq(int irq, void *data) +{ + u8 regs =3D RZG3S_PCI_MSI_INT_NR / RZG3S_PCI_MSI_INT_PER_REG; + DECLARE_BITMAP(bitmap, RZG3S_PCI_MSI_INT_NR); + struct rzg3s_pcie_host *host =3D data; + struct rzg3s_pcie_msi *msi =3D &host->msi; + unsigned long bit; + u32 status; + + status =3D readl(host->axi + RZG3S_PCI_PINTRCVIS); + if (!(status & RZG3S_PCI_PINTRCVIS_MSI)) + return IRQ_NONE; + + /* Clear the MSI */ + rzg3s_pcie_update_bits(host->axi, RZG3S_PCI_PINTRCVIS, + RZG3S_PCI_PINTRCVIS_MSI, + RZG3S_PCI_PINTRCVIS_MSI); + rzg3s_pcie_update_bits(host->axi, RZG3S_PCI_MSGRCVIS, + RZG3S_PCI_MSGRCVIS_MRI, RZG3S_PCI_MSGRCVIS_MRI); + + for (u8 reg_id =3D 0; reg_id < regs; reg_id++) { + status =3D readl(host->axi + RZG3S_PCI_MSIRS(reg_id)); + bitmap_write(bitmap, status, reg_id * RZG3S_PCI_MSI_INT_PER_REG, + RZG3S_PCI_MSI_INT_PER_REG); + } + + for_each_set_bit(bit, bitmap, RZG3S_PCI_MSI_INT_NR) { + int ret; + + ret =3D generic_handle_domain_irq(msi->domain->parent, bit); + if (ret) { + u8 reg_bit =3D bit % RZG3S_PCI_MSI_INT_PER_REG; + u8 reg_id =3D bit / RZG3S_PCI_MSI_INT_PER_REG; + + /* Unknown MSI, just clear it */ + writel(BIT(reg_bit), + host->axi + RZG3S_PCI_MSIRS(reg_id)); + } + } + + return IRQ_HANDLED; +} + +static void rzg3s_pcie_msi_top_irq_ack(struct irq_data *d) +{ + irq_chip_ack_parent(d); +} + +static void rzg3s_pcie_msi_top_irq_mask(struct irq_data *d) +{ + pci_msi_mask_irq(d); + irq_chip_mask_parent(d); +} + +static void rzg3s_pcie_msi_top_irq_unmask(struct irq_data *d) +{ + pci_msi_unmask_irq(d); + irq_chip_unmask_parent(d); +} + +static struct irq_chip rzg3s_pcie_msi_top_chip =3D { + .name =3D "PCIe MSI", + .irq_ack =3D rzg3s_pcie_msi_top_irq_ack, + .irq_mask =3D rzg3s_pcie_msi_top_irq_mask, + .irq_unmask =3D rzg3s_pcie_msi_top_irq_unmask, +}; + +static void rzg3s_pcie_msi_irq_ack(struct irq_data *d) +{ + struct rzg3s_pcie_msi *msi =3D irq_data_get_irq_chip_data(d); + struct rzg3s_pcie_host *host =3D rzg3s_msi_to_host(msi); + u8 reg_bit =3D d->hwirq % RZG3S_PCI_MSI_INT_PER_REG; + u8 reg_id =3D d->hwirq / RZG3S_PCI_MSI_INT_PER_REG; + + guard(raw_spinlock_irqsave)(&host->hw_lock); + + writel(BIT(reg_bit), host->axi + RZG3S_PCI_MSIRS(reg_id)); +} + +static void rzg3s_pcie_msi_irq_mask(struct irq_data *d) +{ + struct rzg3s_pcie_msi *msi =3D irq_data_get_irq_chip_data(d); + struct rzg3s_pcie_host *host =3D rzg3s_msi_to_host(msi); + u8 reg_bit =3D d->hwirq % RZG3S_PCI_MSI_INT_PER_REG; + u8 reg_id =3D d->hwirq / RZG3S_PCI_MSI_INT_PER_REG; + + guard(raw_spinlock_irqsave)(&host->hw_lock); + + rzg3s_pcie_update_bits(host->axi, RZG3S_PCI_MSIRM(reg_id), BIT(reg_bit), + BIT(reg_bit)); +} + +static void rzg3s_pcie_msi_irq_unmask(struct irq_data *d) +{ + struct rzg3s_pcie_msi *msi =3D irq_data_get_irq_chip_data(d); + struct rzg3s_pcie_host *host =3D rzg3s_msi_to_host(msi); + u8 reg_bit =3D d->hwirq % RZG3S_PCI_MSI_INT_PER_REG; + u8 reg_id =3D d->hwirq / RZG3S_PCI_MSI_INT_PER_REG; + + guard(raw_spinlock_irqsave)(&host->hw_lock); + + rzg3s_pcie_update_bits(host->axi, RZG3S_PCI_MSIRM(reg_id), BIT(reg_bit), + 0); +} + +static void rzg3s_pcie_irq_compose_msi_msg(struct irq_data *data, + struct msi_msg *msg) +{ + struct rzg3s_pcie_msi *msi =3D irq_data_get_irq_chip_data(data); + struct rzg3s_pcie_host *host =3D rzg3s_msi_to_host(msi); + u32 drop_mask =3D RZG3S_PCI_MSIRCVWADRL_ENA | + RZG3S_PCI_MSIRCVWADRL_MSG_DATA_ENA; + u32 lo, hi; + + /* + * Enable and msg data enable bits are part of the address lo. Drop + * them. + */ + lo =3D readl(host->axi + RZG3S_PCI_MSIRCVWADRL) & ~drop_mask; + hi =3D readl(host->axi + RZG3S_PCI_MSIRCVWADRU); + + msg->address_lo =3D lo; + msg->address_hi =3D hi; + msg->data =3D data->hwirq; +} + +static struct irq_chip rzg3s_pcie_msi_bottom_chip =3D { + .name =3D "rzg3s-pcie-msi", + .irq_ack =3D rzg3s_pcie_msi_irq_ack, + .irq_mask =3D rzg3s_pcie_msi_irq_mask, + .irq_unmask =3D rzg3s_pcie_msi_irq_unmask, + .irq_compose_msi_msg =3D rzg3s_pcie_irq_compose_msi_msg, +}; + +static int rzg3s_pcie_msi_domain_alloc(struct irq_domain *domain, + unsigned int virq, unsigned int nr_irqs, + void *args) +{ + struct rzg3s_pcie_msi *msi =3D domain->host_data; + int hwirq; + + scoped_guard(mutex, &msi->map_lock) { + hwirq =3D bitmap_find_free_region(msi->map, RZG3S_PCI_MSI_INT_NR, + order_base_2(nr_irqs)); + } + + if (hwirq < 0) + return -ENOSPC; + + for (unsigned int i =3D 0; i < nr_irqs; i++) { + irq_domain_set_info(domain, virq + i, hwirq + i, + &rzg3s_pcie_msi_bottom_chip, + domain->host_data, handle_edge_irq, NULL, + NULL); + } + + return 0; +} + +static void rzg3s_pcie_msi_domain_free(struct irq_domain *domain, + unsigned int virq, unsigned int nr_irqs) +{ + struct irq_data *d =3D irq_domain_get_irq_data(domain, virq); + struct rzg3s_pcie_msi *msi =3D domain->host_data; + + guard(mutex)(&msi->map_lock); + + bitmap_release_region(msi->map, d->hwirq, order_base_2(nr_irqs)); +} + +static const struct irq_domain_ops rzg3s_pcie_msi_domain_ops =3D { + .alloc =3D rzg3s_pcie_msi_domain_alloc, + .free =3D rzg3s_pcie_msi_domain_free, +}; + +static struct msi_domain_info rzg3s_pcie_msi_info =3D { + .flags =3D MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS | + MSI_FLAG_MULTI_PCI_MSI | MSI_FLAG_NO_AFFINITY, + .chip =3D &rzg3s_pcie_msi_top_chip, +}; + +static int rzg3s_pcie_msi_allocate_domains(struct rzg3s_pcie_msi *msi) +{ + struct rzg3s_pcie_host *host =3D rzg3s_msi_to_host(msi); + struct device *dev =3D host->dev; + struct fwnode_handle *fwnode =3D dev_fwnode(dev); + struct irq_domain *parent; + + parent =3D irq_domain_create_linear(fwnode, RZG3S_PCI_MSI_INT_NR, + &rzg3s_pcie_msi_domain_ops, msi); + if (!parent) + return dev_err_probe(dev, -ENOMEM, + "failed to create IRQ domain\n"); + irq_domain_update_bus_token(parent, DOMAIN_BUS_NEXUS); + + msi->domain =3D pci_msi_create_irq_domain(fwnode, &rzg3s_pcie_msi_info, + parent); + if (!msi->domain) { + irq_domain_remove(parent); + return dev_err_probe(dev, -ENOMEM, + "failed to create MSI domain\n"); + } + + return 0; +} + +static int rzg3s_pcie_msi_hw_setup(struct rzg3s_pcie_host *host) +{ + u8 regs =3D RZG3S_PCI_MSI_INT_NR / RZG3S_PCI_MSI_INT_PER_REG; + struct rzg3s_pcie_msi *msi =3D &host->msi; + + /* + * Set MSI window size. HW will set the window to + * RZG3S_PCI_MSI_INT_NR * 4 bytes. + */ + writel(RZG3S_PCI_MSI_INT_NR - 1, host->axi + RZG3S_PCI_MSIRCVWMSKL); + + /* Set MSI window address and enable MSI window */ + writel(upper_32_bits(msi->window_base), + host->axi + RZG3S_PCI_MSIRCVWADRU); + writel(lower_32_bits(msi->window_base) | RZG3S_PCI_MSIRCVWADRL_ENA | + RZG3S_PCI_MSIRCVWADRL_MSG_DATA_ENA, + host->axi + RZG3S_PCI_MSIRCVWADRL); + + /* Set MSI receive enable */ + for (u8 reg_id =3D 0; reg_id < regs; reg_id++) { + writel(RZG3S_PCI_MSIRE_ENA, + host->axi + RZG3S_PCI_MSIRE(reg_id)); + } + + /* Enable message receive interrupts */ + writel(RZG3S_PCI_MSGRCVIE_MSG_RCV, host->axi + RZG3S_PCI_MSGRCVIE); + + /* Enable MSI */ + rzg3s_pcie_update_bits(host->axi, RZG3S_PCI_PINTRCVIE, + RZG3S_PCI_PINTRCVIE_MSI, + RZG3S_PCI_PINTRCVIE_MSI); + + return 0; +} + +static int rzg3s_pcie_msi_setup(struct rzg3s_pcie_host *host) +{ + size_t size =3D RZG3S_PCI_MSI_INT_NR * sizeof(u32); + struct rzg3s_pcie_msi *msi =3D &host->msi; + struct device *dev =3D host->dev; + int id, ret; + + msi->pages =3D __get_free_pages(GFP_KERNEL | GFP_DMA, 0); + if (!msi->pages) + return -ENOMEM; + + msi->dma_addr =3D dma_map_single(dev, (void *)msi->pages, size * 2, + DMA_BIDIRECTIONAL); + if (dma_mapping_error(dev, msi->dma_addr)) { + ret =3D -ENOMEM; + goto free_pages; + } + + /* + * According to the RZ/G3S HW manual (Rev.1.10, section 34.4.5.2 Setting + * the MSI Window) the MSI window need to be within any AXI window. Find + * an AXI window to setup the MSI window. + */ + for (id =3D 0; id < RZG3S_MAX_WINDOWS; id++) { + u64 base, basel, baseu; + u64 mask, maskl, masku; + + basel =3D readl(host->axi + RZG3S_PCI_AWBASEL(id)); + /* Skip checking this AXI window if it's not enabled */ + if (!(basel & RZG3S_PCI_AWBASEL_WIN_ENA)) + continue; + + baseu =3D readl(host->axi + RZG3S_PCI_AWBASEU(id)); + base =3D baseu << 32 | basel; + + maskl =3D readl(host->axi + RZG3S_PCI_AWMASKL(id)); + masku =3D readl(host->axi + RZG3S_PCI_AWMASKU(id)); + mask =3D masku << 32 | maskl; + + if (msi->dma_addr < base || msi->dma_addr > base + mask) + continue; + + break; + } + + if (id =3D=3D RZG3S_MAX_WINDOWS) { + ret =3D -EINVAL; + goto dma_unmap; + } + + /* The MSI base address need to be aligned to the MSI size */ + msi->window_base =3D ALIGN(msi->dma_addr, size); + if (msi->window_base < msi->dma_addr) { + ret =3D -EINVAL; + goto dma_unmap; + } + + rzg3s_pcie_msi_hw_setup(host); + + return 0; + +dma_unmap: + dma_unmap_single(dev, msi->dma_addr, size * 2, DMA_BIDIRECTIONAL); +free_pages: + free_pages(msi->pages, 0); + return ret; +} + +static void rzg3s_pcie_msi_teardown(void *data) +{ + u8 regs =3D RZG3S_PCI_MSI_INT_NR / RZG3S_PCI_MSI_INT_PER_REG; + size_t size =3D RZG3S_PCI_MSI_INT_NR * sizeof(u32); + struct rzg3s_pcie_host *host =3D data; + struct rzg3s_pcie_msi *msi =3D &host->msi; + + /* Disable MSI */ + rzg3s_pcie_update_bits(host->axi, RZG3S_PCI_PINTRCVIE, + RZG3S_PCI_PINTRCVIE_MSI, 0); + + /* Disable message receive interrupts */ + rzg3s_pcie_update_bits(host->axi, RZG3S_PCI_MSGRCVIE, + RZG3S_PCI_MSGRCVIE_MSG_RCV, 0); + + /* Disable MSI receive enable */ + for (u8 reg_id =3D 0; reg_id < regs; reg_id++) + writel(0, host->axi + RZG3S_PCI_MSIRE(reg_id)); + + /* Disable MSI window */ + writel(0, host->axi + RZG3S_PCI_MSIRCVWADRL); + + /* Free unused memory */ + dma_unmap_single(host->dev, msi->dma_addr, size * 2, DMA_BIDIRECTIONAL); + free_pages(msi->pages, 0); +} + +static void rzg3s_pcie_msi_free_domains(void *data) +{ + struct irq_domain *domain =3D data; + struct irq_domain *parent =3D domain->parent; + + irq_domain_remove(domain); + irq_domain_remove(parent); +} + +static int rzg3s_pcie_msi_enable(struct rzg3s_pcie_host *host) +{ + struct platform_device *pdev =3D to_platform_device(host->dev); + struct rzg3s_pcie_msi *msi =3D &host->msi; + struct device *dev =3D host->dev; + const char *devname; + int irq, ret; + + ret =3D devm_mutex_init(dev, &msi->map_lock); + if (ret) + return ret; + + irq =3D platform_get_irq_byname(pdev, "msi"); + if (irq < 0) + return dev_err_probe(dev, irq ? irq : -EINVAL, + "Failed to get MSI IRQ!\n"); + + devname =3D devm_kasprintf(dev, GFP_KERNEL, "%s-msi", dev_name(dev)); + if (!devname) + return -ENOMEM; + + ret =3D rzg3s_pcie_msi_allocate_domains(msi); + if (ret) + return ret; + + ret =3D devm_add_action_or_reset(dev, rzg3s_pcie_msi_free_domains, msi->d= omain); + if (ret) + return ret; + + ret =3D devm_request_irq(dev, irq, rzg3s_pcie_msi_irq, 0, devname, host); + if (ret) + return dev_err_probe(dev, ret, "Failed to request IRQ: %d\n", ret); + + ret =3D rzg3s_pcie_msi_setup(host); + if (ret) + return dev_err_probe(dev, ret, "Failed to setup MSI!\n"); + + return devm_add_action_or_reset(dev, rzg3s_pcie_msi_teardown, host); +} + +static void rzg3s_pcie_intx_irq_ack(struct irq_data *d) +{ + struct rzg3s_pcie_host *host =3D irq_data_get_irq_chip_data(d); + + guard(raw_spinlock_irqsave)(&host->hw_lock); + + rzg3s_pcie_update_bits(host->axi, RZG3S_PCI_PINTRCVIS, + RZG3S_PCI_PINTRCVIS_INTX(d->hwirq), + RZG3S_PCI_PINTRCVIS_INTX(d->hwirq)); +} + +static void rzg3s_pcie_intx_irq_mask(struct irq_data *d) +{ + struct rzg3s_pcie_host *host =3D irq_data_get_irq_chip_data(d); + + guard(raw_spinlock_irqsave)(&host->hw_lock); + + rzg3s_pcie_update_bits(host->axi, RZG3S_PCI_PINTRCVIE, + RZG3S_PCI_PINTRCVIE_INTX(d->hwirq), 0); +} + +static void rzg3s_pcie_intx_irq_unmask(struct irq_data *d) +{ + struct rzg3s_pcie_host *host =3D irq_data_get_irq_chip_data(d); + + guard(raw_spinlock_irqsave)(&host->hw_lock); + + rzg3s_pcie_update_bits(host->axi, RZG3S_PCI_PINTRCVIE, + RZG3S_PCI_PINTRCVIE_INTX(d->hwirq), + RZG3S_PCI_PINTRCVIE_INTX(d->hwirq)); +} + +static struct irq_chip rzg3s_pcie_intx_irq_chip =3D { + .name =3D "PCIe INTx", + .irq_ack =3D rzg3s_pcie_intx_irq_ack, + .irq_mask =3D rzg3s_pcie_intx_irq_mask, + .irq_unmask =3D rzg3s_pcie_intx_irq_unmask, +}; + +static int rzg3s_pcie_intx_map(struct irq_domain *domain, unsigned int irq, + irq_hw_number_t hwirq) +{ + irq_set_chip_and_handler(irq, &rzg3s_pcie_intx_irq_chip, + handle_level_irq); + irq_set_chip_data(irq, domain->host_data); + + return 0; +} + +static const struct irq_domain_ops rzg3s_pcie_intx_domain_ops =3D { + .map =3D rzg3s_pcie_intx_map, + .xlate =3D irq_domain_xlate_onetwocell, +}; + +static void rzg3s_pcie_intx_teardown(void *data) +{ + struct rzg3s_pcie_host *host =3D data; + + irq_domain_remove(host->intx_domain); +} + +static int rzg3s_pcie_intx_setup(struct rzg3s_pcie_host *host) +{ + struct device *dev =3D host->dev; + + for (int i =3D 0; i < PCI_NUM_INTX; i++) { + struct platform_device *pdev =3D to_platform_device(dev); + char irq_name[5] =3D {0}; + int irq; + + scnprintf(irq_name, ARRAY_SIZE(irq_name), "int%c", 97 + i); + + irq =3D platform_get_irq_byname(pdev, irq_name); + if (irq < 0) + return dev_err_probe(dev, -EINVAL, + "Failed to parse and map INT%c IRQ\n", + 65 + i); + + host->intx_irqs[i] =3D irq; + irq_set_chained_handler_and_data(irq, + rzg3s_pcie_intx_irq_handler, + host); + } + + host->intx_domain =3D irq_domain_create_linear(of_fwnode_handle(dev->of_n= ode), + PCI_NUM_INTX, + &rzg3s_pcie_intx_domain_ops, + host); + if (!host->intx_domain) + return dev_err_probe(dev, -EINVAL, + "Failed to add irq domain for INTx IRQs\n"); + irq_domain_update_bus_token(host->intx_domain, DOMAIN_BUS_WIRED); + + return devm_add_action_or_reset(dev, rzg3s_pcie_intx_teardown, host); +} + +static int rzg3s_pcie_set_max_link_speed(struct rzg3s_pcie_host *host) +{ + u32 cs2, link_speed, remote_supported_link_speeds, tmp; + u32 pcie_cap =3D RZG3S_PCI_CFG_PCIEC; + u8 ltssm_state_l0 =3D 0xc; + u16 lcs; + int ret; + + /* + * According to the RZ/G3S HW manual (Rev.1.10, section 34.6.3 Caution + * when Changing the Speed Spontaneously) link speed change can be done + * only when the link training and status state machine in the PCIe Core + * Link is L0. + */ + ret =3D readl_poll_timeout(host->axi + RZG3S_PCI_PCSTAT1, tmp, + FIELD_GET(RZG3S_PCI_PCSTAT1_LTSSM_STATE, tmp) =3D=3D ltssm_state_l0, + PCIE_LINK_WAIT_SLEEP_MS, + PCIE_LINK_WAIT_SLEEP_MS * + PCIE_LINK_WAIT_MAX_RETRIES * MILLI); + if (ret) { + dev_dbg(host->dev, + "Could not set max link speed! LTSSM not in L0, state=3D%lx\n", + FIELD_GET(RZG3S_PCI_PCSTAT1_LTSSM_STATE, tmp)); + return ret; + } + + lcs =3D readw(host->pcie + pcie_cap + PCI_EXP_LNKSTA); + cs2 =3D readl(host->axi + RZG3S_PCI_PCSTAT2); + + link_speed =3D FIELD_GET(PCI_EXP_LNKSTA_CLS, lcs); + remote_supported_link_speeds =3D FIELD_GET(RZG3S_PCI_PCSTAT2_SDRIRE, cs2); + + /* + * Return if link is @ 5.0 GT/s or the connected device doesn't support + * it. + */ + if (link_speed =3D=3D PCI_EXP_LNKSTA_CLS_5_0GB || + !(remote_supported_link_speeds !=3D GENMASK(PCI_EXP_LNKSTA_CLS_5_0GB = - 1, 0))) + return 0; + + /* Set target Link speed to 5.0 GT/s */ + rzg3s_pcie_update_bits(host->pcie, pcie_cap + PCI_EXP_LNKCTL2, + PCI_EXP_LNKCTL2_TLS, + FIELD_PREP(PCI_EXP_LNKCTL2_TLS, + PCI_EXP_LNKCTL2_TLS_5_0GT)); + + /* Request link speed change */ + rzg3s_pcie_update_bits(host->axi, RZG3S_PCI_PCCTRL2, + RZG3S_PCI_PCCTRL2_LS_CHG_REQ | + RZG3S_PCI_PCCTRL2_LS_CHG, + RZG3S_PCI_PCCTRL2_LS_CHG_REQ | + FIELD_PREP(RZG3S_PCI_PCCTRL2_LS_CHG, + PCI_EXP_LNKCTL2_TLS_5_0GT - 1)); + + ret =3D readl_poll_timeout(host->axi + RZG3S_PCI_PCSTAT2, cs2, + (cs2 & RZG3S_PCI_PCSTAT2_LS_CHG_DONE), + PCIE_LINK_WAIT_SLEEP_MS, + PCIE_LINK_WAIT_SLEEP_MS * + PCIE_LINK_WAIT_MAX_RETRIES * MILLI); + + /* + * According to the RZ/G3S HW manual (Rev.1.10, section 34.6.3 Caution + * when Changing the Speed Spontaneously) the PCI_PCCTRL2_LS_CHG_REQ + * should be de-asserted after checking for PCI_PCSTAT2_LS_CHG_DONE. + */ + rzg3s_pcie_update_bits(host->axi, RZG3S_PCI_PCCTRL2, + RZG3S_PCI_PCCTRL2_LS_CHG_REQ, 0); + + return ret; +} + +static int rzg3s_pcie_config_init(struct rzg3s_pcie_host *host) +{ + struct pci_host_bridge *bridge =3D pci_host_bridge_from_priv(host); + struct resource_entry *ft; + struct resource *bus; + u8 subordinate_bus; + u8 secondary_bus; + u8 primary_bus; + + ft =3D resource_list_first_type(&bridge->windows, IORESOURCE_BUS); + if (!ft) + return -ENODEV; + + bus =3D ft->res; + primary_bus =3D bus->start; + secondary_bus =3D bus->start + 1; + subordinate_bus =3D bus->end; + + /* Enable access control to the CFGU */ + writel(RZG3S_PCI_PERM_CFG_HWINIT_EN, host->axi + RZG3S_PCI_PERM); + + /* Update vendor ID and device ID */ + writew(host->vendor_id, host->pcie + PCI_VENDOR_ID); + writew(host->device_id, host->pcie + PCI_DEVICE_ID); + + /* HW manual recommends to write 0xffffffff on initialization */ + writel(0xffffffff, host->pcie + RZG3S_PCI_CFG_BARMSK00L); + writel(0xffffffff, host->pcie + RZG3S_PCI_CFG_BARMSK00U); + + /* Update bus info. */ + writeb(primary_bus, host->pcie + PCI_PRIMARY_BUS); + writeb(secondary_bus, host->pcie + PCI_SECONDARY_BUS); + writeb(subordinate_bus, host->pcie + PCI_SUBORDINATE_BUS); + + /* Disable access control to the CFGU */ + writel(0, host->axi + RZG3S_PCI_PERM); + + return 0; +} + +static void rzg3s_pcie_irq_init(struct rzg3s_pcie_host *host) +{ + /* + * According to the HW manual of the RZ/G3S (Rev.1.10, sections + * corresponding to all registers written with ~0U), the hardware + * ignores value written to unused bits. Writing ~0U to these registers + * should be safe. + */ + + /* Clear the link state and PM transitions */ + writel(RZG3S_PCI_PEIS0_DL_UPDOWN | RZG3S_PCI_PEIS0_RX_DLLP_PM_ENTER, + host->axi + RZG3S_PCI_PEIS0); + + /* Disable all interrupts */ + writel(0, host->axi + RZG3S_PCI_PEIE0); + + /* Clear all parity and ecc error interrupts */ + writel(~0U, host->axi + RZG3S_PCI_PEIS1); + + /* Disable all parity and ecc error interrupts */ + writel(0, host->axi + RZG3S_PCI_PEIE1); + + /* Clear all AXI master error interrupts */ + writel(~0U, host->axi + RZG3S_PCI_AMEIS); + + /* Clear all AXI slave error interrupts */ + writel(~0U, host->axi + RZG3S_PCI_ASEIS1); + + /* Clear all message receive interrupts */ + writel(~0U, host->axi + RZG3S_PCI_MSGRCVIS); +} + +static void rzg3s_pcie_power_resets_action(void *data) +{ + struct rzg3s_pcie_host *host =3D data; + + reset_control_bulk_assert(host->data->num_power_resets, + host->power_resets); +} + +static void rzg3s_pcie_cfg_resets_action(void *data) +{ + struct rzg3s_pcie_host *host =3D data; + + reset_control_bulk_assert(host->data->num_cfg_resets, + host->cfg_resets); +} + +static int rzg3s_pcie_power_resets_deassert(struct rzg3s_pcie_host *host) +{ + const struct rzg3s_pcie_soc_data *data =3D host->data; + + /* + * According to the RZ/G3S HW manual (Rev.1.10, section + * 34.5.1.2 De-asserting the Reset) the PCIe IP needs to wait 5ms from + * power on to the de-assertion of reset. + */ + usleep_range(5000, 5100); + return reset_control_bulk_deassert(data->num_power_resets, + host->power_resets); +} + +static int rzg3s_pcie_resets_prepare(struct rzg3s_pcie_host *host) +{ + const struct rzg3s_pcie_soc_data *data =3D host->data; + int ret; + + host->power_resets =3D devm_kmalloc_array(host->dev, + data->num_power_resets, + sizeof(*host->power_resets), + GFP_KERNEL); + if (!host->power_resets) + return -ENOMEM; + + for (unsigned int i =3D 0; i < data->num_power_resets; i++) + host->power_resets[i].id =3D data->power_resets[i]; + + host->cfg_resets =3D devm_kmalloc_array(host->dev, + data->num_cfg_resets, + sizeof(*host->cfg_resets), + GFP_KERNEL); + if (!host->cfg_resets) + return -ENOMEM; + + for (unsigned int i =3D 0; i < data->num_cfg_resets; i++) + host->cfg_resets[i].id =3D data->cfg_resets[i]; + + ret =3D devm_reset_control_bulk_get_exclusive(host->dev, + data->num_power_resets, + host->power_resets); + if (ret) + return ret; + + ret =3D devm_reset_control_bulk_get_exclusive(host->dev, + data->num_cfg_resets, + host->cfg_resets); + if (ret) + return ret; + + ret =3D rzg3s_pcie_power_resets_deassert(host); + if (ret) + return ret; + + return devm_add_action_or_reset(host->dev, + rzg3s_pcie_power_resets_action, host); +} + +static int rzg3s_pcie_host_init(struct rzg3s_pcie_host *host, bool probe) +{ + u32 val; + int ret; + + /* Initialize the PCIe related registers */ + ret =3D rzg3s_pcie_config_init(host); + if (ret) + return ret; + + /* Initialize the interrupts */ + rzg3s_pcie_irq_init(host); + + ret =3D reset_control_bulk_deassert(host->data->num_cfg_resets, + host->cfg_resets); + if (ret) + return ret; + + /* Wait for link up */ + ret =3D readl_poll_timeout(host->axi + RZG3S_PCI_PCSTAT1, val, + !(val & RZG3S_PCI_PCSTAT1_DL_DOWN_STS), + PCIE_LINK_WAIT_SLEEP_MS, + PCIE_LINK_WAIT_SLEEP_MS * + PCIE_LINK_WAIT_MAX_RETRIES * MILLI); + if (ret) { + reset_control_bulk_assert(host->data->num_cfg_resets, + host->cfg_resets); + return ret; + } + + val =3D readl(host->axi + RZG3S_PCI_PCSTAT2); + dev_info(host->dev, "PCIe link status [0x%x]\n", val); + + val =3D FIELD_GET(RZG3S_PCI_PCSTAT2_STATE_RX_DETECT, val); + dev_info(host->dev, "PCIe x%d: link up\n", hweight32(val)); + + if (probe) { + ret =3D devm_add_action_or_reset(host->dev, + rzg3s_pcie_cfg_resets_action, + host); + } + + return ret; +} + +static void rzg3s_pcie_set_inbound_window(struct rzg3s_pcie_host *host, + u64 cpu_addr, u64 pci_addr, u64 size, + int id) +{ + /* Set CPU window base address */ + writel(upper_32_bits(cpu_addr), host->axi + RZG3S_PCI_ADESTU(id)); + writel(lower_32_bits(cpu_addr), host->axi + RZG3S_PCI_ADESTL(id)); + + /* Set window size */ + writel(upper_32_bits(size), host->axi + RZG3S_PCI_AWMASKU(id)); + writel(lower_32_bits(size), host->axi + RZG3S_PCI_AWMASKL(id)); + + /* Set PCIe window base address and enable the window */ + writel(upper_32_bits(pci_addr), host->axi + RZG3S_PCI_AWBASEU(id)); + writel(lower_32_bits(pci_addr) | RZG3S_PCI_AWBASEL_WIN_ENA, + host->axi + RZG3S_PCI_AWBASEL(id)); +} + +static int rzg3s_pcie_set_inbound_windows(struct rzg3s_pcie_host *host, + struct resource_entry *entry, + int *index) +{ + u64 pci_addr =3D entry->res->start - entry->offset; + u64 cpu_addr =3D entry->res->start; + u64 cpu_end =3D entry->res->end; + u64 size_id =3D 0; + int id =3D *index; + u64 size; + + while (cpu_addr < cpu_end) { + if (id >=3D RZG3S_MAX_WINDOWS) + return dev_err_probe(host->dev, -EINVAL, + "Failed to set inbound windows!\n"); + + size =3D resource_size(entry->res) - size_id; + + /* + * According to the RZ/G3S HW manual (Rev.1.10, + * section 34.3.1.71 AXI Window Mask (Lower) Registers) the min + * size is 4K. + */ + size =3D max(size, SZ_4K); + + /* + * According the RZ/G3S HW manual (Rev.1.10, sections: + * - 34.3.1.69 AXI Window Base (Lower) Registers + * - 34.3.1.71 AXI Window Mask (Lower) Registers + * - 34.3.1.73 AXI Destination (Lower) Registers) + * the CPU addr, PCIe addr, size should be 4K aligned and be a + * power of 2. + */ + size =3D ALIGN(size, SZ_4K); + + /* + * According to the RZ/G3S HW manual (Rev.1.10, section + * 34.3.1.71 AXI Window Mask (Lower) Registers) HW expects first + * 12 LSB bits to be 0xfff. Subtract 1 from size for this. + */ + size =3D roundup_pow_of_two(size) - 1; + + cpu_addr =3D ALIGN(cpu_addr, SZ_4K); + pci_addr =3D ALIGN(pci_addr, SZ_4K); + + rzg3s_pcie_set_inbound_window(host, cpu_addr, pci_addr, size, + id); + + pci_addr +=3D size; + cpu_addr +=3D size; + size_id =3D size; + id++; + } + *index =3D id; + + return 0; +} + +static int rzg3s_pcie_parse_map_dma_ranges(struct rzg3s_pcie_host *host) +{ + struct pci_host_bridge *bridge =3D pci_host_bridge_from_priv(host); + struct resource_entry *entry; + int i =3D 0, ret; + + resource_list_for_each_entry(entry, &bridge->dma_ranges) { + ret =3D rzg3s_pcie_set_inbound_windows(host, entry, &i); + if (ret) + return ret; + } + + return 0; +} + +static void rzg3s_pcie_set_outbound_window(struct rzg3s_pcie_host *host, + struct resource_entry *win, + int id) +{ + struct resource *res =3D win->res; + resource_size_t size =3D resource_size(res); + resource_size_t res_start; + + if (res->flags & IORESOURCE_IO) + res_start =3D pci_pio_to_address(res->start) - win->offset; + else + res_start =3D res->start - win->offset; + + /* + * According to the RZ/G3S HW manual (Rev.1.10, section 34.3.1.75 PCIe + * Window Base (Lower) Registers) the window base address need to be 4K + * aligned. + */ + res_start =3D ALIGN(res_start, SZ_4K); + + size =3D ALIGN(size, SZ_4K); + size =3D roundup_pow_of_two(size) - 1; + + /* Set PCIe destination */ + writel(upper_32_bits(res_start), host->axi + RZG3S_PCI_PDESTU(id)); + writel(lower_32_bits(res_start), host->axi + RZG3S_PCI_PDESTL(id)); + + /* Set PCIe window mask */ + writel(upper_32_bits(size), host->axi + RZG3S_PCI_PWMASKU(id)); + writel(lower_32_bits(size), host->axi + RZG3S_PCI_PWMASKL(id)); + + /* Set PCIe window base and enable the window */ + writel(upper_32_bits(res_start), host->axi + RZG3S_PCI_PWBASEU(id)); + writel(lower_32_bits(res_start) | RZG3S_PCI_PWBASEL_ENA, + host->axi + RZG3S_PCI_PWBASEL(id)); +} + +static int rzg3s_pcie_parse_map_ranges(struct rzg3s_pcie_host *host) +{ + struct pci_host_bridge *bridge =3D pci_host_bridge_from_priv(host); + struct resource_entry *win; + int i =3D 0; + + resource_list_for_each_entry(win, &bridge->windows) { + struct resource *res =3D win->res; + + if (i >=3D RZG3S_MAX_WINDOWS) + return dev_err_probe(host->dev, -EINVAL, + "Failed to set outbound windows!\n"); + + if (!res->flags) + continue; + + switch (resource_type(res)) { + case IORESOURCE_IO: + case IORESOURCE_MEM: + rzg3s_pcie_set_outbound_window(host, win, i); + i++; + break; + } + } + + return 0; +} + +static int rzg3s_soc_pcie_init_phy(struct rzg3s_pcie_host *host) +{ + static const u32 xcfgd_settings[RZG3S_PCI_PHY_XCFGD_NUM] =3D { + [8] =3D 0xe0006801, 0x007f7e30, 0x183e0000, 0x978ff500, + 0xec000000, 0x009f1400, 0x0000d009, + [17] =3D 0x78000000, + [19] =3D 0x00880000, 0x000005c0, 0x07000000, 0x00780920, + 0xc9400ce2, 0x90000c0c, 0x000c1414, 0x00005034, + 0x00006000, 0x00000001, + }; + static const u32 xcfga_cmn_settings[RZG3S_PCI_PHY_XCFGA_CMN_NUM] =3D { + 0x00000d10, 0x08310100, 0x00c21404, 0x013c0010, 0x01874440, + 0x1a216082, 0x00103440, 0x00000080, 0x00000010, 0x0c1000c1, + 0x1000c100, 0x0222000c, 0x00640019, 0x00a00028, 0x01d11228, + 0x0201001d, + }; + static const u32 xcfga_rx_settings[RZG3S_PCI_PHY_XCFGA_RX_NUM] =3D { + 0x07d55000, 0x030e3f00, 0x00000288, 0x102c5880, 0x0000000b, + 0x04141441, 0x00641641, 0x00d63d63, 0x00641641, 0x01970377, + 0x00190287, 0x00190028, 0x00000028, + }; + + /* + * Enable access permission for physical layer control and status + * registers. + */ + writel(RZG3S_PCI_PERM_PIPE_PHY_REG_EN, host->axi + RZG3S_PCI_PERM); + + for (u8 i =3D 0; i < RZG3S_PCI_PHY_XCFGD_NUM; i++) + writel(xcfgd_settings[i], host->axi + RZG3S_PCI_PHY_XCFGD(i)); + + for (u8 i =3D 0; i < RZG3S_PCI_PHY_XCFGA_CMN_NUM; i++) { + writel(xcfga_cmn_settings[i], + host->axi + RZG3S_PCI_PHY_XCFGA_CMN(i)); + } + + for (u8 i =3D 0; i < RZG3S_PCI_PHY_XCFGA_RX_NUM; i++) { + writel(xcfga_rx_settings[i], + host->axi + RZG3S_PCI_PHY_XCFGA_RX(i)); + } + + writel(0x107, host->axi + RZG3S_PCI_PHY_XCFGA_TX); + + /* Select PHY settings values */ + writel(RZG3S_PCI_PHY_XCFG_CTRL_PHYREG_SEL, + host->axi + RZG3S_PCI_PHY_XCFG_CTRL); + + /* + * Disable access permission for physical layer control and status + * registers. + */ + writel(0, host->axi + RZG3S_PCI_PERM); + + return 0; +} + +static void rzg3s_pcie_pm_runtime_put(void *data) +{ + pm_runtime_put_sync(data); +} + +static void rzg3s_pcie_sysc_signal_action(void *data) +{ + struct regmap *sysc =3D data; + + /* + * SYSC RST_RSM_B signal need to be asserted before turning off the + * power to the PHY. + */ + regmap_update_bits(sysc, RZG3S_SYS_PCIE_RST_RSM_B, + RZG3S_SYS_PCIE_RST_RSM_B_MASK, + FIELD_PREP(RZG3S_SYS_PCIE_RST_RSM_B_MASK, 0)); +} + +static int +rzg3s_pcie_host_setup(struct rzg3s_pcie_host *host, + int (*intx_setup)(struct rzg3s_pcie_host *host), + int (*msi_setup)(struct rzg3s_pcie_host *host), + bool probe) +{ + struct device *dev =3D host->dev; + int ret; + + /* Set inbound windows */ + ret =3D rzg3s_pcie_parse_map_dma_ranges(host); + if (ret) + return dev_err_probe(dev, ret, + "Failed to set inbound windows!\n"); + + /* Set outbound windows */ + ret =3D rzg3s_pcie_parse_map_ranges(host); + if (ret) + return dev_err_probe(dev, ret, + "Failed to set outbound windows!\n"); + + /* Set the PHY, if any */ + if (host->data->init_phy) { + ret =3D host->data->init_phy(host); + if (ret) + return dev_err_probe(dev, ret, + "Failed to set the PHY!\n"); + } + + if (intx_setup) { + ret =3D intx_setup(host); + if (ret) + return dev_err_probe(dev, ret, + "Failed to setup INTx\n"); + } + + /* Set the MSIs */ + if (IS_ENABLED(CONFIG_PCI_MSI)) { + ret =3D msi_setup(host); + if (ret) + return dev_err_probe(dev, ret, + "Failed to setup MSIs\n"); + } + + /* Initialize the host */ + ret =3D rzg3s_pcie_host_init(host, probe); + if (ret) + return dev_err_probe(dev, ret, + "Failed to initialize the HW!\n"); + + /* Try to set maximum supported link speed */ + ret =3D rzg3s_pcie_set_max_link_speed(host); + if (ret) + dev_info(dev, "Failed to set max link speed\n"); + + return 0; +} + +static void rzg3s_pcie_host_remove_action(void *data) +{ + struct rzg3s_pcie_host *host =3D data; + struct pci_host_bridge *bridge =3D pci_host_bridge_from_priv(host); + + pci_lock_rescan_remove(); + pci_stop_root_bus(bridge->bus); + pci_remove_root_bus(bridge->bus); + pci_unlock_rescan_remove(); +} + +static int rzg3s_pcie_probe(struct platform_device *pdev) +{ + struct pci_host_bridge *bridge; + struct device *dev =3D &pdev->dev; + struct device_node *np =3D dev->of_node; + struct device_node *sysc_np __free(device_node) =3D + of_parse_phandle(np, "renesas,sysc", 0); + struct rzg3s_pcie_host *host; + int ret; + + bridge =3D devm_pci_alloc_host_bridge(dev, sizeof(*host)); + if (!bridge) + return -ENOMEM; + + host =3D pci_host_bridge_priv(bridge); + host->dev =3D dev; + host->data =3D device_get_match_data(dev); + platform_set_drvdata(pdev, host); + + host->axi =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(host->axi)) + return PTR_ERR(host->axi); + host->pcie =3D host->axi + RZG3S_PCI_CFG_BASE; + + ret =3D of_property_read_u32(np, "vendor-id", &host->vendor_id); + if (ret) + return ret; + + ret =3D of_property_read_u32(np, "device-id", &host->device_id); + if (ret) + return ret; + + host->sysc =3D syscon_node_to_regmap(sysc_np); + if (IS_ERR(host->sysc)) + return PTR_ERR(host->sysc); + + ret =3D regmap_update_bits(host->sysc, RZG3S_SYS_PCIE_RST_RSM_B, + RZG3S_SYS_PCIE_RST_RSM_B_MASK, + FIELD_PREP(RZG3S_SYS_PCIE_RST_RSM_B_MASK, 1)); + if (ret) + return ret; + + ret =3D devm_add_action_or_reset(dev, rzg3s_pcie_sysc_signal_action, + host->sysc); + if (ret) + return ret; + + ret =3D rzg3s_pcie_resets_prepare(host); + if (ret) + return ret; + + ret =3D devm_pm_runtime_enable(dev); + if (ret) + return ret; + + ret =3D pm_runtime_resume_and_get(dev); + if (ret) + return ret; + + ret =3D devm_add_action_or_reset(dev, rzg3s_pcie_pm_runtime_put, dev); + if (ret) + return ret; + + raw_spin_lock_init(&host->hw_lock); + + ret =3D rzg3s_pcie_host_setup(host, rzg3s_pcie_intx_setup, + rzg3s_pcie_msi_enable, true); + if (ret) + return ret; + + msleep(PCIE_RESET_CONFIG_WAIT_MS); + + bridge->sysdata =3D host; + bridge->ops =3D &rzg3s_pcie_root_ops; + bridge->child_ops =3D &rzg3s_pcie_child_ops; + ret =3D pci_host_probe(bridge); + if (ret) + return ret; + + return devm_add_action_or_reset(dev, rzg3s_pcie_host_remove_action, + host); +} + +static int rzg3s_pcie_suspend_noirq(struct device *dev) +{ + struct rzg3s_pcie_host *host =3D dev_get_drvdata(dev); + const struct rzg3s_pcie_soc_data *data =3D host->data; + struct regmap *sysc =3D host->sysc; + int ret; + + ret =3D pm_runtime_put_sync(dev); + if (ret) + return ret; + + ret =3D reset_control_bulk_assert(data->num_power_resets, + host->power_resets); + if (ret) + goto rpm_restore; + + ret =3D reset_control_bulk_assert(data->num_cfg_resets, + host->cfg_resets); + if (ret) + goto power_resets_restore; + + ret =3D regmap_update_bits(sysc, RZG3S_SYS_PCIE_RST_RSM_B, + RZG3S_SYS_PCIE_RST_RSM_B_MASK, + FIELD_PREP(RZG3S_SYS_PCIE_RST_RSM_B_MASK, 0)); + if (ret) + goto cfg_resets_restore; + + return 0; + + /* Restore the previous state if any error happens */ +cfg_resets_restore: + reset_control_bulk_deassert(data->num_cfg_resets, + host->cfg_resets); +power_resets_restore: + reset_control_bulk_deassert(data->num_power_resets, + host->power_resets); +rpm_restore: + pm_runtime_resume_and_get(dev); + return ret; +} + +static int rzg3s_pcie_resume_noirq(struct device *dev) +{ + struct rzg3s_pcie_host *host =3D dev_get_drvdata(dev); + const struct rzg3s_pcie_soc_data *data =3D host->data; + struct regmap *sysc =3D host->sysc; + int ret; + + ret =3D regmap_update_bits(sysc, RZG3S_SYS_PCIE_RST_RSM_B, + RZG3S_SYS_PCIE_RST_RSM_B_MASK, + FIELD_PREP(RZG3S_SYS_PCIE_RST_RSM_B_MASK, 1)); + if (ret) + return ret; + + ret =3D rzg3s_pcie_power_resets_deassert(host); + if (ret) + goto assert_rst_rsm_b; + + ret =3D pm_runtime_resume_and_get(dev); + if (ret) + goto assert_power_resets; + + ret =3D rzg3s_pcie_host_setup(host, NULL, rzg3s_pcie_msi_hw_setup, false); + if (ret) + goto rpm_put; + + return 0; + + /* + * If any error happens there is no way to recover the IP. Put it in the + * lowest possible power state. + */ +rpm_put: + pm_runtime_put_sync(dev); +assert_power_resets: + reset_control_bulk_assert(data->num_power_resets, + host->power_resets); +assert_rst_rsm_b: + regmap_update_bits(sysc, RZG3S_SYS_PCIE_RST_RSM_B, + RZG3S_SYS_PCIE_RST_RSM_B_MASK, + FIELD_PREP(RZG3S_SYS_PCIE_RST_RSM_B_MASK, 0)); + return ret; +} + +static const struct dev_pm_ops rzg3s_pcie_pm_ops =3D { + NOIRQ_SYSTEM_SLEEP_PM_OPS(rzg3s_pcie_suspend_noirq, + rzg3s_pcie_resume_noirq) +}; + +static const char * const rzg3s_soc_power_resets[] =3D { + "aresetn", "rst_cfg_b", "rst_load_b", +}; + +static const char * const rzg3s_soc_cfg_resets[] =3D { + "rst_b", "rst_ps_b", "rst_gp_b", "rst_rsm_b", +}; + +static const struct rzg3s_pcie_soc_data rzg3s_soc_data =3D { + .power_resets =3D rzg3s_soc_power_resets, + .num_power_resets =3D ARRAY_SIZE(rzg3s_soc_power_resets), + .cfg_resets =3D rzg3s_soc_cfg_resets, + .num_cfg_resets =3D ARRAY_SIZE(rzg3s_soc_cfg_resets), + .init_phy =3D rzg3s_soc_pcie_init_phy, +}; + +static const struct of_device_id rzg3s_pcie_of_match[] =3D { + { + .compatible =3D "renesas,r9a08g045s33-pcie", + .data =3D &rzg3s_soc_data, + }, + {}, +}; + +static struct platform_driver rzg3s_pcie_driver =3D { + .driver =3D { + .name =3D "rzg3s-pcie-host", + .of_match_table =3D rzg3s_pcie_of_match, + .pm =3D pm_ptr(&rzg3s_pcie_pm_ops), + .suppress_bind_attrs =3D true, + }, + .probe =3D rzg3s_pcie_probe, +}; +module_platform_driver(rzg3s_pcie_driver); + +MODULE_DESCRIPTION("Renesas RZ/G3S PCIe host driver"); +MODULE_AUTHOR("Claudiu Beznea "); +MODULE_LICENSE("GPL"); --=20 2.43.0 From nobody Tue Oct 7 22:39:42 2025 Received: from mail-ej1-f44.google.com (mail-ej1-f44.google.com [209.85.218.44]) (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 4DF6C2D5A0D for ; Fri, 4 Jul 2025 16:14:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645691; cv=none; b=PHWsjXJhp1KoL3IQl361trCGwkroIvuz5b7BtntLuWn32aISvyrU9DTp3UdJZsFzoOWMDs6dhXXU4472kkHJmvaKfyA6Uq6NINJb93GJyNWgoHNqW+9IXQXfbrtJgCvhOsc/fv66au6hojXI1EPz2kRCzN+ke3LOyYDzqQiDQvM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645691; c=relaxed/simple; bh=wBW/wOjcHo+MMprzswfhxNr66n7VXFFJfGGCld0Qef4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tD/TkiHxZh65og/NPOrYe6iC+RSEGuOIRRKcQXKgFauEuDGn3xf10ie/TpIlaum6j/p0k8YKq07BzCaPX+5ZonL/bSKTV8WzKuV5KTUyCD92mtXfpczbbhHtY9YVNTFs/LHmyGYcpmbHe7G8AKNFxjVnq7I6hQSASWXTY6MlKh4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=lFf9emJ9; arc=none smtp.client-ip=209.85.218.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="lFf9emJ9" Received: by mail-ej1-f44.google.com with SMTP id a640c23a62f3a-ade76b8356cso209818166b.2 for ; Fri, 04 Jul 2025 09:14:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1751645687; x=1752250487; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=aXyzQ3RBFjluU5MFZEnJA0kb3eKu5D4kycElIEXz9OU=; b=lFf9emJ9EVEuaif7EKDAg2Rf07PS+0eCYuDwYFqJYK0BcXBc384u/8AVmOhuKa2N1O oA6IqTS+ZlSmj2Sz+ux2OdOH8vCHv2djtTBL+dmqEA4T6JvOAArQQ4UqHV+ARqFoB/l4 AT26tXvvLWgA9eF9io05nzJ8xe2pjuiqHItFnPnHariZs28AcgbvNYshRuyeAoEbA5YH 6AwygT8np1U4/BodvxyMaLHbXwnPMGNCdBxLhIQ1eIBn9mcDm57Yk18Z/YfTYpFq4iqM OCAEeZv/gakf87pHSh0yTMUF8YmdOFB7JgdgnCqkl0oAvILURkOe9ic3IU9YoZ4oVvAg Isqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751645687; x=1752250487; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=aXyzQ3RBFjluU5MFZEnJA0kb3eKu5D4kycElIEXz9OU=; b=r3H8vvrVK33FTRRrMYrpVtVPTFCxll2VcZX4LYPHVOgv3mqMy+cSQC4oFs/ValSxnk B4xqkbrmLg1+MaNluRYSjkPUl7tNaBI0iO0K6mrZIPkonG7FmqgEFJqBJBewkuwKidQT IgunntkbrxHhWVzSE1Grn3IQlmeC5ypC56EjMtIOKhO4jRCaHFP4VkNZSKpbz7F8B9Dc 2CGsCicAV0tBNcwWlLxym/WRMtoEKiCHi8/jxogw/U58JcDHZtgiZm0D5XM2Ogay59n2 wEo8BYb5kPJ3ZuvhZlRMqQQqw7hKrRskeTpbQ+fDEIZRVvfahpAQJqtPsKAqtVLacm6X kr9w== X-Forwarded-Encrypted: i=1; AJvYcCVc0ezXIQ2eBTGbXoWmWc00s8cphlHvGE34/SQOYBGRz8abYuor7xu0G/+1NEv3EmIWWNAbQeYXd7FY2Wc=@vger.kernel.org X-Gm-Message-State: AOJu0YztHqdTzzPFpogAChsnUlrEomrXtgv0ETt16lanf9A1KkyWZlxU wqC4PoARFq5aAXaH849rr97WjxPsUKTnHDxNzDYGnV1RjQ6JrZvIO4dJc8keh9wmhS4= X-Gm-Gg: ASbGncveuNCmy9BA4NqNvO4JQbS1czRq8NM3UAeHlA7HFfDu9u86ng6ni0AEst7HGRi h3axPci4yXLQ/FGve3Y1elImwWv0XKr8zD7W97sml5x9jyTy/7BBFuHAjpJthQcdXKeWVx93vHK 5h0yf1t5GD2gb7A18/XLZXbWYFV9X2DUOF4l/X7LTSRkGU1lZFXrWlLhxg4kyxgLQb3SMAyvcRT hkm1ItNucGgxN6FrGvbNC653zOTWkEXhIs4FRJdMjdfDZojV+h8W0WZ32ETEFSehZNN+mVUE68/ yP2uefOJ9lF4VZZezPMHZQJG862yT+bibd8gKwpExLu2DcWTZuEY0bFAy94H/JgRyMNQ+CkSphk QabThw7wKXuts4lw= X-Google-Smtp-Source: AGHT+IEDflpTvh0P6klOG4RxU2kQw1Fie2pGQFC7OAdZikbSv2DiF4LblPFKqKT3Yf5hJEzuGL5H2A== X-Received: by 2002:a17:907:9443:b0:ae0:ce59:5952 with SMTP id a640c23a62f3a-ae3fbeaee26mr286313266b.60.1751645687592; Fri, 04 Jul 2025 09:14:47 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.83]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae3f66d9215sm194703766b.2.2025.07.04.09.14.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Jul 2025 09:14:47 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, catalin.marinas@arm.com, will@kernel.org, mturquette@baylibre.com, sboyd@kernel.org, p.zabel@pengutronix.de, lizhi.hou@amd.com Cc: claudiu.beznea@tuxon.dev, linux-pci@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org, Claudiu Beznea , Wolfram Sang Subject: [PATCH v3 6/9] arm64: dts: renesas: r9a08g045s33: Add PCIe node Date: Fri, 4 Jul 2025 19:14:06 +0300 Message-ID: <20250704161410.3931884-7-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> References: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea The RZ/G3S SoC has a variant (R9A08G045S33) which support PCIe. Add the PCIe node. Tested-by: Wolfram Sang Signed-off-by: Claudiu Beznea --- Changes in v3: - collected tags - changed the ranges flags Changes in v2: - updated the dma-ranges to reflect the SoC capability; added a comment about it. - updated clock-names, interrupt names - dropped legacy-interrupt-controller node - added interrupt-controller property - moved renesas,sysc at the end of the node to comply with DT coding style arch/arm64/boot/dts/renesas/r9a08g045s33.dtsi | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/arch/arm64/boot/dts/renesas/r9a08g045s33.dtsi b/arch/arm64/boo= t/dts/renesas/r9a08g045s33.dtsi index 3351f26c7a2a..cff36e873e59 100644 --- a/arch/arm64/boot/dts/renesas/r9a08g045s33.dtsi +++ b/arch/arm64/boot/dts/renesas/r9a08g045s33.dtsi @@ -12,3 +12,63 @@ / { compatible =3D "renesas,r9a08g045s33", "renesas,r9a08g045"; }; + +&soc { + pcie: pcie@11e40000 { + compatible =3D "renesas,r9a08g045s33-pcie"; + reg =3D <0 0x11e40000 0 0x10000>; + ranges =3D <0x02000000 0 0x30000000 0 0x30000000 0 0x8000000>; + /* Map all possible DRAM ranges (4 GB). */ + dma-ranges =3D <0x42000000 0 0x40000000 0 0x40000000 0x1 0x0>; + bus-range =3D <0x0 0xff>; + clocks =3D <&cpg CPG_MOD R9A08G045_PCI_ACLK>, + <&cpg CPG_MOD R9A08G045_PCI_CLKL1PM>; + clock-names =3D "aclk", "pm"; + resets =3D <&cpg R9A08G045_PCI_ARESETN>, + <&cpg R9A08G045_PCI_RST_B>, + <&cpg R9A08G045_PCI_RST_GP_B>, + <&cpg R9A08G045_PCI_RST_PS_B>, + <&cpg R9A08G045_PCI_RST_RSM_B>, + <&cpg R9A08G045_PCI_RST_CFG_B>, + <&cpg R9A08G045_PCI_RST_LOAD_B>; + reset-names =3D "aresetn", "rst_b", "rst_gp_b", "rst_ps_b", + "rst_rsm_b", "rst_cfg_b", "rst_load_b"; + interrupts =3D , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + interrupt-names =3D "serr", "serr_cor", "serr_nonfatal", + "serr_fatal", "axi_err", "inta", + "intb", "intc", "intd", "msi", + "link_bandwidth", "pm_pme", "dma", + "pcie_evt", "msg", "all"; + #interrupt-cells =3D <1>; + interrupt-controller; + interrupt-map-mask =3D <0 0 0 7>; + interrupt-map =3D <0 0 0 1 &pcie 0 0 0 0>, /* INT A */ + <0 0 0 2 &pcie 0 0 0 1>, /* INT B */ + <0 0 0 3 &pcie 0 0 0 2>, /* INT C */ + <0 0 0 4 &pcie 0 0 0 3>; /* INT D */ + device_type =3D "pci"; + num-lanes =3D <1>; + #address-cells =3D <3>; + #size-cells =3D <2>; + power-domains =3D <&cpg>; + vendor-id =3D <0x1912>; + device-id =3D <0x0033>; + renesas,sysc =3D <&sysc>; + status =3D "disabled"; + }; +}; --=20 2.43.0 From nobody Tue Oct 7 22:39:42 2025 Received: from mail-ej1-f54.google.com (mail-ej1-f54.google.com [209.85.218.54]) (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 10FE22DC328 for ; Fri, 4 Jul 2025 16:14:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645693; cv=none; b=qXlSclNJGyYBV6zXBlzGth+9+RsVQiW6Te4czvRrsLn1MSMeGAwEKCowqTEIhPFkBp2YQMbuMR4f7kQOAGhPS7PXwVu4R+rVMZE1fJJWoQH5lnOEMlKxeEJm6NkR7dDIT+HWF8+veRNfO86WUvdIrYp2NiiA2k4TYAMnIb1qKKw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645693; c=relaxed/simple; bh=gR9Wn5lFTL1dH5LwfqEgIlxPVfhpUTsJpw7A7wwQ7mE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FAiel8vEc0id8BbgBrmVQZIyFBHiMN/e27lWcp1q7y8GmRNihOBBefdLMACDGa8pwxvke6UuDXxJWDoQxOMDzNGPRwnKtYfWcKo6jv9+n+lp743pMaFhH/VazC+/i9Gvrh76sdzOfGnWnWncDJzuJ3rb6ZwclzfXc00I+C009eA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=m8REOPak; arc=none smtp.client-ip=209.85.218.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="m8REOPak" Received: by mail-ej1-f54.google.com with SMTP id a640c23a62f3a-acb5ec407b1so186011166b.1 for ; Fri, 04 Jul 2025 09:14:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1751645689; x=1752250489; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=RkNu2VPdZ05H1WkOeVUqdreqBFI4sSTNmK5wwP9pjsA=; b=m8REOPakEYChY/mVGl38GgbbgXq8xyhEg1Or896sgrIw5Qzg1QW8elA6BNjvsChfYT UFLIQDjY1bXM3NbgpofiqjFzcJvWpJEsIzIZelVjooXtoBfKkHKY7FsTCHKeA8mwUpu/ NOCQDWBd1vrZy61n8WxjirBvbk05J1Z9qph2yinwT/CdxV9eNucZFu7ljm3+nKXoZh6n J7XFM2c+NHh+B3QPw0E1fTXCbQvUQRuSHCxqmZRlfXjRZwgGNmdR9XKpo7kc/dv6GZ+e oXyMEpHgqwH/F7u4wbRgpRyW6kLmblDiseIaCrPuIqtWC7Ec4Sn9EVV0baoJ1UYM9+JI uukg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751645689; x=1752250489; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RkNu2VPdZ05H1WkOeVUqdreqBFI4sSTNmK5wwP9pjsA=; b=TfyW0YuEj6LrUlzLum2+J8GrzWYP+K79N7wnUvsVTmqAV7izm824ZZnXU8xMBmVHXv nGT4GH541WVf0lXVApeN0hYfEVzJtoxueZuwgrlxtIyZVfv4w5TsUFFUKGLHuBqZ9k6i 2u82QyVm2FZFbX961h5x8EiKp+rtn7ZUTp0f/nFR4yZsTKXcOZTt2xKB0/+QHqfACNLE 2jzOCXtRECWs0KvLg/gjIe/zW2TGRpFpbE6KhrR4rVsIjW6EKzAGdNbcFtYKyHtXo8Kd alrdYx0xC3A4rqpfv3qdBO9gJhjl/SWmvmFYBn4fU/1NYHveMT5H0SABk2rFCvSLMa4r xNfw== X-Forwarded-Encrypted: i=1; AJvYcCWJWkPQfU16wuODI0njyePJeFmZUW0dh4gYRGS50A7kdI1eJa6ihGRjLWR1cQkPgp9FfKTnKEVD6MRGe68=@vger.kernel.org X-Gm-Message-State: AOJu0YzC8DoNDFCxEVHmKnsthmWQHTm6s8iLKux+6+hrOMKXPjzZlvFv hmXSLU+M44162GIHUx9qlQ2t66PlIe1HGfJ4u5AAuoThbfNZl0so4odnbyUQUWbrQIc= X-Gm-Gg: ASbGncuJL1uNhjCipGZPDSQgwsE2Ndc9oxScEKKkQ6vjhJRZU/oWenOi0k6exj8t6z1 UT7G0YStSy/JV3Wg+vx7jMTPn/pM1oysX5ZRFNmqOUWp0Ca4TTRhC7wE9OZDBrTPWYOw6RWSm/L 7CQRSv5lg07r/iCmDJfzLTodSCzOD4mljexaXiEDaTznzUjQc5zfsu9jgg0PCBx07SR9hYnMtfA e7UFvmUAQGrDdht8qvORzMvbDZWEs2MRYZviOCYAb2zT5ITqb06JsBKdaeHlZV+GmIZWTyJ3loh XhQR1XFR+rSLXNaTVdjNWtTG+1kKo02q50uwmbHPnqUSve/hn0qN4N4I+iX+k4m1dAp2bGqkxFp b2Xqe6z383Bj5fBY= X-Google-Smtp-Source: AGHT+IF8OBJYopz78uTu4zjr9M4q7cZs8YsJ5lxwKzH9GFcsxUYxUdsvzpbrV/sgFDsSrcOtLDUf2g== X-Received: by 2002:a17:907:3d0c:b0:ae3:163a:f69a with SMTP id a640c23a62f3a-ae3fbd13e86mr283273366b.33.1751645689346; Fri, 04 Jul 2025 09:14:49 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.83]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae3f66d9215sm194703766b.2.2025.07.04.09.14.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Jul 2025 09:14:48 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, catalin.marinas@arm.com, will@kernel.org, mturquette@baylibre.com, sboyd@kernel.org, p.zabel@pengutronix.de, lizhi.hou@amd.com Cc: claudiu.beznea@tuxon.dev, linux-pci@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org, Claudiu Beznea , Wolfram Sang Subject: [PATCH v3 7/9] arm64: dts: renesas: rzg3s-smarc-som: Update dma-ranges for PCIe Date: Fri, 4 Jul 2025 19:14:07 +0300 Message-ID: <20250704161410.3931884-8-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> References: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea The first 128MB of memory is reserved on this board for secure area. Update the PCIe dma-ranges property to reflect this. Tested-by: Wolfram Sang Signed-off-by: Claudiu Beznea --- Changes in v3: - collected tags Changes in v2: - none, this patch is new arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi b/arch/arm64/= boot/dts/renesas/rzg3s-smarc-som.dtsi index 39845faec894..1b03820a6f02 100644 --- a/arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi +++ b/arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi @@ -214,6 +214,11 @@ &sdhi2 { }; #endif =20 +&pcie { + /* First 128MB is reserved for secure area. */ + dma-ranges =3D <0x42000000 0 0x48000000 0 0x48000000 0x0 0x38000000>; +}; + &pinctrl { #if SW_CONFIG3 =3D=3D SW_ON eth0-phy-irq-hog { --=20 2.43.0 From nobody Tue Oct 7 22:39:42 2025 Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.44]) (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 222C82DC35C for ; Fri, 4 Jul 2025 16:14:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645695; cv=none; b=asb31+cszl2i6cV2Wqjg/GvMpjdAO4Po3p/JtomBspYNWd/gOxDQ7wkiRvUXjtU6hjqSWY9ilXt8j/30y5n7oCoYYBR5RtgonPN2yUL5qN7Grx95zq2lK/MOMglId40SL1MAdMrDl4JykWtcpMQ9awoCa3Mustl8U7QvnDEWD6o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645695; c=relaxed/simple; bh=WguPuQh3/mnSf62tuhpCluxDoAVKFv7lhwgnIqAg2mA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XCCjgO1lyJYOQEhkfuYanXICWom0Plt8WSRi7+UYmIy6nmmCSwlew3uziuHNPv0iCrz+7GDUZ88QKV9RVP/hgRZjt3dKNvRuWOIIoAQ1BCbJlp8Z3cvAAfftybzLlAYMK5GcSXri1P04Rih7abAxSvZsAw1ugr6309QEAT60C88= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=kNsxm4aQ; arc=none smtp.client-ip=209.85.208.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="kNsxm4aQ" Received: by mail-ed1-f44.google.com with SMTP id 4fb4d7f45d1cf-6077dea37easo1788024a12.3 for ; Fri, 04 Jul 2025 09:14:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1751645691; x=1752250491; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=EDg1DpjdtfK3/pj3Ed0aWvzIW/qZbuuI4Dyv55kxUjI=; b=kNsxm4aQzR7UeO/Sg2pPhSVSa/aBvxxcStZmcjSqc6NnX6y3RNzAaB4a45xbKHnCl6 OjURboHgmHjDqY0UcT2awnFZGMJTtMLgk4gziU9qQ1TbNb1ouWGsB0xtNEBHanWq6CCF q/Y79U/XX6PK15ZK8mFb2I8UBmyDe5kH9xPMaYfoTl4Efw+y1mwOm8Q7wIfxYRT3fq/E E7AGP/eBjdDMmFSw8+yuMCJWyTbqmGIoBpk47m6t+rDEJKGFXtngaFACVEuEICuXj/rC bEI4NbTz+Aq672q6ZUiVP3nJCUIDvcghA1Ta/+BjifYq48r7l2WRJq0HWJWH+SJ4QjYo 4GzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751645691; x=1752250491; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=EDg1DpjdtfK3/pj3Ed0aWvzIW/qZbuuI4Dyv55kxUjI=; b=e1MpcBzMpxCCYjm/fAtLasv69Pn7aVCNMwL91bdEieCAgTEM/zMdjquQZqtPVWzOeC iKcrH1PkcLE39BrS4+rXil8Zf+3Suka7SsYsR9ByfDRrZjvmR3Wy7NkfkMCg1ZlXCzYR XzhOVtyKShK1IJo/iUH6e+Zw7lml7IQvrmnlpNDvWcRRADeGJWjzOzE1KZPjPsJR13BW 4dgO/XNf8+0TjLWnDorOmlnLc2bN3CmGcVk5xNvaW47MEsGtJIA6+pTmyeKZyuwdLDFX moWLJyIqn5U+ad3M7ICuzS3GYWmjVTkr6cMhAbPch+rpFiOAZ3yGVoARI5ES2Ht28qp8 du0A== X-Forwarded-Encrypted: i=1; AJvYcCXvikAVuxrFDlXOh2gd5iQ9dRDwUHx601gMNxsIYqyMtDyd5LOIde8xQvbn0l5zxdqdiHkSS76yCKL0UQI=@vger.kernel.org X-Gm-Message-State: AOJu0Yy1/b7VUBQBJ/ojQQsNQ6C+T0g+E3uTjWU3fQYU+Ufysvkuw10w QIaZnI2J1ioKyGhoXI1Cz5rzMx3pks/PdRs9KrvoA4MuAneqTMtarZlzUqOqUsyzMAs= X-Gm-Gg: ASbGncv7HSB773+u9e7IGX0Zom/rwkTL6e7M10HqLqq0Mk9l7IWW5YCVrUkIbWGA19I 7I2zc5ZWOSJpZtUy/dqvBbBANhNNOmnqL4E7r4P6lXeQg4MnQARg4d9L7oed+qjJ6SVaJxGs7Bf MwehrXTYkwXOlW9PZwebx6fNPQhPrN5J4CwFqFoaHlnr9n0mSNGALOrP9MvO2cogPfZDByZB1ij OgYla19iWeCoeLogf8MDOXxChqP8a96j+0XF6CFZNUeHN/bfHYtEdgdlXCyJT8PIrxA/naZyAhQ W9Ubre2E6Z3IZ0KnNMjhg0Tcx5m7D/L/n9SEjqLknsi6MjY9NP5yZeDZ9b3dgxc4TNSq7IWAqfO eTGKWmllNFjUB30Q= X-Google-Smtp-Source: AGHT+IEZfr0ji4LDK9KAfq64DmhYMTWRTB1pQDXq1rT0Tuj0QwG5y9ROAnPBq8wcVt6C4csWmuVLvQ== X-Received: by 2002:a17:907:9621:b0:ae3:a717:e90c with SMTP id a640c23a62f3a-ae3fe695451mr259268966b.23.1751645691353; Fri, 04 Jul 2025 09:14:51 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.83]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae3f66d9215sm194703766b.2.2025.07.04.09.14.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Jul 2025 09:14:50 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, catalin.marinas@arm.com, will@kernel.org, mturquette@baylibre.com, sboyd@kernel.org, p.zabel@pengutronix.de, lizhi.hou@amd.com Cc: claudiu.beznea@tuxon.dev, linux-pci@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org, Claudiu Beznea , Wolfram Sang Subject: [PATCH v3 8/9] arm64: dts: renesas: rzg3s-smarc: Enable PCIe Date: Fri, 4 Jul 2025 19:14:08 +0300 Message-ID: <20250704161410.3931884-9-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> References: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea The RZ Smarc Carrier-II board has PCIe headers mounted on it. Enable PCIe support. Tested-by: Wolfram Sang Signed-off-by: Claudiu Beznea --- Changes in v3: - collected tags Changes in v2: - none arch/arm64/boot/dts/renesas/rzg3s-smarc.dtsi | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/arch/arm64/boot/dts/renesas/rzg3s-smarc.dtsi b/arch/arm64/boot= /dts/renesas/rzg3s-smarc.dtsi index 5e044a4d0234..6e9e78aca0b0 100644 --- a/arch/arm64/boot/dts/renesas/rzg3s-smarc.dtsi +++ b/arch/arm64/boot/dts/renesas/rzg3s-smarc.dtsi @@ -132,6 +132,12 @@ power-monitor@44 { }; }; =20 +&pcie { + pinctrl-0 =3D <&pcie_pins>; + pinctrl-names =3D "default"; + status =3D "okay"; +}; + &pinctrl { audio_clock_pins: audio-clock { pins =3D "AUDIO_CLK1", "AUDIO_CLK2"; @@ -159,6 +165,11 @@ key-3-gpio-hog { line-name =3D "key-3-gpio-irq"; }; =20 + pcie_pins: pcie { + pinmux =3D , /* PCIE_RST_OUT_B */ + ; /* PCIE_CLKREQ_B */ + }; + scif0_pins: scif0 { pinmux =3D , /* RXD */ ; /* TXD */ --=20 2.43.0 From nobody Tue Oct 7 22:39:42 2025 Received: from mail-ej1-f54.google.com (mail-ej1-f54.google.com [209.85.218.54]) (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 DD9532E0920 for ; Fri, 4 Jul 2025 16:14:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645696; cv=none; b=iGAZ9lo1uXtcaVMbhQxrZxcoId575Zb9SlHFfCNS/177i4ecEu39grMm5BDx6q8yLFMy7Hm3FXG4RUqcHfSg1B0cgHL8f0CbOqiFGA649+kdsy+g34FmHHGyfIs/ytTZaKnQ2QuZmqPKrpmEfesWvaXDCCzLbzun/DzI2wUoVhA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751645696; c=relaxed/simple; bh=BH1aKcd76IaUZZ/ToYr9eDZkVxa6rxOK7GvAzGHVDi4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aIjW6JTws+8WlxRVLoGSNyCt5r6pyo9AflOXFyUedxmF8jw1r94bM6uZFHK1aUWo6Q/2pUk02suY+llHquV+D+hfEfCdI8/gAKZSe3YmuGBRJ6NRzvcNnj1WmG+YtNC9jx02uUaNupNU/RxgpVMLa8n/ouPi1ZP13eJzfRjI3d8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=BSCbg6+e; arc=none smtp.client-ip=209.85.218.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="BSCbg6+e" Received: by mail-ej1-f54.google.com with SMTP id a640c23a62f3a-ae361e8ec32so244604366b.3 for ; Fri, 04 Jul 2025 09:14:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1751645693; x=1752250493; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=YJ/8zy8l4B85cHtddHm5bMRDVmAGhs389YDqHOJWbP8=; b=BSCbg6+eqWxsdM+U4V+a2msCtN9paviA8SqT1mQaT4m+JjPTt/qE6lzwqKeRrxFQbW 6/WpbORYsVosT4sAg1E3xuUgAHt8JD4ZiKTkoIOPFNEb6VVX5aIOOXZ3p6MeXqbTXNGs DApTUTlwAEdFF6mEDQRMOFHHl6Da/4uPOfPYofeZDLvri0GYWXXzvOuFyNMKzq9zpfiK x8iZ8bqRH8YWa3Ze5MxGT+46IGjwIIY1jQcb1W8CHAJIN2TNlwbaM/6LOZf7U54wGaKC n0zdwpEQ1Ax9WdQtH8dCw9Nwfg+ZI9xBASWVofuaAXNqARrLnrR+6aL/TsEb4x6gF1jv DubQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751645693; x=1752250493; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YJ/8zy8l4B85cHtddHm5bMRDVmAGhs389YDqHOJWbP8=; b=QbBo/CJ96LS2MLLOZI8BX/GtKYaJ4fRC1f7bYdWmHD1A87ybLQYNU+E5JR9GIYWsOT Ng4u8QK5mrZ27oZxb4Mpaq7oVOOcljnKgcOPzrdVwSO3lPhJeuJvxQugVc/JsB8Oirlz BI9eTO/IdOC7qZep5BHzBO2CE+2P08c6mQGV5knMO78hJe/dxeZcHJLKZbRKeOE5yZHF jx5jnVjOKK9/eLG0lKbZz6re7MK/vzmGXMnGeVGLvuaXmw34O+9ApEfQx5iUbkHAYYbY kVyRJ+IZiCfVI/I9mhzyitDA6a9bIolPH3qBsvZvsojbBIv1+MOk7JdTLuoEO+EfGrGy fxlw== X-Forwarded-Encrypted: i=1; AJvYcCVFZgjg68U5qauY1ml7/wkTnFX5DNiM1BaN9lVxKrDTXkv0dOCp0My/9z3wdsZen0/7xqsrDRy9mugGhcE=@vger.kernel.org X-Gm-Message-State: AOJu0YyeQh1PKTMLI1DgGiFLkG6v4uiWH+G8ceLhScoy2YRLoj8znQy8 u+jHQf1m+oIe5bp7g+fKP1OOsqQ5ORcNFULXBzqIwLn22x8PGv1CX8STsXlSW06i3fE= X-Gm-Gg: ASbGncuUEOGtvM8j/QK/ZmesnhSIPcPJltrHZ7RwiTQ0x476zKoqv11xjJVISaLXijv w828LojIq+17Th96N/oro4dhKBiJInI6Kgs/hGqke0EAFCI4HCDFhMUpCHkNgwt/2Xk9iYJxD7s voFFFL79D8GvnxttxLIktqKfbQNMCLZGj0mq2dlDoSEIpCwQZqIYdzLtbq0TpsXaYq2W3W6rS4R DhA8fSPCQ2dTrMjVSnFQab85izyKjwXntYg6a+oZeKE9ZODzipIE+oi+vtaWlYpO0ibNgUiUpiJ BExFWa+dGJjLe4DXBUWnu6dU89gTD2cP/ImGcOMBUNOdxjrWOCkZ9hE7ej+RSpbV/xQui3QDXay tYwb2F6uEHHhTC3E= X-Google-Smtp-Source: AGHT+IGDhz0qhVTw0+Jv8lS4jO8NKu6i+6S1WnDonE3OKo10n+XAusMMQdVW5VodGZ41K5WwIdd9Lg== X-Received: by 2002:a17:907:72c2:b0:ae3:bd92:e69b with SMTP id a640c23a62f3a-ae3fbc4c2a9mr336020266b.7.1751645693200; Fri, 04 Jul 2025 09:14:53 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.83]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae3f66d9215sm194703766b.2.2025.07.04.09.14.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Jul 2025 09:14:52 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, catalin.marinas@arm.com, will@kernel.org, mturquette@baylibre.com, sboyd@kernel.org, p.zabel@pengutronix.de, lizhi.hou@amd.com Cc: claudiu.beznea@tuxon.dev, linux-pci@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-clk@vger.kernel.org, Claudiu Beznea , Wolfram Sang Subject: [PATCH v3 9/9] arm64: defconfig: Enable PCIe for the Renesas RZ/G3S SoC Date: Fri, 4 Jul 2025 19:14:09 +0300 Message-ID: <20250704161410.3931884-10-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> References: <20250704161410.3931884-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea Enable PCIe for the Renesas RZ/G3S SoC. Tested-by: Wolfram Sang Signed-off-by: Claudiu Beznea --- Changes in v3: - collected tags Changes in v2: - none arch/arm64/configs/defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig index 739b19302865..b3533ba5be7e 100644 --- a/arch/arm64/configs/defconfig +++ b/arch/arm64/configs/defconfig @@ -227,6 +227,7 @@ CONFIG_PCIE_MEDIATEK_GEN3=3Dm CONFIG_PCI_TEGRA=3Dy CONFIG_PCIE_RCAR_HOST=3Dy CONFIG_PCIE_RCAR_EP=3Dy +CONFIG_PCIE_RENESAS_RZG3S_HOST=3Dm CONFIG_PCIE_ROCKCHIP_HOST=3Dm CONFIG_PCI_XGENE=3Dy CONFIG_PCI_IMX6_HOST=3Dy --=20 2.43.0