Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
ddc1c56f
Commit
ddc1c56f
authored
Mar 30, 2017
by
davidcunado-arm
Committed by
GitHub
Mar 30, 2017
Browse files
Merge pull request #875 from vwadekar/tegra186-platform-support-v2
Tegra186 platform support v2
parents
e422f991
b8de8473
Changes
14
Show whitespace changes
Inline
Side-by-side
plat/nvidia/tegra/common/drivers/memctrl/memctrl_v2.c
View file @
ddc1c56f
...
...
@@ -45,7 +45,7 @@
/* Video Memory base and size (live values) */
static
uint64_t
video_mem_base
;
static
uint64_t
video_mem_size
;
static
uint64_t
video_mem_size
_mb
;
/* array to hold stream_id override config register offsets */
const
static
uint32_t
streamid_overrides
[]
=
{
...
...
@@ -144,8 +144,7 @@ const static mc_streamid_security_cfg_t sec_cfgs[] = {
mc_make_sec_cfg
(
SCEDMAW
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
UFSHCR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SDMMCWAA
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
APEDMAW
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SESWR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SESWR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
MPCORER
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
PTCR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
BPMPW
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
...
...
@@ -159,9 +158,7 @@ const static mc_streamid_security_cfg_t sec_cfgs[] = {
mc_make_sec_cfg
(
XUSB_HOSTW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
TSECSWR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SDMMCRAA
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
APER
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
VIW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
APEW
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
AXISR
,
SECURE
,
NO_OVERRIDE
,
DISABLE
),
mc_make_sec_cfg
(
SDMMCW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
BPMPDMAW
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
...
...
@@ -191,13 +188,23 @@ const static mc_streamid_security_cfg_t sec_cfgs[] = {
mc_make_sec_cfg
(
SDMMCRAB
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
ETRR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
AONR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
APEDMAR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SESRD
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
SESRD
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
NVENCSRD
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
GPUSWR
,
SECURE
,
NO_OVERRIDE
,
DISABLE
),
mc_make_sec_cfg
(
TSECSWRB
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
ISPWB
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
GPUSRD2
,
SECURE
,
NO_OVERRIDE
,
DISABLE
),
#if ENABLE_CHIP_VERIFICATION_HARNESS
mc_make_sec_cfg
(
APEDMAW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
APER
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
APEW
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
APEDMAR
,
NON_SECURE
,
OVERRIDE
,
ENABLE
),
#else
mc_make_sec_cfg
(
APEDMAW
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
APER
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
APEW
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
mc_make_sec_cfg
(
APEDMAR
,
NON_SECURE
,
NO_OVERRIDE
,
ENABLE
),
#endif
};
const
static
mc_txn_override_cfg_t
mc_override_cfgs
[]
=
{
...
...
@@ -234,6 +241,251 @@ const static mc_txn_override_cfg_t mc_override_cfgs[] = {
mc_make_txn_override_cfg
(
SCEW
,
CGID_TAG_ADR
),
};
static
void
tegra_memctrl_reconfig_mss_clients
(
void
)
{
#if ENABLE_ROC_FOR_ORDERING_CLIENT_REQUESTS
uint32_t
val
,
wdata_0
,
wdata_1
;
/*
* Assert Memory Controller's HOTRESET_FLUSH_ENABLE signal for
* boot and strongly ordered MSS clients to flush existing memory
* traffic and stall future requests.
*/
val
=
tegra_mc_read_32
(
MC_CLIENT_HOTRESET_CTRL0
);
assert
(
val
==
MC_CLIENT_HOTRESET_CTRL0_RESET_VAL
);
wdata_0
=
MC_CLIENT_HOTRESET_CTRL0_AFI_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL0_HDA_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL0_SATA_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL0_XUSB_HOST_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL0_XUSB_DEV_FLUSH_ENB
;
tegra_mc_write_32
(
MC_CLIENT_HOTRESET_CTRL0
,
wdata_0
);
/* Wait for HOTRESET STATUS to indicate FLUSH_DONE */
do
{
val
=
tegra_mc_read_32
(
MC_CLIENT_HOTRESET_STATUS0
);
}
while
((
val
&
wdata_0
)
!=
wdata_0
);
/* Wait one more time due to SW WAR for known legacy issue */
do
{
val
=
tegra_mc_read_32
(
MC_CLIENT_HOTRESET_STATUS0
);
}
while
((
val
&
wdata_0
)
!=
wdata_0
);
val
=
tegra_mc_read_32
(
MC_CLIENT_HOTRESET_CTRL1
);
assert
(
val
==
MC_CLIENT_HOTRESET_CTRL1_RESET_VAL
);
wdata_1
=
MC_CLIENT_HOTRESET_CTRL1_SDMMC4A_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL1_APE_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL1_SE_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL1_ETR_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL1_AXIS_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL1_EQOS_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL1_UFSHC_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL1_BPMP_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL1_AON_FLUSH_ENB
|
MC_CLIENT_HOTRESET_CTRL1_SCE_FLUSH_ENB
;
tegra_mc_write_32
(
MC_CLIENT_HOTRESET_CTRL1
,
wdata_1
);
/* Wait for HOTRESET STATUS to indicate FLUSH_DONE */
do
{
val
=
tegra_mc_read_32
(
MC_CLIENT_HOTRESET_STATUS1
);
}
while
((
val
&
wdata_1
)
!=
wdata_1
);
/* Wait one more time due to SW WAR for known legacy issue */
do
{
val
=
tegra_mc_read_32
(
MC_CLIENT_HOTRESET_STATUS1
);
}
while
((
val
&
wdata_1
)
!=
wdata_1
);
/*
* Change MEMTYPE_OVERRIDE from SO_DEV -> PASSTHRU for boot and
* strongly ordered MSS clients. ROC needs to be single point
* of control on overriding the memory type. So, remove TSA's
* memtype override.
*/
mc_set_tsa_passthrough
(
AFIW
);
mc_set_tsa_passthrough
(
HDAW
);
mc_set_tsa_passthrough
(
SATAW
);
mc_set_tsa_passthrough
(
XUSB_HOSTW
);
mc_set_tsa_passthrough
(
XUSB_DEVW
);
mc_set_tsa_passthrough
(
SDMMCWAB
);
mc_set_tsa_passthrough
(
APEDMAW
);
mc_set_tsa_passthrough
(
SESWR
);
mc_set_tsa_passthrough
(
ETRW
);
mc_set_tsa_passthrough
(
AXISW
);
mc_set_tsa_passthrough
(
EQOSW
);
mc_set_tsa_passthrough
(
UFSHCW
);
mc_set_tsa_passthrough
(
BPMPDMAW
);
mc_set_tsa_passthrough
(
AONDMAW
);
mc_set_tsa_passthrough
(
SCEDMAW
);
/*
* Change COH_PATH_OVERRIDE_SO_DEV from NO_OVERRIDE -> FORCE_COHERENT
* for boot and strongly ordered MSS clients. This steers all sodev
* transactions to ROC.
*
* Change AXID_OVERRIDE/AXID_OVERRIDE_SO_DEV only for some clients
* whose AXI IDs we know and trust.
*/
/* Match AFIW */
mc_set_forced_coherent_so_dev_cfg
(
AFIR
);
/*
* See bug 200131110 comment #35 - there are no normal requests
* and AWID for SO/DEV requests is hardcoded in RTL for a
* particular PCIE controller
*/
mc_set_forced_coherent_so_dev_cfg
(
AFIW
);
mc_set_forced_coherent_cfg
(
HDAR
);
mc_set_forced_coherent_cfg
(
HDAW
);
mc_set_forced_coherent_cfg
(
SATAR
);
mc_set_forced_coherent_cfg
(
SATAW
);
mc_set_forced_coherent_cfg
(
XUSB_HOSTR
);
mc_set_forced_coherent_cfg
(
XUSB_HOSTW
);
mc_set_forced_coherent_cfg
(
XUSB_DEVR
);
mc_set_forced_coherent_cfg
(
XUSB_DEVW
);
mc_set_forced_coherent_cfg
(
SDMMCRAB
);
mc_set_forced_coherent_cfg
(
SDMMCWAB
);
/* Match APEDMAW */
mc_set_forced_coherent_axid_so_dev_cfg
(
APEDMAR
);
/*
* See bug 200131110 comment #35 - AWID for normal requests
* is 0x80 and AWID for SO/DEV requests is 0x01
*/
mc_set_forced_coherent_axid_so_dev_cfg
(
APEDMAW
);
mc_set_forced_coherent_cfg
(
SESRD
);
mc_set_forced_coherent_cfg
(
SESWR
);
mc_set_forced_coherent_cfg
(
ETRR
);
mc_set_forced_coherent_cfg
(
ETRW
);
mc_set_forced_coherent_cfg
(
AXISR
);
mc_set_forced_coherent_cfg
(
AXISW
);
mc_set_forced_coherent_cfg
(
EQOSR
);
mc_set_forced_coherent_cfg
(
EQOSW
);
mc_set_forced_coherent_cfg
(
UFSHCR
);
mc_set_forced_coherent_cfg
(
UFSHCW
);
mc_set_forced_coherent_cfg
(
BPMPDMAR
);
mc_set_forced_coherent_cfg
(
BPMPDMAW
);
mc_set_forced_coherent_cfg
(
AONDMAR
);
mc_set_forced_coherent_cfg
(
AONDMAW
);
mc_set_forced_coherent_cfg
(
SCEDMAR
);
mc_set_forced_coherent_cfg
(
SCEDMAW
);
/*
* At this point, ordering can occur at ROC. So, remove PCFIFO's
* control over ordering requests.
*
* Change PCFIFO_*_ORDERED_CLIENT from ORDERED -> UNORDERED for
* boot and strongly ordered MSS clients
*/
val
=
MC_PCFIFO_CLIENT_CONFIG1_RESET_VAL
&
mc_set_pcfifo_unordered_boot_so_mss
(
1
,
AFIW
)
&
mc_set_pcfifo_unordered_boot_so_mss
(
1
,
HDAW
)
&
mc_set_pcfifo_unordered_boot_so_mss
(
1
,
SATAW
);
tegra_mc_write_32
(
MC_PCFIFO_CLIENT_CONFIG1
,
val
);
val
=
MC_PCFIFO_CLIENT_CONFIG2_RESET_VAL
&
mc_set_pcfifo_unordered_boot_so_mss
(
2
,
XUSB_HOSTW
)
&
mc_set_pcfifo_unordered_boot_so_mss
(
2
,
XUSB_DEVW
);
tegra_mc_write_32
(
MC_PCFIFO_CLIENT_CONFIG2
,
val
);
val
=
MC_PCFIFO_CLIENT_CONFIG3_RESET_VAL
&
mc_set_pcfifo_unordered_boot_so_mss
(
3
,
SDMMCWAB
);
tegra_mc_write_32
(
MC_PCFIFO_CLIENT_CONFIG3
,
val
);
val
=
MC_PCFIFO_CLIENT_CONFIG4_RESET_VAL
&
mc_set_pcfifo_unordered_boot_so_mss
(
4
,
SESWR
)
&
mc_set_pcfifo_unordered_boot_so_mss
(
4
,
ETRW
)
&
mc_set_pcfifo_unordered_boot_so_mss
(
4
,
AXISW
)
&
mc_set_pcfifo_unordered_boot_so_mss
(
4
,
EQOSW
)
&
mc_set_pcfifo_unordered_boot_so_mss
(
4
,
UFSHCW
)
&
mc_set_pcfifo_unordered_boot_so_mss
(
4
,
BPMPDMAW
)
&
mc_set_pcfifo_unordered_boot_so_mss
(
4
,
AONDMAW
)
&
mc_set_pcfifo_unordered_boot_so_mss
(
4
,
SCEDMAW
);
tegra_mc_write_32
(
MC_PCFIFO_CLIENT_CONFIG4
,
val
);
val
=
MC_PCFIFO_CLIENT_CONFIG5_RESET_VAL
&
mc_set_pcfifo_unordered_boot_so_mss
(
5
,
APEDMAW
);
tegra_mc_write_32
(
MC_PCFIFO_CLIENT_CONFIG5
,
val
);
/*
* At this point, ordering can occur at ROC. SMMU need not
* reorder any requests.
*
* Change SMMU_*_ORDERED_CLIENT from ORDERED -> UNORDERED
* for boot and strongly ordered MSS clients
*/
val
=
MC_SMMU_CLIENT_CONFIG1_RESET_VAL
&
mc_set_smmu_unordered_boot_so_mss
(
1
,
AFIW
)
&
mc_set_smmu_unordered_boot_so_mss
(
1
,
HDAW
)
&
mc_set_smmu_unordered_boot_so_mss
(
1
,
SATAW
);
tegra_mc_write_32
(
MC_SMMU_CLIENT_CONFIG1
,
val
);
val
=
MC_SMMU_CLIENT_CONFIG2_RESET_VAL
&
mc_set_smmu_unordered_boot_so_mss
(
2
,
XUSB_HOSTW
)
&
mc_set_smmu_unordered_boot_so_mss
(
2
,
XUSB_DEVW
);
tegra_mc_write_32
(
MC_SMMU_CLIENT_CONFIG2
,
val
);
val
=
MC_SMMU_CLIENT_CONFIG3_RESET_VAL
&
mc_set_smmu_unordered_boot_so_mss
(
3
,
SDMMCWAB
);
tegra_mc_write_32
(
MC_SMMU_CLIENT_CONFIG3
,
val
);
val
=
MC_SMMU_CLIENT_CONFIG4_RESET_VAL
&
mc_set_smmu_unordered_boot_so_mss
(
4
,
SESWR
)
&
mc_set_smmu_unordered_boot_so_mss
(
4
,
ETRW
)
&
mc_set_smmu_unordered_boot_so_mss
(
4
,
AXISW
)
&
mc_set_smmu_unordered_boot_so_mss
(
4
,
EQOSW
)
&
mc_set_smmu_unordered_boot_so_mss
(
4
,
UFSHCW
)
&
mc_set_smmu_unordered_boot_so_mss
(
4
,
BPMPDMAW
)
&
mc_set_smmu_unordered_boot_so_mss
(
4
,
AONDMAW
)
&
mc_set_smmu_unordered_boot_so_mss
(
4
,
SCEDMAW
);
tegra_mc_write_32
(
MC_SMMU_CLIENT_CONFIG4
,
val
);
val
=
MC_SMMU_CLIENT_CONFIG5_RESET_VAL
&
mc_set_smmu_unordered_boot_so_mss
(
5
,
APEDMAW
);
tegra_mc_write_32
(
MC_SMMU_CLIENT_CONFIG5
,
val
);
/*
* Deassert HOTRESET FLUSH_ENABLE for boot and strongly ordered MSS
* clients to allow memory traffic from all clients to start passing
* through ROC
*/
val
=
tegra_mc_read_32
(
MC_CLIENT_HOTRESET_CTRL0
);
assert
(
val
==
wdata_0
);
wdata_0
=
MC_CLIENT_HOTRESET_CTRL0_RESET_VAL
;
tegra_mc_write_32
(
MC_CLIENT_HOTRESET_CTRL0
,
wdata_0
);
/* Wait for HOTRESET STATUS to indicate FLUSH_DONE */
do
{
val
=
tegra_mc_read_32
(
MC_CLIENT_HOTRESET_STATUS0
);
}
while
((
val
&
wdata_0
)
!=
wdata_0
);
/* Wait one more time due to SW WAR for known legacy issue */
do
{
val
=
tegra_mc_read_32
(
MC_CLIENT_HOTRESET_STATUS0
);
}
while
((
val
&
wdata_0
)
!=
wdata_0
);
val
=
tegra_mc_read_32
(
MC_CLIENT_HOTRESET_CTRL1
);
assert
(
val
==
wdata_1
);
wdata_1
=
MC_CLIENT_HOTRESET_CTRL1_RESET_VAL
;
tegra_mc_write_32
(
MC_CLIENT_HOTRESET_CTRL1
,
wdata_1
);
/* Wait for HOTRESET STATUS to indicate FLUSH_DONE */
do
{
val
=
tegra_mc_read_32
(
MC_CLIENT_HOTRESET_STATUS1
);
}
while
((
val
&
wdata_1
)
!=
wdata_1
);
/* Wait one more time due to SW WAR for known legacy issue */
do
{
val
=
tegra_mc_read_32
(
MC_CLIENT_HOTRESET_STATUS1
);
}
while
((
val
&
wdata_1
)
!=
wdata_1
);
#endif
}
/*
* Init Memory controller during boot.
*/
...
...
@@ -243,7 +495,7 @@ void tegra_memctrl_setup(void)
uint32_t
num_overrides
=
sizeof
(
streamid_overrides
)
/
sizeof
(
uint32_t
);
uint32_t
num_sec_cfgs
=
sizeof
(
sec_cfgs
)
/
sizeof
(
mc_streamid_security_cfg_t
);
uint32_t
num_txn_overrides
=
sizeof
(
mc_override_cfgs
)
/
sizeof
(
mc_txn_override_cfg_t
);
uint32_t
tegra_rev
;
uint32_t
chip_minor
,
chip_major
;
int
i
;
INFO
(
"Tegra Memory Controller (v2)
\n
"
);
...
...
@@ -280,13 +532,23 @@ void tegra_memctrl_setup(void)
tegra_mc_write_32
(
MC_SMMU_BYPASS_CONFIG
,
MC_SMMU_BYPASS_CONFIG_SETTINGS
);
/*
* Re-configure MSS to allow ROC to deal with ordering of the
* Memory Controller traffic. This is needed as the Memory Controller
* boots with MSS having all control, but ROC provides a performance
* boost as compared to MSS.
*/
tegra_memctrl_reconfig_mss_clients
();
/*
* Set the MC_TXN_OVERRIDE registers for write clients.
*/
tegra_rev
=
(
mmio_read_32
(
TEGRA_MISC_BASE
+
HARDWARE_REVISION_OFFSET
)
&
HARDWARE_MINOR_REVISION_MASK
)
>>
HARDWARE_MINOR_REVISION_SHIFT
;
chip_major
=
(
mmio_read_32
(
TEGRA_MISC_BASE
+
HARDWARE_REVISION_OFFSET
)
>>
MAJOR_VERSION_SHIFT
)
&
MAJOR_VERSION_MASK
;
chip_minor
=
(
mmio_read_32
(
TEGRA_MISC_BASE
+
HARDWARE_REVISION_OFFSET
)
>>
MINOR_VERSION_SHIFT
)
&
MINOR_VERSION_MASK
;
if
(
tegra_rev
==
HARDWARE_REVISION_A01
)
{
if
(
(
chip_major
==
0
)
||
(
chip_major
>
0
&&
chip_minor
==
1
)
)
{
/* GPU and NVENC settings for rev. A01 */
val
=
tegra_mc_read_32
(
MC_TXN_OVERRIDE_CONFIG_GPUSWR
);
...
...
@@ -322,13 +584,21 @@ void tegra_memctrl_setup(void)
*/
void
tegra_memctrl_restore_settings
(
void
)
{
/*
* Re-configure MSS to allow ROC to deal with ordering of the
* Memory Controller traffic. This is needed as the Memory Controller
* resets during System Suspend with MSS having all control, but ROC
* provides a performance boost as compared to MSS.
*/
tegra_memctrl_reconfig_mss_clients
();
/* video memory carveout region */
if
(
video_mem_base
)
{
tegra_mc_write_32
(
MC_VIDEO_PROTECT_BASE_LO
,
(
uint32_t
)
video_mem_base
);
tegra_mc_write_32
(
MC_VIDEO_PROTECT_BASE_HI
,
(
uint32_t
)(
video_mem_base
>>
32
));
tegra_mc_write_32
(
MC_VIDEO_PROTECT_SIZE_MB
,
video_mem_size
);
tegra_mc_write_32
(
MC_VIDEO_PROTECT_SIZE_MB
,
video_mem_size
_mb
);
/*
* MCE propogates the VideoMem configuration values across the
...
...
@@ -436,11 +706,11 @@ void tegra_memctrl_videomem_setup(uint64_t phys_base, uint32_t size_in_bytes)
tegra_mc_write_32
(
MC_VIDEO_PROTECT_BASE_LO
,
(
uint32_t
)
phys_base
);
tegra_mc_write_32
(
MC_VIDEO_PROTECT_BASE_HI
,
(
uint32_t
)(
phys_base
>>
32
));
tegra_mc_write_32
(
MC_VIDEO_PROTECT_SIZE_MB
,
size_in_bytes
);
tegra_mc_write_32
(
MC_VIDEO_PROTECT_SIZE_MB
,
size_in_bytes
>>
20
);
/* store new values */
video_mem_base
=
phys_base
;
video_mem_size
=
size_in_bytes
>>
20
;
video_mem_size
_mb
=
size_in_bytes
>>
20
;
/*
* MCE propogates the VideoMem configuration values across the
...
...
plat/nvidia/tegra/include/drivers/memctrl_v2.h
View file @
ddc1c56f
...
...
@@ -31,7 +31,6 @@
#ifndef __MEMCTRLV2_H__
#define __MEMCTRLV2_H__
#include <mmio.h>
#include <tegra_def.h>
/*******************************************************************************
...
...
@@ -283,6 +282,10 @@
#define MC_TXN_OVERRIDE_CONFIG_AFIW 0x1188
#define MC_TXN_OVERRIDE_CONFIG_SCEW 0x14e0
#define MC_TXN_OVERRIDE_CONFIG_AXID_OVERRIDE_CGID (1 << 0)
#define MC_TXN_OVERRIDE_CONFIG_COH_PATH_OVERRIDE_SO_DEV (2 << 4)
#define MC_TXN_OVERRIDE_CONFIG_AXID_OVERRIDE_SO_DEV_CGID_SO_DEV_CLIENT (1 << 12)
/*******************************************************************************
* Non-SO_DEV transactions override values for CGID_TAG bitfield for the
* MC_TXN_OVERRIDE_CONFIG_{module} registers
...
...
@@ -293,6 +296,10 @@
#define MC_TXN_OVERRIDE_CGID_TAG_ADR 3
#define MC_TXN_OVERRIDE_CGID_TAG_MASK 3
#ifndef __ASSEMBLY__
#include <sys/types.h>
/*******************************************************************************
* Structure to hold the transaction override settings to use to override
* client inputs
...
...
@@ -343,6 +350,8 @@ typedef struct mc_streamid_security_cfg {
.override_enable = OVERRIDE_ ## access \
}
#endif
/* __ASSMEBLY__ */
/*******************************************************************************
* TZDRAM carveout configuration registers
******************************************************************************/
...
...
@@ -368,6 +377,183 @@ typedef struct mc_streamid_security_cfg {
#define MC_TZRAM_REG_CTRL 0x185c
#define DISABLE_TZRAM_ACCESS 1
/*******************************************************************************
* Memory Controller Reset Control registers
******************************************************************************/
#define MC_CLIENT_HOTRESET_CTRL0 0x200
#define MC_CLIENT_HOTRESET_CTRL0_RESET_VAL 0
#define MC_CLIENT_HOTRESET_CTRL0_AFI_FLUSH_ENB (1 << 0)
#define MC_CLIENT_HOTRESET_CTRL0_HC_FLUSH_ENB (1 << 6)
#define MC_CLIENT_HOTRESET_CTRL0_HDA_FLUSH_ENB (1 << 7)
#define MC_CLIENT_HOTRESET_CTRL0_ISP2_FLUSH_ENB (1 << 8)
#define MC_CLIENT_HOTRESET_CTRL0_MPCORE_FLUSH_ENB (1 << 9)
#define MC_CLIENT_HOTRESET_CTRL0_NVENC_FLUSH_ENB (1 << 11)
#define MC_CLIENT_HOTRESET_CTRL0_SATA_FLUSH_ENB (1 << 15)
#define MC_CLIENT_HOTRESET_CTRL0_VI_FLUSH_ENB (1 << 17)
#define MC_CLIENT_HOTRESET_CTRL0_VIC_FLUSH_ENB (1 << 18)
#define MC_CLIENT_HOTRESET_CTRL0_XUSB_HOST_FLUSH_ENB (1 << 19)
#define MC_CLIENT_HOTRESET_CTRL0_XUSB_DEV_FLUSH_ENB (1 << 20)
#define MC_CLIENT_HOTRESET_CTRL0_TSEC_FLUSH_ENB (1 << 22)
#define MC_CLIENT_HOTRESET_CTRL0_SDMMC1A_FLUSH_ENB (1 << 29)
#define MC_CLIENT_HOTRESET_CTRL0_SDMMC2A_FLUSH_ENB (1 << 30)
#define MC_CLIENT_HOTRESET_CTRL0_SDMMC3A_FLUSH_ENB (1 << 31)
#define MC_CLIENT_HOTRESET_STATUS0 0x204
#define MC_CLIENT_HOTRESET_CTRL1 0x970
#define MC_CLIENT_HOTRESET_CTRL1_RESET_VAL 0
#define MC_CLIENT_HOTRESET_CTRL1_SDMMC4A_FLUSH_ENB (1 << 0)
#define MC_CLIENT_HOTRESET_CTRL1_GPU_FLUSH_ENB (1 << 2)
#define MC_CLIENT_HOTRESET_CTRL1_NVDEC_FLUSH_ENB (1 << 5)
#define MC_CLIENT_HOTRESET_CTRL1_APE_FLUSH_ENB (1 << 6)
#define MC_CLIENT_HOTRESET_CTRL1_SE_FLUSH_ENB (1 << 7)
#define MC_CLIENT_HOTRESET_CTRL1_NVJPG_FLUSH_ENB (1 << 8)
#define MC_CLIENT_HOTRESET_CTRL1_ETR_FLUSH_ENB (1 << 12)
#define MC_CLIENT_HOTRESET_CTRL1_TSECB_FLUSH_ENB (1 << 13)
#define MC_CLIENT_HOTRESET_CTRL1_AXIS_FLUSH_ENB (1 << 18)
#define MC_CLIENT_HOTRESET_CTRL1_EQOS_FLUSH_ENB (1 << 19)
#define MC_CLIENT_HOTRESET_CTRL1_UFSHC_FLUSH_ENB (1 << 20)
#define MC_CLIENT_HOTRESET_CTRL1_NVDISPLAY_FLUSH_ENB (1 << 21)
#define MC_CLIENT_HOTRESET_CTRL1_BPMP_FLUSH_ENB (1 << 22)
#define MC_CLIENT_HOTRESET_CTRL1_AON_FLUSH_ENB (1 << 23)
#define MC_CLIENT_HOTRESET_CTRL1_SCE_FLUSH_ENB (1 << 24)
#define MC_CLIENT_HOTRESET_STATUS1 0x974
/*******************************************************************************
* TSA configuration registers
******************************************************************************/
#define TSA_CONFIG_STATIC0_CSW_SESWR 0x4010
#define TSA_CONFIG_STATIC0_CSW_SESWR_RESET 0x1100
#define TSA_CONFIG_STATIC0_CSW_ETRW 0x4038
#define TSA_CONFIG_STATIC0_CSW_ETRW_RESET 0x1100
#define TSA_CONFIG_STATIC0_CSW_SDMMCWAB 0x5010
#define TSA_CONFIG_STATIC0_CSW_SDMMCWAB_RESET 0x1100
#define TSA_CONFIG_STATIC0_CSW_AXISW 0x7008
#define TSA_CONFIG_STATIC0_CSW_AXISW_RESET 0x1100
#define TSA_CONFIG_STATIC0_CSW_HDAW 0xA008
#define TSA_CONFIG_STATIC0_CSW_HDAW_RESET 0x100
#define TSA_CONFIG_STATIC0_CSW_AONDMAW 0xB018
#define TSA_CONFIG_STATIC0_CSW_AONDMAW_RESET 0x1100
#define TSA_CONFIG_STATIC0_CSW_SCEDMAW 0xD018
#define TSA_CONFIG_STATIC0_CSW_SCEDMAW_RESET 0x1100
#define TSA_CONFIG_STATIC0_CSW_BPMPDMAW 0xD028
#define TSA_CONFIG_STATIC0_CSW_BPMPDMAW_RESET 0x1100
#define TSA_CONFIG_STATIC0_CSW_APEDMAW 0x12018
#define TSA_CONFIG_STATIC0_CSW_APEDMAW_RESET 0x1100
#define TSA_CONFIG_STATIC0_CSW_UFSHCW 0x13008
#define TSA_CONFIG_STATIC0_CSW_UFSHCW_RESET 0x1100
#define TSA_CONFIG_STATIC0_CSW_AFIW 0x13018
#define TSA_CONFIG_STATIC0_CSW_AFIW_RESET 0x1100
#define TSA_CONFIG_STATIC0_CSW_SATAW 0x13028
#define TSA_CONFIG_STATIC0_CSW_SATAW_RESET 0x1100
#define TSA_CONFIG_STATIC0_CSW_EQOSW 0x13038
#define TSA_CONFIG_STATIC0_CSW_EQOSW_RESET 0x1100
#define TSA_CONFIG_STATIC0_CSW_XUSB_DEVW 0x15008
#define TSA_CONFIG_STATIC0_CSW_XUSB_DEVW_RESET 0x1100
#define TSA_CONFIG_STATIC0_CSW_XUSB_HOSTW 0x15018
#define TSA_CONFIG_STATIC0_CSW_XUSB_HOSTW_RESET 0x1100
#define TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_MASK (0x3 << 11)
#define TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_PASTHRU (0 << 11)
/*******************************************************************************
* Memory Controller's PCFIFO client configuration registers
******************************************************************************/
#define MC_PCFIFO_CLIENT_CONFIG1 0xdd4
#define MC_PCFIFO_CLIENT_CONFIG1_RESET_VAL 0x20000
#define MC_PCFIFO_CLIENT_CONFIG1_PCFIFO_AFIW_UNORDERED (0 << 17)
#define MC_PCFIFO_CLIENT_CONFIG1_PCFIFO_AFIW_MASK (1 << 17)
#define MC_PCFIFO_CLIENT_CONFIG1_PCFIFO_HDAW_UNORDERED (0 << 21)
#define MC_PCFIFO_CLIENT_CONFIG1_PCFIFO_HDAW_MASK (1 << 21)
#define MC_PCFIFO_CLIENT_CONFIG1_PCFIFO_SATAW_UNORDERED (0 << 29)
#define MC_PCFIFO_CLIENT_CONFIG1_PCFIFO_SATAW_MASK (1 << 29)
#define MC_PCFIFO_CLIENT_CONFIG2 0xdd8
#define MC_PCFIFO_CLIENT_CONFIG2_RESET_VAL 0x20000
#define MC_PCFIFO_CLIENT_CONFIG2_PCFIFO_XUSB_HOSTW_UNORDERED (0 << 11)
#define MC_PCFIFO_CLIENT_CONFIG2_PCFIFO_XUSB_HOSTW_MASK (1 << 11)
#define MC_PCFIFO_CLIENT_CONFIG2_PCFIFO_XUSB_DEVW_UNORDERED (0 << 13)
#define MC_PCFIFO_CLIENT_CONFIG2_PCFIFO_XUSB_DEVW_MASK (1 << 13)
#define MC_PCFIFO_CLIENT_CONFIG3 0xddc
#define MC_PCFIFO_CLIENT_CONFIG3_RESET_VAL 0
#define MC_PCFIFO_CLIENT_CONFIG3_PCFIFO_SDMMCWAB_UNORDERED (0 << 7)
#define MC_PCFIFO_CLIENT_CONFIG3_PCFIFO_SDMMCWAB_MASK (1 << 7)
#define MC_PCFIFO_CLIENT_CONFIG4 0xde0
#define MC_PCFIFO_CLIENT_CONFIG4_RESET_VAL 0
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_SESWR_UNORDERED (0 << 1)
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_SESWR_MASK (1 << 1)
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_ETRW_UNORDERED (0 << 5)
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_ETRW_MASK (1 << 5)
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_AXISW_UNORDERED (0 << 13)
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_AXISW_MASK (1 << 13)
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_EQOSW_UNORDERED (0 << 15)
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_EQOSW_MASK (1 << 15)
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_UFSHCW_UNORDERED (0 << 17)
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_UFSHCW_MASK (1 << 17)
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_BPMPDMAW_UNORDERED (0 << 22)
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_BPMPDMAW_MASK (1 << 22)
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_AONDMAW_UNORDERED (0 << 26)
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_AONDMAW_MASK (1 << 26)
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_SCEDMAW_UNORDERED (0 << 30)
#define MC_PCFIFO_CLIENT_CONFIG4_PCFIFO_SCEDMAW_MASK (1 << 30)
#define MC_PCFIFO_CLIENT_CONFIG5 0xbf4
#define MC_PCFIFO_CLIENT_CONFIG5_RESET_VAL 0
#define MC_PCFIFO_CLIENT_CONFIG5_PCFIFO_APEDMAW_UNORDERED (0 << 0)
#define MC_PCFIFO_CLIENT_CONFIG5_PCFIFO_APEDMAW_MASK (1 << 0)
/*******************************************************************************
* Memory Controller's SMMU client configuration registers
******************************************************************************/
#define MC_SMMU_CLIENT_CONFIG1 0x44
#define MC_SMMU_CLIENT_CONFIG1_RESET_VAL 0x20000
#define MC_SMMU_CLIENT_CONFIG1_AFIW_UNORDERED (0 << 17)
#define MC_SMMU_CLIENT_CONFIG1_AFIW_MASK (1 << 17)
#define MC_SMMU_CLIENT_CONFIG1_HDAW_UNORDERED (0 << 21)
#define MC_SMMU_CLIENT_CONFIG1_HDAW_MASK (1 << 21)
#define MC_SMMU_CLIENT_CONFIG1_SATAW_UNORDERED (0 << 29)
#define MC_SMMU_CLIENT_CONFIG1_SATAW_MASK (1 << 29)
#define MC_SMMU_CLIENT_CONFIG2 0x48
#define MC_SMMU_CLIENT_CONFIG2_RESET_VAL 0x20000
#define MC_SMMU_CLIENT_CONFIG2_XUSB_HOSTW_UNORDERED (0 << 11)
#define MC_SMMU_CLIENT_CONFIG2_XUSB_HOSTW_MASK (1 << 11)
#define MC_SMMU_CLIENT_CONFIG2_XUSB_DEVW_UNORDERED (0 << 13)
#define MC_SMMU_CLIENT_CONFIG2_XUSB_DEVW_MASK (1 << 13)
#define MC_SMMU_CLIENT_CONFIG3 0x4c
#define MC_SMMU_CLIENT_CONFIG3_RESET_VAL 0
#define MC_SMMU_CLIENT_CONFIG3_SDMMCWAB_UNORDERED (0 << 7)
#define MC_SMMU_CLIENT_CONFIG3_SDMMCWAB_MASK (1 << 7)
#define MC_SMMU_CLIENT_CONFIG4 0xb9c
#define MC_SMMU_CLIENT_CONFIG4_RESET_VAL 0
#define MC_SMMU_CLIENT_CONFIG4_SESWR_UNORDERED (0 << 1)
#define MC_SMMU_CLIENT_CONFIG4_SESWR_MASK (1 << 1)
#define MC_SMMU_CLIENT_CONFIG4_ETRW_UNORDERED (0 << 5)
#define MC_SMMU_CLIENT_CONFIG4_ETRW_MASK (1 << 5)
#define MC_SMMU_CLIENT_CONFIG4_AXISW_UNORDERED (0 << 13)
#define MC_SMMU_CLIENT_CONFIG4_AXISW_MASK (1 << 13)
#define MC_SMMU_CLIENT_CONFIG4_EQOSW_UNORDERED (0 << 15)
#define MC_SMMU_CLIENT_CONFIG4_EQOSW_MASK (1 << 15)
#define MC_SMMU_CLIENT_CONFIG4_UFSHCW_UNORDERED (0 << 17)
#define MC_SMMU_CLIENT_CONFIG4_UFSHCW_MASK (1 << 17)
#define MC_SMMU_CLIENT_CONFIG4_BPMPDMAW_UNORDERED (0 << 22)
#define MC_SMMU_CLIENT_CONFIG4_BPMPDMAW_MASK (1 << 22)
#define MC_SMMU_CLIENT_CONFIG4_AONDMAW_UNORDERED (0 << 26)
#define MC_SMMU_CLIENT_CONFIG4_AONDMAW_MASK (1 << 26)
#define MC_SMMU_CLIENT_CONFIG4_SCEDMAW_UNORDERED (0 << 30)
#define MC_SMMU_CLIENT_CONFIG4_SCEDMAW_MASK (1 << 30)
#define MC_SMMU_CLIENT_CONFIG5 0xbac
#define MC_SMMU_CLIENT_CONFIG5_RESET_VAL 0
#define MC_SMMU_CLIENT_CONFIG5_APEDMAW_UNORDERED (0 << 0)
#define MC_SMMU_CLIENT_CONFIG5_APEDMAW_MASK (1 << 0)
#ifndef __ASSEMBLY__
#include <mmio.h>
static
inline
uint32_t
tegra_mc_read_32
(
uint32_t
off
)
{
return
mmio_read_32
(
TEGRA_MC_BASE
+
off
);
...
...
@@ -388,4 +574,42 @@ static inline void tegra_mc_streamid_write_32(uint32_t off, uint32_t val)
mmio_write_32
(
TEGRA_MC_STREAMID_BASE
+
off
,
val
);
}
#define mc_set_pcfifo_unordered_boot_so_mss(id, client) \
(~MC_PCFIFO_CLIENT_CONFIG##id##_PCFIFO_##client##_MASK | \
MC_PCFIFO_CLIENT_CONFIG##id##_PCFIFO_##client##_UNORDERED)
#define mc_set_smmu_unordered_boot_so_mss(id, client) \
(~MC_PCFIFO_CLIENT_CONFIG##id##_PCFIFO_##client##_MASK | \
MC_PCFIFO_CLIENT_CONFIG##id##_PCFIFO_##client##_UNORDERED)
#define mc_set_tsa_passthrough(client) \
{ \
mmio_write_32(TEGRA_TSA_BASE + TSA_CONFIG_STATIC0_CSW_##client, \
(TSA_CONFIG_STATIC0_CSW_##client##_RESET & \
~TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_MASK) | \
TSA_CONFIG_CSW_MEMTYPE_OVERRIDE_PASTHRU); \
}
#define mc_set_forced_coherent_cfg(client) \
{ \
tegra_mc_write_32(MC_TXN_OVERRIDE_CONFIG_##client, \
MC_TXN_OVERRIDE_CONFIG_COH_PATH_OVERRIDE_SO_DEV); \
}
#define mc_set_forced_coherent_so_dev_cfg(client) \
{ \
tegra_mc_write_32(MC_TXN_OVERRIDE_CONFIG_##client, \
MC_TXN_OVERRIDE_CONFIG_COH_PATH_OVERRIDE_SO_DEV | \
MC_TXN_OVERRIDE_CONFIG_AXID_OVERRIDE_SO_DEV_CGID_SO_DEV_CLIENT); \
}
#define mc_set_forced_coherent_axid_so_dev_cfg(client) \
{ \
tegra_mc_write_32(MC_TXN_OVERRIDE_CONFIG_##client, \
MC_TXN_OVERRIDE_CONFIG_COH_PATH_OVERRIDE_SO_DEV | \
MC_TXN_OVERRIDE_CONFIG_AXID_OVERRIDE_CGID | \
MC_TXN_OVERRIDE_CONFIG_AXID_OVERRIDE_SO_DEV_CGID_SO_DEV_CLIENT); \
}
#endif
/* __ASSMEBLY__ */
#endif
/* __MEMCTRLV2_H__ */
plat/nvidia/tegra/include/drivers/smmu.h
View file @
ddc1c56f
...
...
@@ -627,6 +627,6 @@ static inline void tegra_smmu_write_32(uint32_t off, uint32_t val)
}
void
tegra_smmu_init
(
void
);
void
tegra_smmu_save_context
(
void
);
void
tegra_smmu_save_context
(
uint64_t
smmu_ctx_addr
);
#endif
/*__SMMU_H */
plat/nvidia/tegra/include/t186/tegra_def.h
View file @
ddc1c56f
...
...
@@ -31,8 +31,6 @@
#ifndef __TEGRA_DEF_H__
#define __TEGRA_DEF_H__
#include <platform_def.h>
/*******************************************************************************
* These values are used by the PSCI implementation during the `CPU_SUSPEND`
* and `SYSTEM_SUSPEND` calls as the `state-id` field in the 'power state'
...
...
@@ -78,11 +76,18 @@
******************************************************************************/
#define TEGRA_MISC_BASE 0x00100000
#define HARDWARE_REVISION_OFFSET 0x4
#define HARDWARE_MINOR_REVISION_MASK 0xf0000
#define HARDWARE_MINOR_REVISION_SHIFT 0x10
#define HARDWARE_REVISION_A01 1
#define MAJOR_VERSION_SHIFT 0x4
#define MAJOR_VERSION_MASK 0xF
#define MINOR_VERSION_SHIFT 0x10
#define MINOR_VERSION_MASK 0xF
#define MISCREG_PFCFG 0x200C
/*******************************************************************************
* Tegra TSA Controller constants
******************************************************************************/
#define TEGRA_TSA_BASE 0x02400000
/*******************************************************************************
* Tegra Memory Controller constants
******************************************************************************/
...
...
plat/nvidia/tegra/include/tegra_private.h
View file @
ddc1c56f
...
...
@@ -119,4 +119,7 @@ void plat_early_platform_setup(void);
/* Declarations for tegra_delay_timer.c */
void
tegra_delay_timer_init
(
void
);
void
tegra_secure_entrypoint
(
void
);
void
tegra186_cpu_reset_handler
(
void
);
#endif
/* __TEGRA_PRIVATE_H__ */
plat/nvidia/tegra/soc/t186/drivers/include/mce.h
View file @
ddc1c56f
...
...
@@ -94,6 +94,7 @@ typedef enum mce_cmd {
MCE_CMD_ENUM_WRITE_MCA
,
MCE_CMD_ROC_FLUSH_CACHE
,
MCE_CMD_ROC_CLEAN_CACHE
,
MCE_CMD_ENABLE_LATIC
,
MCE_CMD_IS_CCX_ALLOWED
=
0xFE
,
MCE_CMD_MAX
=
0xFF
,
}
mce_cmd_t
;
...
...
@@ -321,6 +322,7 @@ int mce_update_gsc_videomem(void);
int
mce_update_gsc_tzdram
(
void
);
int
mce_update_gsc_tzram
(
void
);
__dead2
void
mce_enter_ccplex_state
(
uint32_t
state_idx
);
void
mce_verify_firmware_version
(
void
);
/* declarations for ARI/NVG handler functions */
int
ari_enter_cstate
(
uint32_t
ari_base
,
uint32_t
state
,
uint32_t
wake_time
);
...
...
plat/nvidia/tegra/soc/t186/drivers/mce/mce.c
View file @
ddc1c56f
...
...
@@ -356,6 +356,24 @@ int mce_command_handler(mce_cmd_t cmd, uint64_t arg0, uint64_t arg1,
break
;
#if ENABLE_CHIP_VERIFICATION_HARNESS
case
MCE_CMD_ENABLE_LATIC
:
/*
* This call is not for production use. The constant value,
* 0xFFFF0000, is specific to allowing for enabling LATIC on
* pre-production parts for the chip verification harness.
*
* Enabling LATIC allows S/W to read the MINI ISPs in the
* CCPLEX. The ISMs are used for various measurements relevant
* to particular locations in the Silicon. They are small
* counters which can be polled to determine how fast a
* particular location in the Silicon is.
*/
ops
->
enter_ccplex_state
(
mce_get_curr_cpu_ari_base
(),
0xFFFF0000
);
break
;
#endif
default:
ERROR
(
"unknown MCE command (%d)
\n
"
,
cmd
);
return
EINVAL
;
...
...
@@ -429,3 +447,57 @@ __dead2 void mce_enter_ccplex_state(uint32_t state_idx)
panic
();
}
/*******************************************************************************
* Handler to read the MCE firmware version and check if it is compatible
* with interface header the BL3-1 was compiled against
******************************************************************************/
void
mce_verify_firmware_version
(
void
)
{
arch_mce_ops_t
*
ops
;
uint32_t
cpu_ari_base
;
uint64_t
version
;
uint32_t
major
,
minor
,
chip_minor
,
chip_major
;
/* get a pointer to the CPU's arch_mce_ops_t struct */
ops
=
mce_get_curr_cpu_ops
();
/* get the CPU's ARI base address */
cpu_ari_base
=
mce_get_curr_cpu_ari_base
();
/*
* Read the MCE firmware version and extract the major and minor
* version fields
*/
version
=
ops
->
call_enum_misc
(
cpu_ari_base
,
TEGRA_ARI_MISC_VERSION
,
0
);
major
=
(
uint32_t
)
version
;
minor
=
(
uint32_t
)(
version
>>
32
);
INFO
(
"MCE Version - HW=%d:%d, SW=%d:%d
\n
"
,
major
,
minor
,
TEGRA_ARI_VERSION_MAJOR
,
TEGRA_ARI_VERSION_MINOR
);
/*
* MCE firmware is not running on simulation platforms. Simulation
* platforms are identified by v0.3 from the Tegra Chip ID value.
*/
chip_major
=
(
mmio_read_32
(
TEGRA_MISC_BASE
+
HARDWARE_REVISION_OFFSET
)
>>
MAJOR_VERSION_SHIFT
)
&
MAJOR_VERSION_MASK
;
chip_minor
=
(
mmio_read_32
(
TEGRA_MISC_BASE
+
HARDWARE_REVISION_OFFSET
)
>>
MINOR_VERSION_SHIFT
)
&
MINOR_VERSION_MASK
;
if
((
chip_major
==
0
)
&&
(
chip_minor
==
3
))
return
;
/*
* Verify that the MCE firmware version and the interface header
* match
*/
if
(
major
!=
TEGRA_ARI_VERSION_MAJOR
)
{
ERROR
(
"ARI major version mismatch
\n
"
);
panic
();
}
if
(
minor
<
TEGRA_ARI_VERSION_MINOR
)
{
ERROR
(
"ARI minor version mismatch
\n
"
);
panic
();
}
}
plat/nvidia/tegra/soc/t186/drivers/smmu/smmu.c
View file @
ddc1c56f
...
...
@@ -29,9 +29,13 @@
*/
#include <assert.h>
#include <bl_common.h>
#include <debug.h>
#include <memctrl_v2.h>
#include <platform_def.h>
#include <smmu.h>
#include <string.h>
#include <tegra_private.h>
typedef
struct
smmu_regs
{
uint32_t
reg
;
...
...
@@ -133,7 +137,7 @@ typedef struct smmu_regs {
.val = 0xFFFFFFFF, \
}
static
smmu_regs_t
smmu_ctx_regs
[]
=
{
static
__attribute__
((
aligned
(
16
)))
smmu_regs_t
smmu_ctx_regs
[]
=
{
_START_OF_TABLE_
,
mc_make_sid_security_cfg
(
SCEW
),
mc_make_sid_security_cfg
(
AFIR
),
...
...
@@ -421,12 +425,15 @@ static smmu_regs_t smmu_ctx_regs[] = {
};
/*
* Save SMMU settings before "System Suspend"
* Save SMMU settings before "System Suspend"
to TZDRAM
*/
void
tegra_smmu_save_context
(
void
)
void
tegra_smmu_save_context
(
uint64_t
smmu_ctx_addr
)
{
uint32_t
i
;
#if DEBUG
plat_params_from_bl2_t
*
params_from_bl2
=
bl31_get_plat_params
();
uint64_t
tzdram_base
=
params_from_bl2
->
tzdram_base
;
uint64_t
tzdram_end
=
tzdram_base
+
params_from_bl2
->
tzdram_size
;
uint32_t
reg_id1
,
pgshift
,
cb_size
;
/* sanity check SMMU settings c*/
...
...
@@ -438,6 +445,8 @@ void tegra_smmu_save_context(void)
assert
(
!
((
pgshift
!=
PGSHIFT
)
||
(
cb_size
!=
CB_SIZE
)));
#endif
assert
((
smmu_ctx_addr
>=
tzdram_base
)
&&
(
smmu_ctx_addr
<=
tzdram_end
));
/* index of _END_OF_TABLE_ */
smmu_ctx_regs
[
0
].
val
=
ARRAY_SIZE
(
smmu_ctx_regs
)
-
1
;
...
...
@@ -445,11 +454,15 @@ void tegra_smmu_save_context(void)
for
(
i
=
1
;
i
<
ARRAY_SIZE
(
smmu_ctx_regs
)
-
1
;
i
++
)
smmu_ctx_regs
[
i
].
val
=
mmio_read_32
(
smmu_ctx_regs
[
i
].
reg
);
/* Save SMMU config settings */
memcpy16
((
void
*
)(
uintptr_t
)
smmu_ctx_addr
,
(
void
*
)
smmu_ctx_regs
,
sizeof
(
smmu_ctx_regs
));
/* save the SMMU table address */
mmio_write_32
(
TEGRA_SCRATCH_BASE
+
SECURE_SCRATCH_RSV11_LO
,
(
uint32_t
)
(
unsigned
long
)
smmu_ctx_
regs
);
(
uint32_t
)
smmu_ctx_
addr
);
mmio_write_32
(
TEGRA_SCRATCH_BASE
+
SECURE_SCRATCH_RSV11_HI
,
(
uint32_t
)(
((
unsigned
long
)
smmu_ctx_
regs
)
>>
32
));
(
uint32_t
)(
smmu_ctx_
addr
>>
32
));
}
/*
...
...
plat/nvidia/tegra/soc/t186/plat_psci_handlers.c
View file @
ddc1c56f
...
...
@@ -39,16 +39,25 @@
#include <mce.h>
#include <psci.h>
#include <smmu.h>
#include <string.h>
#include <t18x_ari.h>
#include <tegra_private.h>
extern
void
prepare_cpu_pwr_dwn
(
void
);
extern
void
tegra186_cpu_reset_handler
(
void
);
extern
uint32_t
__tegra186_cpu_reset_handler_data
,
__tegra186_cpu_reset_handler_end
;
/* TZDRAM offset for saving SMMU context */
#define TEGRA186_SMMU_CTX_OFFSET 16
/* state id mask */
#define TEGRA186_STATE_ID_MASK 0xF
/* constants to get power state's wake time */
#define TEGRA186_WAKE_TIME_MASK 0xFFFFFF
#define TEGRA186_WAKE_TIME_SHIFT 4
/* default core wake mask for CPU_SUSPEND */
#define TEGRA186_CORE_WAKE_MASK 0x180c
/* context size to save during system suspend */
#define TEGRA186_SE_CONTEXT_SIZE 3
...
...
@@ -98,6 +107,8 @@ int tegra_soc_pwr_domain_suspend(const psci_power_state_t *target_state)
int
impl
=
(
read_midr
()
>>
MIDR_IMPL_SHIFT
)
&
MIDR_IMPL_MASK
;
cpu_context_t
*
ctx
=
cm_get_context
(
NON_SECURE
);
gp_regs_t
*
gp_regs
=
get_gpregs_ctx
(
ctx
);
plat_params_from_bl2_t
*
params_from_bl2
=
bl31_get_plat_params
();
uint64_t
smmu_ctx_base
;
uint32_t
val
;
assert
(
ctx
);
...
...
@@ -115,26 +126,30 @@ int tegra_soc_pwr_domain_suspend(const psci_power_state_t *target_state)
if
(
stateid_afflvl0
==
PSTATE_ID_CORE_IDLE
)
{
/* Program default wake mask */
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X4
,
0
);
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X5
,
TEGRA186_CORE_WAKE_MASK
);
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X6
,
1
);
(
void
)
mce_command_handler
(
MCE_CMD_UPDATE_CSTATE_INFO
,
0
,
0
,
0
);
/* Prepare for cpu idle */
(
void
)
mce_command_handler
(
MCE_CMD_ENTER_CSTATE
,
TEGRA_ARI_CORE_C6
,
wake_time
[
cpu
],
0
);
}
else
if
(
stateid_afflvl0
==
PSTATE_ID_CORE_POWERDN
)
{
/* Program default wake mask */
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X4
,
0
);
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X5
,
TEGRA186_CORE_WAKE_MASK
);
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X6
,
1
);
(
void
)
mce_command_handler
(
MCE_CMD_UPDATE_CSTATE_INFO
,
0
,
0
,
0
);
/* Prepare for cpu powerdn */
(
void
)
mce_command_handler
(
MCE_CMD_ENTER_CSTATE
,
TEGRA_ARI_CORE_C7
,
wake_time
[
cpu
],
0
);
}
else
if
(
stateid_afflvl2
==
PSTATE_ID_SOC_POWERDN
)
{
/* loop until SC7 is allowed */
do
{
val
=
mce_command_handler
(
MCE_CMD_IS_SC7_ALLOWED
,
TEGRA_ARI_CORE_C7
,
MCE_CORE_SLEEP_TIME_INFINITE
,
0
);
}
while
(
val
==
0
);
/* save SE registers */
se_regs
[
0
]
=
mmio_read_32
(
TEGRA_SE0_BASE
+
SE_MUTEX_WATCHDOG_NS_LIMIT
);
...
...
@@ -147,8 +162,12 @@ int tegra_soc_pwr_domain_suspend(const psci_power_state_t *target_state)
val
=
mmio_read_32
(
TEGRA_MISC_BASE
+
MISCREG_PFCFG
);
mmio_write_32
(
TEGRA_SCRATCH_BASE
+
SECURE_SCRATCH_RSV6
,
val
);
/* save SMMU context */
tegra_smmu_save_context
();
/* save SMMU context to TZDRAM */
smmu_ctx_base
=
params_from_bl2
->
tzdram_base
+
((
uintptr_t
)
&
__tegra186_cpu_reset_handler_data
-
(
uintptr_t
)
tegra186_cpu_reset_handler
)
+
TEGRA186_SMMU_CTX_OFFSET
;
tegra_smmu_save_context
((
uintptr_t
)
smmu_ctx_base
);
/* Prepare for system suspend */
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X4
,
1
);
...
...
@@ -157,7 +176,15 @@ int tegra_soc_pwr_domain_suspend(const psci_power_state_t *target_state)
(
void
)
mce_command_handler
(
MCE_CMD_UPDATE_CSTATE_INFO
,
TEGRA_ARI_CLUSTER_CC7
,
0
,
TEGRA_ARI_SYSTEM_SC7
);
/* Enter system suspend state */
/* Loop until system suspend is allowed */
do
{
val
=
mce_command_handler
(
MCE_CMD_IS_SC7_ALLOWED
,
TEGRA_ARI_CORE_C7
,
MCE_CORE_SLEEP_TIME_INFINITE
,
0
);
}
while
(
val
==
0
);
/* Instruct the MCE to enter system suspend state */
(
void
)
mce_command_handler
(
MCE_CMD_ENTER_CSTATE
,
TEGRA_ARI_CORE_C7
,
MCE_CORE_SLEEP_TIME_INFINITE
,
0
);
...
...
@@ -169,6 +196,31 @@ int tegra_soc_pwr_domain_suspend(const psci_power_state_t *target_state)
return
PSCI_E_SUCCESS
;
}
int
tegra_soc_pwr_domain_power_down_wfi
(
const
psci_power_state_t
*
target_state
)
{
const
plat_local_state_t
*
pwr_domain_state
=
target_state
->
pwr_domain_state
;
plat_params_from_bl2_t
*
params_from_bl2
=
bl31_get_plat_params
();
unsigned
int
stateid_afflvl2
=
pwr_domain_state
[
PLAT_MAX_PWR_LVL
]
&
TEGRA186_STATE_ID_MASK
;
uint32_t
val
;
if
(
stateid_afflvl2
==
PSTATE_ID_SOC_POWERDN
)
{
/*
* The TZRAM loses power when we enter system suspend. To
* allow graceful exit from system suspend, we need to copy
* BL3-1 over to TZDRAM.
*/
val
=
params_from_bl2
->
tzdram_base
+
((
uintptr_t
)
&
__tegra186_cpu_reset_handler_end
-
(
uintptr_t
)
tegra186_cpu_reset_handler
);
memcpy16
((
void
*
)(
uintptr_t
)
val
,
(
void
*
)(
uintptr_t
)
BL31_BASE
,
(
uintptr_t
)
&
__BL31_END__
-
(
uintptr_t
)
BL31_BASE
);
}
return
PSCI_E_SUCCESS
;
}
int
tegra_soc_pwr_domain_on
(
u_register_t
mpidr
)
{
int
target_cpu
=
mpidr
&
MPIDR_CPU_MASK
;
...
...
@@ -190,13 +242,33 @@ int tegra_soc_pwr_domain_on(u_register_t mpidr)
int
tegra_soc_pwr_domain_on_finish
(
const
psci_power_state_t
*
target_state
)
{
int
state_id
=
target_state
->
pwr_domain_state
[
PLAT_MAX_PWR_LVL
];
int
stateid_afflvl2
=
target_state
->
pwr_domain_state
[
PLAT_MAX_PWR_LVL
];
int
stateid_afflvl0
=
target_state
->
pwr_domain_state
[
MPIDR_AFFLVL0
];
cpu_context_t
*
ctx
=
cm_get_context
(
NON_SECURE
);
gp_regs_t
*
gp_regs
=
get_gpregs_ctx
(
ctx
);
/*
* Reset power state info for CPUs when onlining, we set
* deepest power when offlining a core but that may not be
* requested by non-secure sw which controls idle states. It
* will re-init this info from non-secure software when the
* core come online.
*/
if
(
stateid_afflvl0
==
PLAT_MAX_OFF_STATE
)
{
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X4
,
0
);
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X5
,
0
);
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X6
,
1
);
mce_command_handler
(
MCE_CMD_UPDATE_CSTATE_INFO
,
TEGRA_ARI_CLUSTER_CC1
,
0
,
0
);
}
/*
* Check if we are exiting from deep sleep and restore SE
* context if we are.
*/
if
(
state_id
==
PSTATE_ID_SOC_POWERDN
)
{
if
(
stateid_afflvl2
==
PSTATE_ID_SOC_POWERDN
)
{
mmio_write_32
(
TEGRA_SE0_BASE
+
SE_MUTEX_WATCHDOG_NS_LIMIT
,
se_regs
[
0
]);
mmio_write_32
(
TEGRA_RNG1_BASE
+
RNG_MUTEX_WATCHDOG_NS_LIMIT
,
...
...
@@ -206,6 +278,17 @@ int tegra_soc_pwr_domain_on_finish(const psci_power_state_t *target_state)
/* Init SMMU */
tegra_smmu_init
();
/*
* Reset power state info for the last core doing SC7 entry and exit,
* we set deepest power state as CC7 and SC7 for SC7 entry which
* may not be requested by non-secure SW which controls idle states.
*/
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X4
,
0
);
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X5
,
0
);
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X6
,
1
);
(
void
)
mce_command_handler
(
MCE_CMD_UPDATE_CSTATE_INFO
,
TEGRA_ARI_CLUSTER_CC7
,
0
,
TEGRA_ARI_SYSTEM_SC1
);
}
return
PSCI_E_SUCCESS
;
...
...
@@ -225,7 +308,7 @@ int tegra_soc_pwr_domain_off(const psci_power_state_t *target_state)
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X5
,
0
);
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X6
,
1
);
mce_command_handler
(
MCE_CMD_UPDATE_CSTATE_INFO
,
TEGRA_ARI_CLUSTER_CC7
,
0
,
TEGRA_ARI_SYSTEM_SC7
);
0
,
0
);
/* Disable Denver's DCO operations */
if
(
impl
==
DENVER_IMPL
)
...
...
@@ -249,6 +332,13 @@ __dead2 void tegra_soc_prepare_system_off(void)
}
else
if
(
tegra186_system_powerdn_state
==
TEGRA_ARI_SYSTEM_SC8
)
{
/* Prepare for quasi power down */
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X4
,
1
);
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X5
,
0
);
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X6
,
1
);
(
void
)
mce_command_handler
(
MCE_CMD_UPDATE_CSTATE_INFO
,
TEGRA_ARI_CLUSTER_CC7
,
0
,
TEGRA_ARI_SYSTEM_SC8
);
/* loop until other CPUs power down */
do
{
val
=
mce_command_handler
(
MCE_CMD_IS_SC7_ALLOWED
,
...
...
@@ -257,13 +347,6 @@ __dead2 void tegra_soc_prepare_system_off(void)
0
);
}
while
(
val
==
0
);
/* Prepare for quasi power down */
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X4
,
1
);
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X5
,
0
);
write_ctx_reg
(
gp_regs
,
CTX_GPREG_X6
,
1
);
(
void
)
mce_command_handler
(
MCE_CMD_UPDATE_CSTATE_INFO
,
TEGRA_ARI_CLUSTER_CC7
,
0
,
TEGRA_ARI_SYSTEM_SC8
);
/* Enter quasi power down state */
(
void
)
mce_command_handler
(
MCE_CMD_ENTER_CSTATE
,
TEGRA_ARI_CORE_C7
,
MCE_CORE_SLEEP_TIME_INFINITE
,
0
);
...
...
plat/nvidia/tegra/soc/t186/plat_secondary.c
View file @
ddc1c56f
...
...
@@ -28,10 +28,13 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <arch_helpers.h>
#include <debug.h>
#include <mce.h>
#include <mmio.h>
#include <string.h>
#include <tegra_def.h>
#include <tegra_private.h>
#define MISCREG_CPU_RESET_VECTOR 0x2000
#define MISCREG_AA64_RST_LOW 0x2004
...
...
@@ -42,7 +45,8 @@
#define CPU_RESET_MODE_AA64 1
extern
void
tegra_secure_entrypoint
(
void
);
extern
uint64_t
tegra_bl31_phys_base
;
extern
uint64_t
__tegra186_cpu_reset_handler_end
;
/*******************************************************************************
* Setup secondary CPU vectors
...
...
@@ -50,12 +54,31 @@ extern void tegra_secure_entrypoint(void);
void
plat_secondary_setup
(
void
)
{
uint32_t
addr_low
,
addr_high
;
uint64_t
reset_addr
=
(
uint64_t
)
tegra_secure_entrypoint
;
plat_params_from_bl2_t
*
params_from_bl2
=
bl31_get_plat_params
();
uint64_t
cpu_reset_handler_base
;
INFO
(
"Setting up secondary CPU boot
\n
"
);
addr_low
=
(
uint32_t
)
reset_addr
|
CPU_RESET_MODE_AA64
;
addr_high
=
(
uint32_t
)((
reset_addr
>>
32
)
&
0x7ff
);
if
((
tegra_bl31_phys_base
>=
TEGRA_TZRAM_BASE
)
&&
(
tegra_bl31_phys_base
<=
(
TEGRA_TZRAM_BASE
+
TEGRA_TZRAM_SIZE
)))
{
/*
* The BL31 code resides in the TZSRAM which loses state
* when we enter System Suspend. Copy the wakeup trampoline
* code to TZDRAM to help us exit from System Suspend.
*/
cpu_reset_handler_base
=
params_from_bl2
->
tzdram_base
;
memcpy16
((
void
*
)((
uintptr_t
)
cpu_reset_handler_base
),
(
void
*
)(
uintptr_t
)
tegra186_cpu_reset_handler
,
(
uintptr_t
)
&
__tegra186_cpu_reset_handler_end
-
(
uintptr_t
)
tegra186_cpu_reset_handler
);
}
else
{
cpu_reset_handler_base
=
(
uintptr_t
)
tegra_secure_entrypoint
;
}
addr_low
=
(
uint32_t
)
cpu_reset_handler_base
|
CPU_RESET_MODE_AA64
;
addr_high
=
(
uint32_t
)((
cpu_reset_handler_base
>>
32
)
&
0x7ff
);
/* write lower 32 bits first, then the upper 11 bits */
mmio_write_32
(
TEGRA_MISC_BASE
+
MISCREG_AA64_RST_LOW
,
addr_low
);
...
...
plat/nvidia/tegra/soc/t186/plat_setup.c
View file @
ddc1c56f
...
...
@@ -37,6 +37,7 @@
#include <debug.h>
#include <denver.h>
#include <interrupt_mgmt.h>
#include <mce.h>
#include <platform.h>
#include <tegra_def.h>
#include <tegra_private.h>
...
...
@@ -65,6 +66,8 @@ const unsigned char tegra_power_domain_tree_desc[] = {
static
const
mmap_region_t
tegra_mmap
[]
=
{
MAP_REGION_FLAT
(
TEGRA_MISC_BASE
,
0x10000
,
/* 64KB */
MT_DEVICE
|
MT_RW
|
MT_SECURE
),
MAP_REGION_FLAT
(
TEGRA_TSA_BASE
,
0x20000
,
/* 128KB */
MT_DEVICE
|
MT_RW
|
MT_SECURE
),
MAP_REGION_FLAT
(
TEGRA_MC_STREAMID_BASE
,
0x10000
,
/* 64KB */
MT_DEVICE
|
MT_RW
|
MT_SECURE
),
MAP_REGION_FLAT
(
TEGRA_MC_BASE
,
0x10000
,
/* 64KB */
...
...
@@ -168,3 +171,11 @@ void plat_gic_setup(void)
if
(
sizeof
(
tegra186_sec_irqs
)
>
0
)
tegra_fiq_handler_setup
();
}
/*******************************************************************************
* Handler for early platform setup
******************************************************************************/
void
plat_early_platform_setup
(
void
)
{
mce_verify_firmware_version
();
}
plat/nvidia/tegra/soc/t186/plat_sip_calls.c
View file @
ddc1c56f
...
...
@@ -64,6 +64,7 @@ extern uint32_t tegra186_system_powerdn_state;
#define TEGRA_SIP_MCE_CMD_ENUM_WRITE_MCA 0x82FFFF0D
#define TEGRA_SIP_MCE_CMD_ROC_FLUSH_CACHE 0x82FFFF0E
#define TEGRA_SIP_MCE_CMD_ROC_CLEAN_CACHE 0x82FFFF0F
#define TEGRA_SIP_MCE_CMD_ENABLE_LATIC 0x82FFFF10
/*******************************************************************************
* This function is responsible for handling all T186 SiP calls
...
...
@@ -100,6 +101,7 @@ int plat_sip_handler(uint32_t smc_fid,
case
TEGRA_SIP_MCE_CMD_ENUM_WRITE_MCA
:
case
TEGRA_SIP_MCE_CMD_ROC_FLUSH_CACHE
:
case
TEGRA_SIP_MCE_CMD_ROC_CLEAN_CACHE
:
case
TEGRA_SIP_MCE_CMD_ENABLE_LATIC
:
/* clean up the high bits */
smc_fid
&=
MCE_CMD_MASK
;
...
...
plat/nvidia/tegra/soc/t186/plat_trampoline.S
0 → 100644
View file @
ddc1c56f
/*
*
Copyright
(
c
)
2016
,
ARM
Limited
and
Contributors
.
All
rights
reserved
.
*
*
Redistribution
and
use
in
source
and
binary
forms
,
with
or
without
*
modification
,
are
permitted
provided
that
the
following
conditions
are
met
:
*
*
Redistributions
of
source
code
must
retain
the
above
copyright
notice
,
this
*
list
of
conditions
and
the
following
disclaimer
.
*
*
Redistributions
in
binary
form
must
reproduce
the
above
copyright
notice
,
*
this
list
of
conditions
and
the
following
disclaimer
in
the
documentation
*
and
/
or
other
materials
provided
with
the
distribution
.
*
*
Neither
the
name
of
ARM
nor
the
names
of
its
contributors
may
be
used
*
to
endorse
or
promote
products
derived
from
this
software
without
specific
*
prior
written
permission
.
*
*
THIS
SOFTWARE
IS
PROVIDED
BY
THE
COPYRIGHT
HOLDERS
AND
CONTRIBUTORS
"AS IS"
*
AND
ANY
EXPRESS
OR
IMPLIED
WARRANTIES
,
INCLUDING
,
BUT
NOT
LIMITED
TO
,
THE
*
IMPLIED
WARRANTIES
OF
MERCHANTABILITY
AND
FITNESS
FOR
A
PARTICULAR
PURPOSE
*
ARE
DISCLAIMED
.
IN
NO
EVENT
SHALL
THE
COPYRIGHT
HOLDER
OR
CONTRIBUTORS
BE
*
LIABLE
FOR
ANY
DIRECT
,
INDIRECT
,
INCIDENTAL
,
SPECIAL
,
EXEMPLARY
,
OR
*
CONSEQUENTIAL
DAMAGES
(
INCLUDING
,
BUT
NOT
LIMITED
TO
,
PROCUREMENT
OF
*
SUBSTITUTE
GOODS
OR
SERVICES
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
*
INTERRUPTION
)
HOWEVER
CAUSED
AND
ON
ANY
THEORY
OF
LIABILITY
,
WHETHER
IN
*
CONTRACT
,
STRICT
LIABILITY
,
OR
TORT
(
INCLUDING
NEGLIGENCE
OR
OTHERWISE
)
*
ARISING
IN
ANY
WAY
OUT
OF
THE
USE
OF
THIS
SOFTWARE
,
EVEN
IF
ADVISED
OF
THE
*
POSSIBILITY
OF
SUCH
DAMAGE
.
*/
#include <arch.h>
#include <asm_macros.S>
#include <common_def.h>
#include <memctrl_v2.h>
#include <tegra_def.h>
#define TEGRA186_SMMU_CTX_SIZE 0x420
.
align
4
.
globl
tegra186_cpu_reset_handler
/*
CPU
reset
handler
routine
*/
func
tegra186_cpu_reset_handler
/
*
*
The
Memory
Controller
loses
state
during
System
Suspend
.
We
*
use
this
information
to
decide
if
the
reset
handler
is
running
*
after
a
System
Suspend
.
Resume
from
system
suspend
requires
*
restoring
the
entire
state
from
TZDRAM
to
TZRAM
.
*/
mov
x1
,
#
TEGRA_MC_BASE
ldr
w0
,
[
x1
,
#
MC_SECURITY_CFG3_0
]
lsl
x0
,
x0
,
#
32
ldr
w0
,
[
x1
,
#
MC_SECURITY_CFG0_0
]
adr
x1
,
tegra186_cpu_reset_handler
cmp
x0
,
x1
beq
boot_cpu
/
*
resume
from
system
suspend
*/
mov
x0
,
#
BL31_BASE
adr
x1
,
__tegra186_cpu_reset_handler_end
adr
x2
,
__tegra186_cpu_reset_handler_data
ldr
x2
,
[
x2
,
#
8
]
/
*
memcpy16
*/
m_loop16
:
cmp
x2
,
#
16
b.lt
m_loop1
ldp
x3
,
x4
,
[
x1
],
#
16
stp
x3
,
x4
,
[
x0
],
#
16
sub
x2
,
x2
,
#
16
b
m_loop16
/
*
copy
byte
per
byte
*/
m_loop1
:
cbz
x2
,
boot_cpu
ldrb
w3
,
[
x1
],
#
1
strb
w3
,
[
x0
],
#
1
subs
x2
,
x2
,
#
1
b.ne
m_loop1
boot_cpu
:
adr
x0
,
__tegra186_cpu_reset_handler_data
ldr
x0
,
[
x0
]
br
x0
endfunc
tegra186_cpu_reset_handler
/
*
*
Tegra186
reset
data
(
offset
0x0
-
0x430
)
*
*
0x000
:
secure
world
's entrypoint
*
0x008
:
BL31
size
(
RO
+
RW
)
*
0x00C
:
SMMU
context
start
*
0x42C
:
SMMU
context
end
*/
.
align
4
.
type
__tegra186_cpu_reset_handler_data
,
%
object
.
globl
__tegra186_cpu_reset_handler_data
__tegra186_cpu_reset_handler_data
:
.
quad
tegra_secure_entrypoint
.
quad
__BL31_END__
-
BL31_BASE
.
rept
TEGRA186_SMMU_CTX_SIZE
.
quad
0
.
endr
.
size
__tegra186_cpu_reset_handler_data
,
\
.
-
__tegra186_cpu_reset_handler_data
.
align
4
.
globl
__tegra186_cpu_reset_handler_end
__tegra186_cpu_reset_handler_end
:
plat/nvidia/tegra/soc/t186/platform_t186.mk
View file @
ddc1c56f
...
...
@@ -29,8 +29,11 @@
#
# platform configs
ENABLE_NS_L2_CPUECTRL_RW_ACCESS
:=
1
$(eval
$(call
add_define,ENABLE_NS_L2_CPUECTRL_RW_ACCESS))
ENABLE_ROC_FOR_ORDERING_CLIENT_REQUESTS
:=
1
$(eval
$(call
add_define,ENABLE_ROC_FOR_ORDERING_CLIENT_REQUESTS))
ENABLE_CHIP_VERIFICATION_HARNESS
:=
0
$(eval
$(call
add_define,ENABLE_CHIP_VERIFICATION_HARNESS))
# platform settings
TZDRAM_BASE
:=
0x30000000
...
...
@@ -42,10 +45,10 @@ $(eval $(call add_define,PLATFORM_CLUSTER_COUNT))
PLATFORM_MAX_CPUS_PER_CLUSTER
:=
4
$(eval
$(call
add_define,PLATFORM_MAX_CPUS_PER_CLUSTER))
MAX_XLAT_TABLES
:=
15
MAX_XLAT_TABLES
:=
20
$(eval
$(call
add_define,MAX_XLAT_TABLES))
MAX_MMAP_REGIONS
:=
15
MAX_MMAP_REGIONS
:=
20
$(eval
$(call
add_define,MAX_MMAP_REGIONS))
# platform files
...
...
@@ -62,4 +65,5 @@ BL31_SOURCES += lib/cpus/aarch64/denver.S \
${SOC_DIR}
/plat_psci_handlers.c
\
${SOC_DIR}
/plat_setup.c
\
${SOC_DIR}
/plat_secondary.c
\
${SOC_DIR}
/plat_sip_calls.c
${SOC_DIR}
/plat_sip_calls.c
\
${SOC_DIR}
/plat_trampoline.S
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment