[BACK]Return to siop.ss CVS log [TXT][DIR] Up to [local] / sys / dev / microcode / siop

Annotation of sys/dev/microcode/siop/siop.ss, Revision 1.1

1.1     ! nbrk        1: ;      $OpenBSD: siop.ss,v 1.9 2007/04/13 18:11:21 krw Exp $
        !             2: ;      $NetBSD: siop.ss,v 1.20 2005/11/18 23:10:32 bouyer Exp $
        !             3:
        !             4: ;
        !             5: ;  Copyright (c) 2000 Manuel Bouyer.
        !             6: ;
        !             7: ;  Redistribution and use in source and binary forms, with or without
        !             8: ;  modification, are permitted provided that the following conditions
        !             9: ;  are met:
        !            10: ;  1. Redistributions of source code must retain the above copyright
        !            11: ;     notice, this list of conditions and the following disclaimer.
        !            12: ;  2. Redistributions in binary form must reproduce the above copyright
        !            13: ;     notice, this list of conditions and the following disclaimer in the
        !            14: ;     documentation and/or other materials provided with the distribution.
        !            15: ;  3. All advertising materials mentioning features or use of this software
        !            16: ;     must display the following acknowledgement:
        !            17: ;      This product includes software developed by Manuel Bouyer.
        !            18: ;  4. The name of the author may not be used to endorse or promote products
        !            19: ;     derived from this software without specific prior written permission.
        !            20: ;
        !            21: ;  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            22: ;  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            23: ;  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            24: ;  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            25: ;  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            26: ;  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            27: ;  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            28: ;  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            29: ;  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            30: ;  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            31:
        !            32: ARCH 720
        !            33:
        !            34: ; offsets in siop_common_xfer
        !            35: ABSOLUTE t_id = 40;
        !            36: ABSOLUTE t_msg_in = 60;
        !            37: ABSOLUTE t_ext_msg_in = 68;
        !            38: ABSOLUTE t_ext_msg_data = 76;
        !            39: ABSOLUTE t_msg_out = 84;
        !            40: ABSOLUTE t_cmd = 92;
        !            41: ABSOLUTE t_status = 100;
        !            42: ABSOLUTE t_data = 108;
        !            43:
        !            44: ;; interrupt codes
        !            45: ; interrupts that need a valid DSA
        !            46: ABSOLUTE int_done      = 0xff00;
        !            47: ABSOLUTE int_msgin     = 0xff01;
        !            48: ABSOLUTE int_extmsgin  = 0xff02;
        !            49: ABSOLUTE int_extmsgdata        = 0xff03;
        !            50: ABSOLUTE int_disc      = 0xff04;
        !            51: ABSOLUTE int_saveoffset        = 0xff05;
        !            52: ; interrupts that don't have a valid DSA
        !            53: ABSOLUTE int_reseltarg = 0xff80;
        !            54: ABSOLUTE int_resellun  = 0xff81;
        !            55: ABSOLUTE int_reseltag  = 0xff82;
        !            56: ABSOLUTE int_resfail   = 0xff83;
        !            57: ABSOLUTE int_err       = 0xffff;
        !            58:
        !            59: ; flags for scratcha0
        !            60: ABSOLUTE flag_sdp      = 0x01 ; got save data pointer
        !            61: ABSOLUTE flag_data     = 0x02 ; we're in data phase
        !            62: ABSOLUTE flag_data_mask        = 0xfd ; ~flag_data
        !            63:
        !            64: ; main script symbols
        !            65:
        !            66: ENTRY waitphase;
        !            67: ENTRY send_msgout;
        !            68: ENTRY msgout;
        !            69: ENTRY msgin;
        !            70: ENTRY handle_msgin;
        !            71: ENTRY msgin_ack;
        !            72: ENTRY dataout;
        !            73: ENTRY datain;
        !            74: ENTRY cmdout;
        !            75: ENTRY status;
        !            76: ENTRY disconnect;
        !            77: ENTRY reselect;
        !            78: ENTRY reselected;
        !            79: ENTRY selected;
        !            80: ENTRY script_sched;
        !            81: ENTRY script_sched_slot0;
        !            82: ENTRY get_extmsgdata;
        !            83: ENTRY resel_targ0;
        !            84: ENTRY msgin_space;
        !            85: ENTRY lunsw_return;
        !            86: ENTRY led_on1;
        !            87: ENTRY led_on2;
        !            88: ENTRY led_off;
        !            89: EXTERN abs_script_sched_slot0;
        !            90: EXTERN abs_targ0;
        !            91: EXTERN abs_msgin;
        !            92:
        !            93: ; lun switch symbols
        !            94: ENTRY lun_switch_entry;
        !            95: ENTRY resel_lun0;
        !            96: ENTRY restore_scntl3;
        !            97: EXTERN abs_lunsw_return;
        !            98:
        !            99: ; tag switch symbols
        !           100: ENTRY tag_switch_entry;
        !           101: ENTRY resel_tag0;
        !           102: EXTERN abs_tag0;
        !           103:
        !           104: ; command reselect script symbols
        !           105: ENTRY rdsa0;
        !           106: ENTRY rdsa1;
        !           107: ENTRY rdsa2;
        !           108: ENTRY rdsa3;
        !           109: ENTRY ldsa_reload_dsa;
        !           110: ENTRY ldsa_select;
        !           111: ENTRY ldsa_data;
        !           112:
        !           113: EXTERN ldsa_abs_reselected;
        !           114: EXTERN ldsa_abs_reselect;
        !           115: EXTERN ldsa_abs_selected;
        !           116: EXTERN ldsa_abs_data;
        !           117: EXTERN ldsa_abs_slot;
        !           118:
        !           119: ; main script
        !           120:
        !           121: PROC  siop_script:
        !           122:
        !           123: reselected:
        !           124: ; starting a new session, init 'local variables'
        !           125:        MOVE 0 to SCRATCHA0     ; flags
        !           126:        MOVE 0 to SCRATCHA1     ; DSA offset (for S/G save data pointer)
        !           127:        MOVE SCRATCHA3 to SFBR  ; pending message ?
        !           128:        JUMP REL(handle_msgin), IF not 0x20;
        !           129: waitphase:
        !           130:        JUMP REL(msgout), WHEN MSG_OUT;
        !           131:        JUMP REL(msgin), WHEN MSG_IN;
        !           132:        JUMP REL(dataout), WHEN DATA_OUT;
        !           133:        JUMP REL(datain), WHEN DATA_IN;
        !           134:        JUMP REL(cmdout), WHEN CMD;
        !           135:        JUMP REL(status), WHEN STATUS;
        !           136:        INT int_err;
        !           137:
        !           138: reselect_fail:
        !           139:        ; check that host asserted SIGP, this'll clear SIGP in ISTAT
        !           140:        MOVE CTEST2 & 0x40 TO SFBR;
        !           141:        INT int_resfail,  IF 0x00;
        !           142: ; a NOP by default; patched with MOVE GPREG & 0xfe to GPREG on compile-time
        !           143: ; option "SIOP_SYMLED"
        !           144: led_on1:
        !           145:        NOP;
        !           146: script_sched:
        !           147:        ; Clear DSA and init status
        !           148:        MOVE 0xff to DSA0;
        !           149:        MOVE 0xff to DSA1;
        !           150:        MOVE 0xff to DSA2;
        !           151:        MOVE 0xff to DSA3;
        !           152:        MOVE 0 to SCRATCHA0     ; flags
        !           153:        MOVE 0 to SCRATCHA1     ; DSA offset (for S/G save data pointer)
        !           154: ; the script scheduler: siop_start() we set the absolute jump addr, and then
        !           155: ; changes the FALSE to TRUE. The select script will change it back to false
        !           156: ; once the target is selected.
        !           157: ; The RAM could hold 370 slot entry, we limit it to 40. Should be more than
        !           158: ; enough.
        !           159: script_sched_slot0:
        !           160:        JUMP abs_script_sched_slot0, IF FALSE;
        !           161:        JUMP abs_script_sched_slot0, IF FALSE;
        !           162:        JUMP abs_script_sched_slot0, IF FALSE;
        !           163:        JUMP abs_script_sched_slot0, IF FALSE;
        !           164:        JUMP abs_script_sched_slot0, IF FALSE;
        !           165:        JUMP abs_script_sched_slot0, IF FALSE;
        !           166:        JUMP abs_script_sched_slot0, IF FALSE;
        !           167:        JUMP abs_script_sched_slot0, IF FALSE;
        !           168:        JUMP abs_script_sched_slot0, IF FALSE;
        !           169:        JUMP abs_script_sched_slot0, IF FALSE;
        !           170:        JUMP abs_script_sched_slot0, IF FALSE;
        !           171:        JUMP abs_script_sched_slot0, IF FALSE;
        !           172:        JUMP abs_script_sched_slot0, IF FALSE;
        !           173:        JUMP abs_script_sched_slot0, IF FALSE;
        !           174:        JUMP abs_script_sched_slot0, IF FALSE;
        !           175:        JUMP abs_script_sched_slot0, IF FALSE;
        !           176:        JUMP abs_script_sched_slot0, IF FALSE;
        !           177:        JUMP abs_script_sched_slot0, IF FALSE;
        !           178:        JUMP abs_script_sched_slot0, IF FALSE;
        !           179:        JUMP abs_script_sched_slot0, IF FALSE;
        !           180:        JUMP abs_script_sched_slot0, IF FALSE;
        !           181:        JUMP abs_script_sched_slot0, IF FALSE;
        !           182:        JUMP abs_script_sched_slot0, IF FALSE;
        !           183:        JUMP abs_script_sched_slot0, IF FALSE;
        !           184:        JUMP abs_script_sched_slot0, IF FALSE;
        !           185:        JUMP abs_script_sched_slot0, IF FALSE;
        !           186:        JUMP abs_script_sched_slot0, IF FALSE;
        !           187:        JUMP abs_script_sched_slot0, IF FALSE;
        !           188:        JUMP abs_script_sched_slot0, IF FALSE;
        !           189:        JUMP abs_script_sched_slot0, IF FALSE;
        !           190:        JUMP abs_script_sched_slot0, IF FALSE;
        !           191:        JUMP abs_script_sched_slot0, IF FALSE;
        !           192:        JUMP abs_script_sched_slot0, IF FALSE;
        !           193:        JUMP abs_script_sched_slot0, IF FALSE;
        !           194:        JUMP abs_script_sched_slot0, IF FALSE;
        !           195:        JUMP abs_script_sched_slot0, IF FALSE;
        !           196:        JUMP abs_script_sched_slot0, IF FALSE;
        !           197:        JUMP abs_script_sched_slot0, IF FALSE;
        !           198:        JUMP abs_script_sched_slot0, IF FALSE;
        !           199:        JUMP abs_script_sched_slot0, IF FALSE;
        !           200: ; Nothing to do, wait for reselect
        !           201: reselect:
        !           202:        ; Clear DSA and init status
        !           203:        MOVE 0xff to DSA0;
        !           204:        MOVE 0xff to DSA1;
        !           205:        MOVE 0xff to DSA2;
        !           206:        MOVE 0xff to DSA3;
        !           207:        MOVE 0x00 to SCRATCHA2; no tag
        !           208:        MOVE 0x20 to SCRATCHA3; simple tag msg, ignored by reselected:
        !           209: ; a NOP by default; patched with MOVE GPREG | 0x01 to GPREG on compile-time
        !           210: ; option "SIOP_SYMLED"
        !           211: led_off:
        !           212:        NOP;
        !           213:        WAIT RESELECT REL(reselect_fail)
        !           214: ; a NOP by default; patched with MOVE GPREG & 0xfe to GPREG on compile-time
        !           215: ; option "SIOP_SYMLED"
        !           216: led_on2:
        !           217:        NOP;
        !           218:        MOVE SSID & 0x8f to SFBR
        !           219:        MOVE SFBR to SCRATCHA0 ; save reselect ID
        !           220: ; find the right param for this target
        !           221: resel_targ0:
        !           222:        JUMP abs_targ0, IF 0xff;
        !           223:        JUMP abs_targ0, IF 0xff;
        !           224:        JUMP abs_targ0, IF 0xff;
        !           225:        JUMP abs_targ0, IF 0xff;
        !           226:        JUMP abs_targ0, IF 0xff;
        !           227:        JUMP abs_targ0, IF 0xff;
        !           228:        JUMP abs_targ0, IF 0xff;
        !           229:        JUMP abs_targ0, IF 0xff;
        !           230:        JUMP abs_targ0, IF 0xff;
        !           231:        JUMP abs_targ0, IF 0xff;
        !           232:        JUMP abs_targ0, IF 0xff;
        !           233:        JUMP abs_targ0, IF 0xff;
        !           234:        JUMP abs_targ0, IF 0xff;
        !           235:        JUMP abs_targ0, IF 0xff;
        !           236:        JUMP abs_targ0, IF 0xff;
        !           237:        INT int_reseltarg;
        !           238: lunsw_return:
        !           239:        MOVE 1, abs_msgin, WHEN MSG_IN;
        !           240:        MOVE SFBR & 0x07 to SCRATCHA1; save LUN
        !           241:        CLEAR ACK;
        !           242:        RETURN, WHEN NOT MSG_IN; If no more message, jump to lun sw
        !           243:        MOVE 1, abs_msgin, WHEN MSG_IN;
        !           244:        CLEAR ACK;
        !           245:        MOVE SFBR  to SCRATCHA3; save message
        !           246:        RETURN, IF NOT 0x20; jump to lun sw if not simple tag msg
        !           247:        MOVE 1, abs_msgin, WHEN MSG_IN; get tag
        !           248:        CLEAR ACK;
        !           249:        MOVE SFBR  to SCRATCHA2; save tag
        !           250:        RETURN; jump to lun sw
        !           251:
        !           252: handle_sdp:
        !           253:        CLEAR ACK;
        !           254:        MOVE SCRATCHA0 | flag_sdp TO SCRATCHA0;
        !           255:        ; should get a disconnect message now
        !           256: msgin:
        !           257:        CLEAR ATN
        !           258:        MOVE FROM t_msg_in, WHEN MSG_IN;
        !           259: handle_msgin:
        !           260:        JUMP REL(handle_cmpl), IF 0x00        ; command complete message
        !           261:        JUMP REL(handle_sdp), IF 0x02         ; save data pointer message
        !           262:        JUMP REL(handle_extin), IF 0x01       ; extended message
        !           263:        INT int_msgin, IF not 0x04;
        !           264:        CALL REL(disconnect)                  ; disconnect message;
        !           265: ; if we didn't get sdp, no need to interrupt
        !           266:        MOVE SCRATCHA0 & flag_sdp TO SFBR;
        !           267:        INT int_disc, IF not 0x00;
        !           268: ; update offset if we did some data transfer
        !           269:        MOVE SCRATCHA1 TO SFBR;
        !           270:        JUMP REL(script_sched), if 0x00;
        !           271:        INT int_saveoffset;
        !           272:
        !           273: msgin_ack:
        !           274: selected:
        !           275:        CLEAR ACK;
        !           276:        JUMP REL(waitphase);
        !           277:
        !           278: ; entry point for msgout after a msgin or status phase
        !           279: send_msgout:
        !           280:        SET ATN;
        !           281:        CLEAR ACK;
        !           282: msgout:
        !           283:        MOVE FROM t_msg_out, WHEN MSG_OUT;
        !           284:        CLEAR ATN;
        !           285:        JUMP REL(waitphase);
        !           286: cmdout:
        !           287:        MOVE FROM t_cmd, WHEN CMD;
        !           288:        JUMP REL(waitphase);
        !           289: status:
        !           290:        MOVE FROM t_status, WHEN STATUS;
        !           291:        JUMP REL(waitphase);
        !           292: datain:
        !           293:        CALL REL(savedsa);
        !           294:        MOVE SCRATCHA0 | flag_data TO SCRATCHA0;
        !           295: datain_loop:
        !           296:        MOVE FROM t_data, WHEN DATA_IN;
        !           297:        MOVE SCRATCHA1 + 1 TO SCRATCHA1 ; adjust offset
        !           298:        MOVE DSA0 + 8 to DSA0;
        !           299:        MOVE DSA1 + 0 to DSA1 WITH CARRY;
        !           300:        MOVE DSA2 + 0 to DSA2 WITH CARRY;
        !           301:        MOVE DSA3 + 0 to DSA3 WITH CARRY;
        !           302:        JUMP REL(datain_loop), WHEN DATA_IN;
        !           303:        CALL REL(restoredsa);
        !           304:        MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0;
        !           305:        JUMP REL(waitphase);
        !           306:
        !           307: dataout:
        !           308:        CALL REL(savedsa);
        !           309:        MOVE SCRATCHA0 | flag_data TO SCRATCHA0;
        !           310: dataout_loop:
        !           311:        MOVE FROM t_data, WHEN DATA_OUT;
        !           312:        MOVE SCRATCHA1 + 1 TO SCRATCHA1 ; adjust offset
        !           313:        MOVE DSA0 + 8 to DSA0;
        !           314:        MOVE DSA1 + 0 to DSA1 WITH CARRY;
        !           315:        MOVE DSA2 + 0 to DSA2 WITH CARRY;
        !           316:        MOVE DSA3 + 0 to DSA3 WITH CARRY;
        !           317:        JUMP REL(dataout_loop), WHEN DATA_OUT;
        !           318:        CALL REL(restoredsa);
        !           319:        MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0;
        !           320:        JUMP REL(waitphase);
        !           321:
        !           322: savedsa:
        !           323:        MOVE DSA0 to SFBR;
        !           324:        MOVE SFBR to SCRATCHB0;
        !           325:        MOVE DSA1 to SFBR;
        !           326:        MOVE SFBR to SCRATCHB1;
        !           327:        MOVE DSA2 to SFBR;
        !           328:        MOVE SFBR to SCRATCHB2;
        !           329:        MOVE DSA3 to SFBR;
        !           330:        MOVE SFBR to SCRATCHB3;
        !           331:        RETURN;
        !           332:
        !           333: restoredsa:
        !           334:        MOVE SCRATCHB0 TO SFBR;
        !           335:        MOVE SFBR TO DSA0;
        !           336:        MOVE SCRATCHB1 TO SFBR;
        !           337:        MOVE SFBR TO DSA1;
        !           338:        MOVE SCRATCHB2 TO SFBR;
        !           339:        MOVE SFBR TO DSA2;
        !           340:        MOVE SCRATCHB3 TO SFBR;
        !           341:        MOVE SFBR TO DSA3;
        !           342:        RETURN;
        !           343:
        !           344: disconnect:
        !           345:        MOVE SCNTL2 & 0x7f TO SCNTL2;
        !           346:        CLEAR ATN;
        !           347:        CLEAR ACK;
        !           348:        WAIT DISCONNECT;
        !           349:        RETURN;
        !           350:
        !           351: handle_cmpl:
        !           352:        CALL REL(disconnect);
        !           353:        INT int_done;
        !           354:
        !           355: handle_extin:
        !           356:        CLEAR ACK;
        !           357:        MOVE FROM t_ext_msg_in, WHEN MSG_IN;
        !           358:        INT int_extmsgin; /* let host fill in t_ext_msg_data */
        !           359: get_extmsgdata:
        !           360:        CLEAR ACK;
        !           361:        MOVE FROM t_ext_msg_data, WHEN MSG_IN;
        !           362:        INT int_extmsgdata;
        !           363: msgin_space:
        !           364:        NOP; space to store msgin when reselect
        !           365:
        !           366:
        !           367: ;; per-target switch script for LUNs
        !           368: ; hack: we first do a call to the target-specific code, so that a return
        !           369: ; in the main switch will jump to the lun switch.
        !           370: PROC lun_switch:
        !           371: restore_scntl3:
        !           372:        MOVE 0xff TO SCNTL3;
        !           373:        MOVE 0xff TO SXFER;
        !           374:        JUMP abs_lunsw_return;
        !           375: lun_switch_entry:
        !           376:        CALL REL(restore_scntl3);
        !           377:        MOVE SCRATCHA1 TO SFBR;
        !           378: resel_lun0:
        !           379:        INT int_resellun;
        !           380:
        !           381: ;; Per-device switch script for tag
        !           382: PROC tag_switch:
        !           383: tag_switch_entry:
        !           384:        MOVE SCRATCHA2 TO SFBR; restore tag
        !           385: resel_tag0:
        !           386:        JUMP abs_tag0, IF 0x00;
        !           387:        JUMP abs_tag0, IF 0x01;
        !           388:        JUMP abs_tag0, IF 0x02;
        !           389:        JUMP abs_tag0, IF 0x03;
        !           390:        JUMP abs_tag0, IF 0x04;
        !           391:        JUMP abs_tag0, IF 0x05;
        !           392:        JUMP abs_tag0, IF 0x06;
        !           393:        JUMP abs_tag0, IF 0x07;
        !           394:        JUMP abs_tag0, IF 0x08;
        !           395:        JUMP abs_tag0, IF 0x09;
        !           396:        JUMP abs_tag0, IF 0x0a;
        !           397:        JUMP abs_tag0, IF 0x0b;
        !           398:        JUMP abs_tag0, IF 0x0c;
        !           399:        JUMP abs_tag0, IF 0x0d;
        !           400:        JUMP abs_tag0, IF 0x0e;
        !           401:        JUMP abs_tag0, IF 0x0f;
        !           402:        INT int_reseltag;
        !           403:
        !           404: ;; per-command script: select, and called after a reselect to load DSA
        !           405:
        !           406: PROC load_dsa:
        !           407: ; Can't use MOVE MEMORY to load DSA, doesn't work I/O mapped
        !           408: rdsa0:
        !           409:        MOVE 0xf0 to DSA0;
        !           410: rdsa1:
        !           411:        MOVE 0xf1 to DSA1;
        !           412: rdsa2:
        !           413:        MOVE 0xf2 to DSA2;
        !           414: rdsa3:
        !           415:        MOVE 0xf3 to DSA3;
        !           416:        RETURN;
        !           417: ldsa_reload_dsa:
        !           418:        CALL REL(rdsa0);
        !           419:        JUMP ldsa_abs_reselected;
        !           420: ldsa_select:
        !           421:        CALL REL(rdsa0);
        !           422:        SELECT ATN FROM t_id, ldsa_abs_reselect;
        !           423:        MOVE MEMORY 4, ldsa_abs_data, ldsa_abs_slot;
        !           424:        JUMP ldsa_abs_selected;
        !           425: ldsa_data:
        !           426:        NOP; contains data used by the MOVE MEMORY
        !           427:
        !           428: PROC siop_led_on:
        !           429:        MOVE GPREG & 0xfe TO GPREG;
        !           430:
        !           431: PROC siop_led_off:
        !           432:        MOVE GPREG | 0x01 TO GPREG;

CVSweb