int flash_set_protect(uint32_t mask, uint32_t flags) { int retval = EC_SUCCESS; int rv; /* * Process flags we can set. Track the most recent error, but process * all flags before returning. */ if (mask & EC_FLASH_PROTECT_RO_AT_BOOT) { rv = flash_protect_ro_at_boot( flags & EC_FLASH_PROTECT_RO_AT_BOOT); if (rv) retval = rv; } /* * All subsequent flags only work if write protect is enabled (that is, * hardware WP flag) *and* RO is protected at boot (software WP flag). */ if ((~flash_get_protect()) & (EC_FLASH_PROTECT_GPIO_ASSERTED | EC_FLASH_PROTECT_RO_AT_BOOT)) return retval; if ((mask & EC_FLASH_PROTECT_RO_NOW) && (flags & EC_FLASH_PROTECT_RO_NOW)) { rv = flash_physical_protect_now(0); if (rv) retval = rv; } if ((mask & EC_FLASH_PROTECT_ALL_NOW) && (flags & EC_FLASH_PROTECT_ALL_NOW)) { rv = flash_physical_protect_now(1); if (rv) retval = rv; } return retval; }
int flash_set_protect(uint32_t mask, uint32_t flags) { int retval = EC_SUCCESS; int rv; enum flash_wp_range range = FLASH_WP_NONE; int need_set_protect = 0; /* * Process flags we can set. Track the most recent error, but process * all flags before returning. */ /* * AT_BOOT flags are trickier than NOW flags, as they can be set * when HW write protection is disabled and can be unset without * a reboot. * * If we are only setting/clearing RO_AT_BOOT, things are simple. * Setting ALL_AT_BOOT is processed only if HW write protection is * enabled and RO_AT_BOOT is set, so it's also simple. * * The most tricky one is when we want to clear ALL_AT_BOOT. We need * to determine whether to clear protection for the entire flash or * leave RO protected. There are two cases that we want to keep RO * protected: * 1. RO_AT_BOOT was already set before flash_set_protect() is * called. * 2. RO_AT_BOOT was not set, but it's requested to be set by * the caller of flash_set_protect(). */ if (mask & EC_FLASH_PROTECT_RO_AT_BOOT) { range = (flags & EC_FLASH_PROTECT_RO_AT_BOOT) ? FLASH_WP_RO : FLASH_WP_NONE; need_set_protect = 1; } if ((mask & EC_FLASH_PROTECT_ALL_AT_BOOT) && !(flags & EC_FLASH_PROTECT_ALL_AT_BOOT)) { if (flash_get_protect() & EC_FLASH_PROTECT_RO_AT_BOOT) range = FLASH_WP_RO; need_set_protect = 1; } if (need_set_protect) { rv = flash_protect_at_boot(range); if (rv) retval = rv; } /* * All subsequent flags only work if write protect is enabled (that is, * hardware WP flag) *and* RO is protected at boot (software WP flag). */ if ((~flash_get_protect()) & (EC_FLASH_PROTECT_GPIO_ASSERTED | EC_FLASH_PROTECT_RO_AT_BOOT)) return retval; if ((mask & EC_FLASH_PROTECT_ALL_AT_BOOT) && (flags & EC_FLASH_PROTECT_ALL_AT_BOOT)) { rv = flash_protect_at_boot(FLASH_WP_ALL); if (rv) retval = rv; } if ((mask & EC_FLASH_PROTECT_RO_NOW) && (flags & EC_FLASH_PROTECT_RO_NOW)) { rv = flash_physical_protect_now(0); if (rv) retval = rv; } if ((mask & EC_FLASH_PROTECT_ALL_NOW) && (flags & EC_FLASH_PROTECT_ALL_NOW)) { rv = flash_physical_protect_now(1); if (rv) retval = rv; } return retval; }