4 #ifndef OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_SPI_DEVICE_H_ 
    5 #define OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_SPI_DEVICE_H_ 
   11 #include "sw/device/silicon_creator/lib/error.h" 
   22 #define SPI_DEVICE_DEV_ID_CHIP_REV_FIELD \ 
   23   ((bitfield_field32_t){.mask = 0x7, .index = 0}) 
   24 #define SPI_DEVICE_DEV_ID_ROM_BOOTSTRAP_BIT 3 
   25 #define SPI_DEVICE_DEV_ID_CHIP_GEN_FIELD \ 
   26   ((bitfield_field32_t){.mask = 0xf, .index = 4}) 
   27 #define SPI_DEVICE_DEV_ID_DENSITY_FIELD \ 
   28   ((bitfield_field32_t){.mask = 0xff, .index = 8}) 
   34   kSpiDeviceJedecContCode = 0x7f,
 
   35   kSpiDeviceJedecContCodeCount = 12,
 
   36   kSpiDeviceJedecManufId = 0xef,
 
   42   kSpiDeviceJedecDensity = 20,
 
   46   kSpiDeviceBfptNumWords = 23,
 
   50   kSpiDeviceSfdpTableNumWords = 27,
 
   57   kSpiDeviceNoAddress = UINT32_MAX,
 
   67   kSpiDeviceSfdpAreaNumBytes = 256,
 
   71   kSpiDeviceSfdpAreaOffset = 0xc00,
 
   75   kSpiDevicePayloadAreaOffset = 0x0,
 
   79   kSpiDevicePayloadAreaNumBytes = 256,
 
   83   kSpiDevicePayloadAreaNumWords =
 
   84       kSpiDevicePayloadAreaNumBytes / 
sizeof(uint32_t),
 
  102 typedef enum spi_device_opcode {
 
  109   kSpiDeviceOpcodeReadStatus = 0x05,
 
  118   kSpiDeviceOpcodeReadJedecId = 0x9f,
 
  126   kSpiDeviceOpcodeReadSfdp = 0x5a,
 
  133   kSpiDeviceOpcodeChipErase = 0xc7,
 
  141   kSpiDeviceOpcodeSectorErase = 0x20,
 
  150   kSpiDeviceOpcodePageProgram = 0x02,
 
  158   kSpiDeviceOpcodeReset = 0x99,
 
  165   kSpiDeviceOpcodeWriteEnable = 0x06,
 
  172   kSpiDeviceOpcodeWriteDisable = 0x04,
 
  174 } spi_device_opcode_t;
 
  256   uint32_t data[kSpiDeviceBfptNumWords];
 
  260                   kSpiDeviceBfptNumWords * 
sizeof(uint32_t),
 
  261               "`kSpiDeviceBfptNumWords` is incorrect");
 
  285               "SFDP table must fit in the space provided by spi_device");
 
  287                   kSpiDeviceSfdpTableNumWords * 
sizeof(uint32_t),
 
  288               "`kSpiDeviceSfdpTableNumWords` is incorrect");
 
  305 void spi_device_init(
void);
 
  333   alignas(uint32_t) uint8_t 
payload[kSpiDevicePayloadAreaNumBytes];
 
  354 void spi_device_flash_status_clear(
void);
 
  360 uint32_t spi_device_flash_status_get(
void);