xref: /rk3399_ARM-atf/plat/intel/soc/common/drivers/combophy/combophy.c (revision 6993598f0a52f21a945cf16ba7c8a1bf712379c3)
1ddaf02d1SJit Loon Lim /*
2ddaf02d1SJit Loon Lim  * Copyright (c) 2022-2023, Intel Corporation. All rights reserved.
3*6993598fSGirisha Dengi  * Copyright (c) 2024-2025, Altera Corporation. All rights reserved.
4ddaf02d1SJit Loon Lim  *
5ddaf02d1SJit Loon Lim  * SPDX-License-Identifier: BSD-3-Clause
6ddaf02d1SJit Loon Lim  */
7ddaf02d1SJit Loon Lim 
8ddaf02d1SJit Loon Lim #include <assert.h>
9ddaf02d1SJit Loon Lim #include <errno.h>
10ddaf02d1SJit Loon Lim #include <stdbool.h>
11ddaf02d1SJit Loon Lim #include <string.h>
12ddaf02d1SJit Loon Lim 
13ddaf02d1SJit Loon Lim #include <arch_helpers.h>
14ddaf02d1SJit Loon Lim #include <common/debug.h>
15ddaf02d1SJit Loon Lim #include <drivers/cadence/cdns_sdmmc.h>
16ddaf02d1SJit Loon Lim #include <drivers/delay_timer.h>
17ddaf02d1SJit Loon Lim #include <lib/mmio.h>
18ddaf02d1SJit Loon Lim #include <lib/utils.h>
19ddaf02d1SJit Loon Lim 
20ddaf02d1SJit Loon Lim #include "combophy.h"
21ddaf02d1SJit Loon Lim #include "sdmmc/sdmmc.h"
22ddaf02d1SJit Loon Lim 
23ddaf02d1SJit Loon Lim /* DFI configuration */
24ddaf02d1SJit Loon Lim int dfi_select(handoff *hoff_ptr)
25ddaf02d1SJit Loon Lim {
26*6993598fSGirisha Dengi 	uint32_t reg = 0;
27*6993598fSGirisha Dengi 	uint32_t active_dfi_intf = DFI_CTRL_SEL_HPNFC;
28ddaf02d1SJit Loon Lim 
29*6993598fSGirisha Dengi 	INFO("Power gate enable hand-off: 0x%08x\n", hoff_ptr->peripheral_pwr_gate_array);
30ddaf02d1SJit Loon Lim 
31*6993598fSGirisha Dengi 	if ((hoff_ptr->peripheral_pwr_gate_array & POWER_GATE_EN_SDEMMC) != 0) {
32*6993598fSGirisha Dengi 		INFO("SDEMMC power gate enabled, DFI selected to NAND\n");
33*6993598fSGirisha Dengi 		/*
34*6993598fSGirisha Dengi 		 * SDEMMC power gate enabled.
35*6993598fSGirisha Dengi 		 * This means SDEMMC controller is disabled and active DFI
36*6993598fSGirisha Dengi 		 * interface is selected to NAND via System manager.
37*6993598fSGirisha Dengi 		 */
38*6993598fSGirisha Dengi 		active_dfi_intf = DFI_CTRL_SEL_HPNFC;
39*6993598fSGirisha Dengi 	} else if ((hoff_ptr->peripheral_pwr_gate_array & POWER_GATE_EN_NAND) != 0) {
40*6993598fSGirisha Dengi 		INFO("NAND power gate enabled, DFI selected to SDEMMC\n");
41*6993598fSGirisha Dengi 		/*
42*6993598fSGirisha Dengi 		 * NAND power gate enabled.
43*6993598fSGirisha Dengi 		 * This means NAND controller is disabled and active DFI
44*6993598fSGirisha Dengi 		 * interface is selected to SDEMMC via System manager.
45*6993598fSGirisha Dengi 		 */
46*6993598fSGirisha Dengi 		active_dfi_intf = DFI_CTRL_SEL_SDEMMC;
47*6993598fSGirisha Dengi 	} else {
48*6993598fSGirisha Dengi 		WARN("Neither SDEMMC nor NAND power gate enabled, by def DFI sel to NAND\n");
49ddaf02d1SJit Loon Lim 	}
50ddaf02d1SJit Loon Lim 
51*6993598fSGirisha Dengi 	/* Configure the DFI interface select via System manager. */
52*6993598fSGirisha Dengi 	mmio_setbits_32(SOCFPGA_SYSMGR(DFI_INTF), active_dfi_intf);
53*6993598fSGirisha Dengi 
54*6993598fSGirisha Dengi 	/* Read back and confirm the same.*/
55*6993598fSGirisha Dengi 	reg = mmio_read_32(SOCFPGA_SYSMGR(DFI_INTF));
56*6993598fSGirisha Dengi 	if ((reg & DFI_INTF_MASK) != active_dfi_intf) {
57*6993598fSGirisha Dengi 		ERROR("DFI interface select failed, expected: 0x%08x, got: 0x%08x\n",
58*6993598fSGirisha Dengi 			active_dfi_intf, (reg & DFI_INTF_MASK));
59ddaf02d1SJit Loon Lim 		return -ENXIO;
60*6993598fSGirisha Dengi 	} else {
61*6993598fSGirisha Dengi 		NOTICE("DFI interface selected successfully to %s\n",
62*6993598fSGirisha Dengi 			(reg & DFI_INTF_MASK) == DFI_CTRL_SEL_HPNFC ?
63*6993598fSGirisha Dengi 			"NAND" : "SDEMMC");
64ddaf02d1SJit Loon Lim 	}
65ddaf02d1SJit Loon Lim 
66ddaf02d1SJit Loon Lim 	return 0;
67ddaf02d1SJit Loon Lim }
68ddaf02d1SJit Loon Lim 
69ddaf02d1SJit Loon Lim int combo_phy_init(handoff *hoff_ptr)
70ddaf02d1SJit Loon Lim {
71ddaf02d1SJit Loon Lim 	/* SDMMC/NAND DFI selection based on system manager DFI register */
72ddaf02d1SJit Loon Lim 	int ret = dfi_select(hoff_ptr);
73ddaf02d1SJit Loon Lim 
74ddaf02d1SJit Loon Lim 	if (ret != 0U) {
75ddaf02d1SJit Loon Lim 		ERROR("DFI configuration failed\n");
76ddaf02d1SJit Loon Lim 		return ret;
77ddaf02d1SJit Loon Lim 	}
78ddaf02d1SJit Loon Lim 
79ddaf02d1SJit Loon Lim 	return 0;
80ddaf02d1SJit Loon Lim }
81