fix sdram prom config fix, drop DMA from the sdram DMA and talk to a native SDRAM port instead
This commit is contained in:
parent
9ff265446d
commit
3e7bd4c8ab
@ -37,7 +37,7 @@ A ROM, a SDRAM controller ([litedram](https://github.com/enjoy-digital/litedram)
|
||||
|
||||
Master access to the SBus by the host are routed to the Wishbone to access the various CSRs / control registers of the devices.
|
||||
|
||||
The ROM doesn't do much beyond exposing the devices' existence and specifications to the host.
|
||||
The ROM exposes the devices' existence and specifications to the host, initializes the embedded SDRAM controller (but assuming known values, the NetBSD driver can also optionally initialize the SDRAM via proper calibration), enables FB support on the bw2/cg3/cg6 (last one with accelerated scrolling), and has support for RO access to the sdcard such enabling booting.
|
||||
|
||||
The USB OHCI DMA (USB 1.1) is bridged from the Wishbone to the SBus by having the physical addresses of the Wishbone (that match the virtual addresses from NetBSD DVMA allocations) to the bridge. Reads are buffered by block of 16 bytes; currently writes are unbuffered (and somewhat slow, as they need a full SBus master cycle for every transaction of 32 bits or less). The standard NetBSD OHCI driver is used, with just a small custom SBus-OHCI driver mirroring the PCI-OHCI one. It uses the interrupt level 4 by default. It connects to the micro-B USB connector, an a cable such as [this one](https://www.startech.com/en-us/cables/uusbotgra) allows to expose a conventional USB type A connector for either an external (preferably self-powered) USB Hub or a single low-power device.
|
||||
|
||||
|
||||
@ -11,14 +11,14 @@ from litex.soc.interconnect import wishbone
|
||||
# the blk_addr does the round-trip to accompany the data
|
||||
# mem_size in MiB, might be weird if some space is reserved for other use (e.g. FrameBuffer)
|
||||
class ExchangeWithMem(Module, AutoCSR):
|
||||
def __init__(self, soc, platform, tosbus_fifo, fromsbus_fifo, fromsbus_req_fifo, dram_dma_writer, dram_dma_reader, mem_size=256, burst_size = 8, do_checksum = False):
|
||||
def __init__(self, soc, platform, tosbus_fifo, fromsbus_fifo, fromsbus_req_fifo, dram_native_r, dram_native_w, mem_size=256, burst_size = 8, do_checksum = False):
|
||||
#self.wishbone_r_slave = wishbone.Interface(data_width=soc.bus.data_width)
|
||||
#self.wishbone_w_slave = wishbone.Interface(data_width=soc.bus.data_width)
|
||||
self.tosbus_fifo = tosbus_fifo
|
||||
self.fromsbus_fifo = fromsbus_fifo
|
||||
self.fromsbus_req_fifo = fromsbus_req_fifo
|
||||
self.dram_dma_writer = dram_dma_writer
|
||||
self.dram_dma_reader = dram_dma_reader
|
||||
self.dram_native_r = dram_native_r
|
||||
self.dram_native_w = dram_native_w
|
||||
|
||||
tosbus_fifo_din = Record(soc.tosbus_layout)
|
||||
self.comb += self.tosbus_fifo.din.eq(tosbus_fifo_din.raw_bits())
|
||||
@ -33,8 +33,12 @@ class ExchangeWithMem(Module, AutoCSR):
|
||||
data_width_bits = burst_size * 32
|
||||
blk_addr_width = 32 - log2_int(data_width) # 27 for burst_size == 8
|
||||
|
||||
assert(len(self.dram_dma_writer.sink.data) == data_width_bits)
|
||||
assert(len(self.dram_dma_reader.source.data) == data_width_bits)
|
||||
assert(len(self.dram_native_r.rdata.data) == data_width_bits)
|
||||
assert(len(self.dram_native_r.wdata.data) == data_width_bits)
|
||||
#assert(len(self.dram_native_r.cmd.addr) == (blk_addr_width - 4))
|
||||
assert(len(self.dram_native_w.rdata.data) == data_width_bits)
|
||||
assert(len(self.dram_native_w.wdata.data) == data_width_bits)
|
||||
#assert(len(self.dram_native_w.cmd.addr) == (blk_addr_width - 4))
|
||||
|
||||
#self.wishbone_r_master = wishbone.Interface(data_width=data_width_bits)
|
||||
#self.wishbone_w_master = wishbone.Interface(data_width=data_width_bits)
|
||||
@ -42,7 +46,7 @@ class ExchangeWithMem(Module, AutoCSR):
|
||||
#self.submodules += wishbone.Converter(self.wishbone_r_master, self.wishbone_r_slave)
|
||||
#self.submodules += wishbone.Converter(self.wishbone_w_master, self.wishbone_w_slave)
|
||||
|
||||
print("ExchangeWithMem: data_width = {}, data_width_bits = {}, blk_addr_width = {}\n".format(data_width, data_width_bits, blk_addr_width))
|
||||
print("ExchangeWithMem: data_width = {}, data_width_bits = {}, blk_addr_width = {} dram_native_r.cmd.addr bits = {} \n".format(data_width, data_width_bits, blk_addr_width, len(self.dram_native_r.cmd.addr)))
|
||||
print("ExchangeWithMem: tosbus_fifo width = {}, fromsbus_fifo width = {}, fromsbus_req_fifo width = {}\n".format(len(tosbus_fifo.din), len(fromsbus_fifo.dout), len(fromsbus_req_fifo.din)))
|
||||
|
||||
local_r_addr = Signal(blk_addr_width)
|
||||
@ -50,8 +54,8 @@ class ExchangeWithMem(Module, AutoCSR):
|
||||
#local_r_widx = Signal(log2_int(burst_size)) # so width is 3 for burst_size == 8
|
||||
#local_r_buffer = Signal(data_width_bits)
|
||||
|
||||
local_w_addr = Signal(blk_addr_width)
|
||||
dma_w_addr = Signal(32)
|
||||
#local_w_addr = Signal(blk_addr_width)
|
||||
#dma_w_addr = Signal(32)
|
||||
#local_w_widx = Signal(log2_int(burst_size)) # so width is 3 for burst_size == 8
|
||||
#local_w_buffer = Signal(data_width_bits)
|
||||
|
||||
@ -164,6 +168,12 @@ class ExchangeWithMem(Module, AutoCSR):
|
||||
#self.comb += self.dma_status.status[26:27].eq(self.wishbone_r_master.we)
|
||||
#self.comb += self.dma_status.status[27:28].eq(self.wishbone_r_master.ack)
|
||||
#self.comb += self.dma_status.status[28:29].eq(self.wishbone_r_master.err)
|
||||
|
||||
self.comb += [ self.dram_native_r.rdata.ready.eq(self.tosbus_fifo.writable),
|
||||
self.dram_native_r.cmd.we.eq(0),
|
||||
self.dram_native_w.rdata.ready.eq(0),
|
||||
self.dram_native_w.cmd.we.eq(1),
|
||||
self.dram_native_w.wdata.we.eq(Replicate(1, data_width)), ]
|
||||
|
||||
req_r_fsm.act("Reset",
|
||||
NextState("Idle")
|
||||
@ -184,22 +194,21 @@ class ExchangeWithMem(Module, AutoCSR):
|
||||
)
|
||||
)
|
||||
req_r_fsm.act("ReqFromMemory",
|
||||
self.dram_dma_reader.sink.address.eq(local_r_addr),
|
||||
self.dram_dma_reader.sink.valid.eq(1),
|
||||
If(self.dram_dma_reader.sink.ready,
|
||||
self.dram_native_r.cmd.addr.eq(local_r_addr),
|
||||
self.dram_native_r.cmd.valid.eq(1),
|
||||
If(self.dram_native_r.cmd.ready,
|
||||
NextState("WaitForData")
|
||||
)
|
||||
)
|
||||
req_r_fsm.act("WaitForData",
|
||||
If(self.dram_dma_reader.source.valid & self.tosbus_fifo.writable,
|
||||
If(self.dram_native_r.rdata.valid & self.tosbus_fifo.writable,
|
||||
self.tosbus_fifo.we.eq(1),
|
||||
tosbus_fifo_din.address.eq(dma_r_addr),
|
||||
tosbus_fifo_din.data.eq(self.dram_dma_reader.source.data),
|
||||
tosbus_fifo_din.data.eq(self.dram_native_r.rdata.data),
|
||||
If(do_checksum,
|
||||
self.checksum.we.eq(1),
|
||||
self.checksum.dat_w.eq(self.checksum.storage ^ self.dram_dma_reader.source.data),
|
||||
self.checksum.dat_w.eq(self.checksum.storage ^ self.dram_native_r.rdata.data),
|
||||
),
|
||||
self.dram_dma_reader.source.ready.eq(1),
|
||||
NextValue(self.last_blk.status, local_r_addr),
|
||||
NextValue(self.last_dma.status, dma_r_addr),
|
||||
NextValue(self.blk_rem.status, self.blk_rem.status - 1),
|
||||
@ -266,17 +275,24 @@ class ExchangeWithMem(Module, AutoCSR):
|
||||
)
|
||||
req_w_fsm.act("Idle",
|
||||
If(self.fromsbus_fifo.readable,
|
||||
self.dram_dma_writer.sink.address.eq(fromsbus_fifo_dout.blkaddress),
|
||||
self.dram_dma_writer.sink.data.eq(fromsbus_fifo_dout.data),
|
||||
self.dram_dma_writer.sink.valid.eq(1),
|
||||
self.dram_native_w.cmd.addr.eq(fromsbus_fifo_dout.blkaddress),
|
||||
self.dram_native_w.cmd.valid.eq(1),
|
||||
NextValue(self.wr_tosdram.status, fromsbus_fifo_dout.blkaddress),
|
||||
If(self.dram_dma_writer.sink.ready,
|
||||
self.fromsbus_fifo.re.eq(1),
|
||||
NextValue(self.dma_wrdone.status, self.dma_wrdone.status + 1),
|
||||
If(do_checksum,
|
||||
self.checksum.we.eq(1),
|
||||
self.checksum.dat_w.eq(self.checksum.storage ^ fromsbus_fifo_dout.data),
|
||||
)
|
||||
If(self.dram_native_w.cmd.ready,
|
||||
NextState("Write"),
|
||||
)
|
||||
)
|
||||
)
|
||||
req_w_fsm.act("Write",
|
||||
self.dram_native_w.wdata.data.eq(fromsbus_fifo_dout.data),
|
||||
self.dram_native_w.wdata.valid.eq(1),
|
||||
If(self.dram_native_w.wdata.ready,
|
||||
self.fromsbus_fifo.re.eq(1),
|
||||
NextValue(self.dma_wrdone.status, self.dma_wrdone.status + 1),
|
||||
If(do_checksum,
|
||||
self.checksum.we.eq(1),
|
||||
self.checksum.dat_w.eq(self.checksum.storage ^ fromsbus_fifo_dout.data),
|
||||
),
|
||||
NextState("Idle"),
|
||||
)
|
||||
)
|
||||
|
||||
@ -158,6 +158,19 @@ def get_prom(soc,
|
||||
r += "\" RDOL,sdram\" device-name\n"
|
||||
r += get_header_mapx_stuff("mregs", [ "ddrphy", "sdram", "exchange_with_mem" ], [ 4096, 4096, 4096 ], [ "csr", "csr", "csr" ])
|
||||
r += "sbusfpga_irq_sdram encode-int \" interrupts\" property\n"
|
||||
if (sys_clk_freq == 100e6):
|
||||
r += "h# 19 constant m0_delay\n"
|
||||
r += "h# 19 constant m1_delay\n"
|
||||
r += "h# 1 constant m0_bitslip\n"
|
||||
r += "h# 1 constant m1_bitslip\n"
|
||||
elif (sys_clk_freq == 90e6):
|
||||
r += "h# 1c constant m0_delay\n"
|
||||
r += "h# 1c constant m1_delay\n"
|
||||
r += "h# 1 constant m0_bitslip\n"
|
||||
r += "h# 1 constant m1_bitslip\n"
|
||||
else:
|
||||
print("UNCALIBRATED FREQUENCY for SDRAM!")
|
||||
assert(False)
|
||||
r += "fload sdram_init.fth\ninit!\n"
|
||||
else:
|
||||
r += "\" RDOL,hidden_sdram\" device-name\n"
|
||||
@ -217,19 +230,6 @@ def get_prom(soc,
|
||||
if (sdcard):
|
||||
r += "\" LITEX,sdcard\" device-name\n"
|
||||
r += get_header_mapx_stuff("sdcard", ["sdcore", "sdirq", "sdphy", "sdblock2mem", "sdmem2block" ], [ 4096, 4096, 4096, 4096, 4096 ], [ "csr", "csr", "csr", "csr", "csr" ] )
|
||||
if (sys_clq_freq == 100e6):
|
||||
r += "25 constant m0_delay\n"
|
||||
r += "25 constant m1_delay\n"
|
||||
r += "1 constant m0_bitslip\n"
|
||||
r += "1 constant m1_bitslip\n"
|
||||
elif (sys_clq_freq == 90e6):
|
||||
r += "28 constant m0_delay\n"
|
||||
r += "28 constant m1_delay\n"
|
||||
r += "1 constant m0_bitslip\n"
|
||||
r += "1 constant m1_bitslip\n"
|
||||
else:
|
||||
print("UNCALIBRATED FREQUENCY for SDRAM!")
|
||||
assert(False)
|
||||
r += ": sdcard-init!\n"
|
||||
r += " map-in-sdcard\n"
|
||||
r += " 0 sdirq-virt h# 8 + l! ( disable irqs )\n"
|
||||
|
||||
@ -418,21 +418,23 @@ class SBusFPGA(SoCCore):
|
||||
self.submodules.fromsbus_fifo = ClockDomainsRenamer({"write": "sbus", "read": "sys"})(AsyncFIFOBuffered(width=layout_len(self.fromsbus_layout), depth=burst_size))
|
||||
self.submodules.fromsbus_req_fifo = ClockDomainsRenamer({"read": "sbus", "write": "sys"})(AsyncFIFOBuffered(width=layout_len(self.fromsbus_req_layout), depth=burst_size))
|
||||
if (sdram):
|
||||
self.submodules.dram_dma_writer = LiteDRAMDMAWriter(port=self.sdram.crossbar.get_port(mode="write", data_width=data_width_bits),
|
||||
fifo_depth=4,
|
||||
fifo_buffered=True)
|
||||
#self.submodules.dram_dma_writer = LiteDRAMDMAWriter(port=self.sdram.crossbar.get_port(mode="write", data_width=data_width_bits),
|
||||
# fifo_depth=4,
|
||||
# fifo_buffered=True)
|
||||
#
|
||||
#self.submodules.dram_dma_reader = LiteDRAMDMAReader(port=self.sdram.crossbar.get_port(mode="read", data_width=data_width_bits),
|
||||
# fifo_depth=4,
|
||||
# fifo_buffered=True)
|
||||
|
||||
self.submodules.dram_dma_reader = LiteDRAMDMAReader(port=self.sdram.crossbar.get_port(mode="read", data_width=data_width_bits),
|
||||
fifo_depth=4,
|
||||
fifo_buffered=True)
|
||||
|
||||
self.submodules.exchange_with_mem = ExchangeWithMem(soc=self,
|
||||
platform=platform,
|
||||
tosbus_fifo=self.tosbus_fifo,
|
||||
fromsbus_fifo=self.fromsbus_fifo,
|
||||
fromsbus_req_fifo=self.fromsbus_req_fifo,
|
||||
dram_dma_writer=self.dram_dma_writer,
|
||||
dram_dma_reader=self.dram_dma_reader,
|
||||
#dram_dma_writer=self.dram_dma_writer,
|
||||
#dram_dma_reader=self.dram_dma_reader,
|
||||
dram_native_r=self.sdram.crossbar.get_port(mode="read", data_width=data_width_bits),
|
||||
dram_native_w=self.sdram.crossbar.get_port(mode="write", data_width=data_width_bits),
|
||||
mem_size=avail_sdram//1048576,
|
||||
burst_size=burst_size,
|
||||
do_checksum = False)
|
||||
@ -624,7 +626,7 @@ def main():
|
||||
csr_base = soc.mem_regions['csr'].origin)
|
||||
write_to_file(os.path.join(f"prom_csr_{version_for_filename}.fth"), csr_forth_contents)
|
||||
|
||||
prom_content = sbus_to_fpga_prom.get_prom(soc=soc, version=args.version, sys_clk_freq=sys_clk_freq,
|
||||
prom_content = sbus_to_fpga_prom.get_prom(soc=soc, version=args.version, sys_clk_freq=int(float(args.sys_clk_freq)),
|
||||
trng=args.trng,
|
||||
usb=args.usb,
|
||||
sdram=args.sdram,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user