1 /* SPDX-License-Identifier: GPL-2.0+ */ 2 /* 3 * Copyright (C) 2022 StarFive Technology Co., Ltd. 4 * Author: Yanhong Wang<yanhong.wang@starfivetech.com> 5 */ 6 7 #ifndef __STARFIVE_DDR_H__ 8 #define __STARFIVE_DDR_H__ 9 10 #include <linux/kernel.h> 11 12 #define SEC_CTRL_ADDR 0x1000 13 #define PHY_BASE_ADDR 0x800 14 #define PHY_AC_BASE_ADDR 0x1000 15 16 #define DDR_BUS_MASK GENMASK(29, 24) 17 #define DDR_AXI_MASK BIT(31) 18 #define DDR_BUS_OFFSET 0xAC 19 #define DDR_AXI_OFFSET 0xB0 20 21 #define DDR_BUS_OSC_DIV2 0 22 #define DDR_BUS_PLL1_DIV2 1 23 #define DDR_BUS_PLL1_DIV4 2 24 #define DDR_BUS_PLL1_DIV8 3 25 #define DDR_AXI_DISABLE 0 26 #define DDR_AXI_ENABLE 1 27 28 #define OFFSET_SEL BIT(31) 29 #define REG2G BIT(30) 30 #define REG4G BIT(29) 31 #define REG8G BIT(28) 32 #define F_ADDSET BIT(2) 33 #define F_SET BIT(1) 34 #define F_CLRSET BIT(0) 35 #define REGALL (REG2G | REG4G | REG8G) 36 #define REGSETALL (F_SET | REGALL) 37 #define REGCLRSETALL (F_CLRSET | REGALL) 38 #define REGADDSETALL (F_ADDSET | REGALL) 39 40 struct ddr_reg_cfg { 41 u32 offset; 42 u32 mask; 43 u32 val; 44 u32 flag; 45 }; 46 47 enum ddr_size_t { 48 DDR_SIZE_2G, 49 DDR_SIZE_4G, 50 DDR_SIZE_8G, 51 DDR_SIZE_16G, 52 }; 53 54 void ddr_phy_train(u32 *phyreg); 55 void ddr_phy_util(u32 *phyreg); 56 void ddr_phy_start(u32 *phyreg, enum ddr_size_t size); 57 void ddrcsr_boot(u32 *csrreg, u32 *secreg, u32 *phyreg, enum ddr_size_t size); 58 59 #define DDR_REG_TRIGGER(addr, mask, value) \ 60 out_le32((addr), (in_le32(addr) & (mask)) | (value)) 61 62 #define DDR_REG_SET(type, val) \ 63 clrsetbits_le32(JH7110_SYS_CRG + DDR_##type##_OFFSET, \ 64 DDR_##type##_MASK, \ 65 ((val) << __ffs(DDR_##type##_MASK)) & DDR_##type##_MASK) 66 67 #endif /*__STARFIVE_DDR_H__*/ 68