xref: /rk3399_rockchip-uboot/drivers/fpga/stratixII.c (revision a6f70a3d1456e6ce97e0f00ac2d5ff8ae22027d6)
1c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD /*
2c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * (C) Copyright 2007
3c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  * Eran Liberty, Extricom , eran.liberty@gmail.com
4c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  *
51a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
6c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD  */
7c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
8c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD #include <common.h>		/* core U-Boot definitions */
9c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD #include <altera.h>
10c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
11c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int StratixII_ps_fpp_load (Altera_desc * desc, void *buf, size_t bsize,
12c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			   int isSerial, int isSecure);
13c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int StratixII_ps_fpp_dump (Altera_desc * desc, void *buf, size_t bsize);
14c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
15c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD /****************************************************************/
16c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD /* Stratix II Generic Implementation                            */
StratixII_load(Altera_desc * desc,void * buf,size_t bsize)17c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int StratixII_load (Altera_desc * desc, void *buf, size_t bsize)
18c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD {
19c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	int ret_val = FPGA_FAIL;
20c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
21c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	switch (desc->iface) {
22c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	case passive_serial:
23c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		ret_val = StratixII_ps_fpp_load (desc, buf, bsize, 1, 0);
24c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		break;
25c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	case fast_passive_parallel:
26c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		ret_val = StratixII_ps_fpp_load (desc, buf, bsize, 0, 0);
27c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		break;
28c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	case fast_passive_parallel_security:
29c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		ret_val = StratixII_ps_fpp_load (desc, buf, bsize, 0, 1);
30c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		break;
31c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
32c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		/* Add new interface types here */
33c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	default:
34c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf ("%s: Unsupported interface type, %d\n", __FUNCTION__,
35c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			desc->iface);
36c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
37c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	return ret_val;
38c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD }
39c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
StratixII_dump(Altera_desc * desc,void * buf,size_t bsize)40c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int StratixII_dump (Altera_desc * desc, void *buf, size_t bsize)
41c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD {
42c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	int ret_val = FPGA_FAIL;
43c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
44c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	switch (desc->iface) {
45c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	case passive_serial:
46c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	case fast_passive_parallel:
47c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	case fast_passive_parallel_security:
48c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		ret_val = StratixII_ps_fpp_dump (desc, buf, bsize);
49c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		break;
50c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		/* Add new interface types here */
51c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	default:
52c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf ("%s: Unsupported interface type, %d\n", __FUNCTION__,
53c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			desc->iface);
54c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
55c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	return ret_val;
56c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD }
57c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
StratixII_info(Altera_desc * desc)58c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int StratixII_info (Altera_desc * desc)
59c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD {
60c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	return FPGA_SUCCESS;
61c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD }
62c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
StratixII_ps_fpp_dump(Altera_desc * desc,void * buf,size_t bsize)63c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int StratixII_ps_fpp_dump (Altera_desc * desc, void *buf, size_t bsize)
64c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD {
65c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	printf ("Stratix II Fast Passive Parallel dump is not implemented\n");
66c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	return FPGA_FAIL;
67c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD }
68c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
StratixII_ps_fpp_load(Altera_desc * desc,void * buf,size_t bsize,int isSerial,int isSecure)69c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD int StratixII_ps_fpp_load (Altera_desc * desc, void *buf, size_t bsize,
70c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			   int isSerial, int isSecure)
71c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD {
72c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	altera_board_specific_func *fns;
73c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	int cookie;
74c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	int ret_val = FPGA_FAIL;
75c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	int bytecount;
76c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	char *buff = buf;
77c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	int i;
78c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
79c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (!desc) {
80c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf ("%s(%d) Altera_desc missing\n", __FUNCTION__, __LINE__);
81c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		return FPGA_FAIL;
82c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
83c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (!buff) {
84c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf ("%s(%d) buffer is missing\n", __FUNCTION__, __LINE__);
85c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		return FPGA_FAIL;
86c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
87c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (!bsize) {
88c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf ("%s(%d) size is zero\n", __FUNCTION__, __LINE__);
89c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		return FPGA_FAIL;
90c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
91c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (!desc->iface_fns) {
92c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf
93c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		    ("%s(%d) Altera_desc function interface table is missing\n",
94c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		     __FUNCTION__, __LINE__);
95c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		return FPGA_FAIL;
96c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
97c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	fns = (altera_board_specific_func *) (desc->iface_fns);
98c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	cookie = desc->cookie;
99c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
100c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (!
101c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	    (fns->config && fns->status && fns->done && fns->data
102c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	     && fns->abort)) {
103c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf
104c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		    ("%s(%d) Missing some function in the function interface table\n",
105c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		     __FUNCTION__, __LINE__);
106c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		return FPGA_FAIL;
107c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
108c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
109c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	/* 1. give board specific a chance to do anything before we start */
110c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (fns->pre) {
111c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		if ((ret_val = fns->pre (cookie)) < 0) {
112c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			return ret_val;
113c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		}
114c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
115c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
116c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	/* from this point on we must fail gracfully by calling lower layer abort */
117c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
118c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	/* 2. Strat burn cycle by deasserting config for t_CFG and waiting t_CF2CK after reaserted */
119c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	fns->config (0, 1, cookie);
120c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	udelay (5);		/* nCONFIG low pulse width 2usec */
121c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	fns->config (1, 1, cookie);
122c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	udelay (100);		/* nCONFIG high to first rising edge on DCLK */
123c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
124c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	/* 3. Start the Data cycle with clk deasserted */
125c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	bytecount = 0;
126c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	fns->clk (0, 1, cookie);
127c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
128c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	printf ("loading to fpga    ");
129c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	while (bytecount < bsize) {
130c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		/* 3.1 check stratix has not signaled us an error */
131c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		if (fns->status (cookie) != 1) {
132c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			printf
133*a6f70a3dSVagrant Cascadian 			    ("\n%s(%d) Stratix failed (byte transferred till failure 0x%x)\n",
134c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			     __FUNCTION__, __LINE__, bytecount);
135c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			fns->abort (cookie);
136c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			return FPGA_FAIL;
137c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		}
138c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		if (isSerial) {
139c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			int i;
140c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			uint8_t data = buff[bytecount++];
141c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			for (i = 0; i < 8; i++) {
142c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 				/* 3.2(ps) put data on the bus */
143c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 				fns->data ((data >> i) & 1, 1, cookie);
144c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
145c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 				/* 3.3(ps) clock once */
146c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 				fns->clk (1, 1, cookie);
147c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 				fns->clk (0, 1, cookie);
148c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			}
149c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		} else {
150c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			/* 3.2(fpp) put data on the bus */
151c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			fns->data (buff[bytecount++], 1, cookie);
152c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
153c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			/* 3.3(fpp) clock once */
154c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			fns->clk (1, 1, cookie);
155c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			fns->clk (0, 1, cookie);
156c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
157c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			/* 3.4(fpp) for secure cycle push 3 more  clocks */
158c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			for (i = 0; isSecure && i < 3; i++) {
159c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 				fns->clk (1, 1, cookie);
160c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 				fns->clk (0, 1, cookie);
161c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			}
162c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		}
163c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
164c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		/* 3.5 while clk is deasserted it is safe to print some progress indication */
165c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		if ((bytecount % (bsize / 100)) == 0) {
166c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			printf ("\b\b\b%02d\%", bytecount * 100 / bsize);
167c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		}
168c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
169c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
170c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	/* 4. Set one last clock and check conf done signal */
171c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	fns->clk (1, 1, cookie);
172c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	udelay (100);
173c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (!fns->done (cookie)) {
174c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf (" error!.\n");
175c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		fns->abort (cookie);
176c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		return FPGA_FAIL;
177c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	} else {
178c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		printf ("\b\b\b done.\n");
179c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
180c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
181c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	/* 5. call lower layer post configuration */
182c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	if (fns->post) {
183c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		if ((ret_val = fns->post (cookie)) < 0) {
184c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			fns->abort (cookie);
185c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 			return ret_val;
186c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 		}
187c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	}
188c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 
189c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD 	return FPGA_SUCCESS;
190c8aa7dfcSJean-Christophe PLAGNIOL-VILLARD }
191