|
@@ -1447,6 +1447,47 @@ int flash_real_protect (flash_info_t * info, long sector, int prot)
|
|
|
0, ATM_CMD_UNLOCK_SECT);
|
|
|
}
|
|
|
}
|
|
|
+ if (info->manufacturer_id == (uchar)AMD_MANUFACT) {
|
|
|
+ int flag = disable_interrupts();
|
|
|
+ int lock_flag;
|
|
|
+
|
|
|
+ flash_unlock_seq(info, 0);
|
|
|
+ flash_write_cmd(info, 0, info->addr_unlock1,
|
|
|
+ AMD_CMD_SET_PPB_ENTRY);
|
|
|
+ lock_flag = flash_isset(info, sector, 0, 0x01);
|
|
|
+ if (prot) {
|
|
|
+ if (lock_flag) {
|
|
|
+ flash_write_cmd(info, sector, 0,
|
|
|
+ AMD_CMD_PPB_LOCK_BC1);
|
|
|
+ flash_write_cmd(info, sector, 0,
|
|
|
+ AMD_CMD_PPB_LOCK_BC2);
|
|
|
+ }
|
|
|
+ debug("sector %ld %slocked\n", sector,
|
|
|
+ lock_flag ? "" : "already ");
|
|
|
+ } else {
|
|
|
+ if (!lock_flag) {
|
|
|
+ debug("unlock %ld\n", sector);
|
|
|
+ flash_write_cmd(info, 0, 0,
|
|
|
+ AMD_CMD_PPB_UNLOCK_BC1);
|
|
|
+ flash_write_cmd(info, 0, 0,
|
|
|
+ AMD_CMD_PPB_UNLOCK_BC2);
|
|
|
+ }
|
|
|
+ debug("sector %ld %sunlocked\n", sector,
|
|
|
+ !lock_flag ? "" : "already ");
|
|
|
+ }
|
|
|
+ if (flag)
|
|
|
+ enable_interrupts();
|
|
|
+
|
|
|
+ if (flash_status_check(info, sector,
|
|
|
+ info->erase_blk_tout,
|
|
|
+ prot ? "protect" : "unprotect"))
|
|
|
+ printf("status check error\n");
|
|
|
+
|
|
|
+ flash_write_cmd(info, 0, 0,
|
|
|
+ AMD_CMD_SET_PPB_EXIT_BC1);
|
|
|
+ flash_write_cmd(info, 0, 0,
|
|
|
+ AMD_CMD_SET_PPB_EXIT_BC2);
|
|
|
+ }
|
|
|
break;
|
|
|
#ifdef CONFIG_FLASH_CFI_LEGACY
|
|
|
case CFI_CMDSET_AMD_LEGACY:
|
|
@@ -1635,6 +1676,17 @@ static int cmdset_amd_init(flash_info_t *info, struct cfi_qry *qry)
|
|
|
cmdset_amd_read_jedec_ids(info);
|
|
|
flash_write_cmd(info, 0, info->cfi_offset, FLASH_CMD_CFI);
|
|
|
|
|
|
+#ifdef CONFIG_SYS_FLASH_PROTECTION
|
|
|
+ if (info->ext_addr && info->manufacturer_id == (uchar)AMD_MANUFACT) {
|
|
|
+ ushort spus;
|
|
|
+
|
|
|
+ /* read sector protect/unprotect scheme */
|
|
|
+ spus = flash_read_uchar(info, info->ext_addr + 9);
|
|
|
+ if (spus == 0x8)
|
|
|
+ info->legacy_unlock = 1;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|