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 */ 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 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 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 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