* The main reason to copy the FMAP into CBMEM is to make it available to the * OS on every architecture. As side effect use the CBMEM copy as cache. */
| 297 | * OS on every architecture. As side effect use the CBMEM copy as cache. |
| 298 | */ |
| 299 | static void fmap_add_cbmem_cache(void) |
| 300 | { |
| 301 | struct region_device fmrd; |
| 302 | |
| 303 | if (find_fmap_directory(&fmrd)) |
| 304 | return; |
| 305 | |
| 306 | /* Reloads the FMAP even on ACPI S3 resume */ |
| 307 | const size_t s = region_device_sz(&fmrd); |
| 308 | struct fmap *fmap = cbmem_add(CBMEM_ID_FMAP, s); |
| 309 | if (!fmap) { |
| 310 | printk(BIOS_ERR, "Failed to allocate CBMEM\n"); |
| 311 | return; |
| 312 | } |
| 313 | |
| 314 | const ssize_t ret = rdev_readat(&fmrd, fmap, 0, s); |
| 315 | if (ret != s) { |
| 316 | printk(BIOS_ERR, "Failed to read FMAP into CBMEM\n"); |
| 317 | cbmem_entry_remove(cbmem_entry_find(CBMEM_ID_FMAP)); |
| 318 | return; |
| 319 | } |
| 320 | } |
| 321 | |
| 322 | static void fmap_setup_cbmem_cache(int unused) |
| 323 | { |
no test coverage detected