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