pandora: defconfig: update
[pandora-kernel.git] / drivers / misc / altera-stapl / altera.c
1 /*
2  * altera.c
3  *
4  * altera FPGA driver
5  *
6  * Copyright (C) Altera Corporation 1998-2001
7  * Copyright (C) 2010,2011 NetUP Inc.
8  * Copyright (C) 2010,2011 Igor M. Liplianin <liplianin@netup.ru>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24  */
25
26 #include <asm/unaligned.h>
27 #include <linux/ctype.h>
28 #include <linux/string.h>
29 #include <linux/firmware.h>
30 #include <linux/slab.h>
31 #include <linux/module.h>
32 #include <misc/altera.h>
33 #include "altera-exprt.h"
34 #include "altera-jtag.h"
35
36 static int debug = 1;
37 module_param(debug, int, 0644);
38 MODULE_PARM_DESC(debug, "enable debugging information");
39
40 MODULE_DESCRIPTION("altera FPGA kernel module");
41 MODULE_AUTHOR("Igor M. Liplianin  <liplianin@netup.ru>");
42 MODULE_LICENSE("GPL");
43
44 #define dprintk(args...) \
45         if (debug) { \
46                 printk(KERN_DEBUG args); \
47         }
48
49 enum altera_fpga_opcode {
50         OP_NOP = 0,
51         OP_DUP,
52         OP_SWP,
53         OP_ADD,
54         OP_SUB,
55         OP_MULT,
56         OP_DIV,
57         OP_MOD,
58         OP_SHL,
59         OP_SHR,
60         OP_NOT,
61         OP_AND,
62         OP_OR,
63         OP_XOR,
64         OP_INV,
65         OP_GT,
66         OP_LT,
67         OP_RET,
68         OP_CMPS,
69         OP_PINT,
70         OP_PRNT,
71         OP_DSS,
72         OP_DSSC,
73         OP_ISS,
74         OP_ISSC,
75         OP_DPR = 0x1c,
76         OP_DPRL,
77         OP_DPO,
78         OP_DPOL,
79         OP_IPR,
80         OP_IPRL,
81         OP_IPO,
82         OP_IPOL,
83         OP_PCHR,
84         OP_EXIT,
85         OP_EQU,
86         OP_POPT,
87         OP_ABS = 0x2c,
88         OP_BCH0,
89         OP_PSH0 = 0x2f,
90         OP_PSHL = 0x40,
91         OP_PSHV,
92         OP_JMP,
93         OP_CALL,
94         OP_NEXT,
95         OP_PSTR,
96         OP_SINT = 0x47,
97         OP_ST,
98         OP_ISTP,
99         OP_DSTP,
100         OP_SWPN,
101         OP_DUPN,
102         OP_POPV,
103         OP_POPE,
104         OP_POPA,
105         OP_JMPZ,
106         OP_DS,
107         OP_IS,
108         OP_DPRA,
109         OP_DPOA,
110         OP_IPRA,
111         OP_IPOA,
112         OP_EXPT,
113         OP_PSHE,
114         OP_PSHA,
115         OP_DYNA,
116         OP_EXPV = 0x5c,
117         OP_COPY = 0x80,
118         OP_REVA,
119         OP_DSC,
120         OP_ISC,
121         OP_WAIT,
122         OP_VS,
123         OP_CMPA = 0xc0,
124         OP_VSC,
125 };
126
127 struct altera_procinfo {
128         char                    *name;
129         u8                      attrs;
130         struct altera_procinfo  *next;
131 };
132
133 /* This function checks if enough parameters are available on the stack. */
134 static int altera_check_stack(int stack_ptr, int count, int *status)
135 {
136         if (stack_ptr < count) {
137                 *status = -EOVERFLOW;
138                 return 0;
139         }
140
141         return 1;
142 }
143
144 static void altera_export_int(char *key, s32 value)
145 {
146         dprintk("Export: key = \"%s\", value = %d\n", key, value);
147 }
148
149 #define HEX_LINE_CHARS 72
150 #define HEX_LINE_BITS (HEX_LINE_CHARS * 4)
151
152 static void altera_export_bool_array(char *key, u8 *data, s32 count)
153 {
154         char string[HEX_LINE_CHARS + 1];
155         s32 i, offset;
156         u32 size, line, lines, linebits, value, j, k;
157
158         if (count > HEX_LINE_BITS) {
159                 dprintk("Export: key = \"%s\", %d bits, value = HEX\n",
160                                                         key, count);
161                 lines = (count + (HEX_LINE_BITS - 1)) / HEX_LINE_BITS;
162
163                 for (line = 0; line < lines; ++line) {
164                         if (line < (lines - 1)) {
165                                 linebits = HEX_LINE_BITS;
166                                 size = HEX_LINE_CHARS;
167                                 offset = count - ((line + 1) * HEX_LINE_BITS);
168                         } else {
169                                 linebits =
170                                         count - ((lines - 1) * HEX_LINE_BITS);
171                                 size = (linebits + 3) / 4;
172                                 offset = 0L;
173                         }
174
175                         string[size] = '\0';
176                         j = size - 1;
177                         value = 0;
178
179                         for (k = 0; k < linebits; ++k) {
180                                 i = k + offset;
181                                 if (data[i >> 3] & (1 << (i & 7)))
182                                         value |= (1 << (i & 3));
183                                 if ((i & 3) == 3) {
184                                         sprintf(&string[j], "%1x", value);
185                                         value = 0;
186                                         --j;
187                                 }
188                         }
189                         if ((k & 3) > 0)
190                                 sprintf(&string[j], "%1x", value);
191
192                         dprintk("%s\n", string);
193                 }
194
195         } else {
196                 size = (count + 3) / 4;
197                 string[size] = '\0';
198                 j = size - 1;
199                 value = 0;
200
201                 for (i = 0; i < count; ++i) {
202                         if (data[i >> 3] & (1 << (i & 7)))
203                                 value |= (1 << (i & 3));
204                         if ((i & 3) == 3) {
205                                 sprintf(&string[j], "%1x", value);
206                                 value = 0;
207                                 --j;
208                         }
209                 }
210                 if ((i & 3) > 0)
211                         sprintf(&string[j], "%1x", value);
212
213                 dprintk("Export: key = \"%s\", %d bits, value = HEX %s\n",
214                         key, count, string);
215         }
216 }
217
218 static int altera_execute(struct altera_state *astate,
219                                 u8 *p,
220                                 s32 program_size,
221                                 s32 *error_address,
222                                 int *exit_code,
223                                 int *format_version)
224 {
225         struct altera_config *aconf = astate->config;
226         char *msg_buff = astate->msg_buff;
227         long *stack = astate->stack;
228         int status = 0;
229         u32 first_word = 0L;
230         u32 action_table = 0L;
231         u32 proc_table = 0L;
232         u32 str_table = 0L;
233         u32 sym_table = 0L;
234         u32 data_sect = 0L;
235         u32 code_sect = 0L;
236         u32 debug_sect = 0L;
237         u32 action_count = 0L;
238         u32 proc_count = 0L;
239         u32 sym_count = 0L;
240         long *vars = NULL;
241         s32 *var_size = NULL;
242         char *attrs = NULL;
243         u8 *proc_attributes = NULL;
244         u32 pc;
245         u32 opcode_address;
246         u32 args[3];
247         u32 opcode;
248         u32 name_id;
249         u8 charbuf[4];
250         long long_tmp;
251         u32 variable_id;
252         u8 *charptr_tmp;
253         u8 *charptr_tmp2;
254         long *longptr_tmp;
255         int version = 0;
256         int delta = 0;
257         int stack_ptr = 0;
258         u32 arg_count;
259         int done = 0;
260         int bad_opcode = 0;
261         u32 count;
262         u32 index;
263         u32 index2;
264         s32 long_count;
265         s32 long_idx;
266         s32 long_idx2;
267         u32 i;
268         u32 j;
269         u32 uncomp_size;
270         u32 offset;
271         u32 value;
272         int current_proc = 0;
273         int reverse;
274
275         char *name;
276
277         dprintk("%s\n", __func__);
278
279         /* Read header information */
280         if (program_size > 52L) {
281                 first_word    = get_unaligned_be32(&p[0]);
282                 version = (first_word & 1L);
283                 *format_version = version + 1;
284                 delta = version * 8;
285
286                 action_table  = get_unaligned_be32(&p[4]);
287                 proc_table    = get_unaligned_be32(&p[8]);
288                 str_table  = get_unaligned_be32(&p[4 + delta]);
289                 sym_table  = get_unaligned_be32(&p[16 + delta]);
290                 data_sect  = get_unaligned_be32(&p[20 + delta]);
291                 code_sect  = get_unaligned_be32(&p[24 + delta]);
292                 debug_sect = get_unaligned_be32(&p[28 + delta]);
293                 action_count  = get_unaligned_be32(&p[40 + delta]);
294                 proc_count    = get_unaligned_be32(&p[44 + delta]);
295                 sym_count  = get_unaligned_be32(&p[48 + (2 * delta)]);
296         }
297
298         if ((first_word != 0x4A414D00L) && (first_word != 0x4A414D01L)) {
299                 done = 1;
300                 status = -EIO;
301                 goto exit_done;
302         }
303
304         if (sym_count <= 0)
305                 goto exit_done;
306
307         vars = kzalloc(sym_count * sizeof(long), GFP_KERNEL);
308
309         if (vars == NULL)
310                 status = -ENOMEM;
311
312         if (status == 0) {
313                 var_size = kzalloc(sym_count * sizeof(s32), GFP_KERNEL);
314
315                 if (var_size == NULL)
316                         status = -ENOMEM;
317         }
318
319         if (status == 0) {
320                 attrs = kzalloc(sym_count, GFP_KERNEL);
321
322                 if (attrs == NULL)
323                         status = -ENOMEM;
324         }
325
326         if ((status == 0) && (version > 0)) {
327                 proc_attributes = kzalloc(proc_count, GFP_KERNEL);
328
329                 if (proc_attributes == NULL)
330                         status = -ENOMEM;
331         }
332
333         if (status != 0)
334                 goto exit_done;
335
336         delta = version * 2;
337
338         for (i = 0; i < sym_count; ++i) {
339                 offset = (sym_table + ((11 + delta) * i));
340
341                 value = get_unaligned_be32(&p[offset + 3 + delta]);
342
343                 attrs[i] = p[offset];
344
345                 /*
346                  * use bit 7 of attribute byte to indicate that
347                  * this buffer was dynamically allocated
348                  * and should be freed later
349                  */
350                 attrs[i] &= 0x7f;
351
352                 var_size[i] = get_unaligned_be32(&p[offset + 7 + delta]);
353
354                 /*
355                  * Attribute bits:
356                  * bit 0: 0 = read-only, 1 = read-write
357                  * bit 1: 0 = not compressed, 1 = compressed
358                  * bit 2: 0 = not initialized, 1 = initialized
359                  * bit 3: 0 = scalar, 1 = array
360                  * bit 4: 0 = Boolean, 1 = integer
361                  * bit 5: 0 = declared variable,
362                  *      1 = compiler created temporary variable
363                  */
364
365                 if ((attrs[i] & 0x0c) == 0x04)
366                         /* initialized scalar variable */
367                         vars[i] = value;
368                 else if ((attrs[i] & 0x1e) == 0x0e) {
369                         /* initialized compressed Boolean array */
370                         uncomp_size = get_unaligned_le32(&p[data_sect + value]);
371
372                         /* allocate a buffer for the uncompressed data */
373                         vars[i] = (long)kzalloc(uncomp_size, GFP_KERNEL);
374                         if (vars[i] == 0L)
375                                 status = -ENOMEM;
376                         else {
377                                 /* set flag so buffer will be freed later */
378                                 attrs[i] |= 0x80;
379
380                                 /* uncompress the data */
381                                 if (altera_shrink(&p[data_sect + value],
382                                                 var_size[i],
383                                                 (u8 *)vars[i],
384                                                 uncomp_size,
385                                                 version) != uncomp_size)
386                                         /* decompression failed */
387                                         status = -EIO;
388                                 else
389                                         var_size[i] = uncomp_size * 8L;
390
391                         }
392                 } else if ((attrs[i] & 0x1e) == 0x0c) {
393                         /* initialized Boolean array */
394                         vars[i] = value + data_sect + (long)p;
395                 } else if ((attrs[i] & 0x1c) == 0x1c) {
396                         /* initialized integer array */
397                         vars[i] = value + data_sect;
398                 } else if ((attrs[i] & 0x0c) == 0x08) {
399                         /* uninitialized array */
400
401                         /* flag attrs so that memory is freed */
402                         attrs[i] |= 0x80;
403
404                         if (var_size[i] > 0) {
405                                 u32 size;
406
407                                 if (attrs[i] & 0x10)
408                                         /* integer array */
409                                         size = (var_size[i] * sizeof(s32));
410                                 else
411                                         /* Boolean array */
412                                         size = ((var_size[i] + 7L) / 8L);
413
414                                 vars[i] = (long)kzalloc(size, GFP_KERNEL);
415
416                                 if (vars[i] == 0) {
417                                         status = -ENOMEM;
418                                 } else {
419                                         /* zero out memory */
420                                         for (j = 0; j < size; ++j)
421                                                 ((u8 *)(vars[i]))[j] = 0;
422
423                                 }
424                         } else
425                                 vars[i] = 0;
426
427                 } else
428                         vars[i] = 0;
429
430         }
431
432 exit_done:
433         if (status != 0)
434                 done = 1;
435
436         altera_jinit(astate);
437
438         pc = code_sect;
439         msg_buff[0] = '\0';
440
441         /*
442          * For JBC version 2, we will execute the procedures corresponding to
443          * the selected ACTION
444          */
445         if (version > 0) {
446                 if (aconf->action == NULL) {
447                         status = -EINVAL;
448                         done = 1;
449                 } else {
450                         int action_found = 0;
451                         for (i = 0; (i < action_count) && !action_found; ++i) {
452                                 name_id = get_unaligned_be32(&p[action_table +
453                                                                 (12 * i)]);
454
455                                 name = &p[str_table + name_id];
456
457                                 if (strnicmp(aconf->action, name, strlen(name)) == 0) {
458                                         action_found = 1;
459                                         current_proc =
460                                                 get_unaligned_be32(&p[action_table +
461                                                                 (12 * i) + 8]);
462                                 }
463                         }
464
465                         if (!action_found) {
466                                 status = -EINVAL;
467                                 done = 1;
468                         }
469                 }
470
471                 if (status == 0) {
472                         int first_time = 1;
473                         i = current_proc;
474                         while ((i != 0) || first_time) {
475                                 first_time = 0;
476                                 /* check procedure attribute byte */
477                                 proc_attributes[i] =
478                                                 (p[proc_table +
479                                                                 (13 * i) + 8] &
480                                                                         0x03);
481
482                                 /*
483                                  * BIT0 - OPTIONAL
484                                  * BIT1 - RECOMMENDED
485                                  * BIT6 - FORCED OFF
486                                  * BIT7 - FORCED ON
487                                  */
488
489                                 i = get_unaligned_be32(&p[proc_table +
490                                                         (13 * i) + 4]);
491                         }
492
493                         /*
494                          * Set current_proc to the first procedure
495                          * to be executed
496                          */
497                         i = current_proc;
498                         while ((i != 0) &&
499                                 ((proc_attributes[i] == 1) ||
500                                 ((proc_attributes[i] & 0xc0) == 0x40))) {
501                                 i = get_unaligned_be32(&p[proc_table +
502                                                         (13 * i) + 4]);
503                         }
504
505                         if ((i != 0) || ((i == 0) && (current_proc == 0) &&
506                                 ((proc_attributes[0] != 1) &&
507                                 ((proc_attributes[0] & 0xc0) != 0x40)))) {
508                                 current_proc = i;
509                                 pc = code_sect +
510                                         get_unaligned_be32(&p[proc_table +
511                                                                 (13 * i) + 9]);
512                                 if ((pc < code_sect) || (pc >= debug_sect))
513                                         status = -ERANGE;
514                         } else
515                                 /* there are no procedures to execute! */
516                                 done = 1;
517
518                 }
519         }
520
521         msg_buff[0] = '\0';
522
523         while (!done) {
524                 opcode = (p[pc] & 0xff);
525                 opcode_address = pc;
526                 ++pc;
527
528                 if (debug > 1)
529                         printk("opcode: %02x\n", opcode);
530
531                 arg_count = (opcode >> 6) & 3;
532                 for (i = 0; i < arg_count; ++i) {
533                         args[i] = get_unaligned_be32(&p[pc]);
534                         pc += 4;
535                 }
536
537                 switch (opcode) {
538                 case OP_NOP:
539                         break;
540                 case OP_DUP:
541                         if (altera_check_stack(stack_ptr, 1, &status)) {
542                                 stack[stack_ptr] = stack[stack_ptr - 1];
543                                 ++stack_ptr;
544                         }
545                         break;
546                 case OP_SWP:
547                         if (altera_check_stack(stack_ptr, 2, &status)) {
548                                 long_tmp = stack[stack_ptr - 2];
549                                 stack[stack_ptr - 2] = stack[stack_ptr - 1];
550                                 stack[stack_ptr - 1] = long_tmp;
551                         }
552                         break;
553                 case OP_ADD:
554                         if (altera_check_stack(stack_ptr, 2, &status)) {
555                                 --stack_ptr;
556                                 stack[stack_ptr - 1] += stack[stack_ptr];
557                         }
558                         break;
559                 case OP_SUB:
560                         if (altera_check_stack(stack_ptr, 2, &status)) {
561                                 --stack_ptr;
562                                 stack[stack_ptr - 1] -= stack[stack_ptr];
563                         }
564                         break;
565                 case OP_MULT:
566                         if (altera_check_stack(stack_ptr, 2, &status)) {
567                                 --stack_ptr;
568                                 stack[stack_ptr - 1] *= stack[stack_ptr];
569                         }
570                         break;
571                 case OP_DIV:
572                         if (altera_check_stack(stack_ptr, 2, &status)) {
573                                 --stack_ptr;
574                                 stack[stack_ptr - 1] /= stack[stack_ptr];
575                         }
576                         break;
577                 case OP_MOD:
578                         if (altera_check_stack(stack_ptr, 2, &status)) {
579                                 --stack_ptr;
580                                 stack[stack_ptr - 1] %= stack[stack_ptr];
581                         }
582                         break;
583                 case OP_SHL:
584                         if (altera_check_stack(stack_ptr, 2, &status)) {
585                                 --stack_ptr;
586                                 stack[stack_ptr - 1] <<= stack[stack_ptr];
587                         }
588                         break;
589                 case OP_SHR:
590                         if (altera_check_stack(stack_ptr, 2, &status)) {
591                                 --stack_ptr;
592                                 stack[stack_ptr - 1] >>= stack[stack_ptr];
593                         }
594                         break;
595                 case OP_NOT:
596                         if (altera_check_stack(stack_ptr, 1, &status))
597                                 stack[stack_ptr - 1] ^= (-1L);
598
599                         break;
600                 case OP_AND:
601                         if (altera_check_stack(stack_ptr, 2, &status)) {
602                                 --stack_ptr;
603                                 stack[stack_ptr - 1] &= stack[stack_ptr];
604                         }
605                         break;
606                 case OP_OR:
607                         if (altera_check_stack(stack_ptr, 2, &status)) {
608                                 --stack_ptr;
609                                 stack[stack_ptr - 1] |= stack[stack_ptr];
610                         }
611                         break;
612                 case OP_XOR:
613                         if (altera_check_stack(stack_ptr, 2, &status)) {
614                                 --stack_ptr;
615                                 stack[stack_ptr - 1] ^= stack[stack_ptr];
616                         }
617                         break;
618                 case OP_INV:
619                         if (!altera_check_stack(stack_ptr, 1, &status))
620                                 break;
621                         stack[stack_ptr - 1] = stack[stack_ptr - 1] ? 0L : 1L;
622                         break;
623                 case OP_GT:
624                         if (!altera_check_stack(stack_ptr, 2, &status))
625                                 break;
626                         --stack_ptr;
627                         stack[stack_ptr - 1] =
628                                 (stack[stack_ptr - 1] > stack[stack_ptr]) ?
629                                                                         1L : 0L;
630
631                         break;
632                 case OP_LT:
633                         if (!altera_check_stack(stack_ptr, 2, &status))
634                                 break;
635                         --stack_ptr;
636                         stack[stack_ptr - 1] =
637                                 (stack[stack_ptr - 1] < stack[stack_ptr]) ?
638                                                                         1L : 0L;
639
640                         break;
641                 case OP_RET:
642                         if ((version > 0) && (stack_ptr == 0)) {
643                                 /*
644                                  * We completed one of the main procedures
645                                  * of an ACTION.
646                                  * Find the next procedure
647                                  * to be executed and jump to it.
648                                  * If there are no more procedures, then EXIT.
649                                  */
650                                 i = get_unaligned_be32(&p[proc_table +
651                                                 (13 * current_proc) + 4]);
652                                 while ((i != 0) &&
653                                         ((proc_attributes[i] == 1) ||
654                                         ((proc_attributes[i] & 0xc0) == 0x40)))
655                                         i = get_unaligned_be32(&p[proc_table +
656                                                                 (13 * i) + 4]);
657
658                                 if (i == 0) {
659                                         /* no procedures to execute! */
660                                         done = 1;
661                                         *exit_code = 0; /* success */
662                                 } else {
663                                         current_proc = i;
664                                         pc = code_sect + get_unaligned_be32(
665                                                                 &p[proc_table +
666                                                                 (13 * i) + 9]);
667                                         if ((pc < code_sect) ||
668                                             (pc >= debug_sect))
669                                                 status = -ERANGE;
670                                 }
671
672                         } else
673                                 if (altera_check_stack(stack_ptr, 1, &status)) {
674                                         pc = stack[--stack_ptr] + code_sect;
675                                         if ((pc <= code_sect) ||
676                                             (pc >= debug_sect))
677                                                 status = -ERANGE;
678
679                                 }
680
681                         break;
682                 case OP_CMPS:
683                         /*
684                          * Array short compare
685                          * ...stack 0 is source 1 value
686                          * ...stack 1 is source 2 value
687                          * ...stack 2 is mask value
688                          * ...stack 3 is count
689                          */
690                         if (altera_check_stack(stack_ptr, 4, &status)) {
691                                 s32 a = stack[--stack_ptr];
692                                 s32 b = stack[--stack_ptr];
693                                 long_tmp = stack[--stack_ptr];
694                                 count = stack[stack_ptr - 1];
695
696                                 if ((count < 1) || (count > 32))
697                                         status = -ERANGE;
698                                 else {
699                                         long_tmp &= ((-1L) >> (32 - count));
700
701                                         stack[stack_ptr - 1] =
702                                         ((a & long_tmp) == (b & long_tmp))
703                                                                 ? 1L : 0L;
704                                 }
705                         }
706                         break;
707                 case OP_PINT:
708                         /*
709                          * PRINT add integer
710                          * ...stack 0 is integer value
711                          */
712                         if (!altera_check_stack(stack_ptr, 1, &status))
713                                 break;
714                         sprintf(&msg_buff[strlen(msg_buff)],
715                                         "%ld", stack[--stack_ptr]);
716                         break;
717                 case OP_PRNT:
718                         /* PRINT finish */
719                         if (debug)
720                                 printk(msg_buff, "\n");
721
722                         msg_buff[0] = '\0';
723                         break;
724                 case OP_DSS:
725                         /*
726                          * DRSCAN short
727                          * ...stack 0 is scan data
728                          * ...stack 1 is count
729                          */
730                         if (!altera_check_stack(stack_ptr, 2, &status))
731                                 break;
732                         long_tmp = stack[--stack_ptr];
733                         count = stack[--stack_ptr];
734                         put_unaligned_le32(long_tmp, &charbuf[0]);
735                         status = altera_drscan(astate, count, charbuf, 0);
736                         break;
737                 case OP_DSSC:
738                         /*
739                          * DRSCAN short with capture
740                          * ...stack 0 is scan data
741                          * ...stack 1 is count
742                          */
743                         if (!altera_check_stack(stack_ptr, 2, &status))
744                                 break;
745                         long_tmp = stack[--stack_ptr];
746                         count = stack[stack_ptr - 1];
747                         put_unaligned_le32(long_tmp, &charbuf[0]);
748                         status = altera_swap_dr(astate, count, charbuf,
749                                                         0, charbuf, 0);
750                         stack[stack_ptr - 1] = get_unaligned_le32(&charbuf[0]);
751                         break;
752                 case OP_ISS:
753                         /*
754                          * IRSCAN short
755                          * ...stack 0 is scan data
756                          * ...stack 1 is count
757                          */
758                         if (!altera_check_stack(stack_ptr, 2, &status))
759                                 break;
760                         long_tmp = stack[--stack_ptr];
761                         count = stack[--stack_ptr];
762                         put_unaligned_le32(long_tmp, &charbuf[0]);
763                         status = altera_irscan(astate, count, charbuf, 0);
764                         break;
765                 case OP_ISSC:
766                         /*
767                          * IRSCAN short with capture
768                          * ...stack 0 is scan data
769                          * ...stack 1 is count
770                          */
771                         if (!altera_check_stack(stack_ptr, 2, &status))
772                                 break;
773                         long_tmp = stack[--stack_ptr];
774                         count = stack[stack_ptr - 1];
775                         put_unaligned_le32(long_tmp, &charbuf[0]);
776                         status = altera_swap_ir(astate, count, charbuf,
777                                                         0, charbuf, 0);
778                         stack[stack_ptr - 1] = get_unaligned_le32(&charbuf[0]);
779                         break;
780                 case OP_DPR:
781                         if (!altera_check_stack(stack_ptr, 1, &status))
782                                 break;
783                         count = stack[--stack_ptr];
784                         status = altera_set_dr_pre(&astate->js, count, 0, NULL);
785                         break;
786                 case OP_DPRL:
787                         /*
788                          * DRPRE with literal data
789                          * ...stack 0 is count
790                          * ...stack 1 is literal data
791                          */
792                         if (!altera_check_stack(stack_ptr, 2, &status))
793                                 break;
794                         count = stack[--stack_ptr];
795                         long_tmp = stack[--stack_ptr];
796                         put_unaligned_le32(long_tmp, &charbuf[0]);
797                         status = altera_set_dr_pre(&astate->js, count, 0,
798                                                 charbuf);
799                         break;
800                 case OP_DPO:
801                         /*
802                          * DRPOST
803                          * ...stack 0 is count
804                          */
805                         if (altera_check_stack(stack_ptr, 1, &status)) {
806                                 count = stack[--stack_ptr];
807                                 status = altera_set_dr_post(&astate->js, count,
808                                                                 0, NULL);
809                         }
810                         break;
811                 case OP_DPOL:
812                         /*
813                          * DRPOST with literal data
814                          * ...stack 0 is count
815                          * ...stack 1 is literal data
816                          */
817                         if (!altera_check_stack(stack_ptr, 2, &status))
818                                 break;
819                         count = stack[--stack_ptr];
820                         long_tmp = stack[--stack_ptr];
821                         put_unaligned_le32(long_tmp, &charbuf[0]);
822                         status = altera_set_dr_post(&astate->js, count, 0,
823                                                         charbuf);
824                         break;
825                 case OP_IPR:
826                         if (altera_check_stack(stack_ptr, 1, &status)) {
827                                 count = stack[--stack_ptr];
828                                 status = altera_set_ir_pre(&astate->js, count,
829                                                                 0, NULL);
830                         }
831                         break;
832                 case OP_IPRL:
833                         /*
834                          * IRPRE with literal data
835                          * ...stack 0 is count
836                          * ...stack 1 is literal data
837                          */
838                         if (altera_check_stack(stack_ptr, 2, &status)) {
839                                 count = stack[--stack_ptr];
840                                 long_tmp = stack[--stack_ptr];
841                                 put_unaligned_le32(long_tmp, &charbuf[0]);
842                                 status = altera_set_ir_pre(&astate->js, count,
843                                                         0, charbuf);
844                         }
845                         break;
846                 case OP_IPO:
847                         /*
848                          * IRPOST
849                          * ...stack 0 is count
850                          */
851                         if (altera_check_stack(stack_ptr, 1, &status)) {
852                                 count = stack[--stack_ptr];
853                                 status = altera_set_ir_post(&astate->js, count,
854                                                         0, NULL);
855                         }
856                         break;
857                 case OP_IPOL:
858                         /*
859                          * IRPOST with literal data
860                          * ...stack 0 is count
861                          * ...stack 1 is literal data
862                          */
863                         if (!altera_check_stack(stack_ptr, 2, &status))
864                                 break;
865                         count = stack[--stack_ptr];
866                         long_tmp = stack[--stack_ptr];
867                         put_unaligned_le32(long_tmp, &charbuf[0]);
868                         status = altera_set_ir_post(&astate->js, count, 0,
869                                                         charbuf);
870                         break;
871                 case OP_PCHR:
872                         if (altera_check_stack(stack_ptr, 1, &status)) {
873                                 u8 ch;
874                                 count = strlen(msg_buff);
875                                 ch = (char) stack[--stack_ptr];
876                                 if ((ch < 1) || (ch > 127)) {
877                                         /*
878                                          * character code out of range
879                                          * instead of flagging an error,
880                                          * force the value to 127
881                                          */
882                                         ch = 127;
883                                 }
884                                 msg_buff[count] = ch;
885                                 msg_buff[count + 1] = '\0';
886                         }
887                         break;
888                 case OP_EXIT:
889                         if (altera_check_stack(stack_ptr, 1, &status))
890                                 *exit_code = stack[--stack_ptr];
891
892                         done = 1;
893                         break;
894                 case OP_EQU:
895                         if (!altera_check_stack(stack_ptr, 2, &status))
896                                 break;
897                         --stack_ptr;
898                         stack[stack_ptr - 1] =
899                                 (stack[stack_ptr - 1] == stack[stack_ptr]) ?
900                                                                         1L : 0L;
901                         break;
902                 case OP_POPT:
903                         if (altera_check_stack(stack_ptr, 1, &status))
904                                 --stack_ptr;
905
906                         break;
907                 case OP_ABS:
908                         if (!altera_check_stack(stack_ptr, 1, &status))
909                                 break;
910                         if (stack[stack_ptr - 1] < 0)
911                                 stack[stack_ptr - 1] = 0 - stack[stack_ptr - 1];
912
913                         break;
914                 case OP_BCH0:
915                         /*
916                          * Batch operation 0
917                          * SWP
918                          * SWPN 7
919                          * SWP
920                          * SWPN 6
921                          * DUPN 8
922                          * SWPN 2
923                          * SWP
924                          * DUPN 6
925                          * DUPN 6
926                          */
927
928                         /* SWP  */
929                         if (altera_check_stack(stack_ptr, 2, &status)) {
930                                 long_tmp = stack[stack_ptr - 2];
931                                 stack[stack_ptr - 2] = stack[stack_ptr - 1];
932                                 stack[stack_ptr - 1] = long_tmp;
933                         }
934
935                         /* SWPN 7 */
936                         index = 7 + 1;
937                         if (altera_check_stack(stack_ptr, index, &status)) {
938                                 long_tmp = stack[stack_ptr - index];
939                                 stack[stack_ptr - index] = stack[stack_ptr - 1];
940                                 stack[stack_ptr - 1] = long_tmp;
941                         }
942
943                         /* SWP  */
944                         if (altera_check_stack(stack_ptr, 2, &status)) {
945                                 long_tmp = stack[stack_ptr - 2];
946                                 stack[stack_ptr - 2] = stack[stack_ptr - 1];
947                                 stack[stack_ptr - 1] = long_tmp;
948                         }
949
950                         /* SWPN 6 */
951                         index = 6 + 1;
952                         if (altera_check_stack(stack_ptr, index, &status)) {
953                                 long_tmp = stack[stack_ptr - index];
954                                 stack[stack_ptr - index] = stack[stack_ptr - 1];
955                                 stack[stack_ptr - 1] = long_tmp;
956                         }
957
958                         /* DUPN 8 */
959                         index = 8 + 1;
960                         if (altera_check_stack(stack_ptr, index, &status)) {
961                                 stack[stack_ptr] = stack[stack_ptr - index];
962                                 ++stack_ptr;
963                         }
964
965                         /* SWPN 2 */
966                         index = 2 + 1;
967                         if (altera_check_stack(stack_ptr, index, &status)) {
968                                 long_tmp = stack[stack_ptr - index];
969                                 stack[stack_ptr - index] = stack[stack_ptr - 1];
970                                 stack[stack_ptr - 1] = long_tmp;
971                         }
972
973                         /* SWP  */
974                         if (altera_check_stack(stack_ptr, 2, &status)) {
975                                 long_tmp = stack[stack_ptr - 2];
976                                 stack[stack_ptr - 2] = stack[stack_ptr - 1];
977                                 stack[stack_ptr - 1] = long_tmp;
978                         }
979
980                         /* DUPN 6 */
981                         index = 6 + 1;
982                         if (altera_check_stack(stack_ptr, index, &status)) {
983                                 stack[stack_ptr] = stack[stack_ptr - index];
984                                 ++stack_ptr;
985                         }
986
987                         /* DUPN 6 */
988                         index = 6 + 1;
989                         if (altera_check_stack(stack_ptr, index, &status)) {
990                                 stack[stack_ptr] = stack[stack_ptr - index];
991                                 ++stack_ptr;
992                         }
993                         break;
994                 case OP_PSH0:
995                         stack[stack_ptr++] = 0;
996                         break;
997                 case OP_PSHL:
998                         stack[stack_ptr++] = (s32) args[0];
999                         break;
1000                 case OP_PSHV:
1001                         stack[stack_ptr++] = vars[args[0]];
1002                         break;
1003                 case OP_JMP:
1004                         pc = args[0] + code_sect;
1005                         if ((pc < code_sect) || (pc >= debug_sect))
1006                                 status = -ERANGE;
1007                         break;
1008                 case OP_CALL:
1009                         stack[stack_ptr++] = pc;
1010                         pc = args[0] + code_sect;
1011                         if ((pc < code_sect) || (pc >= debug_sect))
1012                                 status = -ERANGE;
1013                         break;
1014                 case OP_NEXT:
1015                         /*
1016                          * Process FOR / NEXT loop
1017                          * ...argument 0 is variable ID
1018                          * ...stack 0 is step value
1019                          * ...stack 1 is end value
1020                          * ...stack 2 is top address
1021                          */
1022                         if (altera_check_stack(stack_ptr, 3, &status)) {
1023                                 s32 step = stack[stack_ptr - 1];
1024                                 s32 end = stack[stack_ptr - 2];
1025                                 s32 top = stack[stack_ptr - 3];
1026                                 s32 iterator = vars[args[0]];
1027                                 int break_out = 0;
1028
1029                                 if (step < 0) {
1030                                         if (iterator <= end)
1031                                                 break_out = 1;
1032                                 } else if (iterator >= end)
1033                                         break_out = 1;
1034
1035                                 if (break_out) {
1036                                         stack_ptr -= 3;
1037                                 } else {
1038                                         vars[args[0]] = iterator + step;
1039                                         pc = top + code_sect;
1040                                         if ((pc < code_sect) ||
1041                                             (pc >= debug_sect))
1042                                                 status = -ERANGE;
1043                                 }
1044                         }
1045                         break;
1046                 case OP_PSTR:
1047                         /*
1048                          * PRINT add string
1049                          * ...argument 0 is string ID
1050                          */
1051                         count = strlen(msg_buff);
1052                         strlcpy(&msg_buff[count],
1053                                 &p[str_table + args[0]],
1054                                 ALTERA_MESSAGE_LENGTH - count);
1055                         break;
1056                 case OP_SINT:
1057                         /*
1058                          * STATE intermediate state
1059                          * ...argument 0 is state code
1060                          */
1061                         status = altera_goto_jstate(astate, args[0]);
1062                         break;
1063                 case OP_ST:
1064                         /*
1065                          * STATE final state
1066                          * ...argument 0 is state code
1067                          */
1068                         status = altera_goto_jstate(astate, args[0]);
1069                         break;
1070                 case OP_ISTP:
1071                         /*
1072                          * IRSTOP state
1073                          * ...argument 0 is state code
1074                          */
1075                         status = altera_set_irstop(&astate->js, args[0]);
1076                         break;
1077                 case OP_DSTP:
1078                         /*
1079                          * DRSTOP state
1080                          * ...argument 0 is state code
1081                          */
1082                         status = altera_set_drstop(&astate->js, args[0]);
1083                         break;
1084
1085                 case OP_SWPN:
1086                         /*
1087                          * Exchange top with Nth stack value
1088                          * ...argument 0 is 0-based stack entry
1089                          * to swap with top element
1090                          */
1091                         index = (args[0]) + 1;
1092                         if (altera_check_stack(stack_ptr, index, &status)) {
1093                                 long_tmp = stack[stack_ptr - index];
1094                                 stack[stack_ptr - index] = stack[stack_ptr - 1];
1095                                 stack[stack_ptr - 1] = long_tmp;
1096                         }
1097                         break;
1098                 case OP_DUPN:
1099                         /*
1100                          * Duplicate Nth stack value
1101                          * ...argument 0 is 0-based stack entry to duplicate
1102                          */
1103                         index = (args[0]) + 1;
1104                         if (altera_check_stack(stack_ptr, index, &status)) {
1105                                 stack[stack_ptr] = stack[stack_ptr - index];
1106                                 ++stack_ptr;
1107                         }
1108                         break;
1109                 case OP_POPV:
1110                         /*
1111                          * Pop stack into scalar variable
1112                          * ...argument 0 is variable ID
1113                          * ...stack 0 is value
1114                          */
1115                         if (altera_check_stack(stack_ptr, 1, &status))
1116                                 vars[args[0]] = stack[--stack_ptr];
1117
1118                         break;
1119                 case OP_POPE:
1120                         /*
1121                          * Pop stack into integer array element
1122                          * ...argument 0 is variable ID
1123                          * ...stack 0 is array index
1124                          * ...stack 1 is value
1125                          */
1126                         if (!altera_check_stack(stack_ptr, 2, &status))
1127                                 break;
1128                         variable_id = args[0];
1129
1130                         /*
1131                          * If variable is read-only,
1132                          * convert to writable array
1133                          */
1134                         if ((version > 0) &&
1135                                 ((attrs[variable_id] & 0x9c) == 0x1c)) {
1136                                 /* Allocate a writable buffer for this array */
1137                                 count = var_size[variable_id];
1138                                 long_tmp = vars[variable_id];
1139                                 longptr_tmp = kzalloc(count * sizeof(long),
1140                                                                 GFP_KERNEL);
1141                                 vars[variable_id] = (long)longptr_tmp;
1142
1143                                 if (vars[variable_id] == 0) {
1144                                         status = -ENOMEM;
1145                                         break;
1146                                 }
1147
1148                                 /* copy previous contents into buffer */
1149                                 for (i = 0; i < count; ++i) {
1150                                         longptr_tmp[i] =
1151                                                 get_unaligned_be32(&p[long_tmp]);
1152                                         long_tmp += sizeof(long);
1153                                 }
1154
1155                                 /*
1156                                  * set bit 7 - buffer was
1157                                  * dynamically allocated
1158                                  */
1159                                 attrs[variable_id] |= 0x80;
1160
1161                                 /* clear bit 2 - variable is writable */
1162                                 attrs[variable_id] &= ~0x04;
1163                                 attrs[variable_id] |= 0x01;
1164
1165                         }
1166
1167                         /* check that variable is a writable integer array */
1168                         if ((attrs[variable_id] & 0x1c) != 0x18)
1169                                 status = -ERANGE;
1170                         else {
1171                                 longptr_tmp = (long *)vars[variable_id];
1172
1173                                 /* pop the array index */
1174                                 index = stack[--stack_ptr];
1175
1176                                 /* pop the value and store it into the array */
1177                                 longptr_tmp[index] = stack[--stack_ptr];
1178                         }
1179
1180                         break;
1181                 case OP_POPA:
1182                         /*
1183                          * Pop stack into Boolean array
1184                          * ...argument 0 is variable ID
1185                          * ...stack 0 is count
1186                          * ...stack 1 is array index
1187                          * ...stack 2 is value
1188                          */
1189                         if (!altera_check_stack(stack_ptr, 3, &status))
1190                                 break;
1191                         variable_id = args[0];
1192
1193                         /*
1194                          * If variable is read-only,
1195                          * convert to writable array
1196                          */
1197                         if ((version > 0) &&
1198                                 ((attrs[variable_id] & 0x9c) == 0x0c)) {
1199                                 /* Allocate a writable buffer for this array */
1200                                 long_tmp =
1201                                         (var_size[variable_id] + 7L) >> 3L;
1202                                 charptr_tmp2 = (u8 *)vars[variable_id];
1203                                 charptr_tmp =
1204                                         kzalloc(long_tmp, GFP_KERNEL);
1205                                 vars[variable_id] = (long)charptr_tmp;
1206
1207                                 if (vars[variable_id] == 0) {
1208                                         status = -ENOMEM;
1209                                         break;
1210                                 }
1211
1212                                 /* zero the buffer */
1213                                 for (long_idx = 0L;
1214                                         long_idx < long_tmp;
1215                                         ++long_idx) {
1216                                         charptr_tmp[long_idx] = 0;
1217                                 }
1218
1219                                 /* copy previous contents into buffer */
1220                                 for (long_idx = 0L;
1221                                         long_idx < var_size[variable_id];
1222                                         ++long_idx) {
1223                                         long_idx2 = long_idx;
1224
1225                                         if (charptr_tmp2[long_idx2 >> 3] &
1226                                                 (1 << (long_idx2 & 7))) {
1227                                                 charptr_tmp[long_idx >> 3] |=
1228                                                         (1 << (long_idx & 7));
1229                                         }
1230                                 }
1231
1232                                 /*
1233                                  * set bit 7 - buffer was
1234                                  * dynamically allocated
1235                                  */
1236                                 attrs[variable_id] |= 0x80;
1237
1238                                 /* clear bit 2 - variable is writable */
1239                                 attrs[variable_id] &= ~0x04;
1240                                 attrs[variable_id] |= 0x01;
1241
1242                         }
1243
1244                         /*
1245                          * check that variable is
1246                          * a writable Boolean array
1247                          */
1248                         if ((attrs[variable_id] & 0x1c) != 0x08) {
1249                                 status = -ERANGE;
1250                                 break;
1251                         }
1252
1253                         charptr_tmp = (u8 *)vars[variable_id];
1254
1255                         /* pop the count (number of bits to copy) */
1256                         long_count = stack[--stack_ptr];
1257
1258                         /* pop the array index */
1259                         long_idx = stack[--stack_ptr];
1260
1261                         reverse = 0;
1262
1263                         if (version > 0) {
1264                                 /*
1265                                  * stack 0 = array right index
1266                                  * stack 1 = array left index
1267                                  */
1268
1269                                 if (long_idx > long_count) {
1270                                         reverse = 1;
1271                                         long_tmp = long_count;
1272                                         long_count = 1 + long_idx -
1273                                                                 long_count;
1274                                         long_idx = long_tmp;
1275
1276                                         /* reverse POPA is not supported */
1277                                         status = -ERANGE;
1278                                         break;
1279                                 } else
1280                                         long_count = 1 + long_count -
1281                                                                 long_idx;
1282
1283                         }
1284
1285                         /* pop the data */
1286                         long_tmp = stack[--stack_ptr];
1287
1288                         if (long_count < 1) {
1289                                 status = -ERANGE;
1290                                 break;
1291                         }
1292
1293                         for (i = 0; i < long_count; ++i) {
1294                                 if (long_tmp & (1L << (s32) i))
1295                                         charptr_tmp[long_idx >> 3L] |=
1296                                                 (1L << (long_idx & 7L));
1297                                 else
1298                                         charptr_tmp[long_idx >> 3L] &=
1299                                                 ~(1L << (long_idx & 7L));
1300
1301                                 ++long_idx;
1302                         }
1303
1304                         break;
1305                 case OP_JMPZ:
1306                         /*
1307                          * Pop stack and branch if zero
1308                          * ...argument 0 is address
1309                          * ...stack 0 is condition value
1310                          */
1311                         if (altera_check_stack(stack_ptr, 1, &status)) {
1312                                 if (stack[--stack_ptr] == 0) {
1313                                         pc = args[0] + code_sect;
1314                                         if ((pc < code_sect) ||
1315                                             (pc >= debug_sect))
1316                                                 status = -ERANGE;
1317                                 }
1318                         }
1319                         break;
1320                 case OP_DS:
1321                 case OP_IS:
1322                         /*
1323                          * DRSCAN
1324                          * IRSCAN
1325                          * ...argument 0 is scan data variable ID
1326                          * ...stack 0 is array index
1327                          * ...stack 1 is count
1328                          */
1329                         if (!altera_check_stack(stack_ptr, 2, &status))
1330                                 break;
1331                         long_idx = stack[--stack_ptr];
1332                         long_count = stack[--stack_ptr];
1333                         reverse = 0;
1334                         if (version > 0) {
1335                                 /*
1336                                  * stack 0 = array right index
1337                                  * stack 1 = array left index
1338                                  * stack 2 = count
1339                                  */
1340                                 long_tmp = long_count;
1341                                 long_count = stack[--stack_ptr];
1342
1343                                 if (long_idx > long_tmp) {
1344                                         reverse = 1;
1345                                         long_idx = long_tmp;
1346                                 }
1347                         }
1348
1349                         charptr_tmp = (u8 *)vars[args[0]];
1350
1351                         if (reverse) {
1352                                 /*
1353                                  * allocate a buffer
1354                                  * and reverse the data order
1355                                  */
1356                                 charptr_tmp2 = charptr_tmp;
1357                                 charptr_tmp = kzalloc((long_count >> 3) + 1,
1358                                                                 GFP_KERNEL);
1359                                 if (charptr_tmp == NULL) {
1360                                         status = -ENOMEM;
1361                                         break;
1362                                 }
1363
1364                                 long_tmp = long_idx + long_count - 1;
1365                                 long_idx2 = 0;
1366                                 while (long_idx2 < long_count) {
1367                                         if (charptr_tmp2[long_tmp >> 3] &
1368                                                         (1 << (long_tmp & 7)))
1369                                                 charptr_tmp[long_idx2 >> 3] |=
1370                                                         (1 << (long_idx2 & 7));
1371                                         else
1372                                                 charptr_tmp[long_idx2 >> 3] &=
1373                                                         ~(1 << (long_idx2 & 7));
1374
1375                                         --long_tmp;
1376                                         ++long_idx2;
1377                                 }
1378                         }
1379
1380                         if (opcode == 0x51) /* DS */
1381                                 status = altera_drscan(astate, long_count,
1382                                                 charptr_tmp, long_idx);
1383                         else /* IS */
1384                                 status = altera_irscan(astate, long_count,
1385                                                 charptr_tmp, long_idx);
1386
1387                         if (reverse)
1388                                 kfree(charptr_tmp);
1389
1390                         break;
1391                 case OP_DPRA:
1392                         /*
1393                          * DRPRE with array data
1394                          * ...argument 0 is variable ID
1395                          * ...stack 0 is array index
1396                          * ...stack 1 is count
1397                          */
1398                         if (!altera_check_stack(stack_ptr, 2, &status))
1399                                 break;
1400                         index = stack[--stack_ptr];
1401                         count = stack[--stack_ptr];
1402
1403                         if (version > 0)
1404                                 /*
1405                                  * stack 0 = array right index
1406                                  * stack 1 = array left index
1407                                  */
1408                                 count = 1 + count - index;
1409
1410                         charptr_tmp = (u8 *)vars[args[0]];
1411                         status = altera_set_dr_pre(&astate->js, count, index,
1412                                                         charptr_tmp);
1413                         break;
1414                 case OP_DPOA:
1415                         /*
1416                          * DRPOST with array data
1417                          * ...argument 0 is variable ID
1418                          * ...stack 0 is array index
1419                          * ...stack 1 is count
1420                          */
1421                         if (!altera_check_stack(stack_ptr, 2, &status))
1422                                 break;
1423                         index = stack[--stack_ptr];
1424                         count = stack[--stack_ptr];
1425
1426                         if (version > 0)
1427                                 /*
1428                                  * stack 0 = array right index
1429                                  * stack 1 = array left index
1430                                  */
1431                                 count = 1 + count - index;
1432
1433                         charptr_tmp = (u8 *)vars[args[0]];
1434                         status = altera_set_dr_post(&astate->js, count, index,
1435                                                         charptr_tmp);
1436                         break;
1437                 case OP_IPRA:
1438                         /*
1439                          * IRPRE with array data
1440                          * ...argument 0 is variable ID
1441                          * ...stack 0 is array index
1442                          * ...stack 1 is count
1443                          */
1444                         if (!altera_check_stack(stack_ptr, 2, &status))
1445                                 break;
1446                         index = stack[--stack_ptr];
1447                         count = stack[--stack_ptr];
1448
1449                         if (version > 0)
1450                                 /*
1451                                  * stack 0 = array right index
1452                                  * stack 1 = array left index
1453                                  */
1454                                 count = 1 + count - index;
1455
1456                         charptr_tmp = (u8 *)vars[args[0]];
1457                         status = altera_set_ir_pre(&astate->js, count, index,
1458                                                         charptr_tmp);
1459
1460                         break;
1461                 case OP_IPOA:
1462                         /*
1463                          * IRPOST with array data
1464                          * ...argument 0 is variable ID
1465                          * ...stack 0 is array index
1466                          * ...stack 1 is count
1467                          */
1468                         if (!altera_check_stack(stack_ptr, 2, &status))
1469                                 break;
1470                         index = stack[--stack_ptr];
1471                         count = stack[--stack_ptr];
1472
1473                         if (version > 0)
1474                                 /*
1475                                  * stack 0 = array right index
1476                                  * stack 1 = array left index
1477                                  */
1478                                 count = 1 + count - index;
1479
1480                         charptr_tmp = (u8 *)vars[args[0]];
1481                         status = altera_set_ir_post(&astate->js, count, index,
1482                                                         charptr_tmp);
1483
1484                         break;
1485                 case OP_EXPT:
1486                         /*
1487                          * EXPORT
1488                          * ...argument 0 is string ID
1489                          * ...stack 0 is integer expression
1490                          */
1491                         if (altera_check_stack(stack_ptr, 1, &status)) {
1492                                 name = &p[str_table + args[0]];
1493                                 long_tmp = stack[--stack_ptr];
1494                                 altera_export_int(name, long_tmp);
1495                         }
1496                         break;
1497                 case OP_PSHE:
1498                         /*
1499                          * Push integer array element
1500                          * ...argument 0 is variable ID
1501                          * ...stack 0 is array index
1502                          */
1503                         if (!altera_check_stack(stack_ptr, 1, &status))
1504                                 break;
1505                         variable_id = args[0];
1506                         index = stack[stack_ptr - 1];
1507
1508                         /* check variable type */
1509                         if ((attrs[variable_id] & 0x1f) == 0x19) {
1510                                 /* writable integer array */
1511                                 longptr_tmp = (long *)vars[variable_id];
1512                                 stack[stack_ptr - 1] = longptr_tmp[index];
1513                         } else if ((attrs[variable_id] & 0x1f) == 0x1c) {
1514                                 /* read-only integer array */
1515                                 long_tmp = vars[variable_id] +
1516                                                 (index * sizeof(long));
1517                                 stack[stack_ptr - 1] =
1518                                         get_unaligned_be32(&p[long_tmp]);
1519                         } else
1520                                 status = -ERANGE;
1521
1522                         break;
1523                 case OP_PSHA:
1524                         /*
1525                          * Push Boolean array
1526                          * ...argument 0 is variable ID
1527                          * ...stack 0 is count
1528                          * ...stack 1 is array index
1529                          */
1530                         if (!altera_check_stack(stack_ptr, 2, &status))
1531                                 break;
1532                         variable_id = args[0];
1533
1534                         /* check that variable is a Boolean array */
1535                         if ((attrs[variable_id] & 0x18) != 0x08) {
1536                                 status = -ERANGE;
1537                                 break;
1538                         }
1539
1540                         charptr_tmp = (u8 *)vars[variable_id];
1541
1542                         /* pop the count (number of bits to copy) */
1543                         count = stack[--stack_ptr];
1544
1545                         /* pop the array index */
1546                         index = stack[stack_ptr - 1];
1547
1548                         if (version > 0)
1549                                 /*
1550                                  * stack 0 = array right index
1551                                  * stack 1 = array left index
1552                                  */
1553                                 count = 1 + count - index;
1554
1555                         if ((count < 1) || (count > 32)) {
1556                                 status = -ERANGE;
1557                                 break;
1558                         }
1559
1560                         long_tmp = 0L;
1561
1562                         for (i = 0; i < count; ++i)
1563                                 if (charptr_tmp[(i + index) >> 3] &
1564                                                 (1 << ((i + index) & 7)))
1565                                         long_tmp |= (1L << i);
1566
1567                         stack[stack_ptr - 1] = long_tmp;
1568
1569                         break;
1570                 case OP_DYNA:
1571                         /*
1572                          * Dynamically change size of array
1573                          * ...argument 0 is variable ID
1574                          * ...stack 0 is new size
1575                          */
1576                         if (!altera_check_stack(stack_ptr, 1, &status))
1577                                 break;
1578                         variable_id = args[0];
1579                         long_tmp = stack[--stack_ptr];
1580
1581                         if (long_tmp > var_size[variable_id]) {
1582                                 var_size[variable_id] = long_tmp;
1583
1584                                 if (attrs[variable_id] & 0x10)
1585                                         /* allocate integer array */
1586                                         long_tmp *= sizeof(long);
1587                                 else
1588                                         /* allocate Boolean array */
1589                                         long_tmp = (long_tmp + 7) >> 3;
1590
1591                                 /*
1592                                  * If the buffer was previously allocated,
1593                                  * free it
1594                                  */
1595                                 if (attrs[variable_id] & 0x80) {
1596                                         kfree((void *)vars[variable_id]);
1597                                         vars[variable_id] = 0;
1598                                 }
1599
1600                                 /*
1601                                  * Allocate a new buffer
1602                                  * of the requested size
1603                                  */
1604                                 vars[variable_id] = (long)
1605                                         kzalloc(long_tmp, GFP_KERNEL);
1606
1607                                 if (vars[variable_id] == 0) {
1608                                         status = -ENOMEM;
1609                                         break;
1610                                 }
1611
1612                                 /*
1613                                  * Set the attribute bit to indicate that
1614                                  * this buffer was dynamically allocated and
1615                                  * should be freed later
1616                                  */
1617                                 attrs[variable_id] |= 0x80;
1618
1619                                 /* zero out memory */
1620                                 count = ((var_size[variable_id] + 7L) /
1621                                                                         8L);
1622                                 charptr_tmp = (u8 *)(vars[variable_id]);
1623                                 for (index = 0; index < count; ++index)
1624                                         charptr_tmp[index] = 0;
1625
1626                         }
1627
1628                         break;
1629                 case OP_EXPV:
1630                         /*
1631                          * Export Boolean array
1632                          * ...argument 0 is string ID
1633                          * ...stack 0 is variable ID
1634                          * ...stack 1 is array right index
1635                          * ...stack 2 is array left index
1636                          */
1637                         if (!altera_check_stack(stack_ptr, 3, &status))
1638                                 break;
1639                         if (version == 0) {
1640                                 /* EXPV is not supported in JBC 1.0 */
1641                                 bad_opcode = 1;
1642                                 break;
1643                         }
1644                         name = &p[str_table + args[0]];
1645                         variable_id = stack[--stack_ptr];
1646                         long_idx = stack[--stack_ptr];/* right indx */
1647                         long_idx2 = stack[--stack_ptr];/* left indx */
1648
1649                         if (long_idx > long_idx2) {
1650                                 /* reverse indices not supported */
1651                                 status = -ERANGE;
1652                                 break;
1653                         }
1654
1655                         long_count = 1 + long_idx2 - long_idx;
1656
1657                         charptr_tmp = (u8 *)vars[variable_id];
1658                         charptr_tmp2 = NULL;
1659
1660                         if ((long_idx & 7L) != 0) {
1661                                 s32 k = long_idx;
1662                                 charptr_tmp2 =
1663                                         kzalloc(((long_count + 7L) / 8L),
1664                                                         GFP_KERNEL);
1665                                 if (charptr_tmp2 == NULL) {
1666                                         status = -ENOMEM;
1667                                         break;
1668                                 }
1669
1670                                 for (i = 0; i < long_count; ++i) {
1671                                         if (charptr_tmp[k >> 3] &
1672                                                         (1 << (k & 7)))
1673                                                 charptr_tmp2[i >> 3] |=
1674                                                                 (1 << (i & 7));
1675                                         else
1676                                                 charptr_tmp2[i >> 3] &=
1677                                                                 ~(1 << (i & 7));
1678
1679                                         ++k;
1680                                 }
1681                                 charptr_tmp = charptr_tmp2;
1682
1683                         } else if (long_idx != 0)
1684                                 charptr_tmp = &charptr_tmp[long_idx >> 3];
1685
1686                         altera_export_bool_array(name, charptr_tmp,
1687                                                         long_count);
1688
1689                         /* free allocated buffer */
1690                         if ((long_idx & 7L) != 0)
1691                                 kfree(charptr_tmp2);
1692
1693                         break;
1694                 case OP_COPY: {
1695                         /*
1696                          * Array copy
1697                          * ...argument 0 is dest ID
1698                          * ...argument 1 is source ID
1699                          * ...stack 0 is count
1700                          * ...stack 1 is dest index
1701                          * ...stack 2 is source index
1702                          */
1703                         s32 copy_count;
1704                         s32 copy_index;
1705                         s32 copy_index2;
1706                         s32 destleft;
1707                         s32 src_count;
1708                         s32 dest_count;
1709                         int src_reverse = 0;
1710                         int dest_reverse = 0;
1711
1712                         if (!altera_check_stack(stack_ptr, 3, &status))
1713                                 break;
1714
1715                         copy_count = stack[--stack_ptr];
1716                         copy_index = stack[--stack_ptr];
1717                         copy_index2 = stack[--stack_ptr];
1718                         reverse = 0;
1719
1720                         if (version > 0) {
1721                                 /*
1722                                  * stack 0 = source right index
1723                                  * stack 1 = source left index
1724                                  * stack 2 = destination right index
1725                                  * stack 3 = destination left index
1726                                  */
1727                                 destleft = stack[--stack_ptr];
1728
1729                                 if (copy_count > copy_index) {
1730                                         src_reverse = 1;
1731                                         reverse = 1;
1732                                         src_count = 1 + copy_count - copy_index;
1733                                         /* copy_index = source start index */
1734                                 } else {
1735                                         src_count = 1 + copy_index - copy_count;
1736                                         /* source start index */
1737                                         copy_index = copy_count;
1738                                 }
1739
1740                                 if (copy_index2 > destleft) {
1741                                         dest_reverse = 1;
1742                                         reverse = !reverse;
1743                                         dest_count = 1 + copy_index2 - destleft;
1744                                         /* destination start index */
1745                                         copy_index2 = destleft;
1746                                 } else
1747                                         dest_count = 1 + destleft - copy_index2;
1748
1749                                 copy_count = (src_count < dest_count) ?
1750                                                         src_count : dest_count;
1751
1752                                 if ((src_reverse || dest_reverse) &&
1753                                         (src_count != dest_count))
1754                                         /*
1755                                          * If either the source or destination
1756                                          * is reversed, we can't tolerate
1757                                          * a length mismatch, because we
1758                                          * "left justify" arrays when copying.
1759                                          * This won't work correctly
1760                                          * with reversed arrays.
1761                                          */
1762                                         status = -ERANGE;
1763
1764                         }
1765
1766                         count = copy_count;
1767                         index = copy_index;
1768                         index2 = copy_index2;
1769
1770                         /*
1771                          * If destination is a read-only array,
1772                          * allocate a buffer and convert it to a writable array
1773                          */
1774                         variable_id = args[1];
1775                         if ((version > 0) &&
1776                                 ((attrs[variable_id] & 0x9c) == 0x0c)) {
1777                                 /* Allocate a writable buffer for this array */
1778                                 long_tmp =
1779                                         (var_size[variable_id] + 7L) >> 3L;
1780                                 charptr_tmp2 = (u8 *)vars[variable_id];
1781                                 charptr_tmp =
1782                                         kzalloc(long_tmp, GFP_KERNEL);
1783                                 vars[variable_id] = (long)charptr_tmp;
1784
1785                                 if (vars[variable_id] == 0) {
1786                                         status = -ENOMEM;
1787                                         break;
1788                                 }
1789
1790                                 /* zero the buffer */
1791                                 for (long_idx = 0L; long_idx < long_tmp;
1792                                                                 ++long_idx)
1793                                         charptr_tmp[long_idx] = 0;
1794
1795                                 /* copy previous contents into buffer */
1796                                 for (long_idx = 0L;
1797                                         long_idx < var_size[variable_id];
1798                                                                 ++long_idx) {
1799                                         long_idx2 = long_idx;
1800
1801                                         if (charptr_tmp2[long_idx2 >> 3] &
1802                                                 (1 << (long_idx2 & 7)))
1803                                                 charptr_tmp[long_idx >> 3] |=
1804                                                         (1 << (long_idx & 7));
1805
1806                                 }
1807
1808                                 /*
1809                                 set bit 7 - buffer was dynamically allocated */
1810                                 attrs[variable_id] |= 0x80;
1811
1812                                 /* clear bit 2 - variable is writable */
1813                                 attrs[variable_id] &= ~0x04;
1814                                 attrs[variable_id] |= 0x01;
1815                         }
1816
1817                         charptr_tmp = (u8 *)vars[args[1]];
1818                         charptr_tmp2 = (u8 *)vars[args[0]];
1819
1820                         /* check if destination is a writable Boolean array */
1821                         if ((attrs[args[1]] & 0x1c) != 0x08) {
1822                                 status = -ERANGE;
1823                                 break;
1824                         }
1825
1826                         if (count < 1) {
1827                                 status = -ERANGE;
1828                                 break;
1829                         }
1830
1831                         if (reverse)
1832                                 index2 += (count - 1);
1833
1834                         for (i = 0; i < count; ++i) {
1835                                 if (charptr_tmp2[index >> 3] &
1836                                                         (1 << (index & 7)))
1837                                         charptr_tmp[index2 >> 3] |=
1838                                                         (1 << (index2 & 7));
1839                                 else
1840                                         charptr_tmp[index2 >> 3] &=
1841                                                 ~(1 << (index2 & 7));
1842
1843                                 ++index;
1844                                 if (reverse)
1845                                         --index2;
1846                                 else
1847                                         ++index2;
1848                         }
1849
1850                         break;
1851                 }
1852                 case OP_DSC:
1853                 case OP_ISC: {
1854                         /*
1855                          * DRSCAN with capture
1856                          * IRSCAN with capture
1857                          * ...argument 0 is scan data variable ID
1858                          * ...argument 1 is capture variable ID
1859                          * ...stack 0 is capture index
1860                          * ...stack 1 is scan data index
1861                          * ...stack 2 is count
1862                          */
1863                         s32 scan_right, scan_left;
1864                         s32 capture_count = 0;
1865                         s32 scan_count = 0;
1866                         s32 capture_index;
1867                         s32 scan_index;
1868
1869                         if (!altera_check_stack(stack_ptr, 3, &status))
1870                                 break;
1871
1872                         capture_index = stack[--stack_ptr];
1873                         scan_index = stack[--stack_ptr];
1874
1875                         if (version > 0) {
1876                                 /*
1877                                  * stack 0 = capture right index
1878                                  * stack 1 = capture left index
1879                                  * stack 2 = scan right index
1880                                  * stack 3 = scan left index
1881                                  * stack 4 = count
1882                                  */
1883                                 scan_right = stack[--stack_ptr];
1884                                 scan_left = stack[--stack_ptr];
1885                                 capture_count = 1 + scan_index - capture_index;
1886                                 scan_count = 1 + scan_left - scan_right;
1887                                 scan_index = scan_right;
1888                         }
1889
1890                         long_count = stack[--stack_ptr];
1891                         /*
1892                          * If capture array is read-only, allocate a buffer
1893                          * and convert it to a writable array
1894                          */
1895                         variable_id = args[1];
1896                         if ((version > 0) &&
1897                                 ((attrs[variable_id] & 0x9c) == 0x0c)) {
1898                                 /* Allocate a writable buffer for this array */
1899                                 long_tmp =
1900                                         (var_size[variable_id] + 7L) >> 3L;
1901                                 charptr_tmp2 = (u8 *)vars[variable_id];
1902                                 charptr_tmp =
1903                                         kzalloc(long_tmp, GFP_KERNEL);
1904                                 vars[variable_id] = (long)charptr_tmp;
1905
1906                                 if (vars[variable_id] == 0) {
1907                                         status = -ENOMEM;
1908                                         break;
1909                                 }
1910
1911                                 /* zero the buffer */
1912                                 for (long_idx = 0L; long_idx < long_tmp;
1913                                                                 ++long_idx)
1914                                         charptr_tmp[long_idx] = 0;
1915
1916                                 /* copy previous contents into buffer */
1917                                 for (long_idx = 0L;
1918                                         long_idx < var_size[variable_id];
1919                                                                 ++long_idx) {
1920                                         long_idx2 = long_idx;
1921
1922                                         if (charptr_tmp2[long_idx2 >> 3] &
1923                                                 (1 << (long_idx2 & 7)))
1924                                                 charptr_tmp[long_idx >> 3] |=
1925                                                         (1 << (long_idx & 7));
1926
1927                                 }
1928
1929                                 /*
1930                                  * set bit 7 - buffer was
1931                                  * dynamically allocated
1932                                  */
1933                                 attrs[variable_id] |= 0x80;
1934
1935                                 /* clear bit 2 - variable is writable */
1936                                 attrs[variable_id] &= ~0x04;
1937                                 attrs[variable_id] |= 0x01;
1938
1939                         }
1940
1941                         charptr_tmp = (u8 *)vars[args[0]];
1942                         charptr_tmp2 = (u8 *)vars[args[1]];
1943
1944                         if ((version > 0) &&
1945                                         ((long_count > capture_count) ||
1946                                         (long_count > scan_count))) {
1947                                 status = -ERANGE;
1948                                 break;
1949                         }
1950
1951                         /*
1952                          * check that capture array
1953                          * is a writable Boolean array
1954                          */
1955                         if ((attrs[args[1]] & 0x1c) != 0x08) {
1956                                 status = -ERANGE;
1957                                 break;
1958                         }
1959
1960                         if (status == 0) {
1961                                 if (opcode == 0x82) /* DSC */
1962                                         status = altera_swap_dr(astate,
1963                                                         long_count,
1964                                                         charptr_tmp,
1965                                                         scan_index,
1966                                                         charptr_tmp2,
1967                                                         capture_index);
1968                                 else /* ISC */
1969                                         status = altera_swap_ir(astate,
1970                                                         long_count,
1971                                                         charptr_tmp,
1972                                                         scan_index,
1973                                                         charptr_tmp2,
1974                                                         capture_index);
1975
1976                         }
1977
1978                         break;
1979                 }
1980                 case OP_WAIT:
1981                         /*
1982                          * WAIT
1983                          * ...argument 0 is wait state
1984                          * ...argument 1 is end state
1985                          * ...stack 0 is cycles
1986                          * ...stack 1 is microseconds
1987                          */
1988                         if (!altera_check_stack(stack_ptr, 2, &status))
1989                                 break;
1990                         long_tmp = stack[--stack_ptr];
1991
1992                         if (long_tmp != 0L)
1993                                 status = altera_wait_cycles(astate, long_tmp,
1994                                                                 args[0]);
1995
1996                         long_tmp = stack[--stack_ptr];
1997
1998                         if ((status == 0) && (long_tmp != 0L))
1999                                 status = altera_wait_msecs(astate,
2000                                                                 long_tmp,
2001                                                                 args[0]);
2002
2003                         if ((status == 0) && (args[1] != args[0]))
2004                                 status = altera_goto_jstate(astate,
2005                                                                 args[1]);
2006
2007                         if (version > 0) {
2008                                 --stack_ptr; /* throw away MAX cycles */
2009                                 --stack_ptr; /* throw away MAX microseconds */
2010                         }
2011                         break;
2012                 case OP_CMPA: {
2013                         /*
2014                          * Array compare
2015                          * ...argument 0 is source 1 ID
2016                          * ...argument 1 is source 2 ID
2017                          * ...argument 2 is mask ID
2018                          * ...stack 0 is source 1 index
2019                          * ...stack 1 is source 2 index
2020                          * ...stack 2 is mask index
2021                          * ...stack 3 is count
2022                          */
2023                         s32 a, b;
2024                         u8 *source1 = (u8 *)vars[args[0]];
2025                         u8 *source2 = (u8 *)vars[args[1]];
2026                         u8 *mask = (u8 *)vars[args[2]];
2027                         u32 index1;
2028                         u32 index2;
2029                         u32 mask_index;
2030
2031                         if (!altera_check_stack(stack_ptr, 4, &status))
2032                                 break;
2033
2034                         index1 = stack[--stack_ptr];
2035                         index2 = stack[--stack_ptr];
2036                         mask_index = stack[--stack_ptr];
2037                         long_count = stack[--stack_ptr];
2038
2039                         if (version > 0) {
2040                                 /*
2041                                  * stack 0 = source 1 right index
2042                                  * stack 1 = source 1 left index
2043                                  * stack 2 = source 2 right index
2044                                  * stack 3 = source 2 left index
2045                                  * stack 4 = mask right index
2046                                  * stack 5 = mask left index
2047                                  */
2048                                 s32 mask_right = stack[--stack_ptr];
2049                                 s32 mask_left = stack[--stack_ptr];
2050                                 /* source 1 count */
2051                                 a = 1 + index2 - index1;
2052                                 /* source 2 count */
2053                                 b = 1 + long_count - mask_index;
2054                                 a = (a < b) ? a : b;
2055                                 /* mask count */
2056                                 b = 1 + mask_left - mask_right;
2057                                 a = (a < b) ? a : b;
2058                                 /* source 2 start index */
2059                                 index2 = mask_index;
2060                                 /* mask start index */
2061                                 mask_index = mask_right;
2062                                 long_count = a;
2063                         }
2064
2065                         long_tmp = 1L;
2066
2067                         if (long_count < 1)
2068                                 status = -ERANGE;
2069                         else {
2070                                 count = long_count;
2071
2072                                 for (i = 0; i < count; ++i) {
2073                                         if (mask[mask_index >> 3] &
2074                                                 (1 << (mask_index & 7))) {
2075                                                 a = source1[index1 >> 3] &
2076                                                         (1 << (index1 & 7))
2077                                                                 ? 1 : 0;
2078                                                 b = source2[index2 >> 3] &
2079                                                         (1 << (index2 & 7))
2080                                                                 ? 1 : 0;
2081
2082                                                 if (a != b) /* failure */
2083                                                         long_tmp = 0L;
2084                                         }
2085                                         ++index1;
2086                                         ++index2;
2087                                         ++mask_index;
2088                                 }
2089                         }
2090
2091                         stack[stack_ptr++] = long_tmp;
2092
2093                         break;
2094                 }
2095                 default:
2096                         /* Unrecognized opcode -- ERROR! */
2097                         bad_opcode = 1;
2098                         break;
2099                 }
2100
2101                 if (bad_opcode)
2102                         status = -ENOSYS;
2103
2104                 if ((stack_ptr < 0) || (stack_ptr >= ALTERA_STACK_SIZE))
2105                         status = -EOVERFLOW;
2106
2107                 if (status != 0) {
2108                         done = 1;
2109                         *error_address = (s32)(opcode_address - code_sect);
2110                 }
2111         }
2112
2113         altera_free_buffers(astate);
2114
2115         /* Free all dynamically allocated arrays */
2116         if ((attrs != NULL) && (vars != NULL))
2117                 for (i = 0; i < sym_count; ++i)
2118                         if (attrs[i] & 0x80)
2119                                 kfree((void *)vars[i]);
2120
2121         kfree(vars);
2122         kfree(var_size);
2123         kfree(attrs);
2124         kfree(proc_attributes);
2125
2126         return status;
2127 }
2128
2129 static int altera_get_note(u8 *p, s32 program_size,
2130                         s32 *offset, char *key, char *value, int length)
2131 /*
2132  * Gets key and value of NOTE fields in the JBC file.
2133  * Can be called in two modes:  if offset pointer is NULL,
2134  * then the function searches for note fields which match
2135  * the key string provided.  If offset is not NULL, then
2136  * the function finds the next note field of any key,
2137  * starting at the offset specified by the offset pointer.
2138  * Returns 0 for success, else appropriate error code
2139  */
2140 {
2141         int status = -ENODATA;
2142         u32 note_strings = 0L;
2143         u32 note_table = 0L;
2144         u32 note_count = 0L;
2145         u32 first_word = 0L;
2146         int version = 0;
2147         int delta = 0;
2148         char *key_ptr;
2149         char *value_ptr;
2150         int i;
2151
2152         /* Read header information */
2153         if (program_size > 52L) {
2154                 first_word    = get_unaligned_be32(&p[0]);
2155                 version = (first_word & 1L);
2156                 delta = version * 8;
2157
2158                 note_strings  = get_unaligned_be32(&p[8 + delta]);
2159                 note_table    = get_unaligned_be32(&p[12 + delta]);
2160                 note_count    = get_unaligned_be32(&p[44 + (2 * delta)]);
2161         }
2162
2163         if ((first_word != 0x4A414D00L) && (first_word != 0x4A414D01L))
2164                 return -EIO;
2165
2166         if (note_count <= 0L)
2167                 return status;
2168
2169         if (offset == NULL) {
2170                 /*
2171                  * We will search for the first note with a specific key,
2172                  * and return only the value
2173                  */
2174                 for (i = 0; (i < note_count) &&
2175                                                 (status != 0); ++i) {
2176                         key_ptr = &p[note_strings +
2177                                         get_unaligned_be32(
2178                                         &p[note_table + (8 * i)])];
2179                         if ((strnicmp(key, key_ptr, strlen(key_ptr)) == 0) &&
2180                                                 (key != NULL)) {
2181                                 status = 0;
2182
2183                                 value_ptr = &p[note_strings +
2184                                                 get_unaligned_be32(
2185                                                 &p[note_table + (8 * i) + 4])];
2186
2187                                 if (value != NULL)
2188                                         strlcpy(value, value_ptr, length);
2189
2190                         }
2191                 }
2192         } else {
2193                 /*
2194                  * We will search for the next note, regardless of the key,
2195                  * and return both the value and the key
2196                  */
2197
2198                 i = *offset;
2199
2200                 if ((i >= 0) && (i < note_count)) {
2201                         status = 0;
2202
2203                         if (key != NULL)
2204                                 strlcpy(key, &p[note_strings +
2205                                                 get_unaligned_be32(
2206                                                 &p[note_table + (8 * i)])],
2207                                         length);
2208
2209                         if (value != NULL)
2210                                 strlcpy(value, &p[note_strings +
2211                                                 get_unaligned_be32(
2212                                                 &p[note_table + (8 * i) + 4])],
2213                                         length);
2214
2215                         *offset = i + 1;
2216                 }
2217         }
2218
2219         return status;
2220 }
2221
2222 static int altera_check_crc(u8 *p, s32 program_size)
2223 {
2224         int status = 0;
2225         u16 local_expected = 0,
2226             local_actual = 0,
2227             shift_reg = 0xffff;
2228         int bit, feedback;
2229         u8 databyte;
2230         u32 i;
2231         u32 crc_section = 0L;
2232         u32 first_word = 0L;
2233         int version = 0;
2234         int delta = 0;
2235
2236         if (program_size > 52L) {
2237                 first_word  = get_unaligned_be32(&p[0]);
2238                 version = (first_word & 1L);
2239                 delta = version * 8;
2240
2241                 crc_section = get_unaligned_be32(&p[32 + delta]);
2242         }
2243
2244         if ((first_word != 0x4A414D00L) && (first_word != 0x4A414D01L))
2245                 status = -EIO;
2246
2247         if (crc_section >= program_size)
2248                 status = -EIO;
2249
2250         if (status == 0) {
2251                 local_expected = (u16)get_unaligned_be16(&p[crc_section]);
2252
2253                 for (i = 0; i < crc_section; ++i) {
2254                         databyte = p[i];
2255                         for (bit = 0; bit < 8; bit++) {
2256                                 feedback = (databyte ^ shift_reg) & 0x01;
2257                                 shift_reg >>= 1;
2258                                 if (feedback)
2259                                         shift_reg ^= 0x8408;
2260
2261                                 databyte >>= 1;
2262                         }
2263                 }
2264
2265                 local_actual = (u16)~shift_reg;
2266
2267                 if (local_expected != local_actual)
2268                         status = -EILSEQ;
2269
2270         }
2271
2272         if (debug || status) {
2273                 switch (status) {
2274                 case 0:
2275                         printk(KERN_INFO "%s: CRC matched: %04x\n", __func__,
2276                                 local_actual);
2277                         break;
2278                 case -EILSEQ:
2279                         printk(KERN_ERR "%s: CRC mismatch: expected %04x, "
2280                                 "actual %04x\n", __func__, local_expected,
2281                                 local_actual);
2282                         break;
2283                 case -ENODATA:
2284                         printk(KERN_ERR "%s: expected CRC not found, "
2285                                 "actual CRC = %04x\n", __func__,
2286                                 local_actual);
2287                         break;
2288                 case -EIO:
2289                         printk(KERN_ERR "%s: error: format isn't "
2290                                 "recognized.\n", __func__);
2291                         break;
2292                 default:
2293                         printk(KERN_ERR "%s: CRC function returned error "
2294                                 "code %d\n", __func__, status);
2295                         break;
2296                 }
2297         }
2298
2299         return status;
2300 }
2301
2302 static int altera_get_file_info(u8 *p,
2303                                         s32 program_size,
2304                                         int *format_version,
2305                                         int *action_count,
2306                                         int *procedure_count)
2307 {
2308         int status = -EIO;
2309         u32 first_word = 0;
2310         int version = 0;
2311
2312         if (program_size <= 52L)
2313                 return status;
2314
2315         first_word = get_unaligned_be32(&p[0]);
2316
2317         if ((first_word == 0x4A414D00L) || (first_word == 0x4A414D01L)) {
2318                 status = 0;
2319
2320                 version = (first_word & 1L);
2321                 *format_version = version + 1;
2322
2323                 if (version > 0) {
2324                         *action_count = get_unaligned_be32(&p[48]);
2325                         *procedure_count = get_unaligned_be32(&p[52]);
2326                 }
2327         }
2328
2329         return status;
2330 }
2331
2332 static int altera_get_act_info(u8 *p,
2333                                         s32 program_size,
2334                                         int index,
2335                                         char **name,
2336                                         char **description,
2337                                         struct altera_procinfo **proc_list)
2338 {
2339         int status = -EIO;
2340         struct altera_procinfo *procptr = NULL;
2341         struct altera_procinfo *tmpptr = NULL;
2342         u32 first_word = 0L;
2343         u32 action_table = 0L;
2344         u32 proc_table = 0L;
2345         u32 str_table = 0L;
2346         u32 note_strings = 0L;
2347         u32 action_count = 0L;
2348         u32 proc_count = 0L;
2349         u32 act_name_id = 0L;
2350         u32 act_desc_id = 0L;
2351         u32 act_proc_id = 0L;
2352         u32 act_proc_name = 0L;
2353         u8 act_proc_attribute = 0;
2354
2355         if (program_size <= 52L)
2356                 return status;
2357         /* Read header information */
2358         first_word = get_unaligned_be32(&p[0]);
2359
2360         if (first_word != 0x4A414D01L)
2361                 return status;
2362
2363         action_table = get_unaligned_be32(&p[4]);
2364         proc_table   = get_unaligned_be32(&p[8]);
2365         str_table = get_unaligned_be32(&p[12]);
2366         note_strings = get_unaligned_be32(&p[16]);
2367         action_count = get_unaligned_be32(&p[48]);
2368         proc_count   = get_unaligned_be32(&p[52]);
2369
2370         if (index >= action_count)
2371                 return status;
2372
2373         act_name_id = get_unaligned_be32(&p[action_table + (12 * index)]);
2374         act_desc_id = get_unaligned_be32(&p[action_table + (12 * index) + 4]);
2375         act_proc_id = get_unaligned_be32(&p[action_table + (12 * index) + 8]);
2376
2377         *name = &p[str_table + act_name_id];
2378
2379         if (act_desc_id < (note_strings - str_table))
2380                 *description = &p[str_table + act_desc_id];
2381
2382         do {
2383                 act_proc_name = get_unaligned_be32(
2384                                         &p[proc_table + (13 * act_proc_id)]);
2385                 act_proc_attribute =
2386                         (p[proc_table + (13 * act_proc_id) + 8] & 0x03);
2387
2388                 procptr =
2389                                 kzalloc(sizeof(struct altera_procinfo),
2390                                                                 GFP_KERNEL);
2391
2392                 if (procptr == NULL)
2393                         status = -ENOMEM;
2394                 else {
2395                         procptr->name = &p[str_table + act_proc_name];
2396                         procptr->attrs = act_proc_attribute;
2397                         procptr->next = NULL;
2398
2399                         /* add record to end of linked list */
2400                         if (*proc_list == NULL)
2401                                 *proc_list = procptr;
2402                         else {
2403                                 tmpptr = *proc_list;
2404                                 while (tmpptr->next != NULL)
2405                                         tmpptr = tmpptr->next;
2406                                 tmpptr->next = procptr;
2407                         }
2408                 }
2409
2410                 act_proc_id = get_unaligned_be32(
2411                                 &p[proc_table + (13 * act_proc_id) + 4]);
2412         } while ((act_proc_id != 0) && (act_proc_id < proc_count));
2413
2414         return status;
2415 }
2416
2417 int altera_init(struct altera_config *config, const struct firmware *fw)
2418 {
2419         struct altera_state *astate = NULL;
2420         struct altera_procinfo *proc_list = NULL;
2421         struct altera_procinfo *procptr = NULL;
2422         char *key = NULL;
2423         char *value = NULL;
2424         char *action_name = NULL;
2425         char *description = NULL;
2426         int exec_result = 0;
2427         int exit_code = 0;
2428         int format_version = 0;
2429         int action_count = 0;
2430         int procedure_count = 0;
2431         int index = 0;
2432         s32 offset = 0L;
2433         s32 error_address = 0L;
2434         int retval = 0;
2435
2436         key = kzalloc(33, GFP_KERNEL);
2437         if (!key) {
2438                 retval = -ENOMEM;
2439                 goto out;
2440         }
2441         value = kzalloc(257, GFP_KERNEL);
2442         if (!value) {
2443                 retval = -ENOMEM;
2444                 goto free_key;
2445         }
2446         astate = kzalloc(sizeof(struct altera_state), GFP_KERNEL);
2447         if (!astate) {
2448                 retval = -ENOMEM;
2449                 goto free_value;
2450         }
2451
2452         astate->config = config;
2453         if (!astate->config->jtag_io) {
2454                 dprintk(KERN_INFO "%s: using byteblaster!\n", __func__);
2455                 astate->config->jtag_io = netup_jtag_io_lpt;
2456         }
2457
2458         altera_check_crc((u8 *)fw->data, fw->size);
2459
2460         if (debug) {
2461                 altera_get_file_info((u8 *)fw->data, fw->size, &format_version,
2462                                         &action_count, &procedure_count);
2463                 printk(KERN_INFO "%s: File format is %s ByteCode format\n",
2464                         __func__, (format_version == 2) ? "Jam STAPL" :
2465                                                 "pre-standardized Jam 1.1");
2466                 while (altera_get_note((u8 *)fw->data, fw->size,
2467                                         &offset, key, value, 256) == 0)
2468                         printk(KERN_INFO "%s: NOTE \"%s\" = \"%s\"\n",
2469                                         __func__, key, value);
2470         }
2471
2472         if (debug && (format_version == 2) && (action_count > 0)) {
2473                 printk(KERN_INFO "%s: Actions available:\n", __func__);
2474                 for (index = 0; index < action_count; ++index) {
2475                         altera_get_act_info((u8 *)fw->data, fw->size,
2476                                                 index, &action_name,
2477                                                 &description,
2478                                                 &proc_list);
2479
2480                         if (description == NULL)
2481                                 printk(KERN_INFO "%s: %s\n",
2482                                                 __func__,
2483                                                 action_name);
2484                         else
2485                                 printk(KERN_INFO "%s: %s \"%s\"\n",
2486                                                 __func__,
2487                                                 action_name,
2488                                                 description);
2489
2490                         procptr = proc_list;
2491                         while (procptr != NULL) {
2492                                 if (procptr->attrs != 0)
2493                                         printk(KERN_INFO "%s:    %s (%s)\n",
2494                                                 __func__,
2495                                                 procptr->name,
2496                                                 (procptr->attrs == 1) ?
2497                                                 "optional" : "recommended");
2498
2499                                 proc_list = procptr->next;
2500                                 kfree(procptr);
2501                                 procptr = proc_list;
2502                         }
2503                 }
2504
2505                 printk(KERN_INFO "\n");
2506         }
2507
2508         exec_result = altera_execute(astate, (u8 *)fw->data, fw->size,
2509                                 &error_address, &exit_code, &format_version);
2510
2511         if (exit_code)
2512                 exec_result = -EREMOTEIO;
2513
2514         if ((format_version == 2) && (exec_result == -EINVAL)) {
2515                 if (astate->config->action == NULL)
2516                         printk(KERN_ERR "%s: error: no action specified for "
2517                                 "Jam STAPL file.\nprogram terminated.\n",
2518                                 __func__);
2519                 else
2520                         printk(KERN_ERR "%s: error: action \"%s\""
2521                                 " is not supported "
2522                                 "for this Jam STAPL file.\n"
2523                                 "Program terminated.\n", __func__,
2524                                 astate->config->action);
2525
2526         } else if (exec_result)
2527                 printk(KERN_ERR "%s: error %d\n", __func__, exec_result);
2528
2529         kfree(astate);
2530 free_value:
2531         kfree(value);
2532 free_key:
2533         kfree(key);
2534 out:
2535         return retval;
2536 }
2537 EXPORT_SYMBOL(altera_init);