insn: Simplistic implementation of icbi
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Tue, 22 Oct 2019 03:56:31 +0000 (14:56 +1100)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 23 Oct 2019 01:31:20 +0000 (12:31 +1100)
We don't yet have a proper snooper for the icache, so for now make
icbi just flush the whole thing

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
core.vhdl
decode1.vhdl
execute1.vhdl

index 77af8824f371d15f31506ce908c52e40eafc0edb..95dd89bf43e6d8b4bc0d08f7e50169afc9fcc209 100644 (file)
--- a/core.vhdl
+++ b/core.vhdl
@@ -76,6 +76,7 @@ architecture behave of core is
     signal fetch2_stall_in : std_ulogic;
     signal decode1_stall_in : std_ulogic;
     signal decode2_stall_out : std_ulogic;
+    signal ex1_icache_inval: std_ulogic;
 
     signal flush: std_ulogic;
 
@@ -129,7 +130,7 @@ begin
             wishbone_in => wishbone_insn_in
             );
 
-    icache_rst <= rst or dbg_icache_rst;
+    icache_rst <= rst or dbg_icache_rst or ex1_icache_inval;
 
     fetch2_0: entity work.fetch2
         port map (
@@ -204,6 +205,7 @@ begin
             e_in => decode2_to_execute1,
             f_out => execute1_to_fetch1,
             e_out => execute1_to_writeback,
+           icache_inval => ex1_icache_inval,
             terminate_out => terminate
             );
 
index afb1315ac158abb3ff610006dff2a4b3370be9d2..1a7bc0bea1de361e5bb90790334e80d117486f61 100644 (file)
@@ -168,7 +168,7 @@ architecture behaviour of decode1 is
                2#1110011010#  =>       (ALU,    OP_EXTS,      NONE,       NONE,        RS,   RA,   '0', '0', '0', '0', ZERO, '0', is2B, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- extsh
                2#1111011010#  =>       (ALU,    OP_EXTS,      NONE,       NONE,        RS,   RA,   '0', '0', '0', '0', ZERO, '0', is4B, '0', '0', '0', '0', '0', '0', RC,   '0', '0'), -- extsw
                -- 2#110111101-# extswsli
-               2#1111010110#  =>       (ALU,    OP_NOP,       NONE,       NONE,        NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- icbi
+               2#1111010110#  =>       (ALU,    OP_ICBI,      NONE,       NONE,        NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- icbi
                2#0000010110#  =>       (ALU,    OP_NOP,       NONE,       NONE,        NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- icbt
                2#0000001111#  =>       (ALU,    OP_ISEL,      RA_OR_ZERO, RB,          NONE, RT,   '1', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '1'), -- isel
                2#0000101111#  =>       (ALU,    OP_ISEL,      RA_OR_ZERO, RB,          NONE, RT,   '1', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0'), -- isel
index ec11678e6c2dc7cce5199a856169272d9c167ca8..f2277ebf8f1e66890409e34ed293a2a6cea31e8d 100644 (file)
@@ -27,6 +27,7 @@ entity execute1 is
 
        e_out : out Execute1ToWritebackType;
 
+       icache_inval : out std_ulogic;
        terminate_out : out std_ulogic
        );
 end entity execute1;
@@ -134,6 +135,7 @@ begin
        ctrl_tmp.tb <= std_ulogic_vector(unsigned(ctrl.tb) + 1);
 
        terminate_out <= '0';
+       icache_inval <= '0';
        f_out <= Execute1ToFetch1TypeInit;
 
        -- Next insn adder used in a couple of places
@@ -353,6 +355,9 @@ begin
                f_out.redirect <= '1';
                f_out.redirect_nia <= next_nia;
 
+           when OP_ICBI =>
+               icache_inval <= '1';
+
            when others =>
                terminate_out <= '1';
                report "illegal";