Browse Source

Merge changes from topics "ls1088a", "ls1088a-prepare" into integration

* changes:
  docs(layerscape): add ls1088a soc and board support
  feat(ls1088aqds): add ls1088aqds board support
  feat(ls1088ardb): add ls1088ardb board support
  feat(ls1088a): add new SoC platform ls1088a
  build(changelog): add new scopes for ls1088a
  feat(bl2): add support to separate no-loadable sections
  refactor(layerscape): refine comparison of inerconnection
  feat(layerscape): add soc helper macro definition for chassis 3
  feat(nxp-gic): add some macros definition for gicv3
  feat(layerscape): add CHASSIS 3 support for tbbr
  feat(layerscape): define more chassis 3 hardware address
  feat(nxp-crypto): add chassis 3 support
  feat(nxp-dcfg): add Chassis 3 support
  feat(lx2): enable DDR erratas for lx2 platforms
  feat(layerscape): print DDR errata information
  feat(nxp-ddr): add workaround for errata A050958
  feat(layerscape): add new soc errata a010539 support
  feat(layerscape): add new soc errata a009660 support
  feat(nxp-ddr): add rawcard 1F support
  fix(layerscape): fix build issue of mmap_add_ddr_region_dynamically
  fix(nxp-tools): fix create_pbl print log
  build(changelog): add new scopes for NXP driver
pull/1985/head
Joanna Farley 3 years ago
committed by TrustedFirmware Code Review
parent
commit
2ea18c7df3
  1. 2
      Makefile
  2. 22
      bl2/bl2_el3.ld.S
  3. 16
      changelog.yaml
  4. 8
      docs/about/maintainers.rst
  5. 9
      docs/getting_started/build-options.rst
  6. 35
      docs/plat/nxp/nxp-layerscape.rst
  7. 9
      drivers/nxp/dcfg/dcfg.c
  8. 6
      drivers/nxp/ddr/nxp-ddr/ddr.mk
  9. 6
      drivers/nxp/ddr/nxp-ddr/dimm.c
  10. 6
      drivers/nxp/ddr/phy-gen2/phy.c
  11. 8
      include/arch/aarch32/el3_common_macros.S
  12. 8
      include/arch/aarch64/el3_common_macros.S
  13. 4
      include/drivers/nxp/crypto/caam/caam.h
  14. 4
      include/drivers/nxp/dcfg/dcfg.h
  15. 9
      include/drivers/nxp/gic/gicv3/plat_gic.h
  16. 4
      make_helpers/defaults.mk
  17. 58
      plat/nxp/common/include/default/ch_3/soc_default_base_addr.h
  18. 98
      plat/nxp/common/include/default/ch_3/soc_default_helper_macros.h
  19. 8
      plat/nxp/common/plat_make_helper/soc_common_def.mk
  20. 7
      plat/nxp/common/setup/ls_bl2_el3_setup.c
  21. 29
      plat/nxp/common/soc_errata/errata.c
  22. 6
      plat/nxp/common/soc_errata/errata.mk
  23. 14
      plat/nxp/common/soc_errata/errata_a009660.c
  24. 26
      plat/nxp/common/soc_errata/errata_a010539.c
  25. 10
      plat/nxp/common/soc_errata/errata_list.h
  26. 9
      plat/nxp/common/tbbr/tbbr.mk
  27. 1817
      plat/nxp/soc-ls1088a/aarch64/ls1088a.S
  28. 69
      plat/nxp/soc-ls1088a/aarch64/ls1088a_helpers.S
  29. 229
      plat/nxp/soc-ls1088a/include/soc.h
  30. 84
      plat/nxp/soc-ls1088a/ls1088aqds/ddr_init.c
  31. 81
      plat/nxp/soc-ls1088a/ls1088aqds/plat_def.h
  32. 28
      plat/nxp/soc-ls1088a/ls1088aqds/platform.c
  33. 31
      plat/nxp/soc-ls1088a/ls1088aqds/platform.mk
  34. 13
      plat/nxp/soc-ls1088a/ls1088aqds/platform_def.h
  35. 16
      plat/nxp/soc-ls1088a/ls1088aqds/policy.h
  36. 86
      plat/nxp/soc-ls1088a/ls1088ardb/ddr_init.c
  37. 80
      plat/nxp/soc-ls1088a/ls1088ardb/plat_def.h
  38. 28
      plat/nxp/soc-ls1088a/ls1088ardb/platform.c
  39. 30
      plat/nxp/soc-ls1088a/ls1088ardb/platform.mk
  40. 13
      plat/nxp/soc-ls1088a/ls1088ardb/platform_def.h
  41. 15
      plat/nxp/soc-ls1088a/ls1088ardb/policy.h
  42. 397
      plat/nxp/soc-ls1088a/soc.c
  43. 87
      plat/nxp/soc-ls1088a/soc.def
  44. 110
      plat/nxp/soc-ls1088a/soc.mk
  45. 7
      plat/nxp/soc-lx2160a/soc.def
  46. 6
      tools/nxp/create_pbl/create_pbl.c
  47. 4
      tools/nxp/create_pbl/pbl_ch3.mk

2
Makefile

