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