/* SPDX-License-Identifier: Apache-2.0 */ /* * Copyright (c) 2023 Intel Corporation * * Author: Adrian Warecki */ #ifndef ZEPHYR_DRIVERS_WATCHDOG_WDT_INTEL_ADSP_H_ #define ZEPHYR_DRIVERS_WATCHDOG_WDT_INTEL_ADSP_H_ /* * Get register offset for core */ #define DSPBRx_OFFSET(x) (0x0020 * (x)) /* * DSPCxWDTCS * DSP Core Watch Dog Timer Control & Status * * Offset: 04h * Block: DSPBRx * * This register controls the DSP Core watch dog timer policy. */ #define DSPCxWDTCS 0x0004 /* * Pause Code * type: WO, rst: 00b, rst domain: nan * * FW write 76h as the code to set the PAUSED bit. Other value are ignored and has no effect. */ #define DSPCxWDTCS_PCODE GENMASK(7, 0) #define DSPCxWDTCS_PCODE_VALUE 0x76 /* * Paused * type: RW/1C, rst: 0b, rst domain: DSPLRST * * When set, it pauses the watch dog timer. Set when 76h is written to the PCODE * field. Clear when FW writes a 1 to the bit. */ #define DSPCxWDTCS_PAUSED BIT(8) /* * Second Time Out Reset Enable * type: RW/1S, rst: 0b, rst domain: DSPLRST * * When set, it allow the DSP Core reset to take place upon second time out of the * watch dog timer. Clear when DSPCCTL.CPA = 0. Set when FW writes a 1 to the bit. */ #define DSPCxWDTCS_STORE BIT(9) /* * DSPCxWDTIPPTR * DSP Core Watch Dog Timer IP Pointer * * Offset: 08h * Block: DSPBRx * * This register provides the pointer to the DSP Core watch dog timer IP registers. */ #define DSPCxWDTIPPTR 0x0008 /* * IP Pointer * type: RO, rst: 07 8300h + 100h * x, rst domain: nan * * This field contains the offset to the IP. */ #define DSPCxWDTIPPTR_PTR GENMASK(20, 0) /* * IP Version * type: RO, rst: 000b, rst domain: nan * * This field indicates the version of the IP. */ #define DSPCxWDTIPPTR_VER GENMASK(23, 21) /** * @brief Set pause signal * * Sets the pause signal to stop the watchdog timing * * @param base Device base address. * @param core Core ID */ static inline void intel_adsp_wdt_pause(uint32_t base, const uint32_t core) { const uint32_t reg_addr = base + DSPCxWDTCS + DSPBRx_OFFSET(core); uint32_t control; control = sys_read32(reg_addr); control &= DSPCxWDTCS_STORE; control |= FIELD_PREP(DSPCxWDTCS_PCODE, DSPCxWDTCS_PCODE_VALUE); sys_write32(control, reg_addr); } /** * @brief Clear pause signal * * Clears the pause signal to resume the watchdog timing * * @param base Device base address. * @param core Core ID */ static inline void intel_adsp_wdt_resume(uint32_t base, const uint32_t core) { const uint32_t reg_addr = base + DSPCxWDTCS + DSPBRx_OFFSET(core); uint32_t control; control = sys_read32(reg_addr); control &= DSPCxWDTCS_STORE; control |= DSPCxWDTCS_PAUSED; sys_write32(control, reg_addr); } /** * @brief Second Time Out Reset Enable * * When set, it allow the DSP Core reset to take place upon second time out of the watchdog timer. * * @param base Device base address. * @param core Core ID */ static inline void intel_adsp_wdt_reset_set(uint32_t base, const uint32_t core, const bool enable) { sys_write32(enable ? DSPCxWDTCS_STORE : 0, base + DSPCxWDTCS + DSPBRx_OFFSET(core)); } /* * Second Time Out Reset Enable * type: RW/1S, rst: 0b, rst domain: DSPLRST * * When set, it allow the DSP Core reset to take place upon second time out of the * watch dog timer. Clear when DSPCCTL.CPA = 0. Set when FW writes a 1 to the bit. */ #define DSPCxWDTCS_STORE BIT(9) /** * @brief Get watchdog IP pointer for specified core. * * Returns the base address of the watchdog IP * * @param base Device base address. * @param core Core ID */ static inline uint32_t intel_adsp_wdt_pointer_get(uint32_t base, const uint32_t core) { return FIELD_GET(DSPCxWDTIPPTR_PTR, sys_read32(base + DSPCxWDTIPPTR + DSPBRx_OFFSET(core))); } /** * @brief Get watchdog version * * Returns the version of the watchdog IP * * @param base Device base address. * @param core Core ID */ static inline uint32_t intel_adsp_wdt_version_get(uint32_t base, const uint32_t core) { return FIELD_GET(DSPCxWDTIPPTR_VER, sys_read32(base + DSPCxWDTIPPTR + DSPBRx_OFFSET(core))); } #endif /* ZEPHYR_DRIVERS_WATCHDOG_WDT_INTEL_ADSP_H_ */