squishy.gateware.scsi#

Anatomy of a SCSI Bus#

SCSI Is a bus based system, all devices on the bus have a unique ID and are split into two categories, Initiator, and Target. In general Initiators are show as an adapter connected to a host, and Targets are shown as controllers attatches to a target device. This abstraction serves to represent that there can be multiple possible targets behind a single controller, which share a single bus connection.

As SCSI is not a purely point-to-point bus, and allows for multiple bus initiators, there are three possible bus topologies. The first is Single Initiator, Single Target. This topology acts as a point-to-point bus between a SCSI Initiator and SCSI Target. The second being Single Initiator, Multiple Target. This topology is the traditional topology along with Single Initiator that people think of when they think of SCSI. The final possible common bus topology is Multiple Initiator, Multiple Target. This is where there are multiple initiators and multiple targets all on the shared bus.

graph scsi_bus_sist { fontname="Fira Code" bgcolor="#FFFFFF00" node [fontname="Fira Code"] edge [fontname="Fire Code"] rankdir=LR; node [shape = Mrecord]; H0 [label = "{<f0>HOST|<f1>ADAPTER}"]; T0 [label = "{<f0>CONTROLLER|{<f1>TARGET|{LUN0|...}}}"]; H0:f1 -- T0:f0 }

Single Initiator, Single Target Bus Topology#

graph scsi_bus_simt { fontname="Fira Code" bgcolor="#FFFFFF00" node [fontname="Fira Code"] edge [fontname="Fire Code"] rankdir=LR; node [shape = Mrecord]; H0 [label = "{<f0>HOST|<f1>ADAPTER}"]; T0 [label = "{<f0>CONTROLLER|{<f1>TARGET|{LUN0|...}}}"]; T1 [label = "{<f0>CONTROLLER|{<f1>TARGET|{LUN0|...}}}"]; H0:f1 -- T0:f0 H0:f1 -- T1:f0 }

Single Initiator, Multiple Target Bus Topology#

graph scsi_bus_mimt { fontname="Fira Code" bgcolor="#FFFFFF00" node [fontname="Fira Code"] edge [fontname="Fire Code"] rankdir=LR; node [shape = Mrecord]; H0 [label = "{<f0>HOST|<f1>ADAPTER}"]; H1 [label = "{<f0>HOST|<f1>ADAPTER}"]; H2 [label = "{<f0>HOST|<f1>ADAPTER}"]; T0 [label = "{<f0>CONTROLLER|{<f1>TARGET|{LUN0|...}}}"]; T1 [label = "{<f0>CONTROLLER|{<f1>TARGET|{LUN0|...}}}"]; T2 [label = "{<f0>CONTROLLER|{<f1>TARGET|{LUN0|...}}}"]; T3 [label = "{<f0>CONTROLLER|{<f1>TARGET|{LUN0|...}}}"]; H0:f1 -- T0:f0 H0:f1 -- T1:f0 H0:f1 -- T2:f0 H0:f1 -- T3:f0 H1:f1 -- T0:f0 H1:f1 -- T1:f0 H1:f1 -- T2:f0 H1:f1 -- T3:f0 H2:f1 -- T0:f0 H2:f1 -- T1:f0 H2:f1 -- T2:f0 H2:f1 -- T3:f0 }

Multiple Initiator, Multiple Target Bus Topology#

Todo

this, nya

digraph scsi_with_arbitration{ fontname="Fira Code" bgcolor="#FFFFFF00" node [fontname="Fira Code"] edge [fontname="Fire Code"] rankdir=LR; node [shape = none]; _ node [shape = doublecircle]; BF node [shape = circle]; _ [label = "RESET"]; BF [label = "BUS FREE"]; A [label = "ARBITRATION"]; S [label = "SELECTION"]; R [label = "RESELECTION"]; C [label = "COMMAND"]; D [label = "DATA"]; ST [label = "STATUS"]; M [label = "MESSAGE"]; subgraph CDSM { C -> C C -> D C -> ST C -> M D -> D D -> C D -> ST D -> M ST -> ST ST -> C ST -> D ST -> M M -> M M -> C M -> D M -> ST } S -> C [label = ""]; S -> D [label = ""]; S -> ST [label = ""]; S -> M [label = ""]; R -> C [label = ""]; R -> D [label = ""]; R -> ST [label = ""]; R -> M [label = ""]; _ -> BF [label = ""]; BF -> A [label = ""]; A -> S [label = ""]; A -> R [label = ""]; A -> BF [label = ""]; S -> BF [label = ""]; R -> BF [label = ""]; C -> BF [label = ""]; D -> BF [label = ""]; ST -> BF [label = ""]; M -> BF [label = ""]; }

Arbitrating SCSI Bus State Machine#

digraph scsi_without_arbitration { fontname="Fira Code" bgcolor="#FFFFFF00" node [fontname="Fira Code"] edge [fontname="Fire Code"] rankdir=LR; node [shape = none]; _ node [shape = doublecircle]; BF node [shape = circle]; _ [label = "RESET"]; BF [label = "BUS FREE"]; S [label = "SELECTION"]; C [label = "COMMAND"]; D [label = "DATA"]; ST [label = "STATUS"]; M [label = "MESSAGE"]; subgraph CDSM { C -> C C -> D C -> ST C -> M D -> D D -> C D -> ST D -> M ST -> ST ST -> C ST -> D ST -> M M -> M M -> C M -> D M -> ST } S -> C [label = ""]; S -> D [label = ""]; S -> ST [label = ""]; S -> M [label = ""]; _ -> BF [label = ""]; BF -> S [label = ""]; S -> BF [label = ""]; C -> BF [label = ""]; D -> BF [label = ""]; ST -> BF [label = ""]; M -> BF [label = ""]; }

Non-Arbitrating SCSI Bus State Machine#