Change all flashrom license headers to use our standard format.
[coreboot.git] / util / flashrom / am29f040b.c
1 /*
2  * This file is part of the flashrom project.
3  *
4  * Copyright 2000 Silicon Integrated System Corporation
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 <stdint.h>
23 #include "flash.h"
24
25 static __inline__ int erase_sector_29f040b(volatile uint8_t *bios,
26                                            unsigned long address)
27 {
28         *(bios + 0x555) = 0xAA;
29         *(bios + 0x2AA) = 0x55;
30         *(bios + 0x555) = 0x80;
31         *(bios + 0x555) = 0xAA;
32         *(bios + 0x2AA) = 0x55;
33         *(bios + address) = 0x30;
34
35         sleep(2);
36
37         /* wait for Toggle bit ready         */
38         toggle_ready_jedec(bios + address);
39
40         return 0;
41 }
42
43 static __inline__ int write_sector_29f040b(volatile uint8_t *bios,
44                                            uint8_t *src,
45                                            volatile uint8_t *dst,
46                                            unsigned int page_size)
47 {
48         int i;
49
50         for (i = 0; i < page_size; i++) {
51                 if ((i & 0xfff) == 0xfff)
52                         printf("0x%08lx", (unsigned long)dst -
53                                (unsigned long)bios);
54
55                 *(bios + 0x555) = 0xAA;
56                 *(bios + 0x2AA) = 0x55;
57                 *(bios + 0x555) = 0xA0;
58                 *dst++ = *src++;
59
60                 /* wait for Toggle bit ready */
61                 toggle_ready_jedec(bios);
62
63                 if ((i & 0xfff) == 0xfff)
64                         printf("\b\b\b\b\b\b\b\b\b\b");
65         }
66
67         return 0;
68 }
69
70 int probe_29f040b(struct flashchip *flash)
71 {
72         volatile uint8_t *bios = flash->virtual_memory;
73         uint8_t id1, id2;
74
75         *(bios + 0x555) = 0xAA;
76         *(bios + 0x2AA) = 0x55;
77         *(bios + 0x555) = 0x90;
78
79         id1 = *bios;
80         id2 = *(bios + 0x01);
81
82         *bios = 0xF0;
83
84         myusec_delay(10);
85
86         printf_debug("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, id1, id2);
87         if (id1 == flash->manufacture_id && id2 == flash->model_id)
88                 return 1;
89
90         return 0;
91 }
92
93 int erase_29f040b(struct flashchip *flash)
94 {
95         volatile uint8_t *bios = flash->virtual_memory;
96
97         *(bios + 0x555) = 0xAA;
98         *(bios + 0x2AA) = 0x55;
99         *(bios + 0x555) = 0x80;
100         *(bios + 0x555) = 0xAA;
101         *(bios + 0x2AA) = 0x55;
102         *(bios + 0x555) = 0x10;
103
104         myusec_delay(10);
105         toggle_ready_jedec(bios);
106
107         return 0;
108 }
109
110 int write_29f040b(struct flashchip *flash, uint8_t *buf)
111 {
112         int i;
113         int total_size = flash->total_size * 1024;
114         int page_size = flash->page_size;
115         volatile uint8_t *bios = flash->virtual_memory;
116
117         printf("Programming page ");
118         for (i = 0; i < total_size / page_size; i++) {
119                 /* erase the page before programming */
120                 erase_sector_29f040b(bios, i * page_size);
121
122                 /* write to the sector */
123                 printf("%04d at address: ", i);
124                 write_sector_29f040b(bios, buf + i * page_size,
125                                      bios + i * page_size, page_size);
126                 printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
127         }
128         printf("\n");
129
130         return 0;
131 }