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