|
@@ -150,7 +150,8 @@ static ulong zynqmp_align_dma_buffer(u32 *buf, u32 len, u32 swap)
|
150
|
150
|
new_buf[i] = load_word(&buf[i], swap);
|
151
|
151
|
|
152
|
152
|
buf = new_buf;
|
153
|
|
- } else if (swap != SWAP_DONE) {
|
|
153
|
+ } else if ((swap != SWAP_DONE) &&
|
|
154
|
+ (zynqmp_pmufw_version() <= PMUFW_V1_0)) {
|
154
|
155
|
/* For bitstream which are aligned */
|
155
|
156
|
u32 *new_buf = (u32 *)buf;
|
156
|
157
|
|
|
@@ -196,27 +197,41 @@ static int zynqmp_load(xilinx_desc *desc, const void *buf, size_t bsize,
|
196
|
197
|
bitstream_type bstype)
|
197
|
198
|
{
|
198
|
199
|
ALLOC_CACHE_ALIGN_BUFFER(u32, bsizeptr, 1);
|
199
|
|
- u32 swap;
|
|
200
|
+ u32 swap = 0;
|
200
|
201
|
ulong bin_buf;
|
201
|
202
|
int ret;
|
202
|
203
|
u32 buf_lo, buf_hi;
|
203
|
204
|
u32 ret_payload[PAYLOAD_ARG_CNT];
|
204
|
|
-
|
205
|
|
- if (zynqmp_validate_bitstream(desc, buf, bsize, bsize, &swap))
|
206
|
|
- return FPGA_FAIL;
|
|
205
|
+ bool xilfpga_old = false;
|
|
206
|
+
|
|
207
|
+ if (zynqmp_pmufw_version() <= PMUFW_V1_0) {
|
|
208
|
+ puts("WARN: PMUFW v1.0 or less is detected\n");
|
|
209
|
+ puts("WARN: Not all bitstream formats are supported\n");
|
|
210
|
+ puts("WARN: Please upgrade PMUFW\n");
|
|
211
|
+ xilfpga_old = true;
|
|
212
|
+ if (zynqmp_validate_bitstream(desc, buf, bsize, bsize, &swap))
|
|
213
|
+ return FPGA_FAIL;
|
|
214
|
+ bsizeptr = (u32 *)&bsize;
|
|
215
|
+ flush_dcache_range((ulong)bsizeptr,
|
|
216
|
+ (ulong)bsizeptr + sizeof(size_t));
|
|
217
|
+ bstype |= BIT(ZYNQMP_FPGA_BIT_NS);
|
|
218
|
+ }
|
207
|
219
|
|
208
|
220
|
bin_buf = zynqmp_align_dma_buffer((u32 *)buf, bsize, swap);
|
209
|
|
- bsizeptr = (u32 *)&bsize;
|
210
|
221
|
|
211
|
222
|
debug("%s called!\n", __func__);
|
212
|
223
|
flush_dcache_range(bin_buf, bin_buf + bsize);
|
213
|
|
- flush_dcache_range((ulong)bsizeptr, (ulong)bsizeptr + sizeof(size_t));
|
214
|
224
|
|
215
|
225
|
buf_lo = (u32)bin_buf;
|
216
|
226
|
buf_hi = upper_32_bits(bin_buf);
|
217
|
|
- bstype |= BIT(ZYNQMP_FPGA_BIT_NS);
|
218
|
|
- ret = invoke_smc(ZYNQMP_SIP_SVC_PM_FPGA_LOAD, buf_lo, buf_hi,
|
219
|
|
- (u32)(uintptr_t)bsizeptr, bstype, ret_payload);
|
|
227
|
+
|
|
228
|
+ if (xilfpga_old)
|
|
229
|
+ ret = invoke_smc(ZYNQMP_SIP_SVC_PM_FPGA_LOAD, buf_lo, buf_hi,
|
|
230
|
+ (u32)(uintptr_t)bsizeptr, bstype, ret_payload);
|
|
231
|
+ else
|
|
232
|
+ ret = invoke_smc(ZYNQMP_SIP_SVC_PM_FPGA_LOAD, buf_lo, buf_hi,
|
|
233
|
+ (u32)bsize, 0, ret_payload);
|
|
234
|
+
|
220
|
235
|
if (ret)
|
221
|
236
|
debug("PL FPGA LOAD fail\n");
|
222
|
237
|
|