diff options
| author | bouyer <bouyer@NetBSD.org> | 2000-04-21 17:56:58 +0000 |
|---|---|---|
| committer | bouyer <bouyer@NetBSD.org> | 2000-04-21 17:56:58 +0000 |
| commit | 19ada4a82a95cbbbfff681f4e1ead9fbd9de4365 (patch) | |
| tree | 29c1eed79a6f64471f2a3dc278ad1bba8958066f /sys/dev/microcode | |
| parent | 79f12736c0a9abec812ed1cccba1be4d3f614fab (diff) | |
Snapshot of work in progress: new driver for the NCR 53c8xx SCSI controller
(the name 'siop' is still being discussed, may change).
Only basic disconnect/reselect for now, no sync/wide negotiation.
Tested with 810A, 875 and 895 on i386 only.
The bus-independant part should also be able to handle the 53c720 and 53c770.
A new driver with enhanced script should appear for the 825/875/895 'soon'.
Diffstat (limited to 'sys/dev/microcode')
| -rw-r--r-- | sys/dev/microcode/siop/Makefile | 15 | ||||
| -rw-r--r-- | sys/dev/microcode/siop/siop.out | 121 | ||||
| -rw-r--r-- | sys/dev/microcode/siop/siop.ss | 153 |
3 files changed, 289 insertions, 0 deletions
diff --git a/sys/dev/microcode/siop/Makefile b/sys/dev/microcode/siop/Makefile new file mode 100644 index 00000000000..01461bfff26 --- /dev/null +++ b/sys/dev/microcode/siop/Makefile @@ -0,0 +1,15 @@ +# $NetBSD: Makefile,v 1.1 2000/04/21 17:57:01 bouyer Exp $ + +all: siop.out + +PROG= ncr53cxxx +MKSHARE=no + +.include <bsd.prog.mk> + +regen: siop.out +headers: siop.out + +siop.out: siop.ss ${PROG} + ./${PROG} siop.ss -o siop.out + diff --git a/sys/dev/microcode/siop/siop.out b/sys/dev/microcode/siop/siop.out new file mode 100644 index 00000000000..effe33a0b9f --- /dev/null +++ b/sys/dev/microcode/siop/siop.out @@ -0,0 +1,121 @@ +/* $NetBSD: siop.out,v 1.1 2000/04/21 17:57:01 bouyer Exp $ */ +/* + * DO NOT EDIT - this file is automatically generated. + * created from siop.ss on Thu Apr 20 23:36:33 2000 + */ +const u_int32_t siop_script[] = { + 0x47000004, 0x00000048, /* 000 - 0 */ + 0x78340000, 0x00000000, /* 008 - 8 */ + 0x78350000, 0x00000000, /* 010 - 16 */ + 0x868b0000, 0x000000a0, /* 018 - 24 */ + 0x878b0000, 0x00000068, /* 020 - 32 */ + 0x808b0000, 0x00000118, /* 028 - 40 */ + 0x818b0000, 0x000000c0, /* 030 - 48 */ + 0x828b0000, 0x00000098, /* 038 - 56 */ + 0x838b0000, 0x000000a0, /* 040 - 64 */ + 0x98080000, 0x0000ffff, /* 048 - 72 */ + 0x54000000, 0x00000030, /* 050 - 80 */ + 0x740a8f00, 0x00000000, /* 058 - 88 */ + 0x6a340000, 0x00000000, /* 060 - 96 */ + 0x9f030000, 0x0000ffff, /* 068 - 104 */ + 0x1f00000c, 0x0000000c, /* 070 - 112 */ + 0x60000040, 0x00000000, /* 078 - 120 */ + 0x98080000, 0x0000ff02, /* 080 - 128 */ + 0x98080000, 0x0000ff03, /* 088 - 136 */ + 0x60000008, 0x00000000, /* 090 - 144 */ + 0x1f00000c, 0x0000000c, /* 098 - 152 */ + 0x808c0004, 0x000001a8, /* 0a0 - 160 */ + 0x808c0000, 0x000001d0, /* 0a8 - 168 */ + 0x808c0002, 0x000001d8, /* 0b0 - 176 */ + 0x98080000, 0x0000ff01, /* 0b8 - 184 */ + 0x1e000014, 0x00000014, /* 0c0 - 192 */ + 0x60000008, 0x00000000, /* 0c8 - 200 */ + 0x80880000, 0xffffff40, /* 0d0 - 208 */ + 0x1a00001c, 0x0000001c, /* 0d8 - 216 */ + 0x80880000, 0xffffff30, /* 0e0 - 224 */ + 0x1b000024, 0x00000024, /* 0e8 - 232 */ + 0x80880000, 0xffffff20, /* 0f0 - 240 */ + 0x88880000, 0x00000098, /* 0f8 - 248 */ + 0x1900002c, 0x0000002c, /* 100 - 256 */ + 0x7e350100, 0x00000000, /* 108 - 264 */ + 0x7e100800, 0x00000000, /* 110 - 272 */ + 0x7f110000, 0x00000000, /* 118 - 280 */ + 0x7f120000, 0x00000000, /* 120 - 288 */ + 0x7f130000, 0x00000000, /* 128 - 296 */ + 0x818b0000, 0xffffffc8, /* 130 - 304 */ + 0x88880000, 0x000000a0, /* 138 - 312 */ + 0x80880000, 0xfffffed0, /* 140 - 320 */ + 0x88880000, 0x00000048, /* 148 - 328 */ + 0x1800002c, 0x0000002c, /* 150 - 336 */ + 0x7e350100, 0x00000000, /* 158 - 344 */ + 0x7e100800, 0x00000000, /* 160 - 352 */ + 0x7f110000, 0x00000000, /* 168 - 360 */ + 0x7f120000, 0x00000000, /* 170 - 368 */ + 0x7f130000, 0x00000000, /* 178 - 376 */ + 0x808b0000, 0xffffffc8, /* 180 - 384 */ + 0x88880000, 0x00000050, /* 188 - 392 */ + 0x80880000, 0xfffffe80, /* 190 - 400 */ + 0x72100000, 0x00000000, /* 198 - 408 */ + 0x6a5c0000, 0x00000000, /* 1a0 - 416 */ + 0x72110000, 0x00000000, /* 1a8 - 424 */ + 0x6a5d0000, 0x00000000, /* 1b0 - 432 */ + 0x72120000, 0x00000000, /* 1b8 - 440 */ + 0x6a5e0000, 0x00000000, /* 1c0 - 448 */ + 0x72130000, 0x00000000, /* 1c8 - 456 */ + 0x6a5f0000, 0x00000000, /* 1d0 - 464 */ + 0x90080000, 0x00000000, /* 1d8 - 472 */ + 0x725c0000, 0x00000000, /* 1e0 - 480 */ + 0x6a100000, 0x00000000, /* 1e8 - 488 */ + 0x725d0000, 0x00000000, /* 1f0 - 496 */ + 0x6a110000, 0x00000000, /* 1f8 - 504 */ + 0x725e0000, 0x00000000, /* 200 - 512 */ + 0x6a120000, 0x00000000, /* 208 - 520 */ + 0x725f0000, 0x00000000, /* 210 - 528 */ + 0x6a130000, 0x00000000, /* 218 - 536 */ + 0x90080000, 0x00000000, /* 220 - 544 */ + 0x7c027f00, 0x00000000, /* 228 - 552 */ + 0x60000008, 0x00000000, /* 230 - 560 */ + 0x60000040, 0x00000000, /* 238 - 568 */ + 0x48000000, 0x00000000, /* 240 - 576 */ + 0x90080000, 0x00000000, /* 248 - 584 */ + 0x88880000, 0xffffffd0, /* 250 - 592 */ + 0x74340100, 0x00000000, /* 258 - 600 */ + 0x808c0000, 0xfffffde8, /* 260 - 608 */ + 0x72350000, 0x00000000, /* 268 - 616 */ + 0x808c0000, 0xfffffdd8, /* 270 - 624 */ + 0x98080000, 0x0000ff04, /* 278 - 632 */ + 0x88880000, 0xffffffa0, /* 280 - 640 */ + 0x98080000, 0x0000ff00, /* 288 - 648 */ + 0x60000040, 0x00000000, /* 290 - 656 */ + 0x7a340100, 0x00000000, /* 298 - 664 */ + 0x80880000, 0xfffffde8, /* 2a0 - 672 */ +}; + +#define A_t_id 0x00000004 +#define A_t_msg_in 0x0000000c +#define A_t_msg_out 0x00000014 +#define A_t_cmd 0x0000001c +#define A_t_status 0x00000024 +#define A_t_data 0x0000002c +#define A_int_done 0x0000ff00 +#define A_int_msgin 0x0000ff01 +#define A_int_resel 0x0000ff02 +#define A_int_resfail 0x0000ff03 +#define A_int_disc 0x0000ff04 +#define A_int_err 0x0000ffff +#define A_flag_sdp 0x00000001 +#define Ent_waitphase 0x00000018 +#define Ent_select 0x00000000 +#define Ent_msgout 0x000000c0 +#define Ent_msgin 0x00000090 +#define Ent_dataout 0x00000148 +#define Ent_datain 0x000000f8 +#define Ent_cmdout 0x000000d8 +#define Ent_status 0x000000e8 +#define Ent_disconnect 0x00000228 +#define Ent_reselect 0x00000050 +#define Ent_reselected 0x00000008 +#define Ent_handle_reselect 0x00000000 + +u_int32_t INSTRUCTIONS = 0x00000055; +u_int32_t PATCHES = 0x00000000; diff --git a/sys/dev/microcode/siop/siop.ss b/sys/dev/microcode/siop/siop.ss new file mode 100644 index 00000000000..e7e6b61220f --- /dev/null +++ b/sys/dev/microcode/siop/siop.ss @@ -0,0 +1,153 @@ +ARCH 720 + +; offsets of sym_xfer +ABSOLUTE t_id = 4; +ABSOLUTE t_msg_in = 12; +ABSOLUTE t_msg_out = 20; +ABSOLUTE t_cmd = 28; +ABSOLUTE t_status = 36; +ABSOLUTE t_data = 44; + +;; interrupt codes +ABSOLUTE int_done = 0xff00; +ABSOLUTE int_msgin = 0xff01; +ABSOLUTE int_resel = 0xff02; +ABSOLUTE int_resfail = 0xff03; +ABSOLUTE int_disc = 0xff04; +ABSOLUTE int_err = 0xffff; + +; flags for scratcha0 +ABSOLUTE flag_sdp = 0x01 ; got save data pointer + +ENTRY waitphase; +ENTRY select; +ENTRY msgout; +ENTRY msgin; +ENTRY dataout; +ENTRY datain; +ENTRY cmdout; +ENTRY status; +ENTRY disconnect; +ENTRY reselect; +ENTRY reselected; +ENTRY handle_reselect; + +PROC siop_script: + +select: + SELECT ATN FROM t_id, REL(reselect); +reselected: +; starting a new session, init 'local variables' + MOVE 0 to SCRATCHA0 ; flags + MOVE 0 to SCRATCHA1 ; DSA offset (for S/G save data pointer) +waitphase: + JUMP REL(msgout), WHEN MSG_OUT; + JUMP REL(msgin), WHEN MSG_IN; + JUMP REL(dataout), WHEN DATA_OUT; + JUMP REL(datain), WHEN DATA_IN; + JUMP REL(cmdout), WHEN CMD; + JUMP REL(status), WHEN STATUS; +err: + INT int_err; + +reselect: + WAIT RESELECT REL(reselect_fail) + MOVE SSID & 0x8f to SFBR + MOVE SFBR to SCRATCHA0 ; save reselect ID + INT int_err, WHEN NOT MSG_IN; + MOVE FROM t_msg_in, WHEN MSG_IN; + CLEAR ACK; + INT int_resel; + +reselect_fail: + INT int_resfail; + +msgin: + CLEAR ATN + MOVE FROM t_msg_in, WHEN MSG_IN; + JUMP REL(handle_dis), IF 0x04 ; disconnect message + JUMP REL(handle_cmpl), IF 0x00 ; command complete message + JUMP REL(handle_sdp), IF 0x02 ; save data pointer message + INT int_msgin; +msgout: + MOVE FROM t_msg_out, WHEN MSG_OUT; + CLEAR ATN; + JUMP REL(waitphase); +cmdout: + MOVE FROM t_cmd, WHEN CMD; + JUMP REL(waitphase); +status: + MOVE FROM t_status, WHEN STATUS; + JUMP REL(waitphase); +datain: + CALL REL(savedsa); +datain_loop: + MOVE FROM t_data, WHEN DATA_IN; + MOVE SCRATCHA1 + 1 TO SCRATCHA1 ; adjust offset + MOVE DSA0 + 8 to DSA0; + MOVE DSA1 + 0 to DSA1 WITH CARRY; + MOVE DSA2 + 0 to DSA2 WITH CARRY; + MOVE DSA3 + 0 to DSA3 WITH CARRY; + JUMP REL(datain_loop), WHEN DATA_IN; + CALL REL(restoredsa); + JUMP REL(waitphase); + +dataout: + CALL REL(savedsa); +dataout_loop: + MOVE FROM t_data, WHEN DATA_OUT; + MOVE SCRATCHA1 + 1 TO SCRATCHA1 ; adjust offset + MOVE DSA0 + 8 to DSA0; + MOVE DSA1 + 0 to DSA1 WITH CARRY; + MOVE DSA2 + 0 to DSA2 WITH CARRY; + MOVE DSA3 + 0 to DSA3 WITH CARRY; + JUMP REL(dataout_loop), WHEN DATA_OUT; + CALL REL(restoredsa); + JUMP REL(waitphase); + +savedsa: + MOVE DSA0 to SFBR; + MOVE SFBR to SCRATCHB0; + MOVE DSA1 to SFBR; + MOVE SFBR to SCRATCHB1; + MOVE DSA2 to SFBR; + MOVE SFBR to SCRATCHB2; + MOVE DSA3 to SFBR; + MOVE SFBR to SCRATCHB3; + RETURN; + +restoredsa: + MOVE SCRATCHB0 TO SFBR; + MOVE SFBR TO DSA0; + MOVE SCRATCHB1 TO SFBR; + MOVE SFBR TO DSA1; + MOVE SCRATCHB2 TO SFBR; + MOVE SFBR TO DSA2; + MOVE SCRATCHB3 TO SFBR; + MOVE SFBR TO DSA3; + RETURN; + +disconnect: + MOVE SCNTL2 & 0x7f TO SCNTL2; + CLEAR ATN; + CLEAR ACK; + WAIT DISCONNECT; + RETURN; + +handle_dis: + CALL REL(disconnect); +; if we didn't get sdp, or if offset is 0, no need to interrupt + MOVE SCRATCHA0 & flag_sdp TO SFBR; + JUMP REL(reselect), if 0x00; + MOVE SCRATCHA1 TO SFBR; + JUMP REL(reselect), if 0x00; +; Ok, we need to save data pointers + INT int_disc; + +handle_cmpl: + CALL REL(disconnect); + INT int_done; +handle_sdp: + CLEAR ACK; + MOVE SCRATCHA0 | flag_sdp TO SCRATCHA0; + JUMP REL(msgin) ; should get a disconnect message now |
