xref: /aosp_15_r20/external/arm-trusted-firmware/drivers/marvell/ddr_phy_access.c (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park /*
2*54fd6939SJiyong Park  * Copyright (C) 2021 Marvell International Ltd.
3*54fd6939SJiyong Park  *
4*54fd6939SJiyong Park  * SPDX-License-Identifier:     BSD-3-Clause
5*54fd6939SJiyong Park  * https://spdx.org/licenses
6*54fd6939SJiyong Park  */
7*54fd6939SJiyong Park 
8*54fd6939SJiyong Park #include "ddr_phy_access.h"
9*54fd6939SJiyong Park #include <lib/mmio.h>
10*54fd6939SJiyong Park #include <drivers/marvell/ccu.h>
11*54fd6939SJiyong Park #include <errno.h>
12*54fd6939SJiyong Park 
13*54fd6939SJiyong Park #define DDR_PHY_END_ADDRESS	0x100000
14*54fd6939SJiyong Park 
15*54fd6939SJiyong Park #ifdef DDR_PHY_DEBUG
16*54fd6939SJiyong Park #define debug_printf(...) printf(__VA_ARGS__)
17*54fd6939SJiyong Park #else
18*54fd6939SJiyong Park #define debug_printf(...)
19*54fd6939SJiyong Park #endif
20*54fd6939SJiyong Park 
21*54fd6939SJiyong Park 
22*54fd6939SJiyong Park /*
23*54fd6939SJiyong Park  * This routine writes 'data' to specified 'address' offset,
24*54fd6939SJiyong Park  * with optional debug print support
25*54fd6939SJiyong Park  */
snps_fw_write(uintptr_t offset,uint16_t data)26*54fd6939SJiyong Park int snps_fw_write(uintptr_t offset, uint16_t data)
27*54fd6939SJiyong Park {
28*54fd6939SJiyong Park 	debug_printf("In %s\n", __func__);
29*54fd6939SJiyong Park 
30*54fd6939SJiyong Park 	if (offset < DDR_PHY_END_ADDRESS) {
31*54fd6939SJiyong Park 		mmio_write_16(DDR_PHY_BASE_ADDR + (2 * offset), data);
32*54fd6939SJiyong Park 		return 0;
33*54fd6939SJiyong Park 	}
34*54fd6939SJiyong Park 	debug_printf("%s: illegal offset value: 0x%x\n", __func__, offset);
35*54fd6939SJiyong Park 	return -EINVAL;
36*54fd6939SJiyong Park }
37*54fd6939SJiyong Park 
snps_fw_read(uintptr_t offset,uint16_t * read)38*54fd6939SJiyong Park int snps_fw_read(uintptr_t offset, uint16_t *read)
39*54fd6939SJiyong Park {
40*54fd6939SJiyong Park 	debug_printf("In %s\n", __func__);
41*54fd6939SJiyong Park 
42*54fd6939SJiyong Park 	if (offset < DDR_PHY_END_ADDRESS) {
43*54fd6939SJiyong Park 		*read = mmio_read_16(DDR_PHY_BASE_ADDR + (2 * offset));
44*54fd6939SJiyong Park 		return 0;
45*54fd6939SJiyong Park 	}
46*54fd6939SJiyong Park 	debug_printf("%s: illegal offset value: 0x%x\n", __func__, offset);
47*54fd6939SJiyong Park 	return -EINVAL;
48*54fd6939SJiyong Park }
49*54fd6939SJiyong Park 
mvebu_ddr_phy_write(uintptr_t offset,uint16_t data)50*54fd6939SJiyong Park int mvebu_ddr_phy_write(uintptr_t offset, uint16_t data)
51*54fd6939SJiyong Park {
52*54fd6939SJiyong Park 	return snps_fw_write(offset, data);
53*54fd6939SJiyong Park }
54*54fd6939SJiyong Park 
mvebu_ddr_phy_read(uintptr_t offset,uint16_t * read)55*54fd6939SJiyong Park int mvebu_ddr_phy_read(uintptr_t offset, uint16_t *read)
56*54fd6939SJiyong Park {
57*54fd6939SJiyong Park 	return snps_fw_read(offset, read);
58*54fd6939SJiyong Park }
59