Fix up one forgotten revert in r3140.
[coreboot.git] / util / flashrom / msys_doc.c
1 /*
2  * This file is part of the flashrom project.
3  *
4  * Copyright (C) 2003 Niki W. Waibel <niki.waibel@gmx.net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
19  */
20
21 #include <stdio.h>
22 #include <unistd.h>
23 #include "flash.h"
24 #include "msys_doc.h"
25
26 static int doc_wait(volatile uint8_t *bios, int timeout);
27 static uint8_t doc_read_chipid(volatile uint8_t *bios);
28 static uint8_t doc_read_docstatus(volatile uint8_t *bios);
29 static uint8_t doc_read_cdsncontrol(volatile uint8_t *bios);
30 static void doc_write_cdsncontrol(volatile uint8_t *bios, uint8_t data);
31
32 int probe_md2802(struct flashchip *flash)
33 {
34         volatile uint8_t *bios = flash->virtual_memory;
35         uint8_t chipid;
36 #ifndef MSYSTEMS_DOC_NO_55AA_CHECKING
37         uint8_t id_0x55, id_0xAA;
38 #endif                          /* !MSYSTEMS_DOC_NO_55AA_CHECKING */
39         int i, toggle_a, toggle_b;
40
41         printf_debug("%s:\n", __FUNCTION__);
42         printf_debug("%s: *******************************\n", __FUNCTION__);
43         printf_debug("%s: * THIS IS A PRE ALPHA VERSION *\n", __FUNCTION__);
44         printf_debug("%s: * IN THE DEVELOPEMENT *********\n", __FUNCTION__);
45         printf_debug("%s: * PROCESS RIGHT NOW. **********\n", __FUNCTION__);
46         printf_debug("%s: *******************************\n", __FUNCTION__);
47         printf_debug("%s: * IF YOU ARE NOT A DEVELOPER **\n", __FUNCTION__);
48         printf_debug("%s: * THEN DO NOT TRY TO READ OR **\n", __FUNCTION__);
49         printf_debug("%s: * WRITE TO THIS DEVICE ********\n", __FUNCTION__);
50         printf_debug("%s: *******************************\n", __FUNCTION__);
51         printf_debug("%s:\n", __FUNCTION__);
52
53         printf_debug("%s: switching off reset mode ...\n", __FUNCTION__);
54         doc_write(0x85, bios, DOCControl);
55         doc_write(0x85, bios, DOCControl);
56         doc_read_4nop(bios);
57         if (doc_wait(bios, 5000))
58                 return (-1);
59         printf("%s: switching off reset mode ... done\n", __FUNCTION__);
60         printf("%s:\n", __FUNCTION__);
61
62         printf("%s: switching off write protection ...\n", __FUNCTION__);
63         doc_write_cdsncontrol(bios, doc_read_cdsncontrol(bios) & (~0x08));
64         printf("%s: switching off write protection ... done\n", __FUNCTION__);
65         printf("%s:\n", __FUNCTION__);
66
67         chipid = doc_read_chipid(bios);
68 #ifndef MSYSTEMS_DOC_NO_55AA_CHECKING
69         id_0x55 = doc_read(bios, IPL_0x0000);
70         id_0xAA = doc_read(bios, IPL_0x0001);
71 #endif                          /* !MSYSTEMS_DOC_NO_55AA_CHECKING */
72         printf("%s: IPL_0x0000: 0x%02x\n", __FUNCTION__, id_0x55);
73         printf("%s: IPL_0x0001: 0x%02x\n", __FUNCTION__, id_0xAA);
74         printf("%s: IPL_0x0002: 0x%02x\n", __FUNCTION__,
75                doc_read(bios, IPL_0x0002));
76         printf("%s: IPL_0x0003: 0x%02x\n", __FUNCTION__,
77                doc_read(bios, IPL_0x0003));
78         printf("%s:\n", __FUNCTION__);
79         printf("%s: ChipID: 0x%02x\n", __FUNCTION__, chipid);
80         printf("%s: DOCStatus: 0x%02x\n", __FUNCTION__,
81                doc_read_docstatus(bios));
82         printf("%s: FloorSelect: 0x%02x\n", __FUNCTION__,
83                doc_read(bios, FloorSelect));
84         printf("%s: CDSNControl: 0x%02x\n", __FUNCTION__,
85                doc_read_cdsncontrol(bios));
86         printf("%s: CDSNDeviceSelect: 0x%02x\n", __FUNCTION__,
87                doc_read(bios, CDSNDeviceSelect));
88         printf("%s: ECCConfiguration: 0x%02x\n", __FUNCTION__,
89                doc_read(bios, ECCConfiguration));
90         printf("%s: CDSNSlowIO: 0x%02x\n", __FUNCTION__,
91                doc_read(bios, CDSNSlowIO));
92         printf("%s: ECCSyndrome0: 0x%02x\n", __FUNCTION__,
93                doc_read(bios, ECCSyndrome0));
94         printf("%s: ECCSyndrome1: 0x%02x\n", __FUNCTION__,
95                doc_read(bios, ECCSyndrome1));
96         printf("%s: ECCSyndrome2: 0x%02x\n", __FUNCTION__,
97                doc_read(bios, ECCSyndrome2));
98         printf("%s: ECCSyndrome3: 0x%02x\n", __FUNCTION__,
99                doc_read(bios, ECCSyndrome3));
100         printf("%s: ECCSyndrome4: 0x%02x\n", __FUNCTION__,
101                doc_read(bios, ECCSyndrome4));
102         printf("%s: ECCSyndrome5: 0x%02x\n", __FUNCTION__,
103                doc_read(bios, ECCSyndrome5));
104         printf("%s: AliasResolution: 0x%02x\n", __FUNCTION__,
105                doc_read(bios, AliasResolution));
106         printf("%s: ConfigurationInput: 0x%02x\n", __FUNCTION__,
107                doc_read(bios, ConfigurationInput));
108         printf("%s: ReadPipelineInitialization: 0x%02x\n", __FUNCTION__,
109                doc_read(bios, ReadPipelineInitialization));
110         printf("%s: LastDataRead: 0x%02x\n", __FUNCTION__,
111                doc_read(bios, LastDataRead));
112         printf("%s:\n", __FUNCTION__);
113
114         printf("%s: checking ECCConfiguration toggle bit\n", __FUNCTION__);
115         printf("%s:", __FUNCTION__);
116         toggle_a = toggle_b = 0;
117         for (i = 0; i < 10; i++) {
118                 uint8_t toggle = doc_toggle(bios);
119
120                 printf(" 0x%02x", toggle);
121
122                 if (i % 2)
123                         toggle_a += toggle;
124                 else
125                         toggle_b += toggle;
126         }                       /* for(i=0; i<10; i++) */
127         printf("\n%s: toggle result: %d/%d\n", __FUNCTION__, toggle_a,
128                toggle_b);
129
130         if (chipid == flash->model_id && ((toggle_a == 5 && toggle_b == 0)
131                                           || (toggle_a == 0 && toggle_b == 5))
132 #ifndef MSYSTEMS_DOC_NO_55AA_CHECKING
133             && id_0x55 == 0x55 && id_0xAA == 0xaa
134 #endif                          /* !MSYSTEMS_DOC_NO_55AA_CHECKING */
135             ) {
136                 return 1;
137         }
138
139         return 0;
140 }
141
142 int read_md2802(struct flashchip *flash, uint8_t *buf)
143 {
144         return 0;
145 }
146
147 int erase_md2802(struct flashchip *flash)
148 {
149         volatile uint8_t *bios = flash->virtual_memory;
150
151         return 1;
152
153         *(volatile uint8_t *)(bios + 0x5555) = 0xAA;
154         *(volatile uint8_t *)(bios + 0x2AAA) = 0x55;
155         *(volatile uint8_t *)(bios + 0x5555) = 0x80;
156
157         *(volatile uint8_t *)(bios + 0x5555) = 0xAA;
158         *(volatile uint8_t *)(bios + 0x2AAA) = 0x55;
159         *(volatile uint8_t *)(bios + 0x5555) = 0x10;
160 }
161
162 int write_md2802(struct flashchip *flash, uint8_t *buf)
163 {
164         int i;
165         int total_size = flash->total_size * 1024;
166         int page_size = flash->page_size;
167         volatile uint8_t *bios = flash->virtual_memory;
168
169         return (1);
170         erase_md2802(flash);
171         if (*bios != (uint8_t) 0xff) {
172                 printf("ERASE FAILED!\n");
173                 return -1;
174         }
175         printf("Programming page: ");
176         for (i = 0; i < total_size / page_size; i++) {
177                 printf("%04d at address: 0x%08x", i, i * page_size);
178                 //write_page_md2802(bios, buf + i * page_size, bios + i * page_size, page_size);
179                 printf
180                     ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
181         }
182         printf("\n");
183         //protect_md2802(bios);
184
185         return 0;
186 }                               /* int write_md2802(struct flashchip *flash, uint8_t *buf) */
187
188 /*
189         wait timeout msec for doc to become ready
190         return:
191                 0: ready
192                 -1: timeout expired
193 */
194
195 static int doc_wait(volatile uint8_t *bios, int timeout)
196 {
197         int i = 20;
198
199         doc_read_4nop(bios);
200
201         while (_doc_busy(bios) && (i != 0)) {
202                 usleep(timeout * 1000 / 20);
203                 i--;
204         }
205
206         doc_read_2nop(bios);
207
208         if (_doc_busy(bios)) {
209                 doc_read_2nop(bios);
210                 return (-1);
211         }
212
213         return 0;
214 }
215
216 static uint8_t doc_read_docstatus(volatile uint8_t *bios)
217 {
218         doc_read(bios, CDSNSlowIO);
219         doc_read_2nop(bios);
220
221         return (doc_read(bios, _DOCStatus));
222 }
223
224 static uint8_t doc_read_chipid(volatile uint8_t *bios)
225 {
226         doc_read(bios, CDSNSlowIO);
227         doc_read_2nop(bios);
228
229         return (doc_read(bios, _ChipID));
230 }
231
232 static uint8_t doc_read_cdsncontrol(volatile uint8_t *bios)
233 {
234         uint8_t value;
235
236         /* the delays might be necessary when reading the busy bit,
237            but because a read to this reg reads the busy bit
238            anyway we better do this delays... */
239         doc_read_4nop(bios);
240         value = doc_read(bios, _CDSNControl);
241         doc_read_2nop(bios);
242
243         return value;
244 }
245
246 static void doc_write_cdsncontrol(volatile uint8_t *bios, uint8_t data)
247 {
248         doc_write(data, bios, _CDSNControl);
249         doc_read_4nop(bios);
250 }