[ambarus:hyperbus 1/7] drivers/mtd/hyperbus/hyperbus-sfdp.c:174:14: error: call to undeclared function 'kmalloc'; ISO C99 and later do not support implicit function declarations

kernel test robot
2024-02-13T19:23:16Z

tree: https://github.com/ambarus/linux-0day hyperbus
head: a15251683a61e8502ebc06584861bf9f5d84823b
commit: b6d1b619a848f5a304ae59ed71a414058e8d3013 [1/7] mtd: hyperbus: Introduce SFDP probe
config: i386-buildonly-randconfig-006-20240213 (https://download.01.org/0day-ci/archive/20240214/202402140320.pd5hsud2-lkp@intel.com/config)
compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240214/202402140320.pd5hsud2-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202402140320.pd5hsud2-lkp@intel.com/

All errors (new ones prefixed by >>):

In file included from drivers/mtd/hyperbus/hyperbus-sfdp.c:6:
In file included from include/linux/mtd/gen_probe.h:10:
include/linux/mtd/flashchip.h:77:2: error: unknown type name 'wait_queue_head_t'
77 | wait_queue_head_t wq; /* Wait on here when we're waiting for the chip
| ^
>> drivers/mtd/hyperbus/hyperbus-sfdp.c:174:14: error: call to undeclared function 'kmalloc'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
174 | cfi->cfiq = kmalloc(sizeof(struct cfi_ident) + nregions * sizeof(u32),
| ^
drivers/mtd/hyperbus/hyperbus-sfdp.c:174:14: note: did you mean 'vmalloc'?
include/linux/vmalloc.h:140:14: note: 'vmalloc' declared here
140 | extern void *vmalloc(unsigned long size) __alloc_size(1);
| ^
>> drivers/mtd/hyperbus/hyperbus-sfdp.c:174:12: error: incompatible integer to pointer conversion assigning to 'struct cfi_ident *' from 'int' [-Wint-conversion]
174 | cfi->cfiq = kmalloc(sizeof(struct cfi_ident) + nregions * sizeof(u32),
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
175 | GFP_KERNEL);
| ~~~~~~~~~~~
>> drivers/mtd/hyperbus/hyperbus-sfdp.c:209:24: error: use of undeclared identifier 'SZ_4K'
209 | *erase++ = ERASEINFO(SZ_4K, nbtm4ks);
| ^
drivers/mtd/hyperbus/hyperbus-sfdp.c:210:35: error: use of undeclared identifier 'SZ_4K'
210 | *erase++ = ERASEINFO(SZ_256K - (SZ_4K * nbtm4ks), 1);
| ^
>> drivers/mtd/hyperbus/hyperbus-sfdp.c:210:24: error: use of undeclared identifier 'SZ_256K'
210 | *erase++ = ERASEINFO(SZ_256K - (SZ_4K * nbtm4ks), 1);
| ^
drivers/mtd/hyperbus/hyperbus-sfdp.c:219:23: error: use of undeclared identifier 'SZ_256K'
219 | *erase++ = ERASEINFO(SZ_256K, n256ks);
| ^
drivers/mtd/hyperbus/hyperbus-sfdp.c:223:35: error: use of undeclared identifier 'SZ_4K'
223 | *erase++ = ERASEINFO(SZ_256K - (SZ_4K * ntop4ks), 1);
| ^
drivers/mtd/hyperbus/hyperbus-sfdp.c:223:24: error: use of undeclared identifier 'SZ_256K'
223 | *erase++ = ERASEINFO(SZ_256K - (SZ_4K * ntop4ks), 1);
| ^
drivers/mtd/hyperbus/hyperbus-sfdp.c:224:22: error: use of undeclared identifier 'SZ_4K'
224 | *erase = ERASEINFO(SZ_4K, ntop4ks);
| ^
drivers/mtd/hyperbus/hyperbus-sfdp.c:343:18: warning: no previous prototype for function 'hyperbus_sfdp_probe' [-Wmissing-prototypes]
343 | struct mtd_info *hyperbus_sfdp_probe(struct map_info *map)
| ^
drivers/mtd/hyperbus/hyperbus-sfdp.c:343:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
343 | struct mtd_info *hyperbus_sfdp_probe(struct map_info *map)
| ^
| static
1 warning and 10 errors generated.

vim +/kmalloc +174 drivers/mtd/hyperbus/hyperbus-sfdp.c

> 6 #include <linux/mtd/gen_probe.h>
7
8 #ifdef CONFIG_MTD_XIP
9
10 /* only needed for short periods, so this is rather simple */
11 #define xip_disable() local_irq_disable()
12
13 #define xip_allowed(base, map) \
14 do { \
15 (void) map_read(map, base); \
16 xip_iprefetch(); \
17 local_irq_enable(); \
18 } while (0)
19
20 #define xip_enable(base, map, cfi) \
21 do { \
22 hyperbus_sfdp_mode_off(base, map, cfi); \
23 xip_allowed(base, map); \
24 } while (0)
25
26 #else
27
28 #define xip_disable() do { } while (0)
29 #define xip_allowed(base, map) do { } while (0)
30 #define xip_enable(base, map, cfi) do { } while (0)
31
32 #endif
33
34 /* HyperBus Commands */
35 #define HYPERBUS_ADDR_UNLOCK1 0x555
36 #define HYPERBUS_ADDR_UNLOCK2 0x2AA
37 #define HYPERBUS_CMD_UNLOCK1 0xAA
38 #define HYPERBUS_CMD_UNLOCK2 0x55
39 #define HYPERBUS_CMD_RDSFDP 0x90
40 #define HYPERBUS_CMD_RDVCR1 0xC7
41 #define HYPERBUS_CMD_RDVCR2 0xC9
42 #define HYPERBUS_CMD_ASOEXT 0xF0
43 #define HYPERBUS_CMD_ERSCTR 0x30
44
45 /* For Infineon S26Hx family */
46 #define S26HX_ADDR_MFR_ID 0x800
47 #define S26HX_ADDR_DEV_ID1 0x801
48 #define S26HX_ADDR_DEV_ID2 0x802
49 #define S26HX_DEV_ID1_3V0 0x006A
50 #define S26HX_DEV_ID1_1V8 0x007B
51 #define S26HX_DEV_ID2_512 0x001A
52 #define S26HX_DEV_ID2_01G 0x001B
53 #define S26HX_CFR1_UNIFORM BIT(9)
54 #define S26HX_CFR1_TP4KBS BIT(8)
55 #define S26HX_CFR2_SP4KBS BIT(2)
56 #define ERASEINFO(s, b) (((s) << 8) | ((b) - 1))
57
58 static inline u16 hyperbus_read(u32 addr, struct map_info *map,
59 struct cfi_private *cfi)
60 {
61 return cfi_read_query16(map, addr * cfi->interleave * cfi->device_type);
62 }
63
64 static inline void hyperbus_write(u8 cmd, u32 addr, struct map_info *map,
65 struct cfi_private *cfi)
66 {
67 cfi_send_gen_cmd(cmd, addr, 0, map, cfi, cfi->device_type, NULL);
68 }
69
70 static int __xipram hyperbus_sfdp_present(struct map_info *map, __u32 base,
71 struct cfi_private *cfi)
72 {
73 int osf = cfi->interleave * cfi->device_type; /* scale factor */
74 map_word val[2];
75 map_word sfdp[2];
76
77 sfdp[0] = cfi_build_cmd(0x4653, map, cfi); /* "SF" */
78 sfdp[1] = cfi_build_cmd(0x5044, map, cfi); /* "DP" */
79
80 val[0] = map_read(map, base + osf * 0x0);
81 val[1] = map_read(map, base + osf * 0x1);
82
83 if (!map_word_equal(map, sfdp[0], val[0]))
84 return 0;
85
86 if (!map_word_equal(map, sfdp[1], val[1]))
87 return 0;
88
89 return 1; /* "SFDP" found */
90 }
91
92 static int __xipram hyperbus_sfdp_mode_on(u32 base, struct map_info *map,
93 struct cfi_private *cfi)
94 {
95 hyperbus_write(HYPERBUS_CMD_ASOEXT, 0, map, cfi);
96 hyperbus_write(HYPERBUS_CMD_UNLOCK1, HYPERBUS_ADDR_UNLOCK1, map, cfi);
97 hyperbus_write(HYPERBUS_CMD_UNLOCK2, HYPERBUS_ADDR_UNLOCK2, map, cfi);
98 hyperbus_write(HYPERBUS_CMD_RDSFDP, HYPERBUS_ADDR_UNLOCK1, map, cfi);
99 return hyperbus_sfdp_present(map, 0, cfi);
100 }
101
102 static void __xipram hyperbus_sfdp_mode_off(u32 base, struct map_info *map,
103 struct cfi_private *cfi)
104 {
105 hyperbus_write(HYPERBUS_CMD_ASOEXT, 0, map, cfi);
106 }
107
108 static u16 __xipram hyperbus_s26hx_rdvcr1(struct map_info *map,
109 struct cfi_private *cfi)
110 {
111 hyperbus_write(HYPERBUS_CMD_UNLOCK1, HYPERBUS_ADDR_UNLOCK1, map, cfi);
112 hyperbus_write(HYPERBUS_CMD_UNLOCK2, HYPERBUS_ADDR_UNLOCK2, map, cfi);
113 hyperbus_write(HYPERBUS_CMD_RDVCR1, HYPERBUS_ADDR_UNLOCK1, map, cfi);
114 return hyperbus_read(0, map, cfi);
115 }
116
117 static u16 __xipram hyperbus_s26hx_rdvcr2(struct map_info *map,
118 struct cfi_private *cfi)
119 {
120 hyperbus_write(HYPERBUS_CMD_UNLOCK1, HYPERBUS_ADDR_UNLOCK1, map, cfi);
121 hyperbus_write(HYPERBUS_CMD_UNLOCK2, HYPERBUS_ADDR_UNLOCK2, map, cfi);
122 hyperbus_write(HYPERBUS_CMD_RDVCR2, HYPERBUS_ADDR_UNLOCK1, map, cfi);
123 return hyperbus_read(0, map, cfi);
124 }
125
126 static int __xipram hyperbus_s26hx_chip_setup(struct map_info *map,
127 struct cfi_private *cfi)
128 {
129 u16 mfr_id, dev_id1, dev_id2, cfr1v, cfr2v, n256ks;
130 u8 nregions, nbtm4ks, ntop4ks;
131 u32 *erase;
132
133 /* Read manufacturer and Device ID */
134 mfr_id = hyperbus_read(S26HX_ADDR_MFR_ID, map, cfi);
135 dev_id1 = hyperbus_read(S26HX_ADDR_DEV_ID1, map, cfi);
136 dev_id2 = hyperbus_read(S26HX_ADDR_DEV_ID2, map, cfi);
137
138 if ((mfr_id != CFI_MFR_CYPRESS) ||
139 (dev_id1 != S26HX_DEV_ID1_3V0 && dev_id1 != S26HX_DEV_ID1_1V8) ||
140 (dev_id2 != S26HX_DEV_ID2_512 && dev_id2 != S26HX_DEV_ID2_01G)) {
141 xip_enable(0, map, cfi);
142 return 0;
143 }
144
145 /* Exit SFDP ASO then read CFR1V and CFR2V */
146 hyperbus_sfdp_mode_off(0, map, cfi);
147 cfr1v = hyperbus_s26hx_rdvcr1(map, cfi);
148 cfr2v = hyperbus_s26hx_rdvcr2(map, cfi);
149
150 xip_enable(0, map, cfi);
151
152 /*
153 * Determine number of regions (nregions), number of bottom 4KB sectors
154 * (nbtm4ks), and number of top 4KB sectors (ntop4ks)
155 */
156 if (cfr1v & S26HX_CFR1_UNIFORM) {
157 nregions = 1;
158 nbtm4ks = 0;
159 ntop4ks = 0;
160 } else if (cfr2v & S26HX_CFR2_SP4KBS) {
161 nregions = 5;
162 nbtm4ks = 16;
163 ntop4ks = 16;
164 } else if (cfr1v & S26HX_CFR1_TP4KBS) {
165 nregions = 3;
166 nbtm4ks = 0;
167 ntop4ks = 32;
168 } else {
169 nregions = 3;
170 nbtm4ks = 32;
171 ntop4ks = 0;
172 }
173
> 174 cfi->cfiq = kmalloc(sizeof(struct cfi_ident) + nregions * sizeof(u32),
175 GFP_KERNEL);
176 if (!cfi->cfiq)
177 return 0;
178
179 memset(cfi->cfiq, 0, sizeof(struct cfi_ident));
180
181 cfi->mfr = mfr_id;
182 cfi->id = dev_id1 << 8 | dev_id2;
183 cfi->cfi_mode = CFI_MODE_CFI;
184 cfi->addr_unlock1 = HYPERBUS_ADDR_UNLOCK1;
185 cfi->addr_unlock2 = HYPERBUS_ADDR_UNLOCK2;
186 cfi->sector_erase_cmd = CMD(HYPERBUS_CMD_ERSCTR);
187
188 cfi->cfiq->P_ID = P_ID_AMD_STD;
189 cfi->cfiq->DevSize = dev_id2; /* dev_id2 indicates size in 2^N */
190 cfi->cfiq->MaxBufWriteSize = 9; /* 2^9 = 512 */
191
192 /*
193 * cfi_cmdset_0002 uses fixed timeout for word write (1ms + 1 jiffies)
194 * and sector erase (20s) that should be enough for s26hx. For buffer
195 * write, 2000us is used if cfiq->BufWriteTimeoutXXX is 0. The typical
196 * and maximum 512B page programming times are 680us and 2175us
197 * respectively. Specify proper values here to extend buffer write
198 * timeout.
199 */
200 cfi->cfiq->BufWriteTimeoutTyp = 10; /* 2^10 = 1024 */
201 cfi->cfiq->BufWriteTimeoutMax = 2; /* 1024 x 2^2 = 4096 */
202
203 /* Setup erase region info */
204 cfi->cfiq->NumEraseRegions = nregions;
205 erase = cfi->cfiq->EraseRegionInfo;
206
207 /* Bottom 4KB sectors and remaining portion */
208 if (nbtm4ks) {
> 209 *erase++ = ERASEINFO(SZ_4K, nbtm4ks);
> 210 *erase++ = ERASEINFO(SZ_256K - (SZ_4K * nbtm4ks), 1);
211 }
212
213 /*
214 * The number of uniform 256KB sectors is obtained by dividing 'device
215 * size' by 256K(=2^18). Deduct overlaid sector(s) from uniform number
216 * if top and/or bottom 4KB sectors exist.
217 */
218 n256ks = (1 << (cfi->cfiq->DevSize - 18)) - !!(nbtm4ks) - !!(ntop4ks);
219 *erase++ = ERASEINFO(SZ_256K, n256ks);
220
221 /* Top 4KB sectors and remaining portion */
222 if (ntop4ks) {
223 *erase++ = ERASEINFO(SZ_256K - (SZ_4K * ntop4ks), 1);
224 *erase = ERASEINFO(SZ_4K, ntop4ks);
225 }
226
227 return 1;
228 }
229

--
0-DAY CI Kernel Test Service