9 #include "gtest/gtest.h"
11 #include "sw/device/lib/base/mock_mmio.h"
14 #include "spi_device_regs.h"
16 namespace dif_spi_device_unittest {
18 using ::mock_mmio::LeInt;
19 using ::mock_mmio::MmioTest;
20 using ::mock_mmio::MockDevice;
22 class SpiTest :
public testing::Test,
public MmioTest {
24 static constexpr uint16_t kFifoLen = 0x800;
28 .
dev = {.base_addr = dev().region()},
41 EXPECT_WRITE32(SPI_DEVICE_CFG_REG_OFFSET,
43 {SPI_DEVICE_CFG_TX_ORDER_BIT, 0},
44 {SPI_DEVICE_CFG_RX_ORDER_BIT, 0},
46 EXPECT_READ32(SPI_DEVICE_CONTROL_REG_OFFSET,
48 {SPI_DEVICE_CONTROL_MODE_OFFSET, 3},
50 EXPECT_WRITE32(SPI_DEVICE_CONTROL_REG_OFFSET,
52 {SPI_DEVICE_CONTROL_MODE_OFFSET, 0},
57 TEST_F(ConfigTest, NullArgs) {
71 EXPECT_WRITE32(SPI_DEVICE_CFG_REG_OFFSET,
73 {SPI_DEVICE_CFG_TX_ORDER_BIT, 0},
74 {SPI_DEVICE_CFG_RX_ORDER_BIT, 0},
76 EXPECT_READ32(SPI_DEVICE_CONTROL_REG_OFFSET,
78 {SPI_DEVICE_CONTROL_MODE_OFFSET, 0},
80 EXPECT_WRITE32(SPI_DEVICE_CONTROL_REG_OFFSET,
82 {SPI_DEVICE_CONTROL_MODE_OFFSET,
83 SPI_DEVICE_CONTROL_MODE_VALUE_PASSTHROUGH},
101 nullptr, &toggle_arg, &uint32_arg));
115 nullptr, intercept_config));
122 nullptr, 0, &toggle_arg, &command_arg));
124 &spi_, 0,
nullptr, &command_arg));
126 &spi_, 0, &toggle_arg,
nullptr));
150 nullptr, &uint16_arg, &uint32_arg));
152 &spi_,
nullptr, &uint32_arg));
154 &spi_, &uint16_arg,
nullptr));
161 nullptr, 0, 1, &uint8_arg));
163 &spi_, 0, 1,
nullptr));
171 nullptr, 0, &toggle_arg));
186 TEST_F(FlashTest, CsbGpio) {
188 EXPECT_READ32(SPI_DEVICE_STATUS_REG_OFFSET,
190 {SPI_DEVICE_STATUS_CSB_BIT, 1},
195 EXPECT_READ32(SPI_DEVICE_STATUS_REG_OFFSET,
197 {SPI_DEVICE_STATUS_CSB_BIT, 0},
203 TEST_F(FlashTest, PassthroughToggle) {
204 EXPECT_READ32(SPI_DEVICE_CONTROL_REG_OFFSET,
206 {SPI_DEVICE_CONTROL_MODE_OFFSET,
207 SPI_DEVICE_CONTROL_MODE_VALUE_PASSTHROUGH},
209 EXPECT_WRITE32(SPI_DEVICE_CONTROL_REG_OFFSET,
211 {SPI_DEVICE_CONTROL_MODE_OFFSET,
212 SPI_DEVICE_CONTROL_MODE_VALUE_FLASHMODE},
215 EXPECT_READ32(SPI_DEVICE_CONTROL_REG_OFFSET,
217 {SPI_DEVICE_CONTROL_MODE_OFFSET,
218 SPI_DEVICE_CONTROL_MODE_VALUE_FLASHMODE},
220 EXPECT_WRITE32(SPI_DEVICE_CONTROL_REG_OFFSET,
222 {SPI_DEVICE_CONTROL_MODE_OFFSET,
223 SPI_DEVICE_CONTROL_MODE_VALUE_PASSTHROUGH},
228 TEST_F(FlashTest, MailboxConfigTest) {
230 uint32_t address = 0x3f0000;
231 EXPECT_WRITE32(SPI_DEVICE_MAILBOX_ADDR_REG_OFFSET, address);
232 EXPECT_READ32(SPI_DEVICE_CFG_REG_OFFSET, {
233 {SPI_DEVICE_CFG_TX_ORDER_BIT, 1},
234 {SPI_DEVICE_CFG_RX_ORDER_BIT, 1},
236 EXPECT_WRITE32(SPI_DEVICE_CFG_REG_OFFSET,
238 {SPI_DEVICE_CFG_MAILBOX_EN_BIT, 1},
239 {SPI_DEVICE_CFG_TX_ORDER_BIT, 1},
240 {SPI_DEVICE_CFG_RX_ORDER_BIT, 1},
243 EXPECT_READ32(SPI_DEVICE_CFG_REG_OFFSET,
245 {SPI_DEVICE_CFG_MAILBOX_EN_BIT, 1},
246 {SPI_DEVICE_CFG_TX_ORDER_BIT, 0},
247 {SPI_DEVICE_CFG_RX_ORDER_BIT, 1},
249 EXPECT_WRITE32(SPI_DEVICE_CFG_REG_OFFSET,
251 {SPI_DEVICE_CFG_MAILBOX_EN_BIT, 0},
252 {SPI_DEVICE_CFG_TX_ORDER_BIT, 0},
253 {SPI_DEVICE_CFG_RX_ORDER_BIT, 1},
256 EXPECT_READ32(SPI_DEVICE_CFG_REG_OFFSET,
258 {SPI_DEVICE_CFG_MAILBOX_EN_BIT, 1},
259 {SPI_DEVICE_CFG_TX_ORDER_BIT, 1},
261 EXPECT_READ32(SPI_DEVICE_MAILBOX_ADDR_REG_OFFSET, 0x100000);
265 EXPECT_EQ(address, 0x100000);
266 EXPECT_READ32(SPI_DEVICE_CFG_REG_OFFSET,
268 {SPI_DEVICE_CFG_MAILBOX_EN_BIT, 0},
270 EXPECT_READ32(SPI_DEVICE_MAILBOX_ADDR_REG_OFFSET, 0x100000);
276 TEST_F(FlashTest, Addr4bConfig) {
278 EXPECT_READ32(SPI_DEVICE_ADDR_MODE_REG_OFFSET,
280 {SPI_DEVICE_ADDR_MODE_PENDING_BIT, 1},
285 EXPECT_READ32(SPI_DEVICE_ADDR_MODE_REG_OFFSET,
287 {SPI_DEVICE_ADDR_MODE_PENDING_BIT, 1},
288 {SPI_DEVICE_ADDR_MODE_ADDR_4B_EN_BIT, 1},
293 EXPECT_WRITE32(SPI_DEVICE_ADDR_MODE_REG_OFFSET,
295 {SPI_DEVICE_ADDR_MODE_ADDR_4B_EN_BIT, 1},
298 EXPECT_WRITE32(SPI_DEVICE_ADDR_MODE_REG_OFFSET,
300 {SPI_DEVICE_ADDR_MODE_ADDR_4B_EN_BIT, 0},
305 TEST_F(FlashTest, DeviceId) {
307 EXPECT_READ32(SPI_DEVICE_JEDEC_CC_REG_OFFSET,
309 {SPI_DEVICE_JEDEC_CC_NUM_CC_OFFSET, 10},
310 {SPI_DEVICE_JEDEC_CC_CC_OFFSET, 0x5a},
312 EXPECT_READ32(SPI_DEVICE_JEDEC_ID_REG_OFFSET,
314 {SPI_DEVICE_JEDEC_ID_MF_OFFSET, 0xca},
315 {SPI_DEVICE_JEDEC_ID_ID_OFFSET, 0x1234},
318 EXPECT_EQ(
id.num_continuation_code, 10);
319 EXPECT_EQ(
id.continuation_code, 0x5a);
320 EXPECT_EQ(
id.manufacturer_id, 0xca);
321 EXPECT_EQ(
id.device_id, 0x1234);
325 .manufacturer_id = 0xd7,
326 .continuation_code = 0x7f,
327 .num_continuation_code = 7,
329 EXPECT_WRITE32(SPI_DEVICE_JEDEC_CC_REG_OFFSET,
331 {SPI_DEVICE_JEDEC_CC_NUM_CC_OFFSET, 7},
332 {SPI_DEVICE_JEDEC_CC_CC_OFFSET, 0x7f},
334 EXPECT_WRITE32(SPI_DEVICE_JEDEC_ID_REG_OFFSET,
336 {SPI_DEVICE_JEDEC_ID_MF_OFFSET, 0xd7},
337 {SPI_DEVICE_JEDEC_ID_ID_OFFSET, 0x2202},
342 TEST_F(FlashTest, InterceptConfig) {
349 EXPECT_WRITE32(SPI_DEVICE_INTERCEPT_EN_REG_OFFSET,
351 {SPI_DEVICE_INTERCEPT_EN_STATUS_BIT, 0},
352 {SPI_DEVICE_INTERCEPT_EN_JEDEC_BIT, 1},
353 {SPI_DEVICE_INTERCEPT_EN_SFDP_BIT, 0},
354 {SPI_DEVICE_INTERCEPT_EN_MBX_BIT, 1},
364 EXPECT_WRITE32(SPI_DEVICE_INTERCEPT_EN_REG_OFFSET,
366 {SPI_DEVICE_INTERCEPT_EN_STATUS_BIT, 1},
367 {SPI_DEVICE_INTERCEPT_EN_JEDEC_BIT, 0},
368 {SPI_DEVICE_INTERCEPT_EN_SFDP_BIT, 1},
369 {SPI_DEVICE_INTERCEPT_EN_MBX_BIT, 0},
374 TEST_F(FlashTest, FlashWatermark) {
376 EXPECT_READ32(SPI_DEVICE_LAST_READ_ADDR_REG_OFFSET, 0x1000);
378 EXPECT_EQ(address, 0x1000);
382 EXPECT_WRITE32(SPI_DEVICE_READ_THRESHOLD_REG_OFFSET, 0x26a);
385 EXPECT_WRITE32(SPI_DEVICE_CONTROL_REG_OFFSET,
387 {SPI_DEVICE_CONTROL_MODE_OFFSET,
388 SPI_DEVICE_CONTROL_MODE_VALUE_PASSTHROUGH},
389 {SPI_DEVICE_CONTROL_FLASH_READ_BUFFER_CLR_BIT, 1},
394 TEST_F(FlashTest, CommandInfo) {
397 EXPECT_READ32(SPI_DEVICE_CMD_INFO_0_REG_OFFSET,
399 {SPI_DEVICE_CMD_INFO_0_OPCODE_0_OFFSET, 0x6b},
400 {SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_OFFSET,
401 SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_VALUE_ADDRCFG},
402 {SPI_DEVICE_CMD_INFO_0_DUMMY_EN_0_BIT, 1},
403 {SPI_DEVICE_CMD_INFO_0_DUMMY_SIZE_0_OFFSET, 7},
404 {SPI_DEVICE_CMD_INFO_0_PAYLOAD_EN_0_OFFSET, 0xf},
405 {SPI_DEVICE_CMD_INFO_0_PAYLOAD_DIR_0_BIT, 1},
406 {SPI_DEVICE_CMD_INFO_0_ADDR_SWAP_EN_0_BIT, 0},
407 {SPI_DEVICE_CMD_INFO_0_PAYLOAD_SWAP_EN_0_BIT, 0},
408 {SPI_DEVICE_CMD_INFO_0_UPLOAD_0_BIT, 0},
409 {SPI_DEVICE_CMD_INFO_0_BUSY_0_BIT, 0},
410 {SPI_DEVICE_CMD_INFO_0_VALID_0_BIT, 0},
413 &toggle, &command_info));
416 EXPECT_READ32(SPI_DEVICE_CMD_INFO_1_REG_OFFSET,
418 {SPI_DEVICE_CMD_INFO_1_OPCODE_1_OFFSET, 0x6b},
419 {SPI_DEVICE_CMD_INFO_1_ADDR_MODE_1_OFFSET,
420 SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_VALUE_ADDRCFG},
421 {SPI_DEVICE_CMD_INFO_1_DUMMY_EN_1_BIT, 1},
422 {SPI_DEVICE_CMD_INFO_1_DUMMY_SIZE_1_OFFSET, 7},
423 {SPI_DEVICE_CMD_INFO_1_PAYLOAD_EN_1_OFFSET, 0xf},
424 {SPI_DEVICE_CMD_INFO_1_PAYLOAD_DIR_1_BIT, 1},
425 {SPI_DEVICE_CMD_INFO_1_ADDR_SWAP_EN_1_BIT, 0},
426 {SPI_DEVICE_CMD_INFO_1_PAYLOAD_SWAP_EN_1_BIT, 0},
427 {SPI_DEVICE_CMD_INFO_1_UPLOAD_1_BIT, 0},
428 {SPI_DEVICE_CMD_INFO_1_BUSY_1_BIT, 0},
429 {SPI_DEVICE_CMD_INFO_1_VALID_1_BIT, 1},
432 &toggle, &command_info));
434 EXPECT_EQ(command_info.
opcode, 0x6b);
441 EXPECT_FALSE(command_info.
upload);
444 EXPECT_READ32(SPI_DEVICE_CMD_INFO_1_REG_OFFSET,
446 {SPI_DEVICE_CMD_INFO_1_OPCODE_1_OFFSET, 0x12},
447 {SPI_DEVICE_CMD_INFO_1_ADDR_MODE_1_OFFSET,
448 SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_VALUE_ADDR4B},
449 {SPI_DEVICE_CMD_INFO_1_DUMMY_EN_1_BIT, 0},
450 {SPI_DEVICE_CMD_INFO_1_DUMMY_SIZE_1_OFFSET, 7},
451 {SPI_DEVICE_CMD_INFO_1_PAYLOAD_EN_1_OFFSET, 0x1},
452 {SPI_DEVICE_CMD_INFO_1_PAYLOAD_DIR_1_BIT, 0},
453 {SPI_DEVICE_CMD_INFO_1_ADDR_SWAP_EN_1_BIT, 1},
454 {SPI_DEVICE_CMD_INFO_1_PAYLOAD_SWAP_EN_1_BIT, 1},
455 {SPI_DEVICE_CMD_INFO_1_UPLOAD_1_BIT, 1},
456 {SPI_DEVICE_CMD_INFO_1_BUSY_1_BIT, 1},
457 {SPI_DEVICE_CMD_INFO_1_VALID_1_BIT, 1},
460 &toggle, &command_info));
462 EXPECT_EQ(command_info.
opcode, 0x12);
469 EXPECT_TRUE(command_info.
upload);
477 .passthrough_swap_address =
false,
478 .payload_dir_to_host =
false,
479 .payload_swap_enable =
true,
481 .set_busy_status =
true,
483 EXPECT_WRITE32(SPI_DEVICE_CMD_INFO_1_REG_OFFSET,
485 {SPI_DEVICE_CMD_INFO_1_OPCODE_1_OFFSET, 0x06},
486 {SPI_DEVICE_CMD_INFO_1_ADDR_MODE_1_OFFSET,
487 SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_VALUE_ADDRDISABLED},
488 {SPI_DEVICE_CMD_INFO_1_DUMMY_EN_1_BIT, 0},
489 {SPI_DEVICE_CMD_INFO_1_DUMMY_SIZE_1_OFFSET, 0},
490 {SPI_DEVICE_CMD_INFO_1_PAYLOAD_EN_1_OFFSET, 0x1},
491 {SPI_DEVICE_CMD_INFO_1_PAYLOAD_DIR_1_BIT, 0},
492 {SPI_DEVICE_CMD_INFO_1_ADDR_SWAP_EN_1_BIT, 0},
493 {SPI_DEVICE_CMD_INFO_1_PAYLOAD_SWAP_EN_1_BIT, 1},
494 {SPI_DEVICE_CMD_INFO_1_UPLOAD_1_BIT, 1},
495 {SPI_DEVICE_CMD_INFO_1_BUSY_1_BIT, 1},
496 {SPI_DEVICE_CMD_INFO_1_VALID_1_BIT, 1},
505 .passthrough_swap_address =
false,
506 .payload_dir_to_host =
true,
507 .payload_swap_enable =
false,
509 .set_busy_status =
false,
511 EXPECT_WRITE32(SPI_DEVICE_CMD_INFO_1_REG_OFFSET,
513 {SPI_DEVICE_CMD_INFO_1_OPCODE_1_OFFSET, 0x5a},
514 {SPI_DEVICE_CMD_INFO_1_ADDR_MODE_1_OFFSET,
515 SPI_DEVICE_CMD_INFO_0_ADDR_MODE_0_VALUE_ADDR3B},
516 {SPI_DEVICE_CMD_INFO_1_DUMMY_EN_1_BIT, 1},
517 {SPI_DEVICE_CMD_INFO_1_DUMMY_SIZE_1_OFFSET, 7},
518 {SPI_DEVICE_CMD_INFO_1_PAYLOAD_EN_1_OFFSET, 0x2},
519 {SPI_DEVICE_CMD_INFO_1_PAYLOAD_DIR_1_BIT, 1},
520 {SPI_DEVICE_CMD_INFO_1_ADDR_SWAP_EN_1_BIT, 0},
521 {SPI_DEVICE_CMD_INFO_1_PAYLOAD_SWAP_EN_1_BIT, 0},
522 {SPI_DEVICE_CMD_INFO_1_UPLOAD_1_BIT, 0},
523 {SPI_DEVICE_CMD_INFO_1_BUSY_1_BIT, 0},
524 {SPI_DEVICE_CMD_INFO_1_VALID_1_BIT, 1},
530 TEST_F(FlashTest, HardwareCommandInfo) {
531 EXPECT_WRITE32(SPI_DEVICE_CMD_INFO_EN4B_REG_OFFSET,
533 {SPI_DEVICE_CMD_INFO_EN4B_OPCODE_OFFSET, 0xb7},
534 {SPI_DEVICE_CMD_INFO_EN4B_VALID_BIT, 1},
538 EXPECT_WRITE32(SPI_DEVICE_CMD_INFO_EX4B_REG_OFFSET,
540 {SPI_DEVICE_CMD_INFO_EX4B_OPCODE_OFFSET, 0xe9},
541 {SPI_DEVICE_CMD_INFO_EX4B_VALID_BIT, 0},
545 EXPECT_WRITE32(SPI_DEVICE_CMD_INFO_WREN_REG_OFFSET,
547 {SPI_DEVICE_CMD_INFO_WREN_OPCODE_OFFSET, 0x06},
548 {SPI_DEVICE_CMD_INFO_WREN_VALID_BIT, 1},
552 EXPECT_WRITE32(SPI_DEVICE_CMD_INFO_WRDI_REG_OFFSET,
554 {SPI_DEVICE_CMD_INFO_WRDI_OPCODE_OFFSET, 0x04},
555 {SPI_DEVICE_CMD_INFO_WRDI_VALID_BIT, 0},
561 TEST_F(FlashTest, Swaps) {
562 EXPECT_WRITE32(SPI_DEVICE_ADDR_SWAP_MASK_REG_OFFSET, 0x10203456u);
563 EXPECT_WRITE32(SPI_DEVICE_ADDR_SWAP_DATA_REG_OFFSET, 0xffff0000u);
567 EXPECT_WRITE32(SPI_DEVICE_PAYLOAD_SWAP_MASK_REG_OFFSET, 0x24587001u);
568 EXPECT_WRITE32(SPI_DEVICE_PAYLOAD_SWAP_DATA_REG_OFFSET, 0xa5a5f00fu);
573 TEST_F(FlashTest, FifoOccupancy) {
574 uint8_t cmd_fifo_occupancy, addr_fifo_occupancy;
575 uint16_t payload_fifo_occupancy;
576 uint32_t payload_start_offset;
577 EXPECT_READ32(SPI_DEVICE_UPLOAD_STATUS_REG_OFFSET,
579 {SPI_DEVICE_UPLOAD_STATUS_CMDFIFO_DEPTH_OFFSET, 3},
580 {SPI_DEVICE_UPLOAD_STATUS_CMDFIFO_NOTEMPTY_BIT, 1},
581 {SPI_DEVICE_UPLOAD_STATUS_ADDRFIFO_DEPTH_OFFSET, 2},
582 {SPI_DEVICE_UPLOAD_STATUS_ADDRFIFO_NOTEMPTY_BIT, 1},
585 &spi_, &cmd_fifo_occupancy));
586 EXPECT_EQ(cmd_fifo_occupancy, 3);
588 EXPECT_READ32(SPI_DEVICE_UPLOAD_STATUS_REG_OFFSET,
590 {SPI_DEVICE_UPLOAD_STATUS_CMDFIFO_DEPTH_OFFSET, 0},
591 {SPI_DEVICE_UPLOAD_STATUS_CMDFIFO_NOTEMPTY_BIT, 0},
592 {SPI_DEVICE_UPLOAD_STATUS_ADDRFIFO_DEPTH_OFFSET, 2},
593 {SPI_DEVICE_UPLOAD_STATUS_ADDRFIFO_NOTEMPTY_BIT, 1},
596 &spi_, &addr_fifo_occupancy));
597 EXPECT_EQ(addr_fifo_occupancy, 2);
599 EXPECT_READ32(SPI_DEVICE_UPLOAD_STATUS2_REG_OFFSET,
601 {SPI_DEVICE_UPLOAD_STATUS2_PAYLOAD_DEPTH_OFFSET, 256},
602 {SPI_DEVICE_UPLOAD_STATUS2_PAYLOAD_START_IDX_OFFSET, 3},
605 &spi_, &payload_fifo_occupancy, &payload_start_offset));
606 EXPECT_EQ(payload_fifo_occupancy, 256);
607 EXPECT_EQ(payload_start_offset, 3);
610 TEST_F(FlashTest, FifoPop) {
613 EXPECT_READ32(SPI_DEVICE_UPLOAD_STATUS_REG_OFFSET,
615 {SPI_DEVICE_UPLOAD_STATUS_CMDFIFO_NOTEMPTY_BIT, 0},
616 {SPI_DEVICE_UPLOAD_STATUS_ADDRFIFO_NOTEMPTY_BIT, 1},
621 EXPECT_READ32(SPI_DEVICE_UPLOAD_STATUS_REG_OFFSET,
623 {SPI_DEVICE_UPLOAD_STATUS_CMDFIFO_NOTEMPTY_BIT, 1},
624 {SPI_DEVICE_UPLOAD_STATUS_ADDRFIFO_NOTEMPTY_BIT, 1},
626 EXPECT_READ32(SPI_DEVICE_UPLOAD_CMDFIFO_REG_OFFSET, 0x06);
628 EXPECT_EQ(command, 0x06);
630 EXPECT_READ32(SPI_DEVICE_UPLOAD_STATUS_REG_OFFSET,
632 {SPI_DEVICE_UPLOAD_STATUS_CMDFIFO_NOTEMPTY_BIT, 1},
633 {SPI_DEVICE_UPLOAD_STATUS_ADDRFIFO_NOTEMPTY_BIT, 0},
638 EXPECT_READ32(SPI_DEVICE_UPLOAD_STATUS_REG_OFFSET,
640 {SPI_DEVICE_UPLOAD_STATUS_CMDFIFO_NOTEMPTY_BIT, 1},
641 {SPI_DEVICE_UPLOAD_STATUS_ADDRFIFO_NOTEMPTY_BIT, 1},
643 EXPECT_READ32(SPI_DEVICE_UPLOAD_ADDRFIFO_REG_OFFSET, 0x76543210);
645 EXPECT_EQ(address, 0x76543210);
648 TEST_F(FlashTest, MemoryOps) {
649 constexpr uint32_t kSfdpOffset = 3072;
652 for (uint32_t i = 0; i < (
sizeof(buf) /
sizeof(buf[0])); i++) {
654 EXPECT_WRITE32(SPI_DEVICE_EGRESS_BUFFER_REG_OFFSET + kSfdpOffset +
655 i *
sizeof(uint32_t),
660 sizeof(buf),
reinterpret_cast<uint8_t *
>(buf)));
661 for (uint32_t i = 4; i < (
sizeof(buf) /
sizeof(buf[0])); i++) {
662 EXPECT_READ32(SPI_DEVICE_INGRESS_BUFFER_REG_OFFSET + i *
sizeof(uint32_t),
667 sizeof(buf) - 16,
reinterpret_cast<uint8_t *
>(buf)));
668 for (uint32_t i = 4; i < (
sizeof(buf) /
sizeof(buf[0])); i++) {
669 EXPECT_EQ(buf[i - 4], 0x1000u - i);
673 TEST_F(FlashTest, CommandFilters) {
675 EXPECT_READ32(SPI_DEVICE_CMD_FILTER_0_REG_OFFSET, 0xa5642301u);
677 &spi_, 18, &toggle));
680 EXPECT_READ32(SPI_DEVICE_CMD_FILTER_3_REG_OFFSET, 0xa5642301u);
682 &spi_, (3 * 32 + 19), &toggle));
685 EXPECT_READ32(SPI_DEVICE_CMD_FILTER_0_REG_OFFSET, 0xa5a5a5a5u);
686 EXPECT_WRITE32(SPI_DEVICE_CMD_FILTER_0_REG_OFFSET, 0xa585a5a5u);
690 EXPECT_READ32(SPI_DEVICE_CMD_FILTER_7_REG_OFFSET, 0x5555aaaau);
691 EXPECT_WRITE32(SPI_DEVICE_CMD_FILTER_7_REG_OFFSET, 0x5555aaabu);
695 for (
int i = 0; i < 8; i++) {
696 EXPECT_WRITE32(SPI_DEVICE_CMD_FILTER_0_REG_OFFSET + i *
sizeof(uint32_t),
702 for (
int i = 0; i < 8; i++) {
703 EXPECT_WRITE32(SPI_DEVICE_CMD_FILTER_0_REG_OFFSET + i *
sizeof(uint32_t),
710 TEST_F(FlashTest, StatusRegisters) {
712 EXPECT_READ32(SPI_DEVICE_FLASH_STATUS_REG_OFFSET,
714 {SPI_DEVICE_FLASH_STATUS_BUSY_BIT, 1},
715 {SPI_DEVICE_FLASH_STATUS_STATUS_OFFSET, 0x143200},
717 EXPECT_WRITE32(SPI_DEVICE_FLASH_STATUS_REG_OFFSET,
719 {SPI_DEVICE_FLASH_STATUS_BUSY_BIT, 0},
720 {SPI_DEVICE_FLASH_STATUS_STATUS_OFFSET, 0x143200},
724 EXPECT_WRITE32(SPI_DEVICE_FLASH_STATUS_REG_OFFSET, 0x198234);
728 EXPECT_READ32(SPI_DEVICE_FLASH_STATUS_REG_OFFSET, 0x765432);
730 EXPECT_EQ(
status, 0x765432);
732 EXPECT_WRITE32(SPI_DEVICE_CONTROL_REG_OFFSET,
734 {SPI_DEVICE_CONTROL_MODE_OFFSET,
735 SPI_DEVICE_CONTROL_MODE_VALUE_PASSTHROUGH},
736 {SPI_DEVICE_CONTROL_FLASH_STATUS_FIFO_CLR_BIT, 1},
803 TEST_F(TpmTest, InitDevice) {
805 EXPECT_READ32(SPI_DEVICE_TPM_CAP_REG_OFFSET,
806 {{SPI_DEVICE_TPM_CAP_REV_OFFSET, 3},
807 {SPI_DEVICE_TPM_CAP_LOCALITY_BIT, 1},
808 {SPI_DEVICE_TPM_CAP_MAX_WR_SIZE_OFFSET, 6},
809 {SPI_DEVICE_TPM_CAP_MAX_RD_SIZE_OFFSET, 6}});
818 .disable_return_by_hardware =
false,
819 .disable_address_prefix_check =
true,
820 .disable_locality_check =
true,
822 EXPECT_WRITE32(SPI_DEVICE_TPM_CFG_REG_OFFSET,
824 {SPI_DEVICE_TPM_CFG_EN_BIT, 1},
825 {SPI_DEVICE_TPM_CFG_TPM_MODE_BIT, 0},
826 {SPI_DEVICE_TPM_CFG_HW_REG_DIS_BIT, 0},
827 {SPI_DEVICE_TPM_CFG_TPM_REG_CHK_DIS_BIT, 1},
828 {SPI_DEVICE_TPM_CFG_INVALID_LOCALITY_BIT, 1},
831 EXPECT_WRITE32(SPI_DEVICE_TPM_CFG_REG_OFFSET,
833 {SPI_DEVICE_TPM_CFG_EN_BIT, 0},
839 TEST_F(TpmTest, TpmAccess) {
841 EXPECT_READ32(SPI_DEVICE_TPM_ACCESS_0_REG_OFFSET,
843 {SPI_DEVICE_TPM_ACCESS_0_ACCESS_0_OFFSET, 6},
844 {SPI_DEVICE_TPM_ACCESS_0_ACCESS_1_OFFSET, 9},
845 {SPI_DEVICE_TPM_ACCESS_0_ACCESS_2_OFFSET, 10},
846 {SPI_DEVICE_TPM_ACCESS_0_ACCESS_3_OFFSET, 5},
848 EXPECT_WRITE32(SPI_DEVICE_TPM_ACCESS_0_REG_OFFSET,
850 {SPI_DEVICE_TPM_ACCESS_0_ACCESS_0_OFFSET, 6},
851 {SPI_DEVICE_TPM_ACCESS_0_ACCESS_1_OFFSET, 9},
852 {SPI_DEVICE_TPM_ACCESS_0_ACCESS_2_OFFSET, 78},
853 {SPI_DEVICE_TPM_ACCESS_0_ACCESS_3_OFFSET, 5},
857 EXPECT_READ32(SPI_DEVICE_TPM_ACCESS_1_REG_OFFSET,
858 {{SPI_DEVICE_TPM_ACCESS_1_ACCESS_4_OFFSET, 3}});
859 EXPECT_WRITE32(SPI_DEVICE_TPM_ACCESS_1_REG_OFFSET,
860 {{SPI_DEVICE_TPM_ACCESS_1_ACCESS_4_OFFSET, 92}});
863 EXPECT_READ32(SPI_DEVICE_TPM_ACCESS_0_REG_OFFSET,
865 {SPI_DEVICE_TPM_ACCESS_0_ACCESS_0_OFFSET, 0},
866 {SPI_DEVICE_TPM_ACCESS_0_ACCESS_1_OFFSET, 1},
867 {SPI_DEVICE_TPM_ACCESS_0_ACCESS_2_OFFSET, 2},
868 {SPI_DEVICE_TPM_ACCESS_0_ACCESS_3_OFFSET, 3},
871 EXPECT_EQ(access, 3);
873 EXPECT_READ32(SPI_DEVICE_TPM_ACCESS_1_REG_OFFSET,
874 {{SPI_DEVICE_TPM_ACCESS_1_ACCESS_4_OFFSET, 4}});
876 EXPECT_EQ(access, 4);
879 TEST_F(TpmTest, HardwareRegs32) {
881 EXPECT_WRITE32(SPI_DEVICE_TPM_STS_REG_OFFSET, 0x12345678);
883 EXPECT_READ32(SPI_DEVICE_TPM_STS_REG_OFFSET, 0x76543210);
885 EXPECT_EQ(reg_val, 0x76543210);
887 EXPECT_WRITE32(SPI_DEVICE_TPM_INTF_CAPABILITY_REG_OFFSET, 0x12345678);
889 EXPECT_READ32(SPI_DEVICE_TPM_INTF_CAPABILITY_REG_OFFSET, 0x76543210);
891 EXPECT_EQ(reg_val, 0x76543210);
893 EXPECT_WRITE32(SPI_DEVICE_TPM_INT_ENABLE_REG_OFFSET, 0x12345678);
895 EXPECT_READ32(SPI_DEVICE_TPM_INT_ENABLE_REG_OFFSET, 0x76543210);
897 EXPECT_EQ(reg_val, 0x76543210);
899 EXPECT_WRITE32(SPI_DEVICE_TPM_INT_VECTOR_REG_OFFSET, 0x12345678);
901 EXPECT_READ32(SPI_DEVICE_TPM_INT_VECTOR_REG_OFFSET, 0x76543210);
903 EXPECT_EQ(reg_val, 0x76543210);
905 EXPECT_WRITE32(SPI_DEVICE_TPM_INT_STATUS_REG_OFFSET, 0x12345678);
907 EXPECT_READ32(SPI_DEVICE_TPM_INT_STATUS_REG_OFFSET, 0x76543210);
909 EXPECT_EQ(reg_val, 0x76543210);
912 TEST_F(TpmTest, IdRegs) {
918 EXPECT_WRITE32(SPI_DEVICE_TPM_DID_VID_REG_OFFSET,
920 {SPI_DEVICE_TPM_DID_VID_VID_OFFSET, tpm_id.
vendor_id},
921 {SPI_DEVICE_TPM_DID_VID_DID_OFFSET, tpm_id.
device_id},
923 EXPECT_WRITE32(SPI_DEVICE_TPM_RID_REG_OFFSET,
924 {{SPI_DEVICE_TPM_RID_RID_OFFSET, tpm_id.
revision}});
927 EXPECT_READ32(SPI_DEVICE_TPM_DID_VID_REG_OFFSET,
929 {SPI_DEVICE_TPM_DID_VID_VID_OFFSET, 0x7654},
930 {SPI_DEVICE_TPM_DID_VID_DID_OFFSET, 0x3210},
932 EXPECT_READ32(SPI_DEVICE_TPM_RID_REG_OFFSET,
933 {{SPI_DEVICE_TPM_RID_RID_OFFSET, 0x68}});
940 TEST_F(TpmTest, CommandAndData) {
944 uint8_t data[4] = {17, 34, 51, 68};
945 uint32_t read_data[4];
946 EXPECT_READ32(SPI_DEVICE_TPM_STATUS_REG_OFFSET,
948 {SPI_DEVICE_TPM_STATUS_CMDADDR_NOTEMPTY_BIT, 0},
949 {SPI_DEVICE_TPM_STATUS_WRFIFO_PENDING_BIT, 1},
952 EXPECT_FALSE(
status.cmd_addr_valid);
953 EXPECT_TRUE(
status.wrfifo_acquired);
955 EXPECT_READ32(SPI_DEVICE_TPM_STATUS_REG_OFFSET,
957 {SPI_DEVICE_TPM_STATUS_CMDADDR_NOTEMPTY_BIT, 1},
958 {SPI_DEVICE_TPM_STATUS_WRFIFO_PENDING_BIT, 0},
961 EXPECT_TRUE(
status.cmd_addr_valid);
962 EXPECT_FALSE(
status.wrfifo_acquired);
964 EXPECT_READ32(SPI_DEVICE_TPM_CMD_ADDR_REG_OFFSET,
966 {SPI_DEVICE_TPM_CMD_ADDR_CMD_OFFSET, 0x43},
967 {SPI_DEVICE_TPM_CMD_ADDR_ADDR_OFFSET, 0xd40124},
970 EXPECT_EQ(command, 0x43);
971 EXPECT_EQ(address, 0xd40124);
973 EXPECT_READ32(SPI_DEVICE_TPM_STATUS_REG_OFFSET,
975 {SPI_DEVICE_TPM_STATUS_CMDADDR_NOTEMPTY_BIT, 0},
976 {SPI_DEVICE_TPM_STATUS_WRFIFO_PENDING_BIT, 0},
978 EXPECT_WRITE32(SPI_DEVICE_TPM_READ_FIFO_REG_OFFSET,
979 (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0]);
983 for (uint32_t i = 0; i < 4; i++) {
984 constexpr uint32_t kSpiDeviceTpmWriteFifoOffset =
985 SPI_DEVICE_INGRESS_BUFFER_REG_OFFSET +
986 SPI_DEVICE_PARAM_SRAM_TPM_WR_FIFO_OFFSET *
sizeof(uint32_t);
987 EXPECT_READ32(kSpiDeviceTpmWriteFifoOffset + i *
sizeof(uint32_t), 18 * i);
991 for (
int i = 0; i < 4; i++) {
992 EXPECT_EQ(read_data[i], 18 * i);
994 EXPECT_WRITE32(SPI_DEVICE_TPM_STATUS_REG_OFFSET, 0);