soc/tegra: Updates for v6.17-rc1

The bulk of this is the addition of Tegra264 support for various low-
 level components. This also adds fabric descriptors for the new Tegra254
 and Tegra264 chips.
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEiOrDCAFJzPfAjcif3SOs138+s6EFAmhxiLQACgkQ3SOs138+
 s6GrMA//SscGyGAVDKWGd0otj1Wk9TD5RIxgOMpvjGJE/M1EK+VHqtb4K76+Zqkc
 HnyrkkRbmGiV3c19e53tYqC2Syv6atxB0QYS/4n8M7gWMjNBXT3wFEU13Jqu8QER
 GPkgNSrKjUZClbAgkdGbTaEcjOuT35T1MORo5mGgYFKO+83bbpxFc4f3s7eDe3AU
 az/SgEfe7nbvaDVwM8XshazyFyidIg2lxCy9YzXVkZBhG+z4mH7sHhg9VlEI87VA
 a/ElQG3j80YNwzmeFA9j44GMy75ma01KgplfvXFPY4YRPj+dgTrVfll+9nttZbez
 itcukFMQKZF40NKfxy/bASL6SKxISLOPK6EwJ1+Ws1omXlsjzdgMacNaeURgLICt
 1DJQRjQs9COt+VFFCqnVBFtbZlFk8yOTcSv1IimaLk9B1vhz5oCrlg8+RCtW+54m
 XerfpqUaV+7zc2wtgofy/HsdY93EyLPwQ08AxJG8fZMMwqpE1lwxXCH6WBDHMZAC
 AccMc9dqW5fbuRKLdFfMDfMF6mzqHJXPag3KCv0VLDFIpy7buLTaSHfVNFMHhtcE
 ajuHpSrmYkHy7SOOVvlDtyQIP3mKk3FSQyE0PYconcJ2rJOdcfhJFWGDTTXaDz2a
 XhbxX2o7Z5LsVr52X+5LAwEaTnZLTR1omKnznWW21agqBljPXtU=
 =iSY8
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEo6/YBQwIrVS28WGKmmx57+YAGNkFAmh+aEMACgkQmmx57+YA
 GNkDtQ/+JjbVkMQOKxUvKNJMiy2hRhEG6WNc+sZ9Wqk+E6/JgMmFTIlbW9hKnRw1
 57ir/a18dWGJ0y/jV7YfjuZkYWgo+uXwMvA+rRrGAUm0ZxgVj1dCZLhEdWyrMEIS
 j16W1T52ANRsjfJB5L4y97J4b6EpnLeyDiEvO9NljANig6VgxRFuvZxuXiDWJ7I+
 h2JhdOXlSqCMlpfnsDddhvwKQHhHoYJBjFrytcxuzP1NJLwRajGax0GfObiXRrN0
 9A/tXarZOmoQAA6PtfvnNoxuZdc0A/otp2sYSntPJNNhxVyZy7flHvm2SFUhMnS1
 XX60qdV7V9raahopqvst12xBhK57xBfYFBUkybi0ExmCcXAvGp19psSAHFgFFUbC
 5SqQidl1TkcVK4ISTv/4hUqulumXhvN7Kq+PlFVswvye01M0GmuMrmAKaLhWSKqO
 qCPkFvu3aI3UlY8f0jVy6g4OeZO/ZYXiP4CTQyqeMFy8+b10kHLCm7EdOSZOEoW1
 emCqUm6Mr5YJqu1NhqF3LUQqTYBDIhae+z/vyCstv7hbBzwQk0hM+Ou05oINeZpk
 XNDD76ZQLCMHJPbuw/fcLrpk8wayiLf9a9PhCDfNYIeNrfTB7Rr6Xk8DGSQXiSnv
 jBAB2Agj/ylpL7MEmKL0NNXvBnlImdEJd6NMAIHKaNB8WpCp89o=
 =Urev
 -----END PGP SIGNATURE-----

Merge tag 'tegra-for-6.17-soc' of https://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux into soc/drivers

soc/tegra: Updates for v6.17-rc1

The bulk of this is the addition of Tegra264 support for various low-
level components. This also adds fabric descriptors for the new Tegra254
and Tegra264 chips.

