aboutsummaryrefslogtreecommitdiff
path: root/product/sgm775
diff options
context:
space:
mode:
authorRonald Cron <ronald.cron@arm.com>2018-06-05 09:31:39 +0200
committerRonald Cron <ronald.cron@arm.com>2018-06-08 11:46:47 +0200
commitb151958dbb2f37383f4d9a1f7802c36008d9fef2 (patch)
treefe20ebfb8c10facbfd028edefe601462ae3ee64c /product/sgm775
parentfd3027b6fd17a4a33a685adb73f2acfcae9a2ced (diff)
Add support for SGM-775
Co-authored-by: Filipe Rinaldi <filipe.rinaldi@arm.com> Co-authored-by: Paul Beesley <paul.beesley@arm.com> Co-authored-by: Chris Kay <chris.kay@arm.com> Co-authored-by: Elieva Pignat <elieva.pignat@arm.com> Co-authored-by: Pedro Custodio <pedro.krewinkelcustodio@arm.com> Change-Id: Ic7524ad58a7c15d5b055e88a9719b2feee437f1d Signed-off-by: Ronald Cron <ronald.cron@arm.com>
Diffstat (limited to 'product/sgm775')
-rw-r--r--product/sgm775/include/fmw_cmsis.h30
-rw-r--r--product/sgm775/include/sgm775_core.h15
-rw-r--r--product/sgm775/include/sgm775_irq.h178
-rw-r--r--product/sgm775/include/sgm775_mhu.h21
-rw-r--r--product/sgm775/include/sgm775_mmap.h101
-rw-r--r--product/sgm775/include/sgm775_mmap_scp.h19
-rw-r--r--product/sgm775/include/sgm775_pik.h29
-rw-r--r--product/sgm775/include/sgm775_pik_cpu.h145
-rw-r--r--product/sgm775/include/sgm775_pik_debug.h49
-rw-r--r--product/sgm775/include/sgm775_pik_dpu.h51
-rw-r--r--product/sgm775/include/sgm775_pik_gpu.h45
-rw-r--r--product/sgm775/include/sgm775_pik_scp.h63
-rw-r--r--product/sgm775/include/sgm775_pik_system.h69
-rw-r--r--product/sgm775/include/sgm775_pik_vpu.h43
-rw-r--r--product/sgm775/include/sgm775_scmi.h29
-rw-r--r--product/sgm775/include/sgm775_sds.h149
-rw-r--r--product/sgm775/include/sgm775_ssc.h42
-rw-r--r--product/sgm775/include/software_mmap.h128
-rw-r--r--product/sgm775/include/system_clock.h28
-rw-r--r--product/sgm775/include/system_mmap.h61
-rw-r--r--product/sgm775/include/system_mmap_scp.h21
-rw-r--r--product/sgm775/module/sgm775_system/include/mod_sgm775_system.h44
-rw-r--r--product/sgm775/module/sgm775_system/src/Makefile11
-rw-r--r--product/sgm775/module/sgm775_system/src/mod_sgm775_system.c59
-rw-r--r--product/sgm775/product.mk10
-rw-r--r--product/sgm775/scp_ramfw/RTX_Config.h56
-rw-r--r--product/sgm775/scp_ramfw/clock_devices.h26
-rw-r--r--product/sgm775/scp_ramfw/config_clock.c119
-rw-r--r--product/sgm775/scp_ramfw/config_css_clock.c302
-rw-r--r--product/sgm775/scp_ramfw/config_ddr_phy500.c63
-rw-r--r--product/sgm775/scp_ramfw/config_dmc500.c221
-rw-r--r--product/sgm775/scp_ramfw/config_dvfs.c129
-rw-r--r--product/sgm775/scp_ramfw/config_dvfs.h18
-rw-r--r--product/sgm775/scp_ramfw/config_log.c63
-rw-r--r--product/sgm775/scp_ramfw/config_mhu.c54
-rw-r--r--product/sgm775/scp_ramfw/config_mock_psu.c52
-rw-r--r--product/sgm775/scp_ramfw/config_pik_clock.c295
-rw-r--r--product/sgm775/scp_ramfw/config_power_domain.c258
-rw-r--r--product/sgm775/scp_ramfw/config_power_domain.h21
-rw-r--r--product/sgm775/scp_ramfw/config_ppu_v0.c92
-rw-r--r--product/sgm775/scp_ramfw/config_ppu_v0.h22
-rw-r--r--product/sgm775/scp_ramfw/config_ppu_v1.c105
-rw-r--r--product/sgm775/scp_ramfw/config_psu.c58
-rw-r--r--product/sgm775/scp_ramfw/config_scmi.c77
-rw-r--r--product/sgm775/scp_ramfw/config_scmi_apcore.c31
-rw-r--r--product/sgm775/scp_ramfw/config_scmi_clock.c70
-rw-r--r--product/sgm775/scp_ramfw/config_scmi_perf.c44
-rw-r--r--product/sgm775/scp_ramfw/config_scmi_system_power.c19
-rw-r--r--product/sgm775/scp_ramfw/config_sds.c64
-rw-r--r--product/sgm775/scp_ramfw/config_sensor.c74
-rw-r--r--product/sgm775/scp_ramfw/config_smt.c78
-rw-r--r--product/sgm775/scp_ramfw/config_system_pll.c118
-rw-r--r--product/sgm775/scp_ramfw/config_system_power.c62
-rw-r--r--product/sgm775/scp_ramfw/config_timer.c71
-rw-r--r--product/sgm775/scp_ramfw/firmware.mk72
-rw-r--r--product/sgm775/scp_ramfw/fmw_memory.ld.S21
-rw-r--r--product/sgm775/scp_ramfw/rtx_config.c79
-rw-r--r--product/sgm775/scp_romfw/clock_devices.h28
-rw-r--r--product/sgm775/scp_romfw/config_bootloader.c26
-rw-r--r--product/sgm775/scp_romfw/config_clock.c126
-rw-r--r--product/sgm775/scp_romfw/config_css_clock.c134
-rw-r--r--product/sgm775/scp_romfw/config_log.c63
-rw-r--r--product/sgm775/scp_romfw/config_msys_rom.c24
-rw-r--r--product/sgm775/scp_romfw/config_pik_clock.c306
-rw-r--r--product/sgm775/scp_romfw/config_ppu_v0.c48
-rw-r--r--product/sgm775/scp_romfw/config_ppu_v1.c59
-rw-r--r--product/sgm775/scp_romfw/config_sds.c122
-rw-r--r--product/sgm775/scp_romfw/config_system_pll.c91
-rw-r--r--product/sgm775/scp_romfw/config_timer.c68
-rw-r--r--product/sgm775/scp_romfw/firmware.mk38
-rw-r--r--product/sgm775/scp_romfw/fmw_memory.ld.S36
-rw-r--r--product/sgm775/src/sgm775_core.c14
72 files changed, 5457 insertions, 0 deletions
diff --git a/product/sgm775/include/fmw_cmsis.h b/product/sgm775/include/fmw_cmsis.h
new file mode 100644
index 00000000..8cf22ddd
--- /dev/null
+++ b/product/sgm775/include/fmw_cmsis.h
@@ -0,0 +1,30 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef FMW_CMSIS_H
+#define FMW_CMSIS_H
+
+#define __CHECK_DEVICE_DEFINES
+#define __CM3_REV 0x0201
+#define __MPU_PRESENT 1
+#define __NVIC_PRIO_BITS 3
+#define __Vendor_SysTickConfig 0
+
+typedef enum IRQn {
+ NonMaskableInt_IRQn = -14,
+ MemoryManagement_IRQn = -12,
+ BusFault_IRQn = -11,
+ UsageFault_IRQn = -10,
+ SVCall_IRQn = -5,
+ DebugMonitor_IRQn = -4,
+ PendSV_IRQn = -2,
+ SysTick_IRQn = -1,
+} IRQn_Type;
+
+#include <core_cm3.h>
+
+#endif /* FMW_CMSIS_H */
diff --git a/product/sgm775/include/sgm775_core.h b/product/sgm775/include/sgm775_core.h
new file mode 100644
index 00000000..afa59509
--- /dev/null
+++ b/product/sgm775/include/sgm775_core.h
@@ -0,0 +1,15 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef SGM775_CORE_H
+#define SGM775_CORE_H
+
+#define SGM775_CORE_PER_CLUSTER_MAX 8
+
+unsigned int sgm775_core_get_count(void);
+
+#endif /* SGM775_CORE_H */
diff --git a/product/sgm775/include/sgm775_irq.h b/product/sgm775/include/sgm775_irq.h
new file mode 100644
index 00000000..fbbe92e7
--- /dev/null
+++ b/product/sgm775/include/sgm775_irq.h
@@ -0,0 +1,178 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef SGM775_IRQ_H
+#define SGM775_IRQ_H
+
+#include <fwk_interrupt.h>
+
+#define WDOG_IRQ FWK_INTERRUPT_NMI /* SCP Watchdog (SP805) */
+
+enum sgm775_irq {
+ TIM32KHZ_IRQ = 0, /* 32KHz Physical Timer */
+ CDBG_PWR_UP_REQ_IRQ = 1, /* Coresight Debug Power Request */
+ CSYS_PWR_UP_REQ_IRQ = 2, /* Coresight System Power Request */
+ CDBG_RST_REQ_IRQ = 3, /* Coresight Debug Reset Request */
+ GIC_EXT_WAKEUP_IRQ = 4, /* External GIC Wakeup Request */
+ RESERVED5_IRQ = 5, /* Reserved */
+ RESERVED6_IRQ = 6, /* Reserved */
+ RESERVED7_IRQ = 7, /* Reserved */
+ RESERVED8_IRQ = 8, /* Reserved */
+ RESERVED9_IRQ = 9, /* Reserved */
+ RESERVED10_IRQ = 10, /* Reserved */
+ RESERVED11_IRQ = 11, /* Reserved */
+ RESERVED12_IRQ = 12, /* Reserved */
+ RESERVED13_IRQ = 13, /* Reserved */
+ RESERVED14_IRQ = 14, /* Reserved */
+ RESERVED15_IRQ = 15, /* Reserved */
+ SOC_WAKEUP0_IRQ = 16, /* SoC Expansion Wakeup */
+ SOC_WAKEUP1_IRQ = 17, /* SoC Expansion Wakeup */
+ SOC_WAKEUP2_IRQ = 18, /* SoC Expansion Wakeup */
+ SOC_WAKEUP3_IRQ = 19, /* SoC Expansion Wakeup */
+ SOC_WAKEUP4_IRQ = 20, /* SoC Expansion Wakeup */
+ SOC_WAKEUP5_IRQ = 21, /* SoC Expansion Wakeup */
+ SOC_WAKEUP6_IRQ = 22, /* SoC Expansion Wakeup */
+ SOC_WAKEUP7_IRQ = 23, /* SoC Expansion Wakeup */
+ SOC_WAKEUP8_IRQ = 24, /* SoC Expansion Wakeup */
+ SOC_WAKEUP9_IRQ = 25, /* SoC Expansion Wakeup */
+ SOC_WAKEUP10_IRQ = 26, /* SoC Expansion Wakeup */
+ SOC_WAKEUP11_IRQ = 27, /* SoC Expansion Wakeup */
+ SOC_WAKEUP12_IRQ = 28, /* SoC Expansion Wakeup */
+ SOC_WAKEUP13_IRQ = 29, /* SoC Expansion Wakeup */
+ SOC_WAKEUP14_IRQ = 30, /* SoC Expansion Wakeup */
+ SOC_WAKEUP15_IRQ = 31, /* SoC Expansion Wakeup */
+ PPU_SCP_IRQ = 32, /* SCP Power Policy Unit */
+ TIMREFCLK_IRQ = 33, /* REFCLK Physical Timer */
+ MHU_HIGH_PRIO_IRQ = 34, /* MHU High Priority */
+ MHU_LOW_PRIO_IRQ = 35, /* MHU Low Priority */
+ MHU_SECURE_IRQ = 36, /* MHU Secure */
+ CTI_TRIGGER0_IRQ = 37, /* SCP CTI Trigger */
+ CTI_TRIGGER1_IRQ = 38, /* SCP CTI Trigger */
+ GIC_ERROR_ECC_IRQ = 39, /* GIC Error (ECC Fatal) */
+ GIC_ERROR_AXIM_IRQ = 40, /* GIC Error (AXIM) */
+ DMC_RESERVED0_IRQ = 41, /* DMC, Reserved */
+ DMC_0_ERROR_ECC_IRQ = 42, /* DMC0 Combined ECC Error */
+ DMC_0_ERROR_ACCESS_IRQ = 43, /* DMC0 Combined Misc Access Error */
+ DMC_RESERVED1_IRQ = 44, /* DMC, Reserved */
+ DMC_RESERVED2_IRQ = 45, /* DMC, Reserved */
+ DMC_1_ERROR_ECC_IRQ = 46, /* DMC1 Combined ECC Error */
+ DMC_1_ERROR_ACCESS_IRQ = 47, /* DMC1 Combined Misc Access Error */
+ DMC_RESERVED3_IRQ = 48, /* DMC, Reserved */
+ DMC_RESERVED4_IRQ = 49, /* DMC, Reserved */
+ DMC_2_ERROR_ECC_IRQ = 50, /* DMC2 Combined ECC Error */
+ DMC_2_ERROR_ACCESS_IRQ = 51, /* DMC2 Combined Misc Access Error */
+ DMC_RESERVED5_IRQ = 52, /* DMC, Reserved */
+ DMC_RESERVED6_IRQ = 53, /* DMC, Reserved */
+ DMC_3_ERROR_ECC_IRQ = 54, /* DMC3 Combined ECC Error */
+ DMC_3_ERROR_ACCESS_IRQ = 55, /* DMC3 Combined Misc Access Error */
+ DMC_RESERVED7_IRQ = 56, /* DMC, Reserved */
+ RESERVED57_IRQ = 57, /* Reserved */
+ RESERVED58_IRQ = 58, /* Reserved */
+ RESERVED59_IRQ = 59, /* Reserved */
+ RESERVED60_IRQ = 60, /* Reserved */
+ RESERVED61_IRQ = 61, /* Reserved */
+ RESERVED62_IRQ = 62, /* Reserved */
+ RESERVED63_IRQ = 63, /* Reserved */
+ PPU_CLUS0CORE0_IRQ = 64, /* Cluster 0 Core 0 Power Policy Unit */
+ PPU_CLUS0CORE1_IRQ = 65, /* Cluster 0 Core 1 Power Policy Unit */
+ PPU_CLUS0CORE2_IRQ = 66, /* Cluster 0 Core 2 Power Policy Unit */
+ PPU_CLUS0CORE3_IRQ = 67, /* Cluster 0 Core 3 Power Policy Unit */
+ PPU_CLUS0_IRQ = 68, /* Cluster 0 Power Policy Unit */
+ PPU_CLUS1CORE0_IRQ = 69, /* Cluster 1 Core 0 Power Policy Unit */
+ PPU_CLUS1CORE1_IRQ = 70, /* Cluster 1 Core 1 Power Policy Unit */
+ PPU_CLUS1CORE2_IRQ = 71, /* Cluster 1 Core 2 Power Policy Unit */
+ PPU_CLUS1CORE3_IRQ = 72, /* Cluster 1 Core 3 Power Policy Unit */
+ PPU_CLUS1_IRQ = 73, /* Cluster 1 Power Policy Unit */
+ PPU_SYS0_IRQ = 74, /* System Power Policy Unit 0 */
+ PPU_SYS1_IRQ = 75, /* System Power Policy Unit 1 */
+ PPU_GPU_IRQ = 76, /* GPU Power Policy Unit */
+ PPU_VPU_IRQ = 77, /* Video Power Policy Unit */
+ RESERVED78_IRQ = 78, /* Reserved */
+ PPU_DPU0_IRQ = 79, /* Display Power Policy Unit 0 */
+ PPU_DPU1_IRQ = 80, /* Display Power Policy Unit 1 */
+ PPU_DEBUG_IRQ = 81, /* DBGSYS Power Policy Unit */
+ RESERVED82_IRQ = 82, /* Reserved */
+ RESERVED83_IRQ = 83, /* Reserved */
+ RESERVED84_IRQ = 84, /* Reserved */
+ RESERVED85_IRQ = 85, /* Reserved */
+ RESERVED86_IRQ = 86, /* Reserved */
+ RESERVED87_IRQ = 87, /* Reserved */
+ RESERVED88_IRQ = 88, /* Reserved */
+ RESERVED89_IRQ = 89, /* Reserved */
+ PPU_CLUS0CORE4_IRQ = 90, /* Cluster 0 Core 4 Power Policy Unit */
+ PPU_CLUS0CORE5_IRQ = 91, /* Cluster 0 Core 5 Power Policy Unit */
+ PPU_CLUS0CORE6_IRQ = 92, /* Cluster 0 Core 6 Power Policy Unit */
+ PPU_CLUS0CORE7_IRQ = 93, /* Cluster 0 Core 7 Power Policy Unit */
+ PPU_CLUS1CORE4_IRQ = 94, /* Cluster 1 Core 4 Power Policy Unit */
+ PPU_CLUS1CORE5_IRQ = 95, /* Cluster 1 Core 5 Power Policy Unit */
+ PPU_CLUS1CORE6_IRQ = 96, /* Cluster 1 Core 6 Power Policy Unit */
+ PPU_CLUS1CORE7_IRQ = 97, /* Cluster 1 Core 7 Power Policy Unit */
+ PLL_CLUS0_LOCK_IRQ = 98, /* Cluster 0 CPU PLL Lock */
+ PLL_CLUS1_LOCK_IRQ = 99, /* Cluster 1 CPU PLL Lock */
+ PLL_GPU_LOCK_IRQ = 100, /* GPU PLL Lock */
+ PLL_VPU_LOCK_IRQ = 101, /* Video PLL Lock */
+ PLL_SYS_LOCK_IRQ = 102, /* System PLL Lock */
+ PLL_DPU_LOCK_IRQ = 103, /* Display PLL Lock */
+ PLL_CLUS0CORE0_IRQ = 104, /* Cluster 0 PLL0 Lock */
+ PLL_CLUS0CORE1_IRQ = 105, /* Cluster 0 PLL1 Lock */
+ PLL_CLUS0CORE2_IRQ = 106, /* Cluster 0 PLL2 Lock */
+ PLL_CLUS0CORE3_IRQ = 107, /* Cluster 0 PLL3 Lock */
+ PLL_CLUS0CORE4_IRQ = 108, /* Cluster 0 PLL4 Lock */
+ PLL_CLUS0CORE5_IRQ = 109, /* Cluster 0 PLL5 Lock */
+ PLL_CLUS0CORE6_IRQ = 110, /* Cluster 0 PLL6 Lock */
+ PLL_CLUS0CORE7_IRQ = 111, /* Cluster 0 PLL7 Lock */
+ PLL_CLUS1CORE0_IRQ = 112, /* Cluster 1 PLL0 Lock */
+ PLL_CLUS1CORE1_IRQ = 113, /* Cluster 1 PLL1 Lock */
+ PLL_CLUS1CORE2_IRQ = 114, /* Cluster 1 PLL2 Lock */
+ PLL_CLUS1CORE3_IRQ = 115, /* Cluster 1 PLL3 Lock */
+ PLL_CLUS1CORE4_IRQ = 116, /* Cluster 1 PLL4 Lock */
+ PLL_CLUS1CORE5_IRQ = 117, /* Cluster 1 PLL5 Lock */
+ PLL_CLUS1CORE6_IRQ = 118, /* Cluster 1 PLL6 Lock */
+ PLL_CLUS1CORE7_IRQ = 119, /* Cluster 1 PLL7 Lock */
+ RESERVED120_IRQ = 120, /* Reserved */
+ RESERVED121_IRQ = 121, /* Reserved */
+ RESERVED122_IRQ = 122, /* Reserved */
+ RESERVED123_IRQ = 123, /* Reserved */
+ RESERVED124_IRQ = 124, /* Reserved */
+ RESERVED125_IRQ = 125, /* Reserved */
+ RESERVED126_IRQ = 126, /* Reserved */
+ RESERVED127_IRQ = 127, /* Reserved */
+ SCP_EXT_INTR0_IRQ = 128, /* SCP Customer Extension */
+ SCP_EXT_INTR1_IRQ = 129, /* SCP Customer Extension */
+ SCP_EXT_INTR2_IRQ = 130, /* SCP Customer Extension */
+ SCP_EXT_INTR3_IRQ = 131, /* SCP Customer Extension */
+ SCP_EXT_INTR4_IRQ = 132, /* SCP Customer Extension */
+ SCP_EXT_INTR5_IRQ = 133, /* SCP Customer Extension */
+ SCP_EXT_INTR6_IRQ = 134, /* SCP Customer Extension */
+ SCP_EXT_INTR7_IRQ = 135, /* SCP Customer Extension */
+ SCP_EXT_INTR8_IRQ = 136, /* SCP Customer Extension */
+ SCP_EXT_INTR9_IRQ = 137, /* SCP Customer Extension */
+ SCP_EXT_INTR10_IRQ = 138, /* SCP Customer Extension */
+ SCP_EXT_INTR11_IRQ = 139, /* SCP Customer Extension */
+ SCP_EXT_INTR12_IRQ = 140, /* SCP Customer Extension */
+ SCP_EXT_INTR13_IRQ = 141, /* SCP Customer Extension */
+ SCP_EXT_INTR14_IRQ = 142, /* SCP Customer Extension */
+ SCP_EXT_INTR15_IRQ = 143, /* SCP Customer Extension */
+ SCP_EXT_INTR16_IRQ = 144, /* SCP Customer Extension */
+ SCP_EXT_INTR17_IRQ = 145, /* SCP Customer Extension */
+ SCP_EXT_INTR18_IRQ = 146, /* SCP Customer Extension */
+ SCP_EXT_INTR19_IRQ = 147, /* SCP Customer Extension */
+ SCP_EXT_INTR20_IRQ = 148, /* SCP Customer Extension */
+ SCP_EXT_INTR21_IRQ = 149, /* SCP Customer Extension */
+ SCP_EXT_INTR22_IRQ = 150, /* SCP Customer Extension */
+ SCP_EXT_INTR23_IRQ = 151, /* SCP Customer Extension */
+ SCP_EXT_INTR24_IRQ = 152, /* SCP Customer Extension */
+ SCP_EXT_INTR25_IRQ = 153, /* SCP Customer Extension */
+ SCP_EXT_INTR26_IRQ = 154, /* SCP Customer Extension */
+ SCP_EXT_INTR27_IRQ = 155, /* SCP Customer Extension */
+ SCP_EXT_INTR28_IRQ = 156, /* SCP Customer Extension */
+ SCP_EXT_INTR29_IRQ = 157, /* SCP Customer Extension */
+ SCP_EXT_INTR30_IRQ = 158, /* SCP Customer Extension */
+ SCP_EXT_INTR31_IRQ = 159, /* SCP Customer Extension */
+};
+
+#endif /* SGM775_IRQ_H */
diff --git a/product/sgm775/include/sgm775_mhu.h b/product/sgm775/include/sgm775_mhu.h
new file mode 100644
index 00000000..8cdc4dd0
--- /dev/null
+++ b/product/sgm775/include/sgm775_mhu.h
@@ -0,0 +1,21 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Description:
+ * MHU module device indexes.
+ */
+
+#ifndef SGM775_MHU_H
+#define SGM775_MHU_H
+
+enum sgm775_mhu_device_idx {
+ SGM775_MHU_DEVICE_IDX_S,
+ SGM775_MHU_DEVICE_IDX_NS_H,
+ SGM775_MHU_DEVICE_IDX_NS_L,
+ SGM775_MHU_DEVICE_IDX_COUNT
+};
+
+#endif /* SGM775_MHU_H */
diff --git a/product/sgm775/include/sgm775_mmap.h b/product/sgm775/include/sgm775_mmap.h
new file mode 100644
index 00000000..16626760
--- /dev/null
+++ b/product/sgm775/include/sgm775_mmap.h
@@ -0,0 +1,101 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef SGM775_MMAP_H
+#define SGM775_MMAP_H
+
+#include <stdint.h>
+
+/*
+ * Top-level base addresses
+ */
+#define EXPANSION0_BASE UINT32_C(0x40000000)
+#define PERIPHERAL_BASE UINT32_C(0x44000000)
+#define POWER_PERIPHERAL_BASE UINT32_C(0x50000000)
+#define SYS0_BASE UINT32_C(0x60000000)
+#define SYS1_BASE UINT32_C(0xA0000000)
+#define PPB_INTERNAL_BASE UINT32_C(0xE0000000)
+#define PPB_EXTERNAL_BASE UINT32_C(0xE0040000)
+#define EXPANSION1_BASE UINT32_C(0xE0100000)
+
+/*
+ * Peripherals
+ */
+#define REFCLK_CNTCTL_BASE (PERIPHERAL_BASE + 0x0000)
+#define REFCLK_CNTBASE0_BASE (PERIPHERAL_BASE + 0x1000)
+#define WDOG_BASE (PERIPHERAL_BASE + 0x6000)
+#define S32K_CNTCONTROL_BASE (PERIPHERAL_BASE + 0x7000)
+#define S32K_CNTCTL_BASE (PERIPHERAL_BASE + 0x8000)
+#define S32K_CNTBASE0_BASE (PERIPHERAL_BASE + 0x9000)
+#define CS_CNTCONTROL_BASE (PERIPHERAL_BASE + 0xA000)
+
+/*
+ * Power control peripherals
+ */
+#define PIK_SCP_BASE (POWER_PERIPHERAL_BASE + 0x00000)
+#define PIK_DEBUG_BASE (POWER_PERIPHERAL_BASE + 0x20000)
+#define SENSOR_DEBUG_BASE (POWER_PERIPHERAL_BASE + 0x30000)
+#define PIK_SYSTEM_BASE (POWER_PERIPHERAL_BASE + 0x40000)
+#define SENSOR_SYSTEM_BASE (POWER_PERIPHERAL_BASE + 0x50000)
+#define PIK_CLUS0_BASE (POWER_PERIPHERAL_BASE + 0x60000)
+#define SENSOR_CLUS0_BASE (POWER_PERIPHERAL_BASE + 0x70000)
+#define PIK_CLUS1_BASE (POWER_PERIPHERAL_BASE + 0x80000)
+#define SENSOR_CLUS1_BASE (POWER_PERIPHERAL_BASE + 0x90000)
+#define PIK_GPU_BASE (POWER_PERIPHERAL_BASE + 0xA0000)
+#define SENSOR_GPU_BASE (POWER_PERIPHERAL_BASE + 0xB0000)
+#define PIK_VPU_BASE (POWER_PERIPHERAL_BASE + 0xC0000)
+#define SENSOR_VPU_BASE (POWER_PERIPHERAL_BASE + 0xD0000)
+#define PIK_DPU_BASE (POWER_PERIPHERAL_BASE + 0xE0000)
+#define SENSOR_DPU_BASE (POWER_PERIPHERAL_BASE + 0xF0000)
+
+/*
+ * PPU base address
+ */
+#define PPU_SCP_BASE (PIK_SCP_BASE + 0x1000)
+#define PPU_SYS0_BASE (PIK_SYSTEM_BASE + 0x1000)
+#define PPU_SYS1_BASE (PIK_SYSTEM_BASE + 0x2000)
+#define PPU_DEBUG_BASE (PIK_DEBUG_BASE + 0x1000)
+#define PPU_CLUS0CORE0_BASE (PIK_CLUS0_BASE + 0x2000)
+#define PPU_CLUS0CORE1_BASE (PIK_CLUS0_BASE + 0x3000)
+#define PPU_CLUS0CORE2_BASE (PIK_CLUS0_BASE + 0x4000)
+#define PPU_CLUS0CORE3_BASE (PIK_CLUS0_BASE + 0x5000)
+#define PPU_CLUS0CORE4_BASE (PIK_CLUS0_BASE + 0x6000)
+#define PPU_CLUS0CORE5_BASE (PIK_CLUS0_BASE + 0x7000)
+#define PPU_CLUS0CORE6_BASE (PIK_CLUS0_BASE + 0x8000)
+#define PPU_CLUS0CORE7_BASE (PIK_CLUS0_BASE + 0x9000)
+#define PPU_CLUS0_BASE (PIK_CLUS0_BASE + 0x1000)
+#define PPU_CLUS1CORE0_BASE (PIK_CLUS1_BASE + 0x2000)
+#define PPU_CLUS1CORE1_BASE (PIK_CLUS1_BASE + 0x3000)
+#define PPU_CLUS1CORE2_BASE (PIK_CLUS1_BASE + 0x4000)
+#define PPU_CLUS1CORE3_BASE (PIK_CLUS1_BASE + 0x5000)
+#define PPU_CLUS1_BASE (PIK_CLUS1_BASE + 0x1000)
+#define PPU_GPU_BASE (PIK_GPU_BASE + 0x1000)
+#define PPU_VPU_BASE (PIK_VPU_BASE + 0x1000)
+#define PPU_DPU0_BASE (PIK_DPU_BASE + 0x2000)
+#define PPU_DPU1_BASE (PIK_DPU_BASE + 0x3000)
+
+/*
+ * System access port 1
+ */
+#define TRUSTED_RAM_BASE (SYS1_BASE + 0x04000000)
+#define NONTRUSTED_RAM_BASE (SYS1_BASE + 0x06000000)
+#define SSC_BASE (SYS1_BASE + 0x2A420000)
+#define REFCLK_CNTCONTROL_BASE (SYS1_BASE + 0x2A430000)
+#define MHU_BASE (SYS1_BASE + 0x2B1F0000)
+
+/*
+ * Base addresses of MHU devices
+ */
+
+#define MHU_SCP_INTR_L_BASE (MHU_BASE)
+#define MHU_SCP_INTR_H_BASE (MHU_BASE + 0x0020)
+#define MHU_CPU_INTR_L_BASE (MHU_BASE + 0x0100)
+#define MHU_CPU_INTR_H_BASE (MHU_BASE + 0x0120)
+#define MHU_SCP_INTR_S_BASE (MHU_BASE + 0x0200)
+#define MHU_CPU_INTR_S_BASE (MHU_BASE + 0x0300)
+
+#endif /* SGM775_MMAP_H */
diff --git a/product/sgm775/include/sgm775_mmap_scp.h b/product/sgm775/include/sgm775_mmap_scp.h
new file mode 100644
index 00000000..a4ceb5b9
--- /dev/null
+++ b/product/sgm775/include/sgm775_mmap_scp.h
@@ -0,0 +1,19 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Description:
+ * SCP ROM and RAM memory bases. These definitions are kept isolated without
+ * the UINT32_C() or UL decorators allowing them to be used in the linker
+ * script.
+ */
+
+#ifndef SGM775_MMAP_SCP_H
+#define SGM775_MMAP_SCP_H
+
+#define SCP_ROM_BASE 0x00000000
+#define SCP_RAM_BASE 0x10000000
+
+#endif /* SGM775_MMAP_SCP_H */
diff --git a/product/sgm775/include/sgm775_pik.h b/product/sgm775/include/sgm775_pik.h
new file mode 100644
index 00000000..7d0ac12b
--- /dev/null
+++ b/product/sgm775/include/sgm775_pik.h
@@ -0,0 +1,29 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef SGM775_PIK_H
+#define SGM775_PIK_H
+
+#include <sgm775_mmap.h>
+#include <sgm775_pik_cpu.h>
+#include <sgm775_pik_debug.h>
+#include <sgm775_pik_dpu.h>
+#include <sgm775_pik_gpu.h>
+#include <sgm775_pik_scp.h>
+#include <sgm775_pik_system.h>
+#include <sgm775_pik_vpu.h>
+
+#define PIK_CLUS0 ((struct pik_cpu_reg_v8_2 *) PIK_CLUS0_BASE)
+#define PIK_CLUS1 ((struct pik_cpu_reg_v8_2 *) PIK_CLUS1_BASE)
+#define PIK_DEBUG ((struct pik_debug_reg *) PIK_DEBUG_BASE)
+#define PIK_DPU ((struct pik_dpu_reg *) PIK_DPU_BASE)
+#define PIK_GPU ((struct pik_gpu_reg *) PIK_GPU_BASE)
+#define PIK_SCP ((struct pik_scp_reg *) PIK_SCP_BASE)
+#define PIK_SYSTEM ((struct pik_system_reg *) PIK_SYSTEM_BASE)
+#define PIK_VPU ((struct pik_vpu_reg *) PIK_VPU_BASE)
+
+#endif /* SGM775_PIK_H */
diff --git a/product/sgm775/include/sgm775_pik_cpu.h b/product/sgm775/include/sgm775_pik_cpu.h
new file mode 100644
index 00000000..5c7cc646
--- /dev/null
+++ b/product/sgm775/include/sgm775_pik_cpu.h
@@ -0,0 +1,145 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef SGM775_PIK_CPU_H
+#define SGM775_PIK_CPU_H
+
+#include <stdint.h>
+#include <fwk_macros.h>
+
+#define PE_COUNT_MAX 16
+
+/*!
+ * \brief CPU PIK V8 register definitions
+ */
+struct pik_cpu_reg_v8 {
+ FWK_RW uint32_t STATIC_CONFIG;
+ uint8_t RESERVED0[0x10 - 0x4];
+ FWK_RW uint32_t RVBARADDR0_LW;
+ FWK_RW uint32_t RVBARADDR0_UP;
+ FWK_RW uint32_t RVBARADDR1_LW;
+ FWK_RW uint32_t RVBARADDR1_UP;
+ FWK_RW uint32_t RVBARADDR2_LW;
+ FWK_RW uint32_t RVBARADDR2_UP;
+ FWK_RW uint32_t RVBARADDR3_LW;
+ FWK_RW uint32_t RVBARADDR3_UP;
+ FWK_RW uint32_t CLUSTER_CONFIG;
+ uint8_t RESERVED1[0x200 - 0x34];
+ FWK_R uint32_t DBG_RST_STATU;
+ FWK_RW uint32_t DBG_RST_SET;
+ FWK_RW uint32_t DBG_RST_CLR;
+ uint8_t RESERVED2[0x400 - 0x20C];
+ FWK_RW uint32_t CPUACTIVE_CTRL;
+ uint8_t RESERVED3[0x800 - 0x404];
+ FWK_RW uint32_t PPUCLK_CTRL;
+ FWK_RW uint32_t PPUCLK_DIV1;
+ FWK_RW uint32_t PPUCLK_DIV2;
+ FWK_R uint32_t RESERVED4;
+ FWK_RW uint32_t CPUCLK_CTRL;
+ FWK_RW uint32_t CPUCLK_DIV1;
+ FWK_RW uint32_t CPUCLK_DIV2;
+ FWK_R uint32_t RESERVED5;
+ FWK_RW uint32_t PCLKDBG_CTRL;
+ uint8_t RESERVED6[0x830 - 0x824];
+ FWK_RW uint32_t ATCLKDBG_CTRL;
+ uint8_t RESERVED7[0x840 - 0x834];
+ FWK_RW uint32_t ACLKCPU_CTRL;
+ uint8_t RESERVED8[0xA00 - 0x844];
+ FWK_R uint32_t CLKFORCE_STATUS;
+ FWK_RW uint32_t CLKFORCE_SET;
+ FWK_RW uint32_t CLKFORCE_CLR;
+ uint8_t RESERVED9[0xFC0 - 0xA0C];
+ FWK_R uint32_t PIK_CONFIG;
+ uint8_t RESERVED10[0xFD0 - 0xFC4];
+ FWK_R uint32_t PID4;
+ FWK_R uint32_t PID5;
+ FWK_R uint32_t PID6;
+ FWK_R uint32_t PID7;
+ FWK_R uint32_t PID0;
+ FWK_R uint32_t PID1;
+ FWK_R uint32_t PID2;
+ FWK_R uint32_t PID3;
+ FWK_R uint32_t ID0;
+ FWK_R uint32_t ID1;
+ FWK_R uint32_t ID2;
+ FWK_R uint32_t ID3;
+};
+
+/*!
+ * \brief PE Static Configuration register definitions
+ */
+struct static_config {
+ FWK_RW uint32_t STATIC_CONFIG;
+ FWK_RW uint32_t RVBARADDR_LW;
+ FWK_RW uint32_t RVBARADDR_UP;
+ uint32_t RESERVED;
+};
+
+/*!
+ * \brief AP cores clock control register definitions
+ */
+struct ap_clk_ctrl {
+ FWK_RW uint32_t CORECLK_CTRL;
+ FWK_RW uint32_t CORECLK_DIV;
+ uint32_t RESERVED;
+ FWK_RW uint32_t CORECLK_MOD;
+};
+
+/*!
+ * \brief CPU PIK V8.2 register definitions
+ */
+struct pik_cpu_reg_v8_2 {
+ FWK_RW uint32_t CLUSTER_CONFIG;
+ uint8_t RESERVED0[0x10 - 0x4];
+ struct static_config STATIC_CONFIG[PE_COUNT_MAX];
+ uint8_t RESERVED1[0x800 - 0x110];
+ FWK_RW uint32_t PPUCLK_CTRL;
+ FWK_RW uint32_t PPUCLK_DIV1;
+ uint8_t RESERVED2[0x810 - 0x808];
+ FWK_RW uint32_t PCLK_CTRL;
+ uint8_t RESERVED3[0x820 - 0x814];
+ FWK_RW uint32_t ATCLK_CTRL;
+ uint8_t RESERVED4[0x830 - 0x824];
+ FWK_RW uint32_t GICCLK_CTRL;
+ uint8_t RESERVED5[0x840 - 0x834];
+ FWK_RW uint32_t AMBACLK_CTRL;
+ uint8_t RESERVED6[0x850 - 0x844];
+ FWK_RW uint32_t CLUSCLK_CTRL;
+ FWK_RW uint32_t CLUSCLK_DIV1;
+ uint8_t RESERVED7[0x860 - 0x858];
+ struct ap_clk_ctrl AP_CLK_CTRL[8];
+ uint8_t RESERVED8[0xA00 - 0x8E0];
+ FWK_R uint32_t CLKFORCE_STATUS;
+ FWK_RW uint32_t CLKFORCE_SET;
+ FWK_RW uint32_t CLKFORCE_CLR;
+ uint8_t RESERVED9[0xFB8 - 0xA0C];
+ FWK_R uint32_t CAP2;
+ FWK_R uint32_t CAP;
+ FWK_R uint32_t PIK_CONFIG;
+ uint8_t RESERVED10[0xFD0 - 0xFC4];
+ FWK_R uint32_t PID4;
+ FWK_R uint32_t PID5;
+ FWK_R uint32_t PID6;
+ FWK_R uint32_t PID7;
+ FWK_R uint32_t PID0;
+ FWK_R uint32_t PID1;
+ FWK_R uint32_t PID2;
+ FWK_R uint32_t PID3;
+ FWK_R uint32_t ID0;
+ FWK_R uint32_t ID1;
+ FWK_R uint32_t ID2;
+ FWK_R uint32_t ID3;
+};
+
+#define PIK_CPU_V8_2_CAP_CLUSSYNC UINT32_C(0x00000001)
+#define PIK_CPU_V8_2_CAP_CORESYNC(CORE) ((uint32_t)(1 << ((CORE) + 1)))
+#define PIK_CPU_V8_2_CAP_PE_MASK UINT32_C(0xF0000000)
+#define PIK_CPU_V8_2_CAP_PE_POS 28
+
+#define PIK_CPU_V8_2_PIK_CONFIG_NO_OF_PPU UINT32_C(0x0000000F)
+
+#endif /* SGM775_PIK_CPU_H */
diff --git a/product/sgm775/include/sgm775_pik_debug.h b/product/sgm775/include/sgm775_pik_debug.h
new file mode 100644
index 00000000..3a7f5fee
--- /dev/null
+++ b/product/sgm775/include/sgm775_pik_debug.h
@@ -0,0 +1,49 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef SGM775_PIK_DEBUG_H
+#define SGM775_PIK_DEBUG_H
+
+#include <stdint.h>
+#include <fwk_macros.h>
+
+/*!
+ * \brief Debug register definitions
+ */
+struct pik_debug_reg {
+ FWK_RW uint32_t DEBUG_CONTROL;
+ FWK_R uint32_t DEBUG_STATUS;
+ uint32_t RESERVED0[2];
+ FWK_R uint32_t APP_DAP_TARGET_ID;
+ FWK_R uint32_t SCP_DAP_TARGET_ID;
+ FWK_R uint32_t DAP_INSTANCE_ID;
+ uint8_t RESERVED1[0x810 - 0x1C];
+ FWK_RW uint32_t TRACECLK_CTRL;
+ FWK_RW uint32_t TRACECLK_DIV1;
+ uint32_t RESERVED2[2];
+ FWK_RW uint32_t PCLKDBG_CTRL;
+ uint32_t RESERVED3[3];
+ FWK_RW uint32_t ATCLK_CTRL;
+ FWK_RW uint32_t ATCLK_DIV1;
+ FWK_R uint8_t RESERVED4[0xFC0 - 0x838];
+ FWK_R uint32_t PIK_CONFIG;
+ uint32_t RESERVED5[3];
+ FWK_R uint32_t PID4;
+ FWK_R uint32_t PID5;
+ FWK_R uint32_t PID6;
+ FWK_R uint32_t PID7;
+ FWK_R uint32_t PID0;
+ FWK_R uint32_t PID1;
+ FWK_R uint32_t PID2;
+ FWK_R uint32_t PID3;
+ FWK_R uint32_t ID0;
+ FWK_R uint32_t ID1;
+ FWK_R uint32_t ID2;
+ FWK_R uint32_t ID3;
+};
+
+#endif /* SGM775_PIK_DEBUG_H */
diff --git a/product/sgm775/include/sgm775_pik_dpu.h b/product/sgm775/include/sgm775_pik_dpu.h
new file mode 100644
index 00000000..e9c5292f
--- /dev/null
+++ b/product/sgm775/include/sgm775_pik_dpu.h
@@ -0,0 +1,51 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef SGM775_PIK_DPU_H
+#define SGM775_PIK_DPU_H
+
+#include <stdint.h>
+#include <fwk_macros.h>
+
+/*!
+ * \brief DPU PIK register definitions
+ */
+struct pik_dpu_reg {
+ FWK_R uint8_t RESERVED0[0x810];
+ FWK_RW uint32_t M0CLK_CTRL;
+ FWK_RW uint32_t M0CLK_DIV1;
+ FWK_RW uint32_t M0CLK_DIV2;
+ uint32_t RESERVED1;
+ FWK_RW uint32_t M1CLK_CTRL;
+ FWK_RW uint32_t M1CLK_DIV1;
+ FWK_RW uint32_t M1CLK_DIV2;
+ uint32_t RESERVED2;
+ FWK_RW uint32_t ACLKDP_CTRL;
+ FWK_RW uint32_t ACLKDP_DIV1;
+ FWK_RW uint32_t ACLKDP_DIV2;
+ uint8_t RESERVED3[0xA00 - 0x83C];
+ FWK_R uint32_t CLKFORCE_STATUS;
+ FWK_W uint32_t CLKFORCE_SET;
+ FWK_W uint32_t CLKFORCE_CLR;
+ uint8_t RESERVED4[0xFC0 - 0xA0C];
+ FWK_RW uint32_t PWR_CTRL_CONFIG;
+ uint8_t RESERVED5[0xFD0 - 0xFC4];
+ FWK_R uint32_t PID4;
+ FWK_R uint32_t PID5;
+ FWK_R uint32_t PID6;
+ FWK_R uint32_t PID7;
+ FWK_R uint32_t PID0;
+ FWK_R uint32_t PID1;
+ FWK_R uint32_t PID2;
+ FWK_R uint32_t PID3;
+ FWK_R uint32_t ID0;
+ FWK_R uint32_t ID1;
+ FWK_R uint32_t ID2;
+ FWK_R uint32_t ID3;
+};
+
+#endif /* SGM775_PIK_DPU_H */
diff --git a/product/sgm775/include/sgm775_pik_gpu.h b/product/sgm775/include/sgm775_pik_gpu.h
new file mode 100644
index 00000000..c92a3e94
--- /dev/null
+++ b/product/sgm775/include/sgm775_pik_gpu.h
@@ -0,0 +1,45 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef SGM775_PIK_GPU_H
+#define SGM775_PIK_GPU_H
+
+#include <stdint.h>
+#include <fwk_macros.h>
+
+/*!
+ * \brief GPU PIK register definitions
+ */
+struct pik_gpu_reg {
+ uint8_t RESERVED0[0x810];
+ FWK_RW uint32_t GPUCLK_CTRL;
+ FWK_RW uint32_t GPUCLK_DIV1;
+ FWK_RW uint32_t GPUCLK_DIV2;
+ FWK_R uint32_t RESERVED1;
+ FWK_RW uint32_t ACLKGPU_CTRL;
+ uint8_t RESERVED2[0xA00 - 0x824];
+ FWK_R uint32_t CLKFORCE_STATUS;
+ FWK_W uint32_t CLKFORCE_SET;
+ FWK_W uint32_t CLKFORCE_CLR;
+ uint8_t RESERVED3[0xFC0 - 0xA0C];
+ FWK_RW uint32_t PWR_CTRL_CONFIG;
+ uint8_t RESERVED4[0xFD0 - 0xFC4];
+ FWK_R uint32_t PID4;
+ FWK_R uint32_t PID5;
+ FWK_R uint32_t PID6;
+ FWK_R uint32_t PID7;
+ FWK_R uint32_t PID0;
+ FWK_R uint32_t PID1;
+ FWK_R uint32_t PID2;
+ FWK_R uint32_t PID3;
+ FWK_R uint32_t ID0;
+ FWK_R uint32_t ID1;
+ FWK_R uint32_t ID2;
+ FWK_R uint32_t ID3;
+};
+
+#endif /* SGM775_PIK_GPU_H */
diff --git a/product/sgm775/include/sgm775_pik_scp.h b/product/sgm775/include/sgm775_pik_scp.h
new file mode 100644
index 00000000..dce3a371
--- /dev/null
+++ b/product/sgm775/include/sgm775_pik_scp.h
@@ -0,0 +1,63 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef SGM775_PIK_SCP_H
+#define SGM775_PIK_SCP_H
+
+#include <stdint.h>
+#include <fwk_macros.h>
+
+/*!
+ * \brief SCP PIK register definitions
+ */
+struct pik_scp_reg {
+ uint32_t RESERVED0[4];
+ FWK_RW uint32_t RESET_SYNDROME;
+ FWK_RW uint32_t WIC_CTRL;
+ FWK_R uint32_t WIC_STATUS;
+ uint8_t RESERVED1[0xA00 - 0x1C];
+ FWK_R uint32_t CLKFORCE_STATUS;
+ FWK_RW uint32_t CLKFORCE_SET;
+ FWK_RW uint32_t CLKFORCE_CLR;
+ uint32_t RESERVED2;
+ FWK_R uint32_t PLL_STATUS0;
+ FWK_R uint32_t PLL_STATUS1;
+ uint8_t RESERVED3[0xFC0 - 0xA18];
+ FWK_R uint32_t PIK_CONFIG;
+ uint32_t RESERVED4[3];
+ FWK_R uint32_t PID4;
+ FWK_R uint32_t PID5;
+ FWK_R uint32_t PID6;
+ FWK_R uint32_t PID7;
+ FWK_R uint32_t PID0;
+ FWK_R uint32_t PID1;
+ FWK_R uint32_t PID2;
+ FWK_R uint32_t PID3;
+ FWK_R uint32_t ID0;
+ FWK_R uint32_t ID1;
+ FWK_R uint32_t ID2;
+ FWK_R uint32_t ID3;
+};
+
+#define PLL_STATUS0_REFCLK UINT32_C(0x00000001)
+#define PLL_STATUS0_BCPUPLLLOCK UINT32_C(0x00000002)
+#define PLL_STATUS0_LCPUPLLLOCK UINT32_C(0x00000004)
+#define PLL_STATUS0_GPUPLLLOCK UINT32_C(0x00000008)
+#define PLL_STATUS0_VIDEOPLLLOCK UINT32_C(0x00000010)
+#define PLL_STATUS0_SYSPLLLOCK UINT32_C(0x00000020)
+#define PLL_STATUS0_DISPLAYPLLLOCK UINT32_C(0x00000040)
+
+#define PLL_STATUS1_CPUPLLLOCK(CPU, PLL) \
+ ((uint32_t)((1 << (PLL)) << ((CPU) * 8)))
+
+#define RESET_SYNDROME_PORESET UINT32_C(0x01)
+#define RESET_SYNDROME_WDOGRESET_SCP UINT32_C(0x02)
+#define RESET_SYNDROME_WDOGRESET_SYS UINT32_C(0x04)
+#define RESET_SYNDROME_SYSRESETREQ UINT32_C(0x08)
+#define RESET_SYNDROME_SCPM3LOCKUP UINT32_C(0x10)
+
+#endif /* SGM775_PIK_SCP_H */
diff --git a/product/sgm775/include/sgm775_pik_system.h b/product/sgm775/include/sgm775_pik_system.h
new file mode 100644
index 00000000..3e3dccdb
--- /dev/null
+++ b/product/sgm775/include/sgm775_pik_system.h
@@ -0,0 +1,69 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef SGM775_PIK_SYSTEM_H
+#define SGM775_PIK_SYSTEM_H
+
+#include <stdint.h>
+#include <fwk_macros.h>
+
+/*!
+ * \brief System PIK register definitions
+ */
+struct pik_system_reg {
+ uint8_t RESERVED0[0x800];
+ FWK_RW uint32_t PPUCLK_CTRL;
+ FWK_RW uint32_t PPUCLK_DIV1;
+ uint32_t RESERVED1[2];
+ FWK_RW uint32_t ACLKNCI_CTRL;
+ FWK_RW uint32_t ACLKNCI_DIV1;
+ uint32_t RESERVED2[2];
+ FWK_RW uint32_t ACLKCCI_CTRL;
+ FWK_RW uint32_t ACLKCCI_DIV1;
+ uint32_t RESERVED3[6];
+ FWK_RW uint32_t TCUCLK_CTRL;
+ FWK_RW uint32_t TCUCLK_DIV1;
+ uint32_t RESERVED4[2];
+ FWK_RW uint32_t GICCLK_CTRL;
+ FWK_RW uint32_t GICCLK_DIV1;
+ uint32_t RESERVED5[2];
+ FWK_RW uint32_t PCLKSCP_CTRL;
+ FWK_RW uint32_t PCLKSCP_DIV1;
+ uint32_t RESERVED6[2];
+ FWK_RW uint32_t SYSPERCLK_CTRL;
+ FWK_RW uint32_t SYSPERCLK_DIV1;
+ uint32_t RESERVED7[6];
+ FWK_RW uint32_t FCMCLK_CTRL;
+ FWK_RW uint32_t FCMCLK_DIV1;
+ uint8_t RESERVED8[0xA00 - 0x898];
+ FWK_R uint32_t CLKFORCE_STATUS;
+ FWK_RW uint32_t CLKFORCE_SET;
+ FWK_RW uint32_t CLKFORCE_CLR;
+ uint8_t RESERVED9[0xFBC - 0xA0C];
+ FWK_R uint32_t CAP;
+ FWK_R uint32_t PIK_CONFIG;
+ uint32_t RESERVED10[3];
+ FWK_R uint32_t PID4;
+ FWK_R uint32_t PID5;
+ FWK_R uint32_t PID6;
+ FWK_R uint32_t PID7;
+ FWK_R uint32_t PID0;
+ FWK_R uint32_t PID1;
+ FWK_R uint32_t PID2;
+ FWK_R uint32_t PID3;
+ FWK_R uint32_t ID0;
+ FWK_R uint32_t ID1;
+ FWK_R uint32_t ID2;
+ FWK_R uint32_t ID3;
+};
+
+#define CAP_GICCLK_GATING_SUPPORT UINT32_C(0x00000001)
+#define CAP_TCUCLK_SUPPORT UINT32_C(0x00000002)
+#define CAP_ELA_SUPPORT UINT32_C(0x00000004)
+#define CAP_FCMCLK_SUPPORT UINT32_C(0x00000008)
+
+#endif /* SGM775_PIK_SYSTEM_H */
diff --git a/product/sgm775/include/sgm775_pik_vpu.h b/product/sgm775/include/sgm775_pik_vpu.h
new file mode 100644
index 00000000..a2742bb9
--- /dev/null
+++ b/product/sgm775/include/sgm775_pik_vpu.h
@@ -0,0 +1,43 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef SGM775_PIK_VPU_H
+#define SGM775_PIK_VPU_H
+
+#include <stdint.h>
+#include <fwk_macros.h>
+
+/*!
+ * \brief VPU PIK register definitions
+ */
+struct pik_vpu_reg {
+ uint8_t RESERVED0[0x810];
+ FWK_RW uint32_t VIDEOCLK_CTRL;
+ FWK_RW uint32_t VIDEOCLK_DIV1;
+ FWK_RW uint32_t VIDEOCLK_DIV2;
+ uint8_t RESERVED1[0xA00 - 0x81C];
+ FWK_R uint32_t CLKFORCE_STATUS;
+ FWK_W uint32_t CLKFORCE_SET;
+ FWK_W uint32_t CLKFORCE_CLR;
+ uint8_t RESERVED2[0xFC0 - 0xA0C];
+ FWK_RW uint32_t PWR_CTRL_CONFIG;
+ uint8_t RESERVED3[0xFD0 - 0xFC4];
+ FWK_R uint32_t PID4;
+ FWK_R uint32_t PID5;
+ FWK_R uint32_t PID6;
+ FWK_R uint32_t PID7;
+ FWK_R uint32_t PID0;
+ FWK_R uint32_t PID1;
+ FWK_R uint32_t PID2;
+ FWK_R uint32_t PID3;
+ FWK_R uint32_t ID0;
+ FWK_R uint32_t ID1;
+ FWK_R uint32_t ID2;
+ FWK_R uint32_t ID3;
+};
+
+#endif /* SGM775_PIK_VPU_H */
diff --git a/product/sgm775/include/sgm775_scmi.h b/product/sgm775/include/sgm775_scmi.h
new file mode 100644
index 00000000..a920c09f
--- /dev/null
+++ b/product/sgm775/include/sgm775_scmi.h
@@ -0,0 +1,29 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Description:
+ * Definitions for SCMI and SMT module configurations.
+ */
+
+#ifndef SGM775_SCMI_H
+#define SGM775_SCMI_H
+
+/* SCMI agent identifiers */
+enum sgm775_scmi_agent_id {
+ /* 0 is reserved for the platform */
+ SCMI_AGENT_ID_OSPM = 1,
+ SCMI_AGENT_ID_PSCI,
+ SCMI_AGENT_ID_COUNT,
+};
+
+/* SCMI service indexes */
+enum sgm775_scmi_service_idx {
+ SGM775_SCMI_SERVICE_IDX_PSCI,
+ SGM775_SCMI_SERVICE_IDX_OSPM_0,
+ SGM775_SCMI_SERVICE_IDX_OSPM_1,
+ SGM775_SCMI_SERVICE_IDX_COUNT,
+};
+#endif /* SGM775_SCMI_H */
diff --git a/product/sgm775/include/sgm775_sds.h b/product/sgm775/include/sgm775_sds.h
new file mode 100644
index 00000000..943cfa7f
--- /dev/null
+++ b/product/sgm775/include/sgm775_sds.h
@@ -0,0 +1,149 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef SGM775_SDS_H
+#define SGM775_SDS_H
+
+#include <mod_sds.h>
+
+/*
+ * Structure identifiers.
+ */
+enum sgm775_sds_struct_id {
+ SGM775_SDS_CPU_INFO = 1 | (1 << MOD_SDS_ID_VERSION_MAJOR_POS),
+ SGM775_SDS_ROM_VERSION = 2 | (1 << MOD_SDS_ID_VERSION_MAJOR_POS),
+ SGM775_SDS_RAM_VERSION = 3 | (1 << MOD_SDS_ID_VERSION_MAJOR_POS),
+ SGM775_SDS_PLATFORM_ID = 4 | (1 << MOD_SDS_ID_VERSION_MAJOR_POS),
+ SGM775_SDS_RESET_SYNDROME = 5 | (1 << MOD_SDS_ID_VERSION_MAJOR_POS),
+ SGM775_SDS_FEATURE_AVAILABILITY = 6 | (1 << MOD_SDS_ID_VERSION_MAJOR_POS),
+ SGM775_SDS_CPU_BOOTCTR = 7 | (1 << MOD_SDS_ID_VERSION_MAJOR_POS),
+ SGM775_SDS_CPU_FLAGS = 8 | (1 << MOD_SDS_ID_VERSION_MAJOR_POS),
+ SGM775_SDS_BOOTLOADER = 9 | (1 << MOD_SDS_ID_VERSION_MAJOR_POS),
+};
+
+/*
+ * Structure sizes.
+ */
+#define SGM775_SDS_CPU_INFO_SIZE 4
+#define SGM775_SDS_ROM_VERSION_SIZE 4
+#define SGM775_SDS_RAM_VERSION_SIZE 4
+#define SGM775_SDS_PLATFORM_ID_SIZE 8
+#define SGM775_SDS_RESET_SYNDROME_SIZE 4
+#define SGM775_SDS_FEATURE_AVAILABILITY_SIZE 4
+#define SGM775_SDS_CPU_BOOTCTR_SIZE 8
+#define SGM775_SDS_CPU_FLAGS_SIZE 8
+#define SGM775_SDS_BOOTLOADER_SIZE 12
+
+/*
+ * Field masks and offsets for the SGM775_SDS_AP_CPU_INFO structure.
+ */
+#define SGM775_SDS_CPU_INFO_PRIMARY_MASK 0xFFFFFFFF
+#define SGM775_SDS_CPU_INFO_PRIMARY_POS 0
+
+/*
+ * Structure, field masks and offsets for the SGM775_SDS_PLATFORM_ID structure.
+ */
+
+struct sgm775_sds_platid {
+ uint32_t platform_identifier;
+ uint32_t platform_type_identifier;
+};
+
+#define SGM775_SDS_PLATID_PARTNO_MASK 0xFFF
+#define SGM775_SDS_PLATID_DESIGNER_MASK 0xFF000
+#define SGM775_SDS_PLATID_REV_MINOR_MASK 0xF00000
+#define SGM775_SDS_PLATID_REV_MAJOR_MASK 0xF000000
+#define SGM775_SDS_PLATID_CONFIG_MASK 0xF0000000
+#define SGM775_SDS_PLATID_TYPE_MASK 0xF
+
+#define SGM775_SDS_PLATID_PARTNO_POS 0
+#define SGM775_SDS_PLATID_DESIGNER_POS 12
+#define SGM775_SDS_PLATID_REV_MINOR_POS 20
+#define SGM775_SDS_PLATID_REV_MAJOR_POS 24
+#define SGM775_SDS_PLATID_CONFIG_POS 28
+
+#define SGM775_SDS_PLATID_TYPE_POS 0
+/*
+ * Field masks and offsets for the SGM775_SDS_RESET_SYNDROME structure.
+ */
+#define SGM775_SDS_RESET_SYNDROME_POR_MASK 0x1
+#define SGM775_SDS_RESET_SYNDROME_WDOGSCP_MASK 0x2
+#define SGM775_SDS_RESET_SYNDROME_WDOGAP_MASK 0x4
+#define SGM775_SDS_RESET_SYNDROME_SYSRESET_MASK 0x8
+#define SGM775_SDS_RESET_SYNDROME_M3LOCKUP_MASK 0x10
+
+#define SGM775_SDS_RESET_SYNDROME_POR_POS 0
+#define SGM775_SDS_RESET_SYNDROME_WDOGSCP_POS 1
+#define SGM775_SDS_RESET_SYNDROME_WDOGAP_POS 2
+#define SGM775_SDS_RESET_SYNDROME_SYSRESET_POS 3
+#define SGM775_SDS_RESET_SYNDROME_M3LOCKUP_POS 4
+
+/*
+ * Field masks and offsets for the SGM775_SDS_FEATURE_AVAILABILITY structure.
+ */
+#define SGM775_SDS_FEATURE_FIRMWARE_MASK 0x1
+#define SGM775_SDS_FEATURE_DMC_MASK 0x2
+#define SGM775_SDS_FEATURE_MESSAGING_MASK 0x4
+
+#define SGM775_SDS_FEATURE_FIRMWARE_POS 0
+#define SGM775_SDS_FEATURE_DMC_POS 1
+#define SGM775_SDS_FEATURE_MESSAGING_POS 2
+
+/*
+ * Field masks and offsets for the SGM775_SDS_CPU_BOOTCTR structure.
+ */
+#define SGM775_SDS_CPU_BOOTCTR_CPU0_MASK 0xFF
+#define SGM775_SDS_CPU_BOOTCTR_CPU1_MASK 0xFF00
+#define SGM775_SDS_CPU_BOOTCTR_CPU2_MASK 0xFF0000
+#define SGM775_SDS_CPU_BOOTCTR_CPU3_MASK 0xFF000000
+#define SGM775_SDS_CPU_BOOTCTR_CPU4_MASK 0xFF
+#define SGM775_SDS_CPU_BOOTCTR_CPU5_MASK 0xFF00
+#define SGM775_SDS_CPU_BOOTCTR_CPU6_MASK 0xFF0000
+#define SGM775_SDS_CPU_BOOTCTR_CPU7_MASK 0xFF000000
+
+
+#define SGM775_SDS_CPU_BOOTCTR_CPU0_POS 0
+#define SGM775_SDS_CPU_BOOTCTR_CPU1_POS 8
+#define SGM775_SDS_CPU_BOOTCTR_CPU2_POS 16
+#define SGM775_SDS_CPU_BOOTCTR_CPU3_POS 24
+#define SGM775_SDS_CPU_BOOTCTR_CPU4_POS 0
+#define SGM775_SDS_CPU_BOOTCTR_CPU5_POS 8
+#define SGM775_SDS_CPU_BOOTCTR_CPU6_POS 16
+#define SGM775_SDS_CPU_BOOTCTR_CPU7_POS 24
+
+/*
+ * Field masks and offsets for the SGM775_SDS_CPU_FLAGS structure.
+ */
+#define SGM775_SDS_CPU_FLAGS_CPU0_WFI_MASK 0x1
+#define SGM775_SDS_CPU_FLAGS_CPU1_WFI_MASK 0x100
+#define SGM775_SDS_CPU_FLAGS_CPU2_WFI_MASK 0x10000
+#define SGM775_SDS_CPU_FLAGS_CPU3_WFI_MASK 0x1000000
+#define SGM775_SDS_CPU_FLAGS_CPU4_WFI_MASK 0x1
+#define SGM775_SDS_CPU_FLAGS_CPU5_WFI_MASK 0x100
+#define SGM775_SDS_CPU_FLAGS_CPU6_WFI_MASK 0x10000
+#define SGM775_SDS_CPU_FLAGS_CPU7_WFI_MASK 0x1000000
+
+#define SGM775_SDS_CPU_FLAGS_CPU0_WFI_POS 0
+#define SGM775_SDS_CPU_FLAGS_CPU1_WFI_POS 8
+#define SGM775_SDS_CPU_FLAGS_CPU2_WFI_POS 16
+#define SGM775_SDS_CPU_FLAGS_CPU3_WFI_POS 24
+#define SGM775_SDS_CPU_FLAGS_CPU4_WFI_POS 0
+#define SGM775_SDS_CPU_FLAGS_CPU5_WFI_POS 8
+#define SGM775_SDS_CPU_FLAGS_CPU6_WFI_POS 16
+#define SGM775_SDS_CPU_FLAGS_CPU7_WFI_POS 24
+/*
+ * Field masks and offsets for the SGM775_SDS_BOOTLOADER structure.
+ */
+#define SGM775_SDS_BOOTLOADER_VALID_MASK 0x1
+#define SGM775_SDS_BOOTLOADER_OFFSET_MASK 0xFFFFFFFF
+#define SGM775_SDS_BOOTLOADER_SIZE_MASK 0xFFFFFFFF
+
+#define SGM775_SDS_BOOTLOADER_VALID_POS 0
+#define SGM775_SDS_BOOTLOADER_OFFSET_POS 0
+#define SGM775_SDS_BOOTLOADER_SIZE_POS 0
+
+#endif /* SGM775_SDS_H */
diff --git a/product/sgm775/include/sgm775_ssc.h b/product/sgm775/include/sgm775_ssc.h
new file mode 100644
index 00000000..9b514a11
--- /dev/null
+++ b/product/sgm775/include/sgm775_ssc.h
@@ -0,0 +1,42 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef SGM775_SSC_H
+#define SGM775_SSC_H
+
+#include <stdint.h>
+#include <fwk_macros.h>
+
+/*!
+ * \brief System Security Control (SSC) register definitions
+ */
+struct ssc_reg {
+ FWK_R uint32_t RESERVED1[4];
+ FWK_R uint32_t SSC_DBGCFG_STAT;
+ FWK_W uint32_t SSC_DBGCFG_SET;
+ FWK_W uint32_t SSC_DBGCFG_CLR;
+ FWK_R uint32_t RESERVED2[2];
+ FWK_RW uint32_t SSC_SWDHOD;
+ FWK_RW uint32_t SSC_AUXDBGCFG;
+ FWK_R uint32_t RESERVED3;
+ FWK_RW uint32_t SSC_GPRETN;
+ FWK_R uint32_t RESERVED4[3];
+ FWK_R uint32_t SSC_VERSION;
+ FWK_R uint32_t RESERVED5[995];
+ FWK_R uint32_t PID4;
+ FWK_R uint32_t RESERVED6[3];
+ FWK_R uint32_t PID0;
+ FWK_R uint32_t PID1;
+ FWK_R uint32_t PID2;
+ FWK_R uint32_t PID3;
+ FWK_R uint32_t COMPID0;
+ FWK_R uint32_t COMPID1;
+ FWK_R uint32_t COMPID2;
+ FWK_R uint32_t COMPID3;
+};
+
+#endif /* SGM775_SSC_H */
diff --git a/product/sgm775/include/software_mmap.h b/product/sgm775/include/software_mmap.h
new file mode 100644
index 00000000..e0ce772f
--- /dev/null
+++ b/product/sgm775/include/software_mmap.h
@@ -0,0 +1,128 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Description:
+ * Software defined memory map shared between SCP and AP cores.
+ */
+
+#ifndef SOFTWARE_MMAP_H
+#define SOFTWARE_MMAP_H
+
+#include <fwk_macros.h>
+#include <system_mmap.h>
+
+/*
+ * The 4KiB AP/SCP Shared memory at the base of Trusted SRAM is used for several
+ * purposes. These are: the Shared Data Storage (SDS) Memory Region, the SCMI
+ * secure payload areas, and the context area for Application Processor
+ * firmware.
+ *
+ * Shared Data Storage (SDS) Memory Region: Used for structured storage of data
+ * that is shared between SCP Firmware and Application Processor firmware. The
+ * SDS Memory Region occupies the area between the context region base and
+ * the SCMI Secure Payload base.
+ *
+ * SCMI Secure Payload Areas: Storage for SCMI message contents in both the
+ * Agent->Platform and Platform->Agent directions.
+ *
+ * Application Processor Context Area: The usage of this area is defined by the
+ * firmware running on the Application Processors. The SCP Firmware must zero
+ * this memory before releasing any Application Processors. This area must
+ * always be located in the top 64 bytes of the 4KiB reserved region.
+ *
+ * +-----------------------+ 4096
+ * | |
+ * 64B | AP Context Area |
+ * | |
+ * +-----------------------+
+ * | |
+ * 256B | Unused |
+ * | |
+ * +-----------------------+
+ * | |
+ * | SCMI Sec. Payload |
+ * 128B | Platform to Agent |
+ * | |
+ * +-----------------------+
+ * | |
+ * 128B | SCMI Sec. Payload |
+ * | Agent to Platform |
+ * | |
+ * +-----------------------+
+ * | |
+ * 3520B | SDS Memory Region |
+ * | |
+ * +-----------------------+ 0
+ */
+
+/* Secure shared memory at the base of Trusted SRAM */
+#define SHARED_SECURE_BASE (TRUSTED_RAM_BASE)
+#define SHARED_SECURE_SIZE (4 * FWK_KIB)
+
+/* SDS Memory Region */
+#define SDS_MEM_BASE (SHARED_SECURE_BASE)
+#define SDS_MEM_SIZE (3520)
+
+/* AP Context Area */
+#define AP_CONTEXT_BASE (SHARED_SECURE_BASE + SHARED_SECURE_SIZE - \
+ AP_CONTEXT_SIZE)
+#define AP_CONTEXT_SIZE (64)
+
+/* SCMI Secure Payload Areas */
+#define SCMI_PAYLOAD_SIZE (128)
+#define SCMI_PAYLOAD_S_A2P_BASE (SDS_MEM_BASE + SDS_MEM_SIZE)
+#define SCMI_PAYLOAD_S_P2A_BASE (SCMI_PAYLOAD_S_A2P_BASE + SCMI_PAYLOAD_SIZE)
+
+/*
+ * The 4KiB AP/SCP Shared memory at the base of Non-trusted SRAM is used for the
+ * SCMI non-secure payload areas.
+ *
+ * Two SCMI non-Secure Payload Areas: Storage for SCMI message contents in both
+ * the Agent->Platform and Platform->Agent directions.
+ *
+ * +-----------------------+ 4096
+ * 3584B | Unused |
+ * +-----------------------+
+ * | |
+ * | Non-Sec. Channel 1 |
+ * | SCMI non-Sec. Payload |
+ * 128B | Platform to Agent |
+ * | |
+ * +-----------------------+
+ * | |
+ * | Non-Sec. Channel 1 |
+ * 128B | SCMI non-Sec. Payload |
+ * | Agent to Platform |
+ * | |
+ * +-----------------------+
+ * | |
+ * | Non-Sec. Channel 0 |
+ * | SCMI non-Sec. Payload |
+ * 128B | Platform to Agent |
+ * | |
+ * +-----------------------+
+ * | |
+ * | Non-Sec. Channel 0 |
+ * 128B | SCMI non-Sec. Payload |
+ * | Agent to Platform |
+ * | |
+ * +-----------------------+ 0
+ */
+
+/* Non-secure shared memory at the base of Non-trusted SRAM */
+#define SHARED_NONSECURE_BASE (NONTRUSTED_RAM_BASE)
+#define SHARED_NONSECURE_SIZE (4 * FWK_KIB)
+
+/* SCMI Non-Secure Payload Areas */
+#define SCMI_PAYLOAD0_NS_A2P_BASE (SHARED_NONSECURE_BASE)
+#define SCMI_PAYLOAD0_NS_P2A_BASE (SCMI_PAYLOAD0_NS_A2P_BASE + \
+ SCMI_PAYLOAD_SIZE)
+#define SCMI_PAYLOAD1_NS_A2P_BASE (SCMI_PAYLOAD0_NS_P2A_BASE + \
+ SCMI_PAYLOAD_SIZE)
+#define SCMI_PAYLOAD1_NS_P2A_BASE (SCMI_PAYLOAD1_NS_A2P_BASE + \
+ SCMI_PAYLOAD_SIZE)
+
+#endif /* SOFTWARE_MMAP_H */
diff --git a/product/sgm775/include/system_clock.h b/product/sgm775/include/system_clock.h
new file mode 100644
index 00000000..c3f5a76c
--- /dev/null
+++ b/product/sgm775/include/system_clock.h
@@ -0,0 +1,28 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef SYSTEM_CLOCK_H
+#define SYSTEM_CLOCK_H
+
+#include <fwk_macros.h>
+
+/*!
+ * \brief Calculates the necessary divider for obtaining a target frequency
+ * from a given clock.
+ *
+ * \param CLOCK_RATE The tick rate of the clock to be divided.
+ *
+ * \param TARGET_FREQ The target frequency to be obtained by the division.
+ *
+ * \return The divider needed to obtain TARGET_FREQ from CLOCK_RATE.
+ */
+#define DIV_FROM_CLOCK(CLOCK_RATE, TARGET_FREQ) ((CLOCK_RATE) / (TARGET_FREQ))
+
+#define CLOCK_RATE_REFCLK (50UL * FWK_MHZ)
+#define CLOCK_RATE_SYSPLLCLK (2000UL * FWK_MHZ)
+
+#endif /* SYSTEM_CLOCK_H */
diff --git a/product/sgm775/include/system_mmap.h b/product/sgm775/include/system_mmap.h
new file mode 100644
index 00000000..697f7811
--- /dev/null
+++ b/product/sgm775/include/system_mmap.h
@@ -0,0 +1,61 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef SYSTEM_MMAP_H
+#define SYSTEM_MMAP_H
+
+#include <sgm775_mmap.h>
+
+#define DMC_EXTERNAL0 (SYS0_BASE + 0x3FBE0000)
+#define DMC_EXTERNAL1 (SYS0_BASE + 0x3FBF0000)
+#define DMC_EXTERNAL2 (SYS0_BASE + 0x3FC00000)
+#define DMC_EXTERNAL3 (SYS0_BASE + 0x3FC10000)
+
+#define BOARD_UART1_BASE (SYS0_BASE + 0x3FF70000)
+#define PLAT_BASE (SYS0_BASE + 0x3FFE0000)
+
+#define PLL_GPU (PLAT_BASE + 0x00000008)
+#define PLL_SYSTEM (PLAT_BASE + 0x0000000C)
+#define PLL_VIDEO (PLAT_BASE + 0x00000010)
+#define PLL_DISPLAY (PLAT_BASE + 0x00000014)
+
+#define PIX0_CONTROL (PLAT_BASE + 0x00000018)
+#define PIX1_CONTROL (PLAT_BASE + 0x0000001C)
+
+#define SWCLKTCK_CONTROL (PLAT_BASE + 0x00000020)
+#define SENSOR_SOC_TEMP (PLAT_BASE + 0x00000080)
+#define PLATFORM_ID (PLAT_BASE + 0x000000E0)
+
+#define PLL_CLUS0_0 (PLAT_BASE + 0x00000100)
+#define PLL_CLUS0_1 (PLAT_BASE + 0x00000104)
+#define PLL_CLUS0_2 (PLAT_BASE + 0x00000108)
+#define PLL_CLUS0_3 (PLAT_BASE + 0x0000010C)
+#define PLL_CLUS0_4 (PLAT_BASE + 0x00000110)
+#define PLL_CLUS0_5 (PLAT_BASE + 0x00000114)
+#define PLL_CLUS0_6 (PLAT_BASE + 0x00000118)
+#define PLL_CLUS0_7 (PLAT_BASE + 0x0000011C)
+
+#define DDR_PHY0 (SYS0_BASE + 0x3FB60000)
+#define DDR_PHY1 (SYS0_BASE + 0x3FB70000)
+#define DDR_PHY2 (SYS0_BASE + 0x3FB80000)
+#define DDR_PHY3 (SYS0_BASE + 0x3FB90000)
+
+#define GPV_CCI_GPU1 (SYS1_BASE + 0x2A004000)
+#define GPV_CCI_GPU0 (SYS1_BASE + 0x2A005000)
+#define GPV_CCI_LITTLE (SYS1_BASE + 0x2A006000)
+#define GPV_CCI_BIG (SYS1_BASE + 0x2A007000)
+#define GPV_VPU (SYS1_BASE + 0x2A243000)
+#define GPV_DPU0 (SYS1_BASE + 0x2A244000)
+#define GPV_DPU1 (SYS1_BASE + 0x2A245000)
+
+#define DMC_INTERNAL0 (SYS1_BASE + 0x2A500000)
+#define DMC_INTERNAL1 (SYS1_BASE + 0x2A540000)
+#define DMC_INTERNAL2 (SYS1_BASE + 0x2A580000)
+#define DMC_INTERNAL3 (SYS1_BASE + 0x2A5C0000)
+
+
+#endif /* SYSTEM_MMAP_H */
diff --git a/product/sgm775/include/system_mmap_scp.h b/product/sgm775/include/system_mmap_scp.h
new file mode 100644
index 00000000..097e4316
--- /dev/null
+++ b/product/sgm775/include/system_mmap_scp.h
@@ -0,0 +1,21 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Description:
+ * SCP ROM and RAM memory sizes. These definitions are kept isolated without
+ * the UINT32_C() or UL decorators allowing them to be used in the linker
+ * script.
+ */
+
+#ifndef SYSTEM_MMAP_SCP_H
+#define SYSTEM_MMAP_SCP_H
+
+#include <sgm775_mmap_scp.h>
+
+#define SCP_ROM_SIZE (64 * 1024)
+#define SCP_RAM_SIZE (128 * 1024)
+
+#endif /* SYSTEM_MMAP_SCP_H */
diff --git a/product/sgm775/module/sgm775_system/include/mod_sgm775_system.h b/product/sgm775/module/sgm775_system/include/mod_sgm775_system.h
new file mode 100644
index 00000000..c3cfb498
--- /dev/null
+++ b/product/sgm775/module/sgm775_system/include/mod_sgm775_system.h
@@ -0,0 +1,44 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Description:
+ * SGM775 System Support
+ */
+
+#ifndef MOD_SGM775_SYSTEM_H
+#define MOD_SGM775_SYSTEM_H
+
+/*!
+ * \addtogroup GroupSGM775Module SGM775 Product Modules
+ * @{
+ */
+
+/*!
+ * \defgroup GroupSGM775System SGM775 System Support
+ *
+ * @{
+ */
+
+/*!
+ * \brief API indices.
+ */
+enum mod_sgm775_system_api_idx {
+ /*! API index for the driver interface of the SYSTEM POWER module */
+ MOD_SGM775_SYSTEM_API_IDX_SYSTEM_POWER_DRIVER,
+
+ /*! Number of defined APIs */
+ MOD_SGM775_SYSTEM_API_COUNT
+};
+
+/*!
+ * @}
+ */
+
+/*!
+ * @}
+ */
+
+#endif /* MOD_SGM775_SYSTEM_H */
diff --git a/product/sgm775/module/sgm775_system/src/Makefile b/product/sgm775/module/sgm775_system/src/Makefile
new file mode 100644
index 00000000..77ad18c1
--- /dev/null
+++ b/product/sgm775/module/sgm775_system/src/Makefile
@@ -0,0 +1,11 @@
+#
+# Arm SCP/MCP Software
+# Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+BS_LIB_NAME := SGM775 SYSTEM
+BS_LIB_SOURCES = mod_sgm775_system.c
+
+include $(BS_DIR)/lib.mk
diff --git a/product/sgm775/module/sgm775_system/src/mod_sgm775_system.c b/product/sgm775/module/sgm775_system/src/mod_sgm775_system.c
new file mode 100644
index 00000000..dc1459e4
--- /dev/null
+++ b/product/sgm775/module/sgm775_system/src/mod_sgm775_system.c
@@ -0,0 +1,59 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Description:
+ * SGM775 System Support.
+ */
+
+#include <fmw_cmsis.h>
+#include <fwk_module.h>
+#include <mod_system_power.h>
+#include <mod_sgm775_system.h>
+
+/*
+ * Functions fulfilling the framework's module interface
+ */
+
+static int sgm775_system_shutdown(enum mod_pd_system_shutdown system_shutdown)
+{
+ NVIC_SystemReset();
+
+ return FWK_E_DEVICE;
+}
+
+static const struct mod_system_power_driver_api
+ sgm775_system_system_power_driver_api = {
+ .system_shutdown = sgm775_system_shutdown
+};
+
+/*
+ * Functions fulfilling the framework's module interface
+ */
+
+static int sgm775_system_init(fwk_id_t module_id, unsigned int unused,
+ const void *unused2)
+{
+ return FWK_SUCCESS;
+}
+
+static int sgm775_system_process_bind_request(fwk_id_t source_id,
+ fwk_id_t target_id, fwk_id_t api_id, const void **api)
+{
+ *api = &sgm775_system_system_power_driver_api;
+
+ return FWK_SUCCESS;
+}
+
+const struct fwk_module module_sgm775_system = {
+ .name = "SGM775_SYSTEM",
+ .api_count = MOD_SGM775_SYSTEM_API_COUNT,
+ .type = FWK_MODULE_TYPE_DRIVER,
+ .init = sgm775_system_init,
+ .process_bind_request = sgm775_system_process_bind_request,
+};
+
+/* No elements, no module configuration data */
+struct fwk_module_config config_sgm775_system = {};
diff --git a/product/sgm775/product.mk b/product/sgm775/product.mk
new file mode 100644
index 00000000..0572bdc3
--- /dev/null
+++ b/product/sgm775/product.mk
@@ -0,0 +1,10 @@
+#
+# Arm SCP/MCP Software
+# Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+BS_PRODUCT_NAME := sgm775
+BS_FIRMWARE_LIST := scp_romfw \
+ scp_ramfw
diff --git a/product/sgm775/scp_ramfw/RTX_Config.h b/product/sgm775/scp_ramfw/RTX_Config.h
new file mode 100644
index 00000000..25621f84
--- /dev/null
+++ b/product/sgm775/scp_ramfw/RTX_Config.h
@@ -0,0 +1,56 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Description:
+ * RTX2 v5 configuration file.
+ * The file must be called RTX_Config.h as it is included by the an RTX
+ * file in order to create a object file containing the configuration.
+ */
+
+#ifndef RTX_CONFIG_H_
+#define RTX_CONFIG_H_
+
+/* System */
+#define OS_DYNAMIC_MEM_SIZE 0
+#define OS_TICK_FREQ 1000 /* Hz */
+#define OS_ROBIN_ENABLE 0
+#define OS_ROBIN_TIMEOUT 0
+#define OS_ISR_FIFO_QUEUE 16
+
+/* Thread */
+#define OS_THREAD_OBJ_MEM 0
+#define OS_THREAD_NUM 1
+#define OS_THREAD_DEF_STACK_NUM 0
+#define OS_THREAD_USER_STACK_SIZE 0
+#define OS_STACK_SIZE 200
+#define OS_IDLE_THREAD_STACK_SIZE 200
+#define OS_STACK_CHECK 1
+#define OS_STACK_WATERMARK 0
+#define OS_PRIVILEGE_MODE 1
+
+/* Timer */
+#define OS_TIMER_OBJ_MEM 0
+#define OS_TIMER_NUM 1
+#define OS_TIMER_THREAD_PRIO 40
+#define OS_TIMER_THREAD_STACK_SIZE 200
+#define OS_TIMER_CB_QUEUE 4
+
+/* Event flags */
+#define OS_EVFLAGS_OBJ_MEM 0
+#define OS_EVFLAGS_NUM 1
+
+#define OS_MUTEX_OBJ_MEM 0
+#define OS_MUTEX_NUM 1
+#define OS_SEMAPHORE_OBJ_MEM 0
+#define OS_SEMAPHORE_NUM 1
+#define OS_MEMPOOL_OBJ_MEM 0
+#define OS_MEMPOOL_NUM 1
+#define OS_MEMPOOL_DATA_SIZE 0
+#define OS_MSGQUEUE_OBJ_MEM 0
+#define OS_MSGQUEUE_NUM 1
+#define OS_MSGQUEUE_DATA_SIZE 0
+
+#endif /* RTX_CONFIG_H_ */
diff --git a/product/sgm775/scp_ramfw/clock_devices.h b/product/sgm775/scp_ramfw/clock_devices.h
new file mode 100644
index 00000000..c1eed2ef
--- /dev/null
+++ b/product/sgm775/scp_ramfw/clock_devices.h
@@ -0,0 +1,26 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef CLOCK_DEVICES_H
+#define CLOCK_DEVICES_H
+
+/*!
+ * \brief Clock device indexes.
+ */
+enum clock_dev_idx {
+ CLOCK_DEV_IDX_BIG,
+ CLOCK_DEV_IDX_LITTLE,
+ CLOCK_DEV_IDX_GPU,
+ CLOCK_DEV_IDX_VPU,
+ CLOCK_DEV_IDX_DPU,
+ CLOCK_DEV_IDX_PIXEL_0,
+ CLOCK_DEV_IDX_PIXEL_1,
+ CLOCK_DEV_IDX_FCMCLK,
+ CLOCK_DEV_IDX_COUNT
+};
+
+#endif /* CLOCK_DEVICES_H */
diff --git a/product/sgm775/scp_ramfw/config_clock.c b/product/sgm775/scp_ramfw/config_clock.c
new file mode 100644
index 00000000..3728fb79
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_clock.c
@@ -0,0 +1,119 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stddef.h>
+#include <fwk_element.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_clock.h>
+#include <mod_css_clock.h>
+#include <mod_system_pll.h>
+#include <mod_pik_clock.h>
+#include <mod_power_domain.h>
+#include <config_power_domain.h>
+#include <clock_devices.h>
+#include <sgm775_core.h>
+
+static struct fwk_element clock_dev_desc_table[] = {
+ [CLOCK_DEV_IDX_BIG] = {
+ .name = "CPU_GROUP_BIG",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CSS_CLOCK, 0),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_CSS_CLOCK,
+ MOD_CSS_CLOCK_API_TYPE_CLOCK),
+ }),
+ },
+ [CLOCK_DEV_IDX_LITTLE] = {
+ .name = "CPU_GROUP_LITTLE",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CSS_CLOCK, 1),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_CSS_CLOCK,
+ MOD_CSS_CLOCK_API_TYPE_CLOCK),
+ }),
+ },
+ [CLOCK_DEV_IDX_GPU] = {
+ .name = "GPU",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CSS_CLOCK, 2),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_CSS_CLOCK,
+ MOD_CSS_CLOCK_API_TYPE_CLOCK),
+ }),
+ },
+ [CLOCK_DEV_IDX_VPU] = {
+ .name = "VPU",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CSS_CLOCK, 3),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_CSS_CLOCK,
+ MOD_CSS_CLOCK_API_TYPE_CLOCK),
+ }),
+ },
+ [CLOCK_DEV_IDX_DPU] = {
+ .name = "DPU",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CSS_CLOCK, 4),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_CSS_CLOCK,
+ MOD_CSS_CLOCK_API_TYPE_CLOCK),
+ }),
+ },
+ [CLOCK_DEV_IDX_PIXEL_0] = {
+ .name = "PIXEL_0",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SYSTEM_PLL, 5),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SYSTEM_PLL,
+ MOD_SYSTEM_PLL_API_TYPE_DEFAULT),
+ }),
+ },
+ [CLOCK_DEV_IDX_PIXEL_1] = {
+ .name = "PIXEL_1",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SYSTEM_PLL, 6),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SYSTEM_PLL,
+ MOD_SYSTEM_PLL_API_TYPE_DEFAULT),
+ }),
+ },
+ [CLOCK_DEV_IDX_FCMCLK] = {
+ .name = "FCMCLK",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PIK_CLOCK, 12),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PIK_CLOCK,
+ MOD_PIK_CLOCK_API_TYPE_CLOCK),
+ }),
+ },
+ [CLOCK_DEV_IDX_COUNT] = { }, /* Termination description. */
+};
+
+static const struct fwk_element *clock_get_dev_desc_table(fwk_id_t module_id)
+{
+ unsigned int i;
+ unsigned int core_count;
+ struct mod_clock_dev_config *dev_config;
+
+ core_count = sgm775_core_get_count();
+
+ /* Configure all clocks to respond to changes in SYSTOP power state */
+ for (i = 0; i < CLOCK_DEV_IDX_COUNT; i++) {
+ dev_config =
+ (struct mod_clock_dev_config *)clock_dev_desc_table[i].data;
+ dev_config->pd_source_id = FWK_ID_ELEMENT(
+ FWK_MODULE_IDX_POWER_DOMAIN,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_COUNT + core_count);
+ }
+
+ return clock_dev_desc_table;
+}
+
+struct fwk_module_config config_clock = {
+ .get_element_table = clock_get_dev_desc_table,
+ .data = &((struct mod_clock_config) {
+ .pd_transition_notification_id = FWK_ID_NOTIFICATION_INIT(
+ FWK_MODULE_IDX_POWER_DOMAIN,
+ MOD_PD_NOTIFICATION_IDX_POWER_STATE_TRANSITION),
+ .pd_pre_transition_notification_id = FWK_ID_NOTIFICATION_INIT(
+ FWK_MODULE_IDX_POWER_DOMAIN,
+ MOD_PD_NOTIFICATION_IDX_POWER_STATE_PRE_TRANSITION),
+ }),
+};
diff --git a/product/sgm775/scp_ramfw/config_css_clock.c b/product/sgm775/scp_ramfw/config_css_clock.c
new file mode 100644
index 00000000..aa83f2c3
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_css_clock.c
@@ -0,0 +1,302 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_id.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_css_clock.h>
+#include <mod_system_pll.h>
+#include <mod_pik_clock.h>
+#include <sgm775_pik.h>
+
+static const struct mod_css_clock_rate rate_table_cpu_group_big[] = {
+ {
+ /* Super Underdrive */
+ .rate = 1313 * FWK_MHZ,
+ .pll_rate = 1313 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL1,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ .clock_mod_numerator = 1,
+ .clock_mod_denominator = 1,
+ },
+ {
+ /* Underdrive */
+ .rate = 1531 * FWK_MHZ,
+ .pll_rate = 1531 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL1,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ .clock_mod_numerator = 1,
+ .clock_mod_denominator = 1,
+ },
+ {
+ /* Nominal */
+ .rate = 1750 * FWK_MHZ,
+ .pll_rate = 1750 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL1,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ .clock_mod_numerator = 1,
+ .clock_mod_denominator = 1,
+ },
+ {
+ /* Overdrive */
+ .rate = 2100 * FWK_MHZ,
+ .pll_rate = 2100 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL1,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ .clock_mod_numerator = 1,
+ .clock_mod_denominator = 1,
+ },
+ {
+ /* Super Overdrive */
+ .rate = 2450 * FWK_MHZ,
+ .pll_rate = 2450 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL1,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ .clock_mod_numerator = 1,
+ .clock_mod_denominator = 1,
+ },
+};
+
+static const struct mod_css_clock_rate rate_table_cpu_group_little[] = {
+ {
+ /* Super Underdrive */
+ .rate = 665 * FWK_MHZ,
+ .pll_rate = 665 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL0,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ .clock_mod_numerator = 1,
+ .clock_mod_denominator = 1,
+ },
+ {
+ /* Underdrive */
+ .rate = 998 * FWK_MHZ,
+ .pll_rate = 998 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL0,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ .clock_mod_numerator = 1,
+ .clock_mod_denominator = 1,
+ },
+ {
+ /* Nominal */
+ .rate = 1330 * FWK_MHZ,
+ .pll_rate = 1330 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL0,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ .clock_mod_numerator = 1,
+ .clock_mod_denominator = 1,
+ },
+ {
+ /* Overdrive */
+ .rate = 1463 * FWK_MHZ,
+ .pll_rate = 1463 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL0,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ .clock_mod_numerator = 1,
+ .clock_mod_denominator = 1,
+ },
+ {
+ /* Super Overdrive */
+ .rate = 1596 * FWK_MHZ,
+ .pll_rate = 1596 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL0,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ .clock_mod_numerator = 1,
+ .clock_mod_denominator = 1,
+ },
+};
+
+static const struct mod_css_clock_rate rate_table_gpu[] = {
+ {
+ .rate = 450 * FWK_MHZ,
+ .pll_rate = 450 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_MSCLOCK_SOURCE_PRIVPLLCLK,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ },
+ {
+ .rate = 487500 * FWK_KHZ,
+ .pll_rate = 487500 * FWK_KHZ,
+ .clock_source = MOD_PIK_CLOCK_MSCLOCK_SOURCE_PRIVPLLCLK,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ },
+ {
+ .rate = 525 * FWK_MHZ,
+ .pll_rate = 525 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_MSCLOCK_SOURCE_PRIVPLLCLK,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ },
+ {
+ .rate = 562500 * FWK_KHZ,
+ .pll_rate = 562500 * FWK_KHZ,
+ .clock_source = MOD_PIK_CLOCK_MSCLOCK_SOURCE_PRIVPLLCLK,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ },
+ {
+ /* Nominal */
+ .rate = 600 * FWK_MHZ,
+ .pll_rate = 600 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_MSCLOCK_SOURCE_PRIVPLLCLK,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ },
+};
+
+static const struct mod_css_clock_rate rate_table_vpu[] = {
+ {
+ /* Nominal */
+ .rate = 600 * FWK_MHZ,
+ .pll_rate = 600 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_MSCLOCK_SOURCE_PRIVPLLCLK,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ },
+};
+
+static const fwk_id_t member_table_cpu_group_big[] = {
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 4),
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 5),
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 6),
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 7),
+};
+
+static const fwk_id_t member_table_cpu_group_little[] = {
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 0),
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 1),
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 2),
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 3),
+};
+
+static const fwk_id_t member_table_gpu[] = {
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 8),
+};
+
+static const fwk_id_t member_table_vpu[] = {
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 9),
+};
+
+static const fwk_id_t member_table_dpu[] = {
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 11),
+};
+
+static const struct fwk_element css_clock_element_table[] = {
+ {
+ .name = "CPU_GROUP_BIG",
+ .data = &((struct mod_css_clock_dev_config) {
+ .clock_type = MOD_CSS_CLOCK_TYPE_INDEXED,
+ .rate_table = rate_table_cpu_group_big,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_group_big),
+ .clock_switching_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_SYSREFCLK,
+ .pll_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SYSTEM_PLL, 1),
+ .pll_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SYSTEM_PLL,
+ MOD_SYSTEM_PLL_API_TYPE_DEFAULT),
+ .member_table = member_table_cpu_group_big,
+ .member_count = FWK_ARRAY_SIZE(member_table_cpu_group_big),
+ .member_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PIK_CLOCK,
+ MOD_PIK_CLOCK_API_TYPE_CSS),
+ .initial_rate = 1750 * FWK_MHZ,
+ .modulation_supported = true,
+ }),
+ },
+ {
+ .name = "CPU_GROUP_LITTLE",
+ .data = &((struct mod_css_clock_dev_config) {
+ .clock_type = MOD_CSS_CLOCK_TYPE_INDEXED,
+ .rate_table = rate_table_cpu_group_little,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_group_little),
+ .clock_switching_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_SYSREFCLK,
+ .pll_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SYSTEM_PLL, 0),
+ .pll_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SYSTEM_PLL,
+ MOD_SYSTEM_PLL_API_TYPE_DEFAULT),
+ .member_table = member_table_cpu_group_little,
+ .member_count = FWK_ARRAY_SIZE(member_table_cpu_group_little),
+ .member_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PIK_CLOCK,
+ MOD_PIK_CLOCK_API_TYPE_CSS),
+ .initial_rate = 1330 * FWK_MHZ,
+ .modulation_supported = true,
+ }),
+ },
+ {
+ .name = "GPU",
+ .data = &((struct mod_css_clock_dev_config) {
+ .clock_type = MOD_CSS_CLOCK_TYPE_INDEXED,
+ .rate_table = rate_table_gpu,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_gpu),
+ .clock_switching_source = MOD_PIK_CLOCK_GPUCLK_SOURCE_SYSREFCLK,
+ .pll_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SYSTEM_PLL, 2),
+ .pll_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SYSTEM_PLL,
+ MOD_SYSTEM_PLL_API_TYPE_DEFAULT),
+ .member_table = member_table_gpu,
+ .member_count = FWK_ARRAY_SIZE(member_table_gpu),
+ .member_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PIK_CLOCK,
+ MOD_PIK_CLOCK_API_TYPE_CSS),
+ .initial_rate = 600 * FWK_MHZ,
+ .modulation_supported = false,
+ }),
+ },
+ {
+ .name = "VPU",
+ .data = &((struct mod_css_clock_dev_config) {
+ .clock_type = MOD_CSS_CLOCK_TYPE_INDEXED,
+ .rate_table = rate_table_vpu,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_vpu),
+ .clock_switching_source = MOD_PIK_CLOCK_VPUCLK_SOURCE_SYSREFCLK,
+ .pll_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SYSTEM_PLL, 4),
+ .pll_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SYSTEM_PLL,
+ MOD_SYSTEM_PLL_API_TYPE_DEFAULT),
+ .member_table = member_table_vpu,
+ .member_count = FWK_ARRAY_SIZE(member_table_vpu),
+ .member_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PIK_CLOCK,
+ MOD_PIK_CLOCK_API_TYPE_CSS),
+ .initial_rate = 600 * FWK_MHZ,
+ .modulation_supported = false,
+ }),
+ },
+ {
+ .name = "DPU",
+ .data = &((struct mod_css_clock_dev_config) {
+ .clock_type = MOD_CSS_CLOCK_TYPE_NON_INDEXED,
+ .clock_default_source = MOD_PIK_CLOCK_DPUCLK_SOURCE_DISPLAYPLLCLK,
+ .clock_switching_source = MOD_PIK_CLOCK_DPUCLK_SOURCE_PIXELCLK,
+ .pll_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SYSTEM_PLL, 3),
+ .pll_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SYSTEM_PLL,
+ MOD_SYSTEM_PLL_API_TYPE_DEFAULT),
+ .member_table = member_table_dpu,
+ .member_count = FWK_ARRAY_SIZE(member_table_dpu),
+ .member_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PIK_CLOCK,
+ MOD_PIK_CLOCK_API_TYPE_CSS),
+ .initial_rate = 260 * FWK_MHZ,
+ .modulation_supported = false,
+ }),
+ },
+ { }, /* Termination description. */
+};
+
+static const struct fwk_element *css_clock_get_element_table
+ (fwk_id_t module_id)
+{
+ return css_clock_element_table;
+}
+
+struct fwk_module_config config_css_clock = {
+ .get_element_table = css_clock_get_element_table,
+ .data = NULL,
+};
diff --git a/product/sgm775/scp_ramfw/config_ddr_phy500.c b/product/sgm775/scp_ramfw/config_ddr_phy500.c
new file mode 100644
index 00000000..ad66c744
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_ddr_phy500.c
@@ -0,0 +1,63 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+#include <fwk_element.h>
+#include <fwk_module.h>
+#include <mod_ddr_phy500.h>
+#include <system_mmap.h>
+
+/* Default configuration values for DDR PHY500 devices. */
+static const struct mod_ddr_phy500_reg ddr_reg_val = {
+ .T_CTRL_DELAY = 0x00000000,
+ .READ_DELAY = 0x00000003,
+ .T_CTRL_UPD_MIN = 0x00000000,
+ .DELAY_SEL = 0x0000000A,
+ .CAPTURE_MASK = 0x0000001f,
+ .T_RDDATA_EN = 0x00001C00,
+ .T_RDLAT = 0x00000016,
+ .T_WRLAT = 0x01000000,
+ .DFI_WR_PREMBL = 0x00000002,
+ .LP_ACK = 0x00641300,
+};
+
+/* Table of DDR PHY500 element descriptions. */
+static struct fwk_element ddr_phy500_element_table[] = {
+ [0] = { .name = "DDR_PHY500-0",
+ .data = &((struct mod_ddr_phy500_element_config) {
+ .ddr = DDR_PHY0,
+ }),
+ },
+ [1] = { .name = "DDR_PHY500-1",
+ .data = &((struct mod_ddr_phy500_element_config) {
+ .ddr = DDR_PHY1,
+ }),
+ },
+ [2] = { .name = "DDR_PHY500-2",
+ .data = &((struct mod_ddr_phy500_element_config) {
+ .ddr = DDR_PHY2,
+ }),
+ },
+ [3] = { .name = "DDR_PHY500-3",
+ .data = &((struct mod_ddr_phy500_element_config) {
+ .ddr = DDR_PHY3,
+ }),
+ },
+ [4] = { }, /* Termination description. */
+};
+
+static const struct fwk_element *ddr_phy500_get_element_table
+ (fwk_id_t module_id)
+{
+ return ddr_phy500_element_table;
+}
+
+/* Configuration of the DDR PHY500 module. */
+struct fwk_module_config config_ddr_phy500 = {
+ .get_element_table = ddr_phy500_get_element_table,
+ .data = &((struct mod_ddr_phy500_module_config) {
+ .ddr_reg_val = &ddr_reg_val,
+ }),
+};
diff --git a/product/sgm775/scp_ramfw/config_dmc500.c b/product/sgm775/scp_ramfw/config_dmc500.c
new file mode 100644
index 00000000..567c787b
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_dmc500.c
@@ -0,0 +1,221 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_dmc500.h>
+#include <system_mmap.h>
+
+#define COL_BITS 1
+#define BANK_BITS 0
+#define RANK_BITS 1
+#define BANK_GROUP 0
+#define ROW_BITS 4
+#define MEM_TYPE 3
+#define MEM_BURST 2
+#define DEVICE_WIDTH 2
+#define ADDR_SHUTTER 2
+
+static const struct mod_dmc500_reg reg_val = {
+ .ADDRESS_CONTROL = ADDRESS_CONTROL_VAL(RANK_BITS,
+ BANK_BITS,
+ ROW_BITS,
+ COL_BITS),
+ .RANK_REMAP_CONTROL = 0x00000000,
+ .MEMORY_TYPE = MEMORY_TYPE_VAL(BANK_GROUP,
+ DEVICE_WIDTH,
+ MEM_TYPE),
+ .FORMAT_CONTROL = FORMAT_CONTROL_VAL(MEM_BURST),
+ .DECODE_CONTROL = 0x00000011,
+ .FEATURE_CONTROL = 0x00000000,
+ .ODT_WR_CONTROL_31_00 = 0x00000000,
+ .ODT_RD_CONTROL_31_00 = 0x00000000,
+ .ODT_TIMING = 0x10001000,
+ .T_REFI = 0x0000030b,
+ .T_RFC = 0x000340d0,
+ .T_RDPDEN = 0x0000002e,
+ .T_RCD = 0x0000001d,
+ .T_RAS = 0x80000044,
+ .T_RP = 0x0000221d,
+ .T_RRD = 0x00001010,
+ .T_ACT_WINDOW = 0x00000040,
+ .T_RTR = 0x000c0808,
+ .T_RTW = 0x001f1f1f,
+ .T_RTP = 0x0000000C,
+ .T_WR = 0x00000035,
+ .T_WTR = 0x00082929,
+ .T_WTW = 0x000b0808,
+ .T_XTMW = 0x00000020,
+ .T_CLOCK_CONTROL = 0x1119030d,
+ .T_EP = 0x0000000C,
+ .T_XP = 0x000c000c,
+ .T_ESR = 0x00000019,
+ .T_XSR = 0x00e100e1,
+ .ADDRESS_MAP = ADDRESS_MAP_VAL(ADDR_SHUTTER),
+ .SI0_SI_INTERRUPT_CONTROL = 0x00000000,
+ .SI0_PMU_REQ_CONTROL = 0x00000B1A,
+ .SI0_PMU_REQ_ATTRIBUTE_MASK_0 = 0xB0562AA1,
+ .SI0_PMU_REQ_ATTRIBUTE_MATCH_0 = 0xD0FB6716,
+ .SI0_PMU_REQ_ATTRIBUTE_MASK_1 = 0x7FC24C15,
+ .SI0_PMU_REQ_ATTRIBUTE_MATCH_1 = 0xF7A9B2AC,
+ .SI0_PMU_REQ_ATTRIBUTE_MASK_2 = 0xDD35FA69,
+ .SI0_PMU_REQ_ATTRIBUTE_MATCH_2 = 0x3555A8F5,
+ .SI0_PMU_REQ_ATTRIBUTE_MASK_3 = 0xDE382B10,
+ .SI0_PMU_REQ_ATTRIBUTE_MATCH_3 = 0x3484B32C,
+ .SI0_THRESHOLD_CONTROL = 0x80000801,
+ .SI1_SI_INTERRUPT_CONTROL = 0x00000000,
+ .SI1_PMU_REQ_CONTROL = 0x00000B1A,
+ .SI1_PMU_REQ_ATTRIBUTE_MASK_0 = 0xB0562AA1,
+ .SI1_PMU_REQ_ATTRIBUTE_MATCH_0 = 0xD0FB6716,
+ .SI1_PMU_REQ_ATTRIBUTE_MASK_1 = 0x7FC24C15,
+ .SI1_PMU_REQ_ATTRIBUTE_MATCH_1 = 0xF7A9B2AC,
+ .SI1_PMU_REQ_ATTRIBUTE_MASK_2 = 0xDD35FA69,
+ .SI1_PMU_REQ_ATTRIBUTE_MATCH_2 = 0x3555A8F5,
+ .SI1_PMU_REQ_ATTRIBUTE_MASK_3 = 0xDE382B10,
+ .SI1_PMU_REQ_ATTRIBUTE_MATCH_3 = 0x3484B32C,
+ .SI1_THRESHOLD_CONTROL = 0x80000801,
+ .QUEUE_THRESHOLD_CONTROL_31_00 = 0xDEF8D550,
+ .QUEUE_THRESHOLD_CONTROL_63_32 = 0xB038362F,
+ .DCB_INTERRUPT_CONTROL = 0x00000000,
+ .PMU_DCB_CONTROL = 0x00000800,
+ .PMU_DATA_CONTROL_BLOCK_ATTRIBUTE_MASK_0 = 0xFD98CF7D,
+ .PMU_DATA_CONTROL_BLOCK_ATTRIBUTE_MATCH_0 = 0x9F276EB5,
+ .PMU_DATA_CONTROL_BLOCK_ATTRIBUTE_MASK_1 = 0x40B1FC24,
+ .PMU_DATA_CONTROL_BLOCK_ATTRIBUTE_MATCH_1 = 0x04BBF4FA,
+ .PMU_DATA_CONTROL_BLOCK_ATTRIBUTE_MASK_2 = 0x8089B0AF,
+ .PMU_DATA_CONTROL_BLOCK_ATTRIBUTE_MATCH_2 = 0x7D26E0BE,
+ .PMU_TAG_ENTRIES_ATTRIBUTE_MASK = 0x000000CE,
+ .PMU_TAG_ENTRIES_ATTRIBUTE_MATCH = 0x00000056,
+ .QE_INTERRUPT_CONTROL = 0x00000000,
+ .RANK_TURNAROUND_CONTROL = 0x8909020F,
+ .HIT_TURNAROUND_CONTROL = 0x37B8222C,
+ .QOS_CLASS_CONTROL = 0x00000D50,
+ .ESCALATION_CONTROL = 0x000D0C00,
+ .QV_CONTROL_31_00 = 0xED2626B0,
+ .QV_CONTROL_63_32 = 0x4159BE97,
+ .RT_CONTROL_31_00 = 0xE8DC790A,
+ .RT_CONTROL_63_32 = 0x9441A291,
+ .TIMEOUT_CONTROL = 0x00000003,
+ .WRITE_PRIORITY_CONTROL_31_00 = 0x81268C40,
+ .WRITE_PRIORITY_CONTROL_63_32 = 0x15F20D15,
+ .DIR_TURNAROUND_CONTROL = 0x06060403,
+ .HIT_PREDICTION_CONTROL = 0x00020705,
+ .REFRESH_PRIORITY = 0x00000204,
+ .MC_UPDATE_CONTROL = 0x0000ff00,
+ .PHY_UPDATE_CONTROL = 0x15A3925F,
+ .PHY_MASTER_CONTROL = 0x6875AF9A,
+ .LOW_POWER_CONTROL = 0x000E0801,
+ .PMU_QE_CONTROL = 0x00000C0D,
+ .PMU_QE_MUX = 0x05670023,
+ .PMU_QOS_ENGINE_ATTRIBUTE_MASK_0 = 0x000000F1,
+ .PMU_QOS_ENGINE_ATTRIBUTE_MATCH_0 = 0x00000662,
+ .PMU_QOS_ENGINE_ATTRIBUTE_MASK_1 = 0x000000DD,
+ .PMU_QOS_ENGINE_ATTRIBUTE_MATCH_1 = 0x00000097,
+ .PMU_QOS_ENGINE_ATTRIBUTE_MASK_2 = 0x0000001A,
+ .PMU_QOS_ENGINE_ATTRIBUTE_MATCH_2 = 0x00000755,
+ .PMU_QUEUED_ENTRIES_ATTRIBUTE_MASK = 0xAD625ED5,
+ .PMU_QUEUED_ENTRIES_ATTRIBUTE_MATCH = 0x853C65BB,
+ .MI_INTERRUPT_CONTROL = 0x00000000,
+ .POWER_DOWN_CONTROL = 0x00000005,
+ .REFRESH_CONTROL = 0x00000000,
+ .PMU_MI_CONTROL = 0x00000100,
+ .PMU_MEMORY_IF_ATTRIBUTE_MASK_0 = 0x0032BB0E,
+ .PMU_MEMORY_IF_ATTRIBUTE_MATCH_0 = 0x0033F5AB,
+ .PMU_MEMORY_IF_ATTRIBUTE_MASK_1 = 0x00296B28,
+ .PMU_MEMORY_IF_ATTRIBUTE_MATCH_1 = 0x002C67BF,
+ .PMU_BANK_STATES_ATTRIBUTE_MASK = 0x00000005,
+ .PMU_BANK_STATES_ATTRIBUTE_MATCH = 0x00000019,
+ .PMU_RANK_STATES_ATTRIBUTE_MASK = 0x0000001B,
+ .PMU_RANK_STATES_ATTRIBUTE_MATCH = 0x00000020,
+ .CFG_INTERRUPT_CONTROL = 0x00000000,
+ .T_RDDATA_EN = 0x00000001,
+ .T_PHYRDLAT = 0x0000003f,
+ .T_PHYWRLAT = 0x010f170e,
+ .ERR_RAMECC_CTLR = 0x00000000,
+ .PHY_POWER_CONTROL = 0x0000012a,
+ .T_PHY_TRAIN = 0x00f8000a,
+ .PHYUPD_INIT = 0x00000000,
+ .REFRESH_ENABLE = 0x00000001,
+ .MI_STATE_CONTROL = 0,
+ .QUEUE_STATE_CONTROL = 0,
+ .SI0_SI_STATE_CONTROL = 0,
+ .SI1_SI_STATE_CONTROL = 0,
+};
+
+/* Table of DMC500 elements descriptions. */
+static struct fwk_element dmc500_element_table[] = {
+ [0] = { .name = "DMC500-0",
+ .data = &((struct mod_dmc500_element_config) {
+ .dmc = DMC_INTERNAL0,
+ .ddr_phy_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_DDR_PHY500, 0),
+ }),
+ },
+ [1] = { .name = "DMC500-1",
+ .data = &((struct mod_dmc500_element_config) {
+ .dmc = DMC_INTERNAL1,
+ .ddr_phy_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_DDR_PHY500, 1),
+ }),
+ },
+ [2] = { .name = "DMC500-2",
+ .data = &((struct mod_dmc500_element_config) {
+ .dmc = DMC_INTERNAL2,
+ .ddr_phy_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_DDR_PHY500, 2),
+ }),
+ },
+ [3] = { .name = "DMC500-3",
+ .data = &((struct mod_dmc500_element_config) {
+ .dmc = DMC_INTERNAL3,
+ .ddr_phy_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_DDR_PHY500, 3),
+ }),
+ },
+ [4] = { }, /* Termination description. */
+};
+
+static const struct fwk_element *dmc500_get_element_table(fwk_id_t module_id)
+{
+ return dmc500_element_table;
+}
+
+static void direct_ddr_cmd(struct mod_dmc500_reg *dmc)
+{
+ dmc->DIRECT_CMD_SETTINGS = 0x00C80000;
+ dmc->DIRECT_CMD = 0x00000000;
+ dmc->DIRECT_CLK_DISABLE = 0x00280003;
+ dmc->CLK_STATUS_OVERRIDE = 0x00000003;
+ dmc->DIRECT_CMD_SETTINGS = 0x01F40003;
+ dmc->DIRECT_CMD = 0x00800080;
+ dmc->RANK_STATUS_OVERRIDE = 0x30000003;
+ dmc->DIRECT_CMD_SETTINGS = 0x04b00003;
+ dmc->DIRECT_CMD = 0x00800FE0;
+ dmc->DIRECT_CMD_SETTINGS = 0x00500003;
+ dmc->DIRECT_CMD = 0x008011E0;
+ dmc->DIRECT_CMD_SETTINGS = 0x00140003;
+ dmc->DIRECT_CMD = 0x06d601c6;
+ dmc->DIRECT_CMD_SETTINGS = 0x01000003;
+ dmc->DIRECT_CMD = 0x00f60dc6;
+ dmc->DIRECT_CMD_SETTINGS = 0x00140003;
+ dmc->DIRECT_CMD = 0x31d603c6;
+ dmc->DIRECT_CMD_SETTINGS = 0x00140003;
+ dmc->DIRECT_CMD = 0x16f601c6;
+ dmc->DIRECT_CMD_SETTINGS = 0x00140003;
+ dmc->DIRECT_CMD = 0x2dd602c6;
+ dmc->DIRECT_CMD_SETTINGS = 0x02000003;
+ dmc->DIRECT_CMD = 0x00d60de6;
+}
+
+/* Configuration of the DMC500 module. */
+struct fwk_module_config config_dmc500 = {
+ .get_element_table = dmc500_get_element_table,
+ .data = &((struct mod_dmc500_module_config) {
+ .timer_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_TIMER, 0),
+ .ddr_phy_module_id = FWK_ID_MODULE_INIT(FWK_MODULE_IDX_DDR_PHY500),
+ .ddr_phy_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_DDR_PHY500, 0),
+ .reg_val = &reg_val,
+ .direct_ddr_cmd = direct_ddr_cmd,
+ }),
+};
diff --git a/product/sgm775/scp_ramfw/config_dvfs.c b/product/sgm775/scp_ramfw/config_dvfs.c
new file mode 100644
index 00000000..43c7ab97
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_dvfs.c
@@ -0,0 +1,129 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <config_dvfs.h>
+#include <mod_dvfs.h>
+
+static const struct mod_dvfs_domain_config cpu_group_little = {
+ .psu_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PSU, 0),
+ .clock_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CLOCK, 1),
+ .latency = 1200,
+ .sustained_idx = 2,
+ .opps = (struct mod_dvfs_opp[]) {
+ {
+ .frequency = 665 * FWK_MHZ,
+ .voltage = 100,
+ },
+ {
+ .frequency = 998 * FWK_MHZ,
+ .voltage = 200,
+ },
+ {
+ .frequency = 1330 * FWK_MHZ,
+ .voltage = 300,
+ },
+ {
+ .frequency = 1463 * FWK_MHZ,
+ .voltage = 400,
+ },
+ {
+ .frequency = 1596 * FWK_MHZ,
+ .voltage = 500,
+ },
+ { }
+ }
+};
+
+static const struct mod_dvfs_domain_config cpu_group_big = {
+ .psu_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PSU, 1),
+ .clock_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CLOCK, 0),
+ .latency = 1200,
+ .sustained_idx = 2,
+ .opps = (struct mod_dvfs_opp[]) {
+ {
+ .frequency = 1313 * FWK_MHZ,
+ .voltage = 100,
+ },
+ {
+ .frequency = 1531 * FWK_MHZ,
+ .voltage = 200,
+ },
+ {
+ .frequency = 1750 * FWK_MHZ,
+ .voltage = 300,
+ },
+ {
+ .frequency = 2100 * FWK_MHZ,
+ .voltage = 400,
+ },
+ {
+ .frequency = 2450 * FWK_MHZ,
+ .voltage = 500,
+ },
+ { }
+ }
+};
+
+static const struct mod_dvfs_domain_config gpu = {
+ .psu_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PSU, 2),
+ .clock_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CLOCK, 2),
+ .latency = 1200,
+ .sustained_idx = 4,
+ .opps = (struct mod_dvfs_opp[]) {
+ {
+ .frequency = 450 * FWK_MHZ,
+ .voltage = 100,
+ },
+ {
+ .frequency = 487500 * FWK_KHZ,
+ .voltage = 200,
+ },
+ {
+ .frequency = 525 * FWK_MHZ,
+ .voltage = 300,
+ },
+ {
+ .frequency = 562500 * FWK_KHZ,
+ .voltage = 400,
+ },
+ {
+ .frequency = 600 * FWK_MHZ,
+ .voltage = 500,
+ },
+ { }
+ }
+};
+
+static const struct fwk_element element_table[] = {
+ [DVFS_ELEMENT_IDX_LITTLE] = {
+ .name = "CPU_GROUP_LITTLE",
+ .data = &cpu_group_little,
+ },
+ [DVFS_ELEMENT_IDX_BIG] = {
+ .name = "CPU_GROUP_BIG",
+ .data = &cpu_group_big,
+ },
+ [DVFS_ELEMENT_IDX_GPU] = {
+ .name = "GPU",
+ .data = &gpu,
+ },
+ { }
+};
+
+static const struct fwk_element *dvfs_get_element_table(fwk_id_t module_id)
+{
+ return element_table;
+}
+
+struct fwk_module_config config_dvfs = {
+ .get_element_table = dvfs_get_element_table,
+ .data = NULL,
+};
diff --git a/product/sgm775/scp_ramfw/config_dvfs.h b/product/sgm775/scp_ramfw/config_dvfs.h
new file mode 100644
index 00000000..365cc1cd
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_dvfs.h
@@ -0,0 +1,18 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef CONFIG_DVFS_H
+#define CONFIG_DVFS_H
+
+enum dvfs_element_idx {
+ DVFS_ELEMENT_IDX_LITTLE,
+ DVFS_ELEMENT_IDX_BIG,
+ DVFS_ELEMENT_IDX_GPU,
+ DVFS_ELEMENT_IDX_COUNT
+};
+
+#endif /* CONFIG_DVFS_H */
diff --git a/product/sgm775/scp_ramfw/config_log.c b/product/sgm775/scp_ramfw/config_log.c
new file mode 100644
index 00000000..938ca39b
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_log.c
@@ -0,0 +1,63 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_banner.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_clock.h>
+#include <mod_log.h>
+#include <mod_pl011.h>
+#include <system_mmap.h>
+#include <clock_devices.h>
+
+/*
+ * PL011 module
+ */
+static const struct fwk_element pl011_element_table[] = {
+ [0] = {
+ .name = "board-uart1",
+ .data = &((struct mod_pl011_device_config) {
+ .reg_base = BOARD_UART1_BASE,
+ .baud_rate_bps = 115200,
+ .clock_rate_hz = 24 * FWK_MHZ,
+ .clock_id = FWK_ID_ELEMENT_INIT(
+ FWK_MODULE_IDX_CLOCK,
+ CLOCK_DEV_IDX_FCMCLK),
+ }),
+ },
+ [1] = {},
+};
+
+static const struct fwk_element *get_pl011_table(fwk_id_t module_id)
+{
+ return pl011_element_table;
+}
+
+struct fwk_module_config config_pl011 = {
+ .get_element_table = get_pl011_table,
+};
+
+/*
+ * Log module
+ */
+static const struct mod_log_config log_data = {
+ .device_id = FWK_ID_ELEMENT(FWK_MODULE_IDX_PL011, 0),
+ .api_id = FWK_ID_API(FWK_MODULE_IDX_PL011, 0),
+ .log_groups = MOD_LOG_GROUP_ERROR |
+ MOD_LOG_GROUP_INFO |
+ MOD_LOG_GROUP_WARNING |
+ MOD_LOG_GROUP_DEBUG,
+ .banner = FWK_BANNER_SCP
+ FWK_BANNER_RAM_FIRMWARE
+ BUILD_VERSION_DESCRIBE_STRING "\n",
+};
+
+struct fwk_module_config config_log = {
+ .get_element_table = NULL,
+ .data = &log_data,
+};
diff --git a/product/sgm775/scp_ramfw/config_mhu.c b/product/sgm775/scp_ramfw/config_mhu.c
new file mode 100644
index 00000000..b6f89940
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_mhu.c
@@ -0,0 +1,54 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_id.h>
+#include <fwk_module.h>
+#include <mod_mhu.h>
+#include <sgm775_irq.h>
+#include <sgm775_mhu.h>
+#include <sgm775_mmap.h>
+
+static const struct fwk_element mhu_element_table[] = {
+ [SGM775_MHU_DEVICE_IDX_S] = {
+ .name = "MHU_S",
+ .sub_element_count = 1,
+ .data = &((struct mod_mhu_device_config) {
+ .irq = MHU_SECURE_IRQ,
+ .in = MHU_CPU_INTR_S_BASE,
+ .out = MHU_SCP_INTR_S_BASE,
+ })
+ },
+ [SGM775_MHU_DEVICE_IDX_NS_H] = {
+ .name = "MHU_NS_H",
+ .sub_element_count = 1,
+ .data = &((struct mod_mhu_device_config) {
+ .irq = MHU_HIGH_PRIO_IRQ,
+ .in = MHU_CPU_INTR_H_BASE,
+ .out = MHU_SCP_INTR_H_BASE,
+ })
+ },
+ [SGM775_MHU_DEVICE_IDX_NS_L] = {
+ .name = "MHU_NS_L",
+ .sub_element_count = 1,
+ .data = &((struct mod_mhu_device_config) {
+ .irq = MHU_LOW_PRIO_IRQ,
+ .in = MHU_CPU_INTR_L_BASE,
+ .out = MHU_SCP_INTR_L_BASE,
+ })
+ },
+ [SGM775_MHU_DEVICE_IDX_COUNT] = {},
+};
+
+static const struct fwk_element *mhu_get_element_table(fwk_id_t module_id)
+{
+ return mhu_element_table;
+}
+
+struct fwk_module_config config_mhu = {
+ .get_element_table = mhu_get_element_table,
+};
diff --git a/product/sgm775/scp_ramfw/config_mock_psu.c b/product/sgm775/scp_ramfw/config_mock_psu.c
new file mode 100644
index 00000000..366f2023
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_mock_psu.c
@@ -0,0 +1,52 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_module.h>
+#include <mod_mock_psu.h>
+
+static const struct fwk_element element_table[] = {
+ {
+ .name = "CPU_GROUP_LITTLE",
+ .data = &(const struct mod_mock_psu_device_config) {
+ .default_enabled = true,
+ .default_voltage = 100,
+ },
+ },
+ {
+ .name = "CPU_GROUP_BIG",
+ .data = &(const struct mod_mock_psu_device_config) {
+ .default_enabled = true,
+ .default_voltage = 100,
+ },
+ },
+ {
+ .name = "GPU",
+ .data = &(const struct mod_mock_psu_device_config) {
+ .default_enabled = true,
+ .default_voltage = 100,
+ },
+ },
+ {
+ .name = "VPU",
+ .data = &(const struct mod_mock_psu_device_config) {
+ .default_enabled = true,
+ .default_voltage = 100,
+ },
+ },
+ { }
+};
+
+static const struct fwk_element *get_element_table(fwk_id_t module_id)
+{
+ return element_table;
+}
+
+struct fwk_module_config config_mock_psu = {
+ .get_element_table = get_element_table,
+ .data = NULL,
+};
diff --git a/product/sgm775/scp_ramfw/config_pik_clock.c b/product/sgm775/scp_ramfw/config_pik_clock.c
new file mode 100644
index 00000000..06c37de7
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_pik_clock.c
@@ -0,0 +1,295 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_id.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <mod_pik_clock.h>
+#include <sgm775_pik.h>
+#include <system_clock.h>
+
+/*
+ * Rate lookup tables
+ */
+
+static struct mod_pik_clock_rate rate_table_cpu_a55[] = {
+ {
+ .rate = 1330 * FWK_MHZ,
+ .source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL0,
+ .divider_reg = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .divider = 1, /* Rate adjusted via CPU PLL */
+ },
+};
+
+static struct mod_pik_clock_rate rate_table_cpu_a75[] = {
+ {
+ .rate = 1750 * FWK_MHZ,
+ .source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL1,
+ .divider_reg = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .divider = 1, /* Rate adjusted via CPU PLL */
+ },
+};
+
+static struct mod_pik_clock_rate rate_table_gpu[] = {
+ {
+ .rate = 600 * FWK_MHZ,
+ .source = MOD_PIK_CLOCK_MSCLOCK_SOURCE_PRIVPLLCLK,
+ .divider_reg = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .divider = 1, /* Rate adjusted via GPU PLL */
+ },
+};
+
+static struct mod_pik_clock_rate rate_table_vpu[] = {
+ {
+ .rate = 600 * FWK_MHZ,
+ .source = MOD_PIK_CLOCK_VPUCLK_SOURCE_VIDEOPLLCLK,
+ .divider_reg = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .divider = 1, /* Rate adjusted via VPU PLL */
+ },
+};
+
+static struct mod_pik_clock_rate rate_table_dpu[] = {
+ {
+ .rate = 260 * FWK_MHZ,
+ .source = MOD_PIK_CLOCK_DPUCLK_SOURCE_DISPLAYPLLCLK,
+ .divider_reg = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .divider = 1, /* Rate adjusted via display PLL */
+ },
+};
+
+static struct mod_pik_clock_rate rate_table_aclkdp[] = {
+ {
+ .rate = (CLOCK_RATE_SYSPLLCLK / 3),
+ .source = MOD_PIK_CLOCK_ACLKDPU_SOURCE_SYSPLLCLK,
+ .divider_reg = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_SYS,
+ .divider = 3,
+ },
+};
+
+static const struct mod_pik_clock_rate rate_table_sys_fcmclk[] = {
+ {
+ .rate = CLOCK_RATE_SYSPLLCLK,
+ .source = MOD_PIK_CLOCK_MSCLOCK_SOURCE_SYSPLLCLK,
+ .divider_reg = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_SYS,
+ .divider = 1,
+ },
+};
+
+static const struct fwk_element pik_clock_element_table[] = {
+ /*
+ * A55 CPUS
+ */
+ {
+ .name = "CLUS0_CPU0",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[0].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[0].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[0].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a55,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a55),
+ .initial_rate = 1330 * FWK_MHZ,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "CLUS0_CPU1",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[1].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[1].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[1].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a55,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a55),
+ .initial_rate = 1330 * FWK_MHZ,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "CLUS0_CPU2",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[2].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[2].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[2].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a55,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a55),
+ .initial_rate = 1330 * FWK_MHZ,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "CLUS0_CPU3",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[3].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[3].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[3].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a55,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a55),
+ .initial_rate = 1330 * FWK_MHZ,
+ .defer_initialization = false,
+ }),
+ },
+ /*
+ * A75 CPUS
+ */
+ {
+ .name = "CLUS0_CPU4",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[4].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[4].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[4].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a75,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a75),
+ .initial_rate = 1750 * FWK_MHZ,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "CLUS0_CPU5",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[5].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[5].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[5].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a75,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a75),
+ .initial_rate = 1750 * FWK_MHZ,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "CLUS0_CPU6",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[6].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[6].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[6].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a75,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a75),
+ .initial_rate = 1750 * FWK_MHZ,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "CLUS0_CPU7",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[7].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[7].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[7].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a75,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a75),
+ .initial_rate = 1750 * FWK_MHZ,
+ .defer_initialization = false,
+ }),
+ },
+ /*
+ * GPU
+ */
+ {
+ .name = "GPU",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_MULTI_SOURCE,
+ .is_group_member = true,
+ .control_reg = &PIK_GPU->GPUCLK_CTRL,
+ .divsys_reg = &PIK_GPU->GPUCLK_DIV1,
+ .divext_reg = &PIK_GPU->GPUCLK_DIV2,
+ .rate_table = rate_table_gpu,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_gpu),
+ .initial_rate = 600 * FWK_MHZ,
+ .defer_initialization = false,
+ }),
+ },
+ /*
+ * VPU
+ */
+ {
+ .name = "VPU",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_MULTI_SOURCE,
+ .is_group_member = true,
+ .control_reg = &PIK_VPU->VIDEOCLK_CTRL,
+ .divsys_reg = &PIK_VPU->VIDEOCLK_DIV1,
+ .divext_reg = &PIK_VPU->VIDEOCLK_DIV2,
+ .rate_table = rate_table_vpu,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_vpu),
+ .initial_rate = 600 * FWK_MHZ,
+ .defer_initialization = false,
+ }),
+ },
+ /*
+ * DPU
+ */
+ {
+ .name = "ACLKDP",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_MULTI_SOURCE,
+ .is_group_member = true,
+ .control_reg = &PIK_DPU->ACLKDP_CTRL,
+ .divsys_reg = &PIK_DPU->ACLKDP_DIV1,
+ .divext_reg = &PIK_DPU->ACLKDP_DIV2,
+ .rate_table = rate_table_aclkdp,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_aclkdp),
+ .initial_rate = (CLOCK_RATE_SYSPLLCLK / 3),
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "DPU_M0",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_MULTI_SOURCE,
+ .is_group_member = true,
+ .control_reg = &PIK_DPU->M0CLK_CTRL,
+ .divsys_reg = &PIK_DPU->M0CLK_DIV1,
+ .divext_reg = &PIK_DPU->M0CLK_DIV2,
+ .rate_table = rate_table_dpu,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_dpu),
+ .initial_rate = 260 * FWK_MHZ,
+ .defer_initialization = false,
+ }),
+ },
+ /*
+ * FCM Clock
+ */
+ {
+ .name = "FCMCLK",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_MULTI_SOURCE,
+ .is_group_member = false,
+ .control_reg = &PIK_SYSTEM->FCMCLK_CTRL,
+ .divsys_reg = &PIK_SYSTEM->FCMCLK_DIV1,
+ .rate_table = rate_table_sys_fcmclk,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_sys_fcmclk),
+ .initial_rate = CLOCK_RATE_SYSPLLCLK,
+ .defer_initialization = false,
+ }),
+ },
+ { }, /* Termination description. */
+};
+
+static const struct fwk_element *pik_clock_get_element_table
+ (fwk_id_t module_id)
+{
+ return pik_clock_element_table;
+}
+
+struct fwk_module_config config_pik_clock = {
+ .get_element_table = pik_clock_get_element_table,
+ .data = NULL,
+};
diff --git a/product/sgm775/scp_ramfw/config_power_domain.c b/product/sgm775/scp_ramfw/config_power_domain.c
new file mode 100644
index 00000000..ea674d40
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_power_domain.c
@@ -0,0 +1,258 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stdint.h>
+#include <string.h>
+#include <fwk_element.h>
+#include <fwk_macros.h>
+#include <fwk_mm.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <config_power_domain.h>
+#include <config_ppu_v0.h>
+#include <mod_system_power.h>
+#include <mod_power_domain.h>
+#include <mod_ppu_v1.h>
+#include <sgm775_core.h>
+
+static const char *core_pd_name_table[SGM775_CORE_PER_CLUSTER_MAX] = {
+ "CLUS0CORE0", "CLUS0CORE1", "CLUS0CORE2", "CLUS0CORE3",
+ "CLUS0CORE4", "CLUS0CORE5", "CLUS0CORE6", "CLUS0CORE7",
+};
+
+/* Mask of the allowed states for the systop power domain */
+static const uint32_t systop_allowed_state_mask_table[] = {
+ [0] = MOD_PD_STATE_OFF_MASK | MOD_PD_STATE_ON_MASK |
+ (1 << MOD_SYSTEM_POWER_POWER_STATE_SLEEP0) |
+ (1 << MOD_SYSTEM_POWER_POWER_STATE_SLEEP1)
+};
+
+/*
+ * Mask of the allowed states for the top level power domains
+ * (but the cluster power domains) depending on the system states.
+ */
+static const uint32_t toplevel_allowed_state_mask_table[] = {
+ [MOD_PD_STATE_OFF] = MOD_PD_STATE_OFF_MASK,
+ [MOD_PD_STATE_ON] = MOD_PD_STATE_OFF_MASK | MOD_PD_STATE_ON_MASK,
+ [MOD_SYSTEM_POWER_POWER_STATE_SLEEP0] = MOD_PD_STATE_OFF_MASK,
+ [MOD_SYSTEM_POWER_POWER_STATE_SLEEP1] = MOD_PD_STATE_OFF_MASK
+};
+
+/*
+ * Mask of the allowed states for the cluster power domain depending on the
+ * system states.
+ */
+static const uint32_t cluster_pd_allowed_state_mask_table[] = {
+ [MOD_PD_STATE_OFF] = MOD_PD_STATE_OFF_MASK,
+ [MOD_PD_STATE_ON] = MOD_PD_STATE_OFF_MASK | MOD_PD_STATE_ON_MASK |
+ MOD_PD_STATE_SLEEP_MASK,
+ [MOD_SYSTEM_POWER_POWER_STATE_SLEEP0] = MOD_PD_STATE_OFF_MASK,
+ [MOD_SYSTEM_POWER_POWER_STATE_SLEEP1] = MOD_PD_STATE_OFF_MASK
+};
+
+/* Mask of the allowed states for a core depending on the cluster states. */
+static const uint32_t core_pd_allowed_state_mask_table[] = {
+ [MOD_PD_STATE_OFF] = MOD_PD_STATE_OFF_MASK,
+ [MOD_PD_STATE_ON] = MOD_PD_STATE_OFF_MASK | MOD_PD_STATE_ON_MASK |
+ MOD_PD_STATE_SLEEP_MASK,
+ [MOD_PD_STATE_SLEEP] = MOD_PD_STATE_OFF_MASK | MOD_PD_STATE_SLEEP_MASK,
+};
+
+/* Power module specific configuration data (none) */
+static const struct mod_power_domain_config sgm775_power_domain_config = { };
+
+static struct fwk_element sgm775_power_domain_static_element_table[] = {
+ [CONFIG_POWER_DOMAIN_SYSTOP_CHILD_CLUSTER0] = {
+ .name = "CLUS0",
+ .data = &((struct mod_power_domain_element_config) {
+ .attributes.pd_type = MOD_PD_TYPE_CLUSTER,
+ .tree_pos = MOD_PD_TREE_POS(
+ MOD_PD_LEVEL_1,
+ 0,
+ 0,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_CLUSTER0,
+ 0),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PPU_V1,
+ MOD_PPU_V1_API_IDX_POWER_DOMAIN_DRIVER),
+ .allowed_state_mask_table = cluster_pd_allowed_state_mask_table,
+ .allowed_state_mask_table_size =
+ FWK_ARRAY_SIZE(cluster_pd_allowed_state_mask_table)
+ }),
+ },
+ [CONFIG_POWER_DOMAIN_SYSTOP_CHILD_DBGTOP] = {
+ .name = "DBGTOP",
+ .data = &((struct mod_power_domain_element_config) {
+ .attributes.pd_type = MOD_PD_TYPE_DEVICE_DEBUG,
+ .tree_pos = MOD_PD_TREE_POS(
+ MOD_PD_LEVEL_1,
+ 0,
+ 0,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_DBGTOP,
+ 0),
+ .driver_id = FWK_ID_ELEMENT_INIT(
+ FWK_MODULE_IDX_PPU_V0, PPU_V0_ELEMENT_IDX_DBGTOP),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PPU_V0, 0),
+ .allowed_state_mask_table = toplevel_allowed_state_mask_table,
+ .allowed_state_mask_table_size =
+ FWK_ARRAY_SIZE(toplevel_allowed_state_mask_table)
+ }),
+ },
+ [CONFIG_POWER_DOMAIN_SYSTOP_CHILD_DPU0TOP] = {
+ .name = "DPU0TOP",
+ .data = &((struct mod_power_domain_element_config) {
+ .attributes.pd_type = MOD_PD_TYPE_DEVICE,
+ .tree_pos = MOD_PD_TREE_POS(
+ MOD_PD_LEVEL_1,
+ 0,
+ 0,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_DPU0TOP,
+ 0),
+ .driver_id = FWK_ID_ELEMENT_INIT(
+ FWK_MODULE_IDX_PPU_V0, PPU_V0_ELEMENT_IDX_DPU0TOP),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PPU_V0, 0),
+ .allowed_state_mask_table = toplevel_allowed_state_mask_table,
+ .allowed_state_mask_table_size =
+ FWK_ARRAY_SIZE(toplevel_allowed_state_mask_table)
+ }),
+ },
+ [CONFIG_POWER_DOMAIN_SYSTOP_CHILD_DPU1TOP] = {
+ .name = "DPU1TOP",
+ .data = &((struct mod_power_domain_element_config) {
+ .attributes.pd_type = MOD_PD_TYPE_DEVICE,
+ .tree_pos = MOD_PD_TREE_POS(
+ MOD_PD_LEVEL_1,
+ 0,
+ 0,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_DPU1TOP,
+ 0),
+ .driver_id = FWK_ID_ELEMENT_INIT(
+ FWK_MODULE_IDX_PPU_V0, PPU_V0_ELEMENT_IDX_DPU1TOP),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PPU_V0, 0),
+ .allowed_state_mask_table = toplevel_allowed_state_mask_table,
+ .allowed_state_mask_table_size =
+ FWK_ARRAY_SIZE(toplevel_allowed_state_mask_table)
+ }),
+ },
+ [CONFIG_POWER_DOMAIN_SYSTOP_CHILD_GPUTOP] = {
+ .name = "GPUTOP",
+ .data = &((struct mod_power_domain_element_config) {
+ .attributes.pd_type = MOD_PD_TYPE_DEVICE,
+ .tree_pos = MOD_PD_TREE_POS(
+ MOD_PD_LEVEL_1,
+ 0,
+ 0,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_GPUTOP,
+ 0),
+ .driver_id = FWK_ID_ELEMENT_INIT(
+ FWK_MODULE_IDX_PPU_V0, PPU_V0_ELEMENT_IDX_GPUTOP),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PPU_V0, 0),
+ .allowed_state_mask_table = toplevel_allowed_state_mask_table,
+ .allowed_state_mask_table_size =
+ FWK_ARRAY_SIZE(toplevel_allowed_state_mask_table)
+ }),
+ },
+ [CONFIG_POWER_DOMAIN_SYSTOP_CHILD_VPUTOP] = {
+ .name = "VPUTOP",
+ .data = &((struct mod_power_domain_element_config) {
+ .attributes.pd_type = MOD_PD_TYPE_DEVICE,
+ .tree_pos = MOD_PD_TREE_POS(
+ MOD_PD_LEVEL_1,
+ 0,
+ 0,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_VPUTOP,
+ 0),
+ .driver_id = FWK_ID_ELEMENT_INIT(
+ FWK_MODULE_IDX_PPU_V0, PPU_V0_ELEMENT_IDX_VPUTOP),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PPU_V0, 0),
+ .allowed_state_mask_table = toplevel_allowed_state_mask_table,
+ .allowed_state_mask_table_size =
+ FWK_ARRAY_SIZE(toplevel_allowed_state_mask_table)
+ }),
+ },
+ [CONFIG_POWER_DOMAIN_SYSTOP_CHILD_COUNT] = {
+ .name = "SYSTOP",
+ .data = &((struct mod_power_domain_element_config) {
+ .attributes.pd_type = MOD_PD_TYPE_SYSTEM,
+ .tree_pos = MOD_PD_TREE_POS(
+ MOD_PD_LEVEL_2, 0, 0, 0, 0),
+ .driver_id = FWK_ID_MODULE_INIT(FWK_MODULE_IDX_SYSTEM_POWER),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SYSTEM_POWER,
+ MOD_SYSTEM_POWER_API_IDX_PD_DRIVER),
+ .allowed_state_mask_table = systop_allowed_state_mask_table,
+ .allowed_state_mask_table_size =
+ FWK_ARRAY_SIZE(systop_allowed_state_mask_table)
+ }),
+ },
+};
+
+
+/*
+ * Function definitions with internal linkage
+ */
+static const struct fwk_element *sgm775_power_domain_get_element_table
+ (fwk_id_t module_id)
+{
+ struct fwk_element *element_table, *element;
+ struct mod_power_domain_element_config *pd_config_table, *pd_config;
+ unsigned int core_idx;
+
+ element_table = fwk_mm_calloc(
+ sgm775_core_get_count()
+ + FWK_ARRAY_SIZE(sgm775_power_domain_static_element_table)
+ + 1, /* Terminator */
+ sizeof(struct fwk_element));
+ if (element_table == NULL)
+ return NULL;
+
+ pd_config_table = fwk_mm_calloc(sgm775_core_get_count(),
+ sizeof(struct mod_power_domain_element_config));
+ if (pd_config_table == NULL)
+ return NULL;
+
+ for (core_idx = 0; core_idx < sgm775_core_get_count(); core_idx++) {
+ element = &element_table[core_idx];
+ pd_config = &pd_config_table[core_idx];
+
+ element->name = core_pd_name_table[core_idx];
+ element->data = pd_config;
+
+ pd_config->attributes.pd_type = MOD_PD_TYPE_CORE,
+ pd_config->tree_pos = MOD_PD_TREE_POS(
+ MOD_PD_LEVEL_0,
+ 0,
+ 0,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_CLUSTER0,
+ core_idx),
+ pd_config->driver_id = FWK_ID_ELEMENT(FWK_MODULE_IDX_PPU_V1, core_idx),
+ pd_config->api_id = FWK_ID_API(
+ FWK_MODULE_IDX_PPU_V1, MOD_PPU_V1_API_IDX_POWER_DOMAIN_DRIVER),
+ pd_config->allowed_state_mask_table = core_pd_allowed_state_mask_table,
+ pd_config->allowed_state_mask_table_size =
+ FWK_ARRAY_SIZE(core_pd_allowed_state_mask_table);
+ }
+
+ pd_config = (struct mod_power_domain_element_config *)
+ sgm775_power_domain_static_element_table
+ [CONFIG_POWER_DOMAIN_SYSTOP_CHILD_CLUSTER0]
+ .data;
+ pd_config->driver_id =
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PPU_V1, sgm775_core_get_count());
+
+ memcpy(element_table + sgm775_core_get_count(),
+ sgm775_power_domain_static_element_table,
+ sizeof(sgm775_power_domain_static_element_table));
+
+ return element_table;
+}
+
+/*
+ * Power module configuration data
+ */
+struct fwk_module_config config_power_domain = {
+ .get_element_table = sgm775_power_domain_get_element_table,
+ .data = &sgm775_power_domain_config,
+};
diff --git a/product/sgm775/scp_ramfw/config_power_domain.h b/product/sgm775/scp_ramfw/config_power_domain.h
new file mode 100644
index 00000000..10a40a47
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_power_domain.h
@@ -0,0 +1,21 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef CONFIG_POWER_DOMAIN_H
+#define CONFIG_POWER_DOMAIN_H
+
+enum systop_child_index {
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_CLUSTER0,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_DBGTOP,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_DPU0TOP,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_DPU1TOP,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_GPUTOP,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_VPUTOP,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_COUNT
+};
+
+#endif /* CONFIG_POWER_DOMAIN_H */
diff --git a/product/sgm775/scp_ramfw/config_ppu_v0.c b/product/sgm775/scp_ramfw/config_ppu_v0.c
new file mode 100644
index 00000000..9c65b589
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_ppu_v0.c
@@ -0,0 +1,92 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_module.h>
+#include <mod_ppu_v0.h>
+#include <config_ppu_v0.h>
+#include <sgm775_irq.h>
+#include <sgm775_mmap.h>
+
+static struct fwk_element sgm775_ppu_v0_element_table[] = {
+ [PPU_V0_ELEMENT_IDX_DBGTOP] = {
+ .name = "DBGTOP",
+ .data = &((struct mod_ppu_v0_pd_config) {
+ .pd_type = MOD_PD_TYPE_DEVICE_DEBUG,
+ .ppu.reg_base = PPU_DEBUG_BASE,
+ .ppu.irq = PPU_DEBUG_IRQ
+ }),
+ },
+ [PPU_V0_ELEMENT_IDX_DPU0TOP] = {
+ .name = "DPU0TOP",
+ .data = &((struct mod_ppu_v0_pd_config) {
+ .pd_type = MOD_PD_TYPE_DEVICE,
+ .ppu.reg_base = PPU_DPU0_BASE,
+ .ppu.irq = PPU_DPU0_IRQ,
+ .default_power_on = true,
+ }),
+ },
+ [PPU_V0_ELEMENT_IDX_DPU1TOP] = {
+ .name = "DPU1TOP",
+ .data = &((struct mod_ppu_v0_pd_config) {
+ .pd_type = MOD_PD_TYPE_DEVICE,
+ .ppu.reg_base = PPU_DPU1_BASE,
+ .ppu.irq = PPU_DPU1_IRQ,
+ .default_power_on = true,
+ }),
+ },
+ [PPU_V0_ELEMENT_IDX_GPUTOP] = {
+ .name = "GPUTOP",
+ .data = &((struct mod_ppu_v0_pd_config) {
+ .pd_type = MOD_PD_TYPE_DEVICE,
+ .ppu.reg_base = PPU_GPU_BASE,
+ .ppu.irq = PPU_GPU_IRQ,
+ .default_power_on = true,
+ }),
+ },
+ [PPU_V0_ELEMENT_IDX_VPUTOP] = {
+ .name = "VPUTOP",
+ .data = &((struct mod_ppu_v0_pd_config) {
+ .pd_type = MOD_PD_TYPE_DEVICE,
+ .ppu.reg_base = PPU_VPU_BASE,
+ .ppu.irq = PPU_VPU_IRQ,
+ .default_power_on = true,
+ }),
+ },
+ [PPU_V0_ELEMENT_IDX_SYS0] = {
+ .name = "SYS0",
+ .data = &((struct mod_ppu_v0_pd_config) {
+ .pd_type = MOD_PD_TYPE_SYSTEM,
+ .ppu.reg_base = PPU_SYS0_BASE,
+ .ppu.irq = PPU_SYS0_IRQ
+ }),
+ },
+ [PPU_V0_ELEMENT_IDX_SYS1] = {
+ .name = "SYS1",
+ .data = &((struct mod_ppu_v0_pd_config) {
+ .pd_type = MOD_PD_TYPE_SYSTEM,
+ .ppu.reg_base = PPU_SYS1_BASE,
+ .ppu.irq = PPU_SYS1_IRQ
+ }),
+ },
+ [PPU_V0_ELEMENT_IDX_COUNT] = { }, /* Termination entry */
+};
+
+
+static const struct fwk_element *sgm775_ppu_v0_get_element_table
+ (fwk_id_t module_id)
+{
+ return sgm775_ppu_v0_element_table;
+}
+
+/*
+ * Power module configuration data
+ */
+struct fwk_module_config config_ppu_v0 = {
+ .get_element_table = sgm775_ppu_v0_get_element_table,
+ .data = NULL,
+};
diff --git a/product/sgm775/scp_ramfw/config_ppu_v0.h b/product/sgm775/scp_ramfw/config_ppu_v0.h
new file mode 100644
index 00000000..80260051
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_ppu_v0.h
@@ -0,0 +1,22 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef CONFIG_PPU_V0_H
+#define CONFIG_PPU_V0_H
+
+enum ppu_v0_element_idx {
+ PPU_V0_ELEMENT_IDX_DBGTOP,
+ PPU_V0_ELEMENT_IDX_DPU0TOP,
+ PPU_V0_ELEMENT_IDX_DPU1TOP,
+ PPU_V0_ELEMENT_IDX_GPUTOP,
+ PPU_V0_ELEMENT_IDX_VPUTOP,
+ PPU_V0_ELEMENT_IDX_SYS0,
+ PPU_V0_ELEMENT_IDX_SYS1,
+ PPU_V0_ELEMENT_IDX_COUNT
+};
+
+#endif /* CONFIG_PPU_V0_H */
diff --git a/product/sgm775/scp_ramfw/config_ppu_v1.c b/product/sgm775/scp_ramfw/config_ppu_v1.c
new file mode 100644
index 00000000..3f90ccdb
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_ppu_v1.c
@@ -0,0 +1,105 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stddef.h>
+#include <fwk_element.h>
+#include <fwk_mm.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_power_domain.h>
+#include <mod_ppu_v1.h>
+#include <sgm775_core.h>
+#include <sgm775_irq.h>
+#include <sgm775_mmap.h>
+#include <config_power_domain.h>
+
+static const char *core_pd_name_table[SGM775_CORE_PER_CLUSTER_MAX] = {
+ "CLUS0CORE0", "CLUS0CORE1", "CLUS0CORE2", "CLUS0CORE3",
+ "CLUS0CORE4", "CLUS0CORE5", "CLUS0CORE6", "CLUS0CORE7",
+};
+
+static uintptr_t core_pd_ppu_base_table[] = {
+ PPU_CLUS0CORE0_BASE, PPU_CLUS0CORE1_BASE, PPU_CLUS0CORE2_BASE,
+ PPU_CLUS0CORE3_BASE, PPU_CLUS0CORE4_BASE, PPU_CLUS0CORE5_BASE,
+ PPU_CLUS0CORE6_BASE, PPU_CLUS0CORE7_BASE
+};
+
+static unsigned int core_pd_ppu_irq_table[] = {
+ PPU_CLUS0CORE0_IRQ, PPU_CLUS0CORE1_IRQ, PPU_CLUS0CORE2_IRQ,
+ PPU_CLUS0CORE3_IRQ, PPU_CLUS0CORE4_IRQ, PPU_CLUS0CORE5_IRQ,
+ PPU_CLUS0CORE6_IRQ, PPU_CLUS0CORE7_IRQ
+};
+
+struct mod_ppu_v1_config sgm775_ppu_v1_notification_config = {
+ .pd_notification_id = FWK_ID_NOTIFICATION_INIT(
+ FWK_MODULE_IDX_POWER_DOMAIN,
+ MOD_PD_NOTIFICATION_IDX_POWER_STATE_TRANSITION),
+};
+
+static const struct fwk_element *sgm775_ppu_v1_get_element_table
+ (fwk_id_t module_id)
+{
+ struct fwk_element *element_table, *element;
+ struct mod_ppu_v1_pd_config *pd_config_table, *pd_config;
+ unsigned int core_idx;
+
+ /*
+ * Allocate element descriptors based on:
+ * Number of cores
+ * +1 cluster descriptor
+ * +1 terminator descriptor
+ */
+ element_table = fwk_mm_calloc(sgm775_core_get_count() + 2,
+ sizeof(struct fwk_element));
+ if (element_table == NULL)
+ return NULL;
+
+ pd_config_table = fwk_mm_calloc(sgm775_core_get_count() + 1,
+ sizeof(struct mod_ppu_v1_pd_config));
+ if (pd_config_table == NULL)
+ return NULL;
+
+ for (core_idx = 0; core_idx < sgm775_core_get_count(); core_idx++) {
+ element = &element_table[core_idx];
+ pd_config = &pd_config_table[core_idx];
+
+ element->name = core_pd_name_table[core_idx];
+ element->data = pd_config;
+
+ pd_config->pd_type = MOD_PD_TYPE_CORE;
+ pd_config->ppu.reg_base = core_pd_ppu_base_table[core_idx];
+ pd_config->ppu.irq = core_pd_ppu_irq_table[core_idx];
+ pd_config->cluster_id = FWK_ID_ELEMENT(FWK_MODULE_IDX_PPU_V1,
+ sgm775_core_get_count());
+ pd_config->observer_id = FWK_ID_NONE;
+ }
+
+ element = &element_table[sgm775_core_get_count()];
+ pd_config = &pd_config_table[sgm775_core_get_count()];
+
+ element->name = "CLUS0";
+ element->data = pd_config;
+
+ pd_config->pd_type = MOD_PD_TYPE_CLUSTER;
+ pd_config->ppu.reg_base = PPU_CLUS0_BASE;
+ pd_config->ppu.irq = PPU_CLUS0_IRQ;
+ pd_config->observer_id = FWK_ID_NONE;
+
+ sgm775_ppu_v1_notification_config.pd_source_id = FWK_ID_ELEMENT(
+ FWK_MODULE_IDX_POWER_DOMAIN,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_COUNT + sgm775_core_get_count());
+
+ return element_table;
+}
+
+/*
+ * Power module configuration data
+ */
+struct fwk_module_config config_ppu_v1 = {
+ .get_element_table = sgm775_ppu_v1_get_element_table,
+ .data = &sgm775_ppu_v1_notification_config,
+};
diff --git a/product/sgm775/scp_ramfw/config_psu.c b/product/sgm775/scp_ramfw/config_psu.c
new file mode 100644
index 00000000..80af3a16
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_psu.c
@@ -0,0 +1,58 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_mock_psu.h>
+#include <mod_psu.h>
+
+static const struct fwk_element element_table[] = {
+ {
+ .name = "CPU_GROUP_LITTLE",
+ .data = &(const struct mod_psu_device_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_MOCK_PSU, 0),
+ .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MOCK_PSU,
+ MOD_MOCK_PSU_API_IDX_PSU_DRIVER)
+ },
+ },
+ {
+ .name = "CPU_GROUP_BIG",
+ .data = &(const struct mod_psu_device_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_MOCK_PSU, 1),
+ .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MOCK_PSU,
+ MOD_MOCK_PSU_API_IDX_PSU_DRIVER)
+ },
+ },
+ {
+ .name = "GPU",
+ .data = &(const struct mod_psu_device_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_MOCK_PSU, 2),
+ .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MOCK_PSU,
+ MOD_MOCK_PSU_API_IDX_PSU_DRIVER)
+ },
+ },
+ {
+ .name = "VPU",
+ .data = &(const struct mod_psu_device_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_MOCK_PSU, 3),
+ .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MOCK_PSU,
+ MOD_MOCK_PSU_API_IDX_PSU_DRIVER)
+ },
+ },
+ { }
+};
+
+static const struct fwk_element *psu_get_element_table(fwk_id_t module_id)
+{
+ return element_table;
+}
+
+struct fwk_module_config config_psu = {
+ .get_element_table = psu_get_element_table,
+ .data = NULL,
+};
diff --git a/product/sgm775/scp_ramfw/config_scmi.c b/product/sgm775/scp_ramfw/config_scmi.c
new file mode 100644
index 00000000..a79bdab1
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_scmi.c
@@ -0,0 +1,77 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_id.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <sgm775_scmi.h>
+#include <mod_scmi.h>
+#include <internal/scmi.h>
+#include <mod_smt.h>
+
+static const struct fwk_element service_table[] = {
+ [SGM775_SCMI_SERVICE_IDX_PSCI] = {
+ .name = "SERVICE0",
+ .data = &((struct mod_scmi_service_config) {
+ .transport_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SMT,
+ SGM775_SCMI_SERVICE_IDX_PSCI),
+ .transport_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SMT,
+ MOD_SMT_API_IDX_SCMI_TRANSPORT),
+ .scmi_agent_id = SCMI_AGENT_ID_PSCI,
+ }),
+ },
+ [SGM775_SCMI_SERVICE_IDX_OSPM_0] = {
+ .name = "SERVICE1",
+ .data = &((struct mod_scmi_service_config) {
+ .transport_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SMT,
+ SGM775_SCMI_SERVICE_IDX_OSPM_0),
+ .transport_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SMT,
+ MOD_SMT_API_IDX_SCMI_TRANSPORT),
+ .scmi_agent_id = SCMI_AGENT_ID_OSPM,
+ }),
+ },
+ [SGM775_SCMI_SERVICE_IDX_OSPM_1] = {
+ .name = "SERVICE2",
+ .data = &((struct mod_scmi_service_config) {
+ .transport_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SMT,
+ SGM775_SCMI_SERVICE_IDX_OSPM_1),
+ .transport_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SMT,
+ MOD_SMT_API_IDX_SCMI_TRANSPORT),
+ .scmi_agent_id = SCMI_AGENT_ID_OSPM,
+ }),
+ },
+ [SGM775_SCMI_SERVICE_IDX_COUNT] = {}
+};
+
+static const struct fwk_element *get_service_table(fwk_id_t module_id)
+{
+ return service_table;
+}
+
+static const struct mod_scmi_agent agent_table[] = {
+ [SCMI_AGENT_ID_OSPM] = {
+ .type = SCMI_AGENT_TYPE_OSPM,
+ .name = "OSPM",
+ },
+ [SCMI_AGENT_ID_PSCI] = {
+ .type = SCMI_AGENT_TYPE_PSCI,
+ .name = "PSCI",
+ },
+};
+
+struct fwk_module_config config_scmi = {
+ .get_element_table = get_service_table,
+ .data = &((struct mod_scmi_config) {
+ .protocol_count_max = 9,
+ .agent_count = FWK_ARRAY_SIZE(agent_table) - 1,
+ .agent_table = agent_table,
+ .vendor_identifier = "arm",
+ .sub_vendor_identifier = "arm",
+ }),
+};
diff --git a/product/sgm775/scp_ramfw/config_scmi_apcore.c b/product/sgm775/scp_ramfw/config_scmi_apcore.c
new file mode 100644
index 00000000..689ddaf7
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_scmi_apcore.c
@@ -0,0 +1,31 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <mod_scmi_apcore.h>
+#include <sgm775_core.h>
+#include <sgm775_pik.h>
+
+static const struct mod_scmi_apcore_reset_register_group
+ reset_reg_group_table[] = {
+ {
+ .base_register =
+ (uintptr_t)&PIK_CLUS0->STATIC_CONFIG[0].RVBARADDR_LW,
+ .register_count = SGM775_CORE_PER_CLUSTER_MAX,
+ },
+ };
+
+const struct fwk_module_config config_scmi_apcore = {
+ .data = &((struct mod_scmi_apcore_config){
+ .reset_register_width = MOD_SCMI_APCORE_REG_WIDTH_64,
+ .reset_register_group_count =
+ FWK_ARRAY_SIZE(reset_reg_group_table),
+ .reset_register_group_table = &reset_reg_group_table[0],
+ }),
+};
diff --git a/product/sgm775/scp_ramfw/config_scmi_clock.c b/product/sgm775/scp_ramfw/config_scmi_clock.c
new file mode 100644
index 00000000..254c9733
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_scmi_clock.c
@@ -0,0 +1,70 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stdint.h>
+#include <fwk_element.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_scmi_clock.h>
+#include <sgm775_scmi.h>
+#include <clock_devices.h>
+
+static const struct mod_scmi_clock_device agent_device_table_ospm[] = {
+ {
+ /* VPU */
+ .element_id =
+ FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CLOCK, CLOCK_DEV_IDX_VPU),
+ .permissions = MOD_SCMI_CLOCK_PERM_ATTRIBUTES |
+ MOD_SCMI_CLOCK_PERM_DESCRIBE_RATES |
+ MOD_SCMI_CLOCK_PERM_GET_RATE |
+ MOD_SCMI_CLOCK_PERM_SET_RATE,
+ },
+ {
+ /* DPU */
+ .element_id =
+ FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CLOCK, CLOCK_DEV_IDX_DPU),
+ .permissions = MOD_SCMI_CLOCK_PERM_ATTRIBUTES |
+ MOD_SCMI_CLOCK_PERM_DESCRIBE_RATES |
+ MOD_SCMI_CLOCK_PERM_GET_RATE |
+ MOD_SCMI_CLOCK_PERM_SET_RATE,
+ },
+ {
+ /* PIXEL_0 */
+ .element_id =
+ FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CLOCK, CLOCK_DEV_IDX_PIXEL_0),
+ .permissions = MOD_SCMI_CLOCK_PERM_ATTRIBUTES |
+ MOD_SCMI_CLOCK_PERM_DESCRIBE_RATES |
+ MOD_SCMI_CLOCK_PERM_GET_RATE |
+ MOD_SCMI_CLOCK_PERM_SET_RATE,
+ },
+ {
+ /* PIXEL_1 */
+ .element_id =
+ FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CLOCK, CLOCK_DEV_IDX_PIXEL_1),
+ .permissions = MOD_SCMI_CLOCK_PERM_ATTRIBUTES |
+ MOD_SCMI_CLOCK_PERM_DESCRIBE_RATES |
+ MOD_SCMI_CLOCK_PERM_GET_RATE |
+ MOD_SCMI_CLOCK_PERM_SET_RATE,
+ },
+};
+
+static const struct mod_scmi_clock_agent agent_table[SCMI_AGENT_ID_COUNT] = {
+ [SCMI_AGENT_ID_PSCI] = { /* No access */ },
+ [SCMI_AGENT_ID_OSPM] = {
+ .device_table = agent_device_table_ospm,
+ .device_count = FWK_ARRAY_SIZE(agent_device_table_ospm),
+ },
+};
+
+struct fwk_module_config config_scmi_clock = {
+ .data = &((struct mod_scmi_clock_config) {
+ .max_pending_transactions = 0,
+ .agent_table = agent_table,
+ .agent_count = FWK_ARRAY_SIZE(agent_table),
+ }),
+};
diff --git a/product/sgm775/scp_ramfw/config_scmi_perf.c b/product/sgm775/scp_ramfw/config_scmi_perf.c
new file mode 100644
index 00000000..0197ae8d
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_scmi_perf.c
@@ -0,0 +1,44 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stdint.h>
+#include <fwk_element.h>
+#include <fwk_module.h>
+#include <config_dvfs.h>
+#include <sgm775_scmi.h>
+#include <mod_scmi_perf.h>
+
+static const struct mod_scmi_perf_domain_config domains[] = {
+ [DVFS_ELEMENT_IDX_LITTLE] = {
+ .permissions = &(uint32_t[]) {
+ [SCMI_AGENT_ID_OSPM] = MOD_SCMI_PERF_PERMS_SET_LEVEL |
+ MOD_SCMI_PERF_PERMS_SET_LIMITS,
+ [SCMI_AGENT_ID_PSCI] = MOD_SCMI_PERF_PERMS_NONE,
+ }
+ },
+ [DVFS_ELEMENT_IDX_BIG] = {
+ .permissions = &(uint32_t[]) {
+ [SCMI_AGENT_ID_OSPM] = MOD_SCMI_PERF_PERMS_SET_LEVEL |
+ MOD_SCMI_PERF_PERMS_SET_LIMITS,
+ [SCMI_AGENT_ID_PSCI] = MOD_SCMI_PERF_PERMS_NONE,
+ }
+ },
+ [DVFS_ELEMENT_IDX_GPU] = {
+ .permissions = &(uint32_t[]) {
+ [SCMI_AGENT_ID_OSPM] = MOD_SCMI_PERF_PERMS_SET_LEVEL |
+ MOD_SCMI_PERF_PERMS_SET_LIMITS,
+ [SCMI_AGENT_ID_PSCI] = MOD_SCMI_PERF_PERMS_NONE,
+ }
+ },
+};
+
+struct fwk_module_config config_scmi_perf = {
+ .get_element_table = NULL,
+ .data = &((struct mod_scmi_perf_config) {
+ .domains = &domains,
+ }),
+};
diff --git a/product/sgm775/scp_ramfw/config_scmi_system_power.c b/product/sgm775/scp_ramfw/config_scmi_system_power.c
new file mode 100644
index 00000000..5bbc074c
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_scmi_system_power.c
@@ -0,0 +1,19 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stddef.h>
+#include <fwk_module.h>
+#include <mod_scmi_system_power.h>
+#include <mod_system_power.h>
+
+struct fwk_module_config config_scmi_system_power = {
+ .get_element_table = NULL,
+ .data = &((struct mod_scmi_system_power_config) {
+ .system_view = MOD_SCMI_SYSTEM_VIEW_FULL,
+ .system_suspend_state = MOD_SYSTEM_POWER_POWER_STATE_SLEEP0
+ }),
+};
diff --git a/product/sgm775/scp_ramfw/config_sds.c b/product/sgm775/scp_ramfw/config_sds.c
new file mode 100644
index 00000000..400e56fc
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_sds.c
@@ -0,0 +1,64 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <assert.h>
+#include <stdint.h>
+#include <fwk_element.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_sds.h>
+#include <sgm775_mmap.h>
+#include <sgm775_sds.h>
+#include <clock_devices.h>
+
+static const uint32_t feature_flags = SGM775_SDS_FEATURE_FIRMWARE_MASK;
+static const uint32_t version_packed = FWK_BUILD_VERSION;
+
+const struct mod_sds_config sds_module_config = {
+ .region_base_address = TRUSTED_RAM_BASE,
+ .region_size = 3520,
+ .clock_id = FWK_ID_ELEMENT_INIT(
+ FWK_MODULE_IDX_CLOCK,
+ CLOCK_DEV_IDX_FCMCLK),
+};
+
+static const struct fwk_element sds_element_table[] = {
+ {
+ .name = "RAM Version",
+ .data = &((struct mod_sds_structure_desc) {
+ .id = SGM775_SDS_RAM_VERSION,
+ .size = SGM775_SDS_RAM_VERSION_SIZE,
+ .payload = &version_packed,
+ .finalize = true,
+ }),
+ },
+ {
+ .name = "Feature Availability",
+ .data = &((struct mod_sds_structure_desc) {
+ .id = SGM775_SDS_FEATURE_AVAILABILITY,
+ .size = sizeof(feature_flags),
+ .payload = &feature_flags,
+ .finalize = false,
+ }),
+ },
+ { }, /* Termination description. */
+};
+
+static const struct fwk_element *sds_get_element_table(fwk_id_t module_id)
+{
+ static_assert(BUILD_VERSION_MAJOR < UINT8_MAX, "Invalid version size");
+ static_assert(BUILD_VERSION_MINOR < UINT8_MAX, "Invalid version size");
+ static_assert(BUILD_VERSION_PATCH < UINT16_MAX, "Invalid version size");
+
+ return sds_element_table;
+}
+
+struct fwk_module_config config_sds = {
+ .get_element_table = sds_get_element_table,
+ .data = &sds_module_config,
+};
diff --git a/product/sgm775/scp_ramfw/config_sensor.c b/product/sgm775/scp_ramfw/config_sensor.c
new file mode 100644
index 00000000..439d3c22
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_sensor.c
@@ -0,0 +1,74 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stddef.h>
+#include <fwk_element.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_reg_sensor.h>
+#include <mod_sensor.h>
+#include <system_mmap.h>
+
+enum REG_SENSOR_DEVICES {
+ REG_SENSOR_DEV_SOC_TEMP,
+ REG_SENSOR_DEV_COUNT,
+};
+
+/*
+ * Register Sensor driver config
+ */
+static const struct fwk_element reg_sensor_element_table[] = {
+ [REG_SENSOR_DEV_SOC_TEMP] = {
+ .name = "Soc Temperature",
+ .data = &((struct mod_reg_sensor_dev_config) {
+ .reg = (uintptr_t)(SENSOR_SOC_TEMP),
+ }),
+ },
+ [REG_SENSOR_DEV_COUNT] = {},
+};
+
+static const struct fwk_element *get_reg_sensor_element_table(fwk_id_t id)
+{
+ return reg_sensor_element_table;
+}
+
+struct fwk_module_config config_reg_sensor = {
+ .get_element_table = get_reg_sensor_element_table,
+};
+
+
+/*
+ * Sensor module config
+ */
+static const struct mod_sensor_dev_config soctemp_config = {
+ .driver_id = FWK_ID_ELEMENT(FWK_MODULE_IDX_REG_SENSOR,
+ REG_SENSOR_DEV_SOC_TEMP),
+ .info = &((struct mod_sensor_info) {
+ .type = MOD_SENSOR_TYPE_DEGREES_C,
+ .update_interval = 0,
+ .update_interval_multiplier = 0,
+ .unit_multiplier = 0,
+ }),
+};
+
+static const struct fwk_element sensor_element_table[] = {
+ [0] = {
+ .name = "Soc Temperature",
+ .data = &soctemp_config,
+ },
+ [1] = {},
+};
+
+static const struct fwk_element *get_sensor_element_table(fwk_id_t module_id)
+{
+ return sensor_element_table;
+}
+
+struct fwk_module_config config_sensor = {
+ .get_element_table = get_sensor_element_table,
+ .data = NULL,
+};
diff --git a/product/sgm775/scp_ramfw/config_smt.c b/product/sgm775/scp_ramfw/config_smt.c
new file mode 100644
index 00000000..ca506885
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_smt.c
@@ -0,0 +1,78 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stdint.h>
+#include <fwk_element.h>
+#include <fwk_id.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_clock.h>
+#include <mod_smt.h>
+#include <sgm775_core.h>
+#include <sgm775_mhu.h>
+#include <sgm775_scmi.h>
+#include <config_power_domain.h>
+#include <clock_devices.h>
+#include <software_mmap.h>
+
+static const struct fwk_element smt_element_table[] = {
+ [SGM775_SCMI_SERVICE_IDX_PSCI] = {
+ .name = "PSCI",
+ .data = &((struct mod_smt_channel_config) {
+ .type = MOD_SMT_CHANNEL_TYPE_SLAVE,
+ .policies = MOD_SMT_POLICY_INIT_MAILBOX | MOD_SMT_POLICY_SECURE,
+ .mailbox_address = (uintptr_t)SCMI_PAYLOAD_S_A2P_BASE,
+ .mailbox_size = SCMI_PAYLOAD_SIZE,
+ .driver_id = FWK_ID_SUB_ELEMENT_INIT(FWK_MODULE_IDX_MHU,
+ SGM775_MHU_DEVICE_IDX_S, 0),
+ .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MHU, 0),
+ })
+ },
+ [SGM775_SCMI_SERVICE_IDX_OSPM_0] = {
+ .name = "OSPM0",
+ .data = &((struct mod_smt_channel_config) {
+ .type = MOD_SMT_CHANNEL_TYPE_SLAVE,
+ .policies = MOD_SMT_POLICY_INIT_MAILBOX,
+ .mailbox_address = (uintptr_t)SCMI_PAYLOAD0_NS_A2P_BASE,
+ .mailbox_size = SCMI_PAYLOAD_SIZE,
+ .driver_id = FWK_ID_SUB_ELEMENT_INIT(FWK_MODULE_IDX_MHU,
+ SGM775_MHU_DEVICE_IDX_NS_L, 0),
+ .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MHU, 0),
+ })
+ },
+ [SGM775_SCMI_SERVICE_IDX_OSPM_1] = {
+ .name = "OSPM1",
+ .data = &((struct mod_smt_channel_config) {
+ .type = MOD_SMT_CHANNEL_TYPE_SLAVE,
+ .policies = MOD_SMT_POLICY_INIT_MAILBOX,
+ .mailbox_address = (uintptr_t)SCMI_PAYLOAD1_NS_A2P_BASE,
+ .mailbox_size = SCMI_PAYLOAD_SIZE,
+ .driver_id = FWK_ID_SUB_ELEMENT_INIT(FWK_MODULE_IDX_MHU,
+ SGM775_MHU_DEVICE_IDX_NS_H, 0),
+ .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MHU, 0),
+ })
+ },
+ [SGM775_SCMI_SERVICE_IDX_COUNT] = {},
+};
+
+static const struct fwk_element *smt_get_element_table(fwk_id_t module_id)
+{
+ unsigned int idx;
+ struct mod_smt_channel_config *config;
+
+ for (idx = 0; idx < SGM775_SCMI_SERVICE_IDX_COUNT; idx++) {
+ config = (struct mod_smt_channel_config *)(smt_element_table[idx].data);
+ config->pd_source_id = FWK_ID_ELEMENT(FWK_MODULE_IDX_POWER_DOMAIN,
+ CONFIG_POWER_DOMAIN_SYSTOP_CHILD_COUNT + sgm775_core_get_count());
+ }
+
+ return smt_element_table;
+}
+
+struct fwk_module_config config_smt = {
+ .get_element_table = smt_get_element_table,
+};
diff --git a/product/sgm775/scp_ramfw/config_system_pll.c b/product/sgm775/scp_ramfw/config_system_pll.c
new file mode 100644
index 00000000..a66543e3
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_system_pll.c
@@ -0,0 +1,118 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_id.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <mod_system_pll.h>
+#include <sgm775_pik.h>
+#include <system_mmap.h>
+
+static const struct fwk_element system_pll_element_table[] = {
+ {
+ .name = "CPU_PLL_0",
+ .data = &((struct mod_system_pll_dev_config) {
+ .control_reg = (void *)PLL_CLUS0_0,
+ .status_reg = (void *)&PIK_SCP->PLL_STATUS1,
+ .lock_flag_mask = PLL_STATUS1_CPUPLLLOCK(0, 0),
+ .initial_rate = 1330 * FWK_MHZ,
+ .min_rate = MOD_SYSTEM_PLL_MIN_RATE,
+ .max_rate = MOD_SYSTEM_PLL_MAX_RATE,
+ .min_step = MOD_SYSTEM_PLL_MIN_INTERVAL,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "CPU_PLL_1",
+ .data = &((struct mod_system_pll_dev_config) {
+ .control_reg = (void *)PLL_CLUS0_1,
+ .status_reg = (void *)&PIK_SCP->PLL_STATUS1,
+ .lock_flag_mask = PLL_STATUS1_CPUPLLLOCK(0, 1),
+ .initial_rate = 1750 * FWK_MHZ,
+ .min_rate = MOD_SYSTEM_PLL_MIN_RATE,
+ .max_rate = MOD_SYSTEM_PLL_MAX_RATE,
+ .min_step = MOD_SYSTEM_PLL_MIN_INTERVAL,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "GPU_PLL",
+ .data = &((struct mod_system_pll_dev_config) {
+ .control_reg = (void *)PLL_GPU,
+ .status_reg = (void *)&PIK_SCP->PLL_STATUS0,
+ .lock_flag_mask = PLL_STATUS0_GPUPLLLOCK,
+ .initial_rate = 600 * FWK_MHZ,
+ .min_rate = MOD_SYSTEM_PLL_MIN_RATE,
+ .max_rate = MOD_SYSTEM_PLL_MAX_RATE,
+ .min_step = MOD_SYSTEM_PLL_MIN_INTERVAL,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "DPU_PLL",
+ .data = &((struct mod_system_pll_dev_config) {
+ .control_reg = (void *)PLL_DISPLAY,
+ .status_reg = (void *)&PIK_SCP->PLL_STATUS0,
+ .lock_flag_mask = PLL_STATUS0_DISPLAYPLLLOCK,
+ .initial_rate = 260 * FWK_MHZ,
+ .min_rate = MOD_SYSTEM_PLL_MIN_RATE,
+ .max_rate = MOD_SYSTEM_PLL_MAX_RATE,
+ .min_step = MOD_SYSTEM_PLL_MIN_INTERVAL,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "VPU_PLL",
+ .data = &((struct mod_system_pll_dev_config) {
+ .control_reg = (void *)PLL_VIDEO,
+ .status_reg = (void *)&PIK_SCP->PLL_STATUS0,
+ .lock_flag_mask = PLL_STATUS0_VIDEOPLLLOCK,
+ .initial_rate = 600 * FWK_MHZ,
+ .min_rate = MOD_SYSTEM_PLL_MIN_RATE,
+ .max_rate = MOD_SYSTEM_PLL_MAX_RATE,
+ .min_step = MOD_SYSTEM_PLL_MIN_INTERVAL,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "PIX0_PLL",
+ .data = &((struct mod_system_pll_dev_config) {
+ .control_reg = (void *)PIX0_CONTROL,
+ .status_reg = NULL,
+ .initial_rate = 594 * FWK_MHZ,
+ .min_rate = 12500 * FWK_KHZ,
+ .max_rate = 594 * FWK_MHZ,
+ .min_step = 250 * FWK_KHZ,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "PIX1_PLL",
+ .data = &((struct mod_system_pll_dev_config) {
+ .control_reg = (void *)PIX1_CONTROL,
+ .status_reg = NULL,
+ .initial_rate = 594 * FWK_MHZ,
+ .min_rate = 12500 * FWK_KHZ,
+ .max_rate = 594 * FWK_MHZ,
+ .min_step = 250 * FWK_KHZ,
+ .defer_initialization = false,
+ }),
+ },
+ { }, /* Termination description. */
+};
+
+static const struct fwk_element *system_pll_get_element_table
+ (fwk_id_t module_id)
+{
+ return system_pll_element_table;
+}
+
+struct fwk_module_config config_system_pll = {
+ .get_element_table = system_pll_get_element_table,
+ .data = NULL,
+};
diff --git a/product/sgm775/scp_ramfw/config_system_power.c b/product/sgm775/scp_ramfw/config_system_power.c
new file mode 100644
index 00000000..37498086
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_system_power.c
@@ -0,0 +1,62 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_id.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <sgm775_irq.h>
+#include <config_ppu_v0.h>
+#include <mod_system_power.h>
+#include <mod_sgm775_system.h>
+
+/*
+ * The DPU/GPU/VPU PPUs in this list are there as a temporary workaround, until
+ * Linux supports handling these domains on its own.
+ */
+static const struct mod_system_power_ext_ppu_config ext_ppus[] = {
+ {
+ .ppu_id = FWK_ID_ELEMENT_INIT(
+ FWK_MODULE_IDX_PPU_V0,
+ PPU_V0_ELEMENT_IDX_DPU0TOP),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PPU_V0, 0),
+ },
+ {
+ .ppu_id = FWK_ID_ELEMENT_INIT(
+ FWK_MODULE_IDX_PPU_V0,
+ PPU_V0_ELEMENT_IDX_DPU1TOP),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PPU_V0, 0),
+ },
+ {
+ .ppu_id = FWK_ID_ELEMENT_INIT(
+ FWK_MODULE_IDX_PPU_V0,
+ PPU_V0_ELEMENT_IDX_GPUTOP),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PPU_V0, 0),
+ },
+ {
+ .ppu_id = FWK_ID_ELEMENT_INIT(
+ FWK_MODULE_IDX_PPU_V0,
+ PPU_V0_ELEMENT_IDX_VPUTOP),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PPU_V0, 0),
+ },
+};
+
+const struct fwk_module_config config_system_power = {
+ .data = &((struct mod_system_power_config) {
+ .soc_wakeup_irq = SOC_WAKEUP0_IRQ,
+ .ppu_sys0_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PPU_V0,
+ PPU_V0_ELEMENT_IDX_SYS0),
+ .ppu_sys1_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PPU_V0,
+ PPU_V0_ELEMENT_IDX_SYS1),
+ .ppu_sys_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PPU_V0, 0),
+ .ext_ppus = ext_ppus,
+ .ext_ppus_count = FWK_ARRAY_SIZE(ext_ppus),
+ .driver_id = FWK_ID_MODULE_INIT(FWK_MODULE_IDX_SGM775_SYSTEM),
+ .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SGM775_SYSTEM,
+ MOD_SGM775_SYSTEM_API_IDX_SYSTEM_POWER_DRIVER)
+ })
+};
diff --git a/product/sgm775/scp_ramfw/config_timer.c b/product/sgm775/scp_ramfw/config_timer.c
new file mode 100644
index 00000000..a4e1c8ea
--- /dev/null
+++ b/product/sgm775/scp_ramfw/config_timer.c
@@ -0,0 +1,71 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_id.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_clock.h>
+#include <mod_gtimer.h>
+#include <mod_timer.h>
+#include <sgm775_mmap.h>
+#include <sgm775_irq.h>
+#include <clock_devices.h>
+#include <system_clock.h>
+
+/*
+ * Generic timer driver config
+ */
+static const struct fwk_element gtimer_dev_table[] = {
+ [0] = {
+ .name = "REFCLK",
+ .data = &((struct mod_gtimer_dev_config) {
+ .hw_timer = REFCLK_CNTBASE0_BASE,
+ .hw_counter = REFCLK_CNTCTL_BASE,
+ .control = REFCLK_CNTCONTROL_BASE,
+ .frequency = CLOCK_RATE_REFCLK,
+ .clock_id = FWK_ID_ELEMENT_INIT(
+ FWK_MODULE_IDX_CLOCK,
+ CLOCK_DEV_IDX_FCMCLK),
+ })
+ },
+ [1] = {},
+};
+
+static const struct fwk_element *gtimer_get_dev_table(fwk_id_t module_id)
+{
+ return gtimer_dev_table;
+};
+
+struct fwk_module_config config_gtimer = {
+ .get_element_table = gtimer_get_dev_table,
+};
+
+/*
+ * Timer HAL config
+ */
+static const struct mod_timer_dev_config refclk_config = {
+ .id = FWK_ID_ELEMENT(FWK_MODULE_IDX_GTIMER, 0),
+ .timer_irq = TIMREFCLK_IRQ,
+};
+
+static const struct fwk_element timer_dev_table[] = {
+ [0] = {
+ .name = "REFCLK",
+ .data = &refclk_config,
+ .sub_element_count = 8, /* Number of alarms */
+ },
+ [1] = {},
+};
+
+static const struct fwk_element *timer_get_dev_table(fwk_id_t module_id)
+{
+ return timer_dev_table;
+}
+
+struct fwk_module_config config_timer = {
+ .get_element_table = timer_get_dev_table,
+};
diff --git a/product/sgm775/scp_ramfw/firmware.mk b/product/sgm775/scp_ramfw/firmware.mk
new file mode 100644
index 00000000..ed810a8f
--- /dev/null
+++ b/product/sgm775/scp_ramfw/firmware.mk
@@ -0,0 +1,72 @@
+#
+# Arm SCP/MCP Software
+# Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+BS_FIRMWARE_CPU := cortex-m3
+BS_FIRMWARE_HAS_MULTITHREADING := yes
+BS_FIRMWARE_HAS_NOTIFICATION := yes
+
+BS_FIRMWARE_MODULES := \
+ pl011 \
+ log \
+ gtimer \
+ timer \
+ ddr_phy500 \
+ dmc500 \
+ pik_clock \
+ clock \
+ system_pll \
+ css_clock \
+ ppu_v0 \
+ ppu_v1 \
+ system_power \
+ sgm775_system \
+ power_domain \
+ reg_sensor \
+ sensor \
+ dvfs \
+ psu \
+ mock_psu \
+ mhu \
+ smt \
+ scmi \
+ scmi_power_domain \
+ scmi_clock \
+ scmi_perf \
+ scmi_sensor \
+ scmi_system_power \
+ scmi_apcore \
+ sds
+
+BS_FIRMWARE_SOURCES := \
+ rtx_config.c \
+ sgm775_core.c \
+ config_log.c \
+ config_timer.c \
+ config_ddr_phy500.c \
+ config_dmc500.c \
+ config_sds.c \
+ config_pik_clock.c \
+ config_clock.c \
+ config_system_pll.c \
+ config_css_clock.c \
+ config_ppu_v0.c \
+ config_ppu_v1.c \
+ config_power_domain.c \
+ config_sensor.c \
+ config_dvfs.c \
+ config_psu.c \
+ config_mock_psu.c \
+ config_mhu.c \
+ config_smt.c \
+ config_scmi.c \
+ config_scmi_clock.c \
+ config_scmi_perf.c \
+ config_scmi_system_power.c \
+ config_scmi_apcore.c \
+ config_system_power.c
+
+include $(BS_DIR)/firmware.mk
diff --git a/product/sgm775/scp_ramfw/fmw_memory.ld.S b/product/sgm775/scp_ramfw/fmw_memory.ld.S
new file mode 100644
index 00000000..481a8c7a
--- /dev/null
+++ b/product/sgm775/scp_ramfw/fmw_memory.ld.S
@@ -0,0 +1,21 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef FMW_MEMORY_LD_S
+#define FMW_MEMORY_LD_S
+
+#include <system_mmap_scp.h>
+
+#define FIRMWARE_MEM_MODE FWK_MEM_MODE_SINGLE_REGION
+
+/* RAM */
+#define FIRMWARE_MEM0_BASE SCP_RAM_BASE
+#define FIRMWARE_MEM0_SIZE SCP_RAM_SIZE
+
+#define FIRMWARE_STACK_SIZE (1 * 1024)
+
+#endif /* FMW_MEMORY_LD_S */
diff --git a/product/sgm775/scp_ramfw/rtx_config.c b/product/sgm775/scp_ramfw/rtx_config.c
new file mode 100644
index 00000000..c3c10bfe
--- /dev/null
+++ b/product/sgm775/scp_ramfw/rtx_config.c
@@ -0,0 +1,79 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <cmsis_compiler.h>
+#include <rtx_os.h>
+#include <system_clock.h>
+
+#include <rtx_lib.c>
+
+/*
+ * Required by RTX to configure the SysTick timer.
+ */
+uint32_t SystemCoreClock = CLOCK_RATE_REFCLK;
+
+/*
+ * Idle thread
+ */
+__NO_RETURN void osRtxIdleThread(void *argument)
+{
+ (void)argument;
+
+ while (true)
+ __WFI();
+}
+
+/*
+ * OS error handler
+ */
+uint32_t osRtxErrorNotify(uint32_t code, void *object_id)
+{
+ (void)object_id;
+
+ switch (code) {
+ case osRtxErrorStackUnderflow:
+ /*
+ * Stack underflow detected for thread
+ * thread_id=object_id
+ */
+ break;
+
+ case osRtxErrorISRQueueOverflow:
+ /*
+ * ISR Queue overflow detected when inserting object
+ * object_id
+ */
+ break;
+
+ case osRtxErrorTimerQueueOverflow:
+ /*
+ * User Timer Callback Queue overflow detected for timer
+ * timer_id=object_id
+ */
+ break;
+
+ case osRtxErrorClibSpace:
+ /*
+ * Standard C/C++ library libspace not available:
+ * increase OS_THREAD_LIBSPACE_NUM
+ */
+ break;
+
+ case osRtxErrorClibMutex:
+ /*
+ * Standard C/C++ library mutex initialization failed
+ */
+ break;
+
+ default:
+ break;
+ }
+
+ osRtxIdleThread(object_id);
+}
diff --git a/product/sgm775/scp_romfw/clock_devices.h b/product/sgm775/scp_romfw/clock_devices.h
new file mode 100644
index 00000000..31fe8b1c
--- /dev/null
+++ b/product/sgm775/scp_romfw/clock_devices.h
@@ -0,0 +1,28 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef CLOCK_DEVICES_H
+#define CLOCK_DEVICES_H
+
+/*!
+ * \brief Clock device indexes.
+ */
+enum clock_dev_idx {
+ CLOCK_DEV_IDX_BIG,
+ CLOCK_DEV_IDX_LITTLE,
+ CLOCK_DEV_IDX_GPU,
+ CLOCK_DEV_IDX_SYS_ACLKNCI,
+ CLOCK_DEV_IDX_SYS_FCMCLK,
+ CLOCK_DEV_IDX_SYS_GICCLK,
+ CLOCK_DEV_IDX_SYS_PCLKSCP,
+ CLOCK_DEV_IDX_SYS_SYSPERCLK,
+ CLOCK_DEV_IDX_PLL_SWTCLKTCK,
+ CLOCK_DEV_IDX_PLL_SYSTEM,
+ CLOCK_DEV_IDX_COUNT
+};
+
+#endif /* CLOCK_DEVICES_H */
diff --git a/product/sgm775/scp_romfw/config_bootloader.c b/product/sgm775/scp_romfw/config_bootloader.c
new file mode 100644
index 00000000..39db37e2
--- /dev/null
+++ b/product/sgm775/scp_romfw/config_bootloader.c
@@ -0,0 +1,26 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <mod_bootloader.h>
+#include <system_mmap.h>
+#include <system_mmap_scp.h>
+#include <sgm775_sds.h>
+
+static const struct mod_bootloader_config bootloader_module_config = {
+ .source_base = TRUSTED_RAM_BASE,
+ .source_size = 256 * 1024,
+ .destination_base = SCP_RAM_BASE,
+ .destination_size = SCP_RAM_SIZE,
+ .sds_struct_id = SGM775_SDS_BOOTLOADER,
+};
+
+struct fwk_module_config config_bootloader = {
+ .data = &bootloader_module_config,
+};
diff --git a/product/sgm775/scp_romfw/config_clock.c b/product/sgm775/scp_romfw/config_clock.c
new file mode 100644
index 00000000..c6bd916e
--- /dev/null
+++ b/product/sgm775/scp_romfw/config_clock.c
@@ -0,0 +1,126 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stddef.h>
+#include <fwk_element.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_clock.h>
+#include <mod_css_clock.h>
+#include <mod_system_pll.h>
+#include <mod_msys_rom.h>
+#include <mod_pik_clock.h>
+#include <clock_devices.h>
+
+static const struct fwk_element clock_dev_desc_table[] = {
+ [CLOCK_DEV_IDX_BIG] = {
+ .name = "CPU_GROUP_BIG",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CSS_CLOCK, 0),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_CSS_CLOCK,
+ MOD_CSS_CLOCK_API_TYPE_CLOCK),
+ .pd_source_id = FWK_ID_MODULE_INIT(FWK_MODULE_IDX_MSYS_ROM),
+ }),
+ },
+ [CLOCK_DEV_IDX_LITTLE] = {
+ .name = "CPU_GROUP_LITTLE",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CSS_CLOCK, 1),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_CSS_CLOCK,
+ MOD_CSS_CLOCK_API_TYPE_CLOCK),
+ .pd_source_id = FWK_ID_MODULE_INIT(FWK_MODULE_IDX_MSYS_ROM),
+ }),
+ },
+ [CLOCK_DEV_IDX_GPU] = {
+ .name = "GPU",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_CSS_CLOCK, 2),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_CSS_CLOCK,
+ MOD_CSS_CLOCK_API_TYPE_CLOCK),
+ .pd_source_id = FWK_ID_MODULE_INIT(FWK_MODULE_IDX_MSYS_ROM),
+ }),
+ },
+ [CLOCK_DEV_IDX_SYS_ACLKNCI] = {
+ .name = "SYS_ACLKNCI",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PIK_CLOCK, 0),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PIK_CLOCK,
+ MOD_PIK_CLOCK_API_TYPE_CLOCK),
+ .pd_source_id = FWK_ID_MODULE_INIT(FWK_MODULE_IDX_MSYS_ROM),
+ }),
+ },
+ [CLOCK_DEV_IDX_SYS_FCMCLK] = {
+ .name = "SYS_FCMCLK",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PIK_CLOCK, 1),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PIK_CLOCK,
+ MOD_PIK_CLOCK_API_TYPE_CLOCK),
+ .pd_source_id = FWK_ID_MODULE_INIT(FWK_MODULE_IDX_MSYS_ROM),
+ }),
+ },
+ [CLOCK_DEV_IDX_SYS_GICCLK] = {
+ .name = "SYS_GICCLK",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PIK_CLOCK, 2),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PIK_CLOCK,
+ MOD_PIK_CLOCK_API_TYPE_CLOCK),
+ .pd_source_id = FWK_ID_MODULE_INIT(FWK_MODULE_IDX_MSYS_ROM),
+ }),
+ },
+ [CLOCK_DEV_IDX_SYS_PCLKSCP] = {
+ .name = "SYS_PCLKSCP",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PIK_CLOCK, 3),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PIK_CLOCK,
+ MOD_PIK_CLOCK_API_TYPE_CLOCK),
+ .pd_source_id = FWK_ID_MODULE_INIT(FWK_MODULE_IDX_MSYS_ROM),
+ }),
+ },
+ [CLOCK_DEV_IDX_SYS_SYSPERCLK] = {
+ .name = "SYS_SYSPERCLK",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PIK_CLOCK, 4),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PIK_CLOCK,
+ MOD_PIK_CLOCK_API_TYPE_CLOCK),
+ .pd_source_id = FWK_ID_MODULE_INIT(FWK_MODULE_IDX_MSYS_ROM),
+ }),
+ },
+ [CLOCK_DEV_IDX_PLL_SWTCLKTCK] = {
+ .name = "PLL_SWTCLKTCK",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SYSTEM_PLL, 3),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SYSTEM_PLL,
+ MOD_SYSTEM_PLL_API_TYPE_DEFAULT),
+ .pd_source_id = FWK_ID_MODULE_INIT(FWK_MODULE_IDX_MSYS_ROM),
+ }),
+ },
+ [CLOCK_DEV_IDX_PLL_SYSTEM] = {
+ .name = "PLL_SYSTEM",
+ .data = &((struct mod_clock_dev_config) {
+ .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SYSTEM_PLL, 4),
+ .api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SYSTEM_PLL,
+ MOD_SYSTEM_PLL_API_TYPE_DEFAULT),
+ .pd_source_id = FWK_ID_MODULE_INIT(FWK_MODULE_IDX_MSYS_ROM),
+ }),
+ },
+ [CLOCK_DEV_IDX_COUNT] = { }, /* Termination description. */
+};
+
+static const struct fwk_element *clock_get_dev_desc_table(fwk_id_t module_id)
+{
+ return clock_dev_desc_table;
+}
+
+const struct fwk_module_config config_clock = {
+ .get_element_table = clock_get_dev_desc_table,
+ .data = &((struct mod_clock_config) {
+ .pd_transition_notification_id = FWK_ID_NOTIFICATION_INIT(
+ FWK_MODULE_IDX_MSYS_ROM,
+ MOD_MSYS_ROM_NOTIFICATION_IDX_POWER_SYSTOP),
+ .pd_pre_transition_notification_id = FWK_ID_NONE_INIT,
+ }),
+};
diff --git a/product/sgm775/scp_romfw/config_css_clock.c b/product/sgm775/scp_romfw/config_css_clock.c
new file mode 100644
index 00000000..763cf874
--- /dev/null
+++ b/product/sgm775/scp_romfw/config_css_clock.c
@@ -0,0 +1,134 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_css_clock.h>
+#include <mod_system_pll.h>
+#include <mod_pik_clock.h>
+
+static const struct mod_css_clock_rate rate_table_cpu_group_big[] = {
+ {
+ .rate = 1750 * FWK_MHZ,
+ .pll_rate = 1750 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL1,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ .clock_mod_numerator = 1,
+ .clock_mod_denominator = 1,
+ },
+};
+
+static const struct mod_css_clock_rate rate_table_cpu_group_little[] = {
+ {
+ .rate = 1330 * FWK_MHZ,
+ .pll_rate = 1330 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL0,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ .clock_mod_numerator = 1,
+ .clock_mod_denominator = 1,
+ },
+};
+
+static const struct mod_css_clock_rate rate_table_gpu[] = {
+ {
+ .rate = 600 * FWK_MHZ,
+ .pll_rate = 600 * FWK_MHZ,
+ .clock_source = MOD_PIK_CLOCK_MSCLOCK_SOURCE_PRIVPLLCLK,
+ .clock_div_type = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .clock_div = 1,
+ },
+};
+
+static const fwk_id_t member_table_cpu_group_big[] = {
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 9),
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 10),
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 11),
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 12),
+};
+
+static const fwk_id_t member_table_cpu_group_little[] = {
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 5),
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 6),
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 7),
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 8),
+};
+
+static const fwk_id_t member_table_gpu[] = {
+ FWK_ID_ELEMENT(FWK_MODULE_IDX_PIK_CLOCK, 13),
+};
+
+static const struct fwk_element css_clock_element_table[] = {
+ {
+ .name = "CPU_GROUP_BIG",
+ .data = &((struct mod_css_clock_dev_config) {
+ .rate_table = rate_table_cpu_group_big,
+ .rate_count = sizeof(rate_table_cpu_group_big) /
+ sizeof(struct mod_css_clock_rate),
+ .clock_switching_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_SYSREFCLK,
+ .pll_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SYSTEM_PLL, 1),
+ .pll_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SYSTEM_PLL,
+ MOD_SYSTEM_PLL_API_TYPE_DEFAULT),
+ .member_table = member_table_cpu_group_big,
+ .member_count = FWK_ARRAY_SIZE(member_table_cpu_group_big),
+ .member_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PIK_CLOCK,
+ MOD_PIK_CLOCK_API_TYPE_CSS),
+ .initial_rate = 1750 * FWK_MHZ,
+ .modulation_supported = true,
+ }),
+ },
+ {
+ .name = "CPU_GROUP_LITTLE",
+ .data = &((struct mod_css_clock_dev_config) {
+ .rate_table = rate_table_cpu_group_little,
+ .rate_count = sizeof(rate_table_cpu_group_little) /
+ sizeof(struct mod_css_clock_rate),
+ .clock_switching_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_SYSREFCLK,
+ .pll_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SYSTEM_PLL, 0),
+ .pll_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SYSTEM_PLL,
+ MOD_SYSTEM_PLL_API_TYPE_DEFAULT),
+ .member_table = member_table_cpu_group_little,
+ .member_count = FWK_ARRAY_SIZE(member_table_cpu_group_little),
+ .member_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PIK_CLOCK,
+ MOD_PIK_CLOCK_API_TYPE_CSS),
+ .initial_rate = 1330 * FWK_MHZ,
+ .modulation_supported = true,
+ }),
+ },
+ {
+ .name = "GPU",
+ .data = &((struct mod_css_clock_dev_config) {
+ .rate_table = rate_table_gpu,
+ .rate_count = sizeof(rate_table_gpu) /
+ sizeof(struct mod_css_clock_rate),
+ .clock_switching_source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_SYSREFCLK,
+ .pll_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SYSTEM_PLL, 2),
+ .pll_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_SYSTEM_PLL,
+ MOD_SYSTEM_PLL_API_TYPE_DEFAULT),
+ .member_table = member_table_gpu,
+ .member_count = FWK_ARRAY_SIZE(member_table_gpu),
+ .member_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_PIK_CLOCK,
+ MOD_PIK_CLOCK_API_TYPE_CSS),
+ .initial_rate = 600 * FWK_MHZ,
+ .modulation_supported = false,
+ }),
+ },
+ { }, /* Termination description. */
+};
+
+static const struct fwk_element *css_clock_get_element_table
+ (fwk_id_t module_id)
+{
+ return css_clock_element_table;
+}
+
+struct fwk_module_config config_css_clock = {
+ .get_element_table = css_clock_get_element_table,
+};
diff --git a/product/sgm775/scp_romfw/config_log.c b/product/sgm775/scp_romfw/config_log.c
new file mode 100644
index 00000000..9fe5259b
--- /dev/null
+++ b/product/sgm775/scp_romfw/config_log.c
@@ -0,0 +1,63 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_banner.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_clock.h>
+#include <mod_log.h>
+#include <mod_pl011.h>
+#include <system_mmap.h>
+#include <clock_devices.h>
+
+/*
+ * PL011 module
+ */
+static const struct fwk_element pl011_element_desc_table[] = {
+ [0] = {
+ .name = "board-uart1",
+ .data = &((struct mod_pl011_device_config) {
+ .reg_base = BOARD_UART1_BASE,
+ .baud_rate_bps = 115200,
+ .clock_rate_hz = 24 * FWK_MHZ,
+ .clock_id = FWK_ID_ELEMENT_INIT(
+ FWK_MODULE_IDX_CLOCK,
+ CLOCK_DEV_IDX_SYS_FCMCLK),
+ }),
+ },
+ [1] = {},
+};
+
+static const struct fwk_element *get_pl011_table(fwk_id_t module_id)
+{
+ return pl011_element_desc_table;
+}
+
+struct fwk_module_config config_pl011 = {
+ .get_element_table = get_pl011_table,
+};
+
+/*
+ * Log module
+ */
+static const struct mod_log_config log_data = {
+ .device_id = FWK_ID_ELEMENT(FWK_MODULE_IDX_PL011, 0),
+ .api_id = FWK_ID_API(FWK_MODULE_IDX_PL011, 0),
+ .log_groups = MOD_LOG_GROUP_ERROR |
+ MOD_LOG_GROUP_INFO |
+ MOD_LOG_GROUP_WARNING |
+ MOD_LOG_GROUP_DEBUG,
+ .banner = FWK_BANNER_SCP
+ FWK_BANNER_ROM_FIRMWARE
+ BUILD_VERSION_DESCRIBE_STRING "\n",
+};
+
+struct fwk_module_config config_log = {
+ .get_element_table = NULL,
+ .data = &log_data,
+};
diff --git a/product/sgm775/scp_romfw/config_msys_rom.c b/product/sgm775/scp_romfw/config_msys_rom.c
new file mode 100644
index 00000000..12bb5b35
--- /dev/null
+++ b/product/sgm775/scp_romfw/config_msys_rom.c
@@ -0,0 +1,24 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_id.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_msys_rom.h>
+#include <software_mmap.h>
+#include <sgm775_mmap_scp.h>
+#include <sgm775_core.h>
+
+const struct fwk_module_config config_msys_rom = {
+ .data = &((struct msys_rom_config) {
+ .ap_context_base = AP_CONTEXT_BASE,
+ .ap_context_size = AP_CONTEXT_SIZE,
+ .ramfw_base = SCP_RAM_BASE,
+ .id_primary_cluster = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PPU_V1, 0),
+ .id_primary_core = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PPU_V1, 1),
+ })
+};
diff --git a/product/sgm775/scp_romfw/config_pik_clock.c b/product/sgm775/scp_romfw/config_pik_clock.c
new file mode 100644
index 00000000..8059865f
--- /dev/null
+++ b/product/sgm775/scp_romfw/config_pik_clock.c
@@ -0,0 +1,306 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <mod_pik_clock.h>
+#include <sgm775_pik.h>
+#include <system_clock.h>
+
+/*
+ * Rate lookup tables.
+ */
+
+static const struct mod_pik_clock_rate rate_table_sys_fcmclk[] = {
+ {
+ .rate = CLOCK_RATE_SYSPLLCLK,
+ .source = MOD_PIK_CLOCK_MSCLOCK_SOURCE_SYSPLLCLK,
+ .divider_reg = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_SYS,
+ .divider = 1,
+ },
+};
+
+static const struct mod_pik_clock_rate rate_table_sys_aclknci[] = {
+ {
+ .rate = 666 * FWK_MHZ,
+ .source = MOD_PIK_CLOCK_MSCLOCK_SOURCE_SYSPLLCLK,
+ .divider_reg = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_SYS,
+ .divider = DIV_FROM_CLOCK(CLOCK_RATE_SYSPLLCLK, 666 * FWK_MHZ),
+ },
+};
+
+static const struct mod_pik_clock_rate rate_table_sys_gicclk[] = {
+ {
+ .rate = 666 * FWK_MHZ,
+ .source = MOD_PIK_CLOCK_MSCLOCK_SOURCE_SYSPLLCLK,
+ .divider_reg = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_SYS,
+ .divider = DIV_FROM_CLOCK(CLOCK_RATE_SYSPLLCLK, 666 * FWK_MHZ),
+ },
+};
+
+static const struct mod_pik_clock_rate rate_table_sys_pclkscp[] = {
+ {
+ .rate = 125 * FWK_MHZ,
+ .source = MOD_PIK_CLOCK_MSCLOCK_SOURCE_SYSPLLCLK,
+ .divider_reg = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_SYS,
+ .divider = DIV_FROM_CLOCK(CLOCK_RATE_SYSPLLCLK, 125 * FWK_MHZ),
+ },
+};
+
+static const struct mod_pik_clock_rate rate_table_sys_sysperclk[] = {
+ {
+ .rate = 125 * FWK_MHZ,
+ .source = MOD_PIK_CLOCK_MSCLOCK_SOURCE_SYSPLLCLK,
+ .divider_reg = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_SYS,
+ .divider = DIV_FROM_CLOCK(CLOCK_RATE_SYSPLLCLK, 125 * FWK_MHZ),
+ },
+};
+
+static const struct mod_pik_clock_rate rate_table_cpu_a55[] = {
+ {
+ .rate = 1330 * FWK_MHZ,
+ .source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL0,
+ .divider_reg = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .divider = 1, /* Rate adjusted via CPU PLL */
+ },
+};
+
+static const struct mod_pik_clock_rate rate_table_cpu_a75[] = {
+ {
+ .rate = 1750 * FWK_MHZ,
+ .source = MOD_PIK_CLOCK_CLUSCLK_SOURCE_PLL1,
+ .divider_reg = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .divider = 1, /* Rate adjusted via CPU PLL */
+ },
+};
+
+static const struct mod_pik_clock_rate rate_table_gpu[] = {
+ {
+ .rate = 600 * FWK_MHZ,
+ .source = MOD_PIK_CLOCK_MSCLOCK_SOURCE_PRIVPLLCLK,
+ .divider_reg = MOD_PIK_CLOCK_MSCLOCK_DIVIDER_DIV_EXT,
+ .divider = 1, /* Rate adjusted via GPU PLL */
+ },
+};
+
+static const struct fwk_element pik_clock_element_table[] = {
+ /*
+ * System Clocks
+ */
+ {
+ .name = "SYS_ACLKNCI",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_MULTI_SOURCE,
+ .is_group_member = false,
+ .control_reg = &PIK_SYSTEM->ACLKNCI_CTRL,
+ .divsys_reg = &PIK_SYSTEM->ACLKNCI_DIV1,
+ .rate_table = rate_table_sys_aclknci,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_sys_aclknci),
+ .initial_rate = 666 * FWK_MHZ,
+ .defer_initialization = true,
+ }),
+ },
+ {
+ .name = "SYS_FCMCLK",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_MULTI_SOURCE,
+ .is_group_member = false,
+ .control_reg = &PIK_SYSTEM->FCMCLK_CTRL,
+ .divsys_reg = &PIK_SYSTEM->FCMCLK_DIV1,
+ .rate_table = rate_table_sys_fcmclk,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_sys_fcmclk),
+ .initial_rate = CLOCK_RATE_SYSPLLCLK,
+ .defer_initialization = true,
+ }),
+ },
+ {
+ .name = "SYS_GICCLK",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_MULTI_SOURCE,
+ .is_group_member = false,
+ .control_reg = &PIK_SYSTEM->GICCLK_CTRL,
+ .divsys_reg = &PIK_SYSTEM->GICCLK_DIV1,
+ .rate_table = rate_table_sys_gicclk,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_sys_gicclk),
+ .initial_rate = 666 * FWK_MHZ,
+ .defer_initialization = true,
+ }),
+ },
+ {
+ .name = "SYS_PCLKSCP",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_MULTI_SOURCE,
+ .is_group_member = false,
+ .control_reg = &PIK_SYSTEM->PCLKSCP_CTRL,
+ .divsys_reg = &PIK_SYSTEM->PCLKSCP_DIV1,
+ .rate_table = rate_table_sys_pclkscp,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_sys_pclkscp),
+ .initial_rate = 125 * FWK_MHZ,
+ .defer_initialization = true,
+ }),
+ },
+ {
+ .name = "SYS_SYSPERCLK",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_MULTI_SOURCE,
+ .is_group_member = false,
+ .control_reg = &PIK_SYSTEM->SYSPERCLK_CTRL,
+ .divsys_reg = &PIK_SYSTEM->SYSPERCLK_DIV1,
+ .rate_table = rate_table_sys_sysperclk,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_sys_sysperclk),
+ .initial_rate = 125 * FWK_MHZ,
+ .defer_initialization = true,
+ }),
+ },
+ /*
+ * A55 CPUS
+ */
+ {
+ .name = "CLUS0_CPU0",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[0].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[0].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[0].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a55,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a55),
+ .initial_rate = 1330 * FWK_MHZ,
+ .defer_initialization = true,
+ }),
+ },
+ {
+ .name = "CLUS0_CPU1",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[1].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[1].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[1].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a55,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a55),
+ .initial_rate = 1330 * FWK_MHZ,
+ .defer_initialization = true,
+ }),
+ },
+ {
+ .name = "CLUS0_CPU2",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[2].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[2].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[2].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a55,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a55),
+ .initial_rate = 1330 * FWK_MHZ,
+ .defer_initialization = true,
+ }),
+ },
+ {
+ .name = "CLUS0_CPU3",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[3].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[3].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[3].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a55,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a55),
+ .initial_rate = 1330 * FWK_MHZ,
+ .defer_initialization = true,
+ }),
+ },
+ /*
+ * A75 CPUS
+ */
+ {
+ .name = "CLUS0_CPU4",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[4].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[4].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[4].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a75,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a75),
+ .initial_rate = 1750 * FWK_MHZ,
+ .defer_initialization = true,
+ }),
+ },
+ {
+ .name = "CLUS0_CPU5",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[5].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[5].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[5].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a75,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a75),
+ .initial_rate = 1750 * FWK_MHZ,
+ .defer_initialization = true,
+ }),
+ },
+ {
+ .name = "CLUS0_CPU6",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[6].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[6].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[6].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a75,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a75),
+ .initial_rate = 1750 * FWK_MHZ,
+ .defer_initialization = true,
+ }),
+ },
+ {
+ .name = "CLUS0_CPU7",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_CLUSTER,
+ .is_group_member = true,
+ .control_reg = &PIK_CLUS0->AP_CLK_CTRL[7].CORECLK_CTRL,
+ .divext_reg = &PIK_CLUS0->AP_CLK_CTRL[7].CORECLK_DIV,
+ .modulator_reg = &PIK_CLUS0->AP_CLK_CTRL[7].CORECLK_MOD,
+ .rate_table = rate_table_cpu_a75,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_cpu_a75),
+ .initial_rate = 1750 * FWK_MHZ,
+ .defer_initialization = true,
+ }),
+ },
+ /*
+ * GPU
+ */
+ {
+ .name = "GPU",
+ .data = &((struct mod_pik_clock_dev_config) {
+ .type = MOD_PIK_CLOCK_TYPE_MULTI_SOURCE,
+ .is_group_member = true,
+ .control_reg = &PIK_GPU->GPUCLK_CTRL,
+ .divsys_reg = &PIK_GPU->GPUCLK_DIV1,
+ .divext_reg = &PIK_GPU->GPUCLK_DIV2,
+ .rate_table = rate_table_gpu,
+ .rate_count = FWK_ARRAY_SIZE(rate_table_gpu),
+ .initial_rate = 600 * FWK_MHZ,
+ .defer_initialization = true,
+ }),
+ },
+ { }, /* Termination description. */
+};
+
+static const struct fwk_element *pik_clock_get_element_table
+ (fwk_id_t module_id)
+{
+ return pik_clock_element_table;
+}
+
+struct fwk_module_config config_pik_clock = {
+ .get_element_table = pik_clock_get_element_table,
+};
diff --git a/product/sgm775/scp_romfw/config_ppu_v0.c b/product/sgm775/scp_romfw/config_ppu_v0.c
new file mode 100644
index 00000000..59051a41
--- /dev/null
+++ b/product/sgm775/scp_romfw/config_ppu_v0.c
@@ -0,0 +1,48 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_module.h>
+#include <mod_ppu_v0.h>
+#include <sgm775_irq.h>
+#include <sgm775_mmap.h>
+
+static struct fwk_element sgm775_ppu_v0_element_table[] = {
+ {
+ .name = "SYS0",
+ .data = &((struct mod_ppu_v0_pd_config) {
+ .pd_type = MOD_PD_TYPE_SYSTEM,
+ .ppu.reg_base = PPU_SYS0_BASE,
+ .ppu.irq = PPU_SYS0_IRQ,
+ .default_power_on = true,
+ }),
+ },
+ {
+ .name = "SYS1",
+ .data = &((struct mod_ppu_v0_pd_config) {
+ .pd_type = MOD_PD_TYPE_SYSTEM,
+ .ppu.reg_base = PPU_SYS1_BASE,
+ .ppu.irq = PPU_SYS1_IRQ,
+ .default_power_on = true,
+ }),
+ },
+ {}, /* Termination entry */
+};
+
+
+static const struct fwk_element *sgm775_ppu_v0_get_element_table(
+ fwk_id_t module_id)
+{
+ return sgm775_ppu_v0_element_table;
+}
+
+/*
+ * Power module configuration data
+ */
+struct fwk_module_config config_ppu_v0 = {
+ .get_element_table = sgm775_ppu_v0_get_element_table,
+};
diff --git a/product/sgm775/scp_romfw/config_ppu_v1.c b/product/sgm775/scp_romfw/config_ppu_v1.c
new file mode 100644
index 00000000..c1e1e954
--- /dev/null
+++ b/product/sgm775/scp_romfw/config_ppu_v1.c
@@ -0,0 +1,59 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stddef.h>
+#include <fwk_element.h>
+#include <fwk_interrupt.h>
+#include <fwk_mm.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_msys_rom.h>
+#include <mod_ppu_v1.h>
+#include <sgm775_irq.h>
+#include <sgm775_mmap.h>
+
+static struct fwk_element sgm775_ppu_v1_element_table[] = {
+ {
+ .name = "CLUS0",
+ .data = &((struct mod_ppu_v1_pd_config) {
+ .pd_type = MOD_PD_TYPE_CLUSTER,
+ .ppu.reg_base = PPU_CLUS0_BASE,
+ .ppu.irq = FWK_INTERRUPT_NONE,
+ .observer_id = FWK_ID_NONE_INIT,
+ }),
+ },
+ {
+ .name = "CORE0",
+ .data = &((struct mod_ppu_v1_pd_config) {
+ .pd_type = MOD_PD_TYPE_CORE,
+ .ppu.reg_base = PPU_CLUS0CORE0_BASE,
+ .ppu.irq = FWK_INTERRUPT_NONE,
+ .cluster_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_PPU_V1, 0),
+ .observer_id = FWK_ID_NONE_INIT,
+ }),
+ },
+ {}, /* Termination entry */
+};
+
+static const struct fwk_element *sgm775_ppu_v1_get_element_table(
+ fwk_id_t module_id)
+{
+ return sgm775_ppu_v1_element_table;
+}
+
+/*
+ * Power module configuration data
+ */
+struct fwk_module_config config_ppu_v1 = {
+ .get_element_table = sgm775_ppu_v1_get_element_table,
+ .data = &(struct mod_ppu_v1_config) {
+ .pd_notification_id = FWK_ID_NOTIFICATION_INIT(
+ FWK_MODULE_IDX_MSYS_ROM,
+ MOD_MSYS_ROM_NOTIFICATION_IDX_POWER_SYSTOP),
+ .pd_source_id = FWK_ID_MODULE_INIT(FWK_MODULE_IDX_MSYS_ROM),
+ },
+};
diff --git a/product/sgm775/scp_romfw/config_sds.c b/product/sgm775/scp_romfw/config_sds.c
new file mode 100644
index 00000000..fb8f5e30
--- /dev/null
+++ b/product/sgm775/scp_romfw/config_sds.c
@@ -0,0 +1,122 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <assert.h>
+#include <stdint.h>
+#include <fwk_element.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_sds.h>
+#include <sgm775_mmap.h>
+#include <sgm775_sds.h>
+#include <sgm775_ssc.h>
+#include <sgm775_pik.h>
+#include <system_mmap.h>
+#include <clock_devices.h>
+
+static const struct mod_sds_config sds_module_config = {
+ .region_base_address = TRUSTED_RAM_BASE,
+ .region_size = 3520,
+ .clock_id = FWK_ID_ELEMENT_INIT(
+ FWK_MODULE_IDX_CLOCK,
+ CLOCK_DEV_IDX_SYS_FCMCLK),
+};
+static const uint32_t version_packed = FWK_BUILD_VERSION;
+static struct sgm775_sds_platid platid;
+
+static const struct fwk_element sds_element_table[] = {
+ {
+ .name = "CPU Info",
+ .data = &((struct mod_sds_structure_desc) {
+ .id = SGM775_SDS_CPU_INFO,
+ .size = SGM775_SDS_CPU_INFO_SIZE,
+ .finalize = true,
+ }),
+ },
+ {
+ .name = "ROM Version",
+ .data = &((struct mod_sds_structure_desc) {
+ .id = SGM775_SDS_ROM_VERSION,
+ .size = SGM775_SDS_ROM_VERSION_SIZE,
+ .payload = &version_packed,
+ .finalize = true,
+ }),
+ },
+ {
+ .name = "Platform ID",
+ .data = &((struct mod_sds_structure_desc) {
+ .id = SGM775_SDS_PLATFORM_ID,
+ .size = SGM775_SDS_PLATFORM_ID_SIZE,
+ .payload = &platid,
+ .finalize = true,
+ }),
+ },
+ {
+ .name = "Reset Syndrome",
+ .data = &((struct mod_sds_structure_desc) {
+ .id = SGM775_SDS_RESET_SYNDROME,
+ .size = SGM775_SDS_RESET_SYNDROME_SIZE,
+ .payload = (void *)(&PIK_SCP->RESET_SYNDROME),
+ .finalize = true,
+ }),
+ },
+ {
+ .name = "Bootloader",
+ .data = &((struct mod_sds_structure_desc) {
+ .id = SGM775_SDS_BOOTLOADER,
+ .size = SGM775_SDS_BOOTLOADER_SIZE,
+ .finalize = true,
+ }),
+ },
+ {
+ .name = "Features",
+ .data = &((struct mod_sds_structure_desc) {
+ .id = SGM775_SDS_FEATURE_AVAILABILITY,
+ .size = SGM775_SDS_FEATURE_AVAILABILITY_SIZE,
+ .finalize = true,
+ }),
+ },
+#ifdef MODE_DEBUG
+ {
+ .name = "Boot Counters",
+ .data = &((struct mod_sds_structure_desc) {
+ .id = SGM775_SDS_CPU_BOOTCTR,
+ .size = SGM775_SDS_CPU_BOOTCTR_SIZE,
+ .finalize = true,
+ }),
+ },
+ {
+ .name = "CPU Flags",
+ .data = &((struct mod_sds_structure_desc) {
+ .id = SGM775_SDS_CPU_FLAGS,
+ .size = SGM775_SDS_CPU_FLAGS_SIZE,
+ .finalize = true,
+ }),
+ },
+#endif
+ {}, /* Termination description. */
+};
+
+static const struct fwk_element *sds_get_element_table(fwk_id_t module_id)
+{
+ struct ssc_reg *ssc_regs = ((struct ssc_reg *)(SSC_BASE));
+
+ static_assert(BUILD_VERSION_MAJOR < UINT8_MAX, "Invalid version size");
+ static_assert(BUILD_VERSION_MINOR < UINT8_MAX, "Invalid version size");
+ static_assert(BUILD_VERSION_PATCH < UINT16_MAX, "Invalid version size");
+
+ platid.platform_identifier = ssc_regs->SSC_VERSION;
+ platid.platform_type_identifier = *((uint32_t*)PLATFORM_ID);
+
+ return sds_element_table;
+}
+
+struct fwk_module_config config_sds = {
+ .get_element_table = sds_get_element_table,
+ .data = &sds_module_config,
+};
diff --git a/product/sgm775/scp_romfw/config_system_pll.c b/product/sgm775/scp_romfw/config_system_pll.c
new file mode 100644
index 00000000..a709b140
--- /dev/null
+++ b/product/sgm775/scp_romfw/config_system_pll.c
@@ -0,0 +1,91 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_element.h>
+#include <fwk_macros.h>
+#include <fwk_module.h>
+#include <mod_system_pll.h>
+#include <sgm775_pik.h>
+#include <system_mmap.h>
+
+static const struct fwk_element system_pll_element_table[] = {
+ {
+ .name = "CPU_PLL_0",
+ .data = &((struct mod_system_pll_dev_config) {
+ .control_reg = (void *)PLL_CLUS0_0,
+ .status_reg = (void *)&PIK_SCP->PLL_STATUS1,
+ .lock_flag_mask = PLL_STATUS1_CPUPLLLOCK(0, 0),
+ .initial_rate = 1330 * FWK_MHZ,
+ .min_rate = MOD_SYSTEM_PLL_MIN_RATE,
+ .max_rate = MOD_SYSTEM_PLL_MAX_RATE,
+ .min_step = MOD_SYSTEM_PLL_MIN_INTERVAL,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "CPU_PLL_1",
+ .data = &((struct mod_system_pll_dev_config) {
+ .control_reg = (void *)PLL_CLUS0_1,
+ .status_reg = (void *)&PIK_SCP->PLL_STATUS1,
+ .lock_flag_mask = PLL_STATUS1_CPUPLLLOCK(0, 1),
+ .initial_rate = 1750 * FWK_MHZ,
+ .min_rate = MOD_SYSTEM_PLL_MIN_RATE,
+ .max_rate = MOD_SYSTEM_PLL_MAX_RATE,
+ .min_step = MOD_SYSTEM_PLL_MIN_INTERVAL,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "GPU_PLL",
+ .data = &((struct mod_system_pll_dev_config) {
+ .control_reg = (void *)PLL_GPU,
+ .status_reg = (void *)&PIK_SCP->PLL_STATUS0,
+ .lock_flag_mask = PLL_STATUS0_GPUPLLLOCK,
+ .initial_rate = 100 * FWK_MHZ,
+ .min_rate = MOD_SYSTEM_PLL_MIN_RATE,
+ .max_rate = MOD_SYSTEM_PLL_MAX_RATE,
+ .min_step = MOD_SYSTEM_PLL_MIN_INTERVAL,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "SWTCLKTCK_PLL",
+ .data = &((struct mod_system_pll_dev_config) {
+ .control_reg = (void *)SWCLKTCK_CONTROL,
+ .status_reg = NULL,
+ .initial_rate = 100 * FWK_MHZ,
+ .min_rate = MOD_SYSTEM_PLL_MIN_RATE,
+ .max_rate = MOD_SYSTEM_PLL_MAX_RATE,
+ .min_step = MOD_SYSTEM_PLL_MIN_INTERVAL,
+ .defer_initialization = false,
+ }),
+ },
+ {
+ .name = "SYS_PLL",
+ .data = &((struct mod_system_pll_dev_config) {
+ .control_reg = (void *)PLL_SYSTEM,
+ .status_reg = (void *)&PIK_SCP->PLL_STATUS0,
+ .lock_flag_mask = PLL_STATUS0_SYSPLLLOCK,
+ .initial_rate = 2000 * FWK_MHZ,
+ .min_rate = MOD_SYSTEM_PLL_MIN_RATE,
+ .max_rate = MOD_SYSTEM_PLL_MAX_RATE,
+ .min_step = MOD_SYSTEM_PLL_MIN_INTERVAL,
+ .defer_initialization = false,
+ }),
+ },
+ { }, /* Termination description. */
+};
+
+static const struct fwk_element *system_pll_get_element_table
+ (fwk_id_t module_id)
+{
+ return system_pll_element_table;
+}
+
+struct fwk_module_config config_system_pll = {
+ .get_element_table = system_pll_get_element_table,
+};
diff --git a/product/sgm775/scp_romfw/config_timer.c b/product/sgm775/scp_romfw/config_timer.c
new file mode 100644
index 00000000..e58bbf1a
--- /dev/null
+++ b/product/sgm775/scp_romfw/config_timer.c
@@ -0,0 +1,68 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <fwk_id.h>
+#include <fwk_module.h>
+#include <fwk_module_idx.h>
+#include <mod_clock.h>
+#include <mod_gtimer.h>
+#include <mod_timer.h>
+#include <sgm775_mmap.h>
+#include <clock_devices.h>
+#include <system_clock.h>
+
+/*
+ * Generic timer driver config
+ */
+static const struct fwk_element gtimer_dev_table[] = {
+ [0] = {
+ .name = "REFCLK",
+ .data = &((struct mod_gtimer_dev_config) {
+ .hw_timer = REFCLK_CNTBASE0_BASE,
+ .hw_counter = REFCLK_CNTCTL_BASE,
+ .control = REFCLK_CNTCONTROL_BASE,
+ .frequency = CLOCK_RATE_REFCLK,
+ .clock_id = FWK_ID_ELEMENT_INIT(
+ FWK_MODULE_IDX_CLOCK,
+ CLOCK_DEV_IDX_SYS_FCMCLK),
+ })
+ },
+ [1] = {},
+};
+
+static const struct fwk_element *gtimer_get_dev_table(fwk_id_t module_id)
+{
+ return gtimer_dev_table;
+};
+
+struct fwk_module_config config_gtimer = {
+ .get_element_table = gtimer_get_dev_table,
+};
+
+/*
+ * Timer HAL config
+ */
+static const struct mod_timer_dev_config refclk_config = {
+ .id = FWK_ID_ELEMENT(FWK_MODULE_IDX_GTIMER, 0),
+};
+
+static const struct fwk_element timer_dev_table[] = {
+ [0] = {
+ .name = "REFCLK",
+ .data = &refclk_config,
+ },
+ [1] = {},
+};
+
+static const struct fwk_element *timer_get_dev_table(fwk_id_t module_id)
+{
+ return timer_dev_table;
+}
+
+struct fwk_module_config config_timer = {
+ .get_element_table = timer_get_dev_table,
+};
diff --git a/product/sgm775/scp_romfw/firmware.mk b/product/sgm775/scp_romfw/firmware.mk
new file mode 100644
index 00000000..1250577e
--- /dev/null
+++ b/product/sgm775/scp_romfw/firmware.mk
@@ -0,0 +1,38 @@
+#
+# Arm SCP/MCP Software
+# Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+BS_FIRMWARE_CPU := cortex-m3
+BS_FIRMWARE_HAS_MULTITHREADING := no
+BS_FIRMWARE_HAS_NOTIFICATION := yes
+BS_FIRMWARE_MODULE_HEADERS_ONLY := timer \
+ power_domain
+BS_FIRMWARE_MODULES := ppu_v0 \
+ ppu_v1 \
+ pl011 \
+ log \
+ gtimer \
+ msys_rom \
+ bootloader \
+ system_pll \
+ css_clock \
+ pik_clock \
+ clock \
+ sds
+BS_FIRMWARE_SOURCES := config_log.c \
+ config_timer.c \
+ config_msys_rom.c \
+ config_sds.c \
+ config_bootloader.c \
+ config_system_pll.c \
+ config_css_clock.c \
+ config_pik_clock.c \
+ config_clock.c \
+ sgm775_core.c \
+ config_ppu_v0.c \
+ config_ppu_v1.c
+
+include $(BS_DIR)/firmware.mk
diff --git a/product/sgm775/scp_romfw/fmw_memory.ld.S b/product/sgm775/scp_romfw/fmw_memory.ld.S
new file mode 100644
index 00000000..23b89ab4
--- /dev/null
+++ b/product/sgm775/scp_romfw/fmw_memory.ld.S
@@ -0,0 +1,36 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Description:
+ * ROM firmware memory layout for the linker script.
+ */
+
+#ifndef FMW_MEMORY_LD_S
+#define FMW_MEMORY_LD_S
+
+#include <system_mmap_scp.h>
+
+#define FIRMWARE_MEM_MODE FWK_MEM_MODE_DUAL_REGION_RELOCATION
+
+/*
+ * ROM memory
+ */
+#define FIRMWARE_MEM0_SIZE SCP_ROM_SIZE
+#define FIRMWARE_MEM0_BASE SCP_ROM_BASE
+
+/*
+ * RAM memory (16 KiB block at the top of the RAM)
+ *
+ * Note: The sections that must go into the RAM memory (i.e. stack, heap, bss
+ * and data) are placed at the end of the RAM memory to avoid being overwritten
+ * by the bootloader when loading the RAM firmware image.
+ */
+#define FIRMWARE_MEM1_SIZE (16 * 1024)
+#define FIRMWARE_MEM1_BASE (SCP_RAM_BASE + SCP_RAM_SIZE - FIRMWARE_MEM1_SIZE)
+
+#define FIRMWARE_STACK_SIZE (1 * 1024)
+
+#endif /* FMW_MEMORY_LD_S */
diff --git a/product/sgm775/src/sgm775_core.c b/product/sgm775/src/sgm775_core.c
new file mode 100644
index 00000000..750f18a0
--- /dev/null
+++ b/product/sgm775/src/sgm775_core.c
@@ -0,0 +1,14 @@
+/*
+ * Arm SCP/MCP Software
+ * Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <sgm775_pik.h>
+#include <sgm775_core.h>
+
+unsigned int sgm775_core_get_count(void)
+{
+ return (PIK_CLUS0->PIK_CONFIG & PIK_CPU_V8_2_PIK_CONFIG_NO_OF_PPU) - 1;
+}