1
2
3
4
5
6
7
8#ifndef __BOARD_DETECT_H
9#define __BOARD_DETECT_H
10
11
12#include <linux/bitops.h>
13#define TI_EEPROM_HEADER_MAGIC 0xEE3355AA
14#define TI_DEAD_EEPROM_MAGIC 0xADEAD12C
15
16#define TI_EEPROM_HDR_NAME_LEN 8
17#define TI_EEPROM_HDR_REV_LEN 4
18#define TI_EEPROM_HDR_SERIAL_LEN 12
19#define TI_EEPROM_HDR_CONFIG_LEN 32
20#define TI_EEPROM_HDR_NO_OF_MAC_ADDR 3
21#define TI_EEPROM_HDR_ETH_ALEN 6
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38struct ti_am_eeprom {
39 unsigned int header;
40 char name[TI_EEPROM_HDR_NAME_LEN];
41 char version[TI_EEPROM_HDR_REV_LEN];
42 char serial[TI_EEPROM_HDR_SERIAL_LEN];
43 char config[TI_EEPROM_HDR_CONFIG_LEN];
44 char mac_addr[TI_EEPROM_HDR_NO_OF_MAC_ADDR][TI_EEPROM_HDR_ETH_ALEN];
45} __attribute__ ((__packed__));
46
47
48#define TI_AM6_EEPROM_RECORD_BOARD_ID 0x01
49#define TI_AM6_EEPROM_RECORD_BOARD_INFO 0x10
50#define TI_AM6_EEPROM_RECORD_DDR_INFO 0x11
51#define TI_AM6_EEPROM_RECORD_DDR_SPD 0x12
52#define TI_AM6_EEPROM_RECORD_MAC_INFO 0x13
53#define TI_AM6_EEPROM_RECORD_END_LIST 0xFE
54
55
56
57
58
59struct ti_am6_eeprom_record_header {
60 u8 id;
61 u16 len;
62} __attribute__ ((__packed__));
63
64
65struct ti_am6_eeprom_record_board_id {
66 u32 magic_number;
67 struct ti_am6_eeprom_record_header header;
68} __attribute__ ((__packed__));
69
70
71#define AM6_EEPROM_HDR_NAME_LEN 16
72#define AM6_EEPROM_HDR_VERSION_LEN 2
73#define AM6_EEPROM_HDR_PROC_NR_LEN 4
74#define AM6_EEPROM_HDR_VARIANT_LEN 2
75#define AM6_EEPROM_HDR_PCB_REV_LEN 2
76#define AM6_EEPROM_HDR_SCH_BOM_REV_LEN 2
77#define AM6_EEPROM_HDR_SW_REV_LEN 2
78#define AM6_EEPROM_HDR_VID_LEN 2
79#define AM6_EEPROM_HDR_BLD_WK_LEN 2
80#define AM6_EEPROM_HDR_BLD_YR_LEN 2
81#define AM6_EEPROM_HDR_4P_NR_LEN 6
82#define AM6_EEPROM_HDR_SERIAL_LEN 4
83
84struct ti_am6_eeprom_record_board_info {
85 char name[AM6_EEPROM_HDR_NAME_LEN];
86 char version[AM6_EEPROM_HDR_VERSION_LEN];
87 char proc_number[AM6_EEPROM_HDR_PROC_NR_LEN];
88 char variant[AM6_EEPROM_HDR_VARIANT_LEN];
89 char pcb_revision[AM6_EEPROM_HDR_PCB_REV_LEN];
90 char schematic_bom_revision[AM6_EEPROM_HDR_SCH_BOM_REV_LEN];
91 char software_revision[AM6_EEPROM_HDR_SW_REV_LEN];
92 char vendor_id[AM6_EEPROM_HDR_VID_LEN];
93 char build_week[AM6_EEPROM_HDR_BLD_WK_LEN];
94 char build_year[AM6_EEPROM_HDR_BLD_YR_LEN];
95 char board_4p_number[AM6_EEPROM_HDR_4P_NR_LEN];
96 char serial[AM6_EEPROM_HDR_SERIAL_LEN];
97} __attribute__ ((__packed__));
98
99
100#define TI_AM6_EEPROM_BD_INFO_DATA ((struct ti_am6_eeprom_record_board_info *) \
101 TI_SRAM_SCRATCH_BOARD_EEPROM_START)
102
103
104#define TI_AM6_EEPROM_DDR_CTRL_INSTANCE_MASK GENMASK(1, 0)
105#define TI_AM6_EEPROM_DDR_CTRL_INSTANCE_SHIFT 0
106#define TI_AM6_EEPROM_DDR_CTRL_SPD_DATA_LOC_MASK GENMASK(3, 2)
107#define TI_AM6_EEPROM_DDR_CTRL_SPD_DATA_LOC_NA (0 << 2)
108#define TI_AM6_EEPROM_DDR_CTRL_SPD_DATA_LOC_BOARDID (2 << 2)
109#define TI_AM6_EEPROM_DDR_CTRL_SPD_DATA_LOC_I2C51 (3 << 2)
110#define TI_AM6_EEPROM_DDR_CTRL_MEM_TYPE_MASK GENMASK(5, 4)
111#define TI_AM6_EEPROM_DDR_CTRL_MEM_TYPE_DDR3 (0 << 4)
112#define TI_AM6_EEPROM_DDR_CTRL_MEM_TYPE_DDR4 (1 << 4)
113#define TI_AM6_EEPROM_DDR_CTRL_MEM_TYPE_LPDDR4 (2 << 4)
114#define TI_AM6_EEPROM_DDR_CTRL_IF_DATA_WIDTH_MASK GENMASK(7, 6)
115#define TI_AM6_EEPROM_DDR_CTRL_IF_DATA_WIDTH_16 (0 << 6)
116#define TI_AM6_EEPROM_DDR_CTRL_IF_DATA_WIDTH_32 (1 << 6)
117#define TI_AM6_EEPROM_DDR_CTRL_IF_DATA_WIDTH_64 (2 << 6)
118#define TI_AM6_EEPROM_DDR_CTRL_DEV_DATA_WIDTH_MASK GENMASK(9, 8)
119#define TI_AM6_EEPROM_DDR_CTRL_DEV_DATA_WIDTH_8 (0 << 8)
120#define TI_AM6_EEPROM_DDR_CTRL_DEV_DATA_WIDTH_16 (1 << 8)
121#define TI_AM6_EEPROM_DDR_CTRL_DEV_DATA_WIDTH_32 (2 << 8)
122#define TI_AM6_EEPROM_DDR_CTRL_RANKS_2 BIT(10)
123#define TI_AM6_EEPROM_DDR_CTRL_DENS_MASK GENMASK(13, 11)
124#define TI_AM6_EEPROM_DDR_CTRL_DENS_1GB (0 << 11)
125#define TI_AM6_EEPROM_DDR_CTRL_DENS_2GB (1 << 11)
126#define TI_AM6_EEPROM_DDR_CTRL_DENS_4GB (2 << 11)
127#define TI_AM6_EEPROM_DDR_CTRL_DENS_8GB (3 << 11)
128#define TI_AM6_EEPROM_DDR_CTRL_DENS_12GB (4 << 11)
129#define TI_AM6_EEPROM_DDR_CTRL_DENS_16GB (5 << 11)
130#define TI_AM6_EEPROM_DDR_CTRL_DENS_24GB (6 << 11)
131#define TI_AM6_EEPROM_DDR_CTRL_DENS_32GB (7 << 11)
132#define TI_AM6_EEPROM_DDR_CTRL_ECC BIT(14)
133
134struct ti_am6_eeprom_record_ddr_info {
135 u16 ddr_control;
136} __attribute__ ((__packed__));
137
138
139#define TI_AM6_EEPROM_DDR_SPD_INSTANCE_MASK GENMASK(1, 0)
140#define TI_AM6_EEPROM_DDR_SPD_INSTANCE_SHIFT 0
141#define TI_AM6_EEPROM_DDR_SPD_MEM_TYPE_MASK GENMASK(4, 3)
142#define TI_AM6_EEPROM_DDR_SPD_MEM_TYPE_DDR3 (0 << 3)
143#define TI_AM6_EEPROM_DDR_SPD_MEM_TYPE_DDR4 (1 << 3)
144#define TI_AM6_EEPROM_DDR_SPD_MEM_TYPE_LPDDR4 (2 << 3)
145#define TI_AM6_EEPROM_DDR_SPD_DATA_LEN 512
146
147struct ti_am6_eeprom_record_ddr_spd {
148 u16 spd_control;
149 u8 data[TI_AM6_EEPROM_DDR_SPD_DATA_LEN];
150} __attribute__ ((__packed__));
151
152
153#define TI_AM6_EEPROM_MAC_INFO_INSTANCE_MASK GENMASK(2, 0)
154#define TI_AM6_EEPROM_MAC_INFO_INSTANCE_SHIFT 0
155#define TI_AM6_EEPROM_MAC_ADDR_COUNT_MASK GENMASK(7, 3)
156#define TI_AM6_EEPROM_MAC_ADDR_COUNT_SHIFT 3
157#define TI_AM6_EEPROM_MAC_ADDR_MAX_COUNT 32
158
159struct ti_am6_eeprom_record_mac_info {
160 u16 mac_control;
161 u8 mac_addr[TI_AM6_EEPROM_MAC_ADDR_MAX_COUNT][TI_EEPROM_HDR_ETH_ALEN];
162} __attribute__ ((__packed__));
163
164struct ti_am6_eeprom_record {
165 struct ti_am6_eeprom_record_header header;
166 union {
167 struct ti_am6_eeprom_record_board_info board_info;
168 struct ti_am6_eeprom_record_ddr_info ddr_info;
169 struct ti_am6_eeprom_record_ddr_spd ddr_spd;
170 struct ti_am6_eeprom_record_mac_info mac_info;
171 } data;
172} __attribute__ ((__packed__));
173
174
175#define DRA7_EEPROM_HEADER_MAGIC 0xAA5533EE
176#define DRA7_EEPROM_HDR_NAME_LEN 16
177#define DRA7_EEPROM_HDR_CONFIG_LEN 4
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195struct dra7_eeprom {
196 u32 header;
197 char name[DRA7_EEPROM_HDR_NAME_LEN];
198 u16 version_major;
199 u16 version_minor;
200 char config[DRA7_EEPROM_HDR_CONFIG_LEN];
201 u32 emif1_size;
202 u32 emif2_size;
203} __attribute__ ((__packed__));
204
205
206
207
208
209
210
211
212
213
214
215
216struct ti_common_eeprom {
217 u32 header;
218 char name[TI_EEPROM_HDR_NAME_LEN + 1];
219 char version[TI_EEPROM_HDR_REV_LEN + 1];
220 char serial[TI_EEPROM_HDR_SERIAL_LEN + 1];
221 char config[TI_EEPROM_HDR_CONFIG_LEN + 1];
222 char mac_addr[TI_EEPROM_HDR_NO_OF_MAC_ADDR][TI_EEPROM_HDR_ETH_ALEN];
223 u64 emif1_size;
224 u64 emif2_size;
225};
226
227#define TI_EEPROM_DATA ((struct ti_common_eeprom *)\
228 TI_SRAM_SCRATCH_BOARD_EEPROM_START)
229
230
231
232
233
234#define AM6_EEPROM_HDR_NO_OF_MAC_ADDR 8
235
236
237
238
239
240
241
242
243
244
245
246
247
248struct ti_am6_eeprom {
249 u32 header;
250 char name[AM6_EEPROM_HDR_NAME_LEN + 1];
251 char version[AM6_EEPROM_HDR_VERSION_LEN + 1];
252 char software_revision[AM6_EEPROM_HDR_SW_REV_LEN + 1];
253 char serial[AM6_EEPROM_HDR_SERIAL_LEN + 1];
254 u8 mac_addr_cnt;
255 char mac_addr[AM6_EEPROM_HDR_NO_OF_MAC_ADDR][TI_EEPROM_HDR_ETH_ALEN];
256};
257
258#define TI_AM6_EEPROM_DATA ((struct ti_am6_eeprom *) \
259 TI_SRAM_SCRATCH_BOARD_EEPROM_START)
260
261
262
263
264
265
266
267
268
269int ti_i2c_eeprom_am_get(int bus_addr, int dev_addr);
270
271
272
273
274
275
276
277
278int __maybe_unused ti_emmc_boardid_get(void);
279
280
281
282
283
284
285int ti_i2c_eeprom_dra7_get(int bus_addr, int dev_addr);
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301int __maybe_unused ti_i2c_eeprom_am6_get(int bus_addr, int dev_addr,
302 struct ti_am6_eeprom *ep,
303 char **mac_addr,
304 u8 mac_addr_max_cnt,
305 u8 *mac_addr_cnt);
306
307
308
309
310
311
312int __maybe_unused ti_i2c_eeprom_am6_get_base(int bus_addr, int dev_addr);
313
314#ifdef CONFIG_TI_I2C_BOARD_DETECT
315
316
317
318
319
320
321
322bool board_ti_is(char *name_tag);
323
324
325
326
327
328
329
330
331bool board_ti_k3_is(char *name_tag);
332
333
334
335
336
337
338
339
340
341
342
343bool board_ti_rev_is(char *rev_tag, int cmp_len);
344
345
346
347
348
349
350
351char *board_ti_get_rev(void);
352
353
354
355
356
357
358
359char *board_ti_get_config(void);
360
361
362
363
364
365
366
367char *board_ti_get_name(void);
368
369
370
371
372
373
374
375
376void board_ti_get_eth_mac_addr(int index, u8 mac_addr[TI_EEPROM_HDR_ETH_ALEN]);
377
378
379
380
381
382
383u64 board_ti_get_emif1_size(void);
384
385
386
387
388
389
390u64 board_ti_get_emif2_size(void);
391
392
393
394
395
396
397
398void set_board_info_env(char *name);
399
400
401
402
403
404
405
406
407void set_board_info_env_am6(char *name);
408
409
410
411
412
413
414
415
416
417
418
419void board_ti_set_ethaddr(int index);
420
421
422
423
424
425
426
427
428
429
430
431void board_ti_am6_set_ethaddr(int index, int count);
432
433
434
435
436
437
438
439
440bool board_ti_was_eeprom_read(void);
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457int ti_i2c_eeprom_am_set(const char *name, const char *rev);
458#else
459static inline bool board_ti_is(char *name_tag) { return false; };
460static inline bool board_ti_k3_is(char *name_tag) { return false; };
461static inline bool board_ti_rev_is(char *rev_tag, int cmp_len)
462{ return false; };
463static inline char *board_ti_get_rev(void) { return NULL; };
464static inline char *board_ti_get_config(void) { return NULL; };
465static inline char *board_ti_get_name(void) { return NULL; };
466static inline bool board_ti_was_eeprom_read(void) { return false; };
467static inline int ti_i2c_eeprom_am_set(const char *name, const char *rev)
468{ return -EINVAL; };
469#endif
470
471#endif
472