97b18a3bc940de215d0a2b47db5f2d16f10fbab3
[litex.git] / software / libbase / board.c
1 #include <hw/identifier.h>
2 #include <hw/gpio.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <version.h>
7 #include <timer.h>
8 #include <board.h>
9
10 static const struct board_desc boards[1] = {
11 {
12 .id = 0x4D31, /* M1 */
13 .name = "Milkymist One",
14 .ethernet_phyadr = 1
15 },
16 };
17
18 static const struct board_desc *get_board_desc_id(unsigned short int id)
19 {
20 unsigned int i;
21
22 for(i=0;i<sizeof(boards)/sizeof(boards[0]);i++)
23 if(boards[i].id == id)
24 return &boards[i];
25 return NULL;
26 }
27
28 static const struct board_desc *get_board_desc(void)
29 {
30 return get_board_desc_id((CSR_IDENTIFIER_SYSTEMH << 8) | CSR_IDENTIFIER_SYSTEML);
31 }
32
33 int get_pcb_revision(void)
34 {
35 /* TODO
36 int r;
37 unsigned int io;
38
39 r = 0;
40 io = CSR_GPIO_IN;
41 if(io & GPIO_PCBREV0)
42 r |= 0x1;
43 if(io & GPIO_PCBREV1)
44 r |= 0x2;
45 if(io & GPIO_PCBREV2)
46 r |= 0x4;
47 if(io & GPIO_PCBREV3)
48 r |= 0x8;
49 return r;*/
50 return 0;
51 }
52
53 void get_soc_version(unsigned int *major, unsigned int *minor, unsigned int *subminor, unsigned int *rc)
54 {
55 unsigned int id;
56
57 id = CSR_IDENTIFIER_VERSIONH;
58 *major = (id & 0xf0) >> 4;
59 *minor = id & 0x0f;
60 id = CSR_IDENTIFIER_VERSIONL;
61 *subminor = (id & 0xf0) >> 4;
62 *rc = id & 0x0f;
63 }
64
65 void get_soc_version_formatted(char *version)
66 {
67 unsigned int major, minor, subminor, rc;
68
69 get_soc_version(&major, &minor, &subminor, &rc);
70
71 version += sprintf(version, "%u.%u", major, minor);
72 if(subminor != 0)
73 version += sprintf(version, ".%u", subminor);
74 if(rc != 0)
75 sprintf(version, "RC%u", rc);
76 }
77
78 const struct board_desc *brd_desc;
79
80 void board_init(void)
81 {
82 int rev;
83 char soc_version[13];
84
85 brd_desc = get_board_desc();
86
87 if(brd_desc == NULL) {
88 printf("Running on unknown board, startup aborted.\n");
89 while(1);
90 }
91 rev = get_pcb_revision();
92 get_soc_version_formatted(soc_version);
93 printf("Detected SoC %s at %dMHz on %s (PCB revision %d)\n", soc_version, get_system_frequency()/1000000,
94 brd_desc->name, rev);
95 if(strcmp(soc_version, VERSION) != 0)
96 printf("SoC and BIOS versions do not match!\n");
97 if(rev > 2)
98 printf("Unsupported PCB revision, please upgrade!\n");
99 }