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