summaryrefslogtreecommitdiff
path: root/sys/dev/microcode
diff options
context:
space:
mode:
authorbouyer <bouyer@NetBSD.org>2000-04-21 17:56:58 +0000
committerbouyer <bouyer@NetBSD.org>2000-04-21 17:56:58 +0000
commit19ada4a82a95cbbbfff681f4e1ead9fbd9de4365 (patch)
tree29c1eed79a6f64471f2a3dc278ad1bba8958066f /sys/dev/microcode
parent79f12736c0a9abec812ed1cccba1be4d3f614fab (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/Makefile15
-rw-r--r--sys/dev/microcode/siop/siop.out121
-rw-r--r--sys/dev/microcode/siop/siop.ss153
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