* tag 'tegra-for-6.17-soc' of https://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux:
  soc/tegra: cbb: Add support for CBB fabrics in Tegra254
  soc/tegra: cbb: Add support for CBB fabrics in Tegra264
  soc/tegra: cbb: Support HW lookup to get timed out target address
  soc/tegra: cbb: Improve handling for per SoC fabric data
  soc/tegra: cbb: Make error interrupt enable and status per SoC
  soc/tegra: cbb: Change master/slave to initiator/target
  soc/tegra: cbb: Clear ERR_FORCE register with ERR_STATUS
  soc/tegra: Add Tegra264 APBMISC compatible string
  soc/tegra: pmc: Add Tegra264 support
  soc/tegra: Enable support for Tegra264

Link: https://lore.kernel.org/r/20250711220943.2389322-1-thierry.reding@gmail.com
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
Arnd Bergmann 2025-07-21 18:18:07 +02:00
commit 985da98f29
5 changed files with 733 additions and 191 deletions

View File

@ -138,6 +138,14 @@ config ARCH_TEGRA_241_SOC
help
Enable support for the NVIDIA Tegra241 SoC.
config ARCH_TEGRA_264_SOC
bool "NVIDIA Tegra264 SoC"
depends on !CPU_BIG_ENDIAN
select MAILBOX
select SOC_TEGRA_PMC
help
Enable support for the NVIDIA Tegra264 SoC.
endif
endif

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2021-2022, NVIDIA CORPORATION. All rights reserved
* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved
*
* The driver handles Error's from Control Backbone(CBB) generated due to
* illegal accesses. When an error is reported from a NOC within CBB,
@ -138,7 +138,7 @@ struct tegra194_cbb_userbits {
struct tegra194_cbb_noc_data {
const char *name;
bool erd_mask_inband_err;
const char * const *master_id;
const char * const *initiator_id;
unsigned int max_aperture;
const struct tegra194_cbb_aperture *noc_aperture;
const char * const *routeid_initflow;
@ -216,7 +216,7 @@ static const char * const tegra194_axi2apb_error[] = {
"CH2RFIFOF - Ch2 Request FIFO Full interrupt"
};
static const char * const tegra194_master_id[] = {
static const char * const tegra194_initiator_id[] = {
[0x0] = "CCPLEX",
[0x1] = "CCPLEX_DPMU",
[0x2] = "BPMP",
@ -238,7 +238,7 @@ static const struct tegra_cbb_error tegra194_cbb_errors[] = {
{
.code = "SLV",
.source = "Target",
.desc = "Target error detected by CBB slave"
.desc = "Target error detected by CBB target"
}, {
.code = "DEC",
.source = "Initiator NIU",
@ -1774,8 +1774,8 @@ static void print_errlog5(struct seq_file *file, struct tegra194_cbb *cbb)
tegra_cbb_print_err(file, "\t AXI ID\t\t: %#x\n", userbits.axi_id);
}
tegra_cbb_print_err(file, "\t Master ID\t\t: %s\n",
cbb->noc->master_id[userbits.mstr_id]);
tegra_cbb_print_err(file, "\t Initiator ID\t\t: %s\n",
cbb->noc->initiator_id[userbits.mstr_id]);
tegra_cbb_print_err(file, "\t Security Group(GRPSEC): %#x\n", userbits.grpsec);
tegra_cbb_print_cache(file, userbits.axcache);
tegra_cbb_print_prot(file, userbits.axprot);
@ -1837,14 +1837,14 @@ print_errlog1_2(struct seq_file *file, struct tegra194_cbb *cbb,
/*
* Print transcation type, error code and description from ErrLog0 for all
* errors. For NOC slave errors, all relevant error info is printed using
* errors. For NOC target errors, all relevant error info is printed using
* ErrLog0 only. But additional information is printed for errors from
* APB slaves because for them:
* - All errors are logged as SLV(slave) errors due to APB having only single
* APB targets because for them:
* - All errors are logged as SLV(target) errors due to APB having only single
* bit pslverr to report all errors.
* - Exact cause is printed by reading DMAAPB_X_RAW_INTERRUPT_STATUS register.
* - The driver prints information showing AXI2APB bridge and exact error
* only if there is error in any AXI2APB slave.
* only if there is error in any AXI2APB target.
* - There is still no way to disambiguate a DEC error from SLV error type.
*/
static bool print_errlog0(struct seq_file *file, struct tegra194_cbb *cbb)
@ -1884,8 +1884,8 @@ static bool print_errlog0(struct seq_file *file, struct tegra194_cbb *cbb)
/* For all SLV errors, read DMAAPB_X_RAW_INTERRUPT_STATUS
* register to get error status for all AXI2APB bridges.
* Print bridge details if a bit is set in a bridge's
* status register due to error in a APB slave connected
* to that bridge. For other NOC slaves, none of the status
* status register due to error in a APB target connected
* to that bridge. For other NOC targets, none of the status
* register will be set.
*/
@ -2118,7 +2118,7 @@ static const struct tegra_cbb_ops tegra194_cbb_ops = {
static struct tegra194_cbb_noc_data tegra194_cbb_central_noc_data = {
.name = "cbb-noc",
.erd_mask_inband_err = true,
.master_id = tegra194_master_id,
.initiator_id = tegra194_initiator_id,
.noc_aperture = tegra194_cbbcentralnoc_apert_lookup,
.max_aperture = ARRAY_SIZE(tegra194_cbbcentralnoc_apert_lookup),
.routeid_initflow = tegra194_cbbcentralnoc_routeid_initflow,
@ -2130,7 +2130,7 @@ static struct tegra194_cbb_noc_data tegra194_cbb_central_noc_data = {
static struct tegra194_cbb_noc_data tegra194_aon_noc_data = {
.name = "aon-noc",
.erd_mask_inband_err = false,
.master_id = tegra194_master_id,
.initiator_id = tegra194_initiator_id,
.noc_aperture = tegra194_aonnoc_aperture_lookup,
.max_aperture = ARRAY_SIZE(tegra194_aonnoc_aperture_lookup),
.routeid_initflow = tegra194_aonnoc_routeid_initflow,
@ -2142,7 +2142,7 @@ static struct tegra194_cbb_noc_data tegra194_aon_noc_data = {
static struct tegra194_cbb_noc_data tegra194_bpmp_noc_data = {
.name = "bpmp-noc",
.erd_mask_inband_err = false,
.master_id = tegra194_master_id,
.initiator_id = tegra194_initiator_id,
.noc_aperture = tegra194_bpmpnoc_apert_lookup,
.max_aperture = ARRAY_SIZE(tegra194_bpmpnoc_apert_lookup),
.routeid_initflow = tegra194_bpmpnoc_routeid_initflow,
@ -2154,7 +2154,7 @@ static struct tegra194_cbb_noc_data tegra194_bpmp_noc_data = {
static struct tegra194_cbb_noc_data tegra194_rce_noc_data = {
.name = "rce-noc",
.erd_mask_inband_err = false,
.master_id = tegra194_master_id,
.initiator_id = tegra194_initiator_id,
.noc_aperture = tegra194_scenoc_apert_lookup,
.max_aperture = ARRAY_SIZE(tegra194_scenoc_apert_lookup),
.routeid_initflow = tegra194_scenoc_routeid_initflow,
@ -2166,7 +2166,7 @@ static struct tegra194_cbb_noc_data tegra194_rce_noc_data = {
static struct tegra194_cbb_noc_data tegra194_sce_noc_data = {
.name = "sce-noc",
.erd_mask_inband_err = false,
.master_id = tegra194_master_id,
.initiator_id = tegra194_initiator_id,
.noc_aperture = tegra194_scenoc_apert_lookup,
.max_aperture = ARRAY_SIZE(tegra194_scenoc_apert_lookup),
.routeid_initflow = tegra194_scenoc_routeid_initflow,

File diff suppressed because it is too large Load Diff

View File

@ -128,6 +128,7 @@ static const struct of_device_id apbmisc_match[] __initconst = {
{ .compatible = "nvidia,tegra186-misc", },
{ .compatible = "nvidia,tegra194-misc", },
{ .compatible = "nvidia,tegra234-misc", },
{ .compatible = "nvidia,tegra264-misc", },
{},
};

View File

@ -4247,7 +4247,128 @@ static const struct tegra_pmc_soc tegra234_pmc_soc = {
.has_single_mmio_aperture = false,
};
static const struct tegra_pmc_regs tegra264_pmc_regs = {
.scratch0 = 0x684,
.rst_status = 0x4,
.rst_source_shift = 0x2,
.rst_source_mask = 0x1fc,
.rst_level_shift = 0x0,
.rst_level_mask = 0x3,
};
static const char * const tegra264_reset_sources[] = {
"SYS_RESET_N", /* 0x0 */
"CSDC_RTC_XTAL",
"VREFRO_POWER_BAD",
"SCPM_SOC_XTAL",
"SCPM_RTC_XTAL",
"FMON_32K",
"FMON_OSC",
"POD_RTC",
"POD_IO", /* 0x8 */
"POD_PLUS_IO_SPLL",
"POD_PLUS_SOC",
"VMON_PLUS_UV",
"VMON_PLUS_OV",
"FUSECRC_FAULT",
"OSC_FAULT",
"BPMP_BOOT_FAULT",
"SCPM_BPMP_CORE_CLK", /* 0x10 */
"SCPM_PSC_SE_CLK",
"VMON_SOC_MIN",
"VMON_SOC_MAX",
"VMON_MSS_MIN",
"VMON_MSS_MAX",
"POD_PLUS_IO_VMON",
"NVJTAG_SEL_MONITOR",
"NV_THERM_FAULT", /* 0x18 */
"FSI_THERM_FAULT",
"PSC_SW",
"SCPM_OESP_SE_CLK",
"SCPM_SB_SE_CLK",
"POD_CPU",
"POD_GPU",
"DCLS_GPU",
"POD_MSS", /* 0x20 */
"FMON_FSI",
"POD_FSI",
"VMON_FSI_MIN",
"VMON_FSI_MAX",
"VMON_CPU0_MIN",
"VMON_CPU0_MAX",
"BPMP_FMON",
"AO_WDT_POR", /* 0x28 */
"BPMP_WDT_POR",
"AO_TKE_WDT_POR",
"RCE0_WDT_POR",
"RCE1_WDT_POR",
"DCE_WDT_POR",
"FSI_R5_WDT_POR",
"FSI_R52_0_WDT_POR",
"FSI_R52_1_WDT_POR", /* 0x30 */
"FSI_R52_2_WDT_POR",
"FSI_R52_3_WDT_POR",
"TOP_0_WDT_POR",
"TOP_1_WDT_POR",
"TOP_2_WDT_POR",
"APE_C0_WDT_POR",
"APE_C1_WDT_POR",
"GPU_TKE_WDT_POR", /* 0x38 */
"PSC_WDT_POR",
"OESP_WDT_POR",
"SB_WDT_POR",
"SW_MAIN",
"L0L1_RST_OUT_N",
"FSI_HSM",
"CSITE_SW",
"AO_WDT_DBG", /* 0x40 */
"BPMP_WDT_DBG",
"AO_TKE_WDT_DBG",
"RCE0_WDT_DBG",
"RCE1_WDT_DBG",
"DCE_WDT_DBG",
"FSI_R5_WDT_DBG",
"FSI_R52_0_WDT_DBG",
"FSI_R52_1_WDT_DBG", /* 0x48 */
"FSI_R52_2_WDT_DBG",
"FSI_R52_3_WDT_DBG",
"TOP_0_WDT_DBG",
"TOP_1_WDT_DBG",
"TOP_2_WDT_DBG",
"APE_C0_WDT_DBG",
"APE_C1_WDT_DBG",
"PSC_WDT_DBG", /* 0x50 */
"OESP_WDT_DBG",
"SB_WDT_DBG",
"TSC_0_WDT_DBG",
"TSC_1_WDT_DBG",
"L2_RST_OUT_N",
"SC7"
};
static const struct tegra_wake_event tegra264_wake_events[] = {
};
static const struct tegra_pmc_soc tegra264_pmc_soc = {
.has_impl_33v_pwr = true,
.regs = &tegra264_pmc_regs,
.init = tegra186_pmc_init,
.setup_irq_polarity = tegra186_pmc_setup_irq_polarity,
.set_wake_filters = tegra186_pmc_set_wake_filters,
.irq_set_wake = tegra186_pmc_irq_set_wake,
.irq_set_type = tegra186_pmc_irq_set_type,
.reset_sources = tegra264_reset_sources,
.num_reset_sources = ARRAY_SIZE(tegra264_reset_sources),
.reset_levels = tegra186_reset_levels,
.num_reset_levels = ARRAY_SIZE(tegra186_reset_levels),
.wake_events = tegra264_wake_events,
.num_wake_events = ARRAY_SIZE(tegra264_wake_events),
.max_wake_events = 128,
.max_wake_vectors = 4,
};
static const struct of_device_id tegra_pmc_match[] = {
{ .compatible = "nvidia,tegra264-pmc", .data = &tegra264_pmc_soc },
{ .compatible = "nvidia,tegra234-pmc", .data = &tegra234_pmc_soc },
{ .compatible = "nvidia,tegra194-pmc", .data = &tegra194_pmc_soc },
{ .compatible = "nvidia,tegra186-pmc", .data = &tegra186_pmc_soc },