@ -1021,6 +1021,7 @@ $(eval $(call assert_booleans,\
RESET_TO_BL31 \
SAVE_KEYS \
SEPARATE_CODE_AND_RODATA \
SEPARATE_BL2_NOLOAD_REGION \
SEPARATE_NOBITS_REGION \
SPIN_ON_BL1_EXIT \
SPM_MM \
@ -1136,6 +1137,7 @@ $(eval $(call add_defines,\
RAS_EXTENSION \
RESET_TO_BL31 \
SEPARATE_CODE_AND_RODATA \
SEPARATE_BL2_NOLOAD_REGION \
SEPARATE_NOBITS_REGION \
RECLAIM_INIT_CODE \
SPD_${SPD} \

22
bl2/bl2_el3.ld.S

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017-2020, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2017-2022, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@ -17,6 +17,11 @@ MEMORY {
RAM (rwx): ORIGIN = BL2_RW_BASE, LENGTH = BL2_RW_LIMIT - BL2_RW_BASE
#else
RAM (rwx): ORIGIN = BL2_BASE, LENGTH = BL2_LIMIT - BL2_BASE
#if SEPARATE_BL2_NOLOAD_REGION
RAM_NOLOAD (rw!a): ORIGIN = BL2_NOLOAD_START, LENGTH = BL2_NOLOAD_LIMIT - BL2_NOLOAD_START
#else
#define RAM_NOLOAD RAM
#endif
#endif
}
@ -106,9 +111,18 @@ SECTIONS
__DATA_RAM_END__ = __DATA_END__;
RELA_SECTION >RAM
STACK_SECTION >RAM
BSS_SECTION >RAM
XLAT_TABLE_SECTION >RAM
#if SEPARATE_BL2_NOLOAD_REGION
SAVED_ADDR = .;
. = BL2_NOLOAD_START;
__BL2_NOLOAD_START__ = .;
#endif
STACK_SECTION >RAM_NOLOAD
BSS_SECTION >RAM_NOLOAD
XLAT_TABLE_SECTION >RAM_NOLOAD
#if SEPARATE_BL2_NOLOAD_REGION
__BL2_NOLOAD_END__ = .;
. = SAVED_ADDR;
#endif
#if USE_COHERENT_MEM
/*

16
changelog.yaml

@ -349,6 +349,16 @@ subsections:
- title: LS1046AQDS
scope: ls1046aqds
- title: LS1088A
scope: ls1088a
subsections:
- title: LS1088ARDB
scope: ls1088ardb
- title: LS1088AQDS
scope: ls1088aqds
- title: QEMU
scope: qemu
@ -748,6 +758,12 @@ subsections:
- title: NXP Crypto
scope: nxp-crypto
- title: DDR
scope: nxp-ddr
- title: GIC
scope: nxp-gic
- title: Renesas
scope: renesas-drivers

8
docs/about/maintainers.rst

@ -573,6 +573,14 @@ NXP SoC Part LS1046A and its platform port
:|F|: plat/nxp/soc-ls1046a/ls1046afrwy
:|F|: plat/nxp/soc-ls1046a/ls1046aqds
NXP SoC Part LS1088A and its platform port
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:|M|: Jiafei Pan <jiafei.pan@nxp.com>
:|G|: `JiafeiPan`_
:|F|: plat/nxp/soc-ls1088a
:|F|: plat/nxp/soc-ls1088a/ls1088ardb
:|F|: plat/nxp/soc-ls1088a/ls1088aqds
QEMU platform port
^^^^^^^^^^^^^^^^^^
:|M|: Jens Wiklander <jens.wiklander@linaro.org>

9
docs/getting_started/build-options.rst

@ -647,6 +647,13 @@ Common build options
``BL31_NOBITS_LIMIT``. When the option is ``0`` (the default), NOBITS
sections are placed in RAM immediately following the loaded firmware image.
- ``SEPARATE_BL2_NOLOAD_REGION``: Setting this option to ``1`` allows the
NOLOAD sections of BL2 (.bss, stacks, page tables) to be allocated in RAM
discontiguous from loaded firmware images. When set, the platform need to
provide definitions of ``BL2_NOLOAD_START`` and ``BL2_NOLOAD_LIMIT``. This
flag is disabled by default and NOLOAD sections are placed in RAM immediately
following the loaded firmware image.
- ``SMC_PCI_SUPPORT``: This option allows platforms to handle PCI configuration
access requests via a standard SMCCC defined in `DEN0115`_. When combined with
UEFI+ACPI this can provide a certain amount of OS forward compatibility
@ -961,7 +968,7 @@ Firmware update options
--------------
*Copyright (c) 2019-2021, Arm Limited. All rights reserved.*
*Copyright (c) 2019-2022, Arm Limited. All rights reserved.*
.. _DEN0115: https://developer.arm.com/docs/den0115/latest
.. _PSA FW update specification: https://developer.arm.com/documentation/den0118/a/

35
docs/plat/nxp/nxp-layerscape.rst

@ -103,7 +103,7 @@ line of QorIQ communications processors. Featuring power-efficient 64-bit
Arm Cortex-A72 cores with ECC-protected L1 and L2 cache memories for high
reliability, running up to 1.8 GHz.
Details about LS1043A can be found at `ls1046a`_.
Details about LS1046A can be found at `ls1046a`_.
- LS1046ARDB Board:
@ -113,7 +113,7 @@ architecture processor. The LS1046ARDB board supports the Layerscape LS1046A
processor and is optimized to support the DDR4 memory and a full complement
of high-speed SerDes ports.
Details about LS1043A RDB board can be found at `ls1046ardb`_.
Details about LS1046A RDB board can be found at `ls1046ardb`_.
- LS1046AFRWY Board:
@ -124,7 +124,28 @@ board supports the LS1046A processor, onboard DDR4 memory, multiple Gigabit
Ethernet, USB3.0 and M2_Type_E interfaces for Wi-Fi, FRWY-LS1046A-AC includes
the Wi-Fi card.
Details about LS1043A RDB board can be found at `ls1046afrwy`_.
Details about LS1046A FRWY board can be found at `ls1046afrwy`_.
5. LS1088A
- SoC Overview:
The LS1088A family of multicore communications processors combines up to and eight
Arm Cortex-A53 cores with the advanced, high-performance data path and network
peripheral interfaces required for wireless access points, networking infrastructure,
intelligent edge access, including virtual customer premise equipment (vCPE) and
high-performance industrial applications.
Details about LS1088A can be found at `ls1088a`_.
- LS1088ARDB Board:
The LS1088A reference design board provides a comprehensive platform that
enables design and evaluation of the product (LS1088A processor). This RDB
comes pre-loaded with a board support package (BSP) based on a standard
Linux kernel.
Details about LS1088A RDB board can be found at `ls1088ardb`_.
Table of supported boot-modes by each platform & platform that needs FIP-DDR:
-----------------------------------------------------------------------------
@ -144,6 +165,8 @@ Table of supported boot-modes by each platform & platform that needs FIP-DDR:
+---------------------+-------+--------+-------+-------+-------+-------------+--------------+-----------------+
| ls1046afrwy | yes | yes | | | | | | no |
+---------------------+-------+--------+-------+-------+-------+-------------+--------------+-----------------+
| ls1088ardb | yes | yes | | | | | | no |
+---------------------+-------+--------+-------+-------+-------+-------------+--------------+-----------------+
Boot Sequence
@ -336,7 +359,7 @@ should be modified based on the binary size of the image to be copied.
-- Then reset to alternate bank to boot up ATF.
Command for lx2160a and ls1028a platforms:
Command for lx2160a, ls1088a and ls1028a platforms:
.. code:: shell
@ -370,7 +393,7 @@ should be modified based on the binary size of the image to be copied.
-- Then reset to sd/emmc to boot up ATF from sd/emmc as boot-source.
Command for lx2160A and ls1028a platforms:
Command for lx2160A, ls1088a and ls1028a platforms:
.. code:: shell
@ -445,4 +468,6 @@ Refer `nxp-ls-tbbr.rst`_ for detailed user steps.
.. _ls1046a: https://www.nxp.com/products/processors-and-microcontrollers/arm-processors/layerscape-processors/layerscape-1046a-and-1026a-processors:LS1046A
.. _ls1046ardb: https://www.nxp.com/design/qoriq-developer-resources/layerscape-ls1046a-reference-design-board:LS1046A-RDB
.. _ls1046afrwy: https://www.nxp.com/design/qoriq-developer-resources/ls1046a-freeway-board:FRWY-LS1046A
.. _ls1088a: https://www.nxp.com/products/processors-and-microcontrollers/arm-processors/layerscape-processors/layerscape-1088a-and-1048a-processor:LS1088A
.. _ls1088ardb: https://www.nxp.com/design/qoriq-developer-resources/layerscape-ls1088a-reference-design-board:LS1088A-RDB
.. _nxp-ls-tbbr.rst: ./nxp-ls-tbbr.rst

9
drivers/nxp/dcfg/dcfg.c

@ -1,5 +1,5 @@
/*
* Copyright 2020-2021 NXP
* Copyright 2020-2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*
@ -74,14 +74,11 @@ const devdisr5_info_t *get_devdisr5_info(void)
reg = gur_in32(dcfg_init_info->g_nxp_dcfg_addr + DCFG_DEVDISR5_OFFSET);
#if defined(CONFIG_CHASSIS_3_2)
devdisr5_info.ddrc1_present = (reg & DISR5_DDRC1_MASK) ? 0 : 1;
#if defined(CONFIG_CHASSIS_3_2)
devdisr5_info.ddrc2_present = (reg & DISR5_DDRC2_MASK) ? 0 : 1;
devdisr5_info.ocram_present = (reg & DISR5_OCRAM_MASK) ? 0 : 1;
#elif defined(CONFIG_CHASSIS_2)
devdisr5_info.ddrc1_present = (reg & DISR5_DDRC1_MASK) ? 0 : 1;
devdisr5_info.ocram_present = (reg & DISR5_OCRAM_MASK) ? 0 : 1;
#endif
devdisr5_info.ocram_present = (reg & DISR5_OCRAM_MASK) ? 0 : 1;
devdisr5_info.is_populated = true;
return (const devdisr5_info_t *) &devdisr5_info;

6
drivers/nxp/ddr/nxp-ddr/ddr.mk

@ -1,5 +1,5 @@
#
# Copyright 2021 NXP
# Copyright 2021-2022 NXP
#
# SPDX-License-Identifier: BSD-3-Clause
#
@ -19,6 +19,10 @@ ifeq (${ERRATA_DDR_A050450}, 1)
$(eval $(call add_define,ERRATA_DDR_A050450))
endif
ifeq (${ERRATA_DDR_A050958}, 1)
$(eval $(call add_define,ERRATA_DDR_A050958))
endif
endif
ifeq ($(PLAT_DDR_PHY), PHY_GEN1)

6
drivers/nxp/ddr/nxp-ddr/dimm.c

@ -1,5 +1,5 @@
/*
* Copyright 2021 NXP
* Copyright 2021-2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*
@ -194,7 +194,7 @@ int cal_dimm_params(const struct ddr4_spd *spd, struct dimm_params *pdimm)
case DDR4_SPD_MINI_RDIMM:
case DDR4_SPD_72B_SO_RDIMM:
pdimm->rdimm = 1;
pdimm->rc = spd->mod_section.registered.ref_raw_card & 0x8f;
pdimm->rc = spd->mod_section.registered.ref_raw_card & 0x9f;
if ((spd->mod_section.registered.reg_map & 0x1) != 0) {
pdimm->mirrored_dimm = 1;
}
@ -223,7 +223,7 @@ int cal_dimm_params(const struct ddr4_spd *spd, struct dimm_params *pdimm)
case DDR4_SPD_72B_SO_UDIMM:
case DDR4_SPD_16B_SO_DIMM:
case DDR4_SPD_32B_SO_DIMM:
pdimm->rc = spd->mod_section.unbuffered.ref_raw_card & 0x8f;
pdimm->rc = spd->mod_section.unbuffered.ref_raw_card & 0x9f;
if ((spd->mod_section.unbuffered.addr_mapping & 0x1) != 0) {
pdimm->mirrored_dimm = 1;
}

6
drivers/nxp/ddr/phy-gen2/phy.c

@ -1,5 +1,5 @@
/*
* Copyright 2021 NXP
* Copyright 2021-2022 NXP
* SPDX-License-Identifier: BSD-3-Clause
*
*/
@ -1673,6 +1673,10 @@ static void prog_dq_dqs_rcv_cntrl(uint16_t *phy,
int sel_analog_vref = 1;
uint32_t addr;
#ifdef ERRATA_DDR_A050958
gain_curr_adj_defval = 0x1f;
#endif
dq_dqs_rcv_cntrl = gain_curr_adj_defval << csr_gain_curr_adj_lsb |
major_mode_dbyte << csr_major_mode_dbyte_lsb |
dfe_ctrl_defval << csr_dfe_ctrl_lsb |

8
include/arch/aarch32/el3_common_macros.S

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016-2021, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2016-2022, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@ -398,6 +398,12 @@
ldr r1, =__RW_END__
sub r1, r1, r0
bl inv_dcache_range
#if defined(IMAGE_BL2) && SEPARATE_BL2_NOLOAD_REGION
ldr r0, =__BL2_NOLOAD_START__
ldr r1, =__BL2_NOLOAD_END__
sub r1, r1, r0
bl inv_dcache_range
#endif
#endif
/*

8
include/arch/aarch64/el3_common_macros.S

@ -469,6 +469,14 @@
sub x1, x1, x0
bl inv_dcache_range
#endif
#if defined(IMAGE_BL2) && SEPARATE_BL2_NOLOAD_REGION
adrp x0, __BL2_NOLOAD_START__
add x0, x0, :lo12:__BL2_NOLOAD_START__
adrp x1, __BL2_NOLOAD_END__
add x1, x1, :lo12:__BL2_NOLOAD_END__
sub x1, x1, x0
bl inv_dcache_range
#endif
#endif
adrp x0, __BSS_START__
add x0, x0, :lo12:__BSS_START__

4
include/drivers/nxp/crypto/caam/caam.h

@ -1,5 +1,5 @@
/*
* Copyright 2017-2021 NXP
* Copyright 2017-2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*
@ -15,7 +15,7 @@
/* Job ring 3 is reserved for usage by sec firmware */
#define DEFAULT_JR 3
#if defined(CONFIG_CHASSIS_3_2) || defined(CONFIG_CHASSIS_2)
#if defined(CONFIG_CHASSIS_3_2) || defined(CONFIG_CHASSIS_3) || defined(CONFIG_CHASSIS_2)
#define CAAM_JR0_OFFSET 0x10000
#define CAAM_JR1_OFFSET 0x20000
#define CAAM_JR2_OFFSET 0x30000

4
include/drivers/nxp/dcfg/dcfg.h

@ -1,5 +1,5 @@
/*
* Copyright 2018-2021 NXP
* Copyright 2018-2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*
@ -12,7 +12,7 @@
#if defined(CONFIG_CHASSIS_2)
#include <dcfg_lsch2.h>
#elif defined(CONFIG_CHASSIS_3_2)
#elif defined(CONFIG_CHASSIS_3_2) || defined(CONFIG_CHASSIS_3)
#include <dcfg_lsch3.h>
#endif

9
include/drivers/nxp/gic/gicv3/plat_gic.h

@ -1,5 +1,5 @@
/*
* Copyright 2021 NXP
* Copyright 2021-2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*
@ -21,8 +21,12 @@
#define GICD_CTLR_OFFSET 0x0
#define GICD_CLR_SPI_SR 0x58
#define GICD_IGROUPR_2 0x88
#define GICD_ISENABLER_1 0x104
#define GICD_ICENABLER_1 0x184
#define GICD_ISENABLER_2 0x108
#define GICD_ICENABLER_2 0x188
#define GICD_ISENABLER_3 0x10c
#define GICD_ICENABLER_3 0x18c
#define GICD_ICPENDR_2 0x288
#define GICD_ICACTIVER_2 0x388
#define GICD_IPRIORITYR_22 0x458
@ -69,6 +73,9 @@
#define GIC_IRM_SPI89 0x80000000
#define GICD_IROUTER_VALUE 0x100
#define GICD_ISENABLER_1_VALUE 0x10000000
#define GICD_ISENABLER_2_VALUE 0x100
#define GICD_ISENABLER_3_VALUE 0x20100
#define GICR_WAKER_SLEEP_BIT 0x2
#define GICR_WAKER_ASLEEP (1 << 2 | 1 << 1)

4
make_helpers/defaults.mk

@ -250,6 +250,10 @@ SEPARATE_CODE_AND_RODATA := 0
# separate memory region, which may be discontiguous from the rest of BL31.
SEPARATE_NOBITS_REGION := 0
# Put BL2 NOLOAD sections (.bss, stacks, page tables) in a separate memory
# region, platform Makefile is free to override this value.
SEPARATE_BL2_NOLOAD_REGION := 0
# If the BL31 image initialisation code is recalimed after use for the secondary
# cores stack
RECLAIM_INIT_CODE := 0

58
plat/nxp/common/include/default/ch_3/soc_default_base_addr.h

@ -1,5 +1,5 @@
/*
* Copyright 2021 NXP
* Copyright 2021-2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*
@ -15,12 +15,13 @@
#define NXP_DCSR_ADDR 0x700000000
#define NXP_DCSR_SIZE 0x40000000
/* Flex-SPI controller address */
#define NXP_FLEXSPI_ADDR 0x020C0000
/* Flex-SPI Flash Start address */
#define NXP_FLEXSPI_FLASH_ADDR 0x20000000
/* Quad SPI Region #1 base address */
#define NXP_QSPI_FLASH_ADDR 0x20000000
/* MMU 500 soc.c*/
/* IFC Region #1 base address */
#define NXP_NOR_FLASH_ADDR 0x30000000
/* MMU 500 */
#define NXP_SMMU_ADDR 0x05000000
#define NXP_SNVS_ADDR 0x01E90000
@ -34,8 +35,12 @@
#define NXP_I2C_ADDR 0x02000000
#define NXP_ESDHC_ADDR 0x02140000
#define NXP_ESDHC2_ADDR 0x02150000
#define NXP_UART_ADDR 0x021C0000
#define NXP_UART1_ADDR 0x021D0000
#ifndef NXP_UART_ADDR
#define NXP_UART_ADDR 0x021C0500
#endif
#ifndef NXP_UART1_ADDR
#define NXP_UART1_ADDR 0x021C0600
#endif
#define NXP_GPIO1_ADDR 0x02300000
#define NXP_GPIO2_ADDR 0x02310000
@ -50,8 +55,8 @@
#define NXP_TIMER_STATUS_ADDR 0x023F0000
#define NXP_GICD_ADDR 0x06000000
#define NXP_GICR_ADDR 0x06200000
#define NXP_GICR_SGI_ADDR 0x06210000
#define NXP_GICR_ADDR 0x06100000
#define NXP_GICR_SGI_ADDR 0x06110000
#define NXP_CAAM_ADDR 0x08000000
@ -61,4 +66,35 @@
#define NXP_RESET_ADDR 0x01E60000
#define NXP_SEC_REGFILE_ADDR 0x01E88000
#endif /* SOC_DEFAULT_BASE_ADDR_H */
#define NXP_RST_ADDR 0x01E88000
/* DDR memory Map */
#define NXP_DDR_ADDR 0x01080000
#define NXP_DDR2_ADDR 0x01090000
#define NXP_DDR3_ADDR 0x08210000
/* QuadSPI base address */
#define NXP_QSPI_ADDR 0x020C0000
/* IFC base address */
#define NXP_IFC_ADDR 0x02240000
/* CCI400 base address */
#define NXP_CCI_ADDR 0x04090000
/* Global Generic Reference Timer base address */
#define NXP_TIMER_ADDR 0x023E0000
/* OCRAM TZPC base address */
#define NXP_OCRAM_TZPC_ADDR 0x02200000
#define NXP_EPU_ADDR 0x700060000
#define NXP_CCN_ADDR 0x04000000
#define NXP_CCN_HNI_ADDR 0x04080000
#define NXP_CCN_HN_F_0_ADDR 0x04200000
#define NXP_CCN_HN_F_1_ADDR 0x04210000
#define TPMWAKEMR0_ADDR 0x700123c50
#endif /* SOC_DEFAULT_BASE_ADDR_H */

98
plat/nxp/common/include/default/ch_3/soc_default_helper_macros.h

@ -0,0 +1,98 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef SOC_DEFAULT_HELPER_MACROS_H
#define SOC_DEFAULT_HELPER_MACROS_H
#ifdef NXP_OCRAM_TZPC_ADDR
#define TZPC_BLOCK_SIZE 0x1000
#endif
/* Reset block register offsets */
#ifdef NXP_RESET_ADDR
/* Register Offset */
#define RST_RSTCR_OFFSET 0x0
#define RST_RSTRQMR1_OFFSET 0x10
#define RST_RSTRQSR1_OFFSET 0x18
#define BRR_OFFSET 0x60
/* helper macros */
#define RSTRQMR_RPTOE_MASK (1 << 19)
#endif /* NXP_RESET_ADDR */
#define PCIeRC_RN_I_NODE_ID_OFFSET 0x8
#define PoS_CONTROL_REG_OFFSET 0x0
#define POS_EARLY_WR_COMP_EN 0x20
#define HNI_POS_EN 0x01
#define POS_TERMINATE_BARRIERS 0x10
#define SERIALIZE_DEV_nGnRnE_WRITES 0x200
#define ENABLE_ERR_SIGNAL_TO_MN 0x4
#define ENABLE_RESERVE_BIT53 0x400
#define ENABLE_WUO 0x10
#define PORT_S0_CTRL_REG_RNI 0x010
#define PORT_S1_CTRL_REG_RNI 0x110
#define PORT_S2_CTRL_REG_RNI 0x210
#define ENABLE_FORCE_RD_QUO 0x20
#define QOS_SETTING 0x00FF000C
/* epu register offsets and values */
#define EPU_EPGCR_OFFSET 0x0
#define EPU_EPIMCR10_OFFSET 0x128
#define EPU_EPCTR10_OFFSET 0xa28
#define EPU_EPCCR10_OFFSET 0x828
#ifndef EPU_EPCCR10_VAL
#define EPU_EPCCR10_VAL 0xb2800000
#endif
#define EPU_EPIMCR10_VAL 0xba000000
#define EPU_EPCTR10_VAL 0x0
#define EPU_EPGCR_VAL (1 << 31)
#ifdef NXP_CCN_ADDR
#define NXP_CCN_HN_F_1_ADDR 0x04210000
#define CCN_HN_F_SAM_NODEID_MASK 0x7f
#define CCN_HN_F_SNP_DMN_CTL_OFFSET 0x200
#define CCN_HN_F_SNP_DMN_CTL_SET_OFFSET 0x210
#define CCN_HN_F_SNP_DMN_CTL_CLR_OFFSET 0x220
#define CCN_HN_F_SNP_DMN_CTL_MASK 0x80a00
#define CCN_HNF_NODE_COUNT 8
#define CCN_HNF_OFFSET 0x10000
#define SA_AUX_CTRL_REG_OFFSET 0x500
#define NUM_HNI_NODE 2
#define CCN_HNI_MEMORY_MAP_SIZE 0x10000
#define PCIeRC_RN_I_NODE_ID_OFFSET 0x8
#define PoS_CONTROL_REG_OFFSET 0x0
#define POS_EARLY_WR_COMP_EN 0x20
#define HNI_POS_EN 0x01
#define POS_TERMINATE_BARRIERS 0x10
#define SERIALIZE_DEV_nGnRnE_WRITES 0x200
#define ENABLE_ERR_SIGNAL_TO_MN 0x4
#define ENABLE_RESERVE_BIT53 0x400
#define ENABLE_WUO 0x10
#endif
/* reset register bit */
#define RSTRQMR_RPTOE_MASK (1 << 19)
/* secmon register offsets and bitfields */
#define SECMON_HPCOMR_OFFSET 0x4
#define SECMON_HPCOMR_NPSWAEN 0x80000000
/* Secure-Register-File register offsets and bit masks */
#ifdef NXP_RST_ADDR
/* Register Offset */
#define CORE_HOLD_OFFSET 0x140
#endif
#define DCFG_SBEESR2_ADDR 0x00100534
#define DCFG_MBEESR2_ADDR 0x00100544
/* SBEESR and MBEESR bit mask */
#define OCRAM_EESR_MASK 0x00000008
#endif /* SOC_DEFAULT_HELPER_MACROS_H */

8
plat/nxp/common/plat_make_helper/soc_common_def.mk

@ -1,4 +1,4 @@
# Copyright 2020-2021 NXP
# Copyright 2020-2022 NXP
#
# SPDX-License-Identifier: BSD-3-Clause
#
@ -11,14 +11,12 @@ $(eval CACHE_WRITEBACK_GRANULE=$(shell echo $$((1 << $(CACHE_LINE)))))
$(eval $(call add_define_val,CACHE_WRITEBACK_GRANULE,$(CACHE_WRITEBACK_GRANULE)))
endif
ifeq (${INTERCONNECT}, "CCI400")
ifneq (${INTERCONNECT},)
$(eval $(call add_define,NXP_HAS_${INTERCONNECT}))
ifeq (${INTERCONNECT}, CCI400)
ICNNCT_ID := 0x420
$(eval $(call add_define,ICNNCT_ID))
endif
ifeq (${INTERCONNECT}, "CCN508")
$(eval $(call add_define,NXP_HAS_CCN508))
endif
ifneq (${CHASSIS},)

7
plat/nxp/common/setup/ls_bl2_el3_setup.c

@ -1,5 +1,5 @@
/*
* Copyright 2018-2020 NXP
* Copyright 2018-2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*
@ -182,7 +182,7 @@ void ls_bl2_el3_plat_arch_setup(void)
unsigned int flags = 0U;
/* Initialise the IO layer and register platform IO devices */
ls_setup_page_tables(
#if SEPARATE_RW_AND_NOLOAD
#if SEPARATE_BL2_NOLOAD_REGION
BL2_START,
BL2_LIMIT - BL2_START,
#else
@ -289,8 +289,9 @@ void bl2_plat_preload_setup(void)
if ((dram_regions_info.region[0].addr == 0)
&& (dram_regions_info.total_dram_size > 0)) {
populate_dram_regions_info();
#ifdef PLAT_XLAT_TABLES_DYNAMIC
mmap_add_ddr_region_dynamically();
#endif
}
/* setup the memory region access permissions */

29
plat/nxp/common/soc_errata/errata.c

@ -1,5 +1,5 @@
/*
* Copyright 2021 NXP
* Copyright 2021-2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*
@ -19,6 +19,15 @@ void soc_errata(void)
INFO("SoC workaround for Errata A008850 Early-Phase was applied\n");
erratum_a008850_early();
#endif
#if ERRATA_SOC_A009660
INFO("SoC workaround for Errata A009660 was applied\n");
erratum_a009660();
#endif
#if ERRATA_SOC_A010539
INFO("SoC workaround for Errata A010539 was applied\n");
erratum_a010539();
#endif
/*
* The following DDR Erratas workaround are implemented in DDR driver,
* but print information here.
@ -29,4 +38,22 @@ void soc_errata(void)
#if ERRATA_DDR_A050450
INFO("SoC workaround for DDR Errata A050450 was applied\n");
#endif
#if ERRATA_DDR_A050958
INFO("SoC workaround for DDR Errata A050958 was applied\n");
#endif
#if ERRATA_DDR_A008511
INFO("SoC workaround for DDR Errata A008511 was applied\n");
#endif
#if ERRATA_DDR_A009803
INFO("SoC workaround for DDR Errata A009803 was applied\n");
#endif
#if ERRATA_DDR_A009942
INFO("SoC workaround for DDR Errata A009942 was applied\n");
#endif
#if ERRATA_DDR_A010165
INFO("SoC workaround for DDR Errata A010165 was applied\n");
#endif
#if ERRATA_DDR_A009663
INFO("SoC workaround for DDR Errata A009663 was applied\n");
#endif
}

6
plat/nxp/common/soc_errata/errata.mk

@ -1,5 +1,5 @@
#
# Copyright 2021 NXP
# Copyright 2021-2022 NXP
#
# SPDX-License-Identifier: BSD-3-Clause
#
@ -9,7 +9,9 @@
ERRATA := \
ERRATA_SOC_A050426 \
ERRATA_SOC_A008850
ERRATA_SOC_A008850 \
ERRATA_SOC_A009660 \
ERRATA_SOC_A010539
define enable_errata
$(1) ?= 0

14
plat/nxp/common/soc_errata/errata_a009660.c

@ -0,0 +1,14 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*
*/
#include <mmio.h>
#include <soc_default_base_addr.h>
void erratum_a009660(void)
{
mmio_write_32(NXP_SCFG_ADDR + 0x20c, 0x63b20042);
}

26
plat/nxp/common/soc_errata/errata_a010539.c

@ -0,0 +1,26 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*
*/
#include <mmio.h>
#include <plat_common.h>
void erratum_a010539(void)
{
if (get_boot_dev() == BOOT_DEVICE_QSPI) {
unsigned int *porsr1 = (void *)(NXP_DCFG_ADDR +
DCFG_PORSR1_OFFSET);
uint32_t val;
val = (gur_in32(porsr1) & ~PORSR1_RCW_MASK);
mmio_write_32((uint32_t)(NXP_DCSR_DCFG_ADDR +
DCFG_DCSR_PORCR1_OFFSET), htobe32(val));
/* Erratum need to set '1' to all bits for reserved SCFG register 0x1a8 */
mmio_write_32((uint32_t)(NXP_SCFG_ADDR + 0x1a8),
htobe32(0xffffffff));
}
}

10
plat/nxp/common/soc_errata/errata_list.h

@ -1,5 +1,5 @@
/*
* Copyright 2021 NXP
* Copyright 2021-2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*
@ -17,4 +17,12 @@ void erratum_a008850_early(void);
void erratum_a008850_post(void);
#endif
#ifdef ERRATA_SOC_A009660
void erratum_a009660(void);
#endif
#ifdef ERRATA_SOC_A010539
void erratum_a010539(void);
#endif
#endif /* ERRATA_LIST_H */

9
plat/nxp/common/tbbr/tbbr.mk

@ -1,5 +1,5 @@
#
# Copyright 2020 NXP
# Copyright 2020-2022 NXP
#
# SPDX-License-Identifier: BSD-3-Clause
#
@ -13,6 +13,12 @@ include $(PLAT_DRIVERS_PATH)/csu/csu.mk
CSF_FILE := input_blx_ch${CHASSIS}
BL2_CSF_FILE := input_bl2_ch${CHASSIS}
else
ifeq ($(CHASSIS), 3)
CSF_FILE := input_blx_ch${CHASSIS}
BL2_CSF_FILE := input_bl2_ch${CHASSIS}
PBI_CSF_FILE := input_pbi_ch${CHASSIS}
$(eval $(call add_define, CSF_HDR_CH3))
else
ifeq ($(CHASSIS), 3_2)
CSF_FILE := input_blx_ch3
BL2_CSF_FILE := input_bl2_ch${CHASSIS}
@ -22,6 +28,7 @@ else
$(error -> CHASSIS not set!)
endif
endif
endif
PLAT_AUTH_PATH := $(PLAT_DRIVERS_PATH)/auth

1817
plat/nxp/soc-ls1088a/aarch64/ls1088a.S

File diff suppressed because it is too large

69
plat/nxp/soc-ls1088a/aarch64/ls1088a_helpers.S

@ -0,0 +1,69 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <arch.h>
#include <asm_macros.S>
#include <platform_def.h>
.globl plat_secondary_cold_boot_setup
.globl plat_is_my_cpu_primary
.globl plat_reset_handler
.globl platform_mem_init
func platform_mem1_init
ret
endfunc platform_mem1_init
func platform_mem_init
ret
endfunc platform_mem_init
func apply_platform_errata
ret
endfunc apply_platform_errata
func plat_reset_handler
mov x29, x30
bl apply_platform_errata
#if defined(IMAGE_BL31)
ldr x0, =POLICY_SMMU_PAGESZ_64K
cbz x0, 1f
/* Set the SMMU page size in the sACR register */
bl _set_smmu_pagesz_64
#endif
1:
mov x30, x29
ret
endfunc plat_reset_handler
/*
* void plat_secondary_cold_boot_setup (void);
*
* This function performs any platform specific actions
* needed for a secondary cpu after a cold reset e.g
* mark the cpu's presence, mechanism to place it in a
* holding pen etc.
*/
func plat_secondary_cold_boot_setup
/* ls1088a does not do cold boot for secondary CPU */
cb_panic:
b cb_panic
endfunc plat_secondary_cold_boot_setup
/*
* unsigned int plat_is_my_cpu_primary (void);
*
* Find out whether the current cpu is the primary
* cpu.
*/
func plat_is_my_cpu_primary
mrs x0, mpidr_el1
and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
cmp x0, 0x0
cset w0, eq
ret
endfunc plat_is_my_cpu_primary

229
plat/nxp/soc-ls1088a/include/soc.h

@ -0,0 +1,229 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef SOC_H
#define SOC_H
/* Chassis specific defines - common across SoC's of a particular platform */
#include "dcfg_lsch3.h"
#include "soc_default_base_addr.h"
#include "soc_default_helper_macros.h"
/*
* SVR Definition of LS1088A
* A: without security
* AE: with security
* (not include major and minor rev)
*/
#define SVR_LS1044A 0x870323
#define SVR_LS1044AE 0x870322
#define SVR_LS1048A 0x870321
#define SVR_LS1048AE 0x870320
#define SVR_LS1084A 0x870303
#define SVR_LS1084AE 0x870302
#define SVR_LS1088A 0x870301
#define SVR_LS1088AE 0x870300
#define SVR_WO_E 0xFFFFFE
/* Number of cores in platform */
#define NUMBER_OF_CLUSTERS 2
#define CORES_PER_CLUSTER 4
#define PLATFORM_CORE_COUNT (NUMBER_OF_CLUSTERS * CORES_PER_CLUSTER)
/* set to 0 if the clusters are not symmetrical */
#define SYMMETRICAL_CLUSTERS 1
#define NUM_DRAM_REGIONS 2
#define NXP_DRAM0_ADDR 0x80000000
#define NXP_DRAM0_MAX_SIZE 0x80000000 /* 2 GB */
#define NXP_DRAM1_ADDR 0x8080000000
#define NXP_DRAM1_MAX_SIZE 0x7F80000000 /* 510 G */
/* DRAM0 Size defined in platform_def.h */
#define NXP_DRAM0_SIZE PLAT_DEF_DRAM0_SIZE
#define NXP_POWMGTDCR 0x700123C20
/* epu register offsets and values */
#define EPU_EPGCR_OFFSET 0x0
#define EPU_EPIMCR10_OFFSET 0x128
#define EPU_EPCTR10_OFFSET 0xa28
#define EPU_EPCCR10_OFFSET 0x828
#ifdef EPU_EPCCR10_VAL
#undef EPU_EPCCR10_VAL
#endif
#define EPU_EPCCR10_VAL 0xf2800000
#define EPU_EPIMCR10_VAL 0xba000000
#define EPU_EPCTR10_VAL 0x0
#define EPU_EPGCR_VAL (1 << 31)
/* pmu register offsets and values */
#define PMU_PCPW20SR_OFFSET 0x830
#define PMU_CLAINACTSETR_OFFSET 0x1100
#define PMU_CLAINACTCLRR_OFFSET 0x1104
#define PMU_CLSINACTSETR_OFFSET 0x1108
#define PMU_CLSINACTCLRR_OFFSET 0x110C
#define PMU_CLL2FLUSHSETR_OFFSET 0x1110
#define PMU_CLSL2FLUSHCLRR_OFFSET 0x1114
#define PMU_CLL2FLUSHSR_OFFSET 0x1118
#define PMU_POWMGTCSR_OFFSET 0x4000
#define PMU_IPPDEXPCR0_OFFSET 0x4040
#define PMU_IPPDEXPCR1_OFFSET 0x4044
#define PMU_IPPDEXPCR2_OFFSET 0x4048
#define PMU_IPPDEXPCR3_OFFSET 0x404C
#define PMU_IPPDEXPCR4_OFFSET 0x4050
#define PMU_IPPDEXPCR5_OFFSET 0x4054
#define PMU_IPSTPCR0_OFFSET 0x4120
#define PMU_IPSTPCR1_OFFSET 0x4124
#define PMU_IPSTPCR2_OFFSET 0x4128
#define PMU_IPSTPCR3_OFFSET 0x412C
#define PMU_IPSTPCR4_OFFSET 0x4130
#define PMU_IPSTPCR5_OFFSET 0x4134
#define PMU_IPSTPCR6_OFFSET 0x4138
#define PMU_IPSTPACK0_OFFSET 0x4140
#define PMU_IPSTPACK1_OFFSET 0x4144
#define PMU_IPSTPACK2_OFFSET 0x4148
#define PMU_IPSTPACK3_OFFSET 0x414C
#define PMU_IPSTPACK4_OFFSET 0x4150
#define PMU_IPSTPACK5_OFFSET 0x4154
#define PMU_IPSTPACK6_OFFSET 0x4158
#define PMU_POWMGTCSR_VAL (1 << 20)
#define IPPDEXPCR0_MASK 0xFFFFFFFF
#define IPPDEXPCR1_MASK 0xFFFFFFFF
#define IPPDEXPCR2_MASK 0xFFFFFFFF
#define IPPDEXPCR3_MASK 0xFFFFFFFF
#define IPPDEXPCR4_MASK 0xFFFFFFFF
#define IPPDEXPCR5_MASK 0xFFFFFFFF
/* DEVDISR5_FLX_TMR */
#define IPPDEXPCR_FLX_TMR 0x00004000
#define DEVDISR5_FLX_TMR 0x00004000
#define IPSTPCR0_VALUE 0x0041310C
#define IPSTPCR1_VALUE 0x000003FF
#define IPSTPCR2_VALUE 0x00013006
/* Dont' stop UART */
#define IPSTPCR3_VALUE 0x0000033A
#define IPSTPCR4_VALUE 0x00103300
#define IPSTPCR5_VALUE 0x00000001
#define IPSTPCR6_VALUE 0x00000000
#define TZPC_BLOCK_SIZE 0x1000
/* PORSR1 */
#define PORSR1_RCW_MASK 0xFF800000
#define PORSR1_RCW_SHIFT 23
/* CFG_RCW_SRC[6:0] */
#define RCW_SRC_TYPE_MASK 0x70
/* RCW SRC NOR */
#define NOR_16B_VAL 0x20
/*
* RCW SRC Serial Flash
* 1. SERAIL NOR (QSPI)
* 2. OTHERS (SD/MMC, SPI, I2C1)
*/
#define RCW_SRC_SERIAL_MASK 0x7F
#define QSPI_VAL 0x62
#define SDHC_VAL 0x40
#define EMMC_VAL 0x41
/*
* Required LS standard platform porting definitions
* for CCN-504 - Read from RN-F node ID register
*/
#define PLAT_CLUSTER_TO_CCN_ID_MAP 1, 9, 11, 19
/* Defines required for using XLAT tables from ARM common code */
#define PLAT_PHY_ADDR_SPACE_SIZE (1ULL << 40)
#define PLAT_VIRT_ADDR_SPACE_SIZE (1ULL << 40)
/*
* Clock Divisors
*/
#define NXP_PLATFORM_CLK_DIVIDER 1
#define NXP_UART_CLK_DIVIDER 2
/* dcfg register offsets and values */
#define DCFG_DEVDISR1_OFFSET 0x70
#define DCFG_DEVDISR2_OFFSET 0x74
#define DCFG_DEVDISR3_OFFSET 0x78
#define DCFG_DEVDISR5_OFFSET 0x80
#define DCFG_DEVDISR6_OFFSET 0x84
#define DCFG_DEVDISR1_SEC (1 << 22)
#define DCFG_DEVDISR3_QBMAIN (1 << 12)
#define DCFG_DEVDISR4_SPI_QSPI (1 << 4 | 1 << 5)
#define DCFG_DEVDISR5_MEM (1 << 0)
#define DEVDISR1_VALUE 0x0041310c
#define DEVDISR2_VALUE 0x000003ff
#define DEVDISR3_VALUE 0x00013006
#define DEVDISR4_VALUE 0x0000033e
#define DEVDISR5_VALUE 0x00103300
#define DEVDISR6_VALUE 0x00000001
/*
* pwr mgmt features supported in the soc-specific code:
* value == 0x0, the soc code does not support this feature
* value != 0x0, the soc code supports this feature
*/
#define SOC_CORE_RELEASE 0x1
#define SOC_CORE_RESTART 0x1
#define SOC_CORE_OFF 0x1
#define SOC_CORE_STANDBY 0x1
#define SOC_CORE_PWR_DWN 0x1
#define SOC_CLUSTER_STANDBY 0x1
#define SOC_CLUSTER_PWR_DWN 0x1
#define SOC_SYSTEM_STANDBY 0x1
#define SOC_SYSTEM_PWR_DWN 0x1
#define SOC_SYSTEM_OFF 0x1
#define SOC_SYSTEM_RESET 0x1
#define SYSTEM_PWR_DOMAINS 1
#define PLAT_NUM_PWR_DOMAINS (PLATFORM_CORE_COUNT + \
NUMBER_OF_CLUSTERS + \
SYSTEM_PWR_DOMAINS)
/* Power state coordination occurs at the system level */
#define PLAT_PD_COORD_LVL MPIDR_AFFLVL2
#define PLAT_MAX_PWR_LVL PLAT_PD_COORD_LVL
/* Local power state for power domains in Run state */
#define LS_LOCAL_STATE_RUN PSCI_LOCAL_STATE_RUN
/* define retention state */
#define PLAT_MAX_RET_STATE (PSCI_LOCAL_STATE_RUN + 1)
#define LS_LOCAL_STATE_RET PLAT_MAX_RET_STATE
/* define power-down state */
#define PLAT_MAX_OFF_STATE (PLAT_MAX_RET_STATE + 1)
#define LS_LOCAL_STATE_OFF PLAT_MAX_OFF_STATE
#ifndef __ASSEMBLER__
/* CCI slave interfaces */
static const int cci_map[] = {
3,
4,
};
void soc_init_lowlevel(void);
void soc_init_percpu(void);
void _soc_set_start_addr(unsigned long addr);
void _set_platform_security(void);
#endif
#endif /* SOC_H */

84
plat/nxp/soc-ls1088a/ls1088aqds/ddr_init.c

@ -0,0 +1,84 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <errno.h>
#include <common/debug.h>
#include <ddr.h>
#include <utils.h>
#include <errata.h>
#include <platform_def.h>
#ifdef CONFIG_STATIC_DDR
#error No static value defined
#endif
static const struct rc_timing rce[] = {
{U(1600), U(8), U(8)},
{U(1867), U(8), U(8)},
{U(2134), U(8), U(9)},
{}
};
static const struct board_timing udimm[] = {
{U(0x04), rce, U(0x01020307), U(0x08090b06)},
};
int ddr_board_options(struct ddr_info *priv)
{
int ret;
struct memctl_opt *popts = &priv->opt;
if (popts->rdimm != 0) {
debug("RDIMM parameters not set.\n");
return -EINVAL;
}
ret = cal_board_params(priv, udimm, ARRAY_SIZE(udimm));
if (ret != 0) {
return ret;
}
popts->addr_hash = 1;
popts->cpo_sample = U(0x7b);
popts->ddr_cdr1 = DDR_CDR1_DHC_EN |
DDR_CDR1_ODT(DDR_CDR_ODT_60ohm);
popts->ddr_cdr2 = DDR_CDR2_ODT(DDR_CDR_ODT_60ohm) |
DDR_CDR2_VREF_TRAIN_EN |
DDR_CDR2_VREF_RANGE_2;
return 0;
}
long long init_ddr(void)
{
int spd_addr[] = { NXP_SPD_EEPROM0 };
struct ddr_info info;
struct sysinfo sys;
long long dram_size;
zeromem(&sys, sizeof(sys));
get_clocks(&sys);
debug("platform clock %lu\n", sys.freq_platform);
debug("DDR PLL %lu\n", sys.freq_ddr_pll0);
zeromem(&info, sizeof(struct ddr_info));
info.num_ctlrs = NUM_OF_DDRC;
info.dimm_on_ctlr = DDRC_NUM_DIMM;
info.clk = get_ddr_freq(&sys, 0);
info.spd_addr = spd_addr;
info.ddr[0] = (void *)NXP_DDR_ADDR;
dram_size = dram_init(&info);
if (dram_size < 0) {
ERROR("DDR init failed.\n");
}
erratum_a008850_post();
return dram_size;
}

81
plat/nxp/soc-ls1088a/ls1088aqds/plat_def.h

@ -0,0 +1,81 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef PLAT_DEF_H
#define PLAT_DEF_H
#include <arch.h>
/*
* Required without TBBR.
* To include the defines for DDR PHY
* Images.
*/
#include <tbbr_img_def.h>
#include <policy.h>
#include <soc.h>
#define NXP_SPD_EEPROM0 0x51
#define NXP_SYSCLK_FREQ 100000000
#define NXP_DDRCLK_FREQ 100000000
/* UART related definition */
#define NXP_CONSOLE_ADDR NXP_UART_ADDR
#define NXP_CONSOLE_BAUDRATE 115200
/* Size of cacheable stacks */
#if defined(IMAGE_BL2)
#if defined(TRUSTED_BOARD_BOOT)
#define PLATFORM_STACK_SIZE 0x2000
#else
#define PLATFORM_STACK_SIZE 0x1000
#endif
#elif defined(IMAGE_BL31)
#define PLATFORM_STACK_SIZE 0x1000
#endif
#define BL2_START NXP_OCRAM_ADDR
#define BL2_LIMIT (NXP_OCRAM_ADDR + NXP_OCRAM_SIZE)
#define BL2_NOLOAD_START NXP_OCRAM_ADDR
#define BL2_NOLOAD_LIMIT BL2_BASE
/* IO defines as needed by IO driver framework */
#define MAX_IO_DEVICES 4
#define MAX_IO_BLOCK_DEVICES 1
#define MAX_IO_HANDLES 4
/*
* FIP image defines - Offset at which FIP Image would be present
* Image would include Bl31 , Bl33 and Bl32 (optional)
*/
#ifdef POLICY_FUSE_PROVISION
#define MAX_FIP_DEVICES 2
#endif
#ifndef MAX_FIP_DEVICES
#define MAX_FIP_DEVICES 1
#endif
#define BL32_IRQ_SEC_PHY_TIMER 29
#define BL31_WDOG_SEC 89
/*
* ID of the secure physical generic timer interrupt used by the BL32.
*/
#define PLAT_LS_G1S_IRQ_PROPS(grp) \
INTR_PROP_DESC(BL32_IRQ_SEC_PHY_TIMER, GIC_HIGHEST_SEC_PRIORITY, grp, \
GIC_INTR_CFG_LEVEL)
/* SGI 15 and Secure watchdog interrupts assigned to Group 0 */
#define PLAT_LS_G0_IRQ_PROPS(grp) \
INTR_PROP_DESC(BL31_WDOG_SEC, GIC_HIGHEST_SEC_PRIORITY, grp, \
GIC_INTR_CFG_EDGE), \
INTR_PROP_DESC(15, GIC_HIGHEST_SEC_PRIORITY, grp, \
GIC_INTR_CFG_LEVEL)
#endif /* PLAT_DEF_H */

28
plat/nxp/soc-ls1088a/ls1088aqds/platform.c

@ -0,0 +1,28 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <plat_common.h>
#pragma weak board_enable_povdd
#pragma weak board_disable_povdd
bool board_enable_povdd(void)
{
#ifdef CONFIG_POVDD_ENABLE
return true;
#else
return false;
#endif
}
bool board_disable_povdd(void)
{
#ifdef CONFIG_POVDD_ENABLE
return true;
#else
return false;
#endif
}

31
plat/nxp/soc-ls1088a/ls1088aqds/platform.mk

@ -0,0 +1,31 @@
#
# Copyright 2022 NXP
#
# SPDX-License-Identifier: BSD-3-Clause
#
# board-specific build parameters
BOOT_MODE ?= qspi
BOARD := ls1088aqds
# DDR Compilation Configs
NUM_OF_DDRC := 1
DDRC_NUM_DIMM := 1
DDR_ECC_EN := yes
# On-Board Flash Details
QSPI_FLASH_SZ := 0x4000000
NOR_FLASH_SZ := 0x20000000
BL2_SOURCES += ${BOARD_PATH}/ddr_init.c \
${BOARD_PATH}/platform.c
SUPPORTED_BOOT_MODE := qspi \
sd \
nor
# Adding platform board build info
include plat/nxp/common/plat_make_helper/plat_common_def.mk
# Adding SoC build info
include plat/nxp/soc-ls1088a/soc.mk

13
plat/nxp/soc-ls1088a/ls1088aqds/platform_def.h

@ -0,0 +1,13 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef PLATFORM_DEF_H
#define PLATFORM_DEF_H
#include <plat_def.h>
#include <plat_default_def.h>
#endif /* PLATFORM_DEF_H */

16
plat/nxp/soc-ls1088a/ls1088aqds/policy.h

@ -0,0 +1,16 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef POLICY_H
#define POLICY_H
/*
* Set this to 0x0 to leave the default SMMU page size in sACR
* Set this to 0x1 to change the SMMU page size to 64K
*/
#define POLICY_SMMU_PAGESZ_64K 0x1
#endif /* POLICY_H */

86
plat/nxp/soc-ls1088a/ls1088ardb/ddr_init.c

@ -0,0 +1,86 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <errno.h>
#include <common/debug.h>
#include <ddr.h>
#include <utils.h>
#include <errata.h>
#include <platform_def.h>
#ifdef CONFIG_STATIC_DDR
#error No static value defined
#endif
static const struct rc_timing rce[] = {
{U(1600), U(8), U(8)},
{U(1867), U(8), U(8)},
{U(2134), U(8), U(9)},
{}
};
static const struct board_timing udimm[] = {
{U(0x04), rce, U(0x01030508), U(0x090b0d06)},
{U(0x1f), rce, U(0x01030508), U(0x090b0d06)},
};
int ddr_board_options(struct ddr_info *priv)
{
int ret;
struct memctl_opt *popts = &priv->opt;
if (popts->rdimm != 0) {
debug("RDIMM parameters not set.\n");
return -EINVAL;
}
ret = cal_board_params(priv, udimm, ARRAY_SIZE(udimm));
if (ret != 0) {
return ret;
}
popts->addr_hash = 1;
popts->cpo_sample = U(0x7b);
popts->ddr_cdr1 = DDR_CDR1_DHC_EN |
DDR_CDR1_ODT(DDR_CDR_ODT_60ohm);
popts->ddr_cdr2 = DDR_CDR2_ODT(DDR_CDR_ODT_60ohm) |
DDR_CDR2_VREF_TRAIN_EN |
DDR_CDR2_VREF_RANGE_2;
return 0;
}
long long init_ddr(void)
{
int spd_addr[] = { NXP_SPD_EEPROM0 };
struct ddr_info info;
struct sysinfo sys;
long long dram_size;
zeromem(&sys, sizeof(sys));
get_clocks(&sys);
debug("platform clock %lu\n", sys.freq_platform);
debug("DDR PLL %lu\n", sys.freq_ddr_pll0);
zeromem(&info, sizeof(struct ddr_info));
info.num_ctlrs = NUM_OF_DDRC;
info.dimm_on_ctlr = DDRC_NUM_DIMM;
info.clk = get_ddr_freq(&sys, 0);
info.spd_addr = spd_addr;
info.ddr[0] = (void *)NXP_DDR_ADDR;
dram_size = dram_init(&info);
if (dram_size < 0) {
ERROR("DDR init failed.\n");
}
erratum_a008850_post();
return dram_size;
}

80
plat/nxp/soc-ls1088a/ls1088ardb/plat_def.h

@ -0,0 +1,80 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef PLAT_DEF_H
#define PLAT_DEF_H
#include <arch.h>
/*
* Required without TBBR.
* To include the defines for DDR PHY
* Images.
*/
#include <tbbr_img_def.h>
#include <policy.h>
#include <soc.h>
#define NXP_SPD_EEPROM0 0x51
#define NXP_SYSCLK_FREQ 100000000
#define NXP_DDRCLK_FREQ 100000000
/* UART related definition */
#define NXP_CONSOLE_ADDR NXP_UART_ADDR
#define NXP_CONSOLE_BAUDRATE 115200
/* Size of cacheable stacks */
#if defined(IMAGE_BL2)
#if defined(TRUSTED_BOARD_BOOT)
#define PLATFORM_STACK_SIZE 0x2000
#else
#define PLATFORM_STACK_SIZE 0x1000
#endif
#elif defined(IMAGE_BL31)
#define PLATFORM_STACK_SIZE 0x1000
#endif
#define BL2_START NXP_OCRAM_ADDR
#define BL2_LIMIT (NXP_OCRAM_ADDR + NXP_OCRAM_SIZE)
#define BL2_NOLOAD_START NXP_OCRAM_ADDR
#define BL2_NOLOAD_LIMIT BL2_BASE
/* IO defines as needed by IO driver framework */
#define MAX_IO_DEVICES 4
#define MAX_IO_BLOCK_DEVICES 1
#define MAX_IO_HANDLES 4
/*
* FIP image defines - Offset at which FIP Image would be present
* Image would include Bl31 , Bl33 and Bl32 (optional)
*/
#ifdef POLICY_FUSE_PROVISION
#define MAX_FIP_DEVICES 2
#endif
#ifndef MAX_FIP_DEVICES
#define MAX_FIP_DEVICES 1
#endif
#define BL32_IRQ_SEC_PHY_TIMER 29
#define BL31_WDOG_SEC 89
/*
* ID of the secure physical generic timer interrupt used by the BL32.
*/
#define PLAT_LS_G1S_IRQ_PROPS(grp) \
INTR_PROP_DESC(BL32_IRQ_SEC_PHY_TIMER, GIC_HIGHEST_SEC_PRIORITY, grp, \
GIC_INTR_CFG_LEVEL)
/* SGI 15 and Secure watchdog interrupts assigned to Group 0 */
#define PLAT_LS_G0_IRQ_PROPS(grp) \
INTR_PROP_DESC(BL31_WDOG_SEC, GIC_HIGHEST_SEC_PRIORITY, grp, \
GIC_INTR_CFG_EDGE), \
INTR_PROP_DESC(15, GIC_HIGHEST_SEC_PRIORITY, grp, \
GIC_INTR_CFG_LEVEL)
#endif /* PLAT_DEF_H */

28
plat/nxp/soc-ls1088a/ls1088ardb/platform.c

@ -0,0 +1,28 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <plat_common.h>
#pragma weak board_enable_povdd
#pragma weak board_disable_povdd
bool board_enable_povdd(void)
{
#ifdef CONFIG_POVDD_ENABLE
return true;
#else
return false;
#endif
}
bool board_disable_povdd(void)
{
#ifdef CONFIG_POVDD_ENABLE
return true;
#else
return false;
#endif
}

30
plat/nxp/soc-ls1088a/ls1088ardb/platform.mk

@ -0,0 +1,30 @@
#
# Copyright 2022 NXP
#
# SPDX-License-Identifier: BSD-3-Clause
#
# board-specific build parameters
BOOT_MODE ?= qspi
BOARD := ls1088ardb
# DDR Compilation Configs
NUM_OF_DDRC := 1
DDRC_NUM_DIMM := 1
DDR_ECC_EN := yes
# On-Board Flash Details
QSPI_FLASH_SZ := 0x4000000
# Adding Platform files build files
BL2_SOURCES += ${BOARD_PATH}/ddr_init.c \
${BOARD_PATH}/platform.c
SUPPORTED_BOOT_MODE := qspi \
sd
# Adding platform board build info
include plat/nxp/common/plat_make_helper/plat_common_def.mk
# Adding SoC build info
include plat/nxp/soc-ls1088a/soc.mk

13
plat/nxp/soc-ls1088a/ls1088ardb/platform_def.h

@ -0,0 +1,13 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef PLATFORM_DEF_H
#define PLATFORM_DEF_H
#include <plat_def.h>
#include <plat_default_def.h>
#endif /* PLATFORM_DEF_H */

15
plat/nxp/soc-ls1088a/ls1088ardb/policy.h

@ -0,0 +1,15 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef POLICY_H
#define POLICY_H
/* Set this to 0x0 to leave the default SMMU page size in sACR
* Set this to 0x1 to change the SMMU page size to 64K
*/
#define POLICY_SMMU_PAGESZ_64K 0x1
#endif /* POLICY_H */

397
plat/nxp/soc-ls1088a/soc.c

@ -0,0 +1,397 @@
/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <assert.h>
#include <arch.h>
#include <caam.h>
#include <cci.h>
#include <common/debug.h>
#include <dcfg.h>
#ifdef I2C_INIT
#include <i2c.h>
#endif
#include <lib/mmio.h>
#include <lib/xlat_tables/xlat_tables_v2.h>
#include <ls_interconnect.h>
#if TRUSTED_BOARD_BOOT
#include <nxp_smmu.h>
#endif
#include <nxp_timer.h>
#include <plat_console.h>
#include <plat_gic.h>
#include <plat_tzc400.h>
#include <pmu.h>
#if defined(NXP_SFP_ENABLED)
#include <sfp.h>
#endif
#include <errata.h>
#ifdef CONFIG_OCRAM_ECC_EN
#include <ocram.h>
#endif
#include <plat_common.h>
#include <platform_def.h>
#include <soc.h>
static unsigned char _power_domain_tree_desc[NUMBER_OF_CLUSTERS + 2];
static struct soc_type soc_list[] = {
SOC_ENTRY(LS1044A, LS1044A, 1, 4),
SOC_ENTRY(LS1044AE, LS1044AE, 1, 4),
SOC_ENTRY(LS1048A, LS1048A, 1, 4),
SOC_ENTRY(LS1048AE, LS1048AE, 1, 4),
SOC_ENTRY(LS1084A, LS1084A, 2, 4),
SOC_ENTRY(LS1084AE, LS1084AE, 2, 4),
SOC_ENTRY(LS1088A, LS1088A, 2, 4),
SOC_ENTRY(LS1088AE, LS1088AE, 2, 4),
};
static dcfg_init_info_t dcfg_init_data = {
.g_nxp_dcfg_addr = NXP_DCFG_ADDR,
.nxp_sysclk_freq = NXP_SYSCLK_FREQ,
.nxp_ddrclk_freq = NXP_DDRCLK_FREQ,
.nxp_plat_clk_divider = NXP_PLATFORM_CLK_DIVIDER,
};
/*
* This function dynamically constructs the topology according to
* SoC Flavor and returns it.
*/
const unsigned char *plat_get_power_domain_tree_desc(void)
{
unsigned int i;
uint8_t num_clusters, cores_per_cluster;
get_cluster_info(soc_list, ARRAY_SIZE(soc_list), &num_clusters, &cores_per_cluster);
/*
* The highest level is the system level. The next level is constituted
* by clusters and then cores in clusters.
*/
_power_domain_tree_desc[0] = 1;
_power_domain_tree_desc[1] = num_clusters;
for (i = 0; i < _power_domain_tree_desc[1]; i++) {
_power_domain_tree_desc[i + 2] = cores_per_cluster;
}
return _power_domain_tree_desc;
}
CASSERT(NUMBER_OF_CLUSTERS && NUMBER_OF_CLUSTERS <= 256,
assert_invalid_ls1088a_cluster_count);
/*
* This function returns the core count within the cluster corresponding to
* `mpidr`.
*/
unsigned int plat_ls_get_cluster_core_count(u_register_t mpidr)
{
return CORES_PER_CLUSTER;
}
/*
* This function returns the total number of cores in the SoC
*/
unsigned int get_tot_num_cores(void)
{
uint8_t num_clusters, cores_per_cluster;
get_cluster_info(soc_list, ARRAY_SIZE(soc_list), &num_clusters, &cores_per_cluster);
return (num_clusters * cores_per_cluster);
}
/*
* This function returns the PMU IDLE Cluster mask.
*/
unsigned int get_pmu_idle_cluster_mask(void)
{
uint8_t num_clusters, cores_per_cluster;
get_cluster_info(soc_list, ARRAY_SIZE(soc_list), &num_clusters, &cores_per_cluster);
return ((1 << num_clusters) - 2);
}
/*
* This function returns the PMU Flush Cluster mask.
*/
unsigned int get_pmu_flush_cluster_mask(void)
{
uint8_t num_clusters, cores_per_cluster;
get_cluster_info(soc_list, ARRAY_SIZE(soc_list), &num_clusters, &cores_per_cluster);
return ((1 << num_clusters) - 2);
}
/*
* This function returns the PMU IDLE Core mask.
*/
unsigned int get_pmu_idle_core_mask(void)
{
return ((1 << get_tot_num_cores()) - 2);
}
#ifdef IMAGE_BL2
void soc_bl2_prepare_exit(void)
{
#if defined(NXP_SFP_ENABLED) && defined(DISABLE_FUSE_WRITE)
set_sfp_wr_disable();
#endif
}
void soc_preload_setup(void)
{
}
/*
* This function returns the boot device based on RCW_SRC
*/
enum boot_device get_boot_dev(void)
{
enum boot_device src = BOOT_DEVICE_NONE;
uint32_t porsr1;
uint32_t rcw_src, val;
porsr1 = read_reg_porsr1();
rcw_src = (porsr1 & PORSR1_RCW_MASK) >> PORSR1_RCW_SHIFT;
/* RCW SRC NOR */
val = rcw_src & RCW_SRC_TYPE_MASK;
if (val == NOR_16B_VAL) {
src = BOOT_DEVICE_IFC_NOR;
INFO("RCW BOOT SRC is IFC NOR\n");
} else {
val = rcw_src & RCW_SRC_SERIAL_MASK;
switch (val) {
case QSPI_VAL:
src = BOOT_DEVICE_QSPI;
INFO("RCW BOOT SRC is QSPI\n");
break;
case SDHC_VAL:
src = BOOT_DEVICE_EMMC;
INFO("RCW BOOT SRC is SD/EMMC\n");
break;
case EMMC_VAL:
src = BOOT_DEVICE_EMMC;
INFO("RCW BOOT SRC is SD/EMMC\n");
break;
default:
src = BOOT_DEVICE_NONE;
}
}
return src;
}
/*
* This function sets up access permissions on memory regions
*/
void soc_mem_access(void)
{
dram_regions_info_t *info_dram_regions = get_dram_regions_info();
int i = 0;
struct tzc400_reg tzc400_reg_list[MAX_NUM_TZC_REGION];
int dram_idx, index = 1;
for (dram_idx = 0; dram_idx < info_dram_regions->num_dram_regions;
dram_idx++) {
if (info_dram_regions->region[i].size == 0) {
ERROR("DDR init failure, or");
ERROR("DRAM regions not populated correctly.\n");
break;
}
index = populate_tzc400_reg_list(tzc400_reg_list,
dram_idx, index,
info_dram_regions->region[dram_idx].addr,
info_dram_regions->region[dram_idx].size,
NXP_SECURE_DRAM_SIZE, NXP_SP_SHRD_DRAM_SIZE);
}
mem_access_setup(NXP_TZC_ADDR, index,
tzc400_reg_list);
}
/*
* This function implements soc specific erratum
* This is called before DDR is initialized or MMU is enabled
*/
void soc_early_init(void)
{
enum boot_device dev;
dram_regions_info_t *dram_regions_info = get_dram_regions_info();
#ifdef CONFIG_OCRAM_ECC_EN
ocram_init(NXP_OCRAM_ADDR, NXP_OCRAM_SIZE);
#endif
dcfg_init(&dcfg_init_data);
#if LOG_LEVEL > 0
/* Initialize the console to provide early debug support */
plat_console_init(NXP_CONSOLE_ADDR,
NXP_UART_CLK_DIVIDER, NXP_CONSOLE_BAUDRATE);
#endif
enable_timer_base_to_cluster(NXP_PMU_ADDR);
enable_core_tb(NXP_PMU_ADDR);
/*
* Use the region(NXP_SD_BLOCK_BUF_ADDR + NXP_SD_BLOCK_BUF_SIZE)
* as dma of sd
*/
dev = get_boot_dev();
if (dev == BOOT_DEVICE_EMMC) {
mmap_add_region(NXP_SD_BLOCK_BUF_ADDR, NXP_SD_BLOCK_BUF_ADDR,
NXP_SD_BLOCK_BUF_SIZE,
MT_DEVICE | MT_RW | MT_NS);
}
#if TRUSTED_BOARD_BOOT
uint32_t mode;
sfp_init(NXP_SFP_ADDR);
/*
* For secure boot disable SMMU.
* Later when platform security policy comes in picture,
* this might get modified based on the policy
*/
if (check_boot_mode_secure(&mode) == true) {
bypass_smmu(NXP_SMMU_ADDR);
}
/*
* For Mbedtls currently crypto is not supported via CAAM
* enable it when that support is there. In tbbr.mk
* the CAAM_INTEG is set as 0.
*/
#ifndef MBEDTLS_X509
/* Initialize the crypto accelerator if enabled */
if (is_sec_enabled() == false) {
INFO("SEC is disabled.\n");
} else {
sec_init(NXP_CAAM_ADDR);
}
#endif
#endif
soc_errata();
delay_timer_init(NXP_TIMER_ADDR);
i2c_init(NXP_I2C_ADDR);
dram_regions_info->total_dram_size = init_ddr();
}
#else /* !IMAGE_BL2 */
void soc_early_platform_setup2(void)
{
dcfg_init(&dcfg_init_data);
/*
* Initialize system level generic timer for Socs
*/
delay_timer_init(NXP_TIMER_ADDR);
#if LOG_LEVEL > 0
/* Initialize the console to provide early debug support */
plat_console_init(NXP_CONSOLE_ADDR,
NXP_UART_CLK_DIVIDER, NXP_CONSOLE_BAUDRATE);
#endif
}
void soc_platform_setup(void)
{
/* Initialize the GIC driver, cpu and distributor interfaces */
static uintptr_t target_mask_array[PLATFORM_CORE_COUNT];
static interrupt_prop_t ls_interrupt_props[] = {
PLAT_LS_G1S_IRQ_PROPS(INTR_GROUP1S),
PLAT_LS_G0_IRQ_PROPS(INTR_GROUP0)
};
plat_ls_gic_driver_init(NXP_GICD_ADDR, NXP_GICR_ADDR,
PLATFORM_CORE_COUNT,
ls_interrupt_props,
ARRAY_SIZE(ls_interrupt_props),
target_mask_array,
plat_core_pos);
plat_ls_gic_init();
enable_init_timer();
}
/*
* This function initializes the soc from the BL31 module
*/
void soc_init(void)
{
uint8_t num_clusters, cores_per_cluster;
/* low-level init of the soc */
soc_init_lowlevel();
_init_global_data();
soc_init_percpu();
_initialize_psci();
/*
* Initialize Interconnect for this cluster during cold boot.
* No need for locks as no other CPU is active.
*/
cci_init(NXP_CCI_ADDR, cci_map, ARRAY_SIZE(cci_map));
/*
* Enable Interconnect coherency for the primary CPU's cluster.
*/
get_cluster_info(soc_list, ARRAY_SIZE(soc_list), &num_clusters, &cores_per_cluster);
plat_ls_interconnect_enter_coherency(num_clusters);
/* set platform security policies */
_set_platform_security();
/* Initialize the crypto accelerator if enabled */
if (is_sec_enabled() == false) {
INFO("SEC is disabled.\n");
} else {
sec_init(NXP_CAAM_ADDR);
}
}
void soc_runtime_setup(void)
{
}
#endif /* IMAGE_BL2 */
/*
* Function to return the SoC SYS CLK
*/
unsigned int get_sys_clk(void)
{
return NXP_SYSCLK_FREQ;
}
/*
* Function returns the base counter frequency
* after reading the first entry at CNTFID0 (0x20 offset).
*
* Function is used by:
* 1. ARM common code for PSCI management.
* 2. ARM Generic Timer init.
*/
unsigned int plat_get_syscnt_freq2(void)
{
unsigned int counter_base_frequency;
/*
* Below register specifies the base frequency of the system counter.
* As per NXP Board Manuals:
* The system counter always works with SYS_REF_CLK/4 frequency clock.
*/
counter_base_frequency = mmio_read_32(NXP_TIMER_ADDR + CNTFID_OFF);
return counter_base_frequency;
}

87
plat/nxp/soc-ls1088a/soc.def

@ -0,0 +1,87 @@
#
# Copyright 2022 NXP
#
# SPDX-License-Identifier: BSD-3-Clause
#
#
#------------------------------------------------------------------------------
#
# This file contains the basic architecture definitions that drive the build
#
# -----------------------------------------------------------------------------
CORE_TYPE := a53
CACHE_LINE := 6
# Set to GIC400 or GIC500
GIC := GIC500
# Set to CCI400 or CCN504 or CCN508
INTERCONNECT := CCI400
# Select the DDR PHY generation to be used
PLAT_DDR_PHY := PHY_GEN1
PHYS_SYS := 64
# Indicate layerscape chassis level - set to 3=LSCH3 or 2=LSCH2
CHASSIS := 3
# TZC IP Details TZC used is TZC380 or TZC400
TZC_ID := TZC400
# CONSOLE Details available is NS16550 or PL011
CONSOLE := NS16550
NXP_SFP_VER := 3_4
# In IMAGE_BL2, compile time flag for handling Cache coherency
# with CAAM for BL2 running from OCRAM
SEC_MEM_NON_COHERENT := yes
# OCRAM MAP for BL2
# Before BL2
# 0x18000000 - 0x18009fff -> Used by ROM code, (TBD - can it be used for xlat tables)
# 0x1800a000 - 0x1801Cfff -> Reserved for BL2 binary (76 KB)
# 0x1801D000 - 0x1801ffff -> CSF header for BL2 (12 KB)
OCRAM_START_ADDR := 0x18000000
OCRAM_SIZE := 0x20000
CSF_HDR_SZ := 0x3000
# Area of OCRAM reserved by ROM code
NXP_ROM_RSVD := 0xa000
# Input to CST create_hdr_isbc tool
BL2_HDR_LOC := 0x1801D000
# Location of BL2 on OCRAM
# BL2_BASE=OCRAM_START_ADDR+NXP_ROM_RSVD
BL2_BASE := 0x1800a000
# SoC ERRATUM to be enabled
ERRATA_SOC_A008850 := 1
# ARM Erratum
ERRATA_A53_855873 := 1
# DDR Erratum
ERRATA_DDR_A008511 := 1
ERRATA_DDR_A009803 := 1
ERRATA_DDR_A009942 := 1
ERRATA_DDR_A010165 := 1
# Define Endianness of each module
NXP_ESDHC_ENDIANNESS := LE
NXP_SFP_ENDIANNESS := LE
NXP_GPIO_ENDIANNESS := LE
NXP_SNVS_ENDIANNESS := LE
NXP_GUR_ENDIANNESS := LE
NXP_SEC_ENDIANNESS := LE
NXP_DDR_ENDIANNESS := LE
NXP_QSPI_ENDIANNESS := LE
# OCRAM ECC Enabled
OCRAM_ECC_EN := yes

110
plat/nxp/soc-ls1088a/soc.mk

@ -0,0 +1,110 @@
#
# Copyright 2022 NXP
#
# SPDX-License-Identifier: BSD-3-Clause
#
# SoC-specific build parameters
SOC := ls1088a
PLAT_PATH := plat/nxp
PLAT_COMMON_PATH:= plat/nxp/common
PLAT_DRIVERS_PATH:= drivers/nxp
PLAT_SOC_PATH := ${PLAT_PATH}/soc-${SOC}
BOARD_PATH := ${PLAT_SOC_PATH}/${BOARD}
# Separate BL2 NOLOAD region (.bss, stack, page tables). need to
# define BL2_NOLOAD_START and BL2_NOLOAD_LIMIT
SEPARATE_BL2_NOLOAD_REGION := 1
# get SoC-specific defnitions
include ${PLAT_SOC_PATH}/soc.def
include ${PLAT_COMMON_PATH}/plat_make_helper/soc_common_def.mk
include ${PLAT_COMMON_PATH}/plat_make_helper/plat_build_macros.mk
# For Security Features
DISABLE_FUSE_WRITE := 1
ifeq (${TRUSTED_BOARD_BOOT}, 1)
ifeq (${GENERATE_COT},1)
# Save Keys to be used by DDR FIP image
SAVE_KEYS=1
endif
$(eval $(call SET_NXP_MAKE_FLAG,SMMU_NEEDED,BL2))
$(eval $(call SET_NXP_MAKE_FLAG,SFP_NEEDED,BL2))
$(eval $(call SET_NXP_MAKE_FLAG,SNVS_NEEDED,BL2))
# Used by create_pbl tool to
# create bl2_<boot_mode>_sec.pbl image
SECURE_BOOT := yes
endif
$(eval $(call SET_NXP_MAKE_FLAG,CRYPTO_NEEDED,BL_COMM))
# Selecting Drivers for SoC
$(eval $(call SET_NXP_MAKE_FLAG,DCFG_NEEDED,BL_COMM))
$(eval $(call SET_NXP_MAKE_FLAG,TIMER_NEEDED,BL_COMM))
$(eval $(call SET_NXP_MAKE_FLAG,INTERCONNECT_NEEDED,BL_COMM))
$(eval $(call SET_NXP_MAKE_FLAG,GIC_NEEDED,BL31))
$(eval $(call SET_NXP_MAKE_FLAG,CONSOLE_NEEDED,BL_COMM))
$(eval $(call SET_NXP_MAKE_FLAG,PMU_NEEDED,BL_COMM))
$(eval $(call SET_NXP_MAKE_FLAG,DDR_DRIVER_NEEDED,BL2))
$(eval $(call SET_NXP_MAKE_FLAG,TZASC_NEEDED,BL2))
$(eval $(call SET_NXP_MAKE_FLAG,I2C_NEEDED,BL2))
$(eval $(call SET_NXP_MAKE_FLAG,IMG_LOADR_NEEDED,BL2))
# Selecting PSCI & SIP_SVC support
$(eval $(call SET_NXP_MAKE_FLAG,PSCI_NEEDED,BL31))
$(eval $(call SET_NXP_MAKE_FLAG,SIPSVC_NEEDED,BL31))
# Adding SoC specific files
include ${PLAT_COMMON_PATH}/soc_errata/errata.mk
PLAT_INCLUDES += -I${PLAT_COMMON_PATH}/include/default\
-I${BOARD_PATH}\
-I${PLAT_COMMON_PATH}/include/default/ch_${CHASSIS}\
-I${PLAT_COMMON_PATH}/soc_errata\
-I${PLAT_COMMON_PATH}/include\
-I${PLAT_SOC_PATH}/include
ifeq (${SECURE_BOOT},yes)
include ${PLAT_COMMON_PATH}/tbbr/tbbr.mk
endif
ifeq (${PSCI_NEEDED}, yes)
include ${PLAT_COMMON_PATH}/psci/psci.mk
endif
ifeq (${SIPSVC_NEEDED}, yes)
include ${PLAT_COMMON_PATH}/sip_svc/sipsvc.mk
endif
# for fuse-fip & fuse-programming
ifeq (${FUSE_PROG}, 1)
include ${PLAT_COMMON_PATH}/fip_handler/fuse_fip/fuse.mk
endif
ifeq (${IMG_LOADR_NEEDED},yes)
include $(PLAT_COMMON_PATH)/img_loadr/img_loadr.mk
endif
# Adding source files for the above selected drivers.
include ${PLAT_DRIVERS_PATH}/drivers.mk
PLAT_BL_COMMON_SOURCES += ${PLAT_COMMON_PATH}/$(ARCH)/ls_helpers.S\
${PLAT_SOC_PATH}/${ARCH}/${SOC}_helpers.S\
${PLAT_SOC_PATH}/soc.c
BL31_SOURCES += ${PLAT_SOC_PATH}/$(ARCH)/${SOC}.S\
${PSCI_SOURCES}\
${SIPSVC_SOURCES}\
${PLAT_COMMON_PATH}/$(ARCH)/bl31_data.S
ifeq (${TEST_BL31}, 1)
BL31_SOURCES += ${PLAT_SOC_PATH}/$(ARCH)/bootmain64.S \
${PLAT_SOC_PATH}/$(ARCH)/nonboot64.S
endif
BL2_SOURCES += ${DDR_CNTLR_SOURCES}\
${TBBR_SOURCES}\
${FUSE_SOURCES}
# Adding TFA setup files
include ${PLAT_PATH}/common/setup/common.mk

7
plat/nxp/soc-lx2160a/soc.def

@ -1,6 +1,6 @@
#
# Copyright (c) 2015, 2016 Freescale Semiconductor, Inc.
# Copyright 2017-2020 NXP Semiconductors
# Copyright 2017-2022 NXP Semiconductors
#
# SPDX-License-Identifier: BSD-3-Clause
#
@ -107,5 +107,10 @@ ERRATA_A72_859971 := 1
# SoC Errata
ERRATA_SOC_A050426 := 1
# DDR Errata
ERRATA_DDR_A011396 := 1
ERRATA_DDR_A050450 := 1
ERRATA_DDR_A050958 := 1
# enable dynamic memory mapping
PLAT_XLAT_TABLES_DYNAMIC := 1

6
tools/nxp/create_pbl/create_pbl.c

@ -1,5 +1,5 @@
/*
* Copyright 2021 NXP
* Copyright 2021-2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*
@ -507,7 +507,9 @@ int add_boot_ptr_cmd(FILE *fp_rcw_pbi_op)
}
}
printf("\nBoot Location Pointer= %x\n", BYTE_SWAP_32(pblimg.ep));
printf("\nBoot Location Pointer= 0x%x\n",
pblimg.chassis == CHASSIS_2 ? BYTE_SWAP_32(pblimg.ep) :
pblimg.ep);
ret = SUCCESS;
bootptr_err:

4
tools/nxp/create_pbl/pbl_ch3.mk

@ -1,5 +1,5 @@
#
# Copyright 2018-2020 NXP
# Copyright 2018-2022 NXP
#
# SPDX-License-Identifier: BSD-3-Clause
#
@ -63,7 +63,7 @@ else
-o ${BUILD_PLAT}/bl2_${BOOT_MODE}.pbl -f ${BL2_SRC_OFFSET};
# Append the bl2.bin to the RCW image
@echo "bl2_loc is ${bl2_offset}"
@echo "bl2_loc is ${bl2_loc} KB"
dd if=${BUILD_PLAT}/bl2.bin of=${BUILD_PLAT}/bl2_${BOOT_MODE}.pbl bs=1K seek=${bl2_loc}
cd ${CREATE_PBL_TOOL_PATH}; ${MAKE} clean ; cd -;

Loading…
Cancel
Save