xref: /rk3399_ARM-atf/drivers/nxp/flexspi/nor/test_fspi.c (revision 9719e19a977df3e8bf7567b3c0e1d6b2ebc5b46f)
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 
fspi_test(uint32_t fspi_test_addr,uint32_t size,int extra)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