1 /*
2  * Copyright 2022 NXP
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <stdint.h>
8 #include <string.h>
9 
10 #include "mflash_drv.h"
11 #include "fsl_flash.h"
12 #include "fsl_mcm.h"
13 #include "pin_mux.h"
14 
15 static flash_config_t s_flashDriver = {0};
16 
17 static uint32_t pflashBlock0Base = 0;
18 static uint32_t pflashBlock0Size = 0;
19 static uint32_t pflashSectorSize = 0;
20 static uint32_t pflashBlockCount = 0;
21 static uint32_t pflashTotalSize  = 0;
22 
23 /* API - initialize 'mflash' */
mflash_drv_init(void)24 int32_t mflash_drv_init(void)
25 {
26     status_t result;
27 
28     (void)memset(&s_flashDriver, 0, sizeof(flash_config_t));
29 
30     result = FLASH_Init(&s_flashDriver);
31     if (result != kStatus_Success)
32     {
33         return result;
34     }
35 
36 #if defined(SMSCM_CACHE_CLEAR_MASK) && SMSCM_CACHE_CLEAR_MASK
37     /* disable flash cache/Prefetch */
38     FLASH_CACHE_Disable();
39 #endif /* SMSCM_CACHE_CLEAR_MASK */
40 
41     result = FLASH_GetProperty(&s_flashDriver, kFLASH_PropertyPflash0BlockBaseAddr, &pflashBlock0Base);
42     if (result != kStatus_Success)
43     {
44         return result;
45     }
46 
47     result = FLASH_GetProperty(&s_flashDriver, kFLASH_PropertyPflash0BlockSize, &pflashBlock0Size);
48     if (result != kStatus_Success)
49     {
50         return result;
51     }
52 
53     result = FLASH_GetProperty(&s_flashDriver, kFLASH_PropertyPflash0SectorSize, &pflashSectorSize);
54     if (result != kStatus_Success)
55     {
56         return result;
57     }
58 
59     result = FLASH_GetProperty(&s_flashDriver, kFLASH_PropertyPflash0BlockCount, &pflashBlockCount);
60     if (result != kStatus_Success)
61     {
62         return result;
63     }
64 
65     result = FLASH_GetProperty(&s_flashDriver, kFLASH_PropertyPflash0TotalSize, &pflashTotalSize);
66 
67     return result;
68 }
69 
70 /* API - Erase single sector */
mflash_drv_sector_erase(uint32_t sector_addr)71 int32_t mflash_drv_sector_erase(uint32_t sector_addr)
72 {
73     uint32_t primask = 0;
74     int32_t ret      = kStatus_Fail;
75 
76     primask = DisableGlobalIRQ();
77 
78     flash_cache_speculation_control(true, FLASH);
79 
80     ret = FLASH_Erase(&s_flashDriver, FLASH, sector_addr, MFLASH_SECTOR_SIZE, (uint32_t)kFLASH_ApiEraseKey);
81 
82     /* Clear code bus cache */
83     MCM_ClearCodeBusCache(MCM);
84 
85     flash_cache_speculation_control(false, FLASH);
86 
87     EnableGlobalIRQ(primask);
88 
89     return ret;
90 }
91 
92 /* API - Page program */
mflash_drv_page_program(uint32_t page_addr,uint32_t * data)93 int32_t mflash_drv_page_program(uint32_t page_addr, uint32_t *data)
94 {
95     uint32_t primask = 0;
96     int32_t ret      = kStatus_Fail;
97 
98     primask = DisableGlobalIRQ();
99 
100     flash_cache_speculation_control(true, FLASH);
101 
102     ret = FLASH_ProgramPage(&s_flashDriver, FLASH, page_addr, (uint8_t *)data, MFLASH_PAGE_SIZE);
103 
104     /* Clear code bus cache */
105     MCM_ClearCodeBusCache(MCM);
106 
107     flash_cache_speculation_control(false, FLASH);
108 
109     EnableGlobalIRQ(primask);
110 
111     return ret;
112 }
113 
114 /* API - Read data */
mflash_drv_read(uint32_t addr,uint32_t * buffer,uint32_t len)115 int32_t mflash_drv_read(uint32_t addr, uint32_t *buffer, uint32_t len)
116 {
117     (void)memcpy((void *)buffer, (void *)(uint32_t *)addr, len);
118 
119     return kStatus_Success;
120 }
121 
122 /* API - Get pointer to FLASH region */
mflash_drv_phys2log(uint32_t addr,uint32_t len)123 void *mflash_drv_phys2log(uint32_t addr, uint32_t len)
124 {
125     /* FLASH is directly mapped in the address space */
126     return (void *)(addr);
127 }
128 
129 /* API - Get pointer to FLASH region */
mflash_drv_log2phys(void * ptr,uint32_t len)130 uint32_t mflash_drv_log2phys(void *ptr, uint32_t len)
131 {
132     /* FLASH is directly mapped in the address space */
133     return ((uint32_t)ptr);
134 }