xref: /openbmc/u-boot/arch/arm/mach-meson/board-gx.c (revision ab0ec15f77b5692c06fac024f34a90ab4752b41a)
133e33780SJerome Brunet // SPDX-License-Identifier: GPL-2.0+
233e33780SJerome Brunet /*
333e33780SJerome Brunet  * (C) Copyright 2016 Beniamino Galvani <b.galvani@gmail.com>
433e33780SJerome Brunet  * (C) Copyright 2018 Neil Armstrong <narmstrong@baylibre.com>
533e33780SJerome Brunet  */
633e33780SJerome Brunet 
733e33780SJerome Brunet #include <common.h>
8d96a782dSNeil Armstrong #include <asm/arch/boot.h>
933e33780SJerome Brunet #include <asm/arch/eth.h>
1033e33780SJerome Brunet #include <asm/arch/gx.h>
1133e33780SJerome Brunet #include <asm/arch/mem.h>
12*0cc53fafSMaxime Jourdan #include <asm/arch/meson-vpu.h>
1333e33780SJerome Brunet #include <asm/io.h>
1433e33780SJerome Brunet #include <asm/armv8/mmu.h>
1533e33780SJerome Brunet #include <linux/sizes.h>
1633e33780SJerome Brunet #include <phy.h>
1733e33780SJerome Brunet 
1833e33780SJerome Brunet DECLARE_GLOBAL_DATA_PTR;
1933e33780SJerome Brunet 
meson_get_boot_device(void)20d96a782dSNeil Armstrong int meson_get_boot_device(void)
21d96a782dSNeil Armstrong {
22d96a782dSNeil Armstrong 	return readl(GX_AO_SEC_GP_CFG0) & GX_AO_BOOT_DEVICE;
23d96a782dSNeil Armstrong }
24d96a782dSNeil Armstrong 
2533e33780SJerome Brunet /* Configure the reserved memory zones exported by the secure registers
2633e33780SJerome Brunet  * into EFI and DTB reserved memory entries.
2733e33780SJerome Brunet  */
meson_init_reserved_memory(void * fdt)2833e33780SJerome Brunet void meson_init_reserved_memory(void *fdt)
2933e33780SJerome Brunet {
3033e33780SJerome Brunet 	u64 bl31_size, bl31_start;
3133e33780SJerome Brunet 	u64 bl32_size, bl32_start;
3233e33780SJerome Brunet 	u32 reg;
3333e33780SJerome Brunet 
3433e33780SJerome Brunet 	/*
3533e33780SJerome Brunet 	 * Get ARM Trusted Firmware reserved memory zones in :
3633e33780SJerome Brunet 	 * - AO_SEC_GP_CFG3: bl32 & bl31 size in KiB, can be 0
3733e33780SJerome Brunet 	 * - AO_SEC_GP_CFG5: bl31 physical start address, can be NULL
3833e33780SJerome Brunet 	 * - AO_SEC_GP_CFG4: bl32 physical start address, can be NULL
3933e33780SJerome Brunet 	 */
4033e33780SJerome Brunet 	reg = readl(GX_AO_SEC_GP_CFG3);
4133e33780SJerome Brunet 
4233e33780SJerome Brunet 	bl31_size = ((reg & GX_AO_BL31_RSVMEM_SIZE_MASK)
4333e33780SJerome Brunet 			>> GX_AO_BL31_RSVMEM_SIZE_SHIFT) * SZ_1K;
4433e33780SJerome Brunet 	bl32_size = (reg & GX_AO_BL32_RSVMEM_SIZE_MASK) * SZ_1K;
4533e33780SJerome Brunet 
4633e33780SJerome Brunet 	bl31_start = readl(GX_AO_SEC_GP_CFG5);
4733e33780SJerome Brunet 	bl32_start = readl(GX_AO_SEC_GP_CFG4);
4833e33780SJerome Brunet 
4933e33780SJerome Brunet 	/*
5033e33780SJerome Brunet 	 * Early Meson GX Firmware revisions did not provide the reserved
5133e33780SJerome Brunet 	 * memory zones in the registers, keep fixed memory zone handling.
5233e33780SJerome Brunet 	 */
5333e33780SJerome Brunet 	if (IS_ENABLED(CONFIG_MESON_GX) &&
5433e33780SJerome Brunet 	    !reg && !bl31_start && !bl32_start) {
5533e33780SJerome Brunet 		bl31_start = 0x10000000;
5633e33780SJerome Brunet 		bl31_size = 0x200000;
5733e33780SJerome Brunet 	}
5833e33780SJerome Brunet 
5933e33780SJerome Brunet 	/* Add first 16MiB reserved zone */
6033e33780SJerome Brunet 	meson_board_add_reserved_memory(fdt, 0, GX_FIRMWARE_MEM_SIZE);
6133e33780SJerome Brunet 
6233e33780SJerome Brunet 	/* Add BL31 reserved zone */
6333e33780SJerome Brunet 	if (bl31_start && bl31_size)
6433e33780SJerome Brunet 		meson_board_add_reserved_memory(fdt, bl31_start, bl31_size);
6533e33780SJerome Brunet 
6633e33780SJerome Brunet 	/* Add BL32 reserved zone */
6733e33780SJerome Brunet 	if (bl32_start && bl32_size)
6833e33780SJerome Brunet 		meson_board_add_reserved_memory(fdt, bl32_start, bl32_size);
69*0cc53fafSMaxime Jourdan 
70*0cc53fafSMaxime Jourdan #if defined(CONFIG_VIDEO_MESON)
71*0cc53fafSMaxime Jourdan 	meson_vpu_rsv_fb(fdt);
72*0cc53fafSMaxime Jourdan #endif
7333e33780SJerome Brunet }
7433e33780SJerome Brunet 
get_effective_memsize(void)7533e33780SJerome Brunet phys_size_t get_effective_memsize(void)
7633e33780SJerome Brunet {
7733e33780SJerome Brunet 	/* Size is reported in MiB, convert it in bytes */
7833e33780SJerome Brunet 	return ((readl(GX_AO_SEC_GP_CFG0) & GX_AO_MEM_SIZE_MASK)
7933e33780SJerome Brunet 			>> GX_AO_MEM_SIZE_SHIFT) * SZ_1M;
8033e33780SJerome Brunet }
8133e33780SJerome Brunet 
8233e33780SJerome Brunet static struct mm_region gx_mem_map[] = {
8333e33780SJerome Brunet 	{
8433e33780SJerome Brunet 		.virt = 0x0UL,
8533e33780SJerome Brunet 		.phys = 0x0UL,
8633e33780SJerome Brunet 		.size = 0xc0000000UL,
8733e33780SJerome Brunet 		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
8833e33780SJerome Brunet 			 PTE_BLOCK_INNER_SHARE
8933e33780SJerome Brunet 	}, {
9033e33780SJerome Brunet 		.virt = 0xc0000000UL,
9133e33780SJerome Brunet 		.phys = 0xc0000000UL,
9233e33780SJerome Brunet 		.size = 0x30000000UL,
9333e33780SJerome Brunet 		.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
9433e33780SJerome Brunet 			 PTE_BLOCK_NON_SHARE |
9533e33780SJerome Brunet 			 PTE_BLOCK_PXN | PTE_BLOCK_UXN
9633e33780SJerome Brunet 	}, {
9733e33780SJerome Brunet 		/* List terminator */
9833e33780SJerome Brunet 		0,
9933e33780SJerome Brunet 	}
10033e33780SJerome Brunet };
10133e33780SJerome Brunet 
10233e33780SJerome Brunet struct mm_region *mem_map = gx_mem_map;
10333e33780SJerome Brunet 
10433e33780SJerome Brunet /* Configure the Ethernet MAC with the requested interface mode
10533e33780SJerome Brunet  * with some optional flags.
10633e33780SJerome Brunet  */
meson_eth_init(phy_interface_t mode,unsigned int flags)10733e33780SJerome Brunet void meson_eth_init(phy_interface_t mode, unsigned int flags)
10833e33780SJerome Brunet {
10933e33780SJerome Brunet 	switch (mode) {
11033e33780SJerome Brunet 	case PHY_INTERFACE_MODE_RGMII:
11133e33780SJerome Brunet 	case PHY_INTERFACE_MODE_RGMII_ID:
11233e33780SJerome Brunet 	case PHY_INTERFACE_MODE_RGMII_RXID:
11333e33780SJerome Brunet 	case PHY_INTERFACE_MODE_RGMII_TXID:
11433e33780SJerome Brunet 		/* Set RGMII mode */
11533e33780SJerome Brunet 		setbits_le32(GX_ETH_REG_0, GX_ETH_REG_0_PHY_INTF |
11633e33780SJerome Brunet 			     GX_ETH_REG_0_TX_PHASE(1) |
11733e33780SJerome Brunet 			     GX_ETH_REG_0_TX_RATIO(4) |
11833e33780SJerome Brunet 			     GX_ETH_REG_0_PHY_CLK_EN |
11933e33780SJerome Brunet 			     GX_ETH_REG_0_CLK_EN);
12033e33780SJerome Brunet 		break;
12133e33780SJerome Brunet 
12233e33780SJerome Brunet 	case PHY_INTERFACE_MODE_RMII:
12333e33780SJerome Brunet 		/* Set RMII mode */
12433e33780SJerome Brunet 		out_le32(GX_ETH_REG_0, GX_ETH_REG_0_INVERT_RMII_CLK |
12533e33780SJerome Brunet 					 GX_ETH_REG_0_CLK_EN);
12633e33780SJerome Brunet 
12733e33780SJerome Brunet 		/* Use GXL RMII Internal PHY */
12833e33780SJerome Brunet 		if (IS_ENABLED(CONFIG_MESON_GXL) &&
12933e33780SJerome Brunet 		    (flags & MESON_USE_INTERNAL_RMII_PHY)) {
13033e33780SJerome Brunet 			writel(0x10110181, GX_ETH_REG_2);
13133e33780SJerome Brunet 			writel(0xe40908ff, GX_ETH_REG_3);
13233e33780SJerome Brunet 		}
13333e33780SJerome Brunet 
13433e33780SJerome Brunet 		break;
13533e33780SJerome Brunet 
13633e33780SJerome Brunet 	default:
13733e33780SJerome Brunet 		printf("Invalid Ethernet interface mode\n");
13833e33780SJerome Brunet 		return;
13933e33780SJerome Brunet 	}
14033e33780SJerome Brunet 
14133e33780SJerome Brunet 	/* Enable power gate */
14233e33780SJerome Brunet 	clrbits_le32(GX_MEM_PD_REG_0, GX_MEM_PD_REG_0_ETH_MASK);
14333e33780SJerome Brunet }
144