1*e3ec6ff4SXiaoDong Huang /* 2*e3ec6ff4SXiaoDong Huang * Copyright (c) 2024, Rockchip, Inc. All rights reserved. 3*e3ec6ff4SXiaoDong Huang * 4*e3ec6ff4SXiaoDong Huang * SPDX-License-Identifier: BSD-3-Clause 5*e3ec6ff4SXiaoDong Huang */ 6*e3ec6ff4SXiaoDong Huang 7*e3ec6ff4SXiaoDong Huang #ifndef PLAT_PM_HELPERS_H 8*e3ec6ff4SXiaoDong Huang #define PLAT_PM_HELPERS_H 9*e3ec6ff4SXiaoDong Huang 10*e3ec6ff4SXiaoDong Huang #include <stdint.h> 11*e3ec6ff4SXiaoDong Huang 12*e3ec6ff4SXiaoDong Huang /** 13*e3ec6ff4SXiaoDong Huang * Use this macro to define a register region. 14*e3ec6ff4SXiaoDong Huang * start: start offset from the base address. 15*e3ec6ff4SXiaoDong Huang * end: end offset from the base address. 16*e3ec6ff4SXiaoDong Huang * stride: stride of registers in region. 17*e3ec6ff4SXiaoDong Huang * base: base address of registers in region. 18*e3ec6ff4SXiaoDong Huang * wmsk: write mask of registers in region. 19*e3ec6ff4SXiaoDong Huang */ 20*e3ec6ff4SXiaoDong Huang #define REG_REGION(_start, _end, _stride, _base, _wmsk) \ 21*e3ec6ff4SXiaoDong Huang { \ 22*e3ec6ff4SXiaoDong Huang .start = (_base) + (_start), \ 23*e3ec6ff4SXiaoDong Huang .end = (_base) + (_end), \ 24*e3ec6ff4SXiaoDong Huang .stride = _stride, \ 25*e3ec6ff4SXiaoDong Huang .wmsk = _wmsk \ 26*e3ec6ff4SXiaoDong Huang } 27*e3ec6ff4SXiaoDong Huang 28*e3ec6ff4SXiaoDong Huang struct reg_region { 29*e3ec6ff4SXiaoDong Huang /* Start address of region */ 30*e3ec6ff4SXiaoDong Huang uint32_t start; 31*e3ec6ff4SXiaoDong Huang /* End address of region */ 32*e3ec6ff4SXiaoDong Huang uint32_t end; 33*e3ec6ff4SXiaoDong Huang /* Stride of registers in region */ 34*e3ec6ff4SXiaoDong Huang uint32_t stride; 35*e3ec6ff4SXiaoDong Huang /* Write mask of registers in region */ 36*e3ec6ff4SXiaoDong Huang uint32_t wmsk; 37*e3ec6ff4SXiaoDong Huang /* Buffer to save/restore registers in region */ 38*e3ec6ff4SXiaoDong Huang uint32_t *buf; 39*e3ec6ff4SXiaoDong Huang }; 40*e3ec6ff4SXiaoDong Huang 41*e3ec6ff4SXiaoDong Huang void rockchip_alloc_region_mem(struct reg_region *rgns, uint32_t rgn_num); 42*e3ec6ff4SXiaoDong Huang void rockchip_reg_rgn_save(struct reg_region *rgns, uint32_t rgn_num); 43*e3ec6ff4SXiaoDong Huang void rockchip_reg_rgn_restore(struct reg_region *rgns, uint32_t rgn_num); 44*e3ec6ff4SXiaoDong Huang void rockchip_reg_rgn_restore_reverse(struct reg_region *rgns, uint32_t rgn_num); 45*e3ec6ff4SXiaoDong Huang void rockchip_regs_dump(uint32_t base, 46*e3ec6ff4SXiaoDong Huang uint32_t start_offset, 47*e3ec6ff4SXiaoDong Huang uint32_t end_offset, 48*e3ec6ff4SXiaoDong Huang uint32_t stride); 49*e3ec6ff4SXiaoDong Huang void rockchip_dump_reg_rgns(struct reg_region *rgns, uint32_t rgn_num); 50*e3ec6ff4SXiaoDong Huang 51*e3ec6ff4SXiaoDong Huang #endif /* PLAT_PM_HELPERS_H */ 52