OLD | NEW |
1 /* | 1 /* |
2 * This file is part of the flashrom project. | 2 * This file is part of the flashrom project. |
3 * | 3 * |
4 * Copyright (C) 2009,2010 Carl-Daniel Hailfinger | 4 * Copyright (C) 2009,2010 Carl-Daniel Hailfinger |
5 * | 5 * |
6 * This program is free software; you can redistribute it and/or modify | 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 | 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 | 8 * the Free Software Foundation; either version 2 of the License, or |
9 * (at your option) any later version. | 9 * (at your option) any later version. |
10 * | 10 * |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 | 191 |
192 uint16_t mmio_le_readw(void *addr) | 192 uint16_t mmio_le_readw(void *addr) |
193 { | 193 { |
194 return le_to_cpu16(mmio_readw(addr)); | 194 return le_to_cpu16(mmio_readw(addr)); |
195 } | 195 } |
196 | 196 |
197 uint32_t mmio_le_readl(void *addr) | 197 uint32_t mmio_le_readl(void *addr) |
198 { | 198 { |
199 return le_to_cpu32(mmio_readl(addr)); | 199 return le_to_cpu32(mmio_readl(addr)); |
200 } | 200 } |
| 201 |
| 202 enum mmio_write_type { |
| 203 mmio_write_type_b, |
| 204 mmio_write_type_w, |
| 205 mmio_write_type_l, |
| 206 }; |
| 207 |
| 208 struct undo_mmio_write_data { |
| 209 void *addr; |
| 210 int reg; |
| 211 enum mmio_write_type type; |
| 212 union { |
| 213 uint8_t bdata; |
| 214 uint16_t wdata; |
| 215 uint32_t ldata; |
| 216 }; |
| 217 }; |
| 218 |
| 219 void undo_mmio_write(void *p) |
| 220 { |
| 221 struct undo_mmio_write_data *data = p; |
| 222 msg_pdbg("Restoring MMIO space at %p\n", data->addr); |
| 223 switch (data->type) { |
| 224 case mmio_write_type_b: |
| 225 mmio_writeb(data->bdata, data->addr); |
| 226 break; |
| 227 case mmio_write_type_w: |
| 228 mmio_writew(data->wdata, data->addr); |
| 229 break; |
| 230 case mmio_write_type_l: |
| 231 mmio_writel(data->ldata, data->addr); |
| 232 break; |
| 233 } |
| 234 /* p was allocated in register_undo_mmio_write. */ |
| 235 free(p); |
| 236 } |
| 237 |
| 238 #define register_undo_mmio_write(a, c) \ |
| 239 { \ |
| 240 struct undo_mmio_write_data *undo_mmio_write_data; \ |
| 241 undo_mmio_write_data = malloc(sizeof(struct undo_mmio_write_data)); \ |
| 242 undo_mmio_write_data->addr = a; \ |
| 243 undo_mmio_write_data->type = mmio_write_type_##c; \ |
| 244 undo_mmio_write_data->c##data = mmio_read##c(a); \ |
| 245 register_shutdown(undo_mmio_write, undo_mmio_write_data); \ |
| 246 } |
| 247 |
| 248 #define register_undo_mmio_writeb(a) register_undo_mmio_write(a, b) |
| 249 #define register_undo_mmio_writew(a) register_undo_mmio_write(a, w) |
| 250 #define register_undo_mmio_writel(a) register_undo_mmio_write(a, l) |
| 251 |
| 252 void rmmio_writeb(uint8_t val, void *addr) |
| 253 { |
| 254 register_undo_mmio_writeb(addr); |
| 255 mmio_writeb(val, addr); |
| 256 } |
| 257 |
| 258 void rmmio_writew(uint16_t val, void *addr) |
| 259 { |
| 260 register_undo_mmio_writew(addr); |
| 261 mmio_writew(val, addr); |
| 262 } |
| 263 |
| 264 void rmmio_writel(uint32_t val, void *addr) |
| 265 { |
| 266 register_undo_mmio_writel(addr); |
| 267 mmio_writel(val, addr); |
| 268 } |
OLD | NEW |