From nobody Mon Feb 9 14:34:31 2026 Received: from mail-ej1-f51.google.com (mail-ej1-f51.google.com [209.85.218.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 E60A723814A for ; Wed, 30 Apr 2025 10:33:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746009186; cv=none; b=MCACxk4Yqfta5uzb8YqVj9B3Pzv+0BFU0AqzP6LCM8G0SIY1133iVo7AcWRDmAImeXKZ1M8e0EZgfTo+ANN3i/vdsMMObfLjQXeusEs5ilR3kE+Q+Et8dZ4RSka1F3AV7yKd3LV5oQOAW2irmnykD3u+/uSNJigrSewQ5f/fqT8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746009186; c=relaxed/simple; bh=VF5hE6k/MDcqLuREIWpFmNpYxebRlFOo17tVqVOfzy0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Wj54mSipZsHF4Z0eRGpGW+jNEhxRWBTM6qZu7WCTtdDlMqN7PDCOnMYI85oSjk68QpIyPHP/6DxQeGVTEr0rqX3geOSERltC5xRySVOG7woPASNpqSVz9HHR8b7TkrPgEU4lI/6UxOcm558utjF5T52M1CrfgeaHIqqjRpHP0Cw= 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=MmoMXDQp; arc=none smtp.client-ip=209.85.218.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="MmoMXDQp" Received: by mail-ej1-f51.google.com with SMTP id a640c23a62f3a-ac339f53df9so1378196566b.1 for ; Wed, 30 Apr 2025 03:33:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1746009182; x=1746613982; 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=9nn4Lhwi6wj905Yh1K+BGwOU5DNtShR8+dwNym0HIX8=; b=MmoMXDQpSkwPOL1N3wM5PlpsTXW1hbo6pivRv85iro2MISs7YSPBZnNDrh8B5z/+dS ZEW5KB2ecmF6RlXa8qdhJup7dfwZT+OA7PhnEaieQ84nmcCux7bC88CF9m/ChaY/d+IY wNoHrsNgpdnStGgWXKKS9mRRWWR1aN6lEH8AMCpyUJJbChfkefqF8ESYkuKbkmh3qoKQ Ax3Ob8NTg+ELSoAxDd+cviyQcMup8UowetRfAMIfTbEjFAQKthUOwystrtGVNUYKnId8 z2DVGvOnYK7Cq/y0fEGwUFZzJl2LzVfUefE8sq7QnMFCR10Upz0iWp14YRoodxND88A8 crrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746009182; x=1746613982; 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=9nn4Lhwi6wj905Yh1K+BGwOU5DNtShR8+dwNym0HIX8=; b=kVjDKJPRAW442wAAu0aX6knYnCgBBuW6M0VwHOq2bFzwYhygJa5WQV7cn23k5rrp4H 6TsO8rvu7lcdBbw3G6Mg0Hj1XuNBQ7rlwT0f9wCxVzbqI6LwWmij+naZ4h0j1E9q4ir8 AhIENEiC2rdpbupznvc1Hv+MwV0NcrfTUaa8ZkQ/UyefBg1cImp0NIrvWQCuXDv/iocK VWkA2k0wG7g3RHaHWM7BWszcpC/mHgW+uPI29cJTRWJby3g+EB+xF7uOq8ec1t06Xd3f ndEejKAmsfrCrjOiiwn9fmNhCRQsodafO3cMFkXqfTcpHFWRfMBqPw0PskmU4mM7GfY5 y8tA== X-Forwarded-Encrypted: i=1; AJvYcCVcgieZgdNELmS52iffF9wzfdfDwyMERKejtxiZoutfau9/dngHtzgmA0sNLpsqZoi+2/tLzbudq95BkFg=@vger.kernel.org X-Gm-Message-State: AOJu0YyFqRGQLmZmpZZVZUMj43N/kW2mqkOJEPQ2JjkaY1aGtV2VWErl GknuceGPspii4K/bJTv5aIepw8jtvCKhO2CgiYGanaI6F0+mKk4zCY2MZnF8V50= X-Gm-Gg: ASbGnct108d/OjAkMagfeEwdUpWFCn0RLhdKlgCT/54zwoWxm56yEkxw7/1LCN0WoR0 YT9+Wp3tSONcsYqnlbpy/+AZ1tY91kRc4Hcfu7K21vrnDxTM35e86YWPKJaGf8Re/7MYNTVNwWB wKbypvy7SIk/FzQY4QUSzv8IRuGqa2h6ow2w7ufwyZqwks3QaGK585dF5buizLKmWb2zM3yeTIy nPcQGBn9zNTsle89PoghoPMKlWWbL4pYmjj4m2hfZGuNk/Jbwf+uFhpinDi+viSPQyPdnIqZIwe B79OHuL4IWeZ2BZhA9AYiW1ugWCeNzEUOXuTIyG7b2/tJfU0LqCuYNLnSRy6P0qD/NWGYzk= X-Google-Smtp-Source: AGHT+IH2N+37bdEAp6umDXJ/Tn+PS9iQBAS/tLfvtmUbmUfhbibyBqoqYkGkCT5w9FYdpi9e+fyJqg== X-Received: by 2002:a17:906:c10d:b0:ace:6f8e:e857 with SMTP id a640c23a62f3a-acee1f240cfmr179989866b.0.1746009166269; Wed, 30 Apr 2025 03:32:46 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.166]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ace6ed6af86sm909390366b.133.2025.04.30.03.32.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Apr 2025 03:32:45 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kw@linux.com, manivannan.sadhasivam@linaro.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, mturquette@baylibre.com, sboyd@kernel.org, saravanak@google.com, p.zabel@pengutronix.de 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 1/8] soc: renesas: r9a08g045-sysc: Add max reg offset Date: Wed, 30 Apr 2025 13:32:29 +0300 Message-ID: <20250430103236.3511989-2-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250430103236.3511989-1-claudiu.beznea.uj@bp.renesas.com> References: <20250430103236.3511989-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 max register offset. Signed-off-by: Claudiu Beznea --- This patch depends on https://lore.kernel.org/all/20250330214945.185725-2-j= ohn.madieu.xa@bp.renesas.com/ drivers/soc/renesas/r9a08g045-sysc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/soc/renesas/r9a08g045-sysc.c b/drivers/soc/renesas/r9a= 08g045-sysc.c index f4db1431e036..2eea95531290 100644 --- a/drivers/soc/renesas/r9a08g045-sysc.c +++ b/drivers/soc/renesas/r9a08g045-sysc.c @@ -20,4 +20,5 @@ static const struct rz_sysc_soc_id_init_data rzg3s_sysc_s= oc_id_init_data __initc =20 const struct rz_sysc_init_data rzg3s_sysc_init_data __initconst =3D { .soc_id_init_data =3D &rzg3s_sysc_soc_id_init_data, + .max_register_offset =3D 0xe28, }; --=20 2.43.0 From nobody Mon Feb 9 14:34:31 2026 Received: from mail-ed1-f41.google.com (mail-ed1-f41.google.com [209.85.208.41]) (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 D412025744F for ; Wed, 30 Apr 2025 10:33:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746009187; cv=none; b=tsG5HvQ7NAjynVlAnIbDqRw1gARPnKx/4UCse54DZaOf3NX+9LZgPajGozRXohuyOCMNZphcFjKiXk0RiZPcAp39o2V/K5zKGQTxD4crp7jIXex5GHFElsHqX+bEyknxqq4ZTOI5E06t6FLemsef90CivU0RKHr7h6gXf/3cPFo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746009187; c=relaxed/simple; bh=yXMvUcI9UJOVWK6FV4N0kjaxLM7bkmRdgBXzTjBcUVg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gJ9KtNS/mFuxh9/HObFgH1b15uY9Aev1wP6xjZZYtMzHnbS/NAymFXT3PjmfmrY7gZvvfi+iTaj98AEFBJ6NScMfwBvf05BRHLTtEiPj+A9TiXjM9KpLRg+MyrqNR3jWY3pKpjqUNgDBqnC/SNdCI22xN49l1UHhpGi1n8k/mI4= 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=nZNmPM0b; arc=none smtp.client-ip=209.85.208.41 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="nZNmPM0b" Received: by mail-ed1-f41.google.com with SMTP id 4fb4d7f45d1cf-5e5bc066283so12262418a12.0 for ; Wed, 30 Apr 2025 03:33:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1746009184; x=1746613984; 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=5Xu0lwXfHypam6aFf6MDeNeMIOVtEqILdYrrYMjhy+Y=; b=nZNmPM0bCYZoKKVt2njn4UV/Q5KlMvktieOUDuXK/xt4HgyCYgomnZ1e6UfGdMzEF4 GW6G4+7NZ2lMLHA3STlzOrkTfFURcq5fKc2N0WCOOY3Hy59b6UT91F/orn5ONZBVfdb4 VcGF3gFvXH+cKrKNffaEnQATb+TU3z1GIn7OslsIkoX2BbM9UNyO3yjg2wnnq+Vk8hBw 6tHtMt6VUFIWe6XKXxsnPa+br6/6zP08yrnT7l/eG6HVAqDSh03D04qZSbgdaynDek9H +zDS8gHJ9EINmn1XYuh6kBW/Nv09o7orAQqrHP7wsfLQIjJ1TNuIcmRZKJdhif46KMSD TZew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746009184; x=1746613984; 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=5Xu0lwXfHypam6aFf6MDeNeMIOVtEqILdYrrYMjhy+Y=; b=KvhJqmIMbSaP7JflFagY0OsK6zwkcbk+8G0cR4sUgwIFJP4vnSu2rS8mwwduR+5Oft QOHWCMuE/JW7VlzQ3eFSh/z+hITS6GOHydkdOvvKLoyhg2rxX41d2LrgwJsrFpDOBPa2 cOPkfUVg1BBeKCYFtQNEzPjd6V/llYwXKTPz8UCDBnKi5YI4GUuN2hY79jwNmTpGTt0o x/MBvtzDjeKEY4bnB0CTkiLosLh4L58fN4jBkmevzqy0UlDvzzYIawkk1YpGp7YyPIh5 ZEx6bsUYV5+XhEf9sb4tI7143aB1wwhRNh0T+riOoo7rSRWXiqgYFDld4nN0q/blj7AO FhyQ== X-Forwarded-Encrypted: i=1; AJvYcCVQ+38FKf6UeVm7+I8VQLcwEFstzGJpyrL4v0K9oAjXaqXpsOMIVn6L37d/8FeyyY/QBR9uGlJD2iEr4IQ=@vger.kernel.org X-Gm-Message-State: AOJu0YygbLaevBNHHu8XN0IJD/+o3v5ZknM7D3QK/IZA4zY0JK9fNGe3 XTihv9vfCH644Vo3qm61Xb1qua+B61ThkxZZ3W/rVaORaoKBnfgb0qB2VnHS+yA= X-Gm-Gg: ASbGncuxs8XhadC5qI/C9/70ASzfxPhvbak0QSIIMEeQMsHu1UeHkNCs87yzVC7umNV PmaiCwCIT/AHOX1DXvKN6oeBNaqPXtG0ythRwHjDB/pDwgO40V2XiDWNsVJ7R+7FD2joqalsWh1 GWQN+F2JjagjiPDY5QCz8NneJZGyy33DEmxM97RABzgZRb7spNsA61krpeWoJUuT+vt/PCt9sHj jodCE8XtPYvZIouZc/qWbyxvFfWiRvps94ZK2QCgprxhADULMELIRS/TG2bX1GsRlFQwOS/elHU 9xYQaZuSuX/N75oqqrNtskJ5ABioAAYoRelPG78PubEglVTqvcGLYEFJCNSWmakrDqpnABE= X-Google-Smtp-Source: AGHT+IEiP6Vgn86q0Y+9iOsEDH1SApC/mbVRMzQBBXjANsWv64cM9/IPsj3x7m/5obY5CmIm9XqGUw== X-Received: by 2002:a17:907:9805:b0:ac3:422a:76dc with SMTP id a640c23a62f3a-acedc65297fmr255856866b.34.1746009184102; Wed, 30 Apr 2025 03:33:04 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.166]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ace6ed6af86sm909390366b.133.2025.04.30.03.33.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Apr 2025 03:33:03 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kw@linux.com, manivannan.sadhasivam@linaro.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, mturquette@baylibre.com, sboyd@kernel.org, saravanak@google.com, p.zabel@pengutronix.de 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 2/8] clk: renesas: r9a08g045: Add clocks, resets and power domain support for the PCIe Date: Wed, 30 Apr 2025 13:32:30 +0300 Message-ID: <20250430103236.3511989-3-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250430103236.3511989-1-claudiu.beznea.uj@bp.renesas.com> References: <20250430103236.3511989-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, resets and power domains 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. Signed-off-by: Claudiu Beznea --- 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 4035f3443598..33219164a19a 100644 --- a/drivers/clk/renesas/r9a08g045-cpg.c +++ b/drivers/clk/renesas/r9a08g045-cpg.c @@ -243,6 +243,8 @@ static const struct rzg2l_mod_clk r9a08g045_mod_clks[] = =3D { DEF_MOD("adc_adclk", R9A08G045_ADC_ADCLK, R9A08G045_CLK_TSU, 0x5a8, 0), DEF_MOD("adc_pclk", R9A08G045_ADC_PCLK, R9A08G045_CLK_TSU, 0x5a8, 1), DEF_MOD("tsu_pclk", R9A08G045_TSU_PCLK, R9A08G045_CLK_TSU, 0x5ac, 0), + DEF_MOD("pci_aclk", R9A08G045_PCI_ACLK, R9A08G045_CLK_M0, 0x608, 0), + DEF_MOD("pci_clk1pm", R9A08G045_PCI_CLKL1PM, R9A08G045_CLK_ZT, 0x608, 1), DEF_MOD("vbat_bclk", R9A08G045_VBAT_BCLK, R9A08G045_OSCCLK, 0x614, 0), }; =20 @@ -282,6 +284,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 @@ -358,6 +367,8 @@ static const struct rzg2l_cpg_pm_domain_init_data r9a08= g045_pm_domains[] =3D { DEF_REG_CONF(CPG_BUS_MCPU2_MSTOP, BIT(14)), 0), DEF_PD("tsu", R9A08G045_PD_TSU, DEF_REG_CONF(CPG_BUS_MCPU2_MSTOP, BIT(15)), 0), + DEF_PD("pci", R9A08G045_PD_PCI, + DEF_REG_CONF(CPG_BUS_PERI_COM_MSTOP, BIT(10)), 0), DEF_PD("vbat", R9A08G045_PD_VBAT, DEF_REG_CONF(CPG_BUS_MCPU3_MSTOP, BIT(8)), GENPD_FLAG_ALWAYS_ON), @@ -365,6 +376,10 @@ static const struct rzg2l_cpg_pm_domain_init_data r9a0= 8g045_pm_domains[] =3D { DEF_REG_CONF(CPG_BUS_MCPU3_MSTOP, BIT(7)), 0), }; =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, @@ -381,6 +396,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 Mon Feb 9 14:34:31 2026 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 0B9A725B1F7 for ; Wed, 30 Apr 2025 10:33:07 +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=1746009191; cv=none; b=pIOMg+2umEKrZqpau/1mGaMC6CvuJNOVhjRFqiRxMD62kPeHciF8RI9nTIVdZvg1hTMr8uPC9M9rbsn5rtlZPF31kxqonJADzKcTn4CMnIT0DyJRJUa8AMoW+K/PjNUqJKPFHpb8F8JPRBbf9mvrhXy3uSvPh9xdvtSP3mmt63E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746009191; c=relaxed/simple; bh=qqyemasPL6QK59u6QUV4f+mqdNA0WLZoLI0hQaQeRAk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mIj4sytPCajNim5sZyTEiewswLHZ1lmsbs6OI4945Cj5kz7OsjiI2/I3ZJ8ufC9ntYVnnQ9+b7VpXihoK1alwI5WnQZpZI1MCUWM4kJy47gouo9Xjbz5ZW2/tX+N0zGEWK2ylnCMX1IMsI4qlf2MORh00qEPuVS2SMxwaMy4NYM= 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=Ar3MVEeq; 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="Ar3MVEeq" Received: by mail-ed1-f45.google.com with SMTP id 4fb4d7f45d1cf-5f4d28d9fd8so8902313a12.3 for ; Wed, 30 Apr 2025 03:33:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1746009186; x=1746613986; 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=TfTKPxq4bZ4SwTcRdBqaDniN3wi53FAiqmOye0MFIKo=; b=Ar3MVEeq032Zsp2bufQHkoUShr0l2ARJ00SAzEmIxHbLo7ufXPfuT/OFIyzkjbHwB/ 8arCjpcysqoHLbdlRHedX1yniC1MAit4Iy61zTfmmZIb+kRzpr8Gju7toflkHnFr1ioC siWYCQ7rnG5t6S8fJNXn53WYfeM8Jajveq9c3o8JcD4mWeHHkhgGrC2or5IaW0li0pjb hQ8/Q+5xVz3yBufrns5L+OAr58s1kdAwnTkENCcBrjWv/mVla3y3YaM8xCkveG4/NgR0 t0ZdJ2jKLabmgUxRK/h0CmhiiZUcPWCiKG0rNW70CTFT5I1NCixAVa5hpm1Ud+BC8XFI u4FA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746009186; x=1746613986; 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=TfTKPxq4bZ4SwTcRdBqaDniN3wi53FAiqmOye0MFIKo=; b=Jik0W8uKw6/pFC6MSK25GsJzHtwFERJY5Tyxl/lgypvs/wv3Elrtwoz3CLPli1yUit ChH9K919d3IZUuxxH+qmwpis6YU2XMjbzMx3EBPYkXfdIgW9yjUNl7pd5ZjG48/VwYXv elFvjVd08sAzn+wqJIKMPFsffGnt14Ek/JexZAdcIkbx+aji/sj2xoO5DfJ7hsPValVB aqjQSX4Y3rQaYtCx9lCdm7LeltHFW4exJdco3EPoMHuq7XES9snFRys2xRlTHhu8qRAn Ie41Ma6ODm6YcuXWPh837nST7P+haUXQmLyEP058V+L/a3GOPmTGyea/r/WmIgRQL1yZ 3faw== X-Forwarded-Encrypted: i=1; AJvYcCUs4LreQfPJdicNj4oBGHOfa6qdX/B0uBYMrUG84ZXeojLGhHczYX1Kpr185ZvP03hTNsO0TJlH2vh5wuc=@vger.kernel.org X-Gm-Message-State: AOJu0Yzl+N0ujoP9YvG7bjV2fWxYPaShSxtJtY/LqeYpbe0MWT2FzWmu 7ak+yr04DHFBD9J3K7OEbRIvZbeRL1ScAdRJmgJDioAK046A8ZNl7TZ1s2XW2nQ= X-Gm-Gg: ASbGncuD3Dd7EFnMiM6Wop9Fmu0FPhv3O/e3cGia7iIjIAM8w3VQfUT6N2dr9N3MEeo fs3kLh0GGQcdRztToWm4E41wzqKgKWNPU/V+2WiydKDasnwbxrCK+T6jYFYwd21xx/43taXwYVb /95ykpEZxkhg1I4EA2fH+PduHGGHen1gLGF5XY2sgJMnl5OVAtLeshuWW6kyyVO3e+TlhUlQDi4 qruQdrwUgBvcCQADLzwME4P+Q/yrEH+Pvfw+DZYScFzrH4VXys7kj80SN1doyjWXYq1EvoN2MoB JPVYQ0J4ZxmDW3cT9K5IgW3i1i3lq8OBh81tPRslIzjsNMLEqKwkXcOVMmoeObUo042gnBSKDiT 3vKS64A== X-Google-Smtp-Source: AGHT+IEEfl+k3BC6Us3G4LOLDc9wt5JbZ4OiyNOr1AeXljqq4kLkSZXbAFThitp0f3NmQGw8dzbixw== X-Received: by 2002:a17:907:1c94:b0:ac7:1600:ea81 with SMTP id a640c23a62f3a-acee2600a17mr193116866b.49.1746009186334; Wed, 30 Apr 2025 03:33:06 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.166]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ace6ed6af86sm909390366b.133.2025.04.30.03.33.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Apr 2025 03:33:05 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kw@linux.com, manivannan.sadhasivam@linaro.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, mturquette@baylibre.com, sboyd@kernel.org, saravanak@google.com, p.zabel@pengutronix.de 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 3/8] of/irq: Export of_irq_count() Date: Wed, 30 Apr 2025 13:32:31 +0300 Message-ID: <20250430103236.3511989-4-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250430103236.3511989-1-claudiu.beznea.uj@bp.renesas.com> References: <20250430103236.3511989-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 Export of_irq_count() to be able to use it in modules. Signed-off-by: Claudiu Beznea --- drivers/of/irq.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/of/irq.c b/drivers/of/irq.c index f8ad79b9b1c9..5adda1dac3cf 100644 --- a/drivers/of/irq.c +++ b/drivers/of/irq.c @@ -519,6 +519,7 @@ int of_irq_count(struct device_node *dev) =20 return nr; } +EXPORT_SYMBOL_GPL(of_irq_count); =20 /** * of_irq_to_resource_table - Fill in resource table with node's IRQ info --=20 2.43.0 From nobody Mon Feb 9 14:34:31 2026 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 014CF25B69D for ; Wed, 30 Apr 2025 10:33:09 +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=1746009193; cv=none; b=ptKszfXhpzfK+x5ND7swVKuY5iEY8xFiwx0zeCLXXjMpXkym8kZCpxs2uLp5Dq5rzdjNhAbezesOGjj7k3Du+d90A8jP7K2W/BvDflvJJQ/cYRYLYD9wcSIA9qmIaPzc2Uk/tKwn9axs7UnhOBHR+1H1fgtXL9gIXHa89llhHNo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746009193; c=relaxed/simple; bh=Bb+Bq5mH+EatJ7/8Yyb5tdic+4z5Pi+Ord6hr6b9qh4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r+F3gyvH6SIbI8+UcTHRH9OH4zy+wyfiQhHUvMiMiDmBFGWi6HtG933t1j16aGvbOyqeQSw6BXKoji7/1Ex2Pkp8dVAOrB5NINy3af9E0qDnrfLfp4PtV5aaDqId7A+/FJb/xT3djG2D2Xy3lAhlgpVGPTt/IKa7X4FRZSPjAww= 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=OtbmleSb; 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="OtbmleSb" Received: by mail-ej1-f44.google.com with SMTP id a640c23a62f3a-acbb85ce788so1388586666b.3 for ; Wed, 30 Apr 2025 03:33:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1746009188; x=1746613988; 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=YoWRRoUBCtB/ZPgUd2ZgkDkK1/5tN5cXWxvNrKDH+MY=; b=OtbmleSbMeI42ml0XZIjcX+zZ8Lfp182i6+4YOHWEaNNf0LPZmMVR4/ROupSAkB/L1 dn6Ozv5ouqrnFODxkCKrfvZg2FJUrXdTImsuk0Pa7wjQ3Miq1eHRclYBlszUzJ/gBMrU XaiyZOjqyptQeDcUF6b+wb/m7JNHQ00ZfPM3sFbfaWNnqRECyP/r00uQAwNO1tiMB50v XXOc0Sf1MMaANjDWjODtubxaLL4whoBQlF8WjDlKOrZt5rHfEnSJMOHsolG6N04rF+tu 4ijmHBL0Of3cuD/slC0Xyjd2G3fINV7GboJ8VrIa1bKEXIRgGetPKRKWXdcKJ0UQeQfU cBfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746009188; x=1746613988; 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=YoWRRoUBCtB/ZPgUd2ZgkDkK1/5tN5cXWxvNrKDH+MY=; b=GPHD/R0WLrv7DbLDFZ9TI+Oe87CEUb8taEF2mTRC4wMaqDC1vDlOvNwrNfB3fLO22S 8BiWGpZGl/q4UpS0Jw0ctQtB5VnQOP4F3fobjzCteXSonyHg+jSa/5iWpeURyoec72qL pE64fvArzSdjm9cGxXNIh3tz9B+vQ20bJ21pDK4J8hnruE/nMr+uASdrXuB7eTy535Su mU/hnRUOJg06DkFdZvdfBAqwvLDgWZHPfwFSxuY6V1qiDdhIj+ib17wedaOnjzPyPxEs sj50BQnFiZ7P4pI8fzhI74QbfQIORLuOu5G2udRKeakP1rscDZBjCqu9Hq5AXAXcqdis AzLw== X-Forwarded-Encrypted: i=1; AJvYcCWwFX4jMs2JqK5v2b9qGgeNL7pfwmhjZmdRSaBOiUNayxmmtSCgzGICW/t2hDmaznDDe6gVWJWk7UPvNVE=@vger.kernel.org X-Gm-Message-State: AOJu0YwVYgoWyn9nTju81AzWTKYbbAKDTi6gc4yVjzzWU89RkjfF+UjK 0FAsAN0J/Gh9ftIBomvRu5YTw5w86lTkJpX6uWGBQoSIddVo0uvV4EpyggOChR4= X-Gm-Gg: ASbGncuIprHI9cr7OVsi06twId5hMQi32cpGTHIisCCBZYx43/pjyw6aH+GN5KPy9Tn Sm27qszYQ5s/o+HBt97hdWEuHhpDutLsUOSb3AfT2phTBcka/Tq5zY3jGm7oXxe8N/Q7Q0izv+U +qWsALPnEzs/P1S5HZ9yIdW6UNCqj12IXPRTZu7g4ao1XjgQ0TGcwzY7HSUNY6Sh4XGViHtvfel hN1AZnHaka2uMZ4OEXH4+niC8kKXkEmLoplkU69BrMbEdqWa4z+L2wY3VqlsJ++Rux3b+8C4M0x +oRjBx0Mf7wYX5hkYM8CkrAwGv8giIfttmmAxUrgMsfJVoPdajweOqC+kGzAhSF8XpAuVXM= X-Google-Smtp-Source: AGHT+IE4zT0K660/YKUi/PMngnz83sua+XYwAUF10tYT8pEOxvZ7ocV0PPZvpQksStrBGl/Fb6vzjw== X-Received: by 2002:a17:907:971c:b0:ac7:3918:50f6 with SMTP id a640c23a62f3a-acedc7b0eafmr258696366b.61.1746009188201; Wed, 30 Apr 2025 03:33:08 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.166]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ace6ed6af86sm909390366b.133.2025.04.30.03.33.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Apr 2025 03:33:07 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kw@linux.com, manivannan.sadhasivam@linaro.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, mturquette@baylibre.com, sboyd@kernel.org, saravanak@google.com, p.zabel@pengutronix.de 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 4/8] dt-bindings: PCI: renesas,r9a08g045s33-pcie: Add documentation for the PCIe IP on Renesas RZ/G3S Date: Wed, 30 Apr 2025 13:32:32 +0300 Message-ID: <20250430103236.3511989-5-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250430103236.3511989-1-claudiu.beznea.uj@bp.renesas.com> References: <20250430103236.3511989-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. The interrupts, interrupt-names, resets, reset-names, clocks, clock-names description were obtained from the hardware manual. Signed-off-by: Claudiu Beznea --- .../pci/renesas,r9a08g045s33-pcie.yaml | 242 ++++++++++++++++++ 1 file changed, 242 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..354f9c3be139 --- /dev/null +++ b/Documentation/devicetree/bindings/pci/renesas,r9a08g045s33-pcie.yaml @@ -0,0 +1,242 @@ +# 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: int_serr + - description: int_ser_cor + - description: int_serr_nonfatal + - description: int_serr_fatal + - description: axi_err_int + - description: inta_rc + - description: intb_rc + - description: intc_rc + - description: intd_rc + - description: intmsi_rc + - description: int_link_bandwidth + - description: int_pm_pme + - description: dma_int + - description: pcie_evt_int + - description: msg_int + - description: int_all + + clocks: + items: + - description: System clock + - description: PM control clock + + clock-names: + items: + - description: aclk + - description: clkl1pm + + 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 + + legacy-interrupt-controller: + description: Interrupt controller node for handling legacy PCI interru= pts + type: object + + properties: + "#address-cells": + const: 0 + + "#interrupt-cells": + const: 1 + + interrupt-controller: true + + interrupts: + items: + - description: INTA interrupt + - description: INTB interrupt + - description: INTC interrupt + - description: INTD interrupt + + required: + - "#address-cells" + - "#interrupt-cells" + - interrupt-controller + - interrupts + + additionalProperties: false + +required: + - compatible + - reg + - clocks + - resets + - reset-names + - interrupts + - interrupt-names + - interrupt-map + - interrupt-map-mask + - 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>; + + gic: interrupt-controller { + interrupt-controller; + #interrupt-cells =3D <3>; + }; + + pcie@11e40000 { + compatible =3D "renesas,r9a08g045s33-pcie"; + reg =3D <0 0x11e40000 0 0x10000>; + ranges =3D <0x03000000 0 0x30000000 0 0x30000000 0 0x8000000>; + dma-ranges =3D <0x42000000 0 0x48000000 0 0x48000000 0 0x80000= 00>; + bus-range =3D <0x0 0xff>; + clocks =3D <&cpg CPG_MOD R9A08G045_PCI_ACLK>, + <&cpg CPG_MOD R9A08G045_PCI_CLKL1PM>; + clock-names =3D "aclk", "clkl1pm"; + 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 "int_serr", "int_serr_cor", "int_serr_nonf= atal", + "int_serr_fatal", "axi_err_int", "inta_rc", + "intb_rc", "intc_rc", "intd_rc", + "intmsi_rc", "int_link_bandwidth", "int_pm_p= me", + "dma_int", "pcie_evt_int", "msg_int", + "int_all"; + #interrupt-cells =3D <1>; + interrupt-map-mask =3D <0 0 0 7>; + interrupt-map =3D <0 0 0 1 &pcie_intx 0>, /* INT A */ + <0 0 0 2 &pcie_intx 1>, /* INT B */ + <0 0 0 3 &pcie_intx 2>, /* INT C */ + <0 0 0 4 &pcie_intx 3>; /* INT D */ + device_type =3D "pci"; + num-lanes =3D <1>; + #address-cells =3D <3>; + #size-cells =3D <2>; + power-domains =3D <&cpg>; + renesas,sysc =3D <&sysc>; + vendor-id =3D <0x1912>; + device-id =3D <0x0033>; + + pcie_intx: legacy-interrupt-controller { + interrupt-controller; + #interrupt-cells =3D <1>; + #address-cells =3D <0>; + interrupt-parent =3D <&gic>; + interrupts =3D , + , + , + ; + }; + }; + }; + +... --=20 2.43.0 From nobody Mon Feb 9 14:34:31 2026 Received: from mail-ed1-f46.google.com (mail-ed1-f46.google.com [209.85.208.46]) (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 D35FD25C705 for ; Wed, 30 Apr 2025 10:33:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746009197; cv=none; b=UIrA6ta5cFVHGZ8GaXAtu5c3vDXiCKzZAVimVfyT+hCxObnOnvjksU6yKrKgzSnuvPLKrdAkZDpoMsPjs3pHxAo5Mqsj10+IwBfuQmIBq9r28rjywYp0/PuqwbSA4D44P7wRwGIR6ElrLG9Fz8vm2yOGiWIhniCfck+WyoBkqos= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746009197; c=relaxed/simple; bh=77PEbrbygiZt+BIrOc+pthahptOpGv0qMdDg13wcWFU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=L+TiSN6tKFasIWkqdi+Ab+tzguN5UqSLEdAL2hqpP6tWwTJUIhG9myO6iFym7K8q7s739Vja8UAYaqAB8SttquO2wk6Mc+e/8yo7ayC6prEEu97KpfL8edXP23maIApwbSBpcJWmgkUHeiywptrVlUYK11+5VjeTFiqnO1Hu79g= 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=YpOoMnZr; arc=none smtp.client-ip=209.85.208.46 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="YpOoMnZr" Received: by mail-ed1-f46.google.com with SMTP id 4fb4d7f45d1cf-5e8be1bdb7bso11294989a12.0 for ; Wed, 30 Apr 2025 03:33:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1746009191; x=1746613991; 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=39eo+KaWsV4E3I/qp1NKCptG+NZWBZIf5qnyi2nwfc8=; b=YpOoMnZr0nvUAoo1JDfkG4lYWMZTBCoVOwNkxlegavib8TIqcg6D7pUseIyJLNAGCz McHkZf8Qqkp9nLmMoWvCrsYDUqOtCSU0aH/mvlk+pad3Wmnwd9baGjYWf7t7c5vlhqjF 7w3leSBpLDTmyAjIxHqoC0Xl+lLMY8zcW1BM7LVPYgV/TIO/C25DexaDtdx3UOVxxb+D e/T7xdLkI+lqVPUUjqv5cAeAGgo6HGqVdWuBudJCmWQd3iJ208q34T0gv+6TCw8fQ/cm AKt7hloRLDPSmdQd3yaoAr9lFuRukoSkRlH9iH/k7p4rPT/YzpyKBbqbR8vzX9LwbbjZ n/lA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746009191; x=1746613991; 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=39eo+KaWsV4E3I/qp1NKCptG+NZWBZIf5qnyi2nwfc8=; b=PQ/a7/JREV17+Zcan1YOpQU0qWmH+E86NMqtgs89Hq6pdGcV6pLg+iozT8B1RhHsNO g1K14yPfLBzapMju6s1V/2EpjDvgEi+WDKfL1R3F4MvIeYS4AaJvA1wgTEKCz4SlCvnQ tDNo6SZDJcQXLFMo9hvd7CpWMPXGlkrbPeCgme8ui0v66EAkpcMT25Cui89HEmhL+nIl CGQFS91/YWsTZek68t1fia8b9QWlGTesxR98zTTqKerAuqgA5Pr54ndlW442/+5USV42 Of4g/XZm6NUdp4FDHCi+f1uA+vfpbgGiYnFPjLTM+7P7/InPOmTFh2eikizu/5j9AgHo I0bA== X-Forwarded-Encrypted: i=1; AJvYcCVG5Z1rpRCSYXjAU8GkgfOI3WiUb3Z4Q15kfMCjW3u0/+Q8gkQg2hG7Xyy3rVA+ESwrJM7Yywbdr0M5Svs=@vger.kernel.org X-Gm-Message-State: AOJu0Yw5I2V+KsB83AV6AQzjMFX7Hv61h4D/ipTRSAq7JfnhS14iv/OW 9azGfvxjom2FAlpTsoSzEULqdmZJoFcARSyGB0pz4/DFg6Ugz4wefMIqB/WfDsU= X-Gm-Gg: ASbGncti8Z3zmr7zfRZI3z2WOP+K5EINrQNPX7Ozk4BBgj5s67FHIn4GwXErmEVrNa/ TaUGOXZbLUXGJQUt2VOGyzhJioYPk9F9sUIqNbVlY5kFE6M2yxUcU4OGRA4CY+l3uLm2r1rLPm8 BL9nVDTGinK0M7swe+Zh1Fvb55I2TN0oP2lyM64vp4mfYYvcT2w/WMVjuWWwrSL8hE0sAkQyjvC wNfvFdPKPA7fWThMJnPaDeIwPzC+tUR2czlOc17JXXcoCMG4rjNDFEeEHky2g6JvMAR1WWlPLy2 vX+i7iagWuMwpRxHDGJ/RPaRp9b74+0ZO2LNxbP9hQJ/94JQ5+XyfNkZT3l6Sg4u4gLAY8o= X-Google-Smtp-Source: AGHT+IGA9r33z1vjS22E0/GR7UcqS/L4YnRG9uoJWCggnPvkf9CxJEAsIgDRIDIR+QBpmIYDW9AltA== X-Received: by 2002:a17:907:9815:b0:ace:be1a:b033 with SMTP id a640c23a62f3a-acedc5d2a7bmr269256766b.24.1746009190735; Wed, 30 Apr 2025 03:33:10 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.166]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ace6ed6af86sm909390366b.133.2025.04.30.03.33.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Apr 2025 03:33:09 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kw@linux.com, manivannan.sadhasivam@linaro.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, mturquette@baylibre.com, sboyd@kernel.org, saravanak@google.com, p.zabel@pengutronix.de 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 5/8] PCI: rzg3s-host: Add Initial PCIe Host Driver for Renesas RZ/G3S SoC Date: Wed, 30 Apr 2025 13:32:33 +0300 Message-ID: <20250430103236.3511989-6-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250430103236.3511989-1-claudiu.beznea.uj@bp.renesas.com> References: <20250430103236.3511989-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. Other Renesas RZ SoCs (e.g., RZ/G3E, RZ/V2H) share the same AXI registers but have both Root Complex and Endpoint capabilities. As a result, the PCIe host driver can be reused for these variants with minimal adjustments. Signed-off-by: Claudiu Beznea --- MAINTAINERS | 8 + drivers/pci/controller/Kconfig | 7 + drivers/pci/controller/Makefile | 1 + drivers/pci/controller/pcie-rzg3s-host.c | 1561 ++++++++++++++++++++++ 4 files changed, 1577 insertions(+) create mode 100644 drivers/pci/controller/pcie-rzg3s-host.c diff --git a/MAINTAINERS b/MAINTAINERS index e2e2942779eb..d7d985d174e2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -19039,6 +19039,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 9800b7681054..102f361fcc63 100644 --- a/drivers/pci/controller/Kconfig +++ b/drivers/pci/controller/Kconfig @@ -256,6 +256,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..c3bce0acd57e --- /dev/null +++ b/drivers/pci/controller/pcie-rzg3s-host.c @@ -0,0 +1,1561 @@ +// 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 + +/* 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_REQ_ISSUE BIT(0) +#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_TR_TP1_RD FIELD_PREP(RZG3S_PCI_REQISS_TR_TYPE, 0= x6) +#define RZG3S_PCI_REQISS_TR_TP1_WR FIELD_PREP(RZG3S_PCI_REQISS_TR_TYPE, 0= x7) +#define RZG3S_PCI_REQISS_MOR_STATUS GENMASK(18, 16) +#define RZG3S_PCI_MSIRCVWADRL 0x100 +#define RZG3S_PCI_MSIRCVWADRL_ENA BIT(0) +#define RZG3S_PCI_MSIRCVWADRL_MSG_DATA_ENA BIT(1) +#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_DL_UPDOWN BIT(9) +#define RZG3S_PCI_PEIS0_RX_DLLP_PM_ENTER BIT(12) +#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_DL_DOWN_STS BIT(0) +#define RZG3S_PCI_PCSTAT1_LTSSM_STATE GENMASK(14, 10) +#define RZG3S_PCI_PCCTRL2 0x410 +#define RZG3S_PCI_PCCTRL2_LS_CHG_REQ BIT(0) +#define RZG3S_PCI_PCCTRL2_LS_CHG GENMASK(9, 8) +#define RZG3S_PCI_PCSTAT2 0x414 +#define RZG3S_PCI_PCSTAT2_STATE_RX_DETECT GENMASK(15, 8) +#define RZG3S_PCI_PCSTAT2_SDRIRE GENMASK(7, 0) +#define RZG3S_PCI_PCSTAT2_LS_CHG_DONE BIT(28) +#define RZG3S_PCI_PERM 0x300 +#define RZG3S_PCI_PERM_PIPE_PHY_REG_EN BIT(1) +#define RZG3S_PCI_PERM_CFG_HWINIT_EN BIT(2) +#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_VID 0x0 +#define RZG3S_PCI_CFG_VID_DEVICE GENMASK(31, 16) +#define RZG3S_PCI_CFG_VID_VENDOR GENMASK(15, 0) +#define RZG3S_PCI_CFG_BNR 0x18 +#define RZG3S_PCI_CFG_BNR_SUBORDINATE_BUS GENMASK(23, 16) +#define RZG3S_PCI_CFG_BNR_SECONDARY_BUS GENMASK(15, 8) +#define RZG3S_PCI_CFG_BARMSK00L 0xa0 +#define RZG3S_PCI_CFG_BARMSK00U 0xa4 +#define RZG3S_PCI_CFG_LINKCS 0x70 +#define RZG3S_PCI_CFG_LINKCS_CUR_LS GENMASK(19, 16) +#define RZG3S_PCI_CFG_LINCS2 0x90 +#define RZG3S_PCI_CFG_LINCS2_TARGET_LS GENMASK(3, 0) + +/* 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 * 2) + +/** + * enum rzg3s_pcie_link_speed - RZ/G3S PCIe available link speeds + * @RZG3S_PCIE_LINK_SPEED_2_5_GTS: 2.5 GT/s + * @RZG3S_PCIE_LINK_SPEED_5_0_GTS: 5.0 GT/s + */ +enum rzg3s_pcie_link_speed { + RZG3S_PCIE_LINK_SPEED_2_5_GTS =3D 1, + RZG3S_PCIE_LINK_SPEED_5_0_GTS +}; + +/** + * 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 - 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 + * @phy_init: PHY specific initialization function + * @sysc: SYSC regmap + * @intx_domain: INTx IRQ domain + * @devres_group_id: devres group which allows unconfiguring everything at + * the end of the driver remove function (or, on probe failure path, just = after + * leaving the driver probe function); otherwise, the dev_pm_domain_detach= () + * called in the platform driver remove function disable the PCIe clocks l= eaving + * the other action or reset function being executed (later) with clocks d= isabled; + * this leads to system being blocked and eventually restarted by watchdog + * @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 + * @num_power_resets: the number of power_resets + * @num_cfg_resets: the number of cfg_resets + */ +struct rzg3s_pcie_host { + void __iomem *axi; + void __iomem *pcie; + struct device *dev; + struct reset_control **power_resets; + struct reset_control **cfg_resets; + int (*phy_init)(struct rzg3s_pcie_host *host); + struct regmap *sysc; + struct irq_domain *intx_domain; + void *devres_group_id; + struct rzg3s_pcie_msi msi; + raw_spinlock_t hw_lock; + int intx_irqs[PCI_NUM_INTX]; + u32 vendor_id; + u32 device_id; + u8 num_power_resets; + u8 num_cfg_resets; +}; + +#define rzg3s_msi_to_host(_msi) container_of(_msi, struct rzg3s_pcie_host,= msi) + +/** + * enum rzg3s_pcie_cfg_access_type - RZ/G3S PCIe access type + * @RZG3S_PCIE_CFG_ACCESS_RD: read access + * @RZG3S_PCIE_CFG_ACCESS_WR: write access + */ +enum rzg3s_pcie_cfg_access_type { + RZG3S_PCIE_CFG_ACCESS_RD, + RZG3S_PCIE_CFG_ACCESS_WR, +}; + +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_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, 2500); + + return !!ret || (val & RZG3S_PCI_REQISS_MOR_STATUS); +} + +static int rzg3s_pcie_config_access(struct rzg3s_pcie_host *host, struct p= ci_bus *bus, + unsigned int devfn, int where, u32 *data, + enum rzg3s_pcie_cfg_access_type access_type) +{ + bool type0 =3D pci_is_root_bus(bus->parent) ? true : false; + unsigned int dev, func, reg, tr_type; + int ret; + + 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); + + if (access_type =3D=3D RZG3S_PCIE_CFG_ACCESS_RD) { + tr_type =3D type0 ? RZG3S_PCI_REQISS_TR_TP0_RD : RZG3S_PCI_REQISS_TR_TP1= _RD; + } else { + tr_type =3D type0 ? RZG3S_PCI_REQISS_TR_TP0_WR : RZG3S_PCI_REQISS_TR_TP1= _WR; + + /* 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(tr_type, host->axi + RZG3S_PCI_REQISS); + + /* Issue the request and wait to finish. */ + ret =3D rzg3s_pcie_issue_request(host); + if (ret) { + if (access_type =3D=3D RZG3S_PCIE_CFG_ACCESS_RD) + PCI_SET_ERROR_RESPONSE(data); + + return PCIBIOS_SET_FAILED; + } + + /* Read the data. */ + if (access_type =3D=3D RZG3S_PCIE_CFG_ACCESS_RD) + *data =3D readl(host->axi + RZG3S_PCI_REQRCVDAT); + + return PCIBIOS_SUCCESSFUL; +} + +static int rzg3s_pcie_read_config_access(struct rzg3s_pcie_host *host, str= uct pci_bus *bus, + unsigned int devfn, int where, u32 *data) +{ + /* Controller can't address itself. Just read the registers. */ + if (pci_is_root_bus(bus) && !devfn) { + u32 reg =3D where & ~0x3; + + *data =3D readl(host->pcie + reg); + return PCIBIOS_SUCCESSFUL; + } + + return rzg3s_pcie_config_access(host, bus, devfn, where, data, RZG3S_PCIE= _CFG_ACCESS_RD); +} + +static int rzg3s_pcie_read_conf(struct pci_bus *bus, unsigned int devfn, i= nt where, int size, + u32 *val) +{ + struct rzg3s_pcie_host *host =3D bus->sysdata; + int ret; + + /* + * Bus number for root complex is set to zero. Skip other requests for + * vendor and device ID (where =3D 0x00). + */ + if (pci_is_root_bus(bus) && PCI_SLOT(devfn) && !where) + return PCIBIOS_DEVICE_NOT_FOUND; + + ret =3D rzg3s_pcie_read_config_access(host, bus, devfn, where, val); + if (ret !=3D PCIBIOS_SUCCESSFUL) + return ret; + + if (size =3D=3D 1) + *val =3D (*val >> (BITS_PER_BYTE * (where & 3))) & 0xff; + else if (size =3D=3D 2) + *val =3D (*val >> (BITS_PER_BYTE * (where & 2))) & 0xffff; + + dev_dbg(&bus->dev, "%s(): bus=3D%3d devfn=3D0x%04x where=3D0x%04x size=3D= %d val=3D0x%08x\n", + __func__, bus->number, devfn, where, size, *val); + + return PCIBIOS_SUCCESSFUL; +} + +static int rzg3s_pcie_write_config_access(struct rzg3s_pcie_host *host, st= ruct pci_bus *bus, + unsigned int devfn, int where, u32 data) +{ + /* Controller can't target itself. */ + if (pci_is_root_bus(bus) && !devfn) { + u32 reg =3D where & ~0x3; + + /* Enable access control to the CFGU. */ + writel(RZG3S_PCI_PERM_CFG_HWINIT_EN, host->axi + RZG3S_PCI_PERM); + /* Write data. */ + writel(data, host->pcie + reg); + /* Disable access control to the CFGU. */ + writel(0, host->axi + RZG3S_PCI_PERM); + + return PCIBIOS_SUCCESSFUL; + } + + return rzg3s_pcie_config_access(host, bus, devfn, where, &data, RZG3S_PCI= E_CFG_ACCESS_WR); +} + +static int rzg3s_pcie_write_conf(struct pci_bus *bus, unsigned int devfn, = int where, int size, + u32 val) +{ + struct rzg3s_pcie_host *host =3D bus->sysdata; + u32 shift, data; + int ret; + + ret =3D rzg3s_pcie_read_config_access(host, bus, devfn, where, &data); + if (ret !=3D PCIBIOS_SUCCESSFUL) + return ret; + + dev_dbg(&bus->dev, "%s(): bus=3D%3d devfn=3D0x%04x where=3D0x%04x size=3D= %d val=3D0x%08x\n", + __func__, bus->number, devfn, where, size, val); + + 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_write_config_access(host, bus, devfn, where, data); +} + +static struct pci_ops rzg3s_pcie_ops =3D { + .read =3D rzg3s_pcie_read_conf, + .write =3D rzg3s_pcie_write_conf, +}; + +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) +{ + 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_PINTRCVI= S_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 < RZG3S_PCI_MSI_INT_NR / RZG3S_PCI_MSI_INT_P= ER_REG; 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_msi_compose_msg(struct irq_data *data, struct msi_m= sg *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 lo, hi; + + /* Enable and msg data enable bits are part of the address lo. Drop them.= */ + lo =3D readl(host->axi + RZG3S_PCI_MSIRCVWADRL) & + ~(RZG3S_PCI_MSIRCVWADRL_ENA | RZG3S_PCI_MSIRCVWADRL_MSG_DATA_ENA); + 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 "rz-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_msi_compose_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, p= arent); + if (!msi->domain) { + irq_domain_remove(parent); + return dev_err_probe(dev, -ENOMEM, "failed to create MSI domain\n"); + } + + return 0; +} + +static void rzg3s_pcie_msi_free_domains(struct rzg3s_pcie_msi *msi) +{ + struct irq_domain *parent =3D msi->domain->parent; + + irq_domain_remove(msi->domain); + irq_domain_remove(parent); +} + +static int rzg3s_pcie_msi_hw_setup(struct rzg3s_pcie_host *host) +{ + 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 < RZG3S_PCI_MSI_INT_NR / RZG3S_PCI_MSI_INT_P= ER_REG; 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_PINTRCVI= E_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_B= IDIRECTIONAL); + if (dma_mapping_error(dev, msi->dma_addr)) { + ret =3D -ENOMEM; + goto free_pages; + } + + /* + * According to the RZ/G3S HW manual (section 34.4.5.2 Setting the MSI Wi= ndow) + * 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 int rzg3s_pcie_msi_enable(struct rzg3s_pcie_host *host) +{ + struct rzg3s_pcie_msi *msi =3D &host->msi; + struct device *dev =3D host->dev; + const char *devname; + int irq, ret; + + mutex_init(&msi->map_lock); + + irq =3D of_irq_get_byname(dev->of_node, "intmsi_rc"); + if (irq <=3D 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_request_irq(dev, irq, rzg3s_pcie_msi_irq, 0, devname, host); + if (ret) { + dev_err_probe(dev, ret, "Failed to request IRQ: %d\n", ret); + goto free_domains; + } + + ret =3D rzg3s_pcie_msi_setup(host); + if (ret) { + dev_err_probe(dev, ret, "Failed to setup MSI!\n"); + goto free_domains; + } + + return 0; + +free_domains: + rzg3s_pcie_msi_free_domains(msi); + return ret; +} + +static void rzg3s_pcie_msi_teardown(void *data) +{ + 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_PINTRCVI= E_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 < RZG3S_PCI_MSI_INT_NR / RZG3S_PCI_MSI_INT_P= ER_REG; 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); + + rzg3s_pcie_msi_free_domains(msi); +} + +static void rzg3s_pcie_intx_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_PINTRCVI= S_INTX(d->hwirq), + RZG3S_PCI_PINTRCVIS_INTX(d->hwirq)); +} + +static void rzg3s_pcie_intx_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_PINTRCVI= E_INTX(d->hwirq), + 0); +} + +static void rzg3s_pcie_intx_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_PINTRCVI= E_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_ack, + .irq_mask =3D rzg3s_pcie_intx_mask, + .irq_unmask =3D rzg3s_pcie_intx_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 int rzg3s_pcie_intx_setup(struct rzg3s_pcie_host *host) +{ + struct device *dev =3D host->dev; + struct device_node *np =3D dev->of_node; + struct device_node *intc_np __free(device_node) =3D of_get_child_by_name(= np, + "legacy-interrupt-controller"); + int irq_count; + + if (!intc_np) { + dev_warn(dev, "legacy-interrupt-controller node is absent\n"); + return 0; + } + + irq_count =3D of_irq_count(intc_np); + if (irq_count !=3D PCI_NUM_INTX) + return dev_err_probe(dev, -EINVAL, + "Invalid IRQ entries in legacy-interrupt-controller\n"); + + for (int i =3D 0; i < irq_count; i++) { + int irq =3D irq_of_parse_and_map(intc_np, i); + + if (!irq) + return dev_err_probe(dev, -EINVAL, "Failed to parse and map INTx IRQ\n"= ); + + 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_add_linear(intc_np, irq_count, + &rzg3s_pcie_intx_domain_ops, host); + if (!host->intx_domain) + return dev_err_probe(dev, -EINVAL, "Failed to add irq domain for INTX ir= qs\n"); + irq_domain_update_bus_token(host->intx_domain, DOMAIN_BUS_WIRED); + + return 0; +} + +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_set_max_link_speed(struct rzg3s_pcie_host *host) +{ + u32 lcs, cs2, link_speed, remote_supported_link_speeds, tmp; + u8 ltssm_state_l0 =3D 0xc; + int ret; + + /* + * According to the RZ/G3S HW manual (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, + 100, 1000); + 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 readl(host->pcie + RZG3S_PCI_CFG_LINKCS); + cs2 =3D readl(host->axi + RZG3S_PCI_PCSTAT2); + + link_speed =3D FIELD_GET(RZG3S_PCI_CFG_LINKCS_CUR_LS, 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 i= t. */ + if (link_speed =3D=3D RZG3S_PCIE_LINK_SPEED_5_0_GTS || + !(remote_supported_link_speeds & BIT(RZG3S_PCIE_LINK_SPEED_5_0_GTS))) + return 0; + + /* Set target Link speed to 5.0 GT/s. */ + rzg3s_pcie_update_bits(host->axi, RZG3S_PCI_CFG_LINCS2, RZG3S_PCI_CFG_LIN= CS2_TARGET_LS, + FIELD_PREP(RZG3S_PCI_CFG_LINCS2_TARGET_LS, + RZG3S_PCIE_LINK_SPEED_5_0_GTS)); + + /* 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, + RZG3S_PCIE_LINK_SPEED_5_0_GTS - 1)); + + ret =3D readl_poll_timeout(host->axi + RZG3S_PCI_PCSTAT2, cs2, + (cs2 & RZG3S_PCI_PCSTAT2_LS_CHG_DONE), 100, 1000); + + /* + * According to the RZ/G3S HW manual (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 void rzg3s_pcie_cfg_init(struct rzg3s_pcie_host *host) +{ + /* Enable access control to the CFGU. */ + writel(RZG3S_PCI_PERM_CFG_HWINIT_EN, host->axi + RZG3S_PCI_PERM); + + /* Update vendor ID and device ID. */ + writel(FIELD_PREP(RZG3S_PCI_CFG_VID_VENDOR, host->vendor_id) | + FIELD_PREP(RZG3S_PCI_CFG_VID_DEVICE, host->device_id), + host->pcie + RZG3S_PCI_CFG_VID); + + /* HW manual recommends to write 0xffffffff on initialization. */ + writel(0xffffffff, host->pcie + RZG3S_PCI_CFG_BARMSK00L); + writel(0xffffffff, host->pcie + RZG3S_PCI_CFG_BARMSK00U); + + /* Primary bus =3D 0, secondary bus =3D 1, subordinate bus =3D 1. */ + writel(FIELD_PREP(RZG3S_PCI_CFG_BNR_SUBORDINATE_BUS, 1) | + FIELD_PREP(RZG3S_PCI_CFG_BNR_SECONDARY_BUS, 1), + host->pcie + RZG3S_PCI_CFG_BNR); + + /* Disable access control to the CFGU. */ + writel(0, host->axi + RZG3S_PCI_PERM); +} + +static void rzg3s_pcie_irqs_init(struct rzg3s_pcie_host *host) +{ + /* + * According to the HW manual of the RZ/G3S (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 int rzg3s_pcie_resets_bulk_set(int (*action)(int num, struct reset_= control_bulk_data *rstcs), + struct reset_control **resets, u8 num_resets) +{ + struct reset_control_bulk_data *data __free(kfree) =3D + kcalloc(num_resets, sizeof(*data), GFP_KERNEL); + + if (!data) + return -ENOMEM; + + for (u8 i =3D 0; i < num_resets; i++) + data[i].rstc =3D resets[i]; + + return action(num_resets, data); +} + +static int +rzg3s_pcie_resets_init(struct device *dev, struct reset_control ***resets, + struct reset_control *(*action)(struct device *dev, const char *i= d), + const char * const *reset_names, u8 num_resets) +{ + *resets =3D devm_kcalloc(dev, num_resets, sizeof(struct reset_control *),= GFP_KERNEL); + if (!*resets) + return -ENOMEM; + + for (u8 i =3D 0; i < num_resets; i++) { + (*resets)[i] =3D action(dev, reset_names[i]); + if (IS_ERR((*resets)[i])) + return PTR_ERR((*resets)[i]); + } + + return 0; +} + +static int rzg3s_pcie_resets_prepare(struct rzg3s_pcie_host *host) +{ + const char * const cfg_resets[] =3D { "rst_b", "rst_ps_b", "rst_gp_b", "r= st_rsm_b", }; + const char * const power_resets[] =3D { "aresetn", "rst_cfg_b", "rst_load= _b", }; + int ret; + + /* + * According to the RZ/G3S HW manual (section 34.5.1.2 De-asserting the R= eset) + * the PCIe IP needs to wait 5ms from power on to the de-assertion of res= et. + */ + usleep_range(5000, 5100); + host->num_power_resets =3D ARRAY_SIZE(power_resets); + ret =3D rzg3s_pcie_resets_init(host->dev, &host->power_resets, + devm_reset_control_get_exclusive_deasserted, + power_resets, ARRAY_SIZE(power_resets)); + if (ret) + return ret; + + host->num_cfg_resets =3D ARRAY_SIZE(cfg_resets); + return rzg3s_pcie_resets_init(host->dev, &host->cfg_resets, + devm_reset_control_get_exclusive, + cfg_resets, ARRAY_SIZE(cfg_resets)); +} + +static void rzg3s_pcie_cfg_resets_action(void *data) +{ + struct rzg3s_pcie_host *host =3D data; + + rzg3s_pcie_resets_bulk_set(reset_control_bulk_assert, host->cfg_resets, + host->num_cfg_resets); +} + +static int rzg3s_pcie_hw_init(struct rzg3s_pcie_host *host, bool probe) +{ + u32 val; + int ret; + + /* Set the PCIe related registers. */ + rzg3s_pcie_cfg_init(host); + + /* Set the interrupts. */ + rzg3s_pcie_irqs_init(host); + + ret =3D rzg3s_pcie_resets_bulk_set(reset_control_bulk_deassert, host->cfg= _resets, + host->num_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), 5000, 500000); + if (ret) { + rzg3s_pcie_resets_bulk_set(reset_control_bulk_assert, host->cfg_resets, + host->num_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, u6= 4 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 (section 34.3.1.71 AXI Window Mask + * (Lower) Registers) the min size is 4K. + */ + size =3D max(size, 4096); + + /* + * According the RZ/G3S HW manual (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 alined and be a power of 2. + */ + size =3D ALIGN(size, 4096); + + /* + * According to the RZ/G3S HW manual (section 34.3.1.71 AXI Window Mask + * (Lower) Registers) HW expects first 12 LSB bits to be 0xfff. + * Extract 1 from size for this. + */ + size =3D roundup_pow_of_two(size) - 1; + + cpu_addr =3D ALIGN(cpu_addr, 4096); + pci_addr =3D ALIGN(pci_addr, 4096); + + 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, s= truct 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 (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, 4096); + + size =3D ALIGN(size, 4096); + 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_pcie_phy_init(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, + }; + + 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); + + 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_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->phy_init) { + ret =3D host->phy_init(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"); + + if (probe) { + ret =3D devm_add_action_or_reset(dev, rzg3s_pcie_intx_teardown, host); + if (ret) + return dev_err_probe(dev, ret, "Failed to add INTx action\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"); + + if (probe) { + ret =3D devm_add_action_or_reset(dev, rzg3s_pcie_msi_teardown, host); + if (ret) + return dev_err_probe(dev, ret, "Failed to add MSI action\n"); + } + } + + /* Initialize the HW. */ + ret =3D rzg3s_pcie_hw_init(host, probe); + if (ret) + return dev_err_probe(dev, ret, "Failed to initialize the HW!\n"); + + /* Try to set maximum supported link speed (5.0 GT/s). */ + ret =3D rzg3s_pcie_set_max_link_speed(host); + if (ret) + dev_info(dev, "Failed to set link speed to 5.0 GT/s\n"); + + return 0; +} + +static int rzg3s_pcie_probe_helper(struct platform_device *pdev, void *dev= res_group_id) +{ + 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->phy_init =3D device_get_match_data(dev); + host->devres_group_id =3D devres_group_id; + 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_setup(host, rzg3s_pcie_intx_setup, rzg3s_pcie_msi_enab= le, true); + if (ret) + return ret; + + bridge->sysdata =3D host; + bridge->ops =3D &rzg3s_pcie_ops; + return pci_host_probe(bridge); +} + +static int rzg3s_pcie_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + void *devres_group_id; + int ret; + + devres_group_id =3D devres_open_group(dev, NULL, GFP_KERNEL); + if (!devres_group_id) + return -ENOMEM; + + ret =3D rzg3s_pcie_probe_helper(pdev, devres_group_id); + if (ret) + devres_release_group(dev, devres_group_id); + + return ret; +} + +static void rzg3s_pcie_remove(struct platform_device *pdev) +{ + struct rzg3s_pcie_host *host =3D dev_get_drvdata(&pdev->dev); + 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(); + + devres_release_group(host->dev, host->devres_group_id); +} + +static int rzg3s_pcie_suspend(struct device *dev) +{ + struct rzg3s_pcie_host *host =3D dev_get_drvdata(dev); + struct regmap *sysc =3D host->sysc; + int ret; + + ret =3D pm_runtime_put_sync(dev); + if (ret) + return ret; + + ret =3D rzg3s_pcie_resets_bulk_set(reset_control_bulk_assert, host->power= _resets, + host->num_power_resets); + if (ret) + goto rpm_restore; + + ret =3D rzg3s_pcie_resets_bulk_set(reset_control_bulk_assert, host->cfg_r= esets, + host->num_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: + rzg3s_pcie_resets_bulk_set(reset_control_bulk_deassert, host->cfg_resets, + host->num_cfg_resets); +power_resets_restore: + rzg3s_pcie_resets_bulk_set(reset_control_bulk_deassert, host->power_reset= s, + host->num_power_resets); +rpm_restore: + pm_runtime_resume_and_get(dev); + return ret; +} + +static int rzg3s_pcie_resume(struct device *dev) +{ + struct rzg3s_pcie_host *host =3D dev_get_drvdata(dev); + 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; + + /* + * According to the RZ/G3S HW manual (section 34.5.1.2 De-asserting the R= eset) + * the PCIe IP needs to wait 5ms from power on to the de-assertion of res= et. + */ + usleep_range(5000, 5100); + ret =3D rzg3s_pcie_resets_bulk_set(reset_control_bulk_deassert, host->pow= er_resets, + host->num_power_resets); + 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_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: + rzg3s_pcie_resets_bulk_set(reset_control_bulk_assert, host->power_resets, + host->num_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 DEFINE_NOIRQ_DEV_PM_OPS(rzg3s_pcie_pm_ops, rzg3s_pcie_suspend, rzg3= s_pcie_resume); + +static const struct of_device_id rzg3s_pcie_of_match[] =3D { + { .compatible =3D "renesas,r9a08g045s33-pcie", .data =3D rzg3s_pcie_phy_i= nit }, + {}, +}; + +static struct platform_driver rzg3s_pcie_driver =3D { + .driver =3D { + .name =3D "rz-pcie-host", + .of_match_table =3D rzg3s_pcie_of_match, + .pm =3D pm_ptr(&rzg3s_pcie_pm_ops), + }, + .probe =3D rzg3s_pcie_probe, + .remove =3D rzg3s_pcie_remove, +}; +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 Mon Feb 9 14:34:31 2026 Received: from mail-ed1-f53.google.com (mail-ed1-f53.google.com [209.85.208.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 D2A5725CC72 for ; Wed, 30 Apr 2025 10:33:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746009197; cv=none; b=fOd+QMsD2985zD6xaxZFtF93b5o302D84goAe0wEP++51Wi0Gi+AuM/EaRBXqQtUVL4x86Pe8q4SI8Reg1/xnByHckqdy9XhWkaycT5pAmnzpstYtjAmpCHiVlrvWWuUjb8gbtVZrA6scX3nkXEzHwLeDr8hQE5rR9bEjZ7RaA0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746009197; c=relaxed/simple; bh=mq/lfbjEAahbi8v/Yxilo1z7mltq0L7V1rgg9IzAxl4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NZF/KRpZjsFT2TzhJ5I6St3NyuypWFXX/TYPmt7Onu84RMP4m7ku9hbgSoP9EdQkiBxxPfHXDe5SpGgk4k/1fUN9I4i2Xhj49afl7V7InLFwdzg52jBLN4dLdLNmG4j7Yo84nM8mKnwF/vIn90S4vKJ2gPA40HaU22W72RWATuI= 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=ck0Yu9BV; arc=none smtp.client-ip=209.85.208.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="ck0Yu9BV" Received: by mail-ed1-f53.google.com with SMTP id 4fb4d7f45d1cf-5f4ca707e31so11833158a12.2 for ; Wed, 30 Apr 2025 03:33:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1746009193; x=1746613993; 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=NXuUx7wovZ0PAW+LIKC1wW/SlMfBkmpMINNtgC9+O8I=; b=ck0Yu9BVnnMdw34p7HSlErxRD1LPCsKyDzBzNdttlnPFn8axfz4T1fGMiOeggXjm8z +MELIVUAXEFoEYgDSHGdsRXoaVmcoPauY5C0TTQD95J+EsndSv/khEKRO4j1bLwl+6IL QcATaKzHvfWeKSWIWbK3HHlnCFeXjI5AhRyMUTEjC93mhDzp2Xp0/zIHo9GSPkFwE95U g+XqsZl1QUx15vjuIxlh16u8hOa/XZehgiwuvkfoOEvbpEAzx4wvWaXhPrWdVR606PTa 6apMufzFd8Ir05VBJFjwfLfLkvZphRkiOiBQzSyOn2SscSzamXvtGzrzzIYvjL+O2kP2 kF0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746009193; x=1746613993; 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=NXuUx7wovZ0PAW+LIKC1wW/SlMfBkmpMINNtgC9+O8I=; b=qffDutXs/YmwYrf2m/sMF/ebGPbBGCuUd3gMVYh0xWGy3pvJ49DHMiN9vRV1XmjGHc 8HDpjn0bXzS4bfcn4EL23XkM1KC+ZSAivpEPrjl6EwhZUWX51EgXVKRxCw3OA79/oud5 w0v1frr25Icul9wO8ja1d97KOmrJeZr2El5edcKzpF5B5CKoIL9yBH6O41iHMzMg8SY0 AcN7VFwKYRZQL03qo5mg1WlWzJduFLgW1t3sfFHG8NVSKGw4t3PFWsgzG1eVDmj/vcxg mEhqEysxN+AcQqd15QsRK/3x+hUgcdxnax8eGL/92PzPb/6v/dkeQxiNB/80vLnf05rW 69SQ== X-Forwarded-Encrypted: i=1; AJvYcCXwjXDqFAT4SlOhGwMw1Il9oEpP/oUfxdYTZs4K5C/6kiFE8p5adfpVog2Xo/dQ4thZQtm6pKxKXvkA9mE=@vger.kernel.org X-Gm-Message-State: AOJu0YzstAdRoEh6swwc6DZNxjQDP+rLCDvmxygEz5IwSQPbLC30skYK bDvtPPilCbnJDMMtjnu0bv+VelLaoiqfD8SsTknSuUvcar3RZBYKB7U45X3PjVI= X-Gm-Gg: ASbGncsvGT/7yH0GFZ+5JxTwclYMNmv0cVMhW2gPx116vh9ypDOsDZotoEvoqpgE7J3 q2kEHhJLWyT6n7IJIM8niqWeooctrDon2kOb38QIwGd97J3t+nTSTOVTlVfjGJjAZJbkhCqH6l/ AWx6u8oTZ5vGXdsKxZvOrZ1Fs/sZKQkbsm+NKoRwspk7r0NC3TYMh6i2+8J9UuXrOHau4o7inTm PJt/sgdBEjDeJPLbBHnzUWl1xyl0Lyv7mZFE8XmuVF68Db4GN41ue4CashobVM9grAHfZ91Bz86 g3wFL3j60aXzWt92+AfqdghAoyvF+7D32DcWkPCvhWoYliwkzW5od2C3Ml09CCk8RGstjIk= X-Google-Smtp-Source: AGHT+IFBnCMqwv/bA5b/iHfecbvBB+Yr4Jy1p1ir0HdMA9k60f2mMrCz9DtJCVKYrl1BbCQtAeT7Qg== X-Received: by 2002:a17:907:3ea6:b0:ac3:48e4:f8bc with SMTP id a640c23a62f3a-acee25c74a2mr231543466b.48.1746009193099; Wed, 30 Apr 2025 03:33:13 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.166]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ace6ed6af86sm909390366b.133.2025.04.30.03.33.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Apr 2025 03:33:12 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kw@linux.com, manivannan.sadhasivam@linaro.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, mturquette@baylibre.com, sboyd@kernel.org, saravanak@google.com, p.zabel@pengutronix.de 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 6/8] arm64: dts: renesas: r9a08g045s33: Add PCIe node Date: Wed, 30 Apr 2025 13:32:34 +0300 Message-ID: <20250430103236.3511989-7-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250430103236.3511989-1-claudiu.beznea.uj@bp.renesas.com> References: <20250430103236.3511989-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. Signed-off-by: Claudiu Beznea --- arch/arm64/boot/dts/renesas/r9a08g045s33.dtsi | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/arch/arm64/boot/dts/renesas/r9a08g045s33.dtsi b/arch/arm64/boo= t/dts/renesas/r9a08g045s33.dtsi index 3351f26c7a2a..d8e1dc80e56e 100644 --- a/arch/arm64/boot/dts/renesas/r9a08g045s33.dtsi +++ b/arch/arm64/boot/dts/renesas/r9a08g045s33.dtsi @@ -12,3 +12,73 @@ / { compatible =3D "renesas,r9a08g045s33", "renesas,r9a08g045"; }; + +&soc { + pcie: pcie@11e40000 { + compatible =3D "renesas,r9a08g045s33-pcie"; + reg =3D <0 0x11e40000 0 0x10000>; + ranges =3D <0x03000000 0 0x30000000 0 0x30000000 0 0x8000000>; + dma-ranges =3D <0x42000000 0 0x48000000 0 0x48000000 0 0x38000000>; + bus-range =3D <0x0 0xff>; + clocks =3D <&cpg CPG_MOD R9A08G045_PCI_ACLK>, + <&cpg CPG_MOD R9A08G045_PCI_CLKL1PM>; + clock-names =3D "aclk", "clkl1pm"; + 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 "int_serr", "int_serr_cor", "int_serr_nonfatal", + "int_serr_fatal", "axi_err_int", "inta_rc", + "intb_rc", "intc_rc", "intd_rc", + "intmsi_rc", "int_link_bandwidth", "int_pm_pme", + "dma_int", "pcie_evt_int", "msg_int", + "int_all"; + #interrupt-cells =3D <1>; + interrupt-map-mask =3D <0 0 0 7>; + interrupt-map =3D <0 0 0 1 &pcie_intx 0>, /* INT A */ + <0 0 0 2 &pcie_intx 1>, /* INT B */ + <0 0 0 3 &pcie_intx 2>, /* INT C */ + <0 0 0 4 &pcie_intx 3>; /* INT D */ + device_type =3D "pci"; + num-lanes =3D <1>; + #address-cells =3D <3>; + #size-cells =3D <2>; + power-domains =3D <&cpg>; + renesas,sysc =3D <&sysc>; + vendor-id =3D <0x1912>; + device-id =3D <0x0033>; + status =3D "disabled"; + + pcie_intx: legacy-interrupt-controller { + interrupt-controller; + #interrupt-cells =3D <1>; + #address-cells =3D <0>; + interrupt-parent =3D <&gic>; + interrupts =3D , + , + , + ; + }; + }; +}; --=20 2.43.0 From nobody Mon Feb 9 14:34:31 2026 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 8E78225D1E7 for ; Wed, 30 Apr 2025 10:33:17 +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=1746009200; cv=none; b=NzFjmj6VtBifXp5pQO9JDRjYT4nr+i+KAs0ZZvyOm3MGSFMctOtaf1359dwkcrxo0vR+RB8L5B1CREF0MVlL8lWdeLtVSuqQBJ8TL1jIffpFa9DZpg/xl/Y8ygbdittWT17E5BDytRnLChFoOhFnOQIZ9DAa61wPtxIdh7SqmOE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746009200; c=relaxed/simple; bh=EGBMN18CVdfmHkc+brVcq+MVtXLfo7+2eoARAWS5P4g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=j3evTiCP2xnRhJg5JAvsHG7BWNI69fpdh8zLw8l5gbkn99gCQ0kCWHY3ilLQhUqTs34kePlPjhbpVIKT+HIYG70O9MBEkjgajxIPylzN+HGLCdyV3ntKW+KSNz+s/BwHZbq0njpBtc9wQYZ949NvPEto6i3GokDduu6zgTgpZSw= 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=ggiA4Hxo; 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="ggiA4Hxo" Received: by mail-ej1-f42.google.com with SMTP id a640c23a62f3a-aca99fc253bso1092661866b.0 for ; Wed, 30 Apr 2025 03:33:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1746009196; x=1746613996; 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=XLzaKZV14Vn6EMb9E2bHvEtZk0V2ql8+6m7239vNBfc=; b=ggiA4Hxo6OuwqDkz3I+mb/Y6975pyRApoNvAqYV1u1V7Bx+45217nLDBqPT/YQMzJ8 IyAuOo7S/DQoiXfmzHTWe70XSYkgpOaOQa275zJytBz15KA6UJiY3l2expo3O6lc3NWr zqpM0YT3aaFc+soUoBnmj1/Ins92ihEPwFo99iXeiFIepqw+O+T8ZFOle4uoOtIf3ddH AE371+2rHn+8BZ8krOa4w28GE7Ve3Sj4Wb4wAOfMRifRzgdM+p5qBx0XFMyQq3PsEUi+ AZqEOKkZsXYeSWTe3qkLuXj2nAcKUoODH2NIbWKC2RGk/QP3GEmqpxPzTvb6btT6rriL Vu2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746009196; x=1746613996; 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=XLzaKZV14Vn6EMb9E2bHvEtZk0V2ql8+6m7239vNBfc=; b=BNTeCY3Gcd9r7eOctmttMJDv3ihjS/DJhqzpGNdiIxUvO7KYI/FbJR4SIFEHBHiovS 7SO9zGuy9nShkUoWD8ptCILdBMYjcQ5WdH3HBDyDysE52bTmFOKPBCna+VQS0pMnOtq/ J777EnUjNZ0GS/WHVyqcxhbYR33OgVME/JMbVHRivU2gDp43MNMDwBi/h80fVBFXEQm3 dQ0GHXkNGRJ+lHRiJPaU2OMeBg2icRKQistBRuwIt4gIVBc9p9Q3G9PNvBt6JyZISrxp GSIxwo56rs3ig3tFv+x6kVtUTTY21XtWqF7QiRZe5Z+UC7CVDcxAoTvFiKDHXaOQ+4Cd r9kQ== X-Forwarded-Encrypted: i=1; AJvYcCVRvcbLHgpWgWJo00fz7Atg+99vh8UuYNBU7gFFyqU1JLOS2qfEaoOrdjeuCMzou6UXSzN8VW82SNpvFdk=@vger.kernel.org X-Gm-Message-State: AOJu0YyXr0v1BLLrwuXZOKyc7tjUUcH49oZcXVavxaC3sBAtU+/HQKyg QAPVrH3USHznrTlkNYRvPUedQfwaJFpnZxK5IVLJSseX6nfZcqgbdW9/exEj5IU= X-Gm-Gg: ASbGnctsyKCdfSWT8BHG6tI6EjoydP4T7jH3OACTBd6REMOMnI0p3Rl3IPjuHdo+4kZ ZM+gFUPvfKL+YCQdrrvPE29kfMqDSaMZeDpGg0vHaoddHxkYcoNpqTufKY3Imr6ylfINDb9Eks7 LN2f9NBC0TzOWAjqCPLhjknpnOd3JwmrqIY6fxNinzZm7BFFyJO03ICousH5ID2G45MnJflM2cj Rw8wb6eTm6IQABXpgGRQT5DGJxMAiDmtfWHOl+qNVOUshpwbHLesqa/dIuMz4T3NsUO7BUajq4K ZH9Q6+n5rtPgNyxdTlq72gE0ln3ThYLnQqtb2xDlA6xEj2B+LOJUYAxQDQ1wahy+HDtwh8M= X-Google-Smtp-Source: AGHT+IEKSM0IXh8jKv5O+IVSv4mJ6z4oh82fv68+fLwY5atxsSRsGcvPXRiQe2VBDa9mA8yPM7H+KQ== X-Received: by 2002:a17:907:3f0f:b0:abf:6aa4:924c with SMTP id a640c23a62f3a-acee21ae83amr165748366b.17.1746009195599; Wed, 30 Apr 2025 03:33:15 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.166]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ace6ed6af86sm909390366b.133.2025.04.30.03.33.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Apr 2025 03:33:14 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kw@linux.com, manivannan.sadhasivam@linaro.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, mturquette@baylibre.com, sboyd@kernel.org, saravanak@google.com, p.zabel@pengutronix.de 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 7/8] arm64: dts: renesas: rzg3s-smarc: Enable PCIe Date: Wed, 30 Apr 2025 13:32:35 +0300 Message-ID: <20250430103236.3511989-8-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250430103236.3511989-1-claudiu.beznea.uj@bp.renesas.com> References: <20250430103236.3511989-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. Signed-off-by: Claudiu Beznea --- 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 Mon Feb 9 14:34:31 2026 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 6EE9125D8FD for ; Wed, 30 Apr 2025 10:33:19 +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=1746009202; cv=none; b=Vqgx5KAYk70j2Hm9ivziPHQiPzRD0QpyI2z7jF7Fu47JkmZms+5ta9EJJRa6KdmNhkPh6WxS/fFRYLfVF+T+tu76pFBF0Lqf3al9WFgZC+rSI2bmn7serBXbBzT+3sCfiG3I9HJh8XZa3nZnGTsnLveRV5i8lHGd6VEl+9Gzv/4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746009202; c=relaxed/simple; bh=/qb3LqOk0CPpYt1EbGZXh/Cw0pmf2cmac/XhDTHJc/A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Lv7J0dQt1W7NzxCSbRTqJDxXSMVXH8EQU1t9z8rGHU9hiBuwv/aucMngQOdl9bN4aC1B1cSnrLxrm2NsBFskGx25GO59Q04G8yprg2u2oaM7IsRz0PFRa73AMOXkeuzwZ6qbuW41P9cMPq3d6wco9CvDVQDb+fbmn4+5ptZnb7o= 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=FmUjbCUe; 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="FmUjbCUe" Received: by mail-ej1-f42.google.com with SMTP id a640c23a62f3a-acec5b99052so325069266b.1 for ; Wed, 30 Apr 2025 03:33:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1746009198; x=1746613998; 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=5/1UiigIwXR8rjSUy1c3Sx5vxGn2/huSophWGwjW0Zc=; b=FmUjbCUel/sDyoT96HiYbVfnZDo+v2BW0CCcZWw0bXzJ++Q4SVcTJ49ikGG0R++cfq aXg03AGEJAXs54SuWkde7nF8hOWT036NHNkkwZyQsmFXJJLUa13uq3yJbgxKKdfn/axD oS2YzykAKuXhdWJixjv+yoMhJcDe+ZMoicXN3L0MfJ6CaV5RkevYwhMZSzU2eEK8xjBz BSp8I4HfY6DB/hd0OxI22CAhdUvJZKRe0xh3HFZm1j4vSWyszzyczuAsbnvBEbr1EbaP 0GkgnSQ1h6N0FyWhYWwsBoKgXXTSv41dldS8FRWOFIUv5RkGduvGzmRT1Jx6Y3LR4/br 7QFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746009198; x=1746613998; 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=5/1UiigIwXR8rjSUy1c3Sx5vxGn2/huSophWGwjW0Zc=; b=K49G+BNVnu5cCZ3VSBKDtvHJet1UjKsSeoBBFLTaFplE3v8KiMOgh5c+mt3AnDvubh oIzQkOQJrrmFjC/eTLryEfWOH7yAXTctMCYFYCjJvYpiFf5VEulT5Vdst4FXExp43Jcq io5XPRuehW3nZJWEQsAjSH9L5l0fy8DVCz5EDssYM1v8XMkWIze5BdbcjKz21+8sQPOp 9xO9nyySaf0imkZSpiC2V1fstQSmXGV07uO/sa0xrtJmjaAiBqPFHzLQZcDSOhbOW8CY 2KZNyKr2nG059/qPl4ImFSqqXkK9H9kX2kzyuZw9jG+aNsUgx1S/NkciON3tvIR6c+AB dHvw== X-Forwarded-Encrypted: i=1; AJvYcCXGVE7wHy2txDspYvWo65tGe7az9xsWa3VlJ0eEHGiSQXGIOmmbG9vnDGcf63T0bt+xuLjmdJPL4TUwavk=@vger.kernel.org X-Gm-Message-State: AOJu0YwWIbw2LJxkKTcWD+sW42ZiPUDXgyihsKztqFk3WVPfWVrOFa+R 6LaMaEJNAe7AHI6c/9gJiLdwU6PMDkGwQlLz4+95HJjQW/XaVDb7XAF03Td8ZAQ= X-Gm-Gg: ASbGncsYQTYFL16vPfzvfYmqWiKZRh/g41IyeAqWKXeg4WP16GYCxGbETMLoS3UQ5/4 Gcp54+i+d1UyUSzaYg1avkxcDTvLbqF67+a17CkOHgvToIKw/VqupqfQ+iRSd2YvJQvoYSM1h2K 6SXMUdqs3t5vFErEGegUI1vqcU+ZEj37n7SwfdUTxeYmKa7qpJAVo3Ax74x1+3Af/rxb/ujKkg5 xOc559gi5Ao7ybMlD0xW698dkVQndVuPIp9Spxk0CkRfvWPL2rgY2sP96ZVl0i4XY51niAHpC7M 195o6tN7MeXh+59Sj4qeq6fPvNp4u/UC//DniHwKEC5MvV4SjLVGBGv2bhiDkx4GOGpq1vE= X-Google-Smtp-Source: AGHT+IHBcCruFD2Sx7wtL0cb9Uodi9fNatKRjptTZekaQF3eLuwGTgjpuo5/jbKcvNzZcB+Y1bBY1g== X-Received: by 2002:a17:907:3ea2:b0:ace:da39:7170 with SMTP id a640c23a62f3a-acedc768b2fmr307149666b.55.1746009197623; Wed, 30 Apr 2025 03:33:17 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.166]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ace6ed6af86sm909390366b.133.2025.04.30.03.33.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Apr 2025 03:33:16 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: bhelgaas@google.com, lpieralisi@kernel.org, kw@linux.com, manivannan.sadhasivam@linaro.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, geert+renesas@glider.be, magnus.damm@gmail.com, mturquette@baylibre.com, sboyd@kernel.org, saravanak@google.com, p.zabel@pengutronix.de 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 8/8] arm64: defconfig: Enable PCIe for the Renesas RZ/G3S SoC Date: Wed, 30 Apr 2025 13:32:36 +0300 Message-ID: <20250430103236.3511989-9-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250430103236.3511989-1-claudiu.beznea.uj@bp.renesas.com> References: <20250430103236.3511989-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. Signed-off-by: Claudiu Beznea --- arch/arm64/configs/defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig index a92c4122a8b9..b36a96777018 100644 --- a/arch/arm64/configs/defconfig +++ b/arch/arm64/configs/defconfig @@ -226,6 +226,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