In Minnowboard UEFI we have got EFI_SPI_PROTOCOL, Inside IntelE6xxRuPkg/SpiDeviceDxe folder we have SpiDeviceDxe.c file. It has a function called InitSpiDevice which has the following line of code which claims to remove write protection in SPI flash chip. Status = mSpiProtocol->Execute ( mSpiProtocol, SPI_DEVICE_READ_STATUS_CMD_INDEX, SPI_FLASH_PART_OPCODE_WRITE_STATUS, SPI_DEVICE_PREFIX_OP_WRITE_S_EN_INDEX, TRUE, TRUE, TRUE, 0, sizeof (Data), &Data, EnumSpiRegionAll ); By default WinBond SPI Flash is Not write protected on powerup (i.e BP0 BP1 BP2 are zero). I tried writing some value (0x55) into the Status Register using the above API, when i read back I should get 54(depending on the BITs which are write only). But I get "02". It is not actually writing the required opcode to the SPI.
We should pass the index of the opcode to be used to that API, here they have passed the opcode itself. The code should be as follows: Pass SPI_DEVICE_WRITE_STATUS_CMD_INDEX as 3rd argument instead of SPI_FLASH_PART_OPCODE_WRITE_STATUS Status = mSpiProtocol->Execute ( mSpiProtocol, SPI_DEVICE_READ_STATUS_CMD_INDEX, SPI_DEVICE_WRITE_STATUS_CMD_INDEX, SPI_DEVICE_PREFIX_OP_WRITE_S_EN_INDEX, TRUE, TRUE, TRUE, 0, sizeof (Data), &Data, EnumSpiRegionAll );