1*b525a8f0SKuldeep Singh /* 2*b525a8f0SKuldeep Singh * Copyright 2021 NXP 3*b525a8f0SKuldeep Singh * 4*b525a8f0SKuldeep Singh * SPDX-License-Identifier: BSD-3-Clause 5*b525a8f0SKuldeep Singh * 6*b525a8f0SKuldeep Singh */ 7*b525a8f0SKuldeep Singh 8*b525a8f0SKuldeep Singh #include <stdint.h> 9*b525a8f0SKuldeep Singh #include <stdio.h> 10*b525a8f0SKuldeep Singh 11*b525a8f0SKuldeep Singh #include <common/debug.h> 12*b525a8f0SKuldeep Singh #include <flash_info.h> 13*b525a8f0SKuldeep Singh #include "fspi.h" 14*b525a8f0SKuldeep Singh #include <fspi_api.h> 15*b525a8f0SKuldeep Singh 16*b525a8f0SKuldeep Singh /* 17*b525a8f0SKuldeep Singh * The macros are defined to be used as test vector for testing fspi. 18*b525a8f0SKuldeep Singh */ 19*b525a8f0SKuldeep Singh #define SIZE_BUFFER 0x250 20*b525a8f0SKuldeep Singh 21*b525a8f0SKuldeep Singh /* 22*b525a8f0SKuldeep Singh * You may choose fspi_swap based on core endianness and flexspi IP/AHB 23*b525a8f0SKuldeep Singh * buffer endianness set in MCR. 24*b525a8f0SKuldeep Singh */ 25*b525a8f0SKuldeep Singh #define fspi_swap32(A) (A) 26*b525a8f0SKuldeep Singh 27*b525a8f0SKuldeep Singh void fspi_test(uint32_t fspi_test_addr, uint32_t size, int extra) 28*b525a8f0SKuldeep Singh { 29*b525a8f0SKuldeep Singh uint32_t buffer[SIZE_BUFFER]; 30*b525a8f0SKuldeep Singh uint32_t count = 1; 31*b525a8f0SKuldeep Singh uint32_t failed, i; 32*b525a8f0SKuldeep Singh 33*b525a8f0SKuldeep Singh NOTICE("-------------------------- %d----------------------------------\n", count++); 34*b525a8f0SKuldeep Singh INFO("Sector Erase size: 0x%08x, size: %d\n", F_SECTOR_ERASE_SZ, size); 35*b525a8f0SKuldeep Singh /* Test Sector Erase */ 36*b525a8f0SKuldeep Singh xspi_sector_erase(fspi_test_addr - fspi_test_addr % F_SECTOR_ERASE_SZ, 37*b525a8f0SKuldeep Singh F_SECTOR_ERASE_SZ); 38*b525a8f0SKuldeep Singh 39*b525a8f0SKuldeep Singh /* Test Erased data using IP read */ 40*b525a8f0SKuldeep Singh xspi_ip_read((fspi_test_addr), buffer, size * 4); 41*b525a8f0SKuldeep Singh 42*b525a8f0SKuldeep Singh failed = 0; 43*b525a8f0SKuldeep Singh for (i = 0; i < size; i++) 44*b525a8f0SKuldeep Singh if (fspi_swap32(0xffffffff) != buffer[i]) { 45*b525a8f0SKuldeep Singh failed = 1; 46*b525a8f0SKuldeep Singh break; 47*b525a8f0SKuldeep Singh } 48*b525a8f0SKuldeep Singh 49*b525a8f0SKuldeep Singh if (failed == 0) { 50*b525a8f0SKuldeep Singh NOTICE("[%d]: Success Erase: data in buffer[%d] 0x%08x\n", __LINE__, i-3, buffer[i-3]); 51*b525a8f0SKuldeep Singh } else { 52*b525a8f0SKuldeep Singh ERROR("Erase: Failed -->xxx with buffer[%d]=0x%08x\n", i, buffer[i]); 53*b525a8f0SKuldeep Singh } 54*b525a8f0SKuldeep Singh 55*b525a8f0SKuldeep Singh for (i = 0; i < SIZE_BUFFER; i++) 56*b525a8f0SKuldeep Singh buffer[i] = 0x12345678; 57*b525a8f0SKuldeep Singh 58*b525a8f0SKuldeep Singh /* Write data from buffer to flash */ 59*b525a8f0SKuldeep Singh xspi_write(fspi_test_addr, (void *)buffer, (size * 4 + extra)); 60*b525a8f0SKuldeep Singh /* Check written data using IP read */ 61*b525a8f0SKuldeep Singh xspi_ip_read(fspi_test_addr, buffer, (size * 4 + extra)); 62*b525a8f0SKuldeep Singh failed = 0; 63*b525a8f0SKuldeep Singh for (i = 0; i < size; i++) 64*b525a8f0SKuldeep Singh if (fspi_swap32(0x12345678) != buffer[i]) { 65*b525a8f0SKuldeep Singh failed = 1; 66*b525a8f0SKuldeep Singh break; 67*b525a8f0SKuldeep Singh } 68*b525a8f0SKuldeep Singh 69*b525a8f0SKuldeep Singh if (failed == 0) { 70*b525a8f0SKuldeep Singh NOTICE("[%d]: Success IpWrite with IP READ in buffer[%d] 0x%08x\n", __LINE__, i-3, buffer[i-3]); 71*b525a8f0SKuldeep Singh } else { 72*b525a8f0SKuldeep Singh ERROR("Write: Failed -->xxxx with IP READ in buffer[%d]=0x%08x\n", i, buffer[i]); 73*b525a8f0SKuldeep Singh return; 74*b525a8f0SKuldeep Singh } 75*b525a8f0SKuldeep Singh 76*b525a8f0SKuldeep Singh /* xspi_read may use AHB read */ 77*b525a8f0SKuldeep Singh xspi_read((fspi_test_addr), buffer, (size * 4 + extra)); 78*b525a8f0SKuldeep Singh failed = 0; 79*b525a8f0SKuldeep Singh for (i = 0; i < size; i++) 80*b525a8f0SKuldeep Singh if (fspi_swap32(0x12345678) != buffer[i]) { 81*b525a8f0SKuldeep Singh failed = 1; 82*b525a8f0SKuldeep Singh break; 83*b525a8f0SKuldeep Singh } 84*b525a8f0SKuldeep Singh 85*b525a8f0SKuldeep Singh if (failed == 0) { 86*b525a8f0SKuldeep Singh NOTICE("[%d]: Success IpWrite with AHB OR IP READ on buffer[%d] 0x%08x\n", __LINE__, i-3, buffer[i-3]); 87*b525a8f0SKuldeep Singh } else { 88*b525a8f0SKuldeep Singh ERROR("Write: Failed -->xxxx with AHB READ on buffer[%d]=0x%08x\n", i, buffer[i]); 89*b525a8f0SKuldeep Singh return; 90*b525a8f0SKuldeep Singh } 91*b525a8f0SKuldeep Singh } 92