1 /*
2  * Copyright (c) 2024 Renesas Electronics Corporation
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_DRIVERS_FLASH_RA_HP_H_
8 #define ZEPHYR_DRIVERS_FLASH_RA_HP_H_
9 
10 #include <zephyr/drivers/flash.h>
11 #include <instances/r_flash_hp.h>
12 #include <api/r_flash_api.h>
13 #include <zephyr/drivers/flash/ra_flash_api_extensions.h>
14 
15 #define CHECK_EQ(val1, val2)                 ((val1) == (val2) ? 1 : 0)
16 #define GET_SIZE(COND, value, default_value) ((COND) ? (value) : (default_value))
17 
18 #define FLASH_HP_BANK2_OFFSET                                                                      \
19 	(BSP_FEATURE_FLASH_HP_CF_DUAL_BANK_START - BSP_FEATURE_FLASH_CODE_FLASH_START)
20 
21 #define FLASH_HP_CF_BLOCK_8KB_SIZE  BSP_FEATURE_FLASH_HP_CF_REGION0_BLOCK_SIZE
22 #define FLASH_HP_CF_BLOCK_32KB_SIZE BSP_FEATURE_FLASH_HP_CF_REGION1_BLOCK_SIZE
23 #define FLASH_HP_DF_BLOCK_SIZE      BSP_FEATURE_FLASH_HP_DF_BLOCK_SIZE
24 #define FLASH_HP_DF_START           BSP_FEATURE_FLASH_DATA_FLASH_START
25 
26 #define FLASH_HP_CF_BLOCK_8KB_LOW_START  (0)
27 #define FLASH_HP_CF_BLOCK_8KB_LOW_END    (7)
28 #define FLASH_HP_CF_BLOCK_8KB_HIGH_START (70)
29 #define FLASH_HP_CF_BLOCK_8KB_HIGH_END   (77)
30 
31 #define FLASH_HP_CF_BLOCK_32KB_LINEAR_START (8)
32 #define FLASH_HP_CF_BLOCK_32KB_LINEAR_END   (DT_PROP(DT_NODELABEL(flash), block_32kb_linear_end))
33 
34 #define FLASH_HP_DF_BLOCK_END (DT_REG_SIZE(DT_NODELABEL(flash1)) / FLASH_HP_DF_BLOCK_SIZE)
35 
36 #if defined(CONFIG_DUAL_BANK_MODE)
37 #define FLASH_HP_CF_NUM_BLOCK_RESERVED         (DT_PROP(DT_NODELABEL(flash), reserved_area_num))
38 #define FLASH_HP_CF_BLOCK_32KB_DUAL_LOW_START  (8)
39 #define FLASH_HP_CF_BLOCK_32KB_DUAL_HIGH_START (78)
40 
41 #define FLASH_HP_CF_BLOCK_32KB_DUAL_LOW_END (DT_PROP(DT_NODELABEL(flash), block_32kb_dual_low_end))
42 #define FLASH_HP_CF_BLOCK_32KB_DUAL_HIGH_END                                                       \
43 	(DT_PROP(DT_NODELABEL(flash), block_32kb_dual_high_end))
44 
45 #define FLASH_HP_CF_DUAL_HIGH_START_ADDRESS BSP_FEATURE_FLASH_HP_CF_DUAL_BANK_START
46 
47 #define FLASH_HP_CF_DUAL_LOW_END_ADDRESS                                                           \
48 	(DT_REG_SIZE(DT_NODELABEL(flash0)) -                                                       \
49 	 ((FLASH_HP_CF_BLOCK_32KB_LINEAR_END - FLASH_HP_CF_BLOCK_32KB_DUAL_LOW_END) *              \
50 	  FLASH_HP_CF_BLOCK_32KB_SIZE))
51 
52 #define FLASH_HP_CF_DUAL_HIGH_END_ADDRESS                                                          \
53 	(DT_REG_SIZE(DT_NODELABEL(flash0)) +                                                       \
54 	 (FLASH_HP_CF_NUM_BLOCK_RESERVED * FLASH_HP_CF_BLOCK_32KB_SIZE))
55 #endif
56 
57 #if defined(CONFIG_FLASH_EX_OP_ENABLED)
58 #define FLASH_HP_FCU_CONFIG_SET_BPS     (0x1300A1C0U)
59 #define FLASH_HP_FCU_CONFIG_SET_BPS_SEC (0x0300A240U)
60 #define FLASH_HP_FCU_CONFIG_SET_BPS_SEL (0x0300A2C0U)
61 
62 #define FLASH_HP_FCU_CONFIG_SET_PBPS     (0x1300A1E0U)
63 #define FLASH_HP_FCU_CONFIG_SET_PBPS_SEC (0x0300A260U)
64 #endif /* CONFIG_FLASH_EX_OP_ENABLED */
65 
66 /* Zero based offset into g_configuration_area_data[] for BPS */
67 #define FLASH_HP_FCU_CONFIG_SET_BPS_OFFSET (0U)
68 
69 enum flash_region {
70 	CODE_FLASH,
71 	DATA_FLASH,
72 };
73 
74 typedef void (*irq_config_func_t)(const struct device *dev);
75 
76 struct flash_hp_ra_controller {
77 	struct st_flash_hp_instance_ctrl flash_ctrl;
78 	struct k_sem ctrl_sem;
79 	struct st_flash_cfg fsp_config;
80 };
81 
82 struct flash_hp_ra_controller_config {
83 	irq_config_func_t irq_config;
84 };
85 
86 struct flash_hp_ra_data {
87 	struct flash_hp_ra_controller *controller;
88 	enum flash_region FlashRegion;
89 	uint32_t area_address;
90 	uint32_t area_size;
91 };
92 
93 struct flash_hp_ra_config {
94 	struct flash_parameters flash_ra_parameters;
95 };
96 
97 struct event_flash {
98 	volatile bool erase_complete;
99 	volatile bool write_complete;
100 };
101 
102 #if defined(CONFIG_FLASH_RA_WRITE_PROTECT)
103 int flash_ra_ex_op_write_protect(const struct device *dev, const uintptr_t in, void *out);
104 #endif /*CONFIG_FLASH_RA_WRITE_PROTECT*/
105 
106 #endif /* ZEPHYR_DRIVERS_FLASH_RA_HP_H_ */
107