| /* SPDX-License-Identifier: GPL-2.0+ */ | |
| /* | |
| * Copyright (C) 2022 StarFive Technology Co., Ltd. | |
| * Author: Yanhong Wang<yanhong.wang@starfivetech.com> | |
| */ | |
| #ifndef __STARFIVE_DDR_H__ | |
| #define __STARFIVE_DDR_H__ | |
| #include <linux/kernel.h> | |
| #define SEC_CTRL_ADDR 0x1000 | |
| #define PHY_BASE_ADDR 0x800 | |
| #define PHY_AC_BASE_ADDR 0x1000 | |
| #define DDR_BUS_MASK GENMASK(29, 24) | |
| #define DDR_AXI_MASK BIT(31) | |
| #define DDR_BUS_OFFSET 0xAC | |
| #define DDR_AXI_OFFSET 0xB0 | |
| #define DDR_BUS_OSC_DIV2 0 | |
| #define DDR_BUS_PLL1_DIV2 1 | |
| #define DDR_BUS_PLL1_DIV4 2 | |
| #define DDR_BUS_PLL1_DIV8 3 | |
| #define DDR_AXI_DISABLE 0 | |
| #define DDR_AXI_ENABLE 1 | |
| #define OFFSET_SEL BIT(31) | |
| #define REG2G BIT(30) | |
| #define REG4G BIT(29) | |
| #define REG8G BIT(28) | |
| #define F_ADDSET BIT(2) | |
| #define F_SET BIT(1) | |
| #define F_CLRSET BIT(0) | |
| #define REGALL (REG2G | REG4G | REG8G) | |
| #define REGSETALL (F_SET | REGALL) | |
| #define REGCLRSETALL (F_CLRSET | REGALL) | |
| #define REGADDSETALL (F_ADDSET | REGALL) | |
| struct ddr_reg_cfg { | |
| u32 offset; | |
| u32 mask; | |
| u32 val; | |
| u32 flag; | |
| }; | |
| enum ddr_size_t { | |
| DDR_SIZE_2G, | |
| DDR_SIZE_4G, | |
| DDR_SIZE_8G, | |
| }; | |
| void ddr_phy_train(u32 *phyreg); | |
| void ddr_phy_util(u32 *phyreg); | |
| void ddr_phy_start(u32 *phyreg, enum ddr_size_t size); | |
| void ddrcsr_boot(u32 *csrreg, u32 *secreg, u32 *phyreg, enum ddr_size_t size); | |
| #define DDR_REG_TRIGGER(addr, mask, value) \ | |
| out_le32((addr), (in_le32(addr) & (mask)) | (value)) | |
| #define DDR_REG_SET(type, val) \ | |
| clrsetbits_le32(JH7110_SYS_CRG + DDR_##type##_OFFSET, \ | |
| DDR_##type##_MASK, \ | |
| ((val) << __ffs(DDR_##type##_MASK)) & DDR_##type##_MASK) | |
| #endif /*__STARFIVE_DDR_H__*/ |