Capabilities register
authorlekernel <sebastien.bourdeauducq@lekernel.net>
Sat, 20 Mar 2010 22:55:47 +0000 (23:55 +0100)
committerlekernel <sebastien.bourdeauducq@lekernel.net>
Sat, 20 Mar 2010 22:55:47 +0000 (23:55 +0100)
12 files changed:
boards/gen_capabilities.v [new file with mode: 0644]
boards/milkymist-one/rtl/system.v
boards/milkymist-one/sources.mak
boards/xilinx-ml401/rtl/system.v
boards/xilinx-ml401/sources.mak
cores/sysctl/doc/sysctl.tex
cores/sysctl/rtl/sysctl.v
doc/thesis.tex
software/bios/Makefile
software/bios/main.c
software/include/hw/capabilities.h [new file with mode: 0644]
software/include/hw/sysctl.h

diff --git a/boards/gen_capabilities.v b/boards/gen_capabilities.v
new file mode 100644 (file)
index 0000000..b8f53bf
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Milkymist VJ SoC
+ * Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+`include "setup.v"
+
+module gen_capabilities(
+       output [31:0] capabilities
+);
+
+wire systemace;
+wire ac97;
+wire pfpu;
+wire tmu;
+wire ps2_keyboard;
+wire ps2_mouse;
+wire ethernet;
+wire fmlmeter;
+
+assign capabilities = {
+       24'd0,
+       fmlmeter,
+       ethernet,
+       ps2_mouse,
+       ps2_keyboard,
+       tmu,
+       pfpu,
+       ac97,
+ systemace
+};
+
+`ifdef ENABLE_ACEUSB
+assign systemace = 1'b1;
+`else
+assign systemace = 1'b0;
+`endif
+
+`ifdef ENABLE_AC97
+assign ac97 = 1'b1;
+`else
+assign ac97 = 1'b0;
+`endif
+
+`ifdef ENABLE_PFPU
+assign pfpu = 1'b1;
+`else
+assign pfpu = 1'b0;
+`endif
+
+`ifdef ENABLE_TMU
+assign tmu = 1'b1;
+`else
+assign tmu = 1'b0;
+`endif
+
+`ifdef ENABLE_PS2_KEYBOARD
+assign ps2_keyboard = 1'b1;
+`else
+assign ps2_keyboard = 1'b0;
+`endif
+
+`ifdef ENABLE_PS2_MOUSE
+assign ps2_mouse = 1'b1;
+`else
+assign ps2_mouse = 1'b0;
+`endif
+
+`ifdef ENABLE_ETHERNET
+assign ethernet = 1'b1;
+`else
+assign ethernet = 1'b0;
+`endif
+
+`ifdef ENABLE_FMLMETER
+assign fmlmeter = 1'b1;
+`else
+assign fmlmeter = 1'b0;
+`endif
+
+endmodule
index dee7e01..8f49f24 100644 (file)
@@ -730,6 +730,7 @@ assign led[1] = rxled;
 // System Controller
 //---------------------------------------------------------------------------
 wire [13:0] gpio_outputs;
+wire [31:0] capabilities;
 
 sysctl #(
        .csr_addr(4'h1),
@@ -752,11 +753,17 @@ sysctl #(
        .gpio_inputs(dipsw),
        .gpio_outputs(led[3:2]), /* LED0 and LED1 are used as TX/RX indicators. */
 
+       .capabilities(capabilities),
        .hard_reset(hard_reset)
 );
 
+gen_capabilities gen_capabilities(
+       .capabilities(capabilities)
+);
+
+
 //---------------------------------------------------------------------------
-// ISP1362 USB interface
+// USB interface
 //---------------------------------------------------------------------------
 `ifdef ENABLE_ISP1362
 isp1362 isp1362(
index 0754a1a..9c3ef83 100644 (file)
@@ -1,4 +1,4 @@
-BOARD_SRC=$(wildcard $(BOARD_DIR)/*.v)
+BOARD_SRC=$(wildcard $(BOARD_DIR)/*.v) $(BOARD_DIR)/../gen_capabilities.v
 
 CONBUS_SRC=$(wildcard $(CORES_DIR)/conbus/rtl/*.v)
 LM32_SRC=                                              \
index 85a9549..3f1d526 100644 (file)
@@ -791,6 +791,7 @@ assign led[1] = rxled;
 // System Controller
 //---------------------------------------------------------------------------
 wire [13:0] gpio_outputs;
+wire [31:0] capabilities;
 
 sysctl #(
        .csr_addr(4'h1),
@@ -813,9 +814,14 @@ sysctl #(
        .gpio_inputs({dipsw, btn}),
        .gpio_outputs(gpio_outputs),
 
+       .capabilities(capabilities),
        .hard_reset(hard_reset)
 );
 
+gen_capabilities gen_capabilities(
+       .capabilities(capabilities)
+);
+
 /* LED0 and LED1 are used as TX/RX indicators. */
 
 assign led[2] = gpio_outputs[0];
index ec4dd2b..b584129 100644 (file)
@@ -1,4 +1,4 @@
-BOARD_SRC=$(wildcard $(BOARD_DIR)/*.v)
+BOARD_SRC=$(wildcard $(BOARD_DIR)/*.v) $(BOARD_DIR)/../../gen_capabilities.v
 
 CONBUS_SRC=$(wildcard $(CORES_DIR)/conbus/rtl/*.v)
 LM32_SRC=                                              \
index 35236be..154c1a1 100644 (file)
@@ -68,8 +68,11 @@ This register holds the value to which the counter is compared to, in order to s
 This register holds the current value of the timer counter. It can be read or written at any time.
 Writing it does not clear the trigger bit (bit 0 of the timer control register). The trigger bit should always be manually reset.
 
+\section{Capabilities}
+The system controller provides a 32-bit value intended to be used as user-defined bit mask that defines the presence of certain peripherals or features in the bitstream. It is readable from register 0x2c. It is defined  using the \verb!capabilities! input.
+
 \section{System identification}
-The system controller provides a 32-bit value defined at synthesis time that can be used to identify bitstreams or boards. The value is set by the \verb!systemid! Verilog parameter and read using the register 0x2c.
+The system controller provides a 32-bit value defined at synthesis time that can be used to identify bitstreams or boards. The value is set by the \verb!systemid! Verilog parameter and read using the register 0x3c.
 
 Writing any value to this register sends a hard system reset by asserting the \verb!hard_reset! output.
 
index e615674..c7f8e7a 100644 (file)
@@ -39,6 +39,8 @@ module sysctl #(
        input [ninputs-1:0] gpio_inputs,
        output reg [noutputs-1:0] gpio_outputs,
 
+       input [31:0] capabilities,
+
        output reg hard_reset
 );
 
@@ -166,7 +168,8 @@ always @(posedge sys_clk) begin
                                4'b1000: csr_do <= {ar1, en1};
                                4'b1001: csr_do <= compare1;
                                4'b1010: csr_do <= counter1;
-                               
+
+                               4'b1110: csr_do <= capabilities;
                                4'b1111: csr_do <= systemid;
                        endcase
                end
index f16b17a..ded3e3d 100644 (file)
@@ -39,7 +39,7 @@ The open source model means that any individual, if he or she has the required l
 \begin{figure}[htp]
 \centering
 \includegraphics[height=95mm]{ikosboards.eps}
-\caption{FPGA boards of the Ikos Pegasus ASIC emulator (ca. 1999)}
+\caption{FPGA boards of the Ikos Pegasus ASIC emulator (ca. 1999).}
 \label{fig:ikos}
 \end{figure}
 
@@ -249,7 +249,7 @@ Software and misc. & 300Mbps \\
 \hline
 \end{tabular}
 \label{tab:membw}
-\caption{Estimate of the memory bandwidth consumption}
+\caption{Estimate of the memory bandwidth consumption.}
 \end{table}
 
 The memory is run at 100MHz, yielding a peak theoretical bandwidth of 6.4Gbps, which is more than enough for the intended video synthesis application (table~\ref{tab:membw}). This bandwidth is however never attained: events such as switching DRAM rows which takes significant time and, to a lesser extent, DRAM refreshes introduce dead times on the data bus. We will see in section~\ref{sec:memperf} that such an oversizing of the off-chip memory is needed if we want to keep the memory controller simple.
@@ -300,7 +300,7 @@ Every FastMemoryLink transaction begins with the assertion of the strobe signal.
 \begin{figure}
 \centering
 \includegraphics[height=40mm]{fmltransactions.eps}
-\caption{FML transactions} \label{fig:fmltransactions}
+\caption{FML transactions.} \label{fig:fmltransactions}
 \end{figure}
 
 In the equations that follow, these symbols are used:
@@ -402,7 +402,7 @@ This chapter explains how the different interconnect busses work, what their fea
 \begin{figure}
 \centering
 \includegraphics[height=170mm]{soc_architecture.eps}
-\caption{SoC block diagram}
+\caption{SoC block diagram.}
 \label{fig:block}
 \end{figure}
 
index 79dfe7b..a56a6b5 100644 (file)
@@ -49,6 +49,7 @@ main.o: ../../software/include/board.h ../../software/include/version.h
 main.o: ../../software/include/net/mdio.h ../../software/include/hw/hpdmc.h
 main.o: ../../software/include/hw/common.h ../../software/include/hw/vga.h
 main.o: ../../software/include/hw/fmlbrg.h ../../software/include/hw/sysctl.h
+main.o: ../../software/include/hw/capabilities.h
 main.o: ../../software/include/hw/gpio.h ../../software/include/hw/uart.h
 main.o: boot.h splash.h
 splash.o: ../../software/include/stdio.h ../../software/include/stdlib.h
index ccba318..4f1d672 100644 (file)
@@ -29,6 +29,7 @@
 #include <hw/vga.h>
 #include <hw/fmlbrg.h>
 #include <hw/sysctl.h>
+#include <hw/capabilities.h>
 #include <hw/gpio.h>
 #include <hw/uart.h>
 
@@ -575,6 +576,23 @@ static void display_board()
        printf("I: Running on %s\n", brd_desc->name);
 }
 
+#define display_capability(cap, val) if(val) printf("I: "cap": Yes\n"); else printf("I: "cap": No\n")
+
+static void display_capabilities()
+{
+       unsigned int cap;
+
+       cap = CSR_CAPABILITIES;
+       display_capability("SystemACE ", cap & CAP_SYSTEMACE);
+       display_capability("AC'97     ", cap & CAP_AC97);
+       display_capability("PFPU      ", cap & CAP_PFPU);
+       display_capability("TMU       ", cap & CAP_TMU);
+       display_capability("PS/2 Kbd  ", cap & CAP_PS2_KEYBOARD);
+       display_capability("PS/2 Mouse", cap & CAP_PS2_MOUSE);
+       display_capability("Ethernet  ", cap & CAP_ETHERNET);
+       display_capability("FML Meter ", cap & CAP_FMLMETER);
+}
+
 static const char banner[] =
        "\nMILKYMIST(tm) v"VERSION" BIOS\thttp://www.milkymist.org\n"
        "(c) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq\n\n"
@@ -615,6 +633,7 @@ int main(int i, char **c)
        
        crcbios();
        display_board();
+       display_capabilities();
        
        if(plltest()) {
                ddrinit();
diff --git a/software/include/hw/capabilities.h b/software/include/hw/capabilities.h
new file mode 100644 (file)
index 0000000..2a62a55
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Milkymist VJ SoC (Software)
+ * Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __HW_CAPABILITIES
+#define __HW_CAPABILITIES
+
+#define CAP_SYSTEMACE          (0x00000001)
+#define CAP_AC97               (0x00000002)
+#define CAP_PFPU               (0x00000004)
+#define CAP_TMU                        (0x00000008)
+#define CAP_PS2_KEYBOARD       (0x00000010)
+#define CAP_PS2_MOUSE          (0x00000020)
+#define CAP_ETHERNET           (0x00000040)
+#define CAP_FMLMETER           (0x00000080)
+
+#endif /* __HW_CAPABILITIES */
index 1c7e534..1dda8a8 100644 (file)
@@ -35,6 +35,7 @@
 #define TIMER_ENABLE           (0x01)
 #define TIMER_AUTORESTART      (0x02)
 
+#define CSR_CAPABILITIES       MMPTR(0x80001038)
 #define CSR_SYSTEM_ID          MMPTR(0x8000103c)
 
 #endif /* __HW_SYSCTL_